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5sfGuqKCBSXPTstXFTnmKZQli/Nuex0wLb++AXkw2da3mmFjVIWNmw6GytpCJY31yAg+xSraNttsE/z7L8tECX799ddg9dVXT3t4LmXt1q1bUC6Xg0mTJgV//PEHS3n55JNP2N+23nrrrIWJPQfVt7169QpGjhzJNg2//PILUmiCH374IXj77beDm2++Odh1112DOeecM+5Zia2Wdtppp+Dxxx8PvvrqK8Ybiovuv//+YJdddknjS6V1UzgOG2+8cXDDDTcEH3zwQfD7778Hf/31V/D5558Hd999d7DzzjvLLtDh87bccks2hpMnT2a8f/vtt6xoAuOUsVD+URD/ZU8hL0wxJGXbADchd7Hj6Ps+G8f33nuP6Rz+e+ONNwbdu3cXi1pMeYi1F92FFlooOPTQQ4N7772Xzf/PP//MOmBADr744ovgiSeeCPr27cu6Y6jon0b40TZfv3uaRb78WRMmTAj/RnUzDexp2Pett96KG69QntAGbMiQIUyOfvzxx+C3334L8XW77bZLw5Vy3Pt37NgxeOyxx9hzcOH3L7zwQuX3VpjvsiH5KBrns/Qo9vvAiv322y8YPXp08PXXXzMcBa68+eabwXnnnRcss8wySuuA5roiiwXs95Zddtng1VdfpWmswXHHHReoyJEwhuy58803X3DQQQcxmYUcYy2DnQCcxfr24IMPBkcffXSwwAILSOuxyXHWxBkt+VUZRw15mGoK7zy1Fp2J922yySbBXXfdFXz66afsPWA/jhgxIlhvvfVqDOE99tgjGDNmTES/77nnnmDzzTc3sR4ZwadERbv++usjla0pi7GSsi688MLMcMmiO++8M1hwwQXjBoo9Z80112RKKUMTJ04U89lLXkKrpYEDB6Y+65FHHgkWW2yxOL5kWzexxXSeeeYJhg4dGm500n6P9ttM2owADCCIaQTAAlhptiHU5b8lpwFeqbMBbkruIs9Dy8/x48enPge/h02xZSNcSY+xME6bNk1qHL755ptghx12kNI/jbkqgq9fTC1Ixx9/fPg3LKQyYI8FnVOpVBK/w/QSKYNXXnklM4LS6IEHHmCYESNTNXKw/PLLs0VMpPvuu8+UAV6xqMtF43wW3zXfhwH70ksvpfLz/fffsw1DCgaYXFdkxp7pGwwfGEOcYITC+RA332lyJK4PPXv2DKZMmSIlW3gmHHpZemxo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Rs4H3xiMpoP3339frLvuuknzkeNtuumm4s0330wdB8/bZpttTOniMxo1fln8gcU7adIkrXfEpmDgwIGp9MS1wgoriIsvvli88cYbcmwoEHhooEBgPNLngTchRAzm4ec0arqZ5ttQHopqCKwdFUoPrG5memehm1n+5J23b/o9keR9xx13pNIGygUKPGPHLeaYYw7R1dUl/vvvv9TxHn/8cTWpvKZJR2O6MeiB2DHPOussaRzHAUbL7rvvLu+DMk6qSgQwBsLIOfmOU07r0EI+D0YbDLkA2CjAYNLw6Pot1JfxFjiN09MwlNpkDx8xwRrvRKNG0gcNzrIWswpY08svv3ze0BdnTo2nuOxlg7WJEycazQcKBL9T5iPpg8QvWPM6gGIGwxswcJWNGjn/E044wZivE/ijFqy5iy66SArQNATlkQGOO+64QuEKTaOGa7519flPPvlk7G+VZGhOepexwTAuXdact7Gn5uGHH9aiDZQPMUTUOclGq4899pg2rd966y3pRTMML3GXfOvc33CP6gFN4iVEOB599NHMeyEX4d0y5DtuOZ2VbyX/vsMOO0gvSgB4nDbYYAPddBG/hfoy/uMjnESbeQVhqFNPPVWn2il095WVU9MCo0YyFhqSgeAB4I3Yf//95S4aO2O4BsHg22+/vbjrrrsiH/O6667LG/oqo/opdI3fdttt4bjY+Q8dOlSW784777xSoSKHA8x83nnnRRTntdde29CLCLsWOme4Q7GLBt2wuwNtYMR88MEHEWVswMAeM7+w8scqq6wSMT4K8IcfGDS6yihup2bAb7noyjjfnjijCnPYeuutpZcB4+yyyy4Rtzrj872qGDU68y5ipGIjCs/eIossIr0LW2yxhQyXUKCZY0LekjjjjDMingrIAXh3IC/QHwm7+/PPP19MmTIlvO+mm24yDS9VwqgJQmpXX3219HpgfujWDX2If6de50AZn3POOWLVVVeV327FFVcUl156acTTo/R40uE7Tjnt6egThIHo/FCptOyyy6r3dWcYR63Sl8lhKISVaDUUFBZt07733nunJQe5HWbUSMZC1Qnt56N0QGy4EAcPgE6wDlOTI6YjEuS41HhV3JUNF+LxARA7J3+bhAVPG+EhBg1DJm4cCFMap4XQcAx6HFTQqJH8AQFiwh9wbSfwh1TyF154YeTd4AqGZwIhYNAb+SEb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GTIlZL6VoWEjyjwkNjJkKtuQoZxuFNLJxeFeU0rD+vs+n/us/7vf/a5xr733Ome/z+ezPq5z9ll7rfd93mf4PVMQeBplmv7yNfPla+zlq2VdzZev0C+RJ0+eRlwueTnp+c/vebk1q2qt/J548uTJkydPnjz1gcI5BlaU42p5g8uTJ08jKpcu9nLS85/f857XrOxaFd2TduBBIk+ePHny5MlTTcmOdA3baGmoEbXGGmtEzWYzevDBB6N//OMf0bPPPhv94Q9/iI4//vhomWWWsQ2uht9KTz3yvzfYPWXKpeWXX15k0O9///to9uzZ0QsvvBD96U9/ik477bRoxRVXHJRcCufI6+htb3tb9K1vfSv6zW9+Ez399NPRSy+9FP3973+PrrrqqmjXXXeNXv/6108VOTmqZzXea66VV145Ouqoo6Kbb745evzxx2W/0Y3w4Jlnnhltsskm0ate9SqvG40z+/GPfzw655xzoocffjj65z//Gc2aNSu69dZbo0ajEc0111xl1irek3nmmSfaaKONojPOOCP63e9+F82cOVP2hO8YGxuT791uu+2ieeed19ssvdunvVxev3t57cmT98E9eUqhtGjzMBhTDLn5558/uuCCCyIIQOiSSy6JjjzyyOjoo4+Orr766ug///mPXMcee6w3gD31g/89H3nqkks4gIA///vf/6J///vf0ZVXXhkdc8wx4qRfccUV0b/+9S+RWT/60Y/KOptFgAK59+677y4yEmf0sMMOi9Zff/1otdVWE0f1lFNOiV588cXosccek59Pcv4e1bMagxthGEbtdlt4jADJIYccEm255ZbRWmutFX3sYx+Ldthhh+iyyy4T/vzjH/8oPxthmSbrtsACC0S/+MUvZM2ee+656LzzzosOP/zw6IQTThDQBiLwZAWaGnnu/drXvjbaZ599BBxmzW+66abom9/8ZrT11lvLedtwww1lTy688EL5nueff14A3LnnntvrmvwOU9SHyztdXl578uR9cE+eXM7FYostJpFmIo44NAbQ0hzG88w333zRnXfeKYYURu5b3vKWrgOz9NJLxwYyRt+rX/1qf5g8leK37bffPnriiSeiRx55JJo2bZrnI09OPnnTm94kGQYQ4PS73vWuLrm0+OKLi3MIXX/99eI49omfJFMBsBy69NJLRW66jIt3v/vdIk//+9//Cq9P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qGMXccm1PPR9LqcAjvZaYcxWCfldHCO2ktArHnccW4OYk+KpqjG+PZeAOMcs8uTIvR7d8eLixbaSRVnsBOsMMqLz8MLnSV9pvhu1zrzWEbc9ka07p5j0lfX+DspAvtsZ8BvHPug4YnRlIwcdVjn1YAb8wymv0tgY3r7FtEcGFfRdTnz7jVdNIWe+YOanovULi2Hj234DYSrkbf3222/ieeedd9zLL79c/FfCEUccoYXAzTbbzPsN2uUstthi8jctmnMWAmCllVZyX3/9de/dv//+2z399NPjGMM64zgReA5sV7L77ru7I0aMcL/55hv3jz/+EAUyjz76qLvnnnvqMo2Y38ILLyxw6ziO++GHH7rTpk1z//zzT3fGjBnu1KlT3ccff9w98cQT3UUXXTSt9ytrY1isB16enj17ug888ID7ySefiFA2cI71vPvuu6I4Zu+993b/97//Ra3HUwS2bbu33XabwM+sWbPEf2+//Xa3W7du7nzzzZcEL44Vo5jQqg/Be/PaYYcdxL5NnjxZ0AD2bcqUKeLfdtpppzA6iMWHVrIUgLzpq2HfdtttN/ehhx5yv/zyS4Gf7777TvDMPvvsE8XHTkHriNueyAkz7DJuUyjwsvjii7tHH320+/DDD4sWZWg3h44VSEMA3p999ln31FNPFd0syHd+xn/ffvttbw7gWR35fthhh3m/AX1qzj0RvzHtg8NkDHPJt2oOetDx48cttthCyFHQCejjr7/+ErnbDz74oLvHHntkIa9857flllu6999/v/vZZ5+JeUB+Dh061N14440bDKj99tvPHTlyZJ2ehUzZdtttY801h+824DuFfvAdb/vttxe/hbzDeJCBL774Yh3vBtDDH8z8lIW+z90Ybmi/seqqq4oNV+GRRx5xzzzzTO//A+kR3xAIvP76673fDBkyRA0JagkcECcIVgIEPBAawzOsO06U8vFtV3LZZZeFCvOnn37aXXrppcM2X8yvR48e7tdff62lILBHYK4UBJWlMSzWs9566wlDRQfef/99d5NNNglajxhvm222cSdMmBA6Dr638847x8VLNaGxIugBRT5g/ii477776GGQzi0WHybYpyLoyzOYsGYonTC466673Pnnn1+Lj3NcR9z2RFVmYzjW/uJw8MMPP2h94/vvv3e7dOlSN78zzjijrohNR0HCuJZQqVR0ZWmV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XWmllfzf/vbbb+Lvfwtre6uttmITJ05kS5cu5c/MmTPZ9ddfL0cGyt7/32WXXdjdd9/NPvroI/bLL7/w0qBffPEFe/TRR9lBBx2UZHh5O8svvzw/VPzII4/wkqI///wz+/PPP3mJ0XfffZeNHDmSHXrooWzZZZeNaouinTRlnfz5d+3alVUqFTZ79mzO399//53NmTOH/1u3bt3i5h/aH8bWu3dvNmHCBPbNN99wfmIeb7/9NrvqqqtYu3btVBwZlXyKAvip9KSGP47jcP588MEHbMmSJfy/I0aMYD179mTLLLNMHt5E6lOPHj3YpEmT2Ndff811BoebnnjiCXbwwQeryoOPf7XVVmN9+/Zljz32GJfvTz/9xA/oQ87z5s1jzz77LBswYEBUad75edd/zv7rLn8d/BN4lIe/qfiCZ5999uE2Z+7cuVynFixYwF588cVAsQaF9Ulh10jWyK677soefvhh9tlnn3F5YByjR49m22+/fY1zPeKII9jkyZMD62nMmDFsr732UrYDRPNtdHlon4dGf1QppSgcoQHPpPGBJu1nJjuVAYfUm/867bExeeUG/B07dvR/C4Mo/P5nue2NNtqIvyPT448/Lv6Oh/FWWGEFNnz4cPb333/HCvaZZ55ha6+9dhgDOBO32WYbDrJUaNasWWyHHXaQ26JqpyWN8cLhaACPJHrooYfYqquuGjb/mv422GADNn369Nj2vvvuOw4YYxTKIZJPUQA/lXwD7e25557szTffjG0H/e27775ZeROqT9ddd12iPNZaa63Ej+QTTzwxcD4njhDZO+CAAxL1XXH9txD1X1f56+CfpPNZ+eum4QucEIBwHD355JNslVVWSVqfVHatlHeNXHrppdyRhhFA5+GHH87fw5wA7OOq051zzjmxekA432aQh455mPJHbkbASYVn3DT4waD9TG2nMuKQljrzX5c9NurvsgIpPxyHaj0ejR8/Xs6lCrSNr7kwwm6n8LtWfP09/fTTysJ96623uAGRGMDat2/P5s+fn/peAfxO/NIjakclH5Ebr5VXXpmfh1Cll156ia244opymKhGttilVKEff/yRbbjhhlFpAC6BfBxCwJ82h78ihwmJ5Ot4enfmmWfynWHVy+yOPfZYEgeEflXo9ddf5zoWIg8+/oEDB6YudYrdmc022yxW3xXXP1X/KjqmRf66+CfZ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7Z0H9C3T9ccnUUKiRY8aJNGjd4urS5SV6J0gWBZxdYLovfMTouWS6JanG71G+RHlCT/l6R4Pz+OJLszfZ6/fmf+5587MnXJmbvmdvdYsz+/eO3Nmn332/p7djuc5cuTIkSNHjqqgge+vcd9fg99fNccOR44cOXKK0ZEjR476QY8Hiy22WMB/hy/f6XRHjhyNZIA6oCnEkawYFR+Hht+/yNVwhsVtyhw5eaiY4EFw4403Bquuuqqp0+uOT44cOeo1GhUBULMqrwnTTTdd8NhjjwUbb7xxlnvZUJg6sOwkMIwC+jYuZ0jsUm1YVhyfHfizqQP7hZeyNl566aXg888/DwYGBoIlllhipOinbrEljtxcO7JE7MyDn/70p8ExxxyjK65GRtAQHH744YGiW2+91fTopgWFWb2/co/JJ588+MMf/tBpxSseEFuUcy4cxctoYxhcBJNNNlmw9dZby6bM8Tnzxq3fIjQ2dGBeIN2NvGRMwX//+99QF33zzTfhmCvgU0dlvUtsiSM3144sGf5g0kknDe68887gk08+kX+3AaZRhJILfN8PleLBBx+cRpnn9f62AMtjjz02GDVqVKcV71BJINd3olocxHDNMsssshl79913HZ/T0QQ2BHfffbdsCrz+8+DZ0oFpvEWBBX1XZAxpvccCcr/44otwjXzwwQdByXyqEtzE8aKbbEk/8LObyc31CCEBp+ecc06ozJZeemk12YNZ7/ODH/wg2HzzzYNHHnkkmH322dspczEuCd7ftMI2tOSSSwb/+9//gieffLLTgMV3ILc7AS7y+Le//S348ssvHZ8zAsADDzww5NV1113XbwbBlg6M9Rbp1xFHHFFU32WlPN5j4cmss84aAt3HH388KJFPVQKyJF50ky3pB352M7m5HiHkm4pr5513zuNdGJVDmYsiTfD+plX6/l577SW/Hz9+fNeBXM9OTq7bXRYAuDvttFPw6aefNs3Le++9F5x22mlmBbnjcwTYueqqq0K+7brrrv3GL1s6MIomTDvttLLZ32STTeR+6MKC+i6Ldy2v97imvvPiiy/KWBdZZJGgRD5VRROmmWaa4NFHH43jRTfZkl4gke8Efnb1undznV6R9HIxhhixqaaaKvjoo49kwk844YQ8ijePMpdn697fn/zkJ3kWib/hhhuGz5pyyin7EeTW+nD91IZloKwuEgJw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WVcr0lXZzwUzx/UVxQ9c8y+C3jnkTFF0GMZ/ceNnoeus9JT2/O8M/N6e0sBLi4eoOdsZdaes8iOJ3E9rUIbZOUnahojx6c3h9ttvH3S+29Oetd2/wRh87rnnvN8NHTo09AZ0u+22855D4Z1tt91W6R349O7d27f+rbfeOhdnHKd3opZCgZKNARWPhGnwlspNMp6VgiktBjypeEmaiZeg8bKUarZCFNm07TS48ce51qStRbK2k1DhSdOl6RLxb4PHUtHjGKXYqqwriZwzGeWhikzJ2qImqUe4FemqKudCzci3RHze/MCxP0XRexY50+xzOG7tHHSdlZ443tvS/J7QKM2Chyy3d5bi2ZBWfhRxQ8lxCyvG/+2337zxEdoaQy/euvv06eP97vXXXw9NbXnhhRe85xBKq0CTvvP2gQce8H5/991355IuwIVogZw55pjDOeCAA5zbb7/deeedd0RyKq5xgehPP/1ULAixvojzDSA2lTLB4j2IEcYm3Hrrrc57773n/Pzzz87ff//tfP/9984bb7zhXHPNNcKaV6ic5G3qGmus4Vx55ZVi3pgvPACffPKJc9tttzlbbbVVHIOo4lG8b+GFF3aef/5571nM/aijjgoUJMsuu6wzfvx459dffxUfENx5550n44YD/4XsJ/akb9++zrhx40SFKuAZ+/fKK684Z555prPQQguFzS1VO40k+MtAB5nLUpMxf0uzTkOxncRaa63ljBo1yvnoo4/E+iZPnuzcfPPNziqrrNIguHfaaSdRHeyLL74Q4RUoTjF69GhnvfXWawb/2klwrCAsxXxfe+017zeYk4oSSsOYpQOgzsg/KjIlCue/GUaisuv1TkpXlTgXmNdXRX4okt7TyplczmF8Nt98c8Ej+D14ZsqUKc7999/vuwlRWDsXXSvTU9CcevXqJeZO+f/OO++Ub02i3psbnjfccEOnXq8L+YW5/fnnn84HH3wg/oY2EM3SA6OM0rzOmc0220zQA+gCLS+wX08//bSY49xzzy2PlYf84GobUohBifxEF5AnqUrHiyyyiPc7yPSAudloL+cC9lfCv6Uyvy222ELQGHI3EZ5r5BDazIFogZR99tnH+eabb5SEMBJXsbgg72vEXMR7ll9+eeett95Ses/EiRNFomrIxgpinmmmmZwRI0Y4//77b+RY9957r9wzJultgpg/FCwo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ZaG4h7rOljm9EGHCQxIBKFToFHe+lsHHLJpVQSeytFKG5xbljWXnp4LneTl5VlWyYrBh3iFLE1Xrt2X4Q93pw6TMk3mHP+GEE7LUA37rPPvss4tnHcqjWWaZJfj111/DdAV818lOVygjz1TrjSbllrIz9xz5W+kiY7hO/hY7nkMqBTtqbkxl21XlafkzxNHbTi3vjbDOsv+qcCcPsalsyZR3PK+kwChyW++mPD+kwFgqacotub40HMrzPlNriODu8OHDQ9ydc845086fvW/iiScOn//tt9/o88MVnr0rQcOuJh5omrfUQV7I8uCicy+rqA2usSzMA8yZddVVV4W0df311xeNGimDj4MN0IksDgwuwedcTfNraJR3QQ3lnePob42bNJeyNKGbpmXwRQV/N00futatYy/Yuvr16xfizB133JE0t5Ambr/99vD5tddeWwcv06E3mpBbys/cpLEdbt7888/PWum89tprrMXO33//zYoUIU/lqKOOogUhgnnmmScc99NPP00MXc/ZUmpk0lzhObz44ouDd955Jxg1ahRTpj/66CN2+7X11lsH448/ftbmht7DOeaYIzj11FODl19+mZXa//fff8sUCpNpmcX2euWVVw5uvPHG4JNPPmEerN9//z1499132d4LHq8yDEK3sc3WMN5447H9v/nmm4MPPviA5dUCX0aPHs1aNF155ZXBBhtsEPzvf//LWk+If67rsrAZnDU8evgXoTfIZREqTRfZl5FbbrlluBevv/56lnBkt5CvvPJK+B18f+zzv6XsbVMjTaUptox2sC4OOJc8Ctb2228ffueNN94Q32dyDRHcBY1zgCGd4NUN6Rp52hyAe+Sdfyg8+6YkDY/KwJ2RHcBblOO2TojZp3Duyy23HKva+v777zPehQ9+Br9ZccUVVShqI2soC4tAk+MTdWRNPfXUeYtClcXHkSbohO9ns9lke4jbJlQI/vjjj9nvVltttTQcGJlTDrTtZ975IcR05513Du677z5WvwL7hqgd0NoZZ5whtjukiqpKefdHDeVdIdpS3PK0LE3opGlZfEnk7zWlj4jsn3TSSYOddtqJGafg39A/sYefffZZ8MADDwQHHHCATCqkir1g64LdwWH33XdP08nZunjuNQDfzaK7EvJMh96oU25pO3NTxrbLDaezzjqLMcY0QDEijlh77713+Ptrr71Wxhj1nJh2VQjXue222zLHgeBecMEF024xmMF3/PHHMwakgPmWreLNCOOYY45JNfJhZPbv319GadJpbDe4QAXh5AHkNS266KJJ62HjoWclHCBpgPcJxa/y7ksPDDYa+kVygOOEo0+VACgMxOAbUxFNeVk3UGAwHO6///5cChYYEweh1YRneA2JuEucLD4JRQpDyHHz/d5774XPH3jggfSdPyo8e0+ShnsycKenA3iLctw2pDCHZwdBfd1112V+F3Mk4Xtl9qqnZrKwFK/fZpttIu846KCD8oxfazrBfsJJnAVwEkwyySRxONBTQsbmkctsfnPNNRdTYtMAusyxxx4bdwPY2+VdIdpS3IWlLE3oomkV+NJGtzWmj4iBueOOOwYjRoxInSP0SqdcDRdVe+GJN9UZPdpd0aEDPEniFRLybLgGvVGX3NJ65qaMbQ+GKEWELIB3GswSoRAcdt11V1ljtG2u6A+XF7D500wzTdz+ePD45TlwzcY2I6CNNtoo9/tQJKqk0qQyZ7sphBQHM800UzBy5MhCe/fdd9+x7wnrYQSEQg5ZAprDX3/9FWy11VZFFWC2HzfddFM4zgknnJDqnIGSSJmosH9V0FQzywBClW5e6RL7NMMMM6QqWPg7ngPASzv99NNHcnwMryEP7jKFDpU7oTxuvvnmLAoCHlwO9957L3vGieYqqTp7X5KG/Qzc8TqBt6jGC0MKM9t7eNAff/zx3N9Hj3cBn6T4cMWysFSE1JNPPhkZv6enJ0sXcetMJxNNNFGh/XzqqafEPrVuSf0s6ztsftNNNx27ockLF110Uez+9GJ5V4i2FBvbZWlCB02rwpcILtSYPiKh5mjzmQcQZVHCdlK+F/QGmejCPybo3aMRhcsB0QlxvEKBPFOtN+qQW9rP3ISxzRZxxBFHRJ4BUsBzB4TAYSJZH94EeB84fPvttyxEhcPCCy9ctBq6yFgTmScYCVosIAwGiAxvCRg1qvlRgMAQkJytDzfaohcF68H6MB7Wt+2220Y8gxAGgvdJdn3MI0SrJj/zzDPB0ksvzfYYDBNhI19//XX49wsuuKCsR05HNXKXr4HmK2G+++yzDzN+4NWD0MX5LLHEEsFxxx0X8a4PHDiw7eYUChm9+UAIMM5m1llnZfsCQoZxPWzYsPAZjCmEH2YpwGzem2yySQQH0oTpW2+9FT678cYb02dHVERTWWtkCipVXoQb3jYFi3o077777rZCHRWsIRN3027IgG9CdU9P8dl/JEnDWbjTrDlvMSIvivCuAjyOnR1u3ig89NBDwZprrskcOOBb+PmRRx6JPJMSwpcrDLsmsrBMnmKw0EILxc5jjTXWSBu/WWc6gRwqigOC8tbUZEyw+V199dWRZ5ATvOyyy7Lb5qmmmorJTNp+CiAUkfS6QN41DfKOpgKa0EHTqvDFpXtaY/oInznxxBPb8A0RMrjhh4GMdaMnOiInlllmmTL8W/le0BalmGOWzg19mhqicbxCgTxrKdQbR2uSW9rP3ISx7cGTQA2iW2+9VYyfDz9YEPJBREDuMwn17CnB1NwkZgQPIsIk4r4Hww5CnD4rIjm8MDT/E/MnIVJtt2ZDhgwJn/3www8T96Ls+niFQUBMs3mmiDz88MNtkQKyxrYC727INL755pvw70J4eNsHxM4BRa/I374DPtFeyvDEJ+03zowKjPPOO6/I3jAmASJH7hiHxRdfPNY5Q4Upnhc8lX4FNOXnFQ4bbrhhOAZy8NIUrJdeeil8drPNNosoWBWtobCxDUfNo48+yvKVEuhO+dlL0HAuxbXGvEUHbptSmHsgC+geCTc84Qdzu/TSS8PnID+I994varDWRBaWyte+8MILY+UCwipTxvdqSic+nLj8VqYIDuDmB98lOKDDmPBnnHHGSJTXkUceGTs/OBWvueaaiNOb8Cq/C+Sda5B3uKpoQjFNq8IXjq91pw925jDS/vnnn/CZ0047TawLpKJ9rfK9QF5xWQBdirxCkTxrqdQbNeC4kTPXbWwzJkr72aJAhZBz0NZiBz1t0fdW3MwYomhmhCC1hBDltrkiPBQe0bT5IJQ0wfvDnkEuDYfPP/+ceXzSxkPxDhoijRvvmLWVXh+KAyQYqr8pYhK6jO0wPI0yIAhq8syYsQQX2dOkzw477BCOgyIHQj5J29nAW8sBhSkK0gMbB3krHE4//fTYm4+TTjopfAYCSphPVTSVS/mAUKUe1JjbAvbcfPPNFwnxF5WjitZQ+mabvw+ezZgUA6VnL0HDvpMvTK6OvMXVhBc0D9/Lse6izzV5ugo89hxQ/yHGIAgdxVBEERrK4dBDDy3Li+sgC8uEkvs4W2qsgWaoQgljOcE4qiOdMPw97LDDSuMAbm8LzlFKH/N9P84pFZkf5CYHFC0Sn+vF8o7igE7e4aqkCdX6rUJ8adScPkL9E+vkMGjQoCT+IdMKSguvoHpzUUC4tjieQnmmSm/0NcgtI2eu29hmXoh77rkn8QCcmEJW+Bx99NGRMWPCg8usoe1ZhCtnzQcHST024vqQ8J/i9YtdHxU+t9xySyFvZdb6kGPKAQJnwIABLCQ6xUtTpo2LVmObFqOChxQFEuBhjUH+1PL82NuE0JXEs8kI88q8qVl33XXDd6IaYhwDoOtbZ511ioRHmaCpTIcCDS1CFdIsBQueehpxUPEaUo1tKBNQ1mabbTZ2NgiJoqGIKO6DwiJx4Xaqzl6ChqX4YcW8pWkIL/Kuu8j+sLnfdddd4bMIaXMyWq/sv//+kVoAkjfFVcrCosY2U6yAP9QZCjyi9AFlNMEBUUc6YThAC/sUxQGEaBa4fS+ljyFfmsNee+0lpkG44vwgezmgSJKYNtHL5Z1jgHcopQnV+q1qfKkxfTBcRbcaenkWc0HTcORBC69QaGyPUCzPWgr0Rl8Djhs7c93GNttgtOPgsNRSS+VqMbD88stHxtxll12SFBEpoYnQhow1+/Cs0JBScX3wtHIQ4vgbSfuFMvkcwEgVKcRN7tVNKhqAMIkEZqkSd8p+QoIT87N4YQUIXeSJJeSjjB7LJLw4IS+EuCXinuzNHFIF4JHjIIYfL7nkkpGcMiEH2K0BTWUKCVR1pMyJKLehggXFK2GOIypeQ2HcBU3RgjVQ7PE7MfxMwdnL0rAuY9sEb/EM4YUOhdkTcT6D37B5L7bYYpGcM0ljoEpZ6JWZK20FdfDBB7OxaL4e0qzITZqnEB910Al7jhaSKooDSHlyihUOK6yP0boxqHviZFTnRR48B6FIl98F8s6ksS1LE1r0W4X40qo5fTC9hOZQH3744ToMbW28AqkSHGIMxrYPnuGAEHRxPIXybIQCvbGpAceNnbkRY5vmMxMFNS1nxkdPQQoI783rzSsiNElluiSDqtD6SH9HP80gQ6I9LcalSCF2HdJbEsic4yZZB+7IFEhjawBxwHOXBGgxgTwMhFihzzb2My68heZ55cQ9MWysSGhQePNLb1yE3G/m0eOAPBdBeakDTWU6FPCh+e19+/aNrJE6k4Se1KGSVuEasrzbTUdo/eWMLSZCi+/E3DCoOHtZGtZlbJvgLZ4hvNBmbNPwzxxz9/EMjZio0tiWlIVF5stwiabs4Mz5+yFDafX/tdZaK25edaSTMvgbwQHINd3GNq2HkkNfidAWwvaFOfR2eWfK2FZBE1r0W4X40uoE+nj11VeLXNBI6c+q94KGaYsVvOM+yMlOCK9uKZZnvgK90dWF4ybO3IixTStBE69m2vgevKUUUFnOyZmnUlJo+gbX59P1CR54GaWAeZeQJ4PKyTm8/bqMbZnWX+HY2CPkw6PoWRZgXc8995xYrTNS8CDn2SgJD6JhKfBA0jwn5IJzEObbrAlN5Tp7tFPj0Gw2I/s+ePDg8G9Cf9AwVaDCNbTtL8kLijMyPT5/2vsU+BYXlSF59rI0rMvYNsFbTOGFNmObFhLKMffIvPHdKo1tSVnoFeWRtMKxEG4aXHHFFeHfhP6vdaaTMvibhgNajAla8Kjo/BBd5sRULO7l8s6Esa2CJrTotwrxpdUJ9EGdC4pwRpWsy9wLGoVAaliMTtC7f8QzHFB5WxxPsTyT1Ru14biJMzdibFNhSDxjqcYovBUU+vTpY1q5lL3ZThUE9GY7I/ct75yZZxQV9SiBIOx6vfXWYx4sIXxLJpRKpeKVenvqjM2hRYs0lOV/+umnmUcvLe9kpZVWCr+b4Dn0NN5ss7kjPIZ6GVddddVADG2DJ1HILXRrQlO51oj3ckGMCAJetIaGFQo9FSPeyQrX0La/xAucNA5T7lGchkNM9U7Zs1dBwzr4oSneYgovtBnbtBpsDn7jFYhwMmlse5p5vo9103PGjYaTEHoMnk7qdfg1phOvhMxJw4FSxgTkZZrsoEAq+CaOR2+rYm62u0HemTC2ZWlCm36rEF9anUAfNO+ZFDtWfUGjhVfQ9looCpZy48volhYOQw97cTzF8kxWb9SG4ybO3IixjRyTmHye1DBrGk4gxOX7NVIw2nK2ka+SJ8QJxmPOXL1CxVlo6PXll1+uqkVBFcY2xvjOScgzwf6hGAM8vLQirVg4gubEEE+fn8fIl9grFjJD23fAY4ffIcSOg9D31a8RTeVeIy2ewvtq0hYPQpGMiFJQ4Rra9peEGKaN00NznFAZNgbnZc5eBQ1rK/xkgLeYwgttxja9xSP5jYlhd6jxkVBcqrca2+y8aJVb4UYl/CByhMNRRx3V1uO5hnTSlocpiQNtt0tEEUwcDzczCTyqzThBT9qs8ejtl5CD63WRvNPJO1TQhGvC2JbEl1Yn0Ac1MHPMTwqPVO8F2lWlFCBri6SgKR74rjieBnkmozdqs+FMnLkRYxseEw5Cte5G0ninnHJKZEzhe26djG3a01HI42wk3ZAdd9xx4XdQkVCVoEeeBIeYvqO+E21V0yxxc6vb2HadgrneMIDOPvvs2FyRoUOHJlXSjMW9OeecM6kARZGbOsbIULGaA1q9wXNHe37TG3gnf9E/EzSVe43IHeOAypUiI91iiy0Sw90qXEPb/vJCNCnvZ3hJFQkBPzwFZ6+ChrUZEQZ4iym80GZsDxkyJHwWzkAno6AMrdybIQd6i7HNxqC1D/bcc8/YcEPathEFskhocqvOdEIrDEviAFtnq9VKKj4We1uFokK0kGOa8YQ9djIKXqEKMYcbbrhBNc/rFHmnnXdI0oRnwtiWxJdWJ9AHLVB3zDHHaM3ZVrgXrNAX7QyAkHInOcSaGb007FzoEjBCkzyT0Ru12XAmztxI669dd901cos78cQTp5ZpR3gMJSBASnusKhWMEaJHMqYHZNv6EEZBQ66EVhZNGeaeENKOz2Dh1li24p4uY7spRgsIfbZ7nITiVXFh+TCiqLdYCGNrOxsIZA4g/pJrYkwdgpB6Lk844YSkaIYiDiQTNFVqjQgNQnEUrgTjfei9GLPGZsVraNtfFFgSiuw1hLWytiXnn39+UtiVp+DsVdCwkfBYTbzFFF5oa/1F+U1MX9IGnTf+RvuSCsZAU7M8r8LYZrRB83vBK0iOXCSdArwD1as5QJGkeFVDOmE4kNE7twgOMF5PCwqB/zjxFdZDHnXmmWeGzz/44IOpxtPjjz+e2soJ86NG4M477xyHo90g73TxDpU0obrvtGp8+agT6OPcc88N/462swJvKdMmN1HWKdwLdo7o0kNz7JFqkzQeUj044DtChx9PkzyT0Ru1Gdsmzly3sc2IH4yD9qlF4QfB6AnLviPPJq6VB/oNqvIgKjwoNmfke1IEv/XWW+MasfucGGhfbuQfC155qVuYYcOGJXloIg3o559/fpb/jAIzJb29Kguk0fxotk+0UALCBQXi47cW4Xp222238PmXXnopfHammWaK5HiDqGJuQNg7F1lkkUjrhH79+skIZzYmvXGneSHoN5jidayapgqtkfZFvPjii8OfBw0alLRGt+I1xPaIx/hCnpBPnTobb7xxJGRt0003TcKPsmevgoZ9R5OxbYC3mMILbaGgwB/Kby666KLEfaI8DviB/tCOgjD8GhvbTMGEfORwySWXJNGCL4Y54paF7mUN6YThwGyzzRahdwkcYHNExw0a9io6Heh4G220Ecvn5SD0xh0Rx/f22Wef2PGgEKN6OAfQpGDkul0m73TwDpU0obrvdEsxvjRqTh/MGMflDi1c9uyzz8ZFzsgaYKp5hcv3gxbSg+ODhNaH4+F3MJ4T0nB8zfKsrN6o7cJU0ZkDv98QoqpcU8Z2GNqCEF4KWAwQH4wRhtTcc8/NegmiiAYHGD58A/AvuXnya6RgsL/TsHAewoHKxfCwwvBGU/Udd9wx4vWLyZOQyS9sxs0DBIDedgjpgrdmzTXXDK688krGlKgHuoRBqaP1V0AVJMoU33777WDAgAHBfPPNxxwWELTwhq2yyiqMUGnV8f79+0fGoswY8PDDDzOGDHzC2aB1DPp6U0Nb8OCWDrOmOSwUSG5/mZs33TRVaI0oPMPHpMao0HM+do0VraFtf3lhDvwLXFhggQXY+1EQBkV+gGN0bVDmaMVdAT/Knr0KGh7haLqxM8RbTOCFtiJH+Ns555zTVkMCewODAR/cYnmeF3kGxR+d7KqqnW5s+5CHlK+jL2saLSCth/N2KHCQo/z5GtJJiANQGIviAHKenfYWhExppYWzwIdgkKHOBIwZyEOEz0JhpnIQFXZJUaNYBwOnFSjoCK/FWNg7OJofe+yxyHNCGpbXhfJOB+9QSROjTRjbkvhSZ/po8J/xfQq4dYWTA3qBQqNb5V6E+AF9lvI8OCVBJzgnfPAzdVTiWdBODM7pkmfSeqPqC1MFZ95wMuqFmDC2Xf7/a6+9NigCe++9dySnYP3115etTqdDwWDrQ/XTO++8s9D6UD0VikHG7Wkhrzo8VrSoQRaAWaMUfwlvb+ztoAyISIrw+qKA/HnB480M6kceeST3GMjjmWOOOWS94CHe0+IugA8++EC2eI9umiq8xieeeCLynrfeeitrjVWuoW1/oSxQQZwGCOOba665cvWkLnj2Kmi45Wi6sTPEW0zghdb2PaghEXezlgRPPvmkGAmlO8S1CmObnevRRx8dfldonRdLC/igWA4HGNj89zWkkxAHkNbk+37uuWEvhDDOJt2DrbfeOqKQZgGMN1RmjzNaKSDvNw+gynGKc7Fb5J1q3qGcJnQb2wrwpc70Ee4HjHREw8QBLn6w57POOqtsbq/KvYjgB/A+LwhOkbaz0iDPZPRGbRemkmf+Rso7mqaM7fAZGEEnn3xyJGwiDkA0xx57bNutpBCK1KyRguFxgxuekKz1wZOEfYhpT+KqUKBwKywKvDjALTtv0aHiZluhsR2GpsBTndRHlQIMJdw+xoSbBzx8H55NGioSB2huL3j5ZIqpsPefeuqpkXegcIuCaAadNFVY+dhpp50i7zvkkENy01YFa4jdX4SF06qUcYDQK9BXDvyQOnsJGtZ1Y2ect2jEC13GdqhEQIGioaFJAG+6oJiYKN5UhbHdxHnSnF5EemV8n70PSjGH4cOHR5ypNaSTEAdwi4TiP1lw/fXX05ZKIg6ENyaIxkI+YRZgj4W1Jlarhqx77733UsdDdIBwKeB1u7xTxDu00IROY1sBvtSZPiLzg/EF/pykM0KPz1FYNZdjWdFeRPYDOhiNmIhzOAh6WlytGl3yrKzeqO3CVPLMM9OSTBnbLt18tA9AaAIKVqHPGgwlhPvg/wMHDowUxEJIDVV0nWJNzk0pGJH1IYwDTB2GG0IRsD4o8cglhqAQbk2zCLWUoAdxoHrgo48+ysJlQFgoKAPFBIW/YFiIN8COZM62QmPbo0wDYVII7UX4N26dkR8PYYqcIBTHgDCNCfXg64mEd6CsP/JO4KmCEQ+hjcqpyKNHTl+MA6ThlAfmGaQVrAHIDVcQzaCTpgoLDOAbL3CBPSU9QNPwqqo1JO4vcA25RLgNAc2CZlA8DblxEAwF8KPs2cvSsK/biDDAW3TjhS5juy2cDErdVVddxfZmzJgxLP8NP0MhFSrnquA3dTa2PYQvckARHNyYZOAHwwPckFGDGuM4QnHMGtFJGw707duXzQNFPzG3EjgQjgdFG3mmkIUwLDAe5CEMLkTWgUcJDmc6Xuw64IiGAvniiy8GP/zwA9s73GDiFhlpWk7+tn7dIO9U8g4tNKHT2FaEL3Wlj9j5LbzwwswAo0WNKeBWXcJRqnovImNi7gg5h7MR+hk++Bm/w9+KjKVYnpXVG3XJLdkzz3xHMyXOPK/XL+8YaTHtZT7Ngu8vu968hyuzvoaC/ZWdR1Elr6n4POPWpWpPTe1JotGQEi7v1pCmSikgCR+viLAxtAZV9QYaGs5eFl918kOTdKQTL5qKn6tyn8qep05ZWHRuXkne4teUTnTggIrxVPC9RpfLO5W8QwdNqKTplkZ8qSN9pI4HBwdqQiDakobT04K8JXFKh7xoVDhWXnlWRm80asMVOPPMeblORlJ30VsIJztPswijGJJj7KLvL7reorc/RdaXp7hCmTkXmUfZAg+uRmPb1bCnJvYkMbQupThDHWlKJS64Ob9vcg2ySmde/Chz9rL4qpsfmqQjXXjhKn7OqQm/qZMsVMUjsr5XVzrRgQOy48nwPZ08r5PknUreoYMmVNJ0SzO+1I0+co+H6FUOiJCUjJbQJS/yGsmNiuZXVv+oxIbLOPNc83LHWt60/ZJbAlGKjCE+H9cCyi0wdpH3F51rGQWjyPp07G+eeTQdeQUva51lWn+5mvdU956oUlCrpilHMw+ocg1Z1SlV4YeKNJ0y+KqTH1ZBRzrwQvVzdeE3dZOFOnAtjw5QFzrRgQNlxyvD90zxvE6Sdyp5h2qaUEnTLQP4Uif6yDI0UedhjDO2VgSHUaNGqTC2O2kvdI6XZwxTNlzRM9ehV3cVqFCYLVj8sfjTfWdiz96CpRsL3XR+Fkd6D0607FkyaCAXHK1m8e8aa6wRvPnmm+GeDB061OJ47+N79sytgmHB4o8Fa2xbsGB5mQVrbFuwxrZGcJ2YHu+0C45QFK5pUarj+Z49c6tgWLD4Y8Ea2xYsWF5mwRrbFqyxrRlgSLG+4XFtoPr376+q7o2F+vA9e+ZWwbBg8ceCNbYtWLC8zII1ti1YY9vE/jz11FOs1RXacaFP99VXX523dZaFzuN79swrgqajvlWSBYs/Fn96/5nYs7dg6cZCN52fxZHegxMf2bPM3eLWGl29h+/ZM68IXEd9qyQLFn8s/vT+M7Fnb8HSjYVuOj+LI70HJxr2LHO1WbNGV+/ie/bMKz4seDtsSXcLFn/smdizt2DpxuKzPT+LI70dJ+xZJre7snjde/me0jP/P4ViBc4YHiUMAAAAAElFTkSuQmCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWaWRlb1BsYXlncm91bmQvaW1hZ2VzL2Z1bGxzY3JlZW5fbm90aWNlX3VrLnBuZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwNDAxMTAyADAwMTE2MTAAMDAwMDAwMjAxMjAAMTE3MjE1Mjc0NjIAMDIxMzE1ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAbm9haHJpYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlbmcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIlQTkcNChoKAAAADUlIRFIAAANpAAAAJwgGAAAAlTIAJwAAAARnQU1BAACxjwv8YQUAAAABc1JHQgCuzhzpAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAB/OSURBVHja7V0HsBRFE15zRsWsYARFMCsmRE/BiBFRqoylmOOZFUQtEQEjCogE9cxZTOgpYEJBTy2zz4CKAUV4KGaM+/NNMfv3zdswu9uzt/fefFVbvz9vb3enp7un0/Q4joWFhUXLwfD518z5V8P8qzz/Ks2/CpYsFhYWFhYWFs3VcCks+F3ZGj/WIM14XGkuy6fNC6oeoteX8y834Co0Y9kP4nFKKysHFhYWFhYWOVzM0xouhRZk/LSkea23caW5LJ/Wv3NWDprfRRZZxG3VqpV74IEHuhJz5syh95RagOwXyT1FKwcWFhYWFhb5BqKtLkUCw6XE8AyL/M1rXYwrDSyfNgsIh2PRRRd1e/Xq5d58883u22+/7X733XfuvHnzAuf+6aefpvNfbm6yP3PmTDHODh06qI6aoBf+HQCdrBxYWFhYWFjkDw0hxryu4VJmeIZF/ua1LsbF5KRZPq1jB61nz57u9OnTtef9v//+c/fZZ5/m6pwIGbn//vvFWIcNG+abXbz++uvF3++9914rBxYWFhYWFjkEh4NlnbTmOa91MS7rpLVsB61v377C6QrDv//+6/7+++8ia/Tcc8+5PXr0aM5lfnA43S5dunjjHzRokLveeuu5Sy65pNuuXTvx/0EzXNtvv73NpFlYWFhYWFgnzSJLQy3gKjVTfk1zWeO0vgCnyt1zzz09Pvj777/dW2+91T3kkEPcjh07uq1bt3aXWGIJnbkvNkfaSAc2LJt4/vnn2z1pFhYWFhYW1kmzqIWh5jSv5gCmnDRrnNZhEOL1118XPPDzzz+7e+yxR5J5LzZT+hTlGLt16+Y+8cQT7uzZs91//vlH/O/jjz/u7rrrri2FFhYWFhYWFtZJi/mMqFbqJcV4Ttt6XT4vTmv6gtO0pXdJw6gP+taw38Ztma9+m3r/uPnXH/Ov3+ZfjfOvaQsMsVrQMQt+bXR4W/DH5U/HAE9wIw3vB92re18c+kY9o4JsmcQ555zj54DNXcATuGbgN0w0jys/XDKvo4vo8xpiOKsNEbKdZ11rks9M8EOZcT3R+X2t+DWpbuCeL07a+d0fxrdBv/f7jYnxZT2feecPDlkwrU+cHPBN0PP8fqMjE1xyw7EuJqFbGN3HJbSDtXm/Fk5aIaYBUV5ACNfw5cdEcbMvumMr+zBR3PeE3T88A3rVIiuVRdY2CX8WGJ5XNky74Uy8X0hwX1L6loO+7cwzz/Ra6WuWNXLQOI1cFQ3NRx5kvha6VgfjHLMZ1eGG9WZaWakVvybRDWnHmiXt5L1FQ/LBPb5a2xx54I/hKWWTmz9N6BSTcjFcU18UDMqNqXUxyn7jrtIpxvmWrJ008XHLLLOMe8wxx4gOZB999JH7yy+/iM39f/zxh/vVV1+5Tz31lHvqqae6yy23XNUAmJpE6LZhF+N6/vnnde/3CF8oFEQr8A8++MD97bffxP+OGjXK3WuvvdyFFlrIbyLjtswvRdwf9rys6VhPTpqYQ7RzP/TQQ9177rnH/eSTT9xff/1VlIrNnTvXfeedd9wxY8aI7oALL7xwlFCm4QluxOGxkua9pZh84NEDjS1KpZI7bdo0988//3T/+usv97PPPhP/1rVr1zCFJ9555513ivc9+OCD3n077LCDe/fdd7uffvqp0CWzZs1yp06d6l5yySXu6quvzrGIRh4BAT5B+SX0Gr5ll112CRrHTGZdFPa8aUoEcHbE8/Kua7VleZNNNhFyh/lA8xjw2pdffuneddddbufOndPK3UxGWpUMyEqt+DWubuAYq+/zttxyS2/+oROwdxXzj66mPiXSccZbkGvFwIED3c8//1x8rw7/77777u748ePdb7/9Vvzm66+/FnoMe2zjjC+hHVULmyMP/BFbVslzKsz8mWid5uKbhHLhfRfejSNe8O511llHvS9qXsU3rL322sK+QjMv6CCD64bvvENO2rRpo2M7lnHO6owZMwL5A0f+SBxxxBFawYnNN9/c+w3079JLLx0oK1k6aWJyMAjsi9DB999/L/ZUZGQ4NPnW3r1763YEFPdvt9123j6ZIMA433nnnVXGjtsyP4rmDTV00kzuQzTppIk53HDDDcUc6eC9994TRqATcmBwCp7gRhwe06Vz7ADNsssuK5RzFGBEE8VFaSLeCecL6NevnzCURowYEfo8GDCnn3562gxNoiMg4CT6jKOBWRdxPi/PulZbljHf0gAI6vp51llnpZG7BkZalQ3ISi34NZFdwDDWKiNoscUWc4cPHx7Z+fWxxx5zV1hhhSTjFeODoRuH/wcMGBD5Pcsvv3zY+FLbUTWwOfLAH7Flgc4jI38mWqcZ+CatXHzvRz8EA5T3VkLmtSKDCwikZrRuBM670jgr0KHad999Q/lDVvUA6B4dwffCib3uuuu836DhWdhvOPb4NGoQVRD0tNNOi71gIIvRtm3bLA2HgmQkRCo0FlUxthNOOCHUIKBA1AJd6JzqPSGcCq7cAp20uHvSSkQwxZwj2yIPAdYFFkolS1Ng4olihrQz7aQJ+qIF/JQpU7Rp++KLL7qLL764SlvxTkT9gCOPPNJ94IEHtJ959dVXp+HVxEdAKG3/C5q0i6OLOJ+XV12rW64sostRhoiEEokuZMEPUTThlJUM+TWuDuEcq/deVDg8+uij2s974403BA/GGK8wNrfYYgtfHgvif6wHOnj11VcFTYLKxNLaURrGNLfNkQf+KCd10pj5M7ZOYeAbLrkQgS0VgwcPpvfMCJlX8bfLL788y3UjcN4RZNdxqB555JHQ71155ZVFRlV2TcZxNyFzX0FQmdqZqLIKyzqzdcsLIZIg6Prrr++VAwDILsALRtoTe0rw4aussorbvXt39/bbb69SfkOHDk3y7iTf6tEEJQwai6rnadPvRUkcIl1rrbWWiFxgXDDA33///arIvqI0M3PSMqJj1k5amnpzIYxjx471nos0/CmnnOJutNFGIjIGBYdoGtLU/fv3F/MngYOBlfFz8UShmThpgr7yAGWJZ555RnQZRDkOaIv/njBhQphTVZLvlPR/9tlnvXtRdnLssccKGmKRXHXVVd2DDz5YLDYUhx9+ONsCSnkJZavglfbt24vvQJQxIMJW0qRdHF3E+bw86lpdCF6jcw5egSxjMcU6s9VWW7kvvfSS9/cXXnghaWll2QBN2GUlQ36Nq0M4x+oZb4iQS8DmwPO33nprMVYYsZ06dRLZwp9++sm7b+TIkXHGK8qF5YHxABynpZZaSi1dr/o9ytxl5QT00oorrigMTRhpEydOrLoXZxn6lVcy2lEz6sBJy0wWwi5G/kykU1LyDadciAt8Bn1K9SvJus0NofNc0AzbRiSQhcK/hckN97oIW0wCgZYwhwo2hHTAEEgP4h/qyMEJDZh7MQ8IgElMnz5dHXv0njQOKERqImiTJ09WIw1NrgsvvNC7/+OPP87KcBBE3GCDDdx58+Z5DBjGAGBu6s2jrh9GuN97ocRlmRZw7bXXWicto0xGxF4Q8VyUhUgoZYxNLihmCWR16ALOyBOlZuKkVeCcUiU3bNgwX3pAYWFhoIsJfkuiv+KdqsKE0a1G/eQFwwX18xKIYpGIY9mUUY6DomndeUyjJrYuYnxeHnVtLCcNBsdll10mDJv999+/yXetueaaVVmGhO8y4aSxy0pG/JpE33COVbwTxiK+HYCxiXLzoPHCOZURbVQ8kAh4JO2wF0dWSbz22mtacy2DStD5fuOjpZPYP7nSSivR7+G2oxrrwEmrmSzIi5k/E9s4KfiGUy6qLhroUs/cDKIzysslYPdkYaOrz7vgggt07C3xHnSOpiWgQePCGkPtQdKvoKKuTbTy54orrlCz204tnDTxji+++ML7+zbbbKNOihQib4MmPNiARbRRs9Sy0ae8raKjaHCuEGW+sJIHROWpEvTpNFeh48LYaeS/Bk5axWnaTpSTjo0OT8v6rJy0sp/hv/HGG9N7fnX+38a9EqXYGXmi3AycNKHszjvvPO8eGM4+TqvXcQqGR0NDQ5VSVeWORogRmVNKTpvQGBFPmilA5iBBNk233LYix0EXz5hGTRxdxP080zoiyfhilTuGXH/I0maJH3/80YST1phga4ARWcmIX+PqG+6xeiXmEmeccYbf/P8ko/3q/aiQ0KSdMNYllDL1GUH8jyBg69atA8eHsX/44Yfe/UcddVST72G2o/LspNVKFqpkgvH9ideYlHzDLRdlmYWljgkaa1A7x4/O+E65TQE46KCDtOSGe11E1lnaD6iYQmMQHydJ/I72J6DjVfWBWsKIJi8+c1+Bs4xGLRLogRAVlM8sk+ZEn9FTpVzgiUqgDpahcYGj4byIrn3UwKYLl199Lbrh0NStE9xlp5gwwppksTcR1eIqO6ykcNiMOmnodETLHYvForvaaqv5fX9oC1tGnmgOmTQh/+g0RkuDAmji0QNNH2h5iSp3sgTBLyMdRGOqzDFHCegcy0lDlyy6wMcMpMTRRSaeZ1JHcHxPGHzlCmsKSnvQ2QxZCAnaIZTRSUtCQyOykgG/JlmjuMeKDqbuQw895P3dR3c3uXCPxKRJk7Roh5JDGcVH919i5FGDrAm9lDIo3/HR/WYop1THx2hHNWZoc+SBP+KWd3K/P/Eaw8E3jHLhld4ii0c7G1Jbx4/OJ510kvdvcGaV7tgFQ+uG7/NoFtBnT3JBrSyAPQhHLOA9cHCFHRJiX4hnnnjiiWGZxILRPT5REZGoC/sF0EL7uOOOE+lbEJ+x3Ern/tmYbChdCbRHj1A8VYb9Zpttpt2S3XApUeZOmgqkyRGhxjyiXhdKxEc5FHOwJ60kFTJNg0sgu4Y0N6IoyqZcWoM9gy6OjDzRHPakiXtQe61JE0GPTTfd1LsfpaOq3Mk6fQClpxH8Kp6J90qgu1QCwzyS/6BDUOaCSCStvVcW2jKzLjLxPJMOCcf36GTUZDZwWpC+wuK77rrrmtiTljgbwS0rGfBr4jWKe6yUp+IC2YAw2iFTsO2227pvvvmm5/Qo7cpDdeOOO+4Y2f2W6ijsV3Z82sAz2VGNGdocueGPuLLK+P7Ea0xKvuGWi6p1HfviZMAU5ZQ4ugjZIgp0f+zZs6enX2AbKt1GywbXDd/nUYcRHTn97MHRo0d79wwZMiTsPSIAgC0yEsiWYe+gWm77yiuvePecfPLJWvyRhZMmF8wKrfNFbSpqM999912Rho+Z+TCSAaL12zDMNTJcVfWwrVq10qlBLjhNTxqvpM0Q5c1J8wNKaNBKVikZKNTYSfMiJ/guRL+CgOgpIvBXXnmliOYoLWq9EgQmnuB00GrupNEUvwZNKriH0l2VO7p/EIaJBj9VsEGZlkhyLKA6QFZCOauoxKyLygaeZzTbzvA9LBn4xx9/XJTCJgwcGXHSuGXFFL9yrFHcY9WxJYKAfUS6tEN5mVLS1KSbnvp7pWTNT09VYNBKoHOwT8Cby45qNG1z5JE/4soq4/sTrzEp+YZbLspqWTmOD6IZtTCAT5VuhpFyY2JdxL496VyCNmQ/u9gmgYoLuYcPQAO5qAyfozSsQnMV+u3t2rWroilx4kLt4Kxa8IsJRSYCZzSom/4TCDD7IgmFJxkZwoWSBh0njbYkJWUPmbX2ricnjRpGJNVtcg+Ibgt+79lIaWPho7XTQcDcIzKiHADLxRPcqKmTRveQadCkTEsLEHlT5Y7W4ONeDUe4DCecZkizctJwvo7PWUycuqhs4HnGHBKm74nN+37to4GXX36ZBo5qWe5oRFZM8SvHGsU9Vt1jF/yA3+rSDh3i9t57b3r/uKi51tBTVePz0VGcdlRdOGkmZUFHVhnfn3iNSck33HJBxzFOlkmrHZSDgPuU4MY4w+tG4POefPJJ799wlA+14Y4++uiq9UH3PTg8no6VPpMePfDwww9HNgxJusgkfYY4tRttfYNK45BWRu0rNuRiUz821GXppNGDCpHt0dwrFhRpKbe0TJrj03UI0Qh0BkKpIK2JBlCb6zisjRvSGnIF9fvRAQkd4lC/LPcg+AERGZSYyN8y8URLyKQFLna0ZAKZSVXuoCskSCYkjMYVWmefZSYNQKSRHHJaZtZFJp5nTEcwfY9uuaOXBZJyjRblWGOQ2ZdQNtOb0kdpMmmJZcUUvxrMlCQeK21PrxyyG/dqsocJ0fYDDzzQa0AE4zXkMPQm9NLQU2VE10N0FKcdVc+ZNBZZSJFJS/L+xGtMSr7hlosSLbPEPjTpAKKpDY4IUMsd8W0og5Qdr3E/9u7pyo2pdfGwww7z/g3dM52AzpXHHHOM9rYuZD2prYjyV7nu0KY/BxxwgHaJfRZOmvh42noTEc1SqSQUHrxhEinwLijErJw0pGsloICVE+NDlRytWSZt2ys6joDTjPak6XzvjTfe6N1fqVS4GzdwOGl4xmy/b8d+BDhtUC4oL/nhhx+qvoNuEmbkCU5HLTd70nDWXFTZCM5vkZg2bVoTubvpppuaKMIoGtPGCBoHWSYqt5XNKaDX1H0+l156aWS3sYS6qMys24zpCMbviZLjSH10/PHHe+/CeVMZ6KPYe9I4ZMUkvzqMe444xkqPPuncuXMaYzRwvNjDOGvWLO/fYYD6GJxN5rpDhw6xxodsnfo9jHZU3e1JMygLWnvSUr4/8RqTkm+45aIgHTR0NaVdEtu0aRM6rwjYNzY2eo4aHDoduTGxLkrZkJk5yBKOZVHLEuFo06N9IvhHyChtsX/VVVc1+X6Uo8bZ8pOFk4YFr+rQXiyOUcyADlwUAeVxqRdJRKbo4XZKO91IJ238+PHe37AZMWJvQxnnq0goG0ubi5Omlh169bo0k+HT4rmWTlohrrKC0wYBlKDnCjHyRMnhQ02dNNolKySK5kXo0FlTAr9VI9yIEkuce+65kTRWHbs77rjDiJOmXrRtr3JO0QxGXVRm1m1GdATz9wTKcceOHYWDgb1VOE/Hh05CJ9E9imhEk4E+0nLSGGWl0SS/cqxR3GOle4pxMK/j3/1QXg1JnDRH6TCHc6fQ1lsxuprMNZp5RI2Pnst0yy23NKE/ox1VF05aRrIQKKuM70+sU1LyDbdciPfBIUNjOAnZwCPKlkUGSWLOnDmeYxQmN9zrIv0dzc5JOwI9ByTGjh0bZ30Svg7KoCW++eYbkUUbM2aM929IVuiWOmblpIm/05bZqhfs/L/7iccct956a9UzyRkMrE4arSFFGYHj0wgi4PlCaZ599tne39566y21rWhRFSa68VHpKhNnr1WeW/D73T9OpoK5SwGYnDQhXDQdrZyT1qA6nLjAxxIoi5D/zsgTzeGcNEHbiPNmipQe+Bs9bwb0UZ4rzrmSezIQWSOlKL40RvSbbp7u1auXyRb8Hq9g/0jABuxGRl1UZtZtRnQE8/cEyjE9D085LJTukW5Ew5mMg0ZaAU1GWZlhkl9TrlHcYxUdPOkxG4juR+mFHj16BPFkpFN63333eX+jTQyC5BF7VALWgqIM/KHrbEBJ1AxmO6ouWvBnJAuBLfgZ3594jUnJN0bkAn0FJJR285EJB3T7DtibZWIdC3XS9t1336oMJBxCdLOUoNtYNPhHBAnVZ6BnAa1QUM43LGVh9Go5abQ8TNk4WGUAI2U/ePDgJvXKpBMKq5MmvwsGX6dOnWKfPQRjkdagXnPNNYGH6uL5iLoF0IE9Ipu3TBqNUCjljmUDRnKcBiLiG7EZm5Yvot1r2AKICJfEa6+95t3LyBP4tuHzr5lETkoO0xlzIbTTXcCj7ivRyBvd6I49E07A4Zx0HvCbtm3bqtE2QbsRI0Z495XLZbVLn0dj1OCjnI2WoSilQQVTTtpOO+1UFVULM3pT6KIys24zoiOYvydwfqhhiuAJ2qb78RmybRJK2+paOWkFZlmpmOTXnI1V6Bk0F6D7b3DorXJ0iqcX8G7q0NO9JxoOrngX7eSL7FoY7YFBgwb5jg9G+G233ebdh8ZVio6qMNtRdXGYdUayUA7KyjOvW4l0Skq+4ZaLKgcOFURKNmx2lNwg60yP0FHOKauYXhfpWOBYyxJMoG/fvt5/ozlZgkoP8f1U9rC1gjr6AeWjbxMbs8rGy8xJoyeEw6vERm1Et0EkRALQ4hIeMz1jioKcZcPqpEkMHTrUj3hRz6+ozofchAjGwwZKjA8lNziDixrjPhGB5uKkeSewY/zYk4XOOaAJhXIwJEcmI/WFTdY0Ugnh6tOnj9u+fXuh0KAQsch16dJFOAi0W5yqyJh4YhzjfrXYtNO9V+M+saDQPYnSEcYZZ3CucKE1L5wtihtuuMGvNEBEOVddddWqCNVnn30mHGcsMqDxGmusIeaF7ivAnHXt2tXE4cXeBmHUsIOXUJIJQ1cCpRWOxsb9hLqIW7ex6wjm7wnMpMEpo0AGFRFxGCrQS5gb8BXteBaQccvaSfMWeSZZMcqvORur9zwExSjQ9hv7xpA5xfzDeIatMXPmTO8e2B1KlqQSFaDFhRIpGvwhhm+gfCMLAR2ETBhKbrEu0MPVgd69e5u2oxrrwObIShaC5J2bPxM7aSn4hlUuwN9YZyVQZhmjTNiTm4suusj7O7KAYRle7nXRqT7jVpwnKIHmOwHbKGZr8o9Yg7CP0A8+VUHFKBsvsz1pSBtSAsRF9+7d/RiexXDAmUtKx5tynLGBiSdMmKA9FiyESg17Y707aXEwZcqUpGelpe4gpUIVDLro6gILp1KOwMET5QUZtKDvLaV10kxDLbnA4oIMqi5wvIES7SupewixWIZ13lTRr1+/NM5uYhrCOcTm7rBIfUpdxK3bjOgIxu8J3Vs6atQo7blB1FhpOV+qoZNWYpQVo/yas7F6z4PBR7uzRQHZAOzdirmGFmUwEtFxCaXZStXvp06dqvU9AcYotx01tw5sDqOyoKFfuPkzkU5JyTecciG6XdPqA5+snZbcoEqJBhL69+8fKDfc66Kq02hTD5oJRQ+FBJlYbw1S5w06lTZXWXDv21E2XmbdHXEho0Jbmgbh888/FyeU05PFL774Yj/mYzEcEEEMYG7tsUEoYRhEnUfx5ptvVp3vkDAVX7dOGrJFOEiQK5PB6Eh4ZQuITtJ0fJghg4yaT1kkB08UmPbp5MFJ82gCRUtr0oOAxh60q5KPQ+VFoPbbb7+qjFrQXCntsuMeXJyYhtB5Rx11VKTMp9RF3LrNiI5g/J7QOYLxgA30UUBzDGX/aS1b8Fct8gyyYpRfczbWqufhnjvvvDPyecgK+HS7083sinuQSaG0Qxc7P2MTRz+EGdz4rRK996UVox2Vd5vDqCxo6JeCgXUrtk5JyTdscgEbhfKdcj5snGCbuAfluhLYE0yyvEbXRVWnoZqAlncC48aNS5OJFffimCmKiRMnBmb/w56b1TlpnkGF0jF4/Ei1op4bHitqTnEuCzqpoJ2sPDQQykhCaSta4loksZcIk+TEPLPBb2y40KYVdcsolYOhj/EhfYyD83AuAzkQMU70oS6dNDgniMYg4oJWwcrhn5lmMjQciarUM+qsUY6IMkVkuaBEEMFERyIoTJQzylPoA2qM0/IEp+FaayetSVp/t912E01S0KwFJabIhqHsAV2QAloE+zlURboPENE4RDExR6AxytxQVz5y5Eh3s802S+ugadMQfAKdBt2CvQTUaAuT+ZS6yIRuY9URzN8TmU2Te6ywZwPOGGQPvAbZg1yj8+pSSy2Vhi9M0ZBLVozya87G6vs8HJsyevRo0dABBib0AqLymH8YUT7NN4pJnIi77767qrIiyAlChQVK/dEMAvYPeBLNpQYOHCjKcSPWR247qh5sDmOyoKlfTKxbsXVKSr7hkIuqUlvwe4pgmyc3999/f1U5px9fcq+LfluWhgwZUnUPAr8pMrFifLSbOaAcmK3tw5Sc6EPrtPYBaDyjyLh/qBTz3Trf6kds02MrGhhHycDz4tIx7vgdBl7j4qki03iKDM/wxgtlDGMqhZNmkna6i37RAJ8UM+A7ThoWDekiU7rNyZmu1UExB/ooLQ1Z9Ydhfs3DWLOkXUk1EmPqQ52rHBDALGagx/Nmc2Q5n7XUJ1FGexq+STOOSgxdziI3Ga2LJU0dWYjJP8JJo8eZIFmhZFgLuvQqOOkbE8R5RhwmadB4btzvL2hMRtKxFWIwnipInOMoGHheXDqmUSRJeS3tVUg4l2HjScMTVePFGV+IlKZw0gpO7Z00Dpo4Kemc1EHjoGHRoC4yqdvypmsdZp4woY+4aMiiPwzzax7GmiXtdNfupMZ2lI7isqPqzebIYj5rqU/SOmlFQ+OIo8tZ5CajdVFnbMUE/CPoi+oxCdhvjn8jGa3nFkg6L2mL7zjPUO/1a4leiPHcuN/v9/4435vk+Vm8p+QjBJzPizuPcceflNfSXly86hjgCUcusihDQHlDCifNBO3inHvDSRMTdDZJw1KI4cGpi7LWbbXWtXngCdM0TDsGk/yat7Gapl0cOQ5rtFIJ+KY44+Owo+rN5shqPmupT8qG+SbpOOLo8jRyU1rgGJlcF5Oum2HPkX8TWUecCYzsmYRydEApg3XPwsIiA4goC9LkqENXojHlnH2rqYPGLSwsLOoNVh9aWL5pQXYa2u6jiRyOM5k0aZI3f+PHj+eoDLGwsMghSg453yTuSfV2cbGwsLCw+tDC8o2FWTvND2gs43MAt4WFRXNS2DibZMCAAXmPxtjFxcLCwsLqQwvLNy16zuSxP3369LFZNAuLZoySo9fhyC4uFhYWFlYfWli+sajBnE2ePFlsS8GZrTgTrVu3bpxNyywsLHKIgsPX7a5WDmUeSzMtLCwsrD60sHxjYXLOrINmYdECHDUogbx3/Sk4vC3ULSwsLOpZb1t9aGH5pmXPmXXQLCwsculQ2layFhYWVh9afWhh+aalzRnLvP0PwkmNv7nE9AMAAAAASUVORK5CYIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWaWRlb1BsYXlncm91bmQvaW1hZ2VzL2Z1bGxzY3JlZW5fbm90aWNlX2JnLnBuZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwNDAxMTAyADAwMTE2MTAAMDAwMDAwMTcxNTcAMTE3MjE1Mjc0NjIAMDIxMzA2ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAbm9haHJpYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlbmcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIlQTkcNChoKAAAADUlIRFIAAAO7AAAAJggGAAAABYqM9gAAAARnQU1BAACxjwv8YQUAAAABc1JHQgCuzhzpAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAB3tSURBVHja7V0HkBXF815/RswZSsGMCRUkmBB9KGZMWEqZxaygPnMoUUtERKQEPQOi8gyIGMDMKioGEHhKiaKeSFDRQ8KpmLP75xuZ/c/ubZjd6dnd4+aregX13t7udG/3N9MzPT2W9R9qln4WLP3ULv3YSz+VpZ+SlQylZX9nK9zDwKAI8PuDyqcx+AGXtyq0Neg7AwMDAwMDAwMDg0Y3sHdCPrKD3BLBPQwMiu4PKp+i+sHYgLa+bfzYwMDAwMDAwMBgeQBWbxwRwgC3InmPCsE9DAwK6Q8qKLgflNG2Dh06OJMmTfIEtwHfGT82MDAwMDAwMDBodKiNCFRtyXvYBPcwMCikPxAFu0XzgxLa1bZtW+fXX391XnzxRbetQd8ZPzYwMDAwMDAwMGiMoAhUTbBrsNz6w3Ia7FbQrpEjRzp//vmn06JFC7etQd9ZZmXXwMDAwMDAwMDABLsm2DVYbv1B5VMpopyzZs1yJk6c6Glr0HeW2bNrYGBgYGBgYGBggl0T7BqYYNcqfoEnJudPP/3kjBgxwtPWgO9qjVkYGBgYGBgYGBiYYDfZPeKOeKn4ggTVI2H4/ZIctVSyvEcqyR4nE9bWqL9NegSUv20q7Qr7eyqdU7Qlb3+oz1D+NDpIYnNMzn/++ccZPHiwJ9gN+i6jd0FpD9S6VX2eShuykEUnJ6q+VxUO0sGJedpuU+HoIukgib8E+UZaXaXRfdDfBF0rM3aI8nNqvkgzXop7hszfF41bdYzr8pIjjTxU/ajuPiOLMY2MvtP4aFYcVYR4J/dgt7RMQNlVMdxjrKXnSJioAX3JSr5aJyubHUD2SZ+jo11i22o06TZNWxrT5I8M+Se1/xLB/cT7hMqZUzVpWf8uZ6xbWcLXseqflSw1GjlR9b3WWPoyK6h4KA/bXV45ukg60OHvMrpKq/saSfuTGTuUMxxD1Si+l1LKdhWNW3WP67KUI6k8SeWIul+NlX82nip/1mj00aw5Ko94pxDBLntBa6yxhtOrVy9n9OjRzqeffspSJ7Gi9Ntvvznz5s1zXnrpJad3797OWmut5RGMqFiQ7ICeyTVhwgTZ613jK5VKzr333ut8/PHHzi+//ML+HTZsmHPwwQc7K6ywQlAHlPQIqEqC69127brrrqxd0Dl0/ddffzlffvmlM2rUKOfAAw/0G9GPhDqvKLalbGUD3cEuk3+llVZyjjvuOOexxx5zPvvsM+fnn392/v77b2fJkiXOBx984AwfPtw59NBDnf/9739xOkhrc0mDXZ3bEZgMO+20k2sPqAb9xx9/MHt49NFHnU6dOsnYggq3qNjXAuiX+FiqLGVZoIkTKd6r0lFgGjixrNN2mzhHu8/t3LmzU6lUnNmzZzNdomDenDlz2HddunTJQgep/OWAAw5gVeznz5/P2v3VV185Tz75pHPQQQfJ6kpF92678OwFCxawZ2+++eb+6+LGDqwNm222GeufvvnmG9Y3aRxDBfo4eK5ly5Yy/Y+94oorOnV1dbLvtajcmmpcV1A5ksjjynHuuec648aNY+/y999/T+u7uvqMxDymwJ9x+i7xcWT//v2duXPnMp+X8VEqjlK0O51+UYhglynppJNOchYvXixleAsXLnT233//rILdBm3t2bOnbIVddv3uu+/uvPvuu5HtQBCyzz77+A0g6RFQsjpnTrHyyis7NTU1zr///hvZtmeffdZZd911dUww2ARtySLg1RnsMhvZdtttmQ3IYMaMGWwgHaIDFZurLUiwy2S44IIL3AFVEECiF198cWzQocItCvZVi8EWYaXurGWp1cCJVO+1lmjgQsmJZWIZDUcv0+Waa67JAqw4YBJh9dVX16WDVP7Sr1+/WF2ts846Ou1gYZAeMPD0Pbca4e9VPpBFocKMxlChPn7FFVdIrfh0795d9r0WlVszH0trlkNWHiZHu3btWMBG5Ls6+owkK7oU/Bmnb6ZXBNJJfJSAo6jsTpdfpB7cy+5RrJdoCFNSnz59EhsfVr1atWqVZbBb4oSPWQ9ZAj377LMjBz0iMMNz7LHHSgUfii/fxurgM888I62n9957j8muYRCh3BZLf0oz5Z7ditBeZlM4zgcz7kkAUvEdA1Qisrm8q0kznWBGMa5T4PDNPpYouUXBvmzMsBJ1qnnIYhNzItV7DWwbgY4peKhMKWMT52hmL6uttprzzjvvSD/3zTffdFZZZZU8gt0GNgkelsGUKVOYnLrswFpWc8GPW265RbymLsLf2W833nhjlmOoUB/HZG/Mu2ErPmPGjJF5r0Xl1qTXNwY5ZP6uysdEixYtovRdO8dgl4o/Y/WGCYKgvifMRwk4itLuqkULdhN94gY/W221lbvUDmA1CrN+SJdZddVV2ZL8Rhtt5HTr1s156KGHPC9yyJAhaZ6dpq2uTpAeIDsTjplFsb1IRcXsx6abbspmeSAXAo2PPvrIvQbL/j4DoH75rG2YHeWA/m+//XanQ4cObGYcRt2mTRvnuuuuc3744Qf3unvuuSetDqNy9inaUskx2FXZ+8E65fvvv9+9L9LDzj//fGe77bZj8oMksbLRtm1bp2/fvsw+OKAnvy6pbC6D/SuRKU4ge7F90MmGG27I+KB9+/bOW2+95f7+xhtvBKbzEHJLGvuy1157bfd+SL9KyTt5yWITcyLFe03tjxlx4mwiGQ1HL7MXPEfEyy+/7HTt2pWlwYEX8f/x48d7rhk0aBC1Dipp/AXbRngGzTHHHOOst956bACLrSWvvvqq59oBAwZotwPwBGxRtE1hBWlJhF6WQN/YTsNx0UUXsXfg2wpDyRcN9Im+jAOD+oh+qLrxxhuzNHc+oRsVIBSUW5NcX2okcsj8HZtYGTp0qMfmMdHSsWNHZq++bVyJbI+wz0g0aUfEn1EyLMa/SB/mQADarFmzSB9V5Chqu6srRLBLgaDBj9iZvf32255Z2aDPVVdd5V4/c+bMrIJd9lK33nprd8+AGHQEETUMWJy9HDlyJAs2gp4Lg5w8ebJ7rb/qLfHLt0EYP/74I/sdzoWU1zCdtG7d2l11xGrhlltuSanzKlFbqlkHuwQ+4JIXUjo4fOnJDT4Y3HFgn4dIdoQ2N9u3El22FCveJR3kgvxvuOEGRsJHHHFEg/ZvsskmnhlCzdySajZXbCPsNmWnmpcsNjEnUrxXXcEuFSfWE8loOHrp9ZigEwOVO++8M/CZGMxhYCgOJvG3hDoope0jXnnlFca1QW0W0w2xp3uDDTbw60qLHYiTLb6U4FC9IOWeA/1GFmMo//2uvPLKsP6q4g8uLr30Uk8aZlRgVUBuTXp9pZHIIZsp50lfPu+888gWq3IIdm1C/oyUAfvweUbf1KlTpeRS5Chqu6u3ltNglz3j888/d3/HzI2/o112XZV/hxm7kIFCvWQKdX1AWmnc8jlr6/PPP+/pJKJmC0888UTPC8UMR4BsrlyQnQNFNzQFuyWe5spx4YUXBhnkD3ym1389VhcD3k8anZeJ26IzlVlHsOvalTig22GHHcRrfl7WIXtsJexDaHN5noNdipHzN57mxPH999/r5pZUwe7222/v3g+BT4A/1Mt20jnIYhNyok30XtNsK6jPmBNVZTQcvUwHl19+ucd/Aibu3MqfGGDV1tZ6AiMiHaRO6cQk5vrrrx/aZsjzySefuNefcsopDVLiCXVv8+AOEzAcKPoj9hNBekE7MbHKcfTRR/sDRuoxVGCwi5UiviqEDCjURAiYSGF/J9a/EOUNCqwKyK2puLgRyCEd7IorhcjgCJHFTtqPEvUZicYyxFweGuxiMpDDtzUt1EcVOaqqIYZbfld2Iz7iGU2uopDCwIF9KCkGQ0mVxp6NKrhiIIHONWq2EJXVxJQfK7yiWTnlDFPQXtE4Y2E6f+qpp9zfmzdvHjtIwzUcr732WprUwtB9NZra0qiCXVStE9OYy+VykC6qVkxZd0Kb050WHofA9sH3kfaDaoaYQeRA1cAMuUXaZpAKxIFUy4QdsGdlNwdZKDnRJnqvabjGzpgTqxS228Q5mj0XlTvFlLwQPnNtCkXBxHRnIh2k7iOQehnXZnGvG1IQ/SnxxLov8RWb6dOnB/YVQXpBNVwOTCj40khLmvgi8H7iqnTAfncm3x577OHpT/21E/xjtYJxa+pxXcHkUAp2v/32W/c3BEfC7zUqW26I+oxEWWqEPhya5otUYp4xgZM8hImgSB+l4ChCu6sn9gtlIybdsxv3wV6nPffc0znzzDPZkjpIUqbYCGGwuxikDAPiwLEtcc4qBjC77LKL9FExmtOxmZyiLEmBmWBKnWtqi/ZgN60/+AYfjAzF9CwOrPYi/Qqz0r7CAOIeqzqRSAhtTucqeZJZUZ46PTtssgGDmS222CJwUKeJW6TTMI8//nj3XtiXnbIDzksWSk60id6rjmBXBw+pyGg4etlzv/jiC1k+Y1y28847u9djOweRDlL3EXvttVdsdXXIxYE6Cv5xhAbds3ZiIo7vaUWKJY68Q7qlCFRg7dGjh7tXFymSvgqqtka+CLyfGHij+nZQf3rfffe51wwcONCJC8ILxq1FG0vnEuziGBwOXyE1HSu7uoJdav5sICeyMnbbbTdn2rRpbvDoO77I1shR1P5TT+wXhQl2+cDHVRj22WBvyBNPPOF8+OGHbIk74UqZjmDXk2OOAERixdWzHwWFaqz4fUviACk0vZpiJVFGr2FAegmlzjW1pTEEu+5MNFJFsBIRBszYYTXo5ptvZrPj/iNG+Iovkc0VIdCVXll/7rnn/GlOZc3cIp2+hIITIWmVlYQ+k4cslJxoE75XLcGuRh5KKqPh6GXPxdmMCfisGlEQLpdg15ceGMSrVQSUHKiw7x9HaNC9Gxjh2DlxhTcK4BkEyBGTotR8EXg/7BnkQTp0I1SsZVt0kD3B90cCKPQoESjmzq2K47oi9hFKBaoOOeQQz++wGaTm4ohGFEYLKlJV1GCX0Ifro+wG6cY4LzeJjypyFLX/1GvwC/I0i7RHDzHixcoVzp/yV81TEI4s2MXL4y8MHSjSBWSCXbHUv5BSYFMN8lWCXdljMYKAv6XUuaa2ZBnsqhw95N4bqVYgCXFvVBhgW5MmTXL23Xff0OMlFGyuiLCtkOMzgIkTJ4r7+XRzi3T6EgqEcWCSImHqX4MzYDOWhZITbcL3qiXY1chDSWU0HB3wXAk+8xz1hVXIvINdtCcmQPe0GX7tH0do0v1YfIcVILFyeBRwnW8gPVYzX4Te74UXXnC/O/nkkz194KmnnurxLdlV0by5lSjYLUwfYSkePeRfoSeQJbdgl9CHI4NBVCvHJEESH1XkKGr/KVywS+kINjqx119/PbDh6LCQyoS8dWy+Pv3009nMTpbBrniYPQ5ftuT20obNSttFWNkVN//7DotWOWc1lc41tSXLYFc1mPSkIGE/Far1oZor9ifxfRhBwAw30kP43xLZXFFWdktCapot6gdl7MEFqA7I4Sv8UNLILanSl4R9R9UUdpWHLJScaBO+Vy3BLjEPqchYNRwdubIbGuyKabjIcsk72BVW7UPbjKM+OJAubEUU6iHSPUtNxD5dPghHgRkcO+JPY0bbkN7MK/zjeuyLTpptkZIvQu93wgknuN+hkqwVUmm6V69eUs8pArdSBHNF6iMUgl333WP19uqrr/Ycx9MYg11CH26wZxeZDUcddZQzb94810exaCLro4ocRe0/y22wywb5Ykl7zH5XKhX28jD7J8w6uB+83KyCXaT5cMCYkCIjG+yK+42E42SqMgGPpXnPrng8TadOnVRTcZV0rqktjS3YxT0WB8mFPRkIfjHIQGrId99952mHWIiF0ObyDHhLYoAQ9TnrrLNceXG2m++d6OIWGVTFioO+SsxJeaqUkyyUnGgTvdeKhoELNQ9VFWWsMxzdcM8uzhmPS2PGuZUcs2fPzj3YRTX2JG3Gyox/HEGsexboIh1UrGrcsmXLSP/F8Sf19fXuYBqBccBgmpovQt8TuI2vFIMLcZQXvt9mm208kx1CinPkKmJRuNVS3LNbMDlUgt2Sv504SipJOnCRgl3qviWoXaj9sGjRIvd7TFLJ+KgiR1H7T+H27FI5Akv1w4ZnDgwA4gRDNUsRQu4+abCL2QrxEHNfKe/YYFfcYI+iClZ0sSAbZ2Rx+IprkAe74v5Q7Cu0gqun8U+tzoGUprY0lmC3lJTwEPzeeuutbjuwP4n/RmhzOlfJY/Wx4447Otdffz0LEnEuY4ANM5LF3h0OHI7uDxg0cYuUDJjB5Bg0aJDKwLuSkyyUnFgleq86Bi6kPEQgY73h6P+eK1ZjjlhRdFcrUcWeA3+bd7CLgixxbRbPg33ggQd02gF7HgJbHHfFwQtFxY01jjzySPd7VMrlAaaYSUPIF3ZcQCiuFl922WXsO9S04PAVBIzcH1oEblUc11UKKIet+Hclbs/oS3mGG7I9kJWAQAoTJ8iWkQx6cgt2CX048ughsdo5VsNxVFecjypyFLX/LLfBLvudFxsA/LN+1v9XXXMN4MEHH/TcUzgjjjTY7d27t/t/LNFbAQWBogj0kksucX97//33/Rvqy36DEgs4+KoMJtkrKlWiXjzfDjO7QopYYNsOO+ywMF2opMjpbEtjCXaZDsRzynzn7NZavrLt+MBPOED+/HtCm8trny/TB0/JAW666aawjrAeVf44kBbqHyhq4pbEHRxmRhV8xs5JFnJOJHivrk4k92dKT7pS8RCBjHWGo/97bsw5u2XxmfhNPGcX3Eakg9R9BPa5hnBwmU9czpo1y70eAaXlO9aDUPfMrlAUjQNH1SXJIhszZoz729NPPx0bnCrwRWyw2717d89qEwJrVK7lELf3xC1MFIFbFcd1dgHlUA12mT1jhZJnIUA+33FTiQpUEfYZicYz1D4c5aOPP/64+5tYCC7MpxQ5qo7Y7gp39BBpsCumZfoKIHgG+jBUlCD3A/nkOoJd3i5suG7Tpk0SImbtbdGihWe/5W233RZkBOxa3F/cl+CvqEax91hMD0HBCHEfAQ569x1v47YNM8HiAE7cB6M4iNDZlijgnLYFgn3h78YGfFdS6JxkC1UxubCxX0xLxjENUWSB2TiOqVOnutcS2lyaiYOaGB1Kc4ZIhgjmUVrfCjjwHCtoHEHHdmjiltj0a0xY8A56ypQpUccm1McEiCXNPJmIvxU4sZ7ovfKjtupRRTJm9TcXTiSQsWo4+r/n4l5iwRPs+QoKmPwcir9p1aoV1ep26jETMGDAgMA2Y4A5YsQI9zoUJvSl/JWJde8ZRCMjyLc6uzjOf7FSBF/j8AUeVUK+iA12MbnBU6uBa665xv0/qtImycIrArcqjuvsAsoRNS6K6/dqeJaMaG+YPAnpS+PuR91nJMryIvThujhbxrPEUzl8hTGrxBxVJba7emK/ECcRpgv24hmbZhbs4sWLm59RrAP55yAzRPwoHQ8jF88QFSGcU0ga7HIMGTIkKBUr7v5Vf1oNL6aADgKFICAf0txwJIkYdATMgFK/fNY2BEIiUCYcs2hYcYBRYrAAvS9YsMC9Bu/AN7uuOojQ1ZaogCzNHjMdRw+5H2zYF2fHZsyY4ZxxxhlO69atGSmCdEAInTt3du666y5PZVf/gIbI5pIGqTVE6eVsJhQBggjs1cEqD4gc9gB9DR061FPl0LeKVq+RW2LT0cVqob4z79Lsya9mLIsOTqwjeq/sg5nxvn37utfMnz9fdeBCxkMEMtpNnKM9z73jjjsa1Cjo2rUrK6yCD47DsW3bcw306/MfK69gF8BqapcuXdiqB9LXwcc4Sk5Ez549tdol+pE5c+a4vyM1MUGKpJtZhIJBHFjxiVqVURxDRf2+BP/izE5xpc6f1iwbxBeBWymC3YLJodTvwVeQzcGBFcuAtHzpdmjoMxLxGBF/Svko7F+sXSAE1vXEHEVtdzqC3XLc2DSzPbtINxGJKim6deumUuU0sqNauHChv3qanUQ2vOzx48dLy/L111/78+x1vPwKT08QKxfGATPByLUnJghdbQnDgrA2hrS7EjeQIaga14CgZAGS8Z83R2BzaQZ8CyR0KD0Tis+wYcOkZcBMqO/s4dkauSXUjjXZR9ay6ODEKsV7DcOECRNUeYmKhyhst9LEOdrzXAy+qtWq9HNxJJtv1aSSV7A7efJkqTaHBIOkdonq/mImQcAqcpxe2KARWUfioBUBRFgAoziGip08E4tfiav6zZs3lw0Q6orCrYrjukqR+giKfg9FjjhwqgECsDS8prHPSMRjRPwp5aPwbXGiAFlEYT6qyFHUdrdEQ7wzPW5smlk1ZnxwVpp4zEAY5s6d6/To0cNzpMe1116rejRFqNNiY3yKlT6PbOh4MfiJO2tr2rRpnvPnJIg67ct324aqaI888kis3jEjHFBFrkRAELraEobahMGunUGw66biYUZMTNsJA1Z2scIbkO5MYXOlFAO9WsLOwT13GMUQ4jBz5kz/PmdHnM3TwC2Zdvrie81IFl2cqPxeg4BO1rd6XsmRE6sEtltq4hzd4LkIlsT9omF4+OGHPRV4CXWQaryDY6aiBpPwZd8qZOD52qq6B8eLvOE7nz1JAR92DVIVObDfXFiZIeeLKE5EcSIx5RMYO3ZsUJpr4bmVYntaUfoI1X7vtNNO8/hIu3btUvu0xj4jMY8R8Ke0jyLjRdQhKqoH6USRo3TYnZZM1qhrsjpn1x2UImUTswdY3kfOOWbokAs+ffp0VlkPpaz5wfJQLIevFHaFikywF1Ks9JYgbSJw+RxHJ2DPEVJUEdBAPqQsIOUR58Zx2RLOtqrksLu/4WgbHOCNAh8wWLQNM7JIgT3nnHOCNp2XCQhcZ1sS22SOwa4t6gD7qJBmDHmx6orBBMgZFTBBSkhTRlqIFXG0hKLNkQz0KDoHfPbee2+2bwSBAWRAujdkgH5QcbpZs2ZhMujilqyDXTtjWXRxoup7ZRXDcS0me5CGj/R7pLTKDITgQ/yjkROpbLcpc3Toc/fbbz9WSA8F/aBL1CdAKu3w4cPDjvQoa+aq2Psi06ZPnz6sEAz8FXaA4oH9+/dnqe0S2z5Ude9JMxw5cmTa4NPDzaNHj/akQAb1o4p8IbVVbODAgZ5rDj/8cD/PSa2G5c2tlOmaecqhCv8+Xd+pEol9WnOfkYrHFPgzkY/C18UswLCxriJHUdsdtV/EXlOx1A+Gl71HmXD/YyXhs2XaGqRo3bKVNchRiXLAFG1TebaluS2xNjl48GBGgOL9Ar6zJe2DwmZV/KCcgy4D9QqCpO4cFGTQwS3ke5ckST4rWXRyYloZqgo2nDUnUvpfU+ToIuvA0sgBdsRqmi6/sVPoxU7ZlqR8ofJ7g1RLjX0vNbeqjOuK1kco790l8GndfUaWPEbioxo4itLuqP0i9pqSpV5wJsk9kihL5hy/pO0vSZBmWtlKCToIvzFRyhF2vU3QGVPYDGVbYtuIlDfMPon3DfjOlrQPlU8ppQ6i9JCFLgP1evfdd7PZPILVEioZqLklr2A3K1l0c2Ka91qy0gc3eXAiNa82JY4uug50cEBZkw5KCfse1eso+ULld1GnsnIVhVtVx3VF6iMog92yhnaUM+YIVR4j8VFNHEVld9R+IaWzkpAGkvYokST38F8bdFRLKcF9k7Y/6PlJ2pvm/lk8R+a9pW0bxbN1tSUMzNFQ9ASV6kTjD/jOTmCfaY4eovCFPHXZQK9IxUEKDEGwSykDNbckGejKHE2VpBCdblmy4sSk7zXs+jT8lhUnUvpfU+LoxqCDJBxQVbBdHX5TiRg8VlJcx68tE/NF0t9Vx4J5civluC7vPkL2I3OualquDbNHnX1GFjymYst1mjmKwu50+IXOd2lgUEiwWR7sQ0Cq7ahRo1xnD/qOIFBrUnpFAQasjGN1t4npUHUfoK59hAYGBo2DAwwMjM8YnzH6NjAwUEYFjj1u3Di2CR8FnLizB31nqe3hanJ65WfJdezYsanp0AS7BgZmIGl82MDA+IzRt4GBQf7OjrMY27dv70lhDvrOMqkOifSKsxz79evXFHVYsbItWGJgYGAGkgYGxmcMjL4NDAykgwrqKqJGr02HQEtWtgVLDAwMzEDSwMD4jIHRt4GBQWxQUWMCXW3BXqmJ6aBiZVewxMDAoDioWCY7w8DA+IzRt4GBQYGCEjGYCPrOIH2wZ/RoYGDQ1PjPZGcYGBifMfo2MDAwMDAwMDBYLgeTFctkZxgYGJ8x+i48/g+GYkIGmO7MJgAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVmlkZW9QbGF5Z3JvdW5kL2ltYWdlcy9lbnRlcl9mdWxsc2NyZWVuLnBuZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDQwMTEwMgAwMDExNjEwADAwMDAwMDAwNDA2ADExNzIxNTI3NDYyADAyMDQ1NwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG5vYWhyaWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZW5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJUE5HDQoaCgAAAA1JSERSAAAAFAAAAA4IAgAAAKCmq6cAAAABc1JHQgCuzhzpAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH2QYEEyoUkhaAzAAAAJhJREFUKM+1ksENwyAMRZ0qE7CBZ/AObMBiHFmBDViGMwJ7BfeQqkQNSEna/qOtZ/9vWFQV7moFAOdczvkShogxRlBVImJmPS1mJiJVXd/DROSq7Qd8odfmUsoN+BebW2vDtvd++BCI2OGZcs4pJWPMvigi1toO11pn/Ae5r/wz82byaLvDiBhCmH3DLd7wYAszH1OdkYg8AS7Yap1nd+0sAAAAAElFTkSuQmCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZpZGVvUGxheWdyb3VuZC9pbWFnZXMvZnVsbHNjcmVlbl9ub3RpY2VfdGUucG5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADA0MDExMDIAMDAxMTYxMAAwMDAwMDAzNzE3NgAxMTcyMTUyNzQ2MgAwMjEzMzEAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABub2FocmljAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVuZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiVBORw0KGgoAAAANSUhEUgAAAzAAAABKCAYAAABkWbEhAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAPfxJREFUeNrtnQncbeX0xzcyZMo8S8gsiWQobHMhktAgoVIkHYlIhEIlSm5IxTEmQ1cJp0SDog6ZuYZIiCgUIhn23/f537Wts86zp3P2Pue8712/z2d/4r7ve86zn2et9ax5JYmjK6z473Ppf59V/30Gq5/+f5/Ut8bhcDgcDofD4XAsCtLVRktW8gzckHE4HA6Hw+FwOBzzRg8D5VrXula2xRZbZEcffXR29tlnZ+eff372mc98Jtt7772zW97yltqQ6fmWORwOh8PhcDgcjnkgxSi5053ulJ1zzjlZEf785z9nO+20kxsxDofD4XA4HA6HY64YrLPOOtnPfvaz3Fi57LLLsmOOOSZ7+9vfnp111lkjhsyuu+6qjZh0Cb1nrLZn0qefeCqdw+FwOBwOh8Mxc6CEZ69//etzA+W8887LbnKTm4zUvmy55ZbZ1VdfHX5+1VVXZbe61a3kZ/0l8p4rk9UpchtttFG2/fbbZ7vttlu2++67N34e8YhHLFUDbikZjG4gOhwOh8PhcDiiQFHMPve5z+UGzDOe8YxoAT/RGMGOO+6oi/oXHT3Wynv95Cc/yabFEUccofel7yQ0ZhCzJxcn5c0g6j4931KHw+FwOBwOhwYGSEgXE7zhDW+wSuQ1/Pee97xntssuu4TnAQ94wFJR4IPx8trXvjZrC8aAGTgJje41Ua40TbNXvvKV2YEHHpgddNBBjR/+NvEol8PhWGzYKHPf5ZXDsWx42vl5wcEBZfe6172yv/71r0FB//e//50dcsgh2R3veMc6HvJFPlzWFpRpjR/+8IfZoYcemvV6vYmeRz/60R6BKTBeoKNvfvObUxuJv/71r32PHQ7HIt8tZSMHfNyAw7G0+Bk9oyhzZOjGzAIr+TybbLJJ9v3vf39Ekbzooouy448/Ptt2222zG9zgBvpAL0kWP70nGGcnnnhi/j7vfve7s2tf+9ptpDZ5dMDQ0Lrrrpv97ne/ayXKZQwYj3I5HI5FkXUha+H6179+9vSnPz1785vfnB177LHhv4wguO51r+uGjMOxdNATfl1//fWzPfbYI3vXu96Vve9978te+tKXZne/+909rb0DxAqkJ7UQ+azQRhljpQi/+tWvsmc961lLSYEPF42ue7nFLW5RZF17kfmUhqKmnSuvvDKkjz3/+c+f6DF01vctdjgci+CoIUUWJefyyy+P3pN08HzFK16RXe9613Olx+FYAsbLeuutl5188smFuu/pp5+ePehBD1pYfhZjYJgsfkoUylxVgXTTcNdYG+Vf/vKXQQHdc889Q7rVT3/60/xnb33rW5eKdzwYMF/72tfytW+88cZ67VdUGC9upNTcZ6Jaf/vb38Ie/+c//8ke+tCHepRreThIhr7/fraO/90n/X5/RLnhbvzCF74QZqjRoVN387z97W/vRsyay1+raugWotP5OIc5OSQ22GCD7Pe//33Ot3//+98D79LY6kc/+lH+7//85z+zl73sZQvFz+lqIsvWWmutRRc0PVkfQnHnnXcOIa6TTjopW7lyZfae97wne+5zn5vd8pa3bBruCoe477775gd1wQUXZDe60Y1GPgevky6EpxZkCSiYMHe211575eu++OKLs6222iq74Q1v2LYC3eaMmaUmmAY3vvGN8z3++c9/vqhRLi/OW14y0dEcKxPv9DexssMdK/jxj39sW+pnt7nNbbLPfvaz+e+Qko1z0J0xnRsKiyLPc/66293ulu2www4hGocO8pznPCe7853vHNUxbnazm2VPfepTsxe/+MXZfvvtl+2///6Fz2te85rsec97XqC1jnh4Tbkng3743e9+N+fXww47bCxL5ylPeUr2l7/8Jf8d0sra3HdtwTbZ7NwgeNzjHheUrk033XRRBU1Y681vfvNgqFxzzTWFoS48QBTgr7322nU3ORwiRpAgkiaWGzFykHzPHe5wh0WPwoRLh5zkT3/602N7RdOComfFihVNUphWJO1FG5ZiMWjwTJI6IbRx05veVL9DlVE3CyEZLhZom3quZa5QrAky0THhPYJhykVNzZqfbTNl5/Of/3x+fzzsYQ+LymxqRa+44or897izE0+HXRPkeeAvjNqvfOUrhTraV7/61bwREKlLH/vYx7J//etfjetEyXhoW5nWBtjDH/7w5S4fBnTTFZx55pmFehiZSIJ//OMfoSNvG3uTJs095qkoXEQZKOom5QWQQqUK8BZF0ASmIMyFQqHBRpLqRcEz4S2Nb3/729ld7nKXOsQ9sAaMYYq/y/+GMTVe/vKXLwUCD+9HihNRo7qgKDOpnyaHtyJ729veFoZ9TvNQO/KNb3wj5FibZgOL7CUNe3z44Yfn+3fqqacGJkdZqnpmQEOBh/BacVHwbLbZZstVoVgTZKJjQh6gLuMzn/lMnvpEIbqfbX0Zd+655+Yy7sEPfrDmr4sT1ZVMp55wT+NhT7whyXKW52FNRFrqGCP8Dk0f2mh685KXvCQm5ydxYoV3wFGNA5c7gIjQMpYPg0c+8pH5Pn7xi1+0d+aq1XwdomMa73znO1txSvRf9KIXBWHBpVvjA3MP46Me9aiRmg+MA/5twTwlQRm5613vml166aX5Wr/+9a+H7ic6ykIKD94IHQ4jxG1SytIizxKF0wIUaUKV97vf/UJhP4YLHjud3wve//73LwXPUoiOkDam1w9z/uEPfwiFmLEHZbyBARMuLubDtAlSEWak4LfinSRVghbVTXH/+9+/CQ01FcyB53ffffdcKf/gBz+ojcPBnGmzTtphv8HZL2eZ2CS3fLlD+KA2D3BfDAaDXMY/7WlPW06RgS54acyAoR5UQI686TgWnic+8YljMo5/qylv2kxFXgq8sBzkedDT0L9sM4f3vve9YabZ6173uhBpge+K8OUvfzk7+OCDg/OS90OOo7fgpBZ84hOfyPbZZ5/gYBWnNTUbqtZqMKETqyeO3uOOOy7/PjWPbTka3gMyRSSriPEhm2+++di+Xec61xkZ9A4YFZG0UAc+4KABXutkNN8+6mFEiKOcCvEDakkwAJLFKxwOa9bhyCOPPDJsaAGBBg/bBz7wgfz3TzjhhKqNTsXq/uQnP1mpbF544YU5E/I9yWIX84d3u+9975uvmf8SObrJTW7SJI2r6nIPCvzrX//67Be/+MVUjzZUwRvf+MaloGTkAhNPY1MjRhkwg7rfU4NXc54nB1kb3SayNa89zUP1pPKQsvWEJzwhhO1JKzCGa5N0wuUoE1Pt3Sa3/LGPfWzYL7zgyru9prSv7SX161jC7yLvzjrrrDx1FnpLlk+jjK54aUzGk8bNHaidhHjA8eQ+6UlPyt7+9rcHhdLiGc94Rh0Z11Uq8qKe7XKR533WQJdWwTve8Y5one1tb3vbkTREgLNpww03jJ4dbbkFGDT6Z495zGOC0g1e9apXWdoOkVYcFg95yEOqaK8nivpHP/rR/Puoi06Wd+pj4Oldd911JDL2oQ99KPAr8oMaJgr6Lehs24oBQ462dAi41a1uFWOCXNiTs4rAEfzmN78JBJIsZlFjYG4KiAQYGElxcfRQ/g1mOu200/K/M+3f0iJDib+jy4K2+AUo1kQYqHshJA5Q2BecwAOB4qER4N3o4AJI27xwnvnMZ454cRYkWlCFQH+6Q8+f//znUMRa9dB7veb79YkI4NV6y1veUkZ7Oc9Do4JjjjkmGOoLcLmH9TH0E69bDBjaw+EwvKe6gOooX8tNJua8xWWi16qxatWqkMJ5n/vcZ7kXqIf9QE7DB0TiS2i5J0r3+eefH/bpT3/6k81tX+p71CUvRekQJfSUU04pdcrQ+RKve+QOLpNxIRW5LSwB5XO5yPMBdCU4++yzS+93DBupFwU4WIt+l30RQzn2c0n9N45qZvSF0gJAdk2VjCCS+KlPfSpfE40CkuXfCTTn6Wc/+9ljzmMN6s5Jp+OeAWeccUY7BgwRB+nHTk6hOcSgVJHnS2G7zk1kZkXBTJBFEeZB+cYalPAW6VwVa80ZnfQvAe9eIczGFHCUShQhPJz6e8k7bWAYzRvBMPvBD36Qr9l4a6s6Y/WTCQqg23i+853v5GteAs0Swl6Th6zTHE0hfxuRroGE6TGiVQrlMHYO0L2ASzJy2fXmJTS5tFAm64KQNekENda/3GTigHM7+uija+0TUSQucyMrl5MRE+6FD3/4w1UR9sAHt771rUM9JCDf/oEPfOByMl665qVSGY/SitH8pS99KaRuYyTBQ9ttt11wOok3mxataiZMmQxf1ZEBs6j3xnKQ5+E9ttxyy3xtJv1c9r8n+ggPETtokL9L4iMwgpym1gJAY8no+Icr+d9k5Eg6o/r55fyXvwE4FctkBE0ntEFOt9lkzelSmNMX9Z8Yex/5yEeCw+d73/teKOwnre8e97hHkKWStodzog0HwUBbqXz41ltvPbL5j3/840cUWC72gi5btid+mkzXn3vaXNUR5ZsNTRqkDPDI7BZTnDQo+puq1sKEOakbAYRBk+L0lIU1YFRN0BVJ+znCRTQzXK08Xl7xsKYgmGn3HFnzoOb3dU2b0b3WTRLI003aj3QNbne72+WpTqrAUPZmhewfk3QFRx111CJddn3WQnqXKDfILIQnToOqNE6aI9zxjncse482ZeK807CCgkrUVJw4BxxwQGgfSmQJGrPNS3T0b5tttlmOl3AwYF74whfm+e+mWctQlB8cH5LOSXoLUYoaPNB2O/gu5U/XvBTDyjqyLE3TPL3noIMOqmtMDNY0A2YZyPPwHjgGtPPOrG+oaLksTbBn+Vzu1D/+8Y+2HXdI+RLnBIaMjcDI2AtqfyMOnVznY0ijwCjma0KL9bQOP3OeH//4x3OZ21YHx3DI5GpfdNFFI23qCIfp4YtSFA3DJNUta1PyZnfZZZfOnp122ikIOVME2LPCTLpU0AbYWNhlQj9Y4BJSx5tfIszCAULgpI+QX2rSTsL/J6QoRfCEJk0/81WRS69t42BiA4Y8WcHee+9dNaOkC6MmKF3scdVDfj8NEwQomgVnFz6XCFmbdIkHgrRFvA0NBdlAz0hAOSir1TLepEtqKsvhPPFySi6/KTIP3iTxTkcEuzwrWjBMJ6WTAWcmIG/eXkpcgDL9lxQvUjd1Xj2hbjMotNeBTFyEGQDhXcSYj50lyqGkRjFgl9xkDeRZ0mwmVr9lWbCiZdkY+B5vtaSI4P03inhIpZOulZy5MXLKjJcQPajTPbCrx9Q0lBnTXfNSdO9pgUta8t3vfvexdbL2F7zgBUE2Aby4ZqRBv4kBk7QT0e8ni4nlIM/z9+CstZFlZ+kZ2SoOzaK7L9Aaepak7OM0FmcmNKWj0iYtdCA6nYzcIK3N0GFILdX11TiHFtR4aVuGjp0d6Yg4hVRXxpG6pZL0uqmcA7n1RBj5t7/9bdQTgWcGg0EvCiHE9FwEWiQvdqgH83UJPGNG8Pb0xkrONzUt1iKUNC8eUsbs5ov3zYQfBzEl4cQTTxxZF0oD1j1diXRxLwqCzTMn7QRFoWBA5DyZILwbvb7FU0vKDAbNgQceGNYMXbB/kW4ybXmfwxrEU9IUxjPet58rClzb4MxhWuNpKDvLAUYavel1gSuFhLEHYRkxkqr2PbwzCrcob5wnIV+ML85TK+gY5Pw7Bd+RgvTaue8oQrQWp7APYTYlfQ8kDZMoQcSTmL361a8OP6cWTf6Ni4xIqo4wFCheE8vEZPWQXC62BYnEDKARgZlJc5VEhQX3vve9g9LKmYsC2WDwWI/0UobNRSIVTd9fFKSLKxTL4YQX8UDuMFFQoAdan3IJU0AsfMj5qxRUeVYWfG6owZBOZfMCsgf6RE5Yo8Q6+TrmpTH5w10nxdqsk7Qx0plIM+FeoRGLln84pBpEmbsyYObtSEyWsTzP32PjjTceGXiIccy7EA1H3yBijIMQI02lFJYa6IlpWoAxQ9G/vmfNzDo57xCFRRYI0Af5fuQojV50lodpFrQIxkvXMjSRKBRNOAREupA7NOPgITVPd45jplMkujYVf/Xkw7jsODC81ggZIhAUO8Y6TtnwMhPtdcvhWRkwkuZhBHVqowcMxsI4oLsKec/MC4l9Dn3qYXJdA0NL5BJvTGA+vOfWO6vB98OIsboGzWBcBm9605uqpnjPatJrrsyxJxLSjwGFh4I41U++LUYeTGLAcDlCuyUX0aBLA0ZAyuBGG21Up0NMCFvT4a0JuPARwNbzVuaVSlbXaDXpdoYQQhhFco6rzrdPrZc+FxwfZk+a0MiAHHkJRSs+uVyENZeJdPzTa+V3dYdBLkijnKbTyEQecn7Bt771rVDvVmOvtDezbV4eYEwJSH1Ta/lusnrYWqSbXajPkzog+J6OPSXvEeiK9CM9QZ2LzUQRe03uI5RXFAXSX/Ay40kmjx+nRESO9iaRa7xXkZEquOSSS0JU1yhrMf5atQgGjAV1oMbBlM6QlzSGeNV1o5IiQHM777yzpZ+Vde6KAgOmKuuiafpdVapgU14u+ryyz1kO8nzkPTBiihqN2IHjJ598cj7QsuC7888ljRbdys4BxDAyEUtxUAcDBp22qj4M+cGckxpz52alt3UtQ3P9mqhUHX7WowVwWET0xKmcfL0G3ojLsX4JqVkjACEnQh6BicVMyFIXuhKpgJhQ2vl51cMliNWre01jgLzhDW8Y6S0NEakQnzB+tskmm4xcRHUhHkg8dCbdq1Ap5GH4IJ4JWvaRf4lHj4KzWL97mARrNGb4YEgZJUm+N+QQ01HIzCHodc0MeNnIY6STBIpzEWOTbmD2bJq1BUahoJNcbXkuuOCCoFDGcvhJ64m0VezFDE9SQ+igweeLNxYQGqY9YBltYmygpGqFBZqENtknMfjwjimP16Bof/Ho61aSTcG+RPqwp0XfB01imLJmOVP9FJ0v6VSm80tpZAmFP+YsMOmIdWlkwGUtMHnfQSiLZ4wztTyH4qU7DFJ8mZQUaNZ8+LuLUc4kXUF3PjSR3dR+R4e8HHhH5At8YdcuhdI4WKyMop2uyG488CalI7W8pL2VAjzsFHDWeLf8UiSir/PKY0DhJs3EpOv2JpFr8Cb3DGnGdL+iSJ33tWfJnRBJoe3Z/SY9yvKSli3TQH8mKY6slTtVPPDacaIj/wUt+2fFS/l+Y+Q2GT6ITlHRKa6uAdNWHUuaqJbkNWVD2sLnFX3OUpfn0ffYfvvtg8KN4xKlt2z9dLQqGTqefy4RYjqUsn4+PxI9EvoKf0MNYFlnrVhrYGMQ6vOahd42Cxna005tIr2TAidfDX2lNSNmoLyFeX4l+apSmC4dSmwqFpspghChanpuVz4oi/K35vAzzUwQhzmI8L9jFiIeCFLDEOx4qFBYY8owVr7JvZzWANTr68NUFH4RwbKXHOtTSkU+YIn3RLGAACs8o60bMfbhrFkDyosO/xJKpBakhbX1y/aRwjyiX9KeT0LlRiCvLPP6yIOxq1tgR3Jaxx6GpMq57bnnniM/4/1FicCYLfL08w42BZG/Q3jj+UWxQJhiaGFUMRwLuiV3Pza1GAMqKc/frk2vRefL/65Z5D2gVo1Il7Si1TB73KurlMt+8f7sEYPuMABlgje8bLyCQx1V0ZdhJHrbVCYGOuUccVzYoV04XFTYfKDpr2NeDrzDmgQY2zhYkKOa5kzxab5X0sWngq7C96Ac0EHI1tHgXCKiXRXBSVa3eS2L9MZS+UiJmdaIiT3cb7TExrDR4P+bFJa0SFah5McMO+QVzj2ceXhDeSTth9x8nBHWgAIM87PfQeRDHG44diSFj+gbKTgCHGmxLIUZ8FI4X5w99mzRF9hP5ibxX5QabXhFai/7czRgenKmyGLOAlpn79k7nADUy1IP8OQnP7mORz6nP2QknmkivUQX+C90gIJnUm56y0yeN3qPovVDgyWGQa+BThZ+l+hfi7Q6C1k/CxnaE8cGUbe29BUyjpKW6s10OkNRCHNM8SPPX+eumosuPBRJ6hDnXnvtZQ2DWBg2pNVgRES6geWPFFtSj2MEVlAwdYoARE8RUSQHNNSikIurLw6Et6nxSRvsXVVoeWQvGRpme/GbgqdwcUhraAndF0RqZmbEyEO4VQ9yQrFHkE/JqGkd4YOhp4v36RNvPL9pmcciUcW7GF/ClCa3WzcrGCaqrz5e7ti6JDqDgWqYtCc0h9KhBQGep7Le9olpEAEvSQEkgsusuV/lran72PPlu1BaK853RKlDcGtZAWp8xtjnsW+6VbYGQpILqMizxoOxqR0FJftVRyaO0SkCXOf+4uE3a+nPgJfzNaFUFYFaLZOqk9MGSrCkXsAXKPXJeOfEMR7lshY+EqdCwUydXPG0rZ7x1NNml/QMuhQhh3FWwB/a2YS8Nl76pulklXxAyoOO4Js9G8T2ASNH5kzoCG2kZjT6QAvQMR5yASlf9vek0xLy1jYbQNkW2WBy/fsz5KUBEXldd/Dud787WsQvRhGOSZETyMSac2C6NGB6kmGhOxCWgX3XaZkxpRpZLY0SisD3mRTh3jKS5xO/R0zfQFaUpJP1K3SyVM5Y64At0OosZH3XMrQne65lxQz1lVYhxDDUqVPSZYuLW+XDXqEVdBlAhGA0eXBp0aGIUn/cccdFe3nLhORjjz12JNUNz4VWDvGub7DBBpWbTF6l9iqx2REPaieGAZceqR46zGfSsYKyrg0dM6uiP4Nzty2OR9aHB0LApUUTgCkZtUz4jHy/Hn5GVK3muY0IzR133DH/DNP8YczrLAKjqM+8/JzaCGuIolyQiqmjVkYAxwruhrGfoUzhvSWnt2FItsrwLj1f6JO85boplsnqolPtpUcmmML3qpSLvO883hscGAhSPKEoiBWDBgO/UQ+Hx1SEsOpCNWyLl4lO6xo4pcDnKa4z4OWcrrm4SOnioufywoNIdMZ4eMeUceRqgXJSGq2C7/XAOZPCNtB/J8XiultSSReiEGXQih90WKPWbCrZxp2m8/P322+/oiYQwfGmuzciB81AvNq8LWdn7r98XoXMssDDGftbomIAr2kketg1L6WJGaCIk7CuU4rfJYpU0xBpswZmzNGI3GqSUiSyzXQpzI0/eC/mkS6q8zUNaXrLRJ43vZcq12/Sx5t8d5DJdGNsmVa7lvVdy9BUdFPRteeor3TnmdeEZKbM5727CYkK6NCl0s0GRQJJLgJC2qa4PaTfiLFhiu2zbbfddiR/2XhDoh51eSj218LFRBLa3uQRBRrLXLdwNX3ww8O7SJiQy1H1OJ/HTJkxr4kUf0qObYcG4AgN8j1EO0o837U+B0UvMghzaIUdSozknNuiOJhUvHVmGFZQPHQDAQqmI1PQi7qEaOE+rEhx6vx82auK8x1zePCuuh1rwzDymLJc0Dq26KIfWm9VxbTlifdKd2silJ5EUlw75uUxhYOzinWcKoqMaJlN+kSNaNVQy3udZhFJnQjeO50+S21ZUtw+dWQiN/nvAhT4SFSkVdrHUSf3DV5LOreZvQv7TY69Ljg2HeDa4u2wLhQhSdVTP79SnIfipSZqVGRAdshLA+t9jjQcGZYpqSY6OGkK2TQdyPrWkGevuVtQAqFD9oysDpRnnGg6vckMZgxrRPHTfIFXGyMV4w9FF88+BgvNMHT2SEU97lKV562unzq2CfWNgeaXFmk17VDWpzOQoWFfONMloq9MpkBSRC/1MHiqYikzPDLQJrLRacwiJq9WFyOKVYlHk97eEoqyG6oPxigPtcKwFDgJSAWYQZQj3yOZsCtF4DEC1L21W1TAphUsFwoj61CjyU9Nu/xuwr0SHiXqpozeQV0hxn5W7G0ebhZDF1oULzuCQV94xgAOa5QwNX/PjIVk8q4cRWH3dFbnS11Fze/NaVwUL1EIlOI0aMIrSb3BZmNyRSuZtHfsIvLBBVgwk2hEJnbMy3XSMgq71pFipPPAa144+bvpjpUmChBoiRqhgmLz2NpG3oW16dQuUweZdiGbdd2lWW+4pOF9XahuUjPa5O2x+9G0vA7pLCJnTNp2f0a8dIlVfmivWkPp6dUwsCsNmBaGWIriNXKmEWfoyIOhrkcqqJ9dRhqmbtaCwlzQ5CfoVCjkBXvXX0byvNX1N2j8MEY/HdFqV7K+37EM7S1hfaURxjwxJmUiJxBqE3SHphKvWRozekhRo+ZA5/AR9tMpPHhDdI9/M4SoV4eQ8XboIrGGDFkUAu3XEQjsie4so/rh5543nepkQpf9loTDJOvPz4yZEAXFp/0OBVr4Dp17bgrU0jqfQQhcPGS0HixY+9BGUqBJaFPXP6DAWWYlH11AoXRNZaHqrIarFYYLk+ZDB6c6X/JgG5xvoF9mpmgvJE0UGnijRAjKQDMZajas+w4YnwJTXzdoixbxBOrGEFwWMZnYMS+XnXnVXgUaF8cUcrDBPoV3e8QjHjGSa61mXV1OExO5GPFImtlGF5asLVcIKH4vOMe25Uz4TlIpJJWItat6yrBXuiYkwvtt8nZOY+edd95I0wjqYkghkboTFJSSnPsueekSUYC0TEQxLJhjNUwmb0vchQGT37da3zDO0r+q/RpWGYMoiHrWTWT438jnkNKls1aS4sHMS12ez2v9I8ZAh7TahawfdCxDg4FIG+Y56yudo28PhzacSUFete6AU9J6Lj90Lg2MI9v1ASMFi9mkRFxCYZCAwTqG6GorwtqqV510BnUuOu1FaeDRypUGHXZX+a957jKpTbpOpyUFbMQ6JnpR4B3qVb2/biuL92pGocKw9t12222acHbYf8l3p5amYO19USBImbRdg6BViqfNBXUZxqmkoeDNiMyXaMuzXuRVb/186WTS4B1y/qIOo2G638j62dtIOlQdYThE8OuWjh3QZ6CjT3ziE5UysSNebo2faGcrke6m5wy9S42EcShcQac+AfvU0COX06EoHPxX0fMlyfTzPqJnSj2KgE5lwtuJST81nvoueDufGi5dw2J1GKauYTBDXsoVcXQDnZbN3U2DHuaj0Y2NrkXwBwN9J/TudmrA6P0lwoCRGGnFy/uWtkVGuS5oZtS0e1Z/ucnzOesbace02oWsH3YsQy/HcT9HfWVqj3tdAR8Oh1aNAmpQIi8ZXkCnSJnixH4RUYmnhxA+SikDemyBuwgRUpYEhx566CQbHgSvTn+IKB+FBEH3M+YBSCce8qBpvVfSlWTMGNx3333z74ZpzHcPISxhMmbytKD0jDAw6SISKcPzQ5GaHlZaxwiTWh6UedMSulM61CF8PJIN9ybQKIX5UntV4vXKf4YSgeEEbUKjJj8+p009CMwU9zcJo+aROlqeEpamwI50BAqtC1pvdna+QLWWHdTlL51vbAom+0XvDB1RsCjfzaV16qmnBk9/kygreyQoOONpaXGkRsF0kdJ71AUvt7H+MQNmgs5O4Zx1sage8KnrJinqnFRO689ntkmyuo4ROil7TBFqnf0Ispn2oLH0ZOrgxMlmaKoxb/OQCgOPwNvwOCknpg40ry8lwoIjBacbETMiwXhOzYDJkULyGfFS/j4Yr7bNdgzUfkAbk2ROtFwD04/dxzriTs0l+obq0GcbuoghPbSGkGlw06tyhkaU+qUszxdB3yjc745otU1Zn3YtQzFg5qivND80iooQ/FtttVUsz7Pqg4f8jQBlrkjp0yleJkd00JCJY2sc6JxcM+Og7qGONBCIREEK95E++tKRzYIQn4k49YoIU1+Sr33ta6OpJzJICIZoQekJF5Gu3YhNpVZtAkv7xfNz3QVOeSsGTegwYghU0iHd5gTUpkxiwMj8hwpvVJVXYYw2KdYUmNbfwxqKaD9R82OIDsVArYFpFZ4uwPmO/T358gJqzir2OSgJujDetnyls09NOhngdRIgvIuULk2LkcLFXpWyi4IbGRY45tRpmZfH1o8yrFJRGymFkv/fMIUs/3uU4ljdoy6+1YZN0jBvXc8lkGiDTtMswgQpHIEOixxkdO0SkPY8KW+jfOlceQ3mbxjP74qG9+OseWmEHnk3eIlcfYwtohlF9yW6AXNH6q4j6aaIP5V1azqOzZZDHuOlp+aRqFQSKaDWBf6q8cuwgSOivwzkebJg64/Kzg5otU1Z3+9ahmLA6JTHGesr9a04rG1y/WwaDF0JavQgzxVH8h4FKGoFBxMsPj5boJh9ULEpsRxTm6s7wIgoyNlrZMDIDBozpKuoM0foBqEJnM4cDPjRQoufm77isTSfkVxqdemPGDCS44zHbUqlJ3ynbcWHR0O3Di1pDRndP/23FR3nSukQwif6NgkdNmjDGVW6aC1a4++LDJkx2tRFwHj16nqp7CNpmET5GA6LoKUWTELBJpw8mPP5Rv9ee+wYTlayz0FY68GK4v2iI4qeZRAZ2BelET2FnHk9Nu2liBZRIE2rzl7ZRYjzIVJkPWbAtM3LReunnbHxypfyEp59iSpMkPIQ3u3cc8/Nv18rxsy5KpgE3+jy1e3IxfFWZcCgPJgmMv2a37lKGzDa04ziWtJ9qjZvoyiIw4tWo/A2HQ8lFe+cc86xnZbqOFJ6c+ClQV1HJAbVgx/84MAvum4MR2fNJjBdtVHOP5voFzQjg7nLwP5B94xl0O+phwxO0TUvXeLyfNHW38hpPgWttinr+13LUPhG66Ez1FfqyuJkABPZ6dGayTiUulEDwkGR3OBBbMMo7Bao4V5NCuSL0iAGeO11G9+kWQ1MbmQxgC0S7h0UEZOkHQG6oElBFcW7utAy0r1m7LN0P3JlWecpZIRXW8zhH+Cx0K0QSdFL1JR6LbRrdG0aIuzl82qESivpEO+HGdSW1qFDBjlNkvZCGBtwbkmzfOBS2tT1OSqyVuixIR0RL5XuiCIRJvbXDpHSSpTiqyu6PF+ges4P6wpNPaRPTTCOfeeQs5fQO0o5UQW5THS9GEpDHSGriz5Nt5nLqmgRejaewbRIJmhFWhkweo9a5+Wq9ZNeZLz4hbxEC2A9S0spXcNJ5KjuEKS9e8ZjW/cCG6LIa8VbWpMSDaE4VT+SEoJBZuZqCP/1kxoDSzHCBFzG8hmPf/zj8383gyOjdwZrhbd5ROHiziA1iTWaBiRhGJ1kLhR0irLe+th7zJKXJopYY3wjtzW/RZoCNTFgpq0lG1HMoDnqbBnajeKni74tOC89T0fLTBWBaZJWHRy5S1yez1vfqHvmbdNqm7I+7VqGYsDMSV8Z1t4Aiq301FGKdDgUjBbdbaVisnm4rA855JD8s9RAq6gBIwO4APMCkvaKVsPnSxcvLu4aiu+Y9a3reTjcCm/JgP0R0PnMdq7AqJJOJngVSgg3XPoMURSoAUN5Eb9un2mGeE7ECHiWCtpGh4c11CySC5+Hh0LAAKeq369Dh8YYLTQkNR2a+QfDOntBhEwPhGrxIhygeDSp/xIGx2sjXleEPcCrEROqMj9AC5wuzxfgCWqQmhQ8+/riN+H31H6fTsWCPvTaUf50vjIdcUrOO8gHXUy7zTbbjHxeHVpEKVd5z4Mi5V23Qd1nn32i6Slt83Kd9Zc0pyh0pBS02Sxdi5aL5myuJKVNt4tX9R11LrAgp3W9m2lVPda6XJR/EyXI07DYN86IAu0CWgx7wjycWBManFwFLaOj9KFTXeW+pC4nkoqVP5LqMWHr71nzUj+SUpImNQcVUkdaUPCezsGA4TMui50Je4ZBg7caT7LUvgqI5svv6sn1ytM9rGM46Wepy/M56ht1HJBd0Grbsj7se8cy9PJ56St1IkhBGH/jG98If4zHzn6wHmJmWtMNYlaceK0r6lqCoNHtZ9WE59YMGG0g4VWqSSg98bDoqaMmYhI1YHbeeeciSzh/dJiu4GJIJWIjly3pZ2aWSTg3UgsKch/7DfcrfJ7OuVbpcpkW2nTVqhjwmO8/ueGCAw44oDLiVJcOKyYFj9CheFtVA4ZaedS6baCJPvanpU2MaQGXmUoFie6jViAZnKYVVEPXF69Olcg9YYcddlj+8y7PV+jUODlKU6u0kk1thSoaHcboQytJNi2DR0++x9tednnybuKtY92mxWxtWjRzN3r2e1BKdeTDTB7ud8XLdddf0QFyyJnomRViuNUsrh2jE/LITVpPvtZI56JeUzlt5MyFWtHQCpMxUHKZKl5IFLGCMxiSF48DSmSL8rZewc8kPQQnlmoZPaziAZkVJelpRgm7bDV/5zMfTI3NoAl9zJCXgmFIGroZ8ld5tjykmRQYWv0ZGjBp0rB2BoNG0z20ID/TkVEddSjyaOv7Al5cLvJ8jvpGKd11SKtty/r83TuUoZfMS1+psx/hC5lSH2GmfLKoWNUIazxGkc0JG6EL5ylkqzJgdA4uNSstGjB9UR50iPKFL3xhVcu2nBj1MCOiJoaRo8Jz//33LyKi/BLVoUZDvD29N/r7YeIk0taRrh0SYTLRnjKvQewJRERetYAwoPm88J26ZZ/ZzxFa4FJHaAvdrLfeepV5oXXp0MyU0X3Ox+hQgAdHmKnq/BnSJOkVdF8ywiydkjbDu65atSpf29Zbb124jygD4jHXHgqJDlLkqNIQwoNHRuheK2pdnq94HH/4wx/G2iymdo8x0PVguIo0v7A2GVpruqTkShIpCVKrcfrppxd1FQt97XX66nvf+17bNag2LeKoMW0/R/iYOgiNiMetE16uu34MCnUhjfESBpqeWUF6BODCUykmhefMOWkZjGJseHekIyXrNql5pXKaFJ6SqHeq7wNd7EqDFEM/oTuQGB+cg8qhH+rvxbta0CAk7P0pp5xSZCiN8BDnQE2R9W7Cv9Axe2G7bDKfSgqAK1K1SuXPjHgpFK1zz7GfRCYMrwxKUhfD3+r8fhyeVU7EjgyYQD+6Q5dp5rEq5pHHeNW1sEmk8x4pRGq+XLSNsq4T0fWcS12ez1HfKDRSO6bVtmX9YAYydDgvfaW2ASPeJIoE1R9/N1ndOUDPXsFSUl6lXEitu+66uWDlcjQE1I99L8woUBve2hA5y/wQTKTv+lALHy4VijI1zJDMwvC1Fkw6Lzr5X251CK8LKA7nQrJ7SYGwHChrNgXDIf+Vi03OBUFg3ie8P1GbOo8IUO0ZUt+5Su8pZy9rI1xpiuvC+vk83fzAFGcNp6VDjAs72T5GhyJIdG974+kZO38MdC2IVSOKVo1rXRjHPpqi6nwftXIgqYzi8RWvC1E9olLsETn4uk2nbnzQ5fnqzmoYfSZKNjKcjTx7nR7JuRuPflRe6NkbJqKWymfTMENAa067dh6EpBbYKtU1H7zXRCaSrhijRfLe9fA7QJcc69jogpebrN+kiuTrJ1dZNx/BMaD3jnknphnJyDlzpqQj6NSEiLE3khYlRZ5Sk1Emp21qmzHWxuY1oQAVpJWGh0iEhqrhzPcE+aD3xKzzQqt0QV/G6ZfTob1nkFPiZJGCV1IrSMXhzEhR0umIpj6m38SAmREvXWidiCjsm222WdlAwNwIQFaLIQ5Ma+emEZimRfwj9SaJqWUjJUxFGPQ75HujhwPS+EP+HZmqU62M13mEh5g9J04DS29LXZ7PUd+I3sszoNVOZH3HMnRu+srq/cChcqlyEvS1/j3QwpLwpG39RyTFgouLwk4WjPeOlATdicGkSRR63LWAVITZ1uC2/HLUs1zECCNlTYe68SDAtNojBvCmGUIpLCDUBZxaYCkLODA7xei6yxt7KaE80gdE+YjlJ8t76Z70pvNEnpbC39aBeM10XjTzBCLnFwif9DjdNYQ1S4ob1rQWJlz2zEepc/E0oUPS61AAMFhk7ywdkkbGftNG254peeb6/Fkj7ywe2EiKRhvRl1ww493Vyh3GLFFI8YajPNItSv9cutshADB8eXftGbEgJ1evv8vzZd1agKK48/2E4+Vv4SOULvFAibfMpDEV1tfhHSvIxc0FrY4YoCQQCRVPOk4VXbtQEKEYTiITEdx4ZdkH3hOPmAz/Yh105BG6VXS3qitebrp+9lMuD9ZP3rN2BNCQhHfjYTCwbgtPxywcUCInUex4f12Ey+8VDHUciLGjLzLoAv5DedeKInIaZVp3sIxEtqKpTqTs6o5s3FPijEMG69oE2TuMGt6Zy565ZnQNKpEP+Z2j2xMjz5n/I3wA3+rWsXgsZa+RCfATl7tON7Yw6WVNZNMseSmcLYaglquA/aERAukpeq4N740BSAt7bWRzh9dxIibtt1EemUEnad3SkY+0cbIzuGegf+QytIQM1amjJvI4xoMYACjB8CpGPo4B5II2XuyZL3V5Pkd9o5AvOqTVtCtZL09HMnRe+sowKW8Pn+aHRscHSZnhixFcdBXRERIsNbuxHLTtic2gG+OZiBYvsoly6HTEadnLPSLQWE+/349uGpaqFhJWKTHDiUpbOELc+tKPtNPLw6J6yqt0rrB7icUaSdMInyHEh0A13g4JQQYBAwHXZQR9wZPnrlIoRnI4YVzOTAPPhb7cJVJSQ5g1okMKVyn4s7m6du+gTT5P9iHWa54LBg+BnhKuhZaJNLZOlxQpWtrjPUTx1SFhBIRWOlg3NI1XUHt+tAFt6zq6Pl/+Tneh0b9HVMueEftvZk2UdjjkfWRvuFDxTlrlER7UXmpZu93TSJvbkUhpHVok8qK7Dsr52QuQttl6+jKDvPT3dsHLk/IStKS9kPL3Oo0EZc12OJMIAudsZRufGfEGpjZaDn1qZUgrTzh9dJccDXighpNpaFNzhTYl9USgW8FKZMF2mUJ5NdHzEYOMy5p0CTsnxL4D74ZSiPNLFF7kGXcPhqGOBmuPuPGANi1SnhUv5WeLR9q2x9VygHsz9rnScMHMiKjdhWxaWMWJBg9NgWJnveUYKUUzeGLA6y3OuuUiz+eob5Rm7XREq53pbZYmOpCh89BX+qsjL0X82B85NMKd9uIRcElDmHisyIctAgxphHrhjBMdXj366KO7UhRHiu/4Tp2fVwR+J5Y7ntQYWsckVC10VD5hX6+HCFCR4SThRZN7ml8sunMN3odIuDT/HvINtVFFAShMhLdRHiaFy+/r1ILI7Jn8cwm3EokrApf+s5/97Lr7V4sOaWeMh4p3QlAUAc8pdSz2/Mh719GtIgFFAb8Spm1GX8beF2+djshZ4HEidUR+n0ncVkGOeTKs8SLe/o7PNyi3KDNFZyhAuTMpOrWaK2gFAkGt6jckbzh4mHRRYqytKWlTZvrvoAktIhMxcKkV0O3RNXDQ6FaiEnHWqQNd8nIbvIQCG5nkHi478puraJF3pjtQxTn3NP1gGJa1pdXyNUaDZU4S1q0Lgy2434i26AYwFnRvUw1YCg0yInJW8dKwKa2kxVqlzILalci9kE7iQJkBL42cLY5EUrpjDqMYuB+5T00NYqM5MC0aMHlqGA6JomGG9i4hehBJNctpHd1He+9jIO00MoB2qcvz4Rz1jcqsnZZpNe1a1mv67ECGzkNfyWuLqmra8kND6TvppJNCVAIriRxAct/wFohFSMiQFybSguXFg0BnodbLUNRVA2GnQ0l4n6bsxFCLKHmwjsmFxvMoYS48Xni1CAUS6jUWdF1mSIXw2TcEO53LlNdkbCIxlyCRLbx5HDLMgsKAsahDldY7rHOn8aoW7F3+PXvssUf++6pddfRhvZw/nlqV/xm9kFgje0loGzrAK0L7TQSeqYGqs39ROuR8KDRGOOhoGLSGJxtlkH3j94hYEaKNMMPI+bO/CBDSzWByzp9iRZQW5ixMcPZT0SWeGJwDhGihAwQX78W5xd6FUDYCCrqBT2X9REhVu+0o7XR4visT07IW2qYVLOfDBYjxiIJIKoqJbtXmL2QRyjcenYjcSC19IKe4XNhXwuucsSnAjQnsWjJRe1NJB2BdvCuXKWmKJg96JCVHZqF0ycuT8hLvyf/m7CMX8sg5o1hQBIpyIZEKLldkKe8T+fteHTmNbISXoT2J6vDZyGxSNEj3jTgZajlJktWdvqhjgK6hDfYFY1PLXfaE92I/oDfS6Pi3GvdcTxdy8x7QDZ+DgcJnUiNpPLCZFM9jGKK0chasjbsJ7yWtTluSTbPkpbGzhfZIx5Pp5iIf5B7mfEnNKpDjlU6OjgyYgX4PjHrOldQvlED2hHfgfLnDSREzTWP03ozsB/UfOM2Q5/Ao3nKcqMgQ6s4KeGipy/P+nPWNWvpiS7Tan4Gs73csQ2etrzRqytGrugilgwuMVjNntHATdLu9SK/7tANlMU/fmuAZJA0nmtJRw4Z7i4i04V6Gz5cWwTCwERzRiwPGl1QEM0cl+kSMp34Zk09IC5XCo6WnN+X5d2G8TPq+K6dYfzqD8+11vMcDEYiRCyudcA1F/N06LWI8y0BHPFVcBF3zcge8NI087XXI/3XkdK/DPZknb0+cxjojXpr2Dq57vv0Oab/fAg31WqDF5SLP0wXQN5IZ0eos9LZ0BjJ01jKtX4Mf6y2OHFmpLTBdsRopBAxz1OFXk7PYZvrYtITZxHCJevmaeKVqrmHI/ul8y6S628ZYBxXV6eHKZLTbyoqaa2+ylxOHcUv2pFfjuwcF6Ytdnn9XRsxgAgE1aEBzbZ5vl3uctryG3oxoMf8d3eJbT6c3vLyqBV5OO+alaWmx7Iz7iWlJ2zINVb3vsMb31/netOHe1qXbNmTTrHlpUuWwKe10ZcCkHbzDtLJyqcvzWax/loZM0ft3rbelM5Shs9RXmujTIy9uWwmOtO0j9cZ0lLki+f8Wkr0yIiAMqbtEmeGQXUVfmrxnEUFM89n9Cq9Uv+YaUpuGQipIUp16F6xYPWSJ3M6kvEap32AvmrzDNOfTr1jroIU1t3H+bdJjv0SYT7r+WZ1vV3vcZP1t0GZbtJgLY4ovLejIU0MWNuXlpc5Ls/7sfkRR7bfwvU0/pwuZugi8VPdsu/zcSdoopx2/g8vz+eobXdLqrPS2WZ7bvPSVidccDBB6WEtRE3lszFSJhP+ifbJpuaa7spBDG+mwtUiw/afnqeDmBE3Bk4DuNTUIOjAQRYAFBWT9xOFwzAJBjlJ7YPvlA+oCK/jSednhcDiWDlxvWwCkiSoK1d2zyOWmiJM5AGZIWTBuKD6yc1iIwpTk3S4CQu4exXMPechDQpobbUlNMV1vHsqP7sShOpxVDWsachbaeFxgw9HhWPZylEYmse6HNfjSednhcDiWBlxvWxD0ZPPoHBAbSCMdaOjWwH/10Cc928RM652HMVD5nnRao7uIBu3jdthhh3mte6QQDKhuOIM6fytt9ega4YzgcMxXjmpeZtgX3Ytq8KXzssPhcCwhA8b1tgW7fGkvRx/qooE+FqScMRHdRmkWzHhJE9MlTbpGaKh+5bNcfyBmPQ1VdbKoZAT2XUfNnBEcjrlhWMLLVSkCzssOh8OxhAwY19sW0IjhoY6F2Skf/vCHQ19sPWWTFnBf+MIXQgFTZMDlohkvgWDIOZTpsOeee27omsZa119//dBPW6aamh7v6awYQU/+VjNLKkOReoiSacnnjOBwzOFSK+DlKpnivOxwOBxLX9a73rYIRox9GOYYGb40jxa1TcB6sgMOOCAQC8OV7KAxpqPKFFIGVSWzLagKjHDQQQflBL3ffvvVnkdA9Etw6KGHOiM4HHO+1Ep4eYXzssPhcCx7We962xwV/n5Sv9f0ohouAt4lO/744wOxMAU39g4nnHBC+PnKlStnTUxhfTRRENDVjeF4ScVE6Fvc4hZhaq5g00039W4WDsecZY3zssPhcLisd1m/GMZM2z3dZ24pH3vssbFwHYODruB/n3baaeHntEGdsQGTyvedc845OVHTni8pGU5HDiXGmODMM89c5O5vDseaIi+dlx0Oh8Nlvct6R21jqui5BMJ4+tOfHgjmP//5T5hdo4lms802y/71r3+Fn++5557zsIYDcW+88cYjHd7e//7325k64aHb26mnnpr/3lVXXZU94AEP8DCkw7EgDhPnZYfD4XBZ77LeEaxdWiBvu+22jR/+jjDdGWecEQgHYjvyyCOznXfeOTv88MPzdnY0J1hnnXXmYQ3n1rztlEZtzhFHHJG9+MUvDl3SiBBB+IJ///vf2XbbbedWvMOxQLLKednhcDhc1rusd/Q5YImSdAFaKqdpOk9ruKeZoc67whBbbbXVoneAczjWNDgvOxwOh8t6l/WO/w/VdWXAXHDBBU3anc6EGRgqSos+Ut5ixhbtre985zs7EzgcC36xOS87HA6Hy3qX9WuwAXPIIYdkhx12WCvPwQcfnL3iFa8IXSSSxZpj09NrudOd7hRS4Pbaa69st912y5785CfbThfOBA7Hgl9szssOh8Phst5l/ZqHflK/pfO0T2/RmGGJrNnhcDgvOxwOh8t6l/WO1Ug7NlqGSTctoRlcd+l/n1VJ87bTaVLddS32efbvungvh2NNvJy+vVpWOC87HA6Hoy1Z73DCaPx0SUgr7nKXu2SvfvWrw7PDDjvMor6md53rXCfbd999w3e+8pWv9A4XDkcLfOW87HA4HA6HY03ApRtuuOFIW71rXetaXXY46/HZ+jt/85vf+IRXh2N6fNt52eFwOBwOx5qAVXhQmS0j2H333W2b5rRNhYfnxBNPzL+PjheJD0lyOKbF0HnZ4XA4HA7HmoA+ysY+++yTKyH/+Mc/wmDNZLT+ZhrlJ1399xkK1lFHHZV/Fy2n8eAm7rV1OJyXHQ6Hw+FwOGoqJNlaa62VnX766SP9wI8//vhs3XXXjTUSqKrLSZP/1QEN5W8f9ahHhVk2GuTOJz7l1eFwXnY4HA6Hw+FogOBRpf/3YDAYUUquueaa7FOf+lToD7722msXdUbTDQeG+ue3uc1tsl122SU7//zzRz6XAUr777+/t+tzOJyXHQ6Hw+FwOBojFcXj2te+dvaa17wmTGO1uPrqq7Ozzjore9e73hUGH2299dbZE5/4xGzTTTcNHtktttgipKvw98cdd1z2ve99Lzrp9eKLL84233xzV3gcDudlh8PhcDgcjonR00oI6SYrVqzI/va3v2Vt4de//nW29957Zze84Q1d4XE4nJcdDofD4XA4pkaarE5BSVTaCB7aM844I/vnP//ZWNG58sorsxNOOCF4c693vev5lFeHw3nZ4XA4HA6Ho3X0IspJts4662RpmmZ77LFH8OiizHz+85/PvvKVr2RnnnlmdvLJJ2cf/ehHs0MPPTTbaaedso033rhI0Wm7pavD4XBedjgcDofDsYYDhaSfmELeFh5XdhwO52WHw+FwOByOmShAgwmUoDqtWh0Oh/Oyw+FwOBwOx0yUoKLHlRyHw3nZ4XA4HI5lhf8Dl/64mDT0rvMAAAAASUVORK5CYIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZpZGVvUGxheWdyb3VuZC9pbWFnZXMvZnVsbHNjcmVlbl9ub3RpY2VfbWwucG5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADA0MDExMDIAMDAxMTYxMAAwMDAwMDAzMjUxMgAxMTcyMTUyNzQ2MgAwMjEzMTYAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABub2FocmljAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVuZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiVBORw0KGgoAAAANSUhEUgAAA1kAAAAvCAYAAAARkgByAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAANMhJREFUeNrtnQeUJFXVx8uAOUfMGcUcMKc256yYc0JRaTOYMStGWNE1YIMJEV0VQxlQMaFtRnEMa0AdBRkFFBVjffzeN/86t26/qq7qrp5p4N1z6uzsdE/Vq/vuuzlkWYIECRIkSJAgQYLTC2w59Tr21Gvl1Cuf8xqdeg0SShMkSJAgQYIECRIkSHBGNrCKBVzJ0EqQIEGCBAkSJEiQIMEZEohgFX2BMbJGCbUJEiRIkCBBggQJEiQ4I8LKgoysPKE2QYLTD/ic4lGWwtWnZ9yn/T7t0MRG781mPvuMsu5pax2s/z6dywQJllsG5snISpB0rQR1MFjf/Lq84DwRxOkK99OeOUzbsrQ0seizuJnPPiOte1vWXIMxyFJ9RoIEmyV3u8rACSMr66cma5S2Kul3CU7bADMpdtxxx2LPPfcsPvzhDxef+9znine/+93FbW972yTkNwD3F7rQhYrHP/7xxZYtW4oDDjigeNWrXlXc6U53Ks50pjMtwvAJz7zMZS4T9ns0GhUf+MAHipe+9KXhd8nQWg6auPSlL13ssccexdve9rbiHe94R/HsZz+7uPzlL7/o/QnPPsc5zlE88IEPDHTIs1/4whcWV7va1ZaZNjYTZ7MK3oBj1sp1qUtdyitVo8te9rLhs2td61pJ4UqQoGd+0bMMXJSRlXSupFsnOI1b2cXtb3/74qSTToqGrV/zmtckr8oCD+DDHvaw4q9//Wvx5z//ufjyl79crK2tlbj/7ne/W1zpSlfq8yCG/X7qU59a/Pvf/57Y67///e/F9a53vXTwN5kmYMj//Oc/J/aHPdtrr70WZTQE2rjZzW5WHHvssRPP/s9//hPWtYS0sZk4mxXgo8UhhxxSrvOCF7yg1jde/854p512Cp/tuuuuKXUoQYIe+dwCZGCTkbWW9dvCfVqr+FFH/lx3v673SZB06wRe2F/gAhco/vSnPxXbt28vnve85xUPf/jDixe/+MXF73//+5IYrn71qychv4ADeMc73jEYWAcddFDx85//vPjSl75U4L0mmiX45S9/WZznPOfpC/8jvOdAnufFcDgsnv70pxef/exny+d94hOfSAd/E2niGc94RtgH9gRFgMjM17/+9QpzJuq5AGNnhMftL3/5S7G6ulq89a1vLV7xilcU27ZtK/773/+G5/LvVa5ylWWijc3G2awQFLJ3vetd5fowbs36QnrJYx/7WP9Z4r8JEiynDGwysvo6t4OsOfWsaypa2/ullLakWyeYVdhf/OIXL17/+tcX5zrXuSoH62IXu1jxm9/8xisoiRB6OoDg8/DDDw8KIj+f5SxnKQ488MDA+M961rMWP/7xj8uDiNLYk4I4InL20Ic+dIKRkioBsOdZKrrdFJo473nPW5x88skhTc/uzZnPfObigx/8YEkPGEEmlbQvYye/0Y1uFAz8c5/73JXn3+QmNyn+8Y9/hGej+C8RbWw2zuY6/w960IPK9f3whz8srnjFK5brv/Wtbx0E9G9/+9vAD9J5TJCgn7O3IBm4aCNryL3gBUS23//+9xc/+9nPAu8jy+DEE08sfvCDH4Q06bve9a6B/2XN0fuhPh8MBiEt+eijjy7+9re/hX+3bt1a3PnOd15UyULSrZNufZqGLl1M8iYPxvOf//xACE984hPbEELXEPZg/Xd9fa9vvPW5Hv2NvhPwjuJ3y1vessQ3dS9EC3bYYYfiWc96VsmsSSua4llrwr1d17Bur892trMVp5xySlDqehQObdfVF03Ns6+L+ntPL/bv7GerCEciSWc/+9kn9ueSl7xk8b///a+kictd7nJNe1RHo3YNQ/ed1SZesO+++4bn7r777n3QRlu6aHoPfj/uEWfznv8ua89lCOJosSmZKEpEtZXqSG1mtvGR5S4yZN4z3uacd02tmob7eVK15qHxee/bBk/zPGNWXtf2TGwGn94oGbhIIyusmfRhDKA2gNPmmte8Zp2BFO534xvfuPjWt77VeB+ed6tb3apvQ2sjz3uX89BnGmZfunXijUtoYLUpoBxYIiCKQqoQl/GahggKSr/xsNYpdGXIGc/HRS960RAGJbXIW/HrayyfTZG9f6551hbdE4UJpkGTiKzfUHZl/RTK3/CGNwwKmfPijNev8H9S+K5whSvYVL669fBzMJzMd47nX2quCCHr93e4wx0Ck0f5utvd7lYyOoolGxj2Nuu9x3sSWVMR+56NWPCuKKukMPUgHCo4Pec5zxnwCr58lKRm/yp/D41c9apXLa573euGe0Cv2fROUOU9+D61bTQQiOBm2OYdoGno7yIXuUiXLlSDrLl7VYUurn/964d0t7p9O+aYY0qauM51rlO3RxUlAtxxds53vvPVMnzqgcAre2RqgyoXvAC4wQ1uMC9tbLM45awRQbvwhS9c+968wzWucY3i2te+dkHkyn6vB5xV9hk6ucUtbhEcHo7OcstfSQXhftBEhKa2WT7Bull/hBeGs/G6170upA1b+MY3vuFTCDcqzbGLDFmxCirNO+Arzos+jUdXuiyCoxp5EJ4BzlH6UDgjhvXQ0j+4ZR932WWXmNwIz4GeqcGh4UHHdbeiceg1Qttd71vBdbbeLIk14xWP8MNZnrFNcgBeAL/l3E3hdRU94vznP3+gdeR+Sz7fB59eFhnYZ02Wd9YEWo3VyjbB8ccfH/7Ond9wPp7whCcEp04bwNnzgAc8oC9Dq3Lewf8lLnGJcLZjPAeaYJ/gtzU0XuFXnDXosON56EPfWIRunXjjEkKYOn7UUUcVv/71r8NllKaRVcJgKISdP//5zwfFXsDP/O5+97tf8ZOf/CSEjRsYTrlppBS95z3vmWAEENIXvvCFEHq2yHzkIx9ZfP/73y89zfyL9wULHwLQ9x784AeHsLiFb3/728X973//PtqOh/VDtORm/+pXv6o8h3qopz3taRVj6z73uU/F+8O6jzzyyOIe97hHnUIyesQjHhHw8uhHP3oCB3/4wx9CyuBznvOc4rjjjgspg9l6waSA/ajZg7B+FNWPfvSjlX2EwZICYJksh5AaG9sgAKHC7175yleG38Nc5vScD6W405WOPbXRBH6GPnlnxwiG3jC5y13uEjz9//rXvyr7gkL6vve9LyiuNfs/0L6+4AUvCLiwAoMuPyaqEaOdkq4RLt/73vcq68foNbnUTbQ3uve9712eRZRp8zfbETBELg4++OAoozP3DcY951GAAKijB4TWG97whuIXv/hFBW+kKOy3337FzjvvHNJlPv7xj4eGKx5OOOGEQHN42WTUsA+f+tSn5jXAw/rorPS1r32tQhfwic985jMV7yuK0pvf/OaKAQItfOQjH/ENYWbF2VAKF4aaP/+/+93vAl+w5x/DB35m186aOH+2AyPKL2fZnklSLqFbuiDGhCTKJWcZpSLbvLEKrWUIQp96FvihVdhIOfrkJz8Zak6nvEO4D3Wob3nLW0IEwdID+/Ha17428ELqVrmvBXjXO9/5zvD39jko+ZwpyzfYL2pe4dOklvq9Bmg6RBoWhvscuA/vRArWd77znUq6Kt0unbIyaHs/yR7w6gvp4WnwWVKTONszGObhGfAqixfwu88++3hja+D5NKmt1DSpdlNR2a9+9asFsq8hdW1ePr1MMnAR3QUVdQh0LkBnePKTnxzWyRkEv/BK3g2Za/nlG9/4Rs+zi7vf/e4V/oUMIoUSJwlOP5xfyL0f/ehHFZnrOi8OZuX/3IfzDn+18Mc//jGkqz/qUY8K//K5pSn456c//Wlv8IXzD37suUCuwX8Nz29yFMyrb2SL0q0Tb1w+CNY4+bkC43nP9ZIcIpumUgfO0radr0qEoYTZLlkU9a2srIRcYQ8U/fE35A1LOYF4LCECP/3pT4P3XQXtbDoM1BMth8hFiLp6BwNz4r5NgGBDCVLONuvjHTh4VklFyEUOzQhvBkoc70valVXaYG4onBKSMjBbGFkB/+DIMiIPGG4cLAQouENpQrk+9NBDg7fcdljCmHD4HM7CRElxksBEIcbAxiOEYABIh8KA5Z1N62rtXw5+9t9//4l3oUYFpRdDgZ/B5zOf+czYeoMwEV0i7BE2/F/0w/oc06woD+yZFWweYGI3v/nNp9Fezv4KaBVsvr8qXLFH4ALFvAb3eVuDAeeDPXswX6I5MWMKxopH7V73ulcwfO573/sGekK5kRKCQIdmEYAYb3MY4GF9FAA3AfsDrYIL+Ah4hv45/8pjB3hHmLXjTYMOOAv7jKFPoXsToIChCFKPhvKIEYqDyCsJKAFEoFF0carACz/0oQ+F9tCcO2vEmohgm2u4bDKE6KN9pzogKuA8r5W0LRQqOrpJ3sBbaVrCv1YRBLecH3gwoy6s4w18gnfux5kUrSNb4N0YxdCRVeBxaqEI4UiAvq1DgufCY2rWPVWmkMLKM3gfaMTKLPihUSbyNvdjHfydAPygDD3lKU8pdtttt+CYhMZQhHgmvNMYRqM2z0Bx5b3ZC2jb8gvwF6kLDOcLw0QAPZCd4Y1AjHCn7PXBp5dNBvY2jNjx2HBf3kHg0gAnrtvc5jbld+H9NoMGurAKOzqMe99KlB0Hco1+MxP/pw5V513nmjUiZ+x5B6AjFHvklDd8qLdFRt/0pjcNdI+cg075Pd9XDTH8+mUve1mT46EPfSNbhG6deONyQt4gIMdKM1BTBZALkyQ3F+JAicL7CEHZ3F6XajQQwjiE3/zmN8N9YPRWYYZwqTeyXXsAFDgUJKI62igOPuFra42jHEHUtF+2Fi7rhDgEKMIzetcDrlDeZBwSWSJ8yTOe9KQnVYgP4QGB+cgWXl48/AI+j+GKC08BxAURT1OsphhZ4RA+5jGPKb/z3ve+N+Abrx3/WuWSPQTneJ192BdPoRWKMKkZ8TmUN0hCy9TvhBA+iicMAsNcRkzk3YI3DjzRlpv3ga7w+kgIEgFCCR+Px+F3ah5i0lEDbrgHnlT7vqSziNGgxBsBU1EeiDqJScNolAID4xFjwANjoq55RyNrbNfEmYXh1TCZaQbDUJ5uKRso93h3vUFvwXk5Kxe8wCp2eBbnSF0bSGjIM4ixRTSQqA1pskSnrdCgFuCII46oGJ68C/sqA5D7NIw4mIaz8DmOGnlRUVh5b+gTXCL4BfAx9p1CZZs+QgTfNqlBKEIXnEcbkWftShGRZ9AZreNs8XWnvcgQ3tnyavg0jjCUpVgKEp7WGP8SPfA3RF6dwyUYEjxHCgV1qjbdyyrX4B3eg+AGtzgbLO1jRMCXpHyx75YX8jPrsVEAZJW5RxtemCMr4XNf+cpXSs8/jjzVNALQWctzFKIYe++9d0mjRI3qziwOA5x54MyMW5i27hwZhswnSqCoJU7FV7/61eWaUTY9j8XIk3wys9wCT0VJs8oZRsKVr3zliXTpOfj0ssnARRhZJZ+yhqCLVp687rCrlDPUXWQwWGd2JK2sch/SyQTs54y6QeD/OPN0XpF1OMm0F+hcRM5o/GWNBHQ91ggPgkdY4wL9gbP2sY99bCLNHT0XeSvAMIisfdCDvjHUfXrSrRNvXGA0a5BNFqR1FbJNApK84ECQChH7UCJIQ5kC2foeQHgxdvAJY8L4LYONXRCJBRhj7HtEPCygZGU1BarWw+LCx62taohNkbJYCg9RBgsMkYuth0NIZAYA9yYffORTPlBsUUo87jsYWYEBsl6EBofMpyFykUpgvXukYsWegwLE2q03nxa3s+ATRiTB6AyK4nGPe9yEsIY2AaNsHk8EE/pT1NPmNiuMjfBXKB2FG3z69DEEc8SDFS4Eek3nxjL1BLzCxCJDAwMjEDjcDzoYWbmlC9XgkR4buV+TwRDoAWMFr1VEISrT3GCSKBA8Q4aKm9Vxkv0bBKxVmi0j7xhdyRE0KDKsEQUqdoassQLUnRGcIS1SaafiDKEnr17sWUSbLOAljK0H3FuDDLqxBpa9cLAIMISzfptaLFqGHI8Bqgge7wwvt/UvKBrQic9kwGi1eKBuAOEPj4qkfgePMQoJZ1ERcADnl/2eDBBr8Lk5RyE9CqWHNaBsiPYZU+CfC41Y55pTqAbTeCDr45xFag1Khx58rKXHNicdTLj0aVJ1l6snHE1bMzyQ/Y7VbRLtUaqxVbzg06wLfSFSr1HWkOid5Tg152J1Xj69ZDJwoUaW5WOcO3h8JK14nE1pyU7Eswan0chMw9WFX+XwBWW3oA96OsHg4CzLWXDYYYeV68RY0XdxYvuSjkj9X3mhuwoe8pCHTGTN9KRvjHvSrceJN/5qIdGsSqFcNt+cgiYBWSruWJOxvH8ULjZXaTh4FQQuNSd4UyAChSIjHtmxPUSykgFSx+o8J1/84hfL75EPnlWLR8cxBQhG3fHwBw8h6QkAIWf3DiWjsl4VlDuX7jWOKU+mPmtC6cOgAG86uKrPcUrRuMHICsKJ0D3g6nwql42wueedrNQtInh48hCwUhQh9I5to0d2Tbyfy98uDzzpAjYdwac/4E2CBn2DAy7ND2Od+h3pBD4qo65yLv2u3C8YqN7V0c52K4hM558Jj7GYjfPSjzoaWRVhxjBqvDyR+zUZDIEemGlVE3EKe4shwVrlfbIezdvd7nYTXmqaYIAjPL9KfwCnGF6zGODUXETOUOWsWaXK7nGMT1gni8sTH7TFmaLsEUO6XBO1SQLbpMaffyLuAvLN69YO7YmncE6MsB6fFmQIXl+A2S/eu5q5hiRWIHucUL8LUHPn/xblAR5gaU2RZeQISojlIXIuyAvrI7I4fqyyIocPQPqKf749s/yt4UX5NB6IclhnjEN/AheRqtuXnCYsAviao6mRyZYY1UQypkbKkBN1UW0cqLE1oyugGEdSzSrnlCwVvidA5vTFp5dMBi6iJmukPXruc58bbUiBwn7Pe94z1qSE68R1fOaxGlXn7Bo21QN2pKsJ/i/+6Jp4hYvaIt7D/o7MFxz4MqSssWLfgShIbH3wiDe96U0hWmejqcbIH/elb/StWyfeeOteo1klEdMVBIudHFmQjFIaydsfziMgCfEBhPJjebwwPOvBIe/e1iXY70MA1BJFlBPrPS3fz+bvm6iRVSzGVlkEXv7ylzcqpeSORxhGG2Ulhzjw0kcO/dCuh9xtgTUQfG0BhloktSKPFViCNyc0PIHmDUZWiEiqzsZ5cbavPyesHSO1BpeBtvBaWAUThiMghasDoYe8ZjU9cYZCoVxc5YDjqeD70DiM1Apq8qlJW4kJbYqYBXpvKeZ2tgmMiPvWCIWxTRNzrb3XWBuMiZSvSHe5ErdS8t275jMYWeW5hW5QvE0TjLyFwRDogVQO9tOloP2Ff/FK8bkXJGL0fGa8RwEHpAGLIdLZSRFKcsI7powEBouSjaFXUwQ/lOfZ1nfU5KsHXGAAC5wnvI1hukb0hfMfodXK+YfvtTn/GKq2M2DT2tW+t6M3cClkCMYVciJSAD3hXFPKiz9nON2gVZQFIpzmHn+HL+AJtsq4/kY1edCt/cxGIPDs2s+IFvoMBJ6BQyPiOV3R5zaqiuJRU7tpo4bhHKIQOo/5mjXapTg6ml2tiTzmlq6oKZqSXir8b8/qu7ZOrJmz5iLolTWLryvSwIVhEtEjVmKyn3ULbHv0efj0MsrABRhZZbkBMpJIXFMtK7yM84+sjXTjC/tpU75M5HLcITreNTIe+L8MbZ/FwPnHWHR1d+FSujopbvb3ZFDVGM7hLKNDErUh1ZCzCw8QUJZiv9+HvtGnbp14Y2ve2F44ElbUS8Ugkm86mEVAgizSdWCoTtEJBEVNBKkBnkC0eWy6bbPJBmjT8EhhDRNudK04h7p/jZGV+8NomVyNkVUyYHvYHAFNZYiynPHUNym+NtxslCzPlMZEbgR47WuU0ArjjyjTrYwsFOkpdTLTcBmYi8tTDl4QAQymQ3Qwp4hT4NIBVqzHCiOCw4QRAz26OUBBCMAkYykTSiHAYyMaRtmLKXG201uMzmwDBnLFhVuirACNTZoUZTEvIh09GFlBkCLUAYOTVkYWeeSAExYB99AKAscxt0I58gLoTb9HEPk0DFvg3tHTlBP5w6BpwGk4G/CFGiNrAlfW8+UESyucYZBEUiBnPv/UKdUYWRNrR6mrSRcZzWJgbZQMEd/xgjyr6RqIk4Jz7lMG9f5EjGMp2ijOsblnajwED7Hp3TTXEGDYZaYdPwqcSwVfUx1CTSR3xTv7MFpj/EhRbXgfER/oC56G4sHPsUv0CA71O/hupL0/OMzBvVJ22RNShYhuQW+64IGxdPes2rG1XDMKOMouhfB40Yk4kjrGz7FLkVci2vwfnobSyF7hUSfqHWkrPczMmAob1VRn1nn49DLKwGwxLdzLe4Nj9BU7lqKpsQLOXF/DZ9MnjRNxkU0GcqJS0Av1TZ5GcZZR755FWrcrCuWjXC95yUtqjSzqtMAP5yIz3S8FpKX1rW/0qVsn3tiaN7YLoaIc6cDAQKmXIELEhliPA17zlqHrWgEpBebtb3/7hNWu4kbX7vIkr2TI24CFrQJMvLK2HSqeKquwaWNaGFmDDkbWBAOFyLowRIRFpFZg0FLJymPFwxEjaxzz6pCbClAUOYuRRV4t4OYDtcYljIID5sLaYb9njFjkFBoLTNF1pUNStl5kTAtTcoH9PAvSRiLeppAGA/OSp8PW6qmuC4i0jK6b7xOackS8MWs6Cy7CMPJ0oQgnxbo9GFkVRT0yBb7RYFDqrPU069zhfIgM692idAIVVCsHG08VzN8XotMeWEAnpi5njbQywHVmmkitbGlkBVzJsFRxclcjS/WYOIb6OP8tjaywdvimgPTojpHBTZMhitY3GKYTDiWl19iaAUW4XG1uSOFEPjn6UsSmouBYp5rtAmoVCeiNlNCIgA60r45lLuUopKLRadOODPEKIFFnO4JkXtBoApeCGXBIRLkNkNaEF9hFdoZS0Ek5s+ehT0ARJdLiZH/pZLVlAH6cyyx8ehllYLa4YcQDH21Ad8DYwLniuzN7urLlELZsw0Sy8gVGsnIMegCnuFfoibjTxMG+H7RKqp+6S9J0qo2RRcQIXdSPMUB3kI5q5Upf+kafunXija1541QaDMo23XBUkOm7oxAdotV1TVHboKuApO6lRkAGQ4nIVCT9IzAm78GGcGBQ5OeTNkCPe9an3vcQtG8z2sLICoK5pZE1FKEI3EGdyhClMJj6qZUYLtsqWXgHI0ZWVHBwqF30oJORRZqFPzQRmqjFJVGJSJpkJWfbhcOn4tN6ixDmWaT7zpTrONEoRpg/+GpS4LsW4uUQUGfk6hVGNSkz4RxEzlYb3Aa6UIfLPo0sNVoxz25lMMhhYPEihoinFw90JIIU9ltNDFQUjrEca9yAYFd+NykLXWgDr1mkxm0wh5GV28hxzR404kw1aUS0+jj/HYysHIEqQEmaURnbcBmi1tAtmwLkPl1L9Cknk8F9xesbUXoGisDE6nXrFAm8rETP62hfxikea78ORTojtFiOIAEwIuF9RBPBE40Y+Ft+jl1KcUdWYiAT1SHKzJmqaw5BJAiPdFulhXsb72+4B2lBAhwqOE1QslFoWTNng59jF5EGgBRi/o+spc26Pif6L0MQT7qbGRnwace8GMfmIvn0hsvABRtZ3OP4rKZGGKMLgxM8+3EdtuGH1cOMjjZuY9zNWJOV6yxRl+UNB2ST9pXIKmtV9BvlOmaQ1xlZRH/gh5G6tPKsI9v0WV/6Rp+6deKNrXnj1DMV2hlCRCg5NdPJy45jekAL73GtgFQY3Ck6uRDuUkBKC1kF64BCsCh1MHyeY7uoUHyp1AKXBtPWyMq7RLJU8Dcl8hDFEykObZTpWYysmhqRkmmpJsN4mDoZWXjfIod60BaXtE+NHLDwvsq3xXjuImA4EDUNS0pGAM5hhHhcuRD8ttOMFFXTTKVcF94kpefZqAxCXsAcoxbCO9AOaSICU4+whmI6RSEN6yE1L3Iu50oXJBXEvX8rg0FeLBcpWlHKQySkX95TufIynHCcuFrLMkddyhYRki60wR63odcukSzbWhh67mpk6Xw1GAwLi2QpLVStcGdUxjZchojODB5WpimdtrOslBn+dWmxquUN+06UO1ajg3dZ6U624UydIoFMc502K7QhoU5rZvedFatk2dbV4EJr8HXKXCgSTXOMRI/ei8wZUeQRp2Xsb/HQ0zadiDX8XBdykJQqG9FAxliPvQw0FJ/Ymps6BMtQl7JO0X+s+5ga5DAXyyvTtp7IyL2Z+fQyysAFGVltHJQTRhfvZmc66jM7/sa1y46lYOVknsTq6TqkNufiG05HC/KJs6d95dwQqYFWbMt6H+mqM7IwDDgfsfQ1RoIo2t+3vtGnbp14Yyfe2Gjo57RUjhFQ5jpR2VQ8Ey7LuwpIUghgtM6bMFZ9CV14YsQJQxVozgVekzqGDRI0BG2BRlbuvWNd60SURxsxCGZSsjiINV1cJtatYnpTyNu58QUESQi1ScGvwyXF6y960Yv83wZa0LyQrtEKmI8OQiRykiPoKaDGqwMeYRYoozYlA0+WSydZscWm3J/mCBYXlukpnYRaN1ckPvRpTHYuk2kOEHCLJ61h8GLYQ7U2doXbEwq1NbIaFOpwTw3FNl3EWhkMKNucbVcLt1rD5HOLB0WnZFjhiarjBerGiQDsqnxQvOxqsmZNFwxKBx4ugVOWWuEMGgFnDQ6RRRhZg8w17XBFzF1qsjZFhlAfhCHeNpJlG4eI3ymLwDm4xlKGahxflZo9m3pUp0hw3iL1FiXtQ5M1/KrSRcsa8TZi79ZZKhJGQToxc8Xfasfu6n3CpW6XkcYprVu3q022jdIo0h3pkFmu2aTN2jWfZOlHOEexdfMpw4XSqWiWqc0O7020WQ0alM44L59eNhm4ICMrGJtqJx6Zk7WSuYYzPuJCiqB+j6Fj06xrGhGV2UIWfy5K1Hp+mOrnHJ8uO7y6uvhwkSJox2JY/a7OyKK2yd2rTFcVP6POq299o0/dOvHGTryxUV7m8ma63MuJ5g5imoApEu0sILk4VG42y5oUCdsm0wppOtYAIEAHUl4kVzR6nFd+bFvRno2sMffWezIzwDD1Vt0FRWgu1Wg8q5KVme4oeMBMUenYMi2scpgeBkc2W3fBwJxoGY/Act3kBm1wiffBCckVCemamWCtBAweFIX5XWec0vg29UZlIb3aWKtdsU0RwMOKJ457ujSUgNsY0yO6CriJ6gPtgY26IVC9QgBu8N420YX1FBrFdewVapQagWuSUaELKel4kLoaDPyL99gxoDWl2xDpMMJ0rLXZbn4ygKjpIboV4wUaLkor3K60gUMEoWnqgsYzGlkTDhboJuvYXZB/MfBddGe8YCMr9159F0HoVOuwGTIE5b1liuMYx5OMeFLNMjPnkPu7+oJV1Tq6Nr/lPDk6d8VSeOoUCc5oZMbgMHMNDpwcW/V1UFYZsXzZza06hpRaHBDOQzyI1eKZqHuhNDDNz3HnS57vVdFt06X0TKv82A6FboRCkNnw1oiHeJC5rrmq04SnuVrCcB9aiQtMW/YTOdeKpFmjaA4+vbQysKfGF5VxLp4e4R+uwZhopGwyZVtx27NHGpaNeEba35f8nrRmO6TZdVtsHclC9kDTrunEmrKRXEpape25wDp26ows5Bw1Xt4osHLODpruS9/oU7dOvLETbzzm1OvYbLKr+f8TnvI4I0P2SiFli+w4GC3yERsFpIZE+tx9zT5xeaCBySn857ujkBboGO0p8nLJ2229JD0aWUNvzDmPVJvDP7J5t65hwnBWI0vzDSIDYUvmp24vLurQxcgay3tCzrhjKnkbXBLZgFj9bA0K5gUuLD1qg0/oRWF+57Uqu9PZoZE0vgA028EzPbw7RJWg/QjDGyqCFmN6GDSxQlsOu52d4rwmgYmovapr2T2076r6FC8ADOPb7lNaI0r1itJ58KxGlKA2BkNYs4Y0uhl0paLi0uICLkhf9J27iOChEPn0IZQPKUpuqGfehjZUb+bSOYYdjaxw9vkeufVq6FBTKzAVZxgnkTklwwUZWUOlzKpbXKR1cBfYFBlCxAOZ4Dy8PtVoaNNfAYql7T5BeziljNEdaBL6YG+d4hycVqr5hQ6tYl6nSIiHRuYgVmjf1X0cj9zScHk/h03dRyOdzU5RqrFzUpRznxh4KtlocZqtF8Krm5pNwVEajlv/alZt4T6W/BUu7BwfW7/oeGJZtM+zNUNv/f6r1nEG7agtOIo6jkK/R+o6xv7YjmB2xpPt+jYHn15GGbiIFu6VrodqRiAaQxkl4sM7QLPodURnwKftIugHNdtOsUrPgj+zv9T/4fRkz6yB5VKyO9Vk8f2tW7eGc22asqypBhh+SI2gufe/+ZemC7E67zojCwMqYnSXTTT8QOI+9Y0+devEG9vzxqZ6wWDdE/Fw1n1FINsBl66uos4zstYkIMnbhyl5RisFipC05hhAcHaIoCcSDd+1RYMccCk/ztvZl5EV8EKURLM78Pw7Rtnm8Jd5ziiMbJybQj3sqGSN5AURI4RY8ChoBhSHT0yD/XGdUkYdjKwy3Mx3YFCuff1wGi5hump/C+4QaISApfyRJuFmRA3a4lOKFe+PIeJTVmibK2GOUAb3+r9letTcIATxKtUMi83rwvdSoKFpmyeN4KeWQACtuqHJZRdEBDcM1+3T0L4rkRA1eokV6OIJJIWBc267vNnhm+BFNQ/gpgbvTQbDWPWQ3MfVQgYGxTOJZmg/8JZZ3kIagp6rolbSdFRvCQ5IJ6xJORq1pQ0UGyIbLt1l2NLIKu+j1rrg1s1XmYgaNeGMswn/YGadmysz7NnIGkoYKuUSPDiDeNTVyNoMGaIoIvzdDaId2uciC9gf7z22SiOKumsSFPaBVBV4EDgFZ+DJRi75OXNtm2OKBHwFJR4coTRB98gO0isbUqYq3bO8HFPUWBkLtkMqiha/g2f5eTwoVWpjHkuHsW2Tbbo5KXXIOpxzbmjvxOBfnIXgFH7kWqOXLf5RBE2aelCGUJrAuatvCg4fOVZc+nRIgyKVSEoz+6mopR08jUIoWuId/HvPyKdHSygDJ4ysecHjyjYBaQvwSk/fnFsi0m2BCJGtvc9maNCjiKg/F6JNnPbWOEAPtd1RcXxOM7JoqCI5Kn0Oni3HLzLF1lf1qW/0qVsn3tiONzY4NUYl4RGiZwNcGLYUUgrrorhjzNjZGE2XJU4jINdEWGyg8yhXrH2Ype1kFJlFUU5y53sUx6FYiEFhobv++n0YWWMJHRUlcjCdEtypcFypjwgZlC2lrdnntVSyBlZoWC8Se8EBk/HFv2beR23B7hQjq3weDRp4nstFHjThEkahYboIMNuNiP+7QaNtcTq0qYHQAnRGMwYNwVXDD1JGCK2DGzxZnulh4PC3MEeEZxOtK6/aMz3eUUYQ+4tya6efR8LSJd7ENMERjMgqJfY7/J5iYHmQUCbZf4Q1SgmeQBp9YGBzHwFKEGfHGl8YMc7Qb2swlEY3RhS04POhEXCqq8DYkiNESpedHm9pnj1E8FjAUOqofJTrR0nEEIQX0ILZ43SKkTViTyU04I2RifSDrjjDE8w+cP5dq+BxT0ZWuA8RJEW6UTqpp5rRM1xRXjZDhqBYc55Qsp3iH55LFF+tolHy3PiAsa0PYV1u7UFZsjzUAryUSEoLRWJNzTrsu1hgH/xwVOob1VkL+netl1d1nsTPOcfsASk08CvOPwYDe4JRS5SR6IiiAjiVNB8RJxOjR0jVlSII3jRHShf45PzyGV5votZEFKEhzjwGA6nvPJN1wX+8vOY9de6hd6IZqpcD3zQf4O9pjIASi+Fuoya+sQr3g7ZIAYbP2ro/1Vmx76ql4Hy51vLjOfn0ssnARRpZZSYMe2/5d9OcLBT+SFphqb8RXZrWsRKD2aVzduVVA+u4xEjw90PvwpEAPeH0JkNKDprYzKg6IwuDAN4rGau6Ip1ll7G01qO+0atunXhje97YVAM5kGeTlBEUNcOAthO6bZp90AWMgCwPGJY6dUx2nhEESg6s7erCz0RfnMeyVFAwcOSZtbnTMSZfY2StufzjlQYj6yQYo55HKoFTSmc+/HjbUHKxpo13ebVByfqnqW2ZMDLArzqxWeB31qho6uozxciqPA8hA9Eb4200xWANxIzC7A8pTGQOnJZrQonGmILZQUccTgkH/s9nLuWoNLJmBc/08PxYL48A5mvavccGd5YFrew/jMjQxch+hzC4FBx/DvBEyROEoYkn154v1RMSFY4M8+xiMJTrQVkC524Se/DWafihgAiOT9+Rp5N0Vqs4QV+kEThFKe961nBq4AGDYarYV/Q6xcjKoSnOKLQUMVKGMaWnDc4wllH0EOzG0VLOJoFeuEzr6Qkji6J8fc81Ginvowih0mOzjsMVYzjdLBmC0UgqGcLY1F9uV4oZghae4wzySs1Ntj5slu+6urpgQKtTregPoyA2dJfUOOHeDYwOP7M3OAItQIM+JZZ3svVyGCKRfSrTJm1hPoqPTZFGWbPRQIAaDOuwwXiyfAOHRt2sP+gSpdk7PSy/oYbIzwjK1mficXFm7HngDNq0dnCnkQ5yHIFzX19reYp1FLEG66VmvQDd+tw8qoqzakY+vWwycJFGVm7fFZlD+hwGLPsF3+LdkSUYjtCtl62xs5etzz+k7gaFGPmMfMLgIVJJal3k/M7Cq3JFKME3NOOcbMHBpRol2xURRdvpn43DiKFVNZAS4Fh081ADf+hR3+hTt068sQNvnNZoJlfqjgvFbm+bp4sVrBAbB4+ufyhOgkg7y8pBjTFPDBcENBsZYYwTXqRsfW4WhhWFr37AbF13JGoT6EbCmp3iFjz//J6aA3/ICRtDwJG1bZvh8A/tQXBWcu0+uHe0DPgoKeeEgPEcg0eEkVEo2zCsUcO+j2Lrd1740ZR7VAo9GczKQe6JoVaYOLhAuBPypTiT9DiXmtW5i1aLK/fhd7w4pG/SrrXFBPHKOzjFZRT7DoY6Ap5zQBQ38oyyngF8w2igDV8TULOeNvRQrodzY5h3iVc8y+wzdAlzNTUYEwqZ6JzvQ8sRh8bMBjjPdWdt1OIdR6Jzzy9q6LQTzliTSz3c3vIMTnvWdvEXzoFPv5jxjPUmQ7jwLOPJ5+KcQu/UuSoq55r4VOjeKXPbRTfw9yl0vcUauZmba2Pz/DGOfa2DTYetuVZtBEBOQZS7mFzDa0uDgLrapZhzC7zDz0ihifF3HCsoXZy3uhbp0DMKIB5rP5tu/VlD/zfghPsSMaJuCEXZK6KxFE7ROfxB82piDhZwgWw2XU5r1wT/QiZD2379OI6gJ3mnmxxaM/LpZZKBox7l11R+NcM1rJNvM96js0MoM4OU6+Q+vIfzhEId4fOtL3g59+GcuEi63mPU8/70pVsn3tiON47byOdBAyFP3ViYgtJmrBdc3czomocn2gi7ccMB27Kggzr074lnyhqCCs8j1DmAWPzWg44XgnQBlFjle8o6pqWoUtFmTLlpeo/o7+mw5LrhjOx+Qlh4Mmxea4OwmsqUWii2wzaG8Az7PY/yN5yBeQ96ZHqDDmsYdnyHwQzvudLBOBzMQQ/DOXAx7PhOwx7pYtDiHQcd1zEPzqbx4UGHZw0XdMbmliG6cNIBDDO1vyelF8A50pKehl1lB/IJpQMv60ZfpNkRbaaGQyk4eJgpwo44IAY9KKneKbhIpXjYkSdvyzZHUe+D3yyDDOxTfjXR3sA7EeeQKfmc9+iL97elgS1zfl5r4Pe0P33o1ok3tuONrXXkgSniHJkP7e/9VbZzVEjfhgk14AxvUCSa5e/f9pmjhoM6avH9U9gY8kPpEkIbb/JB8Rwxp0ZGFV5TutiQZ07IXsJf+ZqEKPEG8L5qI0l43OQd53MoK9P2YQ2vHWFLV/MiIytnHaQykf6Fh0GdFt2chO1Z++YcoxZ7ULef0+7Rdu+yHnCat6SrNn/T1/3avGcdXWQzPKPPtbRZT1tcjGqMhnnWOitOp71jm/2YB2fT9qzNGcznvM8ieFfdFdJq1dTEp2OoC5lLsxrNibOB0npIs1VaGOmhm3UhW0gXxcEXqT+pU7annac25y32nVn4TD4jjc4rE5ruN8/ZmYXfLIMMnFd+zbuX8+BtEbx+Ht4/65npS87Nuj/z6NaJN3bjjQuTq8H7QKQKJJA/Sz4t+aFEg8jPpbicEJzvY59172DVBwRLnmgUNUm+gDYz7acBH/pk4DFAjqf/O2oRWkx974s5hCgh+Hb1M+UgQNpku3ayZX9/E1FcWwDzSpAgQYKZZAn1FyoAl5eSlD+NFaB5TY8yhL8PTTOoN3Btspft6sODnyBBggSJN57WBCOpc6TZsRG2iIxIC8XsmsrshgxuhpF1rIzCSEFpmXeqAr6sJi3SDQ2uDFl0Q15HiyJ+lBBay9YRHgatL9TV9PBYM5Bs/nShBAkSJJiLr6mdtXgpDU7UAAGe7Oqu5hWsuYaQ21bfS3ipbfOivPoJEiRIkHjjshpZ6tzDsDMKWDFGKISlyJTGAuo+4jqTbAYiVlgf3a8okKW7DGmBtvuZuoo5I4tpzuXQNGdkhc9oH6z6LFOwmi8K58wnsMNiKRLce++9Q+tuvMG8IwWC/KxLBYPUofF/WlJS1JsMrQQJEmwyIA9CMw7bstuCHQLaE2/NmR2j7nbwQtdmetmvZGglSJBgIbp94o3LAViNoTuXWkKSNoeBRZchIilq00prxqzajWNTCId1YfSxLoQ2DSvsUNMaIyuk4dUYWeEzDYajLs10kFmYkYV3V3ULzAygJTYduWhbiwHJjBHSIqnH0kUXOYD2unTVUS1ZZKZHggQJEmw4f87WW8HT+IL6LHg1MiWSrtIHn8rh2xomb9sQL+tFXUS2udkgCRIkOAPw4sQblwMGmZkNUTdMjlkErnXiZiEgzLcB7Iwo6sjovDfFyMqbjCymwAMQZdavtzWqiFCjwAyAzEwXZ8Cuno3xSLt2q5gwt8jXjSnV07QoTYI7QYIEmypPssV1G7UArwt81M9KWVZgnQuWLwkSJEiQeOMSwTAzg78YcCmg8QXKPn3vs+UI5eWkMALkm2o9dNxjeOGMRlZoiU3UCGB69EYYWUwiV5tjtcq33RsPPfRQ34QjDGEDmDuSuZbJZqp8EtwJEiTYTEMr3wADq2LUkUbO0Mn9998/yKxlvbZu3ZqMrAQJEmyYwyvxxiUztLL1blBEdmpyOIebuM4gvJnoTOv2bH16PQYWNU4zGllhUCF1TrR/N8bKQhtf7LXXXqGdZbaerkkU8YgjjggduUi3od0lqTYavkjNFo1IaFtvh5BijAFm+GkS3AkSJFgGIT/KFl/QPMxOO3UG0wZRJ0iQIEHijadT3thmQ4abvMZgoNCAg8HJpNzxL80qmAY9i5GFQUn9EwYW6XjZ4iN2wcOAEUukkCYj/F/1VRheRBMPOOCAUHNGA4xDDjkkpDFSwGjTJKkdY8Ay9zET7ZORlSBBgjOaQddlqGoq7k6QIEHijYk3bsqGjLLFD5Kby0DhIuK03377hct2PaQ2abfddgsNJJxVPCLtkc923XXX8jN+x4DMnXbaaSMNykD0e+65Z4jCqR09Bte+++5b7LHHHsUOO+xQpnDyjgxw23nnnStrJBoGEGrNUgpKggQJkkIRk1/Ldi2LPE2QIEHijYk3JqjAcEareNDh+8MNIPiQ9se8LKJo1GeZ1vFTLwxFOkKecMIJvmZulEgkQYIECRIkSJAgQYIEfRlaQ2exe6vYfzbMNi8lsmx3vM8++4SUR7okUmvGbLLY+/Fdol7M0gJIFdxll11SCkqCBAkSJEiQIEGCBAl6gSZjapb7zHOPWZ9bGkekPB5++OHlrK6jjz46dE08+OCDi8MOOyzUap188snhcyJYBx54YGiGkS1XzVyCBAkSJEiQIEGCBAkSbCoMnZEU6q5ot0m0CsOKrocMXj7yyCOLgw46qNh9992LHXfccRmbkiRIkCBBggQJEiRIkCDBUsAgm7/7SzKwEiRIkCBBggQJEiRIkCBibI1OvcYtDatxljqxJEiQIEGCBAkSJEiQIEEngyu1uEyQIEGCBAkSJEiQYIPh/wAQEDjWAKb/7wAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVmlkZW9QbGF5Z3JvdW5kL2ltYWdlcy9mdWxsc2NyZWVuX25vdGljZV9mci5wbmcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDQwMTEwMgAwMDExNjEwADAwMDAwMDE3NjQ0ADExNzIxNTI3NDYyADAyMTMyNgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG5vYWhyaWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZW5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJUE5HDQoaCgAAAA1JSERSAAADRwAAAC0IBgAAAGU9ECIAAAAEZ0FNQQAAsY8L/GEFAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAfIklEQVR42u1dB5AURRcec04oiqiYU2HELIZFDBgKLRRQTGVOqCtmxYiIJYKgqICoK5izgjoCKpiARUuMZ0BU5AxwCibMzu/Xxcz/pndCz0z37O7d+6qmTrm5nu5+od/rfu+1ZTEYjGph2H/Pt/89Df899qKn9N9T4KlhMBgMBoPBYDAYLQVP/vc4EQ87SAwGg8FgMBgMBqPZA46Ps8MOOzgUI0aMoM5RiaeJwWAwGAwGg8FgNHfA8XFGjhzpOUZvvPGGs/TSS7NzxGAwGAwGg8FgMFoUyiuttJLz888/C8fo66+/dtZee20Oq2MwGAwGg8FgMBgtCnB6nNNOO004Rn/88Yez2267yY5RkaeJwWAwGAwGg8FgNHeU4AC99dZbwjk69dRT2TFiMBgMBoPBqEMElR3m0sMMRjJ5abTCK9TJ75qWMbmPLMuMliyjzP88L0yTljPGep1TvgKkxojhWFx6mMHQJS9pnkJOfWRZZrRkGS1EGCNRRkhh0e/r2VhhvcA0aQljrNc55StAagxYGJyXX37ZV3oY/29xdS0GI1BedMGQjFX0kWWZ0ZJlNIT/PWNk5513jjJCiorvNZd5YTBN6nmM9Tin0CV8BUiN4cv111/f+ffff31Ewf/j3xcRpczTxGAINBhyjmyTfTT0HQajLmQ0gP+FMYLKkkOHDnX++eefMCNE9b3mMi8Mpkm9j7Ee5xS6hK8AqTVv9Yorrgg03Pr27ctHegyGH3YdOEc2G0EMltFI/hfGyFdffRUnI6rvNZd5YTBN6n2M9TinfAVILTLtJ5984jHRvffe6/33xx9/zMqTwVBXvFmeEi+4DIYWlBTkTFVGmpMssV5gmrSEMarIfy0BTg9fAVJrBNl99909hm1qanJWWGEF8dOFRCT2XBm8mJlxjgo59ZGNIEaLWNti5IydI9YLTJPmOUYV+a+5zRy+AqTGCIKELxe33nqrIAZ+uhg+fLiq1x1WOrFg/b/KT5ISxnm1FyVgpYD205aIDGtPpa+2hr9TeUoZlUfc95P0PS19otorpuQdVUXfZGjOk5baj+pjWcMcmKR3QWP/qvXdtPJbT3KQhk+j+qp73Ci28Nt/z6+L5HLmonG7f9ekKMcq74X1VTcfZKVbWiM1yzjylk0dcqx7vFF9KqegSR700Kknq8F3YfJf7fUnCA0RzlxZ4/qTdD1Oqm/q0R4IRHmZZZZx5s+f7zHsjjvuKAiCny5++OEHB+9Z0YUZspQ3tq3g8qp5tVdIuPMQ9kR590XF7xdiBCVqnDpLTKdR/g0ZaKSTPoUMc2HSwEi7A9aQYj6znG7ZCvNgkt46+mflpKeyzItpPWVaDrLwg/w8Wa1xq8qI4nuFHPggC92S6q6s48hLNl2n1864Tuser2qfVGmSFz1068m8+W6YIb2og89N81tDjutxoc7tgfBjxx49enjM+sEHH/g++uGHH3q/6969e5wCDi2duN9++znPPvusSDBDLCUSWx999FHngAMOiFJaubUXchpWiloQZ8yY4f37Mccco7SQb7vttt7f/PTTT87yyy8vf99zoLbffntxYvfRRx85v/32m/PXX385X375pfPggw86+++/f9g4M5eYttLF5Yp+L7nkkoKfHnjgAZHD9ssvvzh///23s2DBAuedd95x7rzzTueggw5yFl98caW+Z6BPKay9TTbZxBk3bpyzcOFC8YCO1113XdJx5+UcefxQKBQEP0BGf/31V/ETJ75dunRxFltssaD5DO1jp06dBB+Bn37//XchR6+++qpz9tlnOyuvvLKKESH6hfDbE044wXn44YcFnyKRFJW8wK+zZ892nnvuOeess84SVb6S0DulfKvC5Hc9enXs2NEplUrOzJkzRVt//vmn89lnn4l/23PPPfPSU6bloGLcBx54oPPII484c+bMEWPGz8cff1zMR4wR+Fse4w7qg4Fy/Fn1uGWQbkl0l45xaJFNlDe+//77nc8//1x8H3I1ZswYp3379hXGUteuXZ3nn3/eJ8cPPfSQs+uuu8b1UYf8BraH1AX87axZs0R7c+fOdV566SWxXiZwjvKkh249mTfffZtGP8A26dmzpzN27Fjnm2++Ed+DHYNwt6uuuspp3bq1zlA3b5xbb721M2TIELGu//jjj0K2XX7Dep2U31LYC1n0jTF7IGd6+BcXDNzFRRdd5CPCxRdf7P0OnYtRwIGlE/v16xe5qDz99NPOKqusEjTAXNqLMGgjd97PPfdc79+h5GLaEnM9ePBg72/uvvvuIM/XWWqppZxhw4ZVlFUPGueqq64qjzNziekURr4QjM0220wIoAree+89Z6uttortewb62EHtofILFLoMGHMJx52HcyTmdZdddnGmT58eOZ+Y97322kuez4o+oiQo+C4KWLxhiFgx971gQ2DevHlK9P7uu++czp07K9E7g3wnCl8w8F0xLyuuuKLYHIjDfffdRzdHTOkp03LgjbtVq1Zi8QsD9Nmll14aZQT+YnrcOTlHZQ163DJIN1XdVdA0jsyyeckllwgjKwgwzg855BDx3nLLLSecoDCgjXPOOSesj7rkt2IDCU5cFLB5gL6rlJ3PkR669WTefNeQVD+sueaazmuvvRb5PURRwTnUYJCLcS6xxBLCLsQmchQee+wxwUtx/JbBXkirbxpM2QM508MfUrfWWmsJT8xVHG3btvUtIOuss46nlPAeOhsRWlfB/EgqU8HUqVOdZZddVjbIjLeXxTlaY401xG6Su/BvuOGGUQZlGacq3377rdcWPHvJ2bThJT/11FPKC/Kbb74pC0w5y8KP/iU0joSAt2nTxjc2FUCQ8HdRfc9oHFX8Hg5+ELCbovHkKGnOUSnMAQG/xylNF5BP6XS3QtlAwaoAu/1kwanYuezdu3di3sJuz3rrrRdJ74zyrQrbwHeFHOB3uJdCFZMnT5bvsNCtp0zLQcE1St1E4jgcf/zxUXJjdNw5OUfzNOjxgkG6KReh0DQOK4tsYqdZRbdgB/mJJ56IfRf6FKcRUh91yq/PwJ80aZJSW7JDFkCTvOlRLfvLNiU/cfoB0S0qQNQPbGcrW4EHGyc4OHFTxbRp08LWHyP2gqK+MWYP5EwP/6LWp08f7wMvvPCC3FHR2fHjx3vvnHfeeVEdqGA2HOe5nurhhx/urLbaaoKJ4RhMnDjR9+6AAQMqnAXT7WVYfH/ET6qMr7322sgLBA8++GDv3S+++CLoaFOc3NEdsZtvvlns4mOHCkKBEIIrr7xSHLu6uOOOO2g7M1XjNOGs4WjcBY5AO3TokNQ4Eidio0aN8trB0eeZZ57pbL755qLfUHTYjUNIIe7Scmv4Axgf+V6jaePIPbVCWAQWNSyoCAOSwvwKGZ2jrDlegl+wG0p3zaAosDuDDQssuug7lNv777/vo6GkcAKVCXZXITOQHxi2CPlAGAoFjqyDDIiNNtpI8KYL7FLh2Ltdu3YiLxF8hb7tu+++4koAOgaEDUTRO6N8p170NXxXyAH4mQI6FSERCCOADOC/J0yY4Htn4MCBJvWUaTmoOBEHnnnmGRGWBPnHXHbr1s3jUyr/1XSODOYc6dDjJYN0U+GvgsZxZHKO3FCqQYMGiWgDfBeG0Pnnn+9t7Lqy6xpdl19+ubPxxhuLOcIl9v379/edPCG8W+qjTvn15AI2AcWTTz4p5AK6BacroN3rr7+uEsFRDXpUw/4qmJQfFb2I9equu+4SFZoxNnwPNLNt2/dehhBkb5w0+kh1nLiEWvquUXshTt+YtAdypEcl49O8mV69egUqjKOPPtp75+23345asAKZDc4VDDB5AYFzgJhIF4hnXH311alzZry9DItvoxvb7AJxsIRpyrIBgaPIEEKKvmGnHh4wAGHA8WjY4rvpppt6JzXYKSCnVsoJcWA4uosQEC+s7CTgmNSFFC5X8WCBoXOWp3H0/fff09PPpIm6sbyuKcfLhgKgF04i1h4KLqjPkIUpU6Z478KIiFJ22LkPagfyQzdCkIMUZ0DgHWnntOJBSIwL6c60Js3ybWWhXcbvlrEIUWPNrfoZ1B4Wcroo4m8N6SnTclDGCTry1lzceOONoXxK+au5Okea9HjZIN1U+MvWOI5MzhGMIzdsTn6uv/76CuNdCgn2HuqoNDQ0yGPWKb9CLjB/cNRcoK9B7SGsavTo0XHOUTXoUQ37yzYpP3H6AW2E8RpsO5qCgpPyDKH0Ngx9txBa3DiRsuC+i2gleb0wZS8o6Buj9kCO9PB7rXJxAInhvZ1ieLEuswLbbLNNmAFdwWwwmhGLLg3MM+BBQFr04bjjjos8ZtPdXobFt+yevtBwMin2sUAVJXbAXIDZpW/7jqyluGh6WrXA/X/6Pk5kpAWyFBLC1RS0oxVgMCdyEuiisuWWW8p5BI30JDLiMX5yJCsCokRLWUMONDhH3g4h3ZCAAiGVIitOdi2psiSSOMOUHZRmwLx78oPdnYgQSzFmJES7cCtbBsyn1zcoV3qUHqUMM8p3IS3tMn5XnPpeeOGFvl3sgMXJaw8LCAw0F8jtzDO8VJMcCF5FAi7dPIOxFzZuGEtIRK8B58gtZa+zlLduPV42RLe4eStoHkcmvYrcnoBvC3pgI44iwAFpoIY03TGX51mj/Ap9gM1marhJp3u+9mB7IdczytaoAj3snO2vgmn5idMP0olixfhwQuYCzkpKY1yM86STTko0Thq6dtlll/neNWUvxOibsml7ICd6VIZCYOAucIogEcVlHkEcmsQtTVgpSpikUDNqdBeDiI4qF1HGsu72Mi6+ZXkeUUEl6MjTvfUYgNduVZYh9OWDSPGTgQ/ecfHiiy+qHCkWZWUCuEnSKRPaRN9RmYSG1RWLxaAxlK34Wv5GjSPpdCxL4QRTzpGQTfCRCxy9R9CnGMcnFAjtlEIwfTHLCJOgO6JBfYt46L0GZbrD4wKhLVHKMKN8l9LSLuN3RSgrLUaAd+PaQ2XAkJDmxjqRg5IcWnz66afHjhun5jXgHNlJ828U3itp1uONhugWN5ZSTuuRUt8QxhOgs7xcN4qddtopaH6Kbj5RVBSIRvkV+gAbUS6w/se1R4tfBfWvCvSwc7a/jMtPnH7A5mDU+gjHkEbbpJRFMU44/UnGucEGG3jvg1fp70zZCzH6xrg9kBM9/KEQ8onH3nvvHTlh+D01fsnuYDlKmJDLYMWUa8RJlAvEQ0ZNlu72Mi6+JXn3CqdDMDDlo10aV3zGGWcECilKX6dFY2Nj3FiKblwqTdhDNZgMjpEnILJid5kVlWQQeiglEbrPgkUKzLZySkQnx9FZk/ZM5ByVgpxN6aS2GEZbFWUnFVyRx19GaETczl7cgzArxAeffPLJIswCO1mqxnBG+bbT0k6HXkEeoSLNRHso3eoCIRF5Ogma5EC0SytUBlSgrHgf8evN1DnSrcebTNItbt4Mr0fKfZNyIuiYKzbTpGsIIt81Lb/vvvuuqlyI9lBmPKp/VaCHnbP9ZVx+4vSDFEJWsT5Sw15BP0XOKz15TAopHcGYvRCjb4zbAznRwz8gWhwgDXBXTUCnK5hNOoINUuZlJCa6QAWzqMnS3V7GxddjDlRLcYFiBJQ5UCee7sYT58lXVYXGJydFwC5/hTAgptVNqASw4ysd9dtp+QnH6dg9CwNyEhCPirAH8I5UejO09LRu44iESpStbDBVkEG0S5PWyYJfjqEDDaUsBRkExEktp5hP9zveLhCUJ4q0IJ8OxoAKDxuU79SLvg69QsNmFWhWxjtUPvJ0EjTJgWgXcemK4y64i2Vzdo406vEmk3SLmzeD61GivkVcPl/xLilyVE4wZiPyS/NwVdpDyGlU/6pADztn+8u4/MTph5BNfyuhrkisN5NCCgs1Zi8o6Buj9kBO9PDv9OO4MwtQ7SrgmLaiszihiplcG++EHI01mW4v4+LrvUPLjcJRskISQXGfgRRG5rURV88/CvhbK+LSOMRb0xr0qB0fcJqTaScS8w7BwK5GHHCcitM06cSyoQrGkQkDI0spb9EuraxEFISt2QhK6xwJ3sGpI801SxFGqFu+Uy/6OvQKlV8Fmvnaw2lulZ2E1DJAeUBh3GUsuM3ZOdKox5tM0i1u3gytRzp1lq53jchvQrmw4+SiCvSwc7a/8pYfE+tjKr2ZcZzVsheM2wM50eP/i5NcHCAN8Pfkoq9yWGdR/jJOKdA8hwULFkROlu724iYfiZcqxiJ2VGjFJhy5W4squNCEtUMPPTTUqaTlEKVL1NKEZ3mOEeJZkXTnAse5AUmVxQyLre94FWPGKdXVV1/tvPLKK755kYHKKzhyteIrQqWhT7Wco8yGS8gupp11J0jHZgCULy49DgKMBISnIPYb1Z5OPPFEUXxEVRlmlO/Ui74OvZKQZqIqU8hOYFOdyIFot6mpKUhvhY4bZZF1LY4axq3dOdKoxxutKjpHBtajmnaOdMsv3TXXIRdVoIeds/2Vt/xU1TmiRc4yjrNa9oJxeyBP50gYsbQ4AE4QkhCB5s4gsd+KuXRriy22iD1ORulNF6jNHjVZutsjx4ZBk1nGDcEKky+YipbqdsvZ4hZiesQsVcDxnRbQUoxSYmma8CzhGKFcJA35Q0wu7n3Q6BhZhPbzgvqDsAg4S0hgxRzhRmMKKZlVJ33q1jmi8e8kXr2s4pxaauWHU4eR4nSQngCWSiXnsMMOE/cdkJ1F7wEPqirDjPKd2jnSoVcozVAJNEl7M2fONKmnjPIq7sFwQS7XDB037j9T5Yccxq3dOdKox8tWFZ0jzetRzTtHuuWX5lZst912meWiCvQwbs8Z5rvE1erydI4ov2UcZ7XsBeP2QJ7OkR3j4MQ+tNKZ5FgFMhuSsKyYRERc5uZCqprXZKI9evSH+PcQRhKER2luhckXoYqoquNizpw54gQFpQhd3HLLLUEhdR5daM4OLv6ygqt+uE9U1bdhbpgbvdgTtfSlZD1djlEiHoKzBOfRBXZQ6O810qdunSN6Oa9UASyIXjYc3pDkYJ3KRvA5vUTulFNOiaU3DGYKkuemW75TO0c69AqtdoWNgLj2UNHRhVR9qKlO5EC0S3Uc5ihu3LSEbdDimPO4tTtHGvV4VZ0jjeOoC+dIt/wi9cBFnz59MstFFehh3J4zzHc17RzhomxN46yWvWDcHsjLORKLCS0OgKM4KTG+bIXnRQhGk0PycAt1FDPi1EJK+i9SQYKh/Omnn4aFnTWaaI+eXKBOekBbmCtRjpOWMI+YfDG3OF7EyYwL5NPgWNmFVAO+JDMZvRUaFQGlyjtFWQnRoho41pSZ8J577vElKu6zzz66HSOv7zR0ULrnqMGSSjlai+7OonxIf6eRPvXoHIn5xGLqAnfHhPC8xwv0YjX5XhDdORwIhXQBOlrB9xp4ylymEUmwbtIs36nDRTJ+V/BizD0pvvbwO1qtCPQzqKeM8mq3bt28dhG+K92X5xs35hh3vkQZgTmPWzWpX+U93Xq8WmF1usdR62F1jZrlV/Am7g6kJ0tSjm8SuWisEj1s0/acYb6r1bC6ijVeZZxHHHFEqL1XTXvBpD2Ql3MkCEKLA0g16FWq3wgDlxZzuOaaayKZERgwYEDgJU4gIDXgkcgvHcOVTbQ3bdo0344PWeR8F0z17NmzIjkwYvJF2zfccIP3Lg03gbKN2L0RzhUqfdB427Fjx8oK1bvIa91113Vmz57tvYuLGGn79C4RjOGoo46KqkEfVSBASYEiGY+GyUm3JFcICHagXIAetG8a6VMvBRnovAvl1aZNG1+u1k033RR6qVv79u3FqaAL6SJi7c4RNV6lb/kcYcgelQcXpFpjk2b5Tr0jmvG7RVcm6akHYqytkMvrqLzgb6RyxeU6kQNvU4hujuB+F2l+vL4OHDgwNiE353FXLPABG4YllyYx79ma9Xi1nCPd61GtO0dlzfJbdMOHaMW60aNHyxckq8pFuUr0sE3bc4b5rladIzHO1q1b+9b4qHHiUAPRSGH2XjXtBZP2gCZ6QB5nWBEXZpfl4gBSOe6SqoNFPXW0RxavBVbIxZg4QsT9FvAskXiIy6VQ2pkCi10c82ZsT/QftyhTjBs3TtwxAA8W7e2xxx7OmDFjvIRCRWKJthGTGwRpZ8kOczzB1BQoh9ijRw8RXgLmghJGZTx6RxVq3NNdLppTBmBHzGBsshg3kuyo4QDHEGECqJIHgYfihBB07NjRue2223zVVWRB10ifajlHWR+x2KDsOcX48eMFn8MoA71xaov7paiiCzpB1O0cQYnThFvc7o0L6tAn0Aix8+BRevcCBd6Nco4yyLeVZdHP+F0hvwidlfPpOnXqJBKZ8eAkxLZt3ztDhw4NMsbrSg6wJlBHZerUqWJ9QaKx21f0P6ZaUWMVxi3emTt3rvcODFWUVYbOIgnoTpL3dOjxKobVaV2P6iCsztYsv973jjzySN+7SGno0qWL0C3gZegaVy7o/YNh/cuZHrZpe84w39VqWJ03zv79+4eOE/oOTtEFF1zg0zsB46yqvWDSHtBAj2KcfSs8VQi2CzCVtItRUPV44y6QpZgyZYpS9bshQ4aE3vmisT3RfyxoclGAIGCx7969uyqxvNwbuY9wBLDDETPXJfdYGhXeVIF8HZIELR5ZySZFQofZGzeEOCkgWNIRsE765OocZYUclgHlMmHCBOW/x85Su3btaDvzTOQcobpgFh4jt14v0CzfqWmn4bslN1y0XC4rzwWMJWm3sGRAT5mUg0LYpkYYJk+eHLlDnvO4xTvIn1WQS+X3NOhx47liMe2WNI7DqgPnSKf8+uSC5uRFgUb1hPUvZ3rYpu05w3xn17BzVHJtaVRyyzjOkiZ7IalzYtwe0ECPGRHvlLxB0Fi/QYMGJQ2p83m8gwcPDku683UER4dRAoV8ExjVkiCFxoNnbM9rE7se1BuXgSNKlB1MQyz55GbixIkqc+0pUxzHuzujUUB8f1CVE41GuqrAe945dg3oRbNhgMOIEyQp/M7WTJ96dY68/CwsvCNGjIi9+wHx6qgOY2VL6Fa+9PjYY49Vug5g1qxZIieF3nret29fU/oiNe00fNebG5yW4ILlOCDMBrIe4mzVixz45B8Fe+iFhEHGJOY6rq85jlusjciNCJMxSh/V9zTo8UKVnaOCxnHUg3OkW369b+JB+gGNlpCBvA96P1BU/3Kkh23anjPMd7XsHBXoRgps6Lg1PmKchSrZC8btAQ30iB2TjR0RWledlKpMGhMsFhP8PfVmaSKW3BF4tL179xbJfFg4YTwjaQxHiogvjQjnsjW35yMowrxAmOnTp4s7CRA7jDBBMBfCwVIQS7SNe4UowDiKc+07AkT565EjR4rETzAe+ocYZhyXwgELSH5rqJJz5Ot727ZtxfEt+ondiYULF4qdBdwIDcWK418ctYbQSSd96tU5smVegLwhBh7hiuB3zAVObxGS0atXL/kU2I17N6H8vX6BBtghRCgA5BB9wo7/jBkznFGjRolynm6/IAMupPKuuuU7tQGm4bs+mqEACowe8CxCTmHQI1kZO8khpVuLhvSUaefIN3aU1+7Xr5+YO4RwYH1AHhF0lpuDoGIE5jRu73vYwUR1Tzhl+Nb8+fOFESHTSeG9hox6vGjAGEsbq69jHPXgHOmWXx9v4UGl2OHDh4s2kFOD+8EmTZrkywdO0r8c6GHnYc8Z5Ltado4qxtmhQwcR1onqbwhPA88loGc17IVc7IGM9Ih9p6QhtyRQ4C31Oukqjx2086KxPUshDjHLRWpibrp27epzHKXdpUISgUnwFBXobPLyvqzzWjRAn5LGsQVuEhh6Shp4wUoxftX3izrHa0C+TeeLRX23qIH/60kOUvU3Q5y4iXGrfq+c4Ns6+MAU3ZK0q5OfdffNxLu6x6vb1siTHrr1ZN58V9KsF03IYy2sF8WM49NqD2imR+w7Bc1CUzRg7BQ1C2fcuAr02DvFUwjrLy7BcnH77benCV9M0jeqgAqaGTKN4Zl0XsMMTR30KWgeW6JNAk3znpYXrBTjT/J+EoXYkJO+yGPRLxqUX6sO5SDVQqmwO5j3uIuKbRYTyG9WPjBFtzR6QRc/6+ybyXd1jle3rZEXPXTrybz5rqBZL5qUx2qsF1ntBSP2gGZ6KI2psMhTSlOuOYwIcntR8X1l6X2Vftia21MZh9xO3LwV6NhbtWrlC19E2cQMuwthfYsaZ9TfJCkprcN5KGn4hi766BybzrlWnZM0vJBm/EneT0LjPPSFjkVf53fT0qze5CBJX9PEtec17oIi7QsJeSQLH5iiW5p2dfKzZUgHmdSFpvSBKi/nTQ8TejJvvtOtF6tlT+haL3TLiE57oGCIHnmufamEya6B9kwYAaJ8NwoLoJw1rTyCW4sN79IyGPWMasl3resVpjmDwWBZZTBYmOpSOEtWSFI+kjelUyNWJgwGO0dMc557BoNllcFgYWq2zlFgxTKU7MQFqBafGjEY7BwxeO4ZDJZVBoOFqSU5R7gZGqULUX4Rdxp17txZZ/I4g8H6ghd9pjmDwWBZZTDqECVLb6lD3e3lOV52jBiM2pTvWtcrTHMGg8GyymA0ExQs/WWh8ypBq3u87BgxGLUp37WuV5jmDAaDZZXBaGYChV0FkyXDCzU83lrsI4PRUvRFc9ErTHMGg8GyymAYwv8AUjYP0LxL9pYAAAAASUVORK5CYIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZpZGVvUGxheWdyb3VuZC9pbWFnZXMvZnVsbHNjcmVlbl9ub3RpY2VfaXQucG5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADA0MDExMDIAMDAxMTYxMAAwMDAwMDAxNjczMQAxMTcyMTUyNzQ2MgAwMjEzMjcAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABub2FocmljAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVuZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiVBORw0KGgoAAAANSUhEUgAAA0IAAAAmCAYAAADp0yulAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAHVdJREFUeNrtXQnUFtMbH/u+71vKmpNdsmSZEEWWQwtSJNRReO3OyVYkhRayVXiVsiW0aIiEiDdLFJ/lK5VK6kv2nfn3u/9mzvPed5Y7M3eWd777nDOH0zfvvXfus99nuZr2fxi66lm66qlZ9RgBn+KqR9cU8MDvaZR9ioKfsPjym1MW3pOaR4HiN/Xt8c9Vn/Gg6CNd+nDSJXmnP8VvCn8KJCHClPAYCoFCe6qnhB/RdeirmTJuvCc1jwLFb+rbk5mrPuNB0Ydc+qAGoohx6KcnCwq3ChT+QvNX7gGbYYrC33//bf7www/ml19+aY4dO9bs3r27uckmm+Rd4ETeU7I/xTjx4wc+6yhYfz/66KPNAQMGmKVSyfzmm2/MP/74w6yrqzPnzJljPvfcc2bnzp3NzTffPIyjoq9+11x//fXNtm3bmiNHjmTj/vjjj4y+MM/7779vDhkyxGzatGl9UGgKssNv6tvDz1Wf8aDoQx59PG/9e7NmzUSNQzb2sGHDysY/5JBD8uwcKH5T+AsDYfgr91AT1dBevny52b59e2Wseuwp5zAkih/BdTAnaN999zVff/11obF++ukns2fPnuaaa64pins2B97H77799luheSZPnmzuuuuuir4UJMFv6tvDz1Wf8aDoQw59wBhjh6s4CPv3339FjcMS3ll33XXNd955xx7/4YcfzrNzoPhN4S8ohOWv3IMhw9DGhnLOkK72VAqBS8GPzzqYg4Loy88//xx4zOeff553hnQ3J2iLLbYwp02bFngORIm46JByhhTEwW/q28PPVZ/xoOhDDn3AGGNZCAHXq1vv7bDDDuaSJUvsw7qNN97Y+n1J4VZBPcdfWP6q18ioeNZaay0mWPbcc0/z2muvZdEgaqxutdVWalNXE5vLU4wTPwGeIlUgW265pfndd9/ZcyBNrW/fvuaRRx7JcLr22mubG264IcP7BRdcwFLmKPTv39+LoexTiE8++aTsdx9++KHZo0cPFonC3zHP9ttvb5566qksBY/C999/z0eGdCVLFUjmN6VMlSOk6COeuUT4NMp6C9a70Ft//vkn+/0ll1ySV52h+E3pLUUzaThC/NO4ceMyZ+jqq69Whio5ndKiF8HF5QjplBl79+5tjz9//nyzYcOGnr9HBGjgwIFlEcF99tnH7TvZN6CmzAIoqW7duplrrLGG5zxt2rQxf/31V/t3iCYpxlUQI78pY0g5Qoo+4plLhE+jrtd2huAAAVBvmtODEcVvSm8pmklgY+o09zbMJeu9QqFg/xb5uZzQcWoPWFj9X9FWyV4tlouaWEcZpxaFeoB16AHXjIK031c9v67ex1otXDpXWPyIts9m49NIzSmnnOLEmCUe73BiaD72Pffc4xpxOvnkk8sabrRu3VpoDjzt2rUr+/6TTjopahe+qLQQdI4g48nglyDf7SWki4JzyW6B7jae1zh+/JYFORRFYbqtsxRCsYXFV1yOUFqt+pPQA1oCdFQt9OHFp9Y31AnoOz/+/E7z7j4qC9KWe177XapifZZXPpWlt8LYKzL5Ky27JlZ8RA5F77bbbvZvkV5Ffr9Aixat0DXxFsuGx+aFjZpYAtoQfFdkTj1B/AiP//vvv9vjIwXOZ1/tUzfUhVkwa9Ys15zvd999134PKXcCuCvb95deesn+/bhx48Ke8EWhBZGueFHpdagmtxV6WHoUPakK8r0ieyg6Hj9OlLa9ScmhsA6QiOwRlQ9R8SXbEZJNP3Hxflg9IFs+VDt9CONAMANCT4GOsiT3omSLZFmf5Y1Pw+plWfaKniB/xWHXJIKPqIZ2ab311itLeSK//9Np7D322MOcOHGi+dtvv7EHBvTtt9/OG7e2sX3QQQeZDz30kPn5558zgx0RhQULFphPPvmkeeKJJ/oRuGuLQrTWHD16tPn111+zcWtra81Ro0aZTZo0qdjg0047jXUvQxEmvhHFZk899ZR5+OGHO80tsy1iIo4Q6m8sQB2QgMBg+Nluu+3s3/3yyy9Oayvtt99+9jtoxrDpppsG+Qa2vuOPP978559/WG0S0vhC7oErXlq2bGlOmjSpDL/PPvssH33y3Y+I9Lo0Ar+E+m6X3xYF3mffi5ouOMNjxoxhLfVBA8ATWux//PHH5vDhw1k0UKCzoL1/uq6z/fv0009ZWiT+i+5PrVq14lMpRfltaQbkUFCw50W9Q7FYNOfNm8doc9myZebUqVPLmtOINkTZaKONzC5duphPP/00+w7wI9Ja8T0LFy5kBw6o2XO5EkGmIyRjPZoM3o9RDzjis3nz5gyfmAdj/PXXX+bcuXPZv+HagqDyporow4tPw14BwdYNG+S8885j+wB5gT3AvkIOYV9Qb4pU7A022CAqHWVJ7rnud4sWLZhcgnzC1Reg17feesu87LLLeP2bRX2WJz6Nopcd/w6a6tChgzlhwgTWeRf4AP198MEH5i233GJus802/LqKUfkrRbsmMXxEdoRQT2IBCI/8/hd+bNrRhcIzzzzDh3XNddZZxxw6dKj533//eSLuxRdf5O+0oZvg2KLwhhtuYALeCbDJqE3BexCcYCCvbnmXX345P7fMtoiJOEI0xe3xxx93SllzCj16nbxY77O9dsGzSDSDjQFFwAnwMI6lI15uu+02X/rabLPNvJhMl0SvNSH5xQjz3R6/9aM5Jpz22msvpqxFYPbs2awhhssesvEOO+wwc+bMmZ7jYL5jjjkmKL/VZEAOBTa2YJRC0XsBDDzIKB/csvFgKNJ6Ti9AZB+HD9y3yHKEZK1Hi8r7MeuBsu9FkyEYzn7wxBNP8FH5Qk7oo0ayI8TGQ+r0okWLhH4LnodBFZKOsib3KvYb7cMfffRRz7HgGPrcr5S2PssLn2oR9XLF37fddltz+vTpnuvCoTYOdnk+CcFfpZTpoCZJfIQ1tO0QJLrHWTB+/Hg+57BsbHixToBTD/K7xfB6X3jhBWHkoSASikETKL7EiZYfwMOGZ400LD/ASRC8ZZ6AEnCEgtYIOTkz7LQAp2UUEB2B4HVoZlDicjy9wppsbDCIBZdeemmYvfCbJ/ReWgW1foDUPlwA6zKvIYlejZD8UpTM436556yz39KlSwPfN4bfcd/McAs8gI9EL3WG8eMl6P0M9BTkUJC0G6Z8RNvM80rCyWnFvV1BATJwl112CSLXROhM5noi8X4CekC38AnZQQ+b/OCNN95gRq1Lmkge6SOMoWZ27drV10CTREd6Ncg92pDIC+A4EqOV1wFp67M88KkM27vi74g2it7xiGydiPy1PG06SBIfYQxtu5gdN9Ni0y3o3LlzmSHhhACckiCUhQWDeFE4z4WQzeuuu67M4x80aBA7xYDHh81BOPTmm29mbZ4tePDBB4XacVphPRT347QG44Fo0PEO/05PYSwm69Wrl7n77ruzNaOFM+pc6AkFQuFe3x2TIxS1Y5wt4JFa8Pbbb1fgavHixeYjjzxidurUiW9dTYVxLecglTmhX3zxhT3ewQcfHFZoWI5VlOK4ir20OtIB12eddRa75wiMjDSFV199tezdfv36uTaDkESvRkh+0RN0hBhtjxgxwv4bwvNwcPfee2/2vVgbTnEOOOAA86abbiq7mwr7ws3NTvOoMQNhj9PpnXbaiRl8+GYYAHPmzClLseSMmUAKJQU5JArs8KBPnz4Vd3XhJBu0iegk1urEr05OK2o4rVbCAJw+I7WiQYMGjO+R5oPvP+GEE1g0mOJi8ODBQeSaUNcwiespRuH9BPRA0cIn6IbCyy+/zNKXkGIGXsH/T5kypeydu+66y+lb80ofgWsYIB+Ak4ToqFgNcs8CREWgw6DPECVB+iRSxSggjcrN0U5Zn+WBT2NxhACgGdhkRxxxBON37Ad43zCMsvf4dMMQNUKp00GS+AhkaOPjwaionUC+IPL0LKipqWHCx+uEaMWKFSy85zFHDU4qLOcKG4zQsdv7qGexTmjg6Tdq1Ii/PK3i+0BIViiVf+64444KQ5kLI9sPVUb4dq9ImExHKCx4EAebA8T45ptveo6BXFukY8Dh3XrrrYWKOSmT7Ljjjmlebue4l6+88gqfO253xQONW4A8VnJPlk1fEunVCMEvBQkCN+jhSNmdU1zqR8UDYWUBcorpiRPkCb3cDTngMAKcxgGOZsyYYb/LdSkMpFBSkEOiUMK81MCDTNJc7nQbOXKkF58v5pUJ6gS4E7OKh6ay4hAjgFwTukdG4nqMKLyfgB5gh4bQl9Rgu++++xzHgbyBEUEND/yWo6O80kdgQ23AgAGB1g3DMAIdGdUg9wDnn3++K31B19E9czo4Tlmf1eSET2NxhLDHbnsBJwI1NxagZigKf6VMBwuSxocUQxsbtv/++/sikmdip1Qrmq7E5XNaz4+rnh807r4AAE5i/MJyyCV0GJMJcQg3Cg5KpoYin57UVJEj5HjhqcVM2HMIbpEQM9LemjZt6macs7XT0D9RVkYWHCEoNlwm64ZjKKfPPvvMLeIpm15LAflFlyRwAztCVEBx90f9strAKmlcG3Snp2PHjmXGCU5yHb7XHge0ZgEKJcM6QinIIeG0uHPPPbdMmfGnZJQ+YSQh598LVygutsCBVyta1kNB0ZQTiY6QIXk9kRyhBPRAiU8dx6m1g8FrjwX5CCPNguuvv75C3uSUPqw6VJH2vov5TAORddPutiHoyKgGuQeHys25wIPomAUwXJ0itinrszzwqR6XI8RFsirWhSigBStXrgzLX0bKdFBIAx+RDW10e+CEgqsTwnXhMpzCzzTPlc9zdHpo57LXXnvNNyzH3WFTS3NE+cLSQw891DXPHac6XgqmihyhijoceNlHHXWUeeedd7K8T688ZoSc+/fv75SuxdaOrjUWkIYHmXCEcErk4sTZ+0Hz59FNiaMdmfS6OCC/aGk5QugcQ1NEcJeYw7eXNJ+2l+g4Y8EVV1zhFe0q+O1rEIWSghwSTouDMWMBavf86BNC3+vE3+f0tSLdGXxMeVt2REjieiI5QgnoAbb/tPU/ZIkfPtHZi6aC8PImx/QhKqtC0REiZBHoyKgGucfdAVhLjEA2DlLl6Mm5E3+mrM/ywKfFuBwhOLJe+MWhLq0pi8JfKdJBMQ18CBvaCFEi8oOQLsKqAwcOZB6oR7pOxdgkZOXkqbH30Y4yLKCmxY+YPAolKzxXrlOZ57tJOUISaoSKHifSjp3gsA8QSMi//Oijjxz3/oEHHnDce5pOgLzdLDlCyJ3WfFr8ItJpAfK1eTxLpNe6gPyShiO02Mm4sgQvIoRoXco1lrCeH1b/3jZQqGHBRZQLfs56FEcoBTkkjCd6ubFHxyl7P9AS1qsGxO9BiivyzS+66CKWCkpP2gPKNaEaIYnrieQIJaUH5s+fL0rjDJ/0ugHoWn68HNOHqKwSoiOkekO+X3zxxawN9VdffRWFjorVIPdI6rmTXCvhgNMPPynrszzwqSFJL1f8nUsnq8AvPaSIwF9p04GRBj5kG9oFr7FJeKvkthaa/xwUHE45KtZAwtAlv70gXdNKAfYt646Qzjk/Ra28CUFB87mUDAWIcIRRN0OBa6nKhM97773n5HiEqRFyWqseZS+5tDinsUooPrYAHYB4PEuk17qA/JKGI2S31MSpixsgCojDEqQq4D4Nrq2mHdamBcVEiZUC0kDgblUpyCFhPNGDA4E9KaFuzcf5sA1eKKArr7yStSmFQS3yjZINXZnrieQIJaUH6GXVIvjEO5SPvOrzckgforKqYt2IzqBJADJUYqAjvRrkHnHESmEN75T1WR74NDZHCFHNCPgN9E6KdGCkgQ9Zhrbh5tkFNcCCtsPko1YhhG+Y9WbBEYraPlv3cZao8HU8PYSnDu/fAnQv4qMH9F4DdHoJGeEoQAg0btw4Sgvtir0kzT1cBTPecQk310mmV5l0E5cjZPMU9gVGk0g9GVJR0MXq2GOPLcMd7eRDhLzsu7ayIIeEv4PWIQjsiQGl4heFgYGEuyDo2CFSamU5QrLWY8TEA1L1AKUjEXxSeYOUZM2jPi+H9BHEEUqajqpN7oWSkynrszzwqZGm3pLlCKVIB0Ya+IhqaHudyodCJG3lyV1kGSYFLM+OUNT0Mhbut1pIcyFLw+NUqswpOv3008uaD/COELrYWICW1CHWz5QeWi0CoICGDBkiJScXLRj9GIzmVePmcB7PEul1sZYRRwjFh6IpTjiFQ0eZW2+9lXUdpDVhPKDLJNJsrN+6nPr43V8WOSKUghwSxhM9iSPzutInWol6fTuUyNSpUx3xAYWBFATkdKMrz4UXXsgujIzT0JW4nqpwhALSOOva5VLUXVcf6ENw79Ogo2qTe6EM75T1WR74NBeOUIp0YKSBjzgN7VCIpG0lueK3MClgyhHyGZt222jbtq1opMXeW6pouYhJycrVtk7swFwOl8sJrZO2SMQlXzIED4kwuYZc0Y7TAtz1wONZIr2WtIQcIRKadhq3hJuffRwh/He503cglQEGAooXkWKDm64p0EJGmgdM6h1KIoaIFqFGKAU5JIwnWoNx4IEH+tIn7jHxSmPE6TU9oS4Wi+YZZ5zBumhx1x2wB3dTxFkjJHE9VeEIURrHHTNB5E1tbW3FeDmmD9G9Z3REi6NF1k0LySM4QtUk90IZ3inrszzwaS4coRTpwEgDH5lzhGgOLi5r0py7wVhPjXKEouEHl3NZgHsGAozPBDQ9aVuyZElFf378P4pJLUDBbYA5CnivYcOGZScEZ599tpSIEAqANZ8iPKTzWYC94vEskV5jdYRo+gi5A6rkhNOWLVtGKrDmDQR65wcarlh/mzRpkv3v3bt39ysaNlCb5lIQKV2hSJZDwnhCnYMFV111lS99du3a1bOxBb2QEYXjfvjCresUSDdIKV3jJK6nKhwh2v0IRrIfPlHrYgF+y4+XY/oQ3XtGR7Rpj8i64aREoCO9CuVeKMM7ZX2WBz7NhSOUIh0YaeAjS44QE3D0Nlu0qOQ6gRT4DUDLSAsQKlepccFS4+jdAoBzzjnHqf+87qAYWDtX5GhbgJMwJ+OH71yEuzA07/oy24lFi0x6Szq8fZIzGqlGCK3BubbfBUpbUGa02xDSADWuna1Eeo01NY6eUHLdHgs8Tmldl5PxRO8e4Vrn12gONWW4idoCOLTWv8OQswCGjQsu7L2jlzny90tIVChxyCFhfqSppKB1rhNVGX1iv3CXjJccopdeAw+a8/0NtiLjcU+KlaXcIyRxPVl3hBiv+NyHUYZP/I1G6EHvvLzJMX047qdDATx7hzbqQVaC37rHjBnj1lhAuGtclcm9oDxQzIA+ywOfFiXJpEQcIQf+SpsOimngI0uOEDt1QZ0KzU+cMGECL+zty8Z23nlnc+HChfa7Xbp0qU+OUNBmCXxdl33KRR0NKEakSzikF5RdUgcGuuaaa8rWdtxxx/H7b89BbzlHDnevXr144q64BK9BgwasCw8FzhmJZAwB+vXr59jZB8rpscces99DbRK3JwXJ9BqrI0S79+HEhAjAssvJOnToUFEoydM2dX5xcsTd6l5hhCDyZgHWYf070iRpbv3dd9/terFgkyZN2A3XFiBqFZMjFIccEk29YalHtDMY+IZz/O19RTt7v+J16gBze1ZmvIG2cW8YD6iRk+kISVxP1h0hmzZ8bki38Un5Cr/hWgcXck4fmpOzzHVeK1lykq4bKXFu64ajNmjQoKh0ZFSh3AvKA3oG9Fke+FTPuiPkw19GynSgx4QPyM9Zmsul9FlyhDRrYyEYKKCVZ/v27VlKDwQyPrRHjx7sdmQL0JufM6zznhono402Gx955AjdU0AuOgpBEc1BzQj2FsoD/doRqkSbUgpI2XBJCWJzoOCOpmEAkAd64403ms2aNWMnDsAtcIw23CBuvoXjvffeGzbtyNURAowfP541Y8AJHk4XceEX74DBQXDAo0x6jSs1jp2w4LZnChMnTmS4haGA78YFuqNGjbKbQnidniEdkgrT2bNnsxQc3N4NYQknErTSvHlz8/777y/rksQJSdZqlgLSM7H/ENDYH9w9hfs7qDHAnTjJdoTikEOBaBSpnxRwUNGqVStGm8AVaBX4sw4VvOQQFBht9oFbwpFqijUC9+B9fAO924QC3pXpCElcT9YdIdsYh9zi60VatGjBmrXgQYTWMIyyd7iGMKV6QB/29y1btsx+B84cWoBDppDmNmXrhu7CKTDkEr4fuga1NzhV5u8PsqBRo0aBI0JVJvfC8EDa+iwvfJppR0iEv1KmA9n4KPilrmfNESpapzjoxCIKEITIXQ6ZE1lVjlBUcIvYQHmuXLky1JgQ0Dip1DxaneLBhW+8AyUKaJbARTEi7+WMGTOE5h48eLCbAyaTXuPiRbb/EHZ8Aa8TIBrUrl073xohPhooAjBeuDQQJjSnTJkiPMaiRYtYpDAAv2VBDgXCFZ7hw4cLzdmnTx9PpxXdqnhjOAiQ28x/lFEjJHE9pSpwhIpWilSpVBL+Rjg23OlrsR7Qh72f06dP99VfCdORnkG5tzwGQzltfZYXPs20IyTCXynTgWx8zPJYQzGLjpAtcGBYWyfUXjB37lynrha6coR8Cd3gvWWc7qEjmyigTSEiDQ5pdLpTQZtV84MUC/4yVjdAfirXHCHMSbvjXqKjnZczhLxuKD6t8s6sOOg1dl6Es0tPg3hAugZazfqsw8YlTo9p+3U3wMkoTkgdUknY/0N44fZ3v7sLUO+ArlBasGLMLMihwLjC07t377JTZR5QL0DvT3BzWjt16lTWbMQN5s2bZ5555pllt4ojYisp8qbHsB49446Q/c2IUowbN873m5Hqxh0q8d+ZV/qwDSCkP7vJAjqX6LoRFWrTpg2rNYhAR9Um98LwQNr6LE98mkVHKBB/pUgHsvHhyytZc4Qqwljo9jJs2DBWDAWhhxxA5EgjlNytWzenAs9CyoxVbY5QxZ4jBQA1PKglAYEjRQ1CfcWKFSy9bezYsWbHjh35AjqvzjcVcyC8CvyhwQLCqUjLwAkfThWguEaPHs3m4JSI3xyB6REncz179mSNE+DYQcGhgLVv3770XiUhJy8ivcbJi7ZgQeoGjICZM2cyvGJ9KAKGQkaKh2DKRYFG+ZDCge/DqSUcXOARtAInEykgSK9x2ceyvUObTOQCI+UEeMDaEHZHmg8abHC1ENbeGTE4QrLlUChcaasvLUanRfAEcrbr6urMadOmlTU1EXFagVtENpHeADrH+hEhRIR2xIgRrM7C2l8YmBZwLeOj7rPs9RQz7ghV0BHqKOGggOeQZoXDB+AWER6XNrWFekQf9rchYjN58mR2cIO1IFsBDgG/P17rxp62bt3aXjdNKQxJR9Uk98LyQJr6LE98mkVHKAh/1aRs18jEh+8ailr0iwA982pDjl0IWfdSiLAGWe/WStzTosSaIL+1FCKOZwiciCQxR1z1Vl5zy6DXOHlRxt7z64gyXkHi3vntWxbkUJq4KsQoQ8LscyFGGSZDF8Xxrmw6UvQRopW/JPlaLXIvCg+kpc/yxqdRZFJc+C0E4Im07ZrE/ABdi37/hdDJZoixdZoGENJIDbIGWe8WJO6pHqNyctuvYkAlE9Q5SWIO2Y5QIQF6jZMXw6xRlA8MCXiMsnd++5YFOZQ2roIolJqQcwXZZ1nr0WPQRXG+K5OO6jt96CnQUTXJvaj2WBr6LI98GlYmxYnfQgD5kLZdk5gfYBmmfHtlWco86tj8GEbA8YKsQda7MvfU6/ujtM+OOq8MOkliDhFHqOSyjqTpNU5eFFljkQjhYoR1x0FzUfg2C3IobVwFwZHbmDL3WcZ64tJFcb0bBx3VN/rwGzNuOqomuSdDvyStz/LKp0norTj4Kyt2TZJ+gAIFuYU4a3AUKFCgQIECBQoUKFCgQDlCChQoUKBAgQIFChQoUKAcIQUKFChQoECBAgUKFChQjpACBQoUKFCgQIECBQoUxA9FLd721AoUKFCgQIECBQoUKFCQOdC1+NtTK1CgQIECBQoUKFCgQEEmnaGiplooKlCgQIECBQoU1Gv4H7AiznG7ay/kAAAAAElFTkSuQmCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVmlkZW9QbGF5Z3JvdW5kL2ltYWdlcy9mdWxsc2NyZWVuX25vdGljZV9lcy5wbmcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDQwMTEwMgAwMDExNjEwADAwMDAwMDE0NDIyADExNzIxNTI3NDYyADAyMTMxNQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG5vYWhyaWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZW5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJUE5HDQoaCgAAAA1JSERSAAADOgAAACYIBgAAAAxN7skAAAAEZ0FNQQAAsY8L/GEFAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAYkElEQVR42u1dCfQW0/t/7fsusiWy5EQ4dokJkeXgcCqynWx1FF67c+xLcmQpy1EKQ5aQ0KJROCHiLUeEr6VCRPJNWcru/vrcfzP/+9533pk7M8/M3He+9zlnjtS8M3ee5XOf597neW6p9H903/JrwfKrafnlRLzs5ZdVyo7ksWb9/jy+MclVRP4YKh6F2XUj2X2WY20JeGjmFKMLhloOfhoymJAKIxjB5WTAwKCxWkYegZcBNUONqPNWg9l9lmO9z9i74aHRBe0dzLSdyyLhp6FiYEKW+q9EGAxTpb///pstWbKEff7552z06NGsb9++bL311hMZWM5yrMJ77YIoZyR5hFEB+WOoeBRm141k91mOtSXgYZHkZb6jZdDzLu/33XffLJzLIuGnocbHhKz1X4makjrWP/74I+vRo0cWwU5TgOCcgihnYnkUnD+Gikdhdt1Idp/lWFsCHhZJXuY7ik9w5vji75AhQ9i///6bhXNZJPw01NiYkIf+K5FD4Vjjg6Rgx8pirAU0WBJ5GEAz1Mg6L+ltI9l9lmNtCXhYJHmZ7yg+wZlj33zzTZZyKBJ+GmpsTMhD/xMzo+ZaZZVV2Lrrrst23HFHdvnll/PdHJeam5vZJptskuZHtchAp0RTo2MbuzfUoIBsN5Bem0DHOAPmO4w+mUDHkNHFRg105Kt9+/ZVwc6ll16a5q6OCXRMMwJDLQ+QrQbSaxPoGGfAfIfRJxPoGDK62CCBTnOpftviintfuVz2fvv222/Lq61R29tZK+7xa48clYlhbZrDxpL28yjlEae9dFb8oeBLPT2S9SXJO5Pww2985Yhjy0K/dLQPFbtGgePvy6+lK+xgdqm6FpCC/6oUpHOVGEAfxLegsVJPKhQ2RmGPcfmhu7ySUiN+RyPidpzxufc3K8zf1PifVqCT9XxE7Uck1e888JDSXtKQu476n3oEBkeCbb/99t5vf/jhB/H3X0dciQ1buVUdq7WCWVStsamfl3dEnBd/4vIlScttlXcm5Ufc8Vk56JeO9hGm80nap1LucnoYFHYp2m8UvvnJgBIrkthYOQJvykR6pGrXOskrib024ncUFbflZ1mKckgL/6kDnaznI2o/gkK/88BDantJU+466X8mjnVljTXW8H77559/ir//sxStvZ0dcr/KWHnwteqqq/LmCE8++SRvhf3bb7+xf/75h7fG/uCDD9jw4cPZ0UcfzVZeeeWwSZg/b5111mG9e/dmTz/9NPv000/Zr7/+yhsw/P7772zevHnspZdeYv369aNotZ12oJMKf3BZlsWGDh3KPv74Y7Z06VL+32HDhrFu3bqxlVZaKQlf6rZJ7Nq1K5swYQL77rvvuO6hCO7ZZ59lRx55pKqDRSFf3/HtsMMObPz48WzZsmX8mjlzJrvllltknc5av3S0jzCdj9U+VZH/kfiG68ADD2S2bbO5c+dynVu4cCF77bXXqpqxKNiv97w999yT2w34Bn6hhf/XX3/NnnrqKXbEEUcE6TElVtTl8V577cWeeOIJ9uWXX/LxzZ49m40cOZJ16NChZhI67rjj2MSJE6vscdSoUWz//fdXxpFOnTpx/uI9eMZff/3F5syZw/+uc+fOkew6DXkRja+R9a7QuA3M69mzJxs3bhz7/vvvOV+Aj++99x67/vrrWatWreRn1fgtEY58yAI/o+BE1vMRtR9BZad54CG1vUSWe0xcyFv/swl02rZt6/0WghB+/1vEZyc1WM60nXbaiRuHCs2aNYvtuuuu9ZjHn3faaadV1SEFEXa0DjvssCTGn2agkwp/9ttvPzZ9+vTA5+B9Bx98cFy++LZJvPnmmwPf+eKLL7INNtgg6J1U8q0Z3xZbbMFtQaZnnnlG/G1Txvqlq32E6Xzk9qmK/Hei8A1gjAktiJ577jm21lprhdkvXwFbbbXV2H333cf++++/UD3ecMMN4zg4paQ2dtVVV/EJx48w4R577LH8PnwzJvCgrpwXXnhhoB6hyQ0C7zB6/PHH2dprrx1q14Tyoh5fqcH1rrC4vdlmm7GpU6cGPuunn37ijqeM4zEcvaaM8FMVJ/Lwdyj9CEo7zQMPqe0lSgZUElzIW/9Tday9rTl0X3Np7Nixck5eVoEOz1Fu3bo1W7BgQeRzgPA7aUuNG03//v0jt3TG6s8222wTN0WGskbHlrcXqflz3nnn8Z0A1cNmu3fvHkdJa3iC96rQO++8w9Zcc00/WVDKtyY/HquBfoRVKXFFJEP9sjS2j0rCidqJyX9blW+YBKZMmaL0ffIk64N5DlaNX3jhBWWezZgxgzu8MVN5Y9kYVtBUZIkV7jFjxoTeC5zAaqH0DZy/sFHUd6rS66+/zlZfffV6aRCU8qIeX5Q0Hl31rlRU3MZutgr98ssvbPPNN6+brqPo6OmCn6Uc/R0qP4LaTvPAwwqxvajODxS4kKf+W2k51l4jApx8CqN36YwzzhB/Pz/DQIe/a8SIEd6/Ydv5/PPPZzvvvDOP3CFMRPu77747u/baa/n2mEt33323/C5ee4Qo3SWsNmBLu02bNgzpekj/gVIffvjh7NFHH62KhAcPHhw3RSaNrmuWu71IyR+sXojfjEkC0flWW23FJ2jwBoD00UcfeffgmTGUtIYn2NJ2V3hOOukkttFGG3HDw7b3K6+8UnXvwIEDZVlYxPKd72fo2A3BFjmAFM856qijqlLBMtYvW2P7mE8d6KjwX1H3ON9uuummqmc///zzPDUCOofVNDz7rbfeCgN2z3G+4oorqlYCwV+kREAOmLCQBnHdddexn3/+2bvvgQceiJPKGxt33LSFO++8k+/qYVxw7tBZE38vrrK6E9DVV1/N2rVrx3m+7bbbsgEDBlStgCIlUvoGzl98v0gvv/wy69KlC09VgE7iz5MnT666Z9CgQX42QC0v6vGpks56F1unGgG3cf9DDz3EDjjgAD428AU8dxyn6j4pDTZyjYJG+Gnl5O9YhH6EQ2yneeDhfGJ7UZkfqHAhT/23yR1rfDQUELmByOND3qNLTU1NfHARVhooAx2+e4StLZeklJuaC0rvEnIQZYUTjebNN9+UI/+aC9uaLn322WdxnQ6yA0P9lJ6IPz9CD8RDoZCzClDyew62cadNm+bdC6CIqKS+PJk0aRJ/tvw+5PFCN11CfYZwvlPFz3lJKN+anctFixbxNIig52WsX47G9tFMHego8F91N7GCbXpMWi7deuutdc8Ye+yxx8IcTgfPcxeHMHEgZaPeOHFembsDhxXA7bbbTtTjVAMdTCxuKoZ8gQfyhIyJ0e9e0VnHHCGNsYL5RHQU7r33Xt/nwK4xuYoTMn4r8CMNeVGPr1QAvUs0l+mM2/jWejqPRRLU/LmEmp0kjp5G+Gnn5O84hH5EM7Gd5oGHzcT2ojI/UOFCnvrvZOZYg1EdO3ZM2u0jcaAjKvouu+wi1wvNX6EAlZAdEO7IodjMpb333lu+pyLvbsGxErfXNAp0PN4R8YedeuqpVUqHCNyHP95zwD+XUBAYx0mXczU33nhj+Z1e5w6A5SeffFJvp7FCLN8agJJAWHyencL7lXmoqX2QBzoh/FdNreCrXb169apybqRdoSq9w4SEYvGg9FoxHUHK03avn5dfS9z/F+/HTluChaRINoYcdp+xcVkhSBbJxwlvEidHcSVWHr+Y+oyVSx9Hx3sWJkM4By5deeWVcvBKLi/C8RVF76y4OqU7bksr7DXjw0q6S4sXL5bfa5fU2utqiZ8Zz0cWsR9Bbad54GFzGvYStpNHiAtOTvqfTaCDbkaS0xQ3hzxxoIOODWJqDs74kXNpVzAvqJ1dWFvAJr80PkxEYrGZjoEOEX94Bw6XLrrooqDV8nIIL2Pt6GBVpM47y375n+jmIdw7m1i+NcYtdUNx/NJSMtYvR2P7IA90QvgfKX0Iq4wu9enTJ1TvMGkGpdeOHj3a+zcf3tdcuMelV199NUlqcCQbQ1qUZDNeTY1c+L7PPvvUzfvHqm0QP9BRxyXYbBh/L7jggqrUFNmuqeVFOD67IHpnx9Up3XEbaTI+Ou+ND06nWCvit0KuYJO2ZviZx3xkE/sR1HaaBx42E9vLfBW5E+NCHvpPG+hg6w47N9hqxFbTXXfdxVc4AtJCsgx05vuBvQtI6BSBVn9SwZZ7LVnxe0dU3rBr00035Xm855xzDt9CxIoEgdORRo2OlwtPwJ+K7DBLO3nlegWHpfhnmdTwBK1WSyGtEjEul5DfK690EMq3BqCErXC/b8xDv2yN7YM80AnhfyRb/PDDD+ul+5X99A6tQ4O+E+2849L8+fOTNHuJZGMBtXQ1K4Xrr7++8r3y+L/66itVLOH83W233bz7MRfJz6OWF+H4nILonRNXp3THbSndVcaNiuhs1UsFUq2L0Ag/85iPHGI/gtpOc8NDQntR0gtiXMhD/508HOtyhMCFMtCpuFt5iM7r0R9//MGDNGwt4pwQqU2eOH5LBFY4ThdffDFvT4sJSMydVtxRybsZgUXEH77SLxaqC0ZdCdmqtkvxTrmt4Ym0nev3nAqKdV1C5zAfcKeSbw2gCNvmlQB+ZKlflsb2QR7oKPBfWe/EuiYFXa8gTzroO1V4U4+kc8pSDXSENJJK2L3C+RaVCHjGx48i3yj8xT2ivgbVaVLIi3B8TkH0zikqbqPeKYDPSjUPijapE37mMR85hH5EJQU7zQ0PCe1FSS+IcSEP/c800KE4mdWhcHjQEAFMQwF1GGELDF1rDjnkkLrtCtFbXKxtiJk6RhHoJGkvXSLkT1XnEGFyoDjQVIknQtOLekDm4J6ANANK+cZxOPPQL13tgzzQIUhb861rUtB1B0FW0HeGnVMQtqueVaAT8Cyqe2v4ocJf0a5REFsKqNOkllfC8TkF0TunheI2daCjC37mMR85hH6Ek4Kd5oaHhPaipBfEuJCH/jtZONZBK/ORAx0UiVFtwSKqRgeJG264gb3xxhs8aq9H6B6HbTJxhwjGgpOn/QiGga1S5Ciiu8dZZ53FD2JMOdBJGkiQ8afO6knYuUtkOzpoFRkGZGjF6NKSJUtqdIlQvnEcTicH/dLVPrQOdMTVJeFgtrpyRSvToO8UW2pKB71FvVKt0clqYo+IJbxLUFAxL7W8CMfnFETv7BaK25SBjqMRfuYxHzmEfkQlBTvVItBJaC9KekGMC3nov5O3Yx2UUuL37ApONE8Y6OC/P/oJAluPcOxQhIYtMpxwLJJUkMZXvcWVbdu22QknnMD7f0tttPmF/uYNEOiQ8EfMhxXyxysqDnaJoEanffv2oVvTaO/oEnrzy2mOhPKNOmFaOemXrvahdaAj5gbvscceoXqHc4mCvlNspyoVrUa9Uu26ltXELmIJznCKYtezZ8+ueR61vAjH5xRE72IvUDU4blMFOpZm+JnHfOQQ+xHUdqpFoJPQXpT0ghgX8tB/PQIdcVsKBUZ1BMc/vmvXrolqdKJccOxuv/1271lotCD+u3hA1bnnnhv6PJxyK5LQDlSHQMei5M+ECRO8v+/bt29YEaGDw7LqFP7ZcXiCArVSSLEhDvJyCQfAySvhhPKNOmHaOeiXpbF9aB3ojBo1ynvuJZdcEqp3Z599duBEJtZI4RC2kn+3GfdqKnqgI3ZLQpAdxl90CnQJv5WfRy0vwvE5BdG72IFOg+M2VaBja4afecxHDrEfQW2nWgQ6Ce1FSS+IcSEP/dcj0BFXhqUubWXBCeOtIx9++OG4BlvTm1tqee0KrSogwsmvLmHrU/w38TBU3Ffy7/PtCV4eu1C8pkOgY1PyBxOvS++//758xkNZNkbxsCepH32sc3RmzJhR751l10n/4osvvPuPP/74Gl0hlG+sCTNj/bI1tg9dAx3OszPPPLNq5U/qTFeld9BJnHkShFHiKdRo8S116KmxnWOOOca7H1v9BUpd4+MPOf+iir/4N/H8C+BKSWo/TC0vwvHZBdG72KlrRcDtqIGOT2G6oyN+5jEfEfoR1HaqRaBDYS9hAS4xLuSh/3oEOu+++25V5Cx8eNXhRz179qwpjIpgsFxJUNgkptpIp63WMA8Rs0sYp8hsMUDDTlM9pxDbbLfddltNniFyJ4kDnajNCGryWKn407p166qajjvuuKPuQV8dOnTgJ+7W4WWsHR3QwIEDfTvCARgeeeQR7z4U3UtboRVi+caaMDPWL0dj+9A10LHcLXOxAxZOoReKXaswbNCgQUFFk5wf6DAj5kWPGzdOdmI929l6663ZvHnzvHt79+5dpEDH+8aQE809/or6i99ILV/LaciLcHxWQfQudqBTBNxWCXREJ07qXFlx7VY3/Mx4PrKI/QhqO9Ui0KGwl7CURWJcyEP/xXOKZpbqHA6eZqDDI0acnirS+PHjec9/RGSI5A466CA2cuRIr5gqyY4OCpZEJs+aNYtv6eM0WggPygEGderUid1///1VXT8koXGBi0VeODW2bdu2fDUAY0dOdL9+/ap6wYuEe4kDncQXJX/QglikSZMm8YMaodjgUbt27fi5LSI4SSsAsWt0XBo7dizr3Lkz1yMU4+L9aI8sEgJoPz0ilG+sCTNj/bI1tg9dAx1PVieffHLV89GJrlu3blznoHvQQeCaW0gZMBYO3pjQRUJLzR49evDUXgA7Jl7wbsGCBd494KO0StnoqWseP+65556aerAuXbrwYlxcyARwHKfqniFDhsi8SE1ehOMrgt5ZSQKdRsdtlUBn4cKF3j0IQtH6G9gqFJdrh585+DsVQj+iKQ0c0SHQSWovIeOixoU89N8pKZzVmHqXL3ykXNjsR9jN6d69e+Iancsuu4xFJTBd2iLkXabkySMKCacsV5I4HElJFjwVf6CQkydPVn7Gt99+y9q0aUPSpnTatGlK7xw8eLCf0tvE8l0Sp0YnY/2yNLaPnzUOdDy+DR8+XOm7cJp1WLoAgByd7lQJ9VHIUU7xu/MKdGw3RbJSqSjzAw6/tOpopykvwvEVQe9KLRS3lQOdqVOnhs7HGuGnnZO/YxP6EdR2qkWgk9BelOtlCHEhD/2vrNjJqfetdtqBjvd8RKNilCcTti/RQi6hwXpRHaLDpUuXhjILK9ZYufZJ4eF/Pv3006vaFtajuXPnshNPPLHqlNlrrrmGdBWMINBpouYPQGLYsGGhvdiRP45uGlRFra1atQoEAcgMDn2p9qynKieCUL5RbMjKSb90tg9dAx1P/3DdeOONVbtcMiFvXDzXoF66gJua5O5kB9GcOXP8uuFYBQl0PH6gtemYMWNC+YEULvAuAEtSkRfh+Bpd70otFLeVHUfUStSbE8V3a4Kfec1HFqEfQW2nWgQ6Ce1FuQMaIS7kpf9NYd+atpPgMRIpMRjc9OnT+RkByI1EcTQUHKkzBAZb5cxtueWWfMsTW6FYBVi2bBmPIBctWsSVB1um2B6rs9XlPQdjQ8SM7Tz0W8e4sUM1c+ZMNmLECN4Sz82dhuBcklr92RoEOk4a/MGFdo7IiUUqFBxo8AjbnEir6NWrl5xbXq+rSiQnDCtB/fv35wV7kAvei4LGAQMG8LzTUnC3IGr5RrWhvPRLV/vQOdCxxHF27NiRDR06lBeBIre5ubmZTZkyhZ1yyimqulBlO2jp/eCDD/LiWIA++IfaDMilT58+foWa5RTSjvMKdGr4ceihh3LHHXMD0iyxCAZeY2ejTvvTcpbyIhhfo+tdS8XtSI4jVpwnTpzIF3gxtsWLF3NHXf4+DfBTi/mIwI+gtFMtAp2E9qI6LkpcyEv/Q+tV7VLyg8EiKXPMy44w1iTvKxOPO1bHnZQuWxP+lAmdMJXLqbPCVE6R1ypyz0O/dLWPJHbfSBhGaTuU3x3lWWncS40lOsqrKHrXUnGbWpcrmuBno85H5RSflQcezie2lyjjykMGlPo/O+xbrbAiHiKyxK34GJcVcaxR30cBqhRnD1gpgp6VAn+iPMdJksIREwDKhCDblJDnJQ30S1f7SGL3jYRhlLZjEetDlHGndS8llugmr6LoXUvF7Si6XFZ8hw742WjzUZhOUjwrDzysENuLFUO/qWSQtf6XVb7VKv1/a7iatmzEJL9LfmfYWKKOtd77onxrlGdQ8DLsfXHaS1sp8ifsOUn1KawJhZ3wnRTyTSL3rPVLR/tIaveNhGGUtkP53VGelda9aWCJTvIqit61VNxOoveq2JUHfjbCfBT12UmflTUepmEvceRDJYMs9T9rH8CQIXJKuwbDkCFDhgwZ3DZkyNiLIUOGDAAYMmTIkCGD24YMGXsxZMiQAQBDhgwZMrhtcNuQIWMvhgwZMgBgyJAhQwa3DRky9mLsxZChopNdSr99sCFDhgwZMrhtyJCxF0OGDGVKVimb9sGGDBkyZMjgtiFDxl4MGTKUOQjYJdM60JAhQ4YMbhsyZOzFkAL9D/R4FSMwRJMhAAAAAElFTkSuQmCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZpZGVvUGxheWdyb3VuZC9pbWFnZXMvZnVsbHNjcmVlbl9ub3RpY2VfcnUucG5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADA0MDExMDIAMDAxMTYxMAAwMDAwMDAyMjUzMgAxMTcyMTUyNzQ2MgAwMjEzMzUAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABub2FocmljAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVuZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiVBORw0KGgoAAAANSUhEUgAABDQAAAAnCAYAAADw4xhcAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAJNhJREFUeNrtXQv4JtX8H0LlEoqEkqhsRW4bkZgUoehKnpAni1B4XRKllMp2VfTrnoxSSbK0LUObENFLT0tYskX4Zbd9YyOV6/z3c5498/++553LOXO+Z2Z+u9/P88wj+5t35pw539v5nu8ligS2mFp5LV15LV55pSuvZOUVy2cRCAQCgUAgEAgEAoFgZm7W41X3pzN8o2/Og153rLyykisW8glGi2W0RNcqkTUQCAQCgUAgEAgEa/D+3eea8fupKY/NerwabPTjVQtZOI+11lorW2+99bI999wz07j77rvpPYnwU3BaHJB7BpE4lgQCgUAgEAgEAoHsmTivGbufgmcno3DYrCcev+0D1Ob4IQ95SLbvvvtm55xzTrZo0aLsz3/+c/bAAw9kZfjmN79J55kKT/HS4tKlS9V3njVrlunUUOuFfwewTpE4lgQCgUAgEAgEAsEatmfiwuqwn1pc4ZSo26ynHr/thTNj7733zn7/+99bL/j//ve/7DWveY1spAPS4uWXX66+9RlnnFHoPTzttNPU3y+77DJxLAkEAoFAIBAIBII1bs8UwKExY/dTPk6JmerQUM6Mww8/XDkoqvDf//43u++++1Q0wHe+851st912k1SHcEjwTXfYYYf8+8+dOzfbbLPNsnXWWSfbfPPN1f/HmuHafvvtxbEkEAgEAoFAIBAI1iSk4tBYsx0acEBku+66az7mf//739mFF16Yvf71r8+23nrrbP3118/WXnttmzyjgfAT/9pEq5xNVVEyH/nIR8SxJBAIBAKBQCAQCNZ4h0bEU0MjEYfGzHBoYKGyn/zkJ2q8f/vb37JXvvKVTRZcnBlhMNDfeOedd87mz5+fLV++PPvPf/6j/veqq67KdtppJ1kLgUAgEAgEAoFAIA4NPodGLA6N8d+i1alPK5mk4qNWtalJahZjiCgMjQ996ENFi7li5TVadU3jNzXP92l7GwV4lmsbH5dvHWpu9G+LHRjPfNYUE925zDuOJlv+Nv1OId/rwzch6K7JGHzn4DNG8/muvGGuVxvz5XiWzTyraLHs90W/CSXzOGVc3Tr2nS449ENoWRL1gG7Knlf0Gxue4OKbprqgbK62363pd/fhTW50zZtN6CAkTYWgAS66DWlPdCm/XNe97Ju3YVP5fMeQeriJvHN5Xtm9Zfc13Sc1kS+2e/BRizzDaY968V8oh0YIT1HssNlNS4RH9v73vz9vv2qZWlL2PL0oXF4ujmf5tPEZdDS3eVGY1kNttDOKGT2dUwHfOy8KG3k0FYVtGeXL+5xjjBvwRtzBfDmeZTPPQSBeSyO71uGLPZ7JvY59p4spT7rnpMtQ8oSbblJjs2YjP+OAfNNEF0xFfqdyccNxLWZeN98NZl94k8437gFNcdHAPEa67eMegpPWBpbytg82lavuDLnX8JV3cUM+jyPeSP4Bw76hjSwJbjlu+7xG/DfxQdZaay0WhwZz+5h88VE0MkmSbMmSJdk///nP7F//+ld22223qX/bcccdqwgKz8ouvvhi9Y4rrrgiv+9FL3pRdskll2S//e1vs/vvvz+76667sh/96EfZUUcdlW200UZVH9mn7a0JjmfVtvFB+gZSbX7961+rOb/sZS8r+15tze3+ir8tMbx3y/Hv1113XWi6s513WjOeJND6u7xX8c4zn/lM1ZoY645Ct+CdO+64I/viF7+Ybbfddr5OjaUBeD5i5H3vMRrjc+WNxOF+rvnmz3rwgx+sOjpdeeWVas0h4/AsdHi69NJLVdrdgx70oKJn1c1TKXm0vj7++OOz22+/XY3Thpde8YpXZAsWLMjuvPNO9Zs//vGPSiajvpGlUaDm9ohHPCI78MADVXck0Pbf//53VcwZc/zDH/6QfeMb38gOPvjg7FGPelST+bmuY9/pwpkHyHOGjHTZWBZy0Q2u5z73ublMBL2gnhb4Ax20ClJRB3RceDdajOPdm266qXlf3bqqMTzlKU9R/Iei49DLAXVQ4bqDTzbeeGMbey+FXTg9PW0rtzl4kxvBebPhfIdd0VQAGrifkW6D7SEa8D03rdnozaRozTltKm7d2dJeo5G8q3ieLZ9X3ZctWrQo//c3v/nNVs7SZz/72flv8J0e/vCHu+4bQjs0BppO3/CGNyi5cuutt2b33nuvWtsVK1ZkP/vZz7Lzzz9fdf+EnWljj+KK41jx4C9/+cvsH//4h/rfc889N3vVq15VZovafxAYJBqPfvSj++TQSPVHeOQjH6k+aB2wQSOEQT+IGi8cFcARRxyhFurMM8+sfB6Y/L3vfW+ZB20xI0FxPKtRGx84bgq+V1tzu9fyPYoO9ttvP2tHRACHhut40gDr7/JedS/oVxs3Zd18PvCBD/go8cXMPD82Vwbe9x6jMT5X3khd1pZpvkppPuEJT8i+//3v1z7r61//OpX9+ll181TzgmJy4aVjjz22yVgmFCMMB9TWscGyZctUXR7H+bmuY9/pwpkH6Doy0WVjWchAN4onHvrQh2ZTU1O1Xc7wvMc85jH0ecuKvh+Mf+O9w4p1HerNBA5QWtJBpetuFNguNb533313W7nNxZvcCMqbnvPthKYC0EAfbbmUge8HzLRmozfTyLOLRUB6HXS012gs7yp43ZbPK/e7OvIfQEfMGtminCOf/vSn89+gMUWDfUNIh4b61ltuuaVyNtjglltuUQenJXyjnvfCF74wr2FZBrzvpS99aSP+Ux+EEvasWbOokOzaoaEENdp23nDDDda//973vpc97GEPM4W0Gi88scBb3vKW7Mtf/rL1M08++eQiYuEkKI5nNRaARkvauMW5jSzeE2uFjRO5Hjg0bMeTMq+/y3vVvTi5rFPgGsYpZ+wzdgblGzPyfsRsHKQBjGP2+WJTCSVjCzh78X4XI/o5z3lOIX2V8dI73/lOq7H8+Mc/NscyFqp7yCGHOK8hThY22WQT2/k1Wce+04UzD+jfM9JlI3nCQDfquThF+trXvmY9j5/+9KdK3lJ6hgPYxAknnEDvma5YV/W3T37yk23qoNJ1h3ywMb6/+tWvWh8+MfEmd/pJCN5km28XNBWABvpoy6VMfB8z0Zqt3gzh0AiqOwPvNbzkXWiHxuMe97g8MADrutlmm1XRzhCH6YjG0kDEQoPIbs4aGgkZp/rWyE6gY7QBfAlGVkOs6Q46vOpglQJRU+g86urUUB/k5ptvzh8E75clEzeqoeF4P1IOstNOO23sd9/61rdUtwuEQuHUCP99zTXXVDkgEj1eRFwA3/72t/N7ES77tre9TTEsjLANN9ww22effZRQo3jTm97U1aafw2OnQnmwydliiy3UfHEKUOJVTHrm0FC/R3hencJmojuu8XA7NFzeq4wQSsOg/fe85z1K+EKgPu95zxs7vf/ud7/bNF0mDfCNE0bebzTGljeunPNVCgmnIRRpmqqwTzxr3XXXzWbPnq1O0ylOOukkWyNapX8hXFUDhhKea4QMjv0e4YXaCw8Z+9jHPlYZKVDoCxcuHLt37ty5hfN62tOelofoAvD4Q28h3Bp1kUDbj3/847Nddtkl+8IXvjBmOJ5++um28+uLQyPh1oGufMrMh43kiSfd5EYaTqM1QEOY1/Of/3ylF+EI2WabbRTf3HPPPfl9Z5999sT3AJ1BllLZSk51V1R85xX4ZgjX1cDpHv6tim88dcHE90SosAY2V1XGN+whbazD0KzaqDHyZhLxgps3uWVR6zQVgAb6aMulTHzPZQ/Z6s2E2WZpU3eG2Gt4ybvADo17TIcfnIsltKPWAU4dDaT+Gmsfh7S7o/oaJMrmuOCCC/LnIoUNsukZz3iGWlc4CKH3kTZz5JFH5vtqALxl8h+iuygtQfYgSujJT36yipwCzcGB8Ytf/GJM/rk6udXLdF0JAItiOBTigvCzpEZ4cQmjxZgwFaBnnHFG4b0gCAggKrTwW6Js1VxNYYwNnXkCoy8wN/IZNeCtIqc/aTTDHBrmtf322+f3IYfL0zgP5dBQAuDpT3969sADD+SE3qFDw2U8nA4N1/cqoQRFffTRR6uNwOte97qJeT7pSU8a88IHGHtTh8aQkfdngkODc75q7eGopWG0Ro5jfn3iE58YexbxsFcZ0SrPW3vcb7zxRqvvqJ3JMOCK5kXDcFHrZYMNNpiYF91cX3/99WYkwMT10Y9+NL//N7/5jasB3rVDY8itA135lJkPG0d8edCNeiY2h9BzADYuCH8tmzMMcX06BRo3TtzyizqEjdD90u+M9D4aFdWCDpr4nocddlj+36eeemql8Y1ucFSOVEUJMPImV1G7UA4NblnUOk0FoIE+2nJDJr4fctlDlnozZrZZ2tSd3HsNb3kX2KGhZB/saw1kAhB7a2hGO9HsgOOOO850DLcWGV0wl9zBhFQjDSOVZOLCgQadO3XgYc9Mo2pQTwVOjKLnQL/rshA1cqkQ6uMecMAB+QPgRcEJiCkUVk0yLwwG7++cOXOqvPWJEdIycgiPSXSYyqGHHjqWW1PwIfKKqWDOxYsXjwls8wSBeong0TbCY/R9Q5o3TL2L8DZahiyPIrf2NqEdGnQ8Q/29qBHoIBQ45zay2STMnz9/TMkHpLsh43g4HRqu741rlN/9OqxM469//WuIsRfRipXhw8j7seMYRy1vXLnnm2pn1jHHHJP96le/Uv9d9iwoXhhWGkY9lVKjBRtbDSM8cLqMl6Ak119//dKxYM4YrwZ0kylvf/e73+V/R5RJna7C6WKJ067vDo04hA504NNhAD5sJE886SYPedV43/veVyQT79FOPPN+nEIZazNhxKJgIu2cVvSdMU6d9grstddeVnzjqQsmvidOZLUthNM3Ugx+aK4DzaGm8y3S44y82XeHRso83+m2aSoUDfTIluPme5aTcwu9GTewq0Yt0+uopb0Gi7wL7NAY6gNwmqKBAtYFtKMcbCi8qoE6FVyRQFwpWubh/1ZbbWXWypk298plFzIbqFOsoLvo2HNAlzR7wkUnxNorQqsXI5/vrLPOUiHp8K7geuITn6jClRHKdvXVVyuidAy1d1UoytmCSrs0NCsqrkA80P+GAog0LNb0otECqIb3p7CIiRmuhkrItmFXdZ5jB+EVxKGBis7UUHUQCpxzG9UJClTQpQxBhWMAuksDj6dx3mWD9w6K1gcbWISNodo3vPQatPNPgHQZ59MvRt5PmJUctwOHe76pBX9qOXCfqXRgONQ5NBC6qk9LUPmaGMOVdUuMUMzCedEcX4TmmimIVRF9pozT9E51WwOjjMPR1Qe6mO5YBzfODeagm6985Sv531Est06P4R6Na6+9tjD9CdEhtMI97KMqvnnXu96V/xscP0bUVBxIFxQ+j0YCFNRPis2TVWx6YbRXnVIy8mabDo3GvMk839ZpipkG+mbLJQH43ovWLPVmk/mmLdPrqKW9Bpu8C+jQyOeJPWXJXjHXGQcddFBVNFXsI9M4HRroTkP5fjAYFPHPMKppw4rvUCTLqvbcJVdi/VEQMqIZjemjsGx6kF+kse2229ZWvn/Ws56V348wF5MBdS4ugDnXjEE9E+/VQBXpKqY2gdAynHyDCZHOA6OrgCgGbaWcQBAgDBheaJpzaRiMVgWJmOZWJRiXY7wQ/Bpo6xMgrNs6/5FhPI3yLj3eG5MN/ZKyNYXAeupTnxoiZ7Tx6Rcj73MrOe4UmxDzHUT2DkjlsNZAG7myccO7/oIXvCC76aabciPHaHVXaQS8+MUvrvruE/IWOZVRQevQqgs1YtCK++1vf7tKRYB8aiB7uFOR+kAXo451cGM95kk3at5UfroCBz5RSV436njogxKEU6PFHU7hKNCxAq2Ttc6F7jQ6B6QBdUHh8+hGGLV0ooKWkeedd15+z4knnpjVbTwYebNNh0bjtJ8A822VpphpoJe2XAC+d6Y1R70ZwqERt607ffYaIeRdYIeG4hWkZmggCgO1nsyUzx/+8If5Pe9+97tDpfI3vXK+pylpGojaQMoZorSM4ts0TXmaOnmoY6TGfqhzalg5e3JCR6sUml5RhZ///OdjeXWhhBENzVlvvfXq8oyGuEcDDhqTAWleEJjX4mMNkV5D01RcHBpFQHQLWtAZobuuFffZPHbwmBq9ppOmz2owt0rBSHP4wEgWhkbIzTbHeBoJJ6b3lq7pVVddpdKromatyoI4NBh5P7hDg8Mjzjxf05llzdNGSGjpfQjxN8IqJ7pKmL830gaKZO4QhroGqmYXGGb55gkGE1JkkJMKnYSwWIdvPwqxjj2mi1HHOrixHvOkGzVvG9ooA+qBlPBXbjvRU/U628moal/LN566oPB5qDOiN834NqSWmAoBRhSfrj0AoCCcxaaJizeDOzQYDuxCzLdVmmKmgV7acgH43ovWLPRmCIdG1AfdabvXCCHvAjs0cr6lhfhRSJPOZfPNNx+jLeLwaNLZKVRR0FinsiHCsgzQ7Yjw/tSnPqUiaIxWx3lKKK13YmE/mHZrVSmDUuReEaSfYBFQORxGAby+KKQDLwsIHyEjWqi1IYxozQsSnlW6YaPhcBi7yYA0zxb3WnzcFAtLPVRcBjE2kSQ80NXYZFPal156aVHf7bSluZX+DQJXC1kwD8L1unRoMI3HWTgxvle9o6hFHPCDH/yAOqK6TDnh5v0Z4dBgnq+XfLBxaKBS9atf/Wp677y691nI3LF5GfI2NxxwOjA1NTVR5NlxbjPCocGtAzvUwY31mCfdjMx5uAK/LZnHPB1SbXZFKwPuMzY08wLrgtLnIX1YA63sKd+/9a1vHdMNtlELTLw5UxwaIebbKk0x0kAvbblAfN+Y1iz0ZkiHRqe603avEUreBXRo5PccfPDBY3xJ+Ym2Vr7yyiubFgNtmkZn27Y1fzZ0KpxetEZPGbCvQPQJSlNEJW3OLewHNjiFKLcljEpOh0qNKRqWB8+QyYDIidMgJ9JVH3dIc+rqIjSiggrs8HKjWjLCdGg+H4B8qobfk1Vp4yQA43QJn2aaW+k3hPDTQNRHm3QXcDzOwsnzvTEJI0vp2qFVEorc0no4RtGsmEGwckdoNOH9mRyh0XS+RV5uq97xRq7s2N9wgrfnnnvmkXww+IwiooOq72ghc1OcWpTIWzUXKEW0fisCNtBIkYCcR/E10DeKbq2GERqNdWCHOrixHvOkGzVv2q4Q0RyeYbm5zYRDHr1pQtE9FFU30wMwNqQN6GrvuB+1Rmz5xlMXlD5v//33z/8NXWSikm4bBx54oNV7GHlzJjg0Qsy3dZpipIFe2nIB+N6Z1hz1ZiiHRi90p8teg1veBXZoKIcRoglp+QakYGqbmxZl3WOPPXzbVHN2oizN3NBjR3cgdEyETKgqT4GIL6Qt6d862g8sERr0Qaklc9/ThjCi+bvoeVsX7ore0hpLliyZYEAUOzUJreJ5cWQUtLnlllu8c7A/+9nP5vcPh8OgDo2opCAkPJ1mbhvaN1qmiXDOrfAbItxSA0qACMBOHBqM43FaO4/3WvPyO97xjvwZ6EvOocA5HBqMvD/jamh4znfoaqzBuVUSrl84btRbueuuu/J/h2FdYJxNfKdZs2Y5zQunWea8aItCOF+SJFHGImQaOcnPLxiTTUKkm65jj+li1LEObqzHPOlGzZu2jttuu+18w3LVxhNdCminiI033rhyXeH8H41G+abG6Cg3CKQLSukSvKFPQMFLaONthkbDKUVb25e8h5s3Z0QNDeb5tk5TzDTQS1uOme+9aM1Sb4ZwaMRt607fvUYIeRfYoRHpudC2rCeddNLEfGBjGWn5MbNM43Bo4BnLi3gBNWHg4IADFXP9y1/+MjYOWgyc2g+k/evQxpHSkP9qPSRFoSlpG8KIVliv8D7nnm1UYtXAbyOjCje8jhof/vCHrTyk1Aly0UUXNa2Sn28yaMRHVb56CIeGedEWXEaf6emW5jbxDeFFhkGqYbS2at2hwTwe67XzeK9aj6233lopDuQtood3gdBX99EaMSiay0x3jR0ajLw/Ixwa3LLuzjvvzP++ySabVI5tt912y+81K2+XzZNWHkdaItoARjWtclFsrG5etDbT5z73uYl5oeCjBpxxdd8d3XwoLFPheuPQYKSLUcc6uLE88aQbNW+aD3zUUUeVVfjXV1XldvU+bDRRFFtDF6ur4xuczGncfffd+Qayim88dVAlXdJTUG0TIS9a44ILLrB5Dzdv9t2hkTDPd9g2TQWggV7acox8zxGxaqM3Qzg0kq51p8teI6C8C+3QUN8ZKUUaf/rTn1SEw/nnn5//Gw5+PdNNQjo0YldnHxwccNxooO6O/tuCBQvyf0cR4ro996abbprfbxQVT6KACO3QUIRx6KGH5vdjY2Z4tQbUoMHf0LZKA8VkjHdkG220UZ47Bq8fCYEpbCEDjyotlrPvvvv6tMGbp0OSSkJyQzo0Cp0QyKfTMAogjVqa28R7aA4awuOigkIzbTo0mMdjvXYe71V0SQv8HnfccWUhciMUxy1xQnXl0ODmfeWcdcjt76RtK+N81fqjDW9JKtHQHBttrXXKKadYGdG4vvSlL+V/owW7yr4TckqNtoJj84JiRCepkrDMidbb5qkNmVtumF544YVjYyB90GdE21ZuuuhQBzeO+PKkG9XdibZfx8l3ne6nTj5D/qrviDpRGkaLvlq+QVewklzqNIAOqtxg7b777mORLdhMoLuDBg0frtPjjLzZ97atKfN8l7dNU6FooEe2XMLM9xwRqzZ6M38Ot83Ske503msElHehHRrKGWDyD+pK0AiV2bNnc2zUQzk0FN/Q9JitttqqyBE4FgkMetJAmon+9w9+8IP5v998881lejznP1oE1ui8FLTuRmiHRqw91rR4DXK7iogbFwrdaOA3xqlkrBfgzDPPzO9L09Ts7jDU9yHfDiH4NHzWCMsaRg2iGKjnu8WUk8LxvOQlLxnzJPpGnzSY28R7dPgS1nCbbbbxEVYsdMo8Huu183jvyFRGEDBoG1bEN4ji0DDaHXbl0ODmfdDniDrbaiJRUkaF2cV81fsQSqqxdOlS1Zq1SM7tuuuuY4XTDDqppDEU7aJVrHH6VCUfgblz5xbOC4ru85//fH4fClEVyVsa3mgUwhtTtPjtCSecMPF+Ull8FAWILOo5H3StgxvJE0+6GWhapfn08+fPN1vPDelJOXUI0/oB5qYHp1HGifjyOr7BqSxtIQ8erFonTx1UucGCE0qnLACHH354/t8oom65qR4x86amx6mV11Ly+6Sl8Gyrb8o439ZpKhQN9MiWi5n5PmGyw+v0Zu5U47ZZWtKd3nuNgPJu5OC4HDk4OCMz7YR+P5QqoIcCTKkUnEVBJ2qtUV2OKCe0z61yfiGKUuPGG2/M70UQAa25YR6YUf7DWiNqqYRGk1W6fBF5f+Lx/Vp1aOSEQesy6I+70047KUcELrSrgmOC4jOf+UxRSI/yPG244YZj3rLbbrtNLQaEGQQ7DH8IMpr7g3yzHXfc0TnEGIIBxZyQO4QK0ii6RHHIIYe0mnKC0CfkxaHYD9JvIFg0EHbokiPHNLfS4kKnn356EeO37tBgHo+TEd/wveoEERtTCkQa4bQVyhRrBxoAn9DNbEkkRxeygIv31YVTmSOPPDK/B+kYPXJocMu6/JQAHnENeNzf+MY3qnbVUE7IkUYILjX2Ck5DKtOacCFEmTp9ibFYyts4iYQ8hVcfKU8wvtECjGK//fYr/O4wSDUgxxF9gkg6yG6cIKELF054aP9zCtw7Qxwa3HTRBx3sJQsb0k0+DxhTFGhXiDx28ARkIhwwoB04ADVARzQqBfQNm0EDqS4FBlot33zsYx/L/47okqrTT08dVPX3Ffjfc845Z+wkuCQtt3ZTzcib6SpnBlc+dRCHBtd8u6CpUDTQI1uOle+ZUk5s9GYwm6Ul3em91wgo71xSy5qmR6l9Juo+FaEgc6DVNDrbC+tGI3rglJkzZ062xRZbKFrFQQIcXDvssIMKEqDdTMwDAHrQDWCvCN2N/SNoDynxhx122Jgzo8AW5dQHnTg0Eh3KgtN+W6B1jCEcEjM3CMZYVaVWE0cccYQVY7nghhtuMAUmu0PDFiBGFFWrCk8ONLdCYbZs2TKzInXaEt2lgcfjtHYN35srzXPPPdd6zXAyYbTUSjqUBSy8X4brrruubw4Nblmn3onCx/QkqAo4FYQSc0g7G2jHJk4dNIyCX2O/R30OG5QYMuobIfyZGtyu2GWXXcYM+Z47NDjpog86uJE88aSbfB4w2mnnBhueQB45fSYqvdOItoJokNSGb+BUpBsHbF6iinbJHjqo1vlNC9bRCBvUxLLcVE8z8+ZwVWRG2fuSju1VVlnUBU0FoIG+2XKcfM/Zxr5SbwayWYLrTu69Bqe8C4GKtcj3mabewtxpkV/PjTj7PE1HAXW62QJOMyOtRO0Fr7nmGutnwPll1JZJV0VmcOmDThwaOWGAsGmOYBlQtJNWYy4gmoH+99e+9rVjkRplzGe0V6qsHG0LeJ822GADn5oVbASOdIQDDjig9kQg0NwKlSA8uiVr2IlDg3E8Tmvn8d68jzQK5NUBRZqMPLku27ay8X4RoNDRuahCGHaxceWWdfnzYMQgd7gKCPHEKbvDqeCYcYHfUnmCyvtFa4BuKlWbU/zWOBEs/EaICKPtwMpw++23Z3vvvXd266235v/28Y9/PFRRur7TRV90sLM88aSbsXlgbBdffHHtPHBibnZFQMV+SnfIjW64UVP3IKRWA/WLyAkouy6ocn7jNJWG2gPz5s1zifAZBuDNOxhzxIOkg3HMtyuaCkADfbPl2PjeV3656M1ANktw3cm91+CUdy07NPIxHnTQQWO/WbhwIUcx0DYcGnkqCaJ4aCpb1V4ZkRoFqSl5FBoOWGlEeBFuuukmJRML1n7IqA86cWiMOSBwvfzlL1eFQhA+jXAYRFkgtA4VZEtaMg2qnon8HnixcaKE6tDwSCM0H3mDZ599drbttttWPc+KoLCA8PjC8442SaiAWzBOjsWyGg+EIzYwyHNCXjLdfFSdCASa24QSxLigXG2/eWiHBvN4rNfO870xXQPkLyLPHI4LCCfwDsIrEfqFysPrrruuDd+0LQt8eV9VScZ8IWwRzgZnG6KzaowVNT7wib5ayv3llnUDGr6KkD5ETukq+vgmeN6pp55q1tewPRUcMxgvueSSMS99mRENbz3S0VDoEdEjWB+kxhx//PEqHaomnDCfE0IfcSKP8GE8B7Ibcg197lGVHzVEkHajjTgNo6Vn3x0anHTRJx3sLE886WZiHmg7d95556kipjC0QT84FYRMhCFaUDRvLGQb9O6xUcv55vLLL8/vQ0pNEV166oK6vyv9fOKJJ47dgwMfxwgfbt6cjvrr0GCTRV3RVAAa6Jstx8X3gwC0Vqo3A9kswXUn516DW9514NBQ60u7PgL4loxRBSEdGmPyHPV8YD+CRxA9AUcp1hZ7Zhw0IKUE6UpRRYtzfaH1O+pwIYUFdA7aw17k6quvzvbff/+c7hjtFyskFfksCcP9pQLJ4RowP3PgMCfX5/p8H87xDFqe25Ka36ct010SeDxN167Je0PwTduyoOkchh5zrRtfH+c7cJFzMBbMsEBHGZCYijXyzE8tofmYUR+4XMlqSBd908FNNgQ+dBNSnqQNvnPacCwpM13a6Po4sM6ptA3gtKrp8tCVjgopi9qiKS4a6Jst15X8Cs3/g57Sa6i9Bqe8a8tWUA4N2qoWB79G5GIc+SFpYU4DhvXtg/1SizhyK9Dhen/R71MGg6bpMweOc3Idp+/34RjPoIO5DSyUaJt0FwceT9O1a/reEHwTdbAmrnOIo+bGSt34+jjfEHLOhca4HRp1hqSLglzcQH7FqyFd9FEHczs0BoHm4SKfWfiGURf4/J1+U9t5cfFm/pyzzjpLnfR6ODRC8mYoWdQWTXHRQN9sua7kV8i1GjDQd2jdyb3X4JR3Ia64TIchal0DMiziSzeJAs+z6R6iine6tl+sPmgSjbd8iRnvt3lG6vk832dW/TZ1fGbo7+M7nlBzK3pP1dxD013o8XTx3hB807YscJ1D2f1N3pUUCPm+zTeEnLMdd9Gzq0LGhx5rYyufqmRMQowfznXsO130VQfbOjQ46IZTnoTgmyT6/8hGLl3g+nfbb9DUdrDhzUhvqBDqjPQiD4dGaN70mW/aEU2FoIG+2XJdyC9OPuG0WULrTu69Bqe8C3GVvVNF86HlLqIyNIz2s0nEA+55ctFMn+0XgUAgEAjYNqapfB6B0I2gxnhVYdrI8zdOOIUOBAJBr2QVWrWiKCa6xV177bW5/lqwYEGQiAKBQCAQCASyMRUI3Qj6iwRrfsoppygamD17dogTToFAIGCRVUVA0WwjOkN0mEAgEAgEsjEVCN0I1hQ6OProo7Njjz1WTjgFAsGM0Vm6k9ycOXNEdgkEAoFAIBtTgdCN0M0aiCSy63ogEAgEneus66+/XqXHrVixIlu4cGG28847c3TNEQgEAoFA0MMNiYSMC4RuBHWIo4AV7QUCgaAFnSXODIFAIBAIVsMNiWxKBEI3AltawGZBKtoLBIKZqLPEmSEQCAQCwWq0IZFNiUDoRiAQCASru84SvdUi/g9T51b1szwLEwAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWaWRlb1BsYXlncm91bmQvaW1hZ2VzL21pbmltaXplX3JvbGxvdmVyLnBuZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0NAAwNDAxMTAyADAwMTE2MTAAMDAwMDAwMDAyMzEAMTE3MjE1Mjc0NjIAMDIwNjYxACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAbm9haHJpYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlbmcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIlQTkcNChoKAAAADUlIRFIAAAANAAAADQgGAAAAcuvkfAAAAAFzUkdCAK7OHOkAAABTSURBVCjP3ZLBDYAgEATnDJ1Yj/bA0yetGaiIQoYSRD4mzn+y2c2GKi9JABFxzgrqvbHAR1IpZZ8tZs758oFaq8ChmgB67wC01qaCQvVnk8fK9wbg6EcYwPcgOQAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVmlkZW9QbGF5Z3JvdW5kL2ltYWdlcy9mdWxsc2NyZWVuX25vdGljZV90aC5wbmcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDQwMTEwMgAwMDExNjEwADAwMDAwMDE1MzUxADExNzIxNTI3NDYyADAyMTMyMwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG5vYWhyaWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZW5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJUE5HDQoaCgAAAA1JSERSAAACQQAAAC8IBgAAAORlHq4AAAAEZ0FNQQAAsY8L/GEFAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAaZ0lEQVR42u1dCbRV0xs/5lmGRKmUKYSQiAw3U2YyZlwRMsVFhpVZVi3JEhIh62qhjJXxoMhQlmsenyGzEj2EzMP+99v/9vHdfc+0zznfefe+t39rnfXqvXP33Wef7/v2t7/RcSws8sXohdfchVfDwstdeJUWXgW7LBYWFhYWFhbNXQES/fv39y78f9FlFSELCwsLCwuLZgtYgAQFUYJKdnksLCwsLCwsmisaQpQg1y6PhYWFhYWFRXOFa5UgCwsLCwsLC6sEWSXIwsLCwsLCwipBVgmysLBIDZV9WnZssoWFhYVVgiwsLFoAoPDImMOVV17ZZp1aWFjUJEoQTGuttZZ3OTY7zKI2LAeqbpV+lexGWjNKTingHZWVHOnRo4eYMmWKlSsWFhY1udl8T4STfrl2s7HIeUP9PIQeLX3Wzrtyg97LUkstJdq3by/2228/USqVxJ9//ikWLFggllhiCWthtrCwqJlTm9xsevbs6V34/9Zbb+1djjVfW+SDoqI1uE369esnxowZI1555RXx5Zdfil9//VVen3zyiZgwYYI4+OCD5UZL6LNolzBXOSLXfb311hOXXXaZmD59uvjqq6/Eb7/9Jv7991+h45dffhGHHnpoS7cE+Vk3S1a2Wlg08alNjwWyRRMtmkIB6tChg7j++uvFTz/9JOLgvffeE9tss41VhPKHlCVDhw4Vf//9d+g7+uCDD8SIESPEOuuso8udlrbxT3LCLZrFkAOrVZQsLLI4YXft2lUMHz5cvPTSS+KHH36QAuybb76pEFqLLbaYDZC2yN2qMHDgwNjKDwUsD3369LEWy5zf15lnnum9g7lz54qrr75aHHLIIaJ3795iu+22ExtvvLFYccUV4274LWLN2rVrJ+OiYNH88ccfxeTJk0XHjh39aFfK7J133llsv/32lrYtLNIqQGA0MFwcPPvss1YJssgTpe7du1fRIeJHxo0bJ91esCIsu+yyYqWVVhI77LCDuPHGG8Uff/zh3QvlqXPnztZimdP7wjrPmjVLrv20adMClZ1VV11VtGnTpqUrQN6awWV43nnniRVWWEEMHjxYrt8LL7ygW9s9mT1nzhxx7733Wmu8hUWa0wfcBd9//723Ybzzzjvi8MMPF2ussYZYcsklZSbY/vvvL+6++24ZvKiDMGDZLqkFA1zEnin89ddf4qqrrpIbqBPiPoC1ASdqAHFDRAmyyjrz+8I6//PPP3LtYfHxez+DBg2S1ub58+eLM844o6VbM+SaQb5CAcK/oTgqeidr04ifa6+9tnj//ffl31988UV7ELWwSHr6wMkZpmqFiRMniqWXXjpwY1l//fXFE088UaEEaSe5gl1WC04lqLGx8V+4VrbaaiudPhcsvObR3+E0fe211+o0bU/LOWzoynUJC90WW2wh47MWvjt5wMLfofxAnuDCv1v4+5FrNmPGDHHBBRdIBeiSSy6R64dgckrTsHQiEQB49dVXRevWrS1ttxBE1QQxuUp2s/4/43Xq1CnS/YXT9Oeffy4ef/xxccUVV8j4ivHjx3t/f/LJJy0TWuSmBFHgNHzxxRfLWApNIZLF9xC/5qPMW97PYUOfOnWqfEew8jz22GPeO0Nm2FlnnSW+/fZbuaH36tVLxh22cGsG5KbMpHv++edlLObvv/8u1wuJAFAk99lnHxmyoDLrkAHp42a0tN2MFSDBcLV0gomlBPkBJloFuMkca461YKTT1VZbTYwcOVJ89NFHvvSI+J9rrrlGLLfccpQW/bJtinY589nQEbCrMsPgGrvtttvE5ptvLt59913vdwqXX355S5chBfX8cIch/ODjjz+Wa/PFF19UhCGgBATi4CxttyzAAiSygrVa/CesEPOz5pprypPG4osvLtcFP/F7XKiz0qpVK3lC2WOPPcT5558vTyMwXyvA5WDX1IJ7U3VIBuOQIUNEuVyuqjeDrEYVU0E2hpJjrb9NsqHvvffeMpECsT/9+/f3Yl2uu+466S6DK37YsGG0QGJLliFlyFw/QGFE0PTRRx8t5bJVgFoeGpiUINcKq2RWNAgtmLGvvPJKPTbDbjQWudEpssJGjRpVYVXA/+2G2uQoOtZCbwoXB1DIVNRXgqI/YMAAUSgUxCqrrGKrobdwuFYJYt1gSk68WKqyE92ewMKCm06r6JDWpPn6668tTdavItSSLRolx7aCyQzcjQXzblwY1sE8zVVqpu87av3TlGYvLLq/0fAEx0Ez9TJmvcy3nuSGokOvjUaCg44p3+gHhjjzTcprSb6Lmx5M30+Dj4wY7QTHeI5O+HxZric3TYTNvxCwLuVF1+xFVznh9zR7eateBmdjwSDC5tZWuZSg5qBJjzZ8PtPS7H40EPf7OGiyXsasl/lyy408xp8dIh+ClKBJhjxQTMAzSXmtkEBmZS2bR6eQm3KtEGdYLBbFpEmTqrL3lllmGXHLLbfInmIo0xFT/nCvJzdNxJk/VaqilCN9/i1a3novo23btuLkk0+W9V5Q9A4BrIjQR+l4RJvj93379vWCYA1MkN53bLvttjJt77XXXvPGR/VWpKvecccdMoA2YxNnmBLU6GSbIp+1ths0XlbWsrlO/F5e8h2iazPqSyCjZt68eeK+++4TG220URgz0jm7Mb/PY1zUsTjmmGNkp+jXX39dFmZEdhnKwn/44Ycyuwx/h2CMoJl6GZOTL735ImPqiCOOkFk3KAb43Xffyfn+/PPPslrvPffcI44//ni/QOGqsRD8juaVY8eOlcHFoAuMBRpBnRKUR0CqsxabUIwrMxjlUpR8cIPmhedBvRXMYebMmXr7gaJ+P9YHtW6wJvh52GGHhc21itdQIwe81qVLl6hnLDlm/fk4ZPNcJ1mPQDkXZIGBZxRmz57tNVsG3T733HPe3/AOtLjCQIWDcT25aYJ7/hy8nKWsYZW3cnGxiWEiUc3qFPClm222mZEwhzZP6z1EtVbQGuIVmZSgrHz+WZ+k4o6X1lrWEHNtJPEddNBBvh2cITA33HDDirmhkjSyEXCh+q4T0lDV5/sk495///2+Vab9gFpEO+64YxjN1MuYnHwp5wulgbaFCANqsCBLx2dMOdbtt98uhX4cQPgdcMABcfg6D7mURD5IPjjxxBN9u5hr1Y29Uzh6XvlB63peiMNryJRCgcAQy4rJ83DJ5oYEMlc+Nwoj0uxRWm8MsVtomKoDGx+y/kIsHJzryU0TedADBy9nKWvY5G0BJ6eLLroo9oD6xtejR48oM2dBneRQr8AEuL99+/ZZuJ+4lSApSJB6CE0eGig0UZygILyxTm+++aa49dZb5QuOcVr1TmaI7L/55ptlbQwwFH5CQ99zzz31Qm5F5rWRxKdqdKiqpBdeeKH3Oa0HjSzHroCTpaESJOcVd/OjQkfr+l2owzE5+VLOVxVSiws8n4/Ak2PhRGo6Fug3zA2ag1xKKh8kHygrBTYybFoBNa9K6v633nrLl29g1fI5lUfyGhTDEMuKa3KwYZLNSWSuu/zyy3v1bVSQOpQL1LbR64xhXZ566invd1hjkv5tJLtSric3TeRBDxy8nKWsYZO3JZy0dHz66afi0ksvlaY8mLGQzoyfqM6J+gxUMMGURUrKu0EChpovgQceeECa9tBXCrVk4NeFtQCmWFpIDy0WMlBYOJUgqbDACqKINApvv/222HTTTUPNnjBLv/zyy6Hj4Pt22mmntIqQa6KUqHev96cBYI6kJlVKqDjBrL766omUIJwOoPhBuGCdEcQKYYfeT4omKaNhXUjdkHock5MvPcEEMzfiKiCw1XwxJt4dGo5C2OIURU+cWon9shKcuGDqxiEA5nmMgWfH/ECjaEhK5weXATFTVykaOcilpPJB3qtkFJ4BsSv0JKt9NpRvcEIO2pDCeA2n8Kg5xuUxJtlsKnMLyp1EG9wqKwp4SFmqUCka3c/xexS3VD2wALhcfDY67vXkpok86MFl4OUsZU2BS966VNhA64brQis8VXXttttuFXU1jj322FAzJLQ6uhlqhFp17brrrhUbaAZ1ZLKMCSrpZmsIC9o/Kw5AFPic9lxSATrppJNia7pgPM18WuRUgtTpRXUqBvH6ffbAAw+U/6fMQv3dcS1PKJAW1otMXd26dZOCQAHf70Mz9TImJ1/K+cL/rvnKfS+8Y3ra1irzzsJP+N0h9KPGwkkMbguFo446KvAEySyXUitBqvI0Ku/CTUHlm98GpqwbOt/gQBS0IcXltYSbHrdsNlWCJF2i47kCel/R74blGzSkd40fOHCg9xkEUftYRLjXk5sm8qCHEgMvZylrSlzytkLYQBM7++yzpXbmVPfRqaitMW7cuCjC8yb80EMPeffCtRMnZuamm27yPjN8+PC0aekc2WEq8FdqzVRgn3rqqVKDhmkXZn1o7HgZ6FGEQDAFNGbUiFHsu+++FX5fuNGwAaDrL05l6MwOpQcmUwWM2aFDh6SKopE7DKbPMAVNfXb06NFeXzA1V5wEDJSgguk7wborIFguLPivxsfk5Evj+eI0TmNudEuQE5yWW1WTBz2fQtwETg7Pn4k7jL7DiDpigfeDzzWhXErCa2k2PUbZbKoEVTRNBfQYw6AL91E3XdCzMq4nN03kQQ8FBl7OUta4XPLWhakTxA/TowIIEaakdddd1y9Aa5aKVaFCKsx6ALOVAqL+1b3oBgwTFcx/+En7mfTs2dP7DMy1Kd1XmRVL1Baw6vk0N1fV1bt376B1mwcNXHX3Be666y6p+PiNAzMwjblB36OEiqJrqpQgyOzpp5+WgYr05E0/q0zUYBTMTfWsMVCCVGac6Ny5s2QyWM9AK8iO0ILnZBAmFEXqcgwYtx7G5ObLghJoe+21l2y4iHeJ70LQq5ahImmQ+tZ9gkJLEVmLBUVnCKhVQDZMkNxgfv7UgdG4zj33XHno0YNVtc+O1t08Csi2cvzTlY14LY37g1E2J1KC6CZP2zv069fPy6LS50NdT3B/hG2cTOvJTRN50IPDxMtZyhoWeVtSv0C62znnnFMRlOa6bqB2B/8gbT4Yxgj0ZalNHUTtB6UFQwhmWMGVQwmq8gUDWibAAue/4lRR1ZKlSVEBGRA+JsSKcWhnbLy3hGtknEmiX/pnYZVSwIkeabUKagOLq3SBgKmgpicmLXiuAVY3mi0SJAzrYExuviwoHvTLNgFgUVGB9zHHjIMyXFpUqQmzOjI+f9qYwWIUD1AhDAtwEE444YQgC24sXkurBDHK5kRKEDY0BVjSlULmB7icDNaFez25aYJ7/g4TL2ctazKXtxWmJQQWPfjgg0HChj5YmQ4cFUdC0+MUYQdFusP9o7/glIKXXQmigXkQCijwhaaiPgpMaMr7hAkTvHGQCuoE1+MoOtlVss58AzjuuOO8QFZ1UoP2DyDeycT9Rt0bEVkUFQXvINyDlIs6GJObL0uUbgcNGiSVjUcffdRXGKP5LQ04TsGLboxnz+P5s0icKMbYjLy0abis0dkbvIBYl4ATdCmhspVYCWKUzYmUIJzUFTp16hQ6H3qqT3qIy1iJ4KaJYg0pQXF5OWtZwyFv/18xFZoYov0VUCsAroyU/l55HxQD3RIQFOmO3xu+4KaKCfJ8teiM7hewPGXKFI/IfT4/f9EL8nytVJmipmnHvNpogVEJombTRr/Pwo0HjBkzxhsLBbZoGn1c2qEB5xFZFI1xBX8djJkLXyoeVJsfAokpPvvsMxnThnTzGApI1rTG+fxZZY8WnJBq03BdqDWmcR7UkgI5ESNrqmRAN0ZKEKNsTqQEIYZQARmyDHsF13rmRRPc82dJqMlQ1rDI24I+KURTo2BVyMZqtACoEaOgKmhCy/OLdEdqXJ0oQZ6vFmZkKqh1wE8NX+iwYcOkz9Kno6+0ENGgaZx+iQXJiVBG0lSRTsMgVZ/FpqUIFGm2aixYxwCkX+KeuLRDTag6rdCTqYnCUgdj5sKXqvYKKjH7nc4AZFxRdybSY3NUgrien5UHHC1jFPXBEp7gU2WwxaFbRtmcSAkaP368d7+SHyrrSp8PLclRA+uZN0249aQEZShrWOSttGbMmDHDu2nAgAFRpdGNFoA+sPLjwvzlBwRL5awEpUmR98ZGEB9OqLTWQRBgksN6q1oX6qL++YD6MRzIdAOABUtp47QEOo36R1ptEiGqF9Tq06dPoNkzTPDXwZjcfCnHPv30033nTAumIcuPxoiEWGGypjXO52c/CEybNk3+G20GyIFGJkDUkhLEKJsTKQ4jRoyoet/Kva4Da1wvShADTdSLEpS1rGGRt3JQFbMBIDgpwhVjpATRFPLTTjvNuxdEDhcQzQiAvzRnJSitklERvwBihxkXjf2QORFWLRMmQtpOgpYrJ0wSZY7ntATNdgzrqyCVGUC9By1A3FMQobknEaKgE2QMIDtCK4PupWubKiw1OiY3X3o0C0sLTk6gxTlz5shMPlhbaID+KaecUnU6T+B2TSS4mZ6flQcQyO1XG8vw/Zu4P8pJlSBG2Wy6pnKzVPIDGDJkiPcZ1IVpaGiomA+tA1UD65knTWSpBJWZlaCsZQ2LvE2yQEZK0NChQ7378G86SfgIVWVkNFajaZF1pAS5SpvXL2R4QSlCQBjiYWDCpaBVV+EX9Um1L8dRvphigqIKMFZ9VsX+QJjp2jjqBKnaQSmFqN/83CQKS42Oyc2XUTFl3qkVQFq6wiabbJJGeHILbg4lyJgHlOKGwn8p3n/FO8LhKiToW61JicijWHTLKJtN11TKsyOPPNK7f9SoURX3oxKwKhgICyFtP1QD65kXTZjQehyFj7vTQNayhkXeuoxaqNTuabEi6gsFU6liXbCCaOnl9aAEFUxjiaAUUZMvTS2kpmn4TqNOvbROA+oLORllh0FTR6yAponHOnmrui7au5T3obYHFQgZKUFF09NvHYzJzZeRwonyrNp44IcnQf5uEypBLrcSBB7wqTsSiwcUULPIkF6qMo1QWwWdvP2K5KGOEio803Y0BnEQ3LI5iVwp77LLLt79yJZV9yHoVdVFw6lfaxhaC+uZB02YHBJch2RXqgr+CrDE4N2nUISaStawyFtOYSOVhL59+3r3PfLII/I+aOE0CA6lzzMIHsxbCZKCBKngAXWCGhyfSps4YdFsF/V7agpGtcyQRquSoGjZ9DvvvDOzOkG05gLenWPQJFFF+msMKekAAXF+wieBEtAYFJuVQmGppTHzVAJ0l6qkVapgqyBETdFu1kpQSN2RWDyADTvAOhu7ei825KDaKnomKvpqYaMzsI5wy+YkcsWlsYMq5gcHx6lTpwbV0RE1sp7cNGFkvcQegxYYWENax04H3E9O/lnFaWQNi7zlFjZlWmEUZlUE/aIypgL80o5PtlSNBkbT+Bv5ElWLCOXe0nqaKK3cqxFEAw9xKlG/R/YAjSEaOXJkYLHErl27VvRu2X333TOxBOk1F1CjwzHoTgygrL7P+yrrga4plSD9fTRmoLDUyph5KwE6yjSGS+GZZ55pEUpQzE7voTyg9eAyfa/ycKW6ksOCilMxGkVGAZlUiL2IWS+JUzYnkSsuXF4KqAOE+aD9Scr55LWenDQRi9bRSQBVq4O6wevvgVbxd3jry2Ula1jkLbewqXDbIEWQ9quZPn26XhnZZbDccKTIV/SuoY1CwbwILNxggw0ks4GBwNy9evWSaX80CwyZD3QspNFTIH4G0e6woiAVH8WkUJeIKkAICEsbE6QsNDG7XIcyO2ojOQH9kPwqpWYQExT3tFYvYza1EiTHoQUKfTagZqcEZcUD8+fP12uDJbIuKpmCrC3ISPQMpK4lBDLj0EVlj8Ibb7wRi8YYZXOSNfW6jgOoHk0VspkzZyadT17ryUkTkd+B/YVWVleeBli1lIXFkLbzUIJMZQ2LvGVXgkBwfoDLR0sVFAkD0RK7fJJCX+TBgwcbj/Hwww/rLi+p6NBOulFAumXHjh1T125RVVn1mgshPWF81xVMBQZzAvohoftwUiUoxTty62zMmlCCaNCsOkU6ydPja14JUo1+0/IAXElOBplbynIRJDvV59q2bSuzUWnLibg0xiibk8gV188qACAzTMsONJlPXuvJSROR30EP17DwINYGRRhxH/YJv/eAGJxaUIIMZA2LvGVXgvB72s4eQKpcmzZt0gaP1oIS5Lm50BAPQXtRALHCIuTjNvPaTIwdOzbSf43ATa2ZZJK0ZWmhCeoXhN+buALguw9hdtnWQKcFqwTVnBIkaQJpyRQ4Oaegs1pWguTzBvWoMuUBuFlM7g9y36j2Cn7QLci4WrVqJZMu/CwZYTTGJJuTyBU5NkIEKFC8UTvomc4nr/XkpIlYexreJSxaeuNt2paDQovNagp3mKmsqV8lSJ2yVBwM3ENOcJpePSlBLo18b9eunXRXwY0F7RuZUDAJgzgRGAd3V5cuXYLS2isi6Lt16yZuuOEG6V6DcoUAN5isEcCIVFJSUDFNqmNBfR4+a5y4wPT4qfmwYwWFwiIWxewTJ060SlBtK0GSJmimDrDlllvmVVsk7+fPjAdwcNEsFoUEc/Tmg80Z8wDvI/MSCgoOW2Gm/+7du8vPxKUxJtmcZE3l2JMnT66wAEGmppxPXuvJSROxrE2tW7f2fQaUBIBshrsMzw5LnKaY5REYnYWsYZG3Jce8EafJZ0oxfHbFFOPH1jaZLjWfYoox6PMXMxjDFMWE40eta8Hw/hLTOyvV2Zh58GUsIZchD2YpNzien4MH3BRzLBrwfSHifaXhsTSy2XRNOeeTx3py04Tpnub6Ha4z2j+aStawyNuCwSaW5DOFBIufZE6xrB0MV0H7Htfgs27A85iM4yZcE5NNoJhgXYsJ3kOB6Z0V6mzMPPgyDc8kpbes5AbX82fNA4WU9xcNZWccuVHIWTYXDefPOR/u9cyDJpKuVRLazks+ZKlPJJW3idovmHxGvzfOdySZk8l8016mz+smeJawcdKuR1ZrbvoZE1pI+85KAUxUD2Pm9T6cHHkwrdzI4/mbgge4Zacpj2Utm2tpr+BezzzWKOm8uPfUvGRNZvL2f8YHJU8cMPKfAAAAAElFTkSuQmCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVmlkZW9QbGF5Z3JvdW5kL2ltYWdlcy9mdWxsc2NyZWVuX3JvbGxvdmVyLnBuZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDQwMTEwMgAwMDExNjEwADAwMDAwMDAwNDIzADExNzIxNTI3NDYyADAyMTIwNQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG5vYWhyaWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZW5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJUE5HDQoaCgAAAA1JSERSAAAAFAAAAA4EAwAAAN3qIcMAAAABc1JHQgCuzhzpAAAALVBMVEX///8zMzOjo6OZmZmFhYV1dXVmZmbMzMyzs7Pv7+/n5+fg4ODBwcH///9CQkJoRsgrAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9oDHQ4OEv0GEbcAAABfSURBVAjXY7jAAAW8DHyCUPCAgTENCgQYGEOhAMh0gQIg0xgKgEwlKAAyO4AgEWhCAgPjGSCQZGDgAoqWA4HUqlWrgMzdQCAO5AKZlTNnzhTq6GgSYGADWfoQbDHCOQC3WSNUFVckYgAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZpZGVvUGxheWdyb3VuZC9pbWFnZXMvZnVsbHNjcmVlbl9ub3RpY2VfemgtQ04ucG5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADA0MDExMDIAMDAxMTYxMAAwMDAwMDAyMDYxMwAxMTcyMTUyNzQ2MgAwMjE2MjQAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABub2FocmljAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVuZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiVBORw0KGgoAAAANSUhEUgAAAaYAAAAoCAYAAAC1vF4fAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAIQlJREFUeNrtnQWULMUVhjvB3SHBEtwtJGiAIbi7u1uAwSFYeLjb4pLGJcGtcbdBE2RJcFl4wOL+kM776rzb505NdXf1TM/MLmydU+ftG+npLrn/lf/eCoJyW8/IPnxkr43slWCoDbXONll/vSN7NLKHv6B1OBCf/ZcqD3znIu9zlVGvRQNgTvW9dnVtFR2U60b22OrVIVk51DokSLlevPrqq8crrbRSvOqqq8bzzTefrMNKgfsZjEK0x7H3ijx7p+4p+gUA1HWec9EzwQQTxGuuuaZZr/w79thj689VRhtttHittdYy77Oup5xyyk7NqS373+R3Z5hhhq7L90rBhW4+P+2008aPPvpoPP/88w+B0y9bi85TanoWXnjhePfdd4933nnneN99943HG2885+YtoKXxufjFF1+Mpe22225yzbBEIWqPaTO97HkYfuihh8ZvvfVW/Nprr8UvvfSSfo6wS2vvY37/pJNOihdccMF4zDHHbAdYljEXZc6ZkYP77LNPfNNNN8U33nhjfOSRR6bNxXDG5Pvvvzdr9Ysvvoh/9atf6c/R476+vmQ9TzfddJ2Y0wp7kc79TTrppPGvf/3rePbZZ4+/++67+PTTT7fnsqPyPRx99NHjE044IT7ssMPio48+Ol5kkUWyBiWcbbbZ4rffftsM4DvvvBNPM8003bj5MhfqYHcDZWlutTZu4FrG78o6GL711lvHuqnFHur7R6tUoJUl1Jjz+K677kquibapQCZXiA4bNiw+4IADMrVcXttmm23ivffeu+nOXilZQPcC7tL++9//2gDbFcV2tdVWS+7pqquuKvuesqzEdvasOTNgcsoppyTPfcUVV6Q9t1mvH3zwgfkcCoX1OXr89NNPu/ZIO+c0/Otf/1q3NyeaaKI4iqLk/3feeWc8/vjjdwWczKB8++23yc2ss846WYMSTTLJJEZTk/bMM890+uZ7urAQB2ozgmGrrbaKwzCMTzvttPiII46IDzrooHj//feP99prr7harZbe99xzz3i//faLDzzwQCPk2aAXXnih+V1rPHvXWGONZK18+umnLkslnmuuucyauuCCC3yEmlmzN9xwQ3Ld5ZZbzmcjm99aeuml4x9//NF874wzzkj7PWOVIfhbaRtuuGHZmm+03XbbJdd/7LHHug1MEVr2s88+m9wTFoFyRZWxr8xcsL7b3ZCDnhaoWYN///vfk++eddZZ+rt9CnT6eW348OHmc6+88or+XL+8/+STTybXwlhQ77dLiY623XbbuudHMTz77LPrXgOomONOy0kzwO+++25yI2zcjIVuNIUZZ5wxfv/995Pv3HzzzTF+0g7dvFmoZbUB4AppSevh3g8//PB4ILRrr73WHs9oySWXTN5/9dVXbUEaTj/99PGXX36ZfGa99dbLU3LMmr3++uuT7yy77LI+wjm0hQnNspyqWst94YUXks/df//98X333Zfb33jjDRcwRR4KRughgKINNtigTqPNASbf6zbTGCvjprXbqaeeWiZg9nYJmHLXEkqatGOOOSb5Lm5rFIiNNtooXnfddU1c6ZNPPjGfe++998z/7Q5gSVt77bWNF4C9sMkmm8Q77bSTsUpLlq/RZpttVvf84mLk9REjRiSvo3x2Wk5G9gZcYIEF8ha6eX+hhRaKv/766+R7lvbZzpvvbRMwRYMQmMz8sSkGQsPXbrspcA1Le/75551ujH/84x/JZz766KN48sknz9qELQGTxAak/fDDD3astCK/wf06tNjMroHPE5gqBaz4CKEl7ZZbbslav0Wu2xQozTTTTPFXX31l7oUYysMPP2z+RqgpOdKqF8XMBRa5tF133dWEHMrqgEVBYDJjC2BIY97lu8QAy248f8nyNVp//fWT6xNX0mtEu+CZz1lmmaWjctJMOu44aXPOOaeO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npN3T1F6T3s33XGd8EFeiV8jZZFSf+NgZ9CVM59YY4y4gIAzmWvTcCG6NMeNM4ijt+Am63l5Y4UGNFcWvfRGXLugIyu+d7COLmRH6AjHXUE5pc8uZUmVHolwvIIqSoem49nwU+yQtvo7ovXQAY2GBs8JC7yXLQ+a0khRmcmAlbTdfvvtYrFfeeWVZLLJJstCfjTjjDOK+3/99ddUoWSZfDZ2u+22E5+///77bS+96qqrJnfccUfy3XffJX///Tf7e8899yTrrLNOUTepsuTxv//+S3755Zfkyy+/TB599NHkzDPPTBZZZBEdJUCJmzHWfPPNl5x33nnJ66+/nowaNSr5559/kp9++il5+eWXk9NPPz2Zc845s8YcUTVuXnrpJSV+fv/992TYsGHJk08+yd5vxRVXzMLPiOmnn57dz6GrqytL8EbTTDONuPePP/7oBL1UjuuLLrooue2225Knn36aPf+bb75hNIP3//fff9k1duzY5Icffkg+/PDD5OGHH07OP//8ZN11182jTWd873AdO11anFXOOzZwkFjLx1t99dWTa6+9NhkyZEjy559/svfGWmJdzz777GTJJZc0kSVVGzSYWzL55JMnu+22G6N/vNfo0aOZLAN9vvvuu8kNN9yQbLXVVsmkk06a914N/n0Yhsl1113HaHnMmDHs78CBA5MtttgimWSSSWzxEzukLUYzWDsOSy21VCqtg584QD5Y0Cl73l9//SXGIfjkY0TTTjut+B5yWPGcCHzKAWulei+H5f3MgFp88cWTPn36JLfcckvy9ttvJz09PexdQCeQH5999lnyxBNPJBdccEGy2mqrOeEB5uqdaaaZmLLmcO6552YxQbzccsuJez/66CPXQmk0COHbb78V3y2zzDLsOywmhDwEeRpAoBdgYO2SR8wBCzXzzDNr72wbjQZTQFkAYjviiCPSxuyuGjdDhw7VXlMoWBhwindhdAeBR2HTTTdNU6jx/PPPL+4bMWJEJ+iluzfQYRq88847ySqrrJJGR0753tE6droSJ6ucd7RLgyYPsCG488478zYzdTBomPEBAwzGhg7AEF9++eXT3ouNt8YaayRvvPFG5jh43vrrr2+Dn9ghbTGaue+++8T3+++/fyqtU0ND2vjHJjT6888/i3GmnnpqeYx4oYUWEt9/9dVXqufESyyxhLgHMlz1Xg6r4SKb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flsIibuT0hYo/YeKuMd9n0OEI4n1TTDubj914M0aa6zBJwFVnnjiiTR44JIKENAwefrpp9kyyywTS79F9ZsIG31t4qKLLuJEy09AbA444AB+H8YIBD1I8IwzzzwzFDeXX355HjiJkoceekgmin7YSa1fyvmdcs6jsDt21llnuX/HB02EDXFSd/PNN7u/GT58uPqbsuOAr61fffXVkXpdaaWVwvRKZSfUfIsa7+v+vuSSS3I7CBN8OCMIYGnah5OGKDr4GnrmmWdik5Z33nmHA0vCpf6a+DsUhGiwEHwZ4itYjYAMGDAgcclEfMWts846dR8AsiAKHUfwNd6pU6csyqLMcbfVtI7OnTuzWbNmJRofgBF+p/SJg9XJJ5/Mo6hxBF/Mffv2TQPwjm5HzKDfMhP3pP6TNVUm6ftqRDiSWN8E417ViTeIMvkJVq8Sfmi5k+vEiRNjtU8lk34kpch+ExH3Oh0jEhqnD4j0jRw5MvJe4CKikIqtcn0svfTS7I033og9dq+88gonCwFpZpT6pZ7fLcpgAIXdrbbaanxVAwKyuf7664e1u4bVaXnOxMqyasMlx4G68cW8HUfeeustbqsB4+Powu+MfEs7X3jqqadite+bb76RP1acIok7B4oLLrjAE4m45ZZb+NcFIgNQNKJtl112Gfvpp5/c++68886kS/386t+/Pyd9QrBUsuaaa9bdt8EGG/C2CEEUGEstXbp0YUsttRRPDwHo7rnnnuyBBx7wfCEOHjxYftZMP0KG+++77z628847c+NDP7HM6TiO574My9mxxiNlDhyPHAwbNsx9LpafTjvtNLbJJptwvcEJEQUCwbr00kt5hFQI9KtGShF9kscQzoaow1prrcUnEow1iPqHH37oiboqYFUpA3HPoN/EOe45Evck/lOlss+Y7xtKiCN5E/dKHniD1S6kSoCw4Tn77ruvmroWx3e431911VWeZ48aNYrbNuwcUTU8+/XXX486C6JWhn7rIu5ief+mm27iq4ywP5CCc88912PPYrUSxOviiy9mXbt25W1dd9112cCBAz0Re6QcKrbK9QE7l+XFF1/ky+5IoQAG47/HjRvnuWfQoEF+8wqlfh0N8zsFB6H2N8+HF8YuoN38vfvvv79775dffqmmfTYCDtSNL1JZhS0fcsghbJVVVuG2go+S8ePHe+697rrr/ManohO/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U5l405MCrcDWKQjnIU/ut99+E5+33nrLveyyy8R/JR1++OFainKTTTbxvoO2SwsvvLD8TqvmmIXALr/88u4rr7ziPfvPP/+4p556qm5KRWiLmF133dUdPny4+/XXX7t//vmnKBB69NFH3d133113U4nxLbDAAoIntm2777//vjtt2jT3r7/+cn/88Uf3k08+cR9//HH3hBNOcBdaaKG0XuusQbWYD7xPPXr0cB944AH3o48+Eqks4Dnm8/bbb4tipD333NOde+654+bjKZxSqeQOHjxY8GfmzJniv7feeqvbtWtXd6655krCF9syKNq0/Ck43rg6d+4s1m3KlClCBrBuU6dOFf/WpUuXKDkw2j9WshQgMc5FFlnEPeqoo9yHH35YtDBDu0Z0hkAY/osvvnCfffZZ95RTThFdI6IOrhm0V6zF+NLKZ9weMm0pZUcBTW4Kk+PNNttM7C/wH3z/+++/Re7zgw8+6O62225pImaJ9hkT/+ykwHTbbbcVexj6F/saOvmFF14QcqMBqrn0oMNo58R+WWKJJdyTTjrJfeqpp4Segl3FWqMgHroGY1LXG/vuzDPPdMeOHStsHXQcvvfOO++4gwYNcjfddNMs9FzgvDfffHP3/vvvdz/99FMhp9C7Q4YMcTfccMMqgLTPPvu4I0aM8Nnnhx56yN16663Dxppm3X7Gf998801vzFRWonDOoYce6n0HfNA4uNmM9jZwffDsQQcd5A4bNsz95ptvhIzgd19//XW3b9++7nLLLWe03mTc3O8L3L877bSTWGvYD6z9t99+K7DaXnvtlUTH5Aa0qlqnrLTSSkKAVXrkkUfc008/3fv/UE4x7xCK8rrrrvO+c9ddd6mhzLgxCwZjs2EDSoLBhoAZMDGwRcyll14aaRygtKDAIgRBjK979+7uV199pWVwwFuAuBTAOktQLeazzjrrCMCrQ++++6670UYbRSq4rbbayp00aVLk7+B922+/vSlfnISgTMgDiqqgxOLovvvuo4dBOjaj/ZNgnQT/cFibPn261hy/++47d+edd04E6hplfAzyGbeHTFtKOTUC1QJkzTfffAIY/ffff7H6TCkiLCfVOSlAtZNApxkBUxzwANKiCE4OODii9AOTHnQY7Zzbs2dP7b2GfuEoHoXTAiAniiA7kCE8HwAik+q5qnmfd9554rAdRABOe++9t3gO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LI99SfhYK0T1VCrLSIW0aDUqhDY3kvW2FF48PHkfeSO9LZh/3/Pvms+Z88xyZuace2aed87ncz7xPvc998ycc67r+l3X77quIJjemL1tzt82J7fN8LY5Ctod+v1ELd9T195NV+9pGMMYxiBHBrk2jGE9h7Eq24y9fHlxxhzVePFZs2gxsoRE3v3ELSzqbEfuo+v3NAgdP9OXIJvGvQ+CeJAjXbgfl3t92M/dsSu6vJYD+Jmuod8lm7GXY36bbbaJb7rpJjUPPvhgeXlhyffOLHjxNouRt3DX8d9f//rX6n5+9rOf6X8La26WusJg/oADDlD3sXLlyvjpT3961fvo0noNw7GCu9Od7hTf+c539jK5tidBNlvx3LqYo56ucRVDxFqOPOUpTxnkyHTuZ3bYz93YX29605ts17PPslXd/x3ucIfkt4Y9MxW95cJm9K0DOuW5M2908oQnPCGWseeee8rLiwruh+/H++yzTxyGYeF87nOfm7cY8y9+8YvjG264Qc299tpLPreC//7hD39Q93P66afrCxrZvKuHPvSh8ete9zqrueGGGxYd0gmfkbH++uvb3oeL9crbUHXWqwv7bil51Xgn8VVXXRX7GlzbkSALss4d58vnPOmkk6rev2/vX5X91sR4LJUjD3jAA6YhR8qet44c6ZtcU+fU1fB0HpfqSK3n7rvvbruefZat6v533XXX5LcA/x3YM13U41XpO2pffOlLX1L24vLly3WQ1dRmNG1b7mVZAx0wdm3fzN7//vdXXmgXc7XVVjOVVaQfVjawxcvjAePZ2dnSA/ee97wn73qTl73sZcnnHv/4x8vnFvQF/fKXv1x1Qedf+MIXWgsE7XmzDmmkK+811ljDVlHGG2+8ce012nzzzYuMijrr1WWP8agjwqyKQJtMWVG5XNsJisn3uOiii6rc/+wGG2zgTMaZc6ONNqq63+b33nvv+M9//rPVPProo8uMipQc0WRwNIXzl/e8VeVIH+XaxBMI8OFw6atxmCcz665nn2Wrun8dBGy33XZt75lp6fGZqvf0mMc8Jt55553jZz3rWfFd7nKXMnml9sXXvvY19V5//vOf67/d1GYU4z+S76277roxzrJPfOIT8de//vX4V7/6lQIfEtn617/+Fc/Pz8e/+c1v4m984xvxUUcdFe+2227x6quv3uS95CskBKir8chHPtJU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b2JqZWN0VG9FeHBvcnRUbyB8fCBnb29nLmdsb2JhbDsKICAhKHBhcnRzWzBdIGluIGN1cikgJiYgY3VyLmV4ZWNTY3JpcHQgJiYgY3VyLmV4ZWNTY3JpcHQoInZhciAiICsgcGFydHNbMF0pOwogIGZvcih2YXIgcGFydDtwYXJ0cy5sZW5ndGggJiYgKHBhcnQgPSBwYXJ0cy5zaGlmdCgpKTspIHsKICAgICFwYXJ0cy5sZW5ndGggJiYgZ29vZy5pc0RlZihvcHRfb2JqZWN0KSA/IGN1cltwYXJ0XSA9IG9wdF9vYmplY3QgOiBjdXIgPSBjdXJbcGFydF0gPyBjdXJbcGFydF0gOiBjdXJbcGFydF0gPSB7fQogIH0KfTsKZ29vZy5nZXRPYmplY3RCeU5hbWUgPSBmdW5jdGlvbiAkZ29vZyRnZXRPYmplY3RCeU5hbWUkKG5hbWUsIG9wdF9vYmopIHsKICBmb3IodmFyIHBhcnRzID0gbmFtZS5zcGxpdCgiLiIpLCBjdXIgPSBvcHRfb2JqIHx8IGdvb2cuZ2xvYmFsLCBwYXJ0O3BhcnQgPSBwYXJ0cy5zaGlmdCgpOykgewogICAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwoY3VyW3BhcnRdKSkgewogICAgICBjdXIgPSBjdXJbcGFydF0KICAgIH1lbHNlIHsKICAgICAgcmV0dXJuIG51bGwKICAgIH0KICB9CiAgcmV0dXJuIGN1cgp9Owpnb29nLmdsb2JhbGl6ZSA9IGZ1bmN0aW9uICRnb29nJGdsb2JhbGl6ZSQob2JqLCBvcHRfZ2xvYmFsKSB7CiAgdmFyIGdsb2JhbCA9IG9wdF9nbG9iYWwgfHwgZ29vZy5nbG9iYWwsIHg7CiAgZm9yKHggaW4gb2JqKSB7CiAgICBnbG9iYWxbeF0gPSBvYmpbeF0KICB9Cn07Cmdvb2cuYWRkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uICRnb29nJGFkZERlcGVuZGVuY3kkKCkgewp9Owpnb29nLnVzZVN0cmljdFJlcXVpcmVzID0gITE7Cmdvb2cuRU5BQkxFX0RFQlVHX0xPQURFUiA9ICEwOwpnb29nLnJlcXVpcmUgPSBmdW5jdGlvbiAkZ29vZyRyZXF1aXJlJCgpIHsKfTsKZ29vZy5iYXNlUGF0aCA9ICIiOwpnb29nLm51bGxGdW5jdGlvbiA9IGZ1bmN0aW9uICRnb29nJG51bGxGdW5jdGlvbiQoKSB7Cn07Cmdvb2cuaWRlbnRpdHlGdW5jdGlvbiA9IGZ1bmN0aW9uICRnb29nJGlkZW50aXR5RnVuY3Rpb24kKG9wdF9yZXR1cm5WYWx1ZSkgewogIHJldHVybiBvcHRfcmV0dXJuVmFsdWUKfTsKZ29vZy5hYnN0cmFjdE1ldGhvZCA9IGZ1bmN0aW9uICRnb29nJGFic3RyYWN0TWV0aG9kJCgpIHsKICB0aHJvdyBFcnJvcigidW5pbXBsZW1lbnRlZCBhYnN0cmFjdCBtZXRob2QiKTsKfTsKZ29vZy5hZGRTaW5nbGV0b25HZXR0ZXIgPSBmdW5jdGlvbiAkZ29vZyRhZGRTaW5nbGV0b25HZXR0ZXIkKGN0b3IpIHsKICBjdG9yLmdldEluc3RhbmNlID0gZnVuY3Rpb24gJGN0b3IkZ2V0SW5zdGFuY2UkKCkgewogICAgcmV0dXJuIGN0b3IuaW5zdGFuY2VfIHx8IChjdG9yLmluc3RhbmNlXyA9IG5ldyBjdG9yKQogIH0KfTsKZ29vZy50eXBlT2YgPSBmdW5jdGlvbiAkZ29vZyR0eXBlT2YkKHZhbHVlKSB7CiAgdmFyIHMgPSB0eXBlb2YgdmFsdWU7CiAgaWYoIm9iamVjdCIgPT0gcykgewogICAgaWYodmFsdWUpIHsKICAgICAgaWYodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgIHJldHVybiJhcnJheSIKICAgICAgfQogICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgIHJldHVybiBzCiAgICAgIH0KICAgICAgdmFyIGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7CiAgICAgIGlmKCJbb2JqZWN0IFdpbmRvd10iID09IGNsYXNzTmFtZSkgewogICAgICAgIHJldHVybiJvYmplY3QiCiAgICAgIH0KICAgICAgaWYoIltvYmplY3QgQXJyYXldIiA9PSBjbGFzc05hbWUgfHwgIm51bWJlciIgPT0gdHlwZW9mIHZhbHVlLmxlbmd0aCAmJiAidW5kZWZpbmVkIiAhPSB0eXBlb2YgdmFsdWUuc3BsaWNlICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiB2YWx1ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSAmJiAhdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKSB7CiAgICAgICAgcmV0dXJuImFycmF5IgogICAgICB9CiAgICAgIGlmKCJbb2JqZWN0IEZ1bmN0aW9uXSIgPT0gY2xhc3NOYW1lIHx8ICJ1bmRlZmluZWQiICE9IHR5cGVvZiB2YWx1ZS5jYWxsICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiB2YWx1ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSAmJiAhdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSkgewogICAgICAgIHJldHVybiJmdW5jdGlvbiIKICAgICAgfQogICAgfWVsc2UgewogICAgICByZXR1cm4ibnVsbCIKICAgIH0KICB9ZWxzZSB7CiAgICBpZigiZnVuY3Rpb24iID09IHMgJiYgInVuZGVmaW5lZCIgPT0gdHlwZW9mIHZhbHVlLmNhbGwpIHsKICAgICAgcmV0dXJuIm9iamVjdCIKICAgIH0KICB9CiAgcmV0dXJuIHMKfTsKZ29vZy5pc0RlZiA9IGZ1bmN0aW9uICRnb29nJGlzRGVmJCh2YWwpIHsKICByZXR1cm4gdm9pZCAwICE9PSB2YWwKfTsKZ29vZy5pc051bGwgPSBmdW5jdGlvbiAkZ29vZyRpc051bGwkKHZhbCkgewogIHJldHVybiBudWxsID09PSB2YWwKfTsKZ29vZy5pc0RlZkFuZE5vdE51bGwgPSBmdW5jdGlvbiAkZ29vZyRpc0RlZkFuZE5vdE51bGwkKHZhbCkgewogIHJldHVybiBudWxsICE9IHZhbAp9Owpnb29nLmlzQXJyYXkgPSBmdW5jdGlvbiAkZ29vZyRpc0FycmF5JCh2YWwpIHsKICByZXR1cm4iYXJyYXkiID09IGdvb2cudHlwZU9mKHZhbCkKfTsKZ29vZy5pc0FycmF5TGlrZSA9IGZ1bmN0aW9uICRnb29nJGlzQXJyYXlMaWtlJCh2YWwpIHsKICB2YXIgdHlwZSA9IGdvb2cudHlwZU9mKHZhbCk7CiAgcmV0dXJuImFycmF5IiA9PSB0eXBlIHx8ICJvYmplY3QiID09IHR5cGUgJiYgIm51bWJlciIgPT0gdHlwZW9mIHZhbC5sZW5ndGgKfTsKZ29vZy5pc0RhdGVMaWtlID0gZnVuY3Rpb24gJGdvb2ckaXNEYXRlTGlrZSQodmFsKSB7CiAgcmV0dXJuIGdvb2cuaXNPYmplY3QodmFsKSAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiB2YWwuZ2V0RnVsbFllYXIKfTsKZ29vZy5pc1N0cmluZyA9IGZ1bmN0aW9uICRnb29nJGlzU3RyaW5nJCh2YWwpIHsKICByZXR1cm4ic3RyaW5nIiA9PSB0eXBlb2YgdmFsCn07Cmdvb2cuaXNCb29sZWFuID0gZnVuY3Rpb24gJGdvb2ckaXNCb29sZWFuJCh2YWwpIHsKICByZXR1cm4iYm9vbGVhbiIgPT0gdHlwZW9mIHZhbAp9Owpnb29nLmlzTnVtYmVyID0gZnVuY3Rpb24gJGdvb2ckaXNOdW1iZXIkKHZhbCkgewogIHJldHVybiJudW1iZXIiID09IHR5cGVvZiB2YWwKfTsKZ29vZy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24gJGdvb2ckaXNGdW5jdGlvbiQodmFsKSB7CiAgcmV0dXJuImZ1bmN0aW9uIiA9PSBnb29nLnR5cGVPZih2YWwpCn07Cmdvb2cuaXNPYmplY3QgPSBmdW5jdGlvbiAkZ29vZyRpc09iamVjdCQodmFsKSB7CiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsOwogIHJldHVybiJvYmplY3QiID09IHR5cGUgJiYgbnVsbCAhPSB2YWwgfHwgImZ1bmN0aW9uIiA9PSB0eXBlCn07Cmdvb2cuZ2V0VWlkID0gZnVuY3Rpb24gJGdvb2ckZ2V0VWlkJChvYmopIHsKICByZXR1cm4gb2JqW2dvb2cuVUlEX1BST1BFUlRZX10gfHwgKG9ialtnb29nLlVJRF9QUk9QRVJUWV9dID0gKytnb29nLnVpZENvdW50ZXJfKQp9Owpnb29nLnJlbW92ZVVpZCA9IGZ1bmN0aW9uICRnb29nJHJlbW92ZVVpZCQob2JqKSB7CiAgInJlbW92ZUF0dHJpYnV0ZSIgaW4gb2JqICYmIG9iai5yZW1vdmVBdHRyaWJ1dGUoZ29vZy5VSURfUFJPUEVSVFlfKTsKICB0cnkgewogICAgZGVsZXRlIG9ialtnb29nLlVJRF9QUk9QRVJUWV9dCiAgfWNhdGNoKGV4KSB7CiAgfQp9Owpnb29nLlVJRF9QUk9QRVJUWV8gPSAiY2xvc3VyZV91aWRfIiArIE1hdGguZmxvb3IoMjE0NzQ4MzY0OCAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDM2KTsKZ29vZy51aWRDb3VudGVyXyA9IDA7Cmdvb2cuZ2V0SGFzaENvZGUgPSBnb29nLmdldFVpZDsKZ29vZy5yZW1vdmVIYXNoQ29kZSA9IGdvb2cucmVtb3ZlVWlkOwpnb29nLmNsb25lT2JqZWN0ID0gZnVuY3Rpb24gJGdvb2ckY2xvbmVPYmplY3QkKG9iaikgewogIHZhciB0eXBlID0gZ29vZy50eXBlT2Yob2JqKTsKICBpZigib2JqZWN0IiA9PSB0eXBlIHx8ICJhcnJheSIgPT0gdHlwZSkgewogICAgaWYob2JqLmNsb25lKSB7CiAgICAgIHJldHVybiBvYmouY2xvbmUoKQogICAgfQogICAgdmFyIGNsb25lID0gImFycmF5IiA9PSB0eXBlID8gW10gOiB7fSwga2V5OwogICAgZm9yKGtleSBpbiBvYmopIHsKICAgICAgY2xvbmVba2V5XSA9IGdvb2cuY2xvbmVPYmplY3Qob2JqW2tleV0pCiAgICB9CiAgICByZXR1cm4gY2xvbmUKICB9CiAgcmV0dXJuIG9iagp9Owpnb29nLmJpbmROYXRpdmVfID0gZnVuY3Rpb24gJGdvb2ckYmluZE5hdGl2ZV8kKGZuLCBzZWxmT2JqLCB2YXJfYXJncykgewogIHJldHVybiBmbi5jYWxsLmFwcGx5KGZuLmJpbmQsIGFyZ3VtZW50cykKfTsKZ29vZy5iaW5kSnNfID0gZnVuY3Rpb24gJGdvb2ckYmluZEpzXyQoZm4sIHNlbGZPYmosIHZhcl9hcmdzKSB7CiAgaWYoIWZuKSB7CiAgICB0aHJvdyBFcnJvcigpOwogIH0KICBpZigyIDwgYXJndW1lbnRzLmxlbmd0aCkgewogICAgdmFyIGJvdW5kQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBuZXdBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobmV3QXJncywgYm91bmRBcmdzKTsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIG5ld0FyZ3MpCiAgICB9CiAgfQogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBmbi5hcHBseShzZWxmT2JqLCBhcmd1bWVudHMpCiAgfQp9Owpnb29nLmJpbmQgPSBmdW5jdGlvbiAkZ29vZyRiaW5kJChmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICBnb29nLmJpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAmJiAtMSAhPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikgPyBnb29nLmJpbmROYXRpdmVfIDogZ29vZy5iaW5kSnNfOwogIHJldHVybiBnb29nLmJpbmQuYXBwbHkobnVsbCwgYXJndW1lbnRzKQp9Owpnb29nLnBhcnRpYWwgPSBmdW5jdGlvbiAkZ29vZyRwYXJ0aWFsJChmbiwgdmFyX2FyZ3MpIHsKICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIG5ld0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgbmV3QXJncy51bnNoaWZ0LmFwcGx5KG5ld0FyZ3MsIGFyZ3MpOwogICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIG5ld0FyZ3MpCiAgfQp9Owpnb29nLm1peGluID0gZnVuY3Rpb24gJGdvb2ckbWl4aW4kKHRhcmdldCwgc291cmNlKSB7CiAgZm9yKHZhciB4IGluIHNvdXJjZSkgewogICAgdGFyZ2V0W3hdID0gc291cmNlW3hdCiAgfQp9Owpnb29nLm5vdyA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCkgewogIHJldHVybituZXcgRGF0ZQp9Owpnb29nLmdsb2JhbEV2YWwgPSBmdW5jdGlvbiAkZ29vZyRnbG9iYWxFdmFsJChzY3JpcHQpIHsKICBpZihnb29nLmdsb2JhbC5leGVjU2NyaXB0KSB7CiAgICBnb29nLmdsb2JhbC5leGVjU2NyaXB0KHNjcmlwdCwgIkphdmFTY3JpcHQiKQogIH1lbHNlIHsKICAgIGlmKGdvb2cuZ2xvYmFsLmV2YWwpIHsKICAgICAgaWYobnVsbCA9PSBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfICYmIChnb29nLmdsb2JhbC5ldmFsKCJ2YXIgX2V0XyA9IDE7IiksICJ1bmRlZmluZWQiICE9IHR5cGVvZiBnb29nLmdsb2JhbC5fZXRfID8gKGRlbGV0ZSBnb29nLmdsb2JhbC5fZXRfLCBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gITApIDogZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXyA9ICExKSwgZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXykgewogICAgICAgIGdvb2cuZ2xvYmFsLmV2YWwoc2NyaXB0KQogICAgICB9ZWxzZSB7CiAgICAgICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50LCBzY3JpcHRFbHQgPSBkb2MuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgc2NyaXB0RWx0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKICAgICAgICBzY3JpcHRFbHQuZGVmZXIgPSAhMTsKICAgICAgICBzY3JpcHRFbHQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHNjcmlwdCkpOwogICAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdEVsdCk7CiAgICAgICAgZG9jLmJvZHkucmVtb3ZlQ2hpbGQoc2NyaXB0RWx0KQogICAgICB9CiAgICB9ZWxzZSB7CiAgICAgIHRocm93IEVycm9yKCJnb29nLmdsb2JhbEV2YWwgbm90IGF2YWlsYWJsZSIpOwogICAgfQogIH0KfTsKZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXyA9IG51bGw7Cmdvb2cuZ2V0Q3NzTmFtZSA9IGZ1bmN0aW9uICRnb29nJGdldENzc05hbWUkKGNsYXNzTmFtZSwgb3B0X21vZGlmaWVyKSB7CiAgdmFyIGdldE1hcHBpbmcgPSBmdW5jdGlvbiAkZ2V0TWFwcGluZyQoY3NzTmFtZSkgewogICAgcmV0dXJuIGdvb2cuY3NzTmFtZU1hcHBpbmdfW2Nzc05hbWVdIHx8IGNzc05hbWUKICB9LCByZW5hbWVCeVBhcnRzID0gZnVuY3Rpb24gJHJlbmFtZUJ5UGFydHMkKGNzc05hbWUpIHsKICAgIGZvcih2YXIgcGFydHMgPSBjc3NOYW1lLnNwbGl0KCItIiksIG1hcHBlZCA9IFtdLCBpID0gMDtpIDwgcGFydHMubGVuZ3RoO2krKykgewogICAgICBtYXBwZWQucHVzaChnZXRNYXBwaW5nKHBhcnRzW2ldKSkKICAgIH0KICAgIHJldHVybiBtYXBwZWQuam9pbigiLSIpCiAgfSwgcmVuYW1lOwogIHJlbmFtZSA9IGdvb2cuY3NzTmFtZU1hcHBpbmdfID8gIkJZX1dIT0xFIiA9PSBnb29nLmNzc05hbWVNYXBwaW5nU3R5bGVfID8gZ2V0TWFwcGluZyA6IHJlbmFtZUJ5UGFydHMgOiBmdW5jdGlvbihhKSB7CiAgICByZXR1cm4gYQogIH07CiAgcmV0dXJuIG9wdF9tb2RpZmllciA/IGNsYXNzTmFtZSArICItIiArIHJlbmFtZShvcHRfbW9kaWZpZXIpIDogcmVuYW1lKGNsYXNzTmFtZSkKfTsKZ29vZy5zZXRDc3NOYW1lTWFwcGluZyA9IGZ1bmN0aW9uICRnb29nJHNldENzc05hbWVNYXBwaW5nJChtYXBwaW5nLCBvcHRfc3R5bGUpIHsKICBnb29nLmNzc05hbWVNYXBwaW5nXyA9IG1hcHBpbmc7CiAgZ29vZy5jc3NOYW1lTWFwcGluZ1N0eWxlXyA9IG9wdF9zdHlsZQp9Owpnb29nLmdldE1zZyA9IGZ1bmN0aW9uICRnb29nJGdldE1zZyQoc3RyLCBvcHRfdmFsdWVzKSB7CiAgdmFyIHZhbHVlcyA9IG9wdF92YWx1ZXMgfHwge30sIGtleTsKICBmb3Ioa2V5IGluIHZhbHVlcykgewogICAgdmFyIHZhbHVlID0gKCIiICsgdmFsdWVzW2tleV0pLnJlcGxhY2UoL1wkL2csICIkJCQkIiksIHN0ciA9IHN0ci5yZXBsYWNlKFJlZ0V4cCgiXFx7XFwkIiArIGtleSArICJcXH0iLCAiZ2kiKSwgdmFsdWUpCiAgfQogIHJldHVybiBzdHIKfTsKZ29vZy5leHBvcnRTeW1ib2wgPSBmdW5jdGlvbiAkZ29vZyRleHBvcnRTeW1ib2wkKHB1YmxpY1BhdGgsIG9iamVjdCwgb3B0X29iamVjdFRvRXhwb3J0VG8pIHsKICBnb29nLmV4cG9ydFBhdGhfKHB1YmxpY1BhdGgsIG9iamVjdCwgb3B0X29iamVjdFRvRXhwb3J0VG8pCn07Cmdvb2cuZXhwb3J0UHJvcGVydHkgPSBmdW5jdGlvbiAkZ29vZyRleHBvcnRQcm9wZXJ0eSQob2JqZWN0LCBwdWJsaWNOYW1lLCBzeW1ib2wpIHsKICBvYmplY3RbcHVibGljTmFtZV0gPSBzeW1ib2wKfTsKZ29vZy5pbmhlcml0cyA9IGZ1bmN0aW9uICRnb29nJGluaGVyaXRzJChjaGlsZEN0b3IsIHBhcmVudEN0b3IpIHsKICBmdW5jdGlvbiB0ZW1wQ3RvcigpIHsKICB9CiAgdGVtcEN0b3IucHJvdG90eXBlID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnN1cGVyQ2xhc3NfID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcjsKICBjaGlsZEN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2hpbGRDdG9yCn07Cmdvb2cuYmFzZSA9IGZ1bmN0aW9uICRnb29nJGJhc2UkKG1lLCBvcHRfbWV0aG9kTmFtZSwgdmFyX2FyZ3MpIHsKICB2YXIgY2FsbGVyID0gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXI7CiAgaWYoY2FsbGVyLnN1cGVyQ2xhc3NfKSB7CiAgICByZXR1cm4gY2FsbGVyLnN1cGVyQ2xhc3NfLmNvbnN0cnVjdG9yLmFwcGx5KG1lLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKQogIH0KICBmb3IodmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLCBmb3VuZENhbGxlciA9ICExLCBjdG9yID0gbWUuY29uc3RydWN0b3I7Y3RvcjtjdG9yID0gY3Rvci5zdXBlckNsYXNzXyAmJiBjdG9yLnN1cGVyQ2xhc3NfLmNvbnN0cnVjdG9yKSB7CiAgICBpZihjdG9yLnByb3RvdHlwZVtvcHRfbWV0aG9kTmFtZV0gPT09IGNhbGxlcikgewogICAgICBmb3VuZENhbGxlciA9ICEwCiAgICB9ZWxzZSB7CiAgICAgIGlmKGZvdW5kQ2FsbGVyKSB7CiAgICAgICAgcmV0dXJuIGN0b3IucHJvdG90eXBlW29wdF9tZXRob2ROYW1lXS5hcHBseShtZSwgYXJncykKICAgICAgfQogICAgfQogIH0KICBpZihtZVtvcHRfbWV0aG9kTmFtZV0gPT09IGNhbGxlcikgewogICAgcmV0dXJuIG1lLmNvbnN0cnVjdG9yLnByb3RvdHlwZVtvcHRfbWV0aG9kTmFtZV0uYXBwbHkobWUsIGFyZ3MpCiAgfQogIHRocm93IEVycm9yKCJnb29nLmJhc2UgY2FsbGVkIGZyb20gYSBtZXRob2Qgb2Ygb25lIG5hbWUgdG8gYSBtZXRob2Qgb2YgYSBkaWZmZXJlbnQgbmFtZSIpOwp9Owpnb29nLnNjb3BlID0gZnVuY3Rpb24gJGdvb2ckc2NvcGUkKGZuKSB7CiAgZm4uY2FsbChnb29nLmdsb2JhbCkKfTsKZ29vZy5NT0RJRllfRlVOQ1RJT05fUFJPVE9UWVBFUyA9ICEwOwpnb29nLk1PRElGWV9GVU5DVElPTl9QUk9UT1RZUEVTICYmIChGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGZ1bmN0aW9uKHNlbGZPYmosIHZhcl9hcmdzKSB7CiAgaWYoMSA8IGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgIGFyZ3MudW5zaGlmdCh0aGlzLCBzZWxmT2JqKTsKICAgIHJldHVybiBnb29nLmJpbmQuYXBwbHkobnVsbCwgYXJncykKICB9CiAgcmV0dXJuIGdvb2cuYmluZCh0aGlzLCBzZWxmT2JqKQp9LCBGdW5jdGlvbi5wcm90b3R5cGUucGFydGlhbCA9IGZ1bmN0aW9uICRGdW5jdGlvbiQkcGFydGlhbCQodmFyX2FyZ3MpIHsKICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgYXJncy51bnNoaWZ0KHRoaXMsIG51bGwpOwogIHJldHVybiBnb29nLmJpbmQuYXBwbHkobnVsbCwgYXJncykKfSwgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzID0gZnVuY3Rpb24gJEZ1bmN0aW9uJCRpbmhlcml0cyQocGFyZW50Q3RvcikgewogIGdvb2cuaW5oZXJpdHModGhpcywgcGFyZW50Q3RvcikKfSwgRnVuY3Rpb24ucHJvdG90eXBlLm1peGluID0gZnVuY3Rpb24gJEZ1bmN0aW9uJCRtaXhpbiQoc291cmNlKSB7CiAgZ29vZy5taXhpbih0aGlzLnByb3RvdHlwZSwgc291cmNlKQp9KTsKZ29vZy5kZWJ1ZyA9IHt9Owpnb29nLmRlYnVnLkVycm9yID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRXJyb3IkKG9wdF9tc2cpIHsKICB0aGlzLnN0YWNrID0gRXJyb3IoKS5zdGFjayB8fCAiIjsKICBvcHRfbXNnICYmICh0aGlzLm1lc3NhZ2UgPSAiIiArIG9wdF9tc2cpCn07Cmdvb2cuaW5oZXJpdHMoZ29vZy5kZWJ1Zy5FcnJvciwgRXJyb3IpOwpnb29nLmRlYnVnLkVycm9yLnByb3RvdHlwZS5uYW1lID0gIkN1c3RvbUVycm9yIjsKZ29vZy5zdHJpbmcgPSB7fTsKZ29vZy5zdHJpbmcuVW5pY29kZSA9IHtOQlNQOiJcdTAwYTAifTsKZ29vZy5zdHJpbmcuc3RhcnRzV2l0aCA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRzdGFydHNXaXRoJChzdHIsIHByZWZpeCkgewogIHJldHVybiAwID09IHN0ci5sYXN0SW5kZXhPZihwcmVmaXgsIDApCn07Cmdvb2cuc3RyaW5nLmVuZHNXaXRoID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGVuZHNXaXRoJChzdHIsIHN1ZmZpeCkgewogIHZhciBsID0gc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGg7CiAgcmV0dXJuIDAgPD0gbCAmJiBzdHIuaW5kZXhPZihzdWZmaXgsIGwpID09IGwKfTsKZ29vZy5zdHJpbmcuY2FzZUluc2Vuc2l0aXZlU3RhcnRzV2l0aCA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRjYXNlSW5zZW5zaXRpdmVTdGFydHNXaXRoJChzdHIsIHByZWZpeCkgewogIHJldHVybiAwID09IGdvb2cuc3RyaW5nLmNhc2VJbnNlbnNpdGl2ZUNvbXBhcmUocHJlZml4LCBzdHIuc3Vic3RyKDAsIHByZWZpeC5sZW5ndGgpKQp9Owpnb29nLnN0cmluZy5jYXNlSW5zZW5zaXRpdmVFbmRzV2l0aCA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRjYXNlSW5zZW5zaXRpdmVFbmRzV2l0aCQoc3RyLCBzdWZmaXgpIHsKICByZXR1cm4gMCA9PSBnb29nLnN0cmluZy5jYXNlSW5zZW5zaXRpdmVDb21wYXJlKHN1ZmZpeCwgc3RyLnN1YnN0cihzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCwgc3VmZml4Lmxlbmd0aCkpCn07Cmdvb2cuc3RyaW5nLnN1YnMgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckc3VicyQoc3RyLCB2YXJfYXJncykgewogIGZvcih2YXIgaSA9IDE7aSA8IGFyZ3VtZW50cy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgcmVwbGFjZW1lbnQgPSAoIiIgKyBhcmd1bWVudHNbaV0pLnJlcGxhY2UoL1wkL2csICIkJCQkIiksIHN0ciA9IHN0ci5yZXBsYWNlKC9cJXMvLCByZXBsYWNlbWVudCkKICB9CiAgcmV0dXJuIHN0cgp9Owpnb29nLnN0cmluZy5jb2xsYXBzZVdoaXRlc3BhY2UgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckY29sbGFwc2VXaGl0ZXNwYWNlJChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoL1tcc1x4YTBdKy9nLCAiICIpLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAiIikKfTsKZ29vZy5zdHJpbmcuaXNFbXB0eSA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRpc0VtcHR5JChzdHIpIHsKICByZXR1cm4vXltcc1x4YTBdKiQvLnRlc3Qoc3RyKQp9Owpnb29nLnN0cmluZy5pc0VtcHR5U2FmZSA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRpc0VtcHR5U2FmZSQoc3RyKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLmlzRW1wdHkoZ29vZy5zdHJpbmcubWFrZVNhZmUoc3RyKSkKfTsKZ29vZy5zdHJpbmcuaXNCcmVha2luZ1doaXRlc3BhY2UgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckaXNCcmVha2luZ1doaXRlc3BhY2UkKHN0cikgewogIHJldHVybiEvW15cdFxuXHIgXS8udGVzdChzdHIpCn07Cmdvb2cuc3RyaW5nLmlzQWxwaGEgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckaXNBbHBoYSQoc3RyKSB7CiAgcmV0dXJuIS9bXmEtekEtWl0vLnRlc3Qoc3RyKQp9Owpnb29nLnN0cmluZy5pc051bWVyaWMgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckaXNOdW1lcmljJChzdHIpIHsKICByZXR1cm4hL1teMC05XS8udGVzdChzdHIpCn07Cmdvb2cuc3RyaW5nLmlzQWxwaGFOdW1lcmljID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGlzQWxwaGFOdW1lcmljJChzdHIpIHsKICByZXR1cm4hL1teYS16QS1aMC05XS8udGVzdChzdHIpCn07Cmdvb2cuc3RyaW5nLmlzU3BhY2UgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckaXNTcGFjZSQoY2gpIHsKICByZXR1cm4iICIgPT0gY2gKfTsKZ29vZy5zdHJpbmcuaXNVbmljb2RlQ2hhciA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRpc1VuaWNvZGVDaGFyJChjaCkgewogIHJldHVybiAxID09IGNoLmxlbmd0aCAmJiAiICIgPD0gY2ggJiYgIn4iID49IGNoIHx8ICJcdTAwODAiIDw9IGNoICYmICJcdWZmZmQiID49IGNoCn07Cmdvb2cuc3RyaW5nLnN0cmlwTmV3bGluZXMgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckc3RyaXBOZXdsaW5lcyQoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oXHJcbnxccnxcbikrL2csICIgIikKfTsKZ29vZy5zdHJpbmcuY2Fub25pY2FsaXplTmV3bGluZXMgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckY2Fub25pY2FsaXplTmV3bGluZXMkKHN0cikgewogIHJldHVybiBzdHIucmVwbGFjZSgvKFxyXG58XHJ8XG4pL2csICJcbiIpCn07Cmdvb2cuc3RyaW5nLm5vcm1hbGl6ZVdoaXRlc3BhY2UgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckbm9ybWFsaXplV2hpdGVzcGFjZSQoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9ceGEwfFxzL2csICIgIikKfTsKZ29vZy5zdHJpbmcubm9ybWFsaXplU3BhY2VzID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJG5vcm1hbGl6ZVNwYWNlcyQoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9ceGEwfFsgXHRdKy9nLCAiICIpCn07Cmdvb2cuc3RyaW5nLmNvbGxhcHNlQnJlYWtpbmdTcGFjZXMgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckY29sbGFwc2VCcmVha2luZ1NwYWNlcyQoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXHRcclxuIF0rL2csICIgIikucmVwbGFjZSgvXltcdFxyXG4gXSt8W1x0XHJcbiBdKyQvZywgIiIpCn07Cmdvb2cuc3RyaW5nLnRyaW0gPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckdHJpbSQoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eW1xzXHhhMF0rfFtcc1x4YTBdKyQvZywgIiIpCn07Cmdvb2cuc3RyaW5nLnRyaW1MZWZ0ID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHRyaW1MZWZ0JChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoL15bXHNceGEwXSsvLCAiIikKfTsKZ29vZy5zdHJpbmcudHJpbVJpZ2h0ID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHRyaW1SaWdodCQoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXHNceGEwXSskLywgIiIpCn07Cmdvb2cuc3RyaW5nLmNhc2VJbnNlbnNpdGl2ZUNvbXBhcmUgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckY2FzZUluc2Vuc2l0aXZlQ29tcGFyZSQoc3RyMSwgc3RyMikgewogIHZhciB0ZXN0MSA9ICgiIiArIHN0cjEpLnRvTG93ZXJDYXNlKCksIHRlc3QyID0gKCIiICsgc3RyMikudG9Mb3dlckNhc2UoKTsKICByZXR1cm4gdGVzdDEgPCB0ZXN0MiA/IC0xIDogdGVzdDEgPT0gdGVzdDIgPyAwIDogMQp9Owpnb29nLnN0cmluZy5udW1lcmF0ZUNvbXBhcmVSZWdFeHBfID0gLyhcLlxkKyl8KFxkKyl8KFxEKykvZzsKZ29vZy5zdHJpbmcubnVtZXJhdGVDb21wYXJlID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJG51bWVyYXRlQ29tcGFyZSQoc3RyMSwgc3RyMikgewogIGlmKHN0cjEgPT0gc3RyMikgewogICAgcmV0dXJuIDAKICB9CiAgaWYoIXN0cjEpIHsKICAgIHJldHVybi0xCiAgfQogIGlmKCFzdHIyKSB7CiAgICByZXR1cm4gMQogIH0KICBmb3IodmFyIHRva2VuczEgPSBzdHIxLnRvTG93ZXJDYXNlKCkubWF0Y2goZ29vZy5zdHJpbmcubnVtZXJhdGVDb21wYXJlUmVnRXhwXyksIHRva2VuczIgPSBzdHIyLnRvTG93ZXJDYXNlKCkubWF0Y2goZ29vZy5zdHJpbmcubnVtZXJhdGVDb21wYXJlUmVnRXhwXyksIGNvdW50ID0gTWF0aC5taW4odG9rZW5zMS5sZW5ndGgsIHRva2VuczIubGVuZ3RoKSwgaSA9IDA7aSA8IGNvdW50O2krKykgewogICAgdmFyIGEgPSB0b2tlbnMxW2ldLCBiID0gdG9rZW5zMltpXTsKICAgIGlmKGEgIT0gYikgewogICAgICB2YXIgbnVtMSA9IHBhcnNlSW50KGEsIDEwKTsKICAgICAgaWYoIWlzTmFOKG51bTEpKSB7CiAgICAgICAgdmFyIG51bTIgPSBwYXJzZUludChiLCAxMCk7CiAgICAgICAgaWYoIWlzTmFOKG51bTIpICYmIG51bTEgLSBudW0yKSB7CiAgICAgICAgICByZXR1cm4gbnVtMSAtIG51bTIKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiAxCiAgICB9CiAgfQogIHJldHVybiB0b2tlbnMxLmxlbmd0aCAhPSB0b2tlbnMyLmxlbmd0aCA/IHRva2VuczEubGVuZ3RoIC0gdG9rZW5zMi5sZW5ndGggOiBzdHIxIDwgc3RyMiA/IC0xIDogMQp9Owpnb29nLnN0cmluZy5lbmNvZGVVcmlSZWdFeHBfID0gL15bYS16QS1aMC05XC1fLiF+KicoKV0qJC87Cmdvb2cuc3RyaW5nLnVybEVuY29kZSA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyR1cmxFbmNvZGUkKHN0cikgewogIHN0ciA9ICIiICsgc3RyOwogIHJldHVybiFnb29nLnN0cmluZy5lbmNvZGVVcmlSZWdFeHBfLnRlc3Qoc3RyKSA/IGVuY29kZVVSSUNvbXBvbmVudChzdHIpIDogc3RyCn07Cmdvb2cuc3RyaW5nLnVybERlY29kZSA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyR1cmxEZWNvZGUkKHN0cikgewogIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyLnJlcGxhY2UoL1wrL2csICIgIikpCn07Cmdvb2cuc3RyaW5nLm5ld0xpbmVUb0JyID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJG5ld0xpbmVUb0JyJChzdHIsIG9wdF94bWwpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoLyhcclxufFxyfFxuKS9nLCBvcHRfeG1sID8gIjxiciAvPiIgOiAiPGJyPiIpCn07Cmdvb2cuc3RyaW5nLmh0bWxFc2NhcGUgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckaHRtbEVzY2FwZSQoc3RyLCBvcHRfaXNMaWtlbHlUb0NvbnRhaW5IdG1sQ2hhcnMpIHsKICBpZihvcHRfaXNMaWtlbHlUb0NvbnRhaW5IdG1sQ2hhcnMpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZShnb29nLnN0cmluZy5hbXBlclJlXywgIiZhbXA7IikucmVwbGFjZShnb29nLnN0cmluZy5sdFJlXywgIiZsdDsiKS5yZXBsYWNlKGdvb2cuc3RyaW5nLmd0UmVfLCAiJmd0OyIpLnJlcGxhY2UoZ29vZy5zdHJpbmcucXVvdFJlXywgIiZxdW90OyIpCiAgfQogIGlmKCFnb29nLnN0cmluZy5hbGxSZV8udGVzdChzdHIpKSB7CiAgICByZXR1cm4gc3RyCiAgfQogIC0xICE9IHN0ci5pbmRleE9mKCImIikgJiYgKHN0ciA9IHN0ci5yZXBsYWNlKGdvb2cuc3RyaW5nLmFtcGVyUmVfLCAiJmFtcDsiKSk7CiAgLTEgIT0gc3RyLmluZGV4T2YoIjwiKSAmJiAoc3RyID0gc3RyLnJlcGxhY2UoZ29vZy5zdHJpbmcubHRSZV8sICImbHQ7IikpOwogIC0xICE9IHN0ci5pbmRleE9mKCI+IikgJiYgKHN0ciA9IHN0ci5yZXBsYWNlKGdvb2cuc3RyaW5nLmd0UmVfLCAiJmd0OyIpKTsKICAtMSAhPSBzdHIuaW5kZXhPZignIicpICYmIChzdHIgPSBzdHIucmVwbGFjZShnb29nLnN0cmluZy5xdW90UmVfLCAiJnF1b3Q7IikpOwogIHJldHVybiBzdHIKfTsKZ29vZy5zdHJpbmcuYW1wZXJSZV8gPSAvJi9nOwpnb29nLnN0cmluZy5sdFJlXyA9IC88L2c7Cmdvb2cuc3RyaW5nLmd0UmVfID0gLz4vZzsKZ29vZy5zdHJpbmcucXVvdFJlXyA9IC9cIi9nOwpnb29nLnN0cmluZy5hbGxSZV8gPSAvWyY8PlwiXS87Cmdvb2cuc3RyaW5nLnVuZXNjYXBlRW50aXRpZXMgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckdW5lc2NhcGVFbnRpdGllcyQoc3RyKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLmNvbnRhaW5zKHN0ciwgIiYiKSA/ICJkb2N1bWVudCIgaW4gZ29vZy5nbG9iYWwgPyBnb29nLnN0cmluZy51bmVzY2FwZUVudGl0aWVzVXNpbmdEb21fKHN0cikgOiBnb29nLnN0cmluZy51bmVzY2FwZVB1cmVYbWxFbnRpdGllc18oc3RyKSA6IHN0cgp9Owpnb29nLnN0cmluZy51bmVzY2FwZUVudGl0aWVzVXNpbmdEb21fID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHVuZXNjYXBlRW50aXRpZXNVc2luZ0RvbV8kKHN0cikgewogIHZhciBzZWVuID0geyImYW1wOyI6IiYiLCAiJmx0OyI6IjwiLCAiJmd0OyI6Ij4iLCAiJnF1b3Q7IjonIid9LCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICByZXR1cm4gc3RyLnJlcGxhY2UoZ29vZy5zdHJpbmcuSFRNTF9FTlRJVFlfUEFUVEVSTl8sIGZ1bmN0aW9uKHMsIGVudGl0eSkgewogICAgdmFyIHZhbHVlID0gc2VlbltzXTsKICAgIGlmKHZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZQogICAgfQogICAgaWYoIiMiID09IGVudGl0eS5jaGFyQXQoMCkpIHsKICAgICAgdmFyIG4gPSBOdW1iZXIoIjAiICsgZW50aXR5LnN1YnN0cigxKSk7CiAgICAgIGlzTmFOKG4pIHx8ICh2YWx1ZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUobikpCiAgICB9CiAgICB2YWx1ZSB8fCAoZGl2LmlubmVySFRNTCA9IHMgKyAiICIsIHZhbHVlID0gZGl2LmZpcnN0Q2hpbGQubm9kZVZhbHVlLnNsaWNlKDAsIC0xKSk7CiAgICByZXR1cm4gc2VlbltzXSA9IHZhbHVlCiAgfSkKfTsKZ29vZy5zdHJpbmcudW5lc2NhcGVQdXJlWG1sRW50aXRpZXNfID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHVuZXNjYXBlUHVyZVhtbEVudGl0aWVzXyQoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mKFteO10rKTsvZywgZnVuY3Rpb24ocywgZW50aXR5KSB7CiAgICBzd2l0Y2goZW50aXR5KSB7CiAgICAgIGNhc2UgImFtcCI6CiAgICAgICAgcmV0dXJuIiYiOwogICAgICBjYXNlICJsdCI6CiAgICAgICAgcmV0dXJuIjwiOwogICAgICBjYXNlICJndCI6CiAgICAgICAgcmV0dXJuIj4iOwogICAgICBjYXNlICJxdW90IjoKICAgICAgICByZXR1cm4nIic7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaWYoIiMiID09IGVudGl0eS5jaGFyQXQoMCkpIHsKICAgICAgICAgIHZhciBuID0gTnVtYmVyKCIwIiArIGVudGl0eS5zdWJzdHIoMSkpOwogICAgICAgICAgaWYoIWlzTmFOKG4pKSB7CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG4pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBzCiAgICB9CiAgfSkKfTsKZ29vZy5zdHJpbmcuSFRNTF9FTlRJVFlfUEFUVEVSTl8gPSAvJihbXjtcczwmXSspOz8vZzsKZ29vZy5zdHJpbmcud2hpdGVzcGFjZUVzY2FwZSA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyR3aGl0ZXNwYWNlRXNjYXBlJChzdHIsIG9wdF94bWwpIHsKICByZXR1cm4gZ29vZy5zdHJpbmcubmV3TGluZVRvQnIoc3RyLnJlcGxhY2UoLyAgL2csICIgJiMxNjA7IiksIG9wdF94bWwpCn07Cmdvb2cuc3RyaW5nLnN0cmlwUXVvdGVzID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHN0cmlwUXVvdGVzJChzdHIsIHF1b3RlQ2hhcnMpIHsKICBmb3IodmFyIGxlbmd0aCA9IHF1b3RlQ2hhcnMubGVuZ3RoLCBpID0gMDtpIDwgbGVuZ3RoO2krKykgewogICAgdmFyIHF1b3RlQ2hhciA9IDEgPT0gbGVuZ3RoID8gcXVvdGVDaGFycyA6IHF1b3RlQ2hhcnMuY2hhckF0KGkpOwogICAgaWYoc3RyLmNoYXJBdCgwKSA9PSBxdW90ZUNoYXIgJiYgc3RyLmNoYXJBdChzdHIubGVuZ3RoIC0gMSkgPT0gcXVvdGVDaGFyKSB7CiAgICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDEsIHN0ci5sZW5ndGggLSAxKQogICAgfQogIH0KICByZXR1cm4gc3RyCn07Cmdvb2cuc3RyaW5nLnRydW5jYXRlID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHRydW5jYXRlJChzdHIsIGNoYXJzLCBvcHRfcHJvdGVjdEVzY2FwZWRDaGFyYWN0ZXJzKSB7CiAgb3B0X3Byb3RlY3RFc2NhcGVkQ2hhcmFjdGVycyAmJiAoc3RyID0gZ29vZy5zdHJpbmcudW5lc2NhcGVFbnRpdGllcyhzdHIpKTsKICBzdHIubGVuZ3RoID4gY2hhcnMgJiYgKHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgY2hhcnMgLSAzKSArICIuLi4iKTsKICBvcHRfcHJvdGVjdEVzY2FwZWRDaGFyYWN0ZXJzICYmIChzdHIgPSBnb29nLnN0cmluZy5odG1sRXNjYXBlKHN0cikpOwogIHJldHVybiBzdHIKfTsKZ29vZy5zdHJpbmcudHJ1bmNhdGVNaWRkbGUgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckdHJ1bmNhdGVNaWRkbGUkKHN0ciwgY2hhcnMsIG9wdF9wcm90ZWN0RXNjYXBlZENoYXJhY3RlcnMsIG9wdF90cmFpbGluZ0NoYXJzKSB7CiAgb3B0X3Byb3RlY3RFc2NhcGVkQ2hhcmFjdGVycyAmJiAoc3RyID0gZ29vZy5zdHJpbmcudW5lc2NhcGVFbnRpdGllcyhzdHIpKTsKICBpZihvcHRfdHJhaWxpbmdDaGFycyAmJiBzdHIubGVuZ3RoID4gY2hhcnMpIHsKICAgIG9wdF90cmFpbGluZ0NoYXJzID4gY2hhcnMgJiYgKG9wdF90cmFpbGluZ0NoYXJzID0gY2hhcnMpOwogICAgdmFyIGVuZFBvaW50ID0gc3RyLmxlbmd0aCAtIG9wdF90cmFpbGluZ0NoYXJzLCBzdGFydFBvaW50ID0gY2hhcnMgLSBvcHRfdHJhaWxpbmdDaGFycywgc3RyID0gc3RyLnN1YnN0cmluZygwLCBzdGFydFBvaW50KSArICIuLi4iICsgc3RyLnN1YnN0cmluZyhlbmRQb2ludCkKICB9ZWxzZSB7CiAgICBpZihzdHIubGVuZ3RoID4gY2hhcnMpIHsKICAgICAgdmFyIGhhbGYgPSBNYXRoLmZsb29yKGNoYXJzIC8gMiksIGVuZFBvcyA9IHN0ci5sZW5ndGggLSBoYWxmLCBoYWxmID0gaGFsZiArIGNoYXJzICUgMiwgc3RyID0gc3RyLnN1YnN0cmluZygwLCBoYWxmKSArICIuLi4iICsgc3RyLnN1YnN0cmluZyhlbmRQb3MpCiAgICB9CiAgfQogIG9wdF9wcm90ZWN0RXNjYXBlZENoYXJhY3RlcnMgJiYgKHN0ciA9IGdvb2cuc3RyaW5nLmh0bWxFc2NhcGUoc3RyKSk7CiAgcmV0dXJuIHN0cgp9Owpnb29nLnN0cmluZy5zcGVjaWFsRXNjYXBlQ2hhcnNfID0geyJceDAwIjoiXFwwIiwgIlx1MDAwOCI6IlxcYiIsICJcdTAwMGMiOiJcXGYiLCAiXG4iOiJcXG4iLCAiXHIiOiJcXHIiLCAiXHQiOiJcXHQiLCAiXHgwQiI6IlxceDBCIiwgJyInOidcXCInLCAiXFwiOiJcXFxcIn07Cmdvb2cuc3RyaW5nLmpzRXNjYXBlQ2FjaGVfID0geyInIjoiXFwnIn07Cmdvb2cuc3RyaW5nLnF1b3RlID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHF1b3RlJChzKSB7CiAgcyA9ICIiICsgczsKICBpZihzLnF1b3RlKSB7CiAgICByZXR1cm4gcy5xdW90ZSgpCiAgfQogIGZvcih2YXIgc2IgPSBbJyInXSwgaSA9IDA7aSA8IHMubGVuZ3RoO2krKykgewogICAgdmFyIGNoID0gcy5jaGFyQXQoaSksIGNjID0gY2guY2hhckNvZGVBdCgwKTsKICAgIHNiW2kgKyAxXSA9IGdvb2cuc3RyaW5nLnNwZWNpYWxFc2NhcGVDaGFyc19bY2hdIHx8ICgzMSA8IGNjICYmIDEyNyA+IGNjID8gY2ggOiBnb29nLnN0cmluZy5lc2NhcGVDaGFyKGNoKSkKICB9CiAgc2IucHVzaCgnIicpOwogIHJldHVybiBzYi5qb2luKCIiKQp9Owpnb29nLnN0cmluZy5lc2NhcGVTdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckZXNjYXBlU3RyaW5nJChzdHIpIHsKICBmb3IodmFyIHNiID0gW10sIGkgPSAwO2kgPCBzdHIubGVuZ3RoO2krKykgewogICAgc2JbaV0gPSBnb29nLnN0cmluZy5lc2NhcGVDaGFyKHN0ci5jaGFyQXQoaSkpCiAgfQogIHJldHVybiBzYi5qb2luKCIiKQp9Owpnb29nLnN0cmluZy5lc2NhcGVDaGFyID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGVzY2FwZUNoYXIkKGMpIHsKICBpZihjIGluIGdvb2cuc3RyaW5nLmpzRXNjYXBlQ2FjaGVfKSB7CiAgICByZXR1cm4gZ29vZy5zdHJpbmcuanNFc2NhcGVDYWNoZV9bY10KICB9CiAgaWYoYyBpbiBnb29nLnN0cmluZy5zcGVjaWFsRXNjYXBlQ2hhcnNfKSB7CiAgICByZXR1cm4gZ29vZy5zdHJpbmcuanNFc2NhcGVDYWNoZV9bY10gPSBnb29nLnN0cmluZy5zcGVjaWFsRXNjYXBlQ2hhcnNfW2NdCiAgfQogIHZhciBydiA9IGMsIGNjID0gYy5jaGFyQ29kZUF0KDApOwogIGlmKDMxIDwgY2MgJiYgMTI3ID4gY2MpIHsKICAgIHJ2ID0gYwogIH1lbHNlIHsKICAgIGlmKDI1NiA+IGNjKSB7CiAgICAgIGlmKHJ2ID0gIlxceCIsIDE2ID4gY2MgfHwgMjU2IDwgY2MpIHsKICAgICAgICBydiArPSAiMCIKICAgICAgfQogICAgfWVsc2UgewogICAgICBydiA9ICJcXHUiLCA0MDk2ID4gY2MgJiYgKHJ2ICs9ICIwIikKICAgIH0KICAgIHJ2ICs9IGNjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpCiAgfQogIHJldHVybiBnb29nLnN0cmluZy5qc0VzY2FwZUNhY2hlX1tjXSA9IHJ2Cn07Cmdvb2cuc3RyaW5nLnRvTWFwID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHRvTWFwJChzKSB7CiAgZm9yKHZhciBydiA9IHt9LCBpID0gMDtpIDwgcy5sZW5ndGg7aSsrKSB7CiAgICBydltzLmNoYXJBdChpKV0gPSAhMAogIH0KICByZXR1cm4gcnYKfTsKZ29vZy5zdHJpbmcuY29udGFpbnMgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckY29udGFpbnMkKHMsIHNzKSB7CiAgcmV0dXJuLTEgIT0gcy5pbmRleE9mKHNzKQp9Owpnb29nLnN0cmluZy5jb3VudE9mID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGNvdW50T2YkKHMsIHNzKSB7CiAgcmV0dXJuIHMgJiYgc3MgPyBzLnNwbGl0KHNzKS5sZW5ndGggLSAxIDogMAp9Owpnb29nLnN0cmluZy5yZW1vdmVBdCA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRyZW1vdmVBdCQocywgaW5kZXgsIHN0cmluZ0xlbmd0aCkgewogIHZhciByZXN1bHRTdHIgPSBzOwogIDAgPD0gaW5kZXggJiYgaW5kZXggPCBzLmxlbmd0aCAmJiAwIDwgc3RyaW5nTGVuZ3RoICYmIChyZXN1bHRTdHIgPSBzLnN1YnN0cigwLCBpbmRleCkgKyBzLnN1YnN0cihpbmRleCArIHN0cmluZ0xlbmd0aCwgcy5sZW5ndGggLSBpbmRleCAtIHN0cmluZ0xlbmd0aCkpOwogIHJldHVybiByZXN1bHRTdHIKfTsKZ29vZy5zdHJpbmcucmVtb3ZlID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHJlbW92ZSQocywgc3MpIHsKICB2YXIgcmUgPSBSZWdFeHAoZ29vZy5zdHJpbmcucmVnRXhwRXNjYXBlKHNzKSwgIiIpOwogIHJldHVybiBzLnJlcGxhY2UocmUsICIiKQp9Owpnb29nLnN0cmluZy5yZW1vdmVBbGwgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckcmVtb3ZlQWxsJChzLCBzcykgewogIHZhciByZSA9IFJlZ0V4cChnb29nLnN0cmluZy5yZWdFeHBFc2NhcGUoc3MpLCAiZyIpOwogIHJldHVybiBzLnJlcGxhY2UocmUsICIiKQp9Owpnb29nLnN0cmluZy5yZWdFeHBFc2NhcGUgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckcmVnRXhwRXNjYXBlJChzKSB7CiAgcmV0dXJuKCIiICsgcykucmVwbGFjZSgvKFstKClcW1xde30rPyouJFxefCw6IzwhXFxdKS9nLCAiXFwkMSIpLnJlcGxhY2UoL1x4MDgvZywgIlxceDA4IikKfTsKZ29vZy5zdHJpbmcucmVwZWF0ID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHJlcGVhdCQoc3RyaW5nLCBsZW5ndGgpIHsKICByZXR1cm4gQXJyYXkobGVuZ3RoICsgMSkuam9pbihzdHJpbmcpCn07Cmdvb2cuc3RyaW5nLnBhZE51bWJlciA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRwYWROdW1iZXIkKG51bSwgbGVuZ3RoLCBvcHRfcHJlY2lzaW9uKSB7CiAgdmFyIHMgPSBnb29nLmlzRGVmKG9wdF9wcmVjaXNpb24pID8gbnVtLnRvRml4ZWQob3B0X3ByZWNpc2lvbikgOiAiIiArIG51bSwgaW5kZXggPSBzLmluZGV4T2YoIi4iKTsKICAtMSA9PSBpbmRleCAmJiAoaW5kZXggPSBzLmxlbmd0aCk7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnJlcGVhdCgiMCIsIE1hdGgubWF4KDAsIGxlbmd0aCAtIGluZGV4KSkgKyBzCn07Cmdvb2cuc3RyaW5nLm1ha2VTYWZlID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJG1ha2VTYWZlJChvYmopIHsKICByZXR1cm4gbnVsbCA9PSBvYmogPyAiIiA6ICIiICsgb2JqCn07Cmdvb2cuc3RyaW5nLmJ1aWxkU3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGJ1aWxkU3RyaW5nJCh2YXJfYXJncykgewogIHJldHVybiBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKGFyZ3VtZW50cywgIiIpCn07Cmdvb2cuc3RyaW5nLmdldFJhbmRvbVN0cmluZyA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRnZXRSYW5kb21TdHJpbmckKCkgewogIHZhciB4ID0gMjE0NzQ4MzY0ODsKICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogeCkudG9TdHJpbmcoMzYpICsgTWF0aC5hYnMoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogeCkgXiBnb29nLm5vdygpKS50b1N0cmluZygzNikKfTsKZ29vZy5zdHJpbmcuY29tcGFyZVZlcnNpb25zID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGNvbXBhcmVWZXJzaW9ucyQodmVyc2lvbjEsIHZlcnNpb24yKSB7CiAgZm9yKHZhciBvcmRlciA9IDAsIHYxU3VicyA9IGdvb2cuc3RyaW5nLnRyaW0oIiIgKyB2ZXJzaW9uMSkuc3BsaXQoIi4iKSwgdjJTdWJzID0gZ29vZy5zdHJpbmcudHJpbSgiIiArIHZlcnNpb24yKS5zcGxpdCgiLiIpLCBzdWJDb3VudCA9IE1hdGgubWF4KHYxU3Vicy5sZW5ndGgsIHYyU3Vicy5sZW5ndGgpLCBzdWJJZHggPSAwOzAgPT0gb3JkZXIgJiYgc3ViSWR4IDwgc3ViQ291bnQ7c3ViSWR4KyspIHsKICAgIHZhciB2MVN1YiA9IHYxU3Vic1tzdWJJZHhdIHx8ICIiLCB2MlN1YiA9IHYyU3Vic1tzdWJJZHhdIHx8ICIiLCB2MUNvbXBQYXJzZXIgPSBSZWdFeHAoIihcXGQqKShcXEQqKSIsICJnIiksIHYyQ29tcFBhcnNlciA9IFJlZ0V4cCgiKFxcZCopKFxcRCopIiwgImciKTsKICAgIGRvIHsKICAgICAgdmFyIHYxQ29tcCA9IHYxQ29tcFBhcnNlci5leGVjKHYxU3ViKSB8fCBbIiIsICIiLCAiIl0sIHYyQ29tcCA9IHYyQ29tcFBhcnNlci5leGVjKHYyU3ViKSB8fCBbIiIsICIiLCAiIl07CiAgICAgIGlmKDAgPT0gdjFDb21wWzBdLmxlbmd0aCAmJiAwID09IHYyQ29tcFswXS5sZW5ndGgpIHsKICAgICAgICBicmVhawogICAgICB9CiAgICAgIHZhciB2MUNvbXBOdW0gPSAwID09IHYxQ29tcFsxXS5sZW5ndGggPyAwIDogcGFyc2VJbnQodjFDb21wWzFdLCAxMCksIHYyQ29tcE51bSA9IDAgPT0gdjJDb21wWzFdLmxlbmd0aCA/IDAgOiBwYXJzZUludCh2MkNvbXBbMV0sIDEwKSwgb3JkZXIgPSBnb29nLnN0cmluZy5jb21wYXJlRWxlbWVudHNfKHYxQ29tcE51bSwgdjJDb21wTnVtKSB8fCBnb29nLnN0cmluZy5jb21wYXJlRWxlbWVudHNfKDAgPT0gdjFDb21wWzJdLmxlbmd0aCwgMCA9PSB2MkNvbXBbMl0ubGVuZ3RoKSB8fCBnb29nLnN0cmluZy5jb21wYXJlRWxlbWVudHNfKHYxQ29tcFsyXSwgdjJDb21wWzJdKQogICAgfXdoaWxlKDAgPT0gb3JkZXIpCiAgfQogIHJldHVybiBvcmRlcgp9Owpnb29nLnN0cmluZy5jb21wYXJlRWxlbWVudHNfID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGNvbXBhcmVFbGVtZW50c18kKGxlZnQsIHJpZ2h0KSB7CiAgcmV0dXJuIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA+IHJpZ2h0ID8gMSA6IDAKfTsKZ29vZy5zdHJpbmcuSEFTSENPREVfTUFYXyA9IDQyOTQ5NjcyOTY7Cmdvb2cuc3RyaW5nLmhhc2hDb2RlID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGhhc2hDb2RlJChzdHIpIHsKICBmb3IodmFyIHJlc3VsdCA9IDAsIGkgPSAwO2kgPCBzdHIubGVuZ3RoOysraSkgewogICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBzdHIuY2hhckNvZGVBdChpKSwgcmVzdWx0ICU9IGdvb2cuc3RyaW5nLkhBU0hDT0RFX01BWF8KICB9CiAgcmV0dXJuIHJlc3VsdAp9Owpnb29nLnN0cmluZy51bmlxdWVTdHJpbmdDb3VudGVyXyA9IDIxNDc0ODM2NDggKiBNYXRoLnJhbmRvbSgpIHwgMDsKZ29vZy5zdHJpbmcuY3JlYXRlVW5pcXVlU3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGNyZWF0ZVVuaXF1ZVN0cmluZyQoKSB7CiAgcmV0dXJuImdvb2dfIiArIGdvb2cuc3RyaW5nLnVuaXF1ZVN0cmluZ0NvdW50ZXJfKysKfTsKZ29vZy5zdHJpbmcudG9OdW1iZXIgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckdG9OdW1iZXIkKHN0cikgewogIHZhciBudW0gPSBOdW1iZXIoc3RyKTsKICByZXR1cm4gMCA9PSBudW0gJiYgZ29vZy5zdHJpbmcuaXNFbXB0eShzdHIpID8gTmFOIDogbnVtCn07Cmdvb2cuc3RyaW5nLnRvQ2FtZWxDYXNlQ2FjaGVfID0ge307Cmdvb2cuc3RyaW5nLnRvQ2FtZWxDYXNlID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHRvQ2FtZWxDYXNlJChzdHIpIHsKICByZXR1cm4gZ29vZy5zdHJpbmcudG9DYW1lbENhc2VDYWNoZV9bc3RyXSB8fCAoZ29vZy5zdHJpbmcudG9DYW1lbENhc2VDYWNoZV9bc3RyXSA9ICgiIiArIHN0cikucmVwbGFjZSgvXC0oW2Etel0pL2csIGZ1bmN0aW9uKGFsbCwgbWF0Y2gpIHsKICAgIHJldHVybiBtYXRjaC50b1VwcGVyQ2FzZSgpCiAgfSkpCn07Cmdvb2cuc3RyaW5nLnRvU2VsZWN0b3JDYXNlQ2FjaGVfID0ge307Cmdvb2cuc3RyaW5nLnRvU2VsZWN0b3JDYXNlID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJHRvU2VsZWN0b3JDYXNlJChzdHIpIHsKICByZXR1cm4gZ29vZy5zdHJpbmcudG9TZWxlY3RvckNhc2VDYWNoZV9bc3RyXSB8fCAoZ29vZy5zdHJpbmcudG9TZWxlY3RvckNhc2VDYWNoZV9bc3RyXSA9ICgiIiArIHN0cikucmVwbGFjZSgvKFtBLVpdKS9nLCAiLSQxIikudG9Mb3dlckNhc2UoKSkKfTsKZ29vZy5hc3NlcnRzID0ge307Cmdvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyA9IGdvb2cuREVCVUc7Cmdvb2cuYXNzZXJ0cy5Bc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uICRnb29nJGFzc2VydHMkQXNzZXJ0aW9uRXJyb3IkKG1lc3NhZ2VQYXR0ZXJuLCBtZXNzYWdlQXJncykgewogIG1lc3NhZ2VBcmdzLnVuc2hpZnQobWVzc2FnZVBhdHRlcm4pOwogIGdvb2cuZGVidWcuRXJyb3IuY2FsbCh0aGlzLCBnb29nLnN0cmluZy5zdWJzLmFwcGx5KG51bGwsIG1lc3NhZ2VBcmdzKSk7CiAgbWVzc2FnZUFyZ3Muc2hpZnQoKQp9Owpnb29nLmluaGVyaXRzKGdvb2cuYXNzZXJ0cy5Bc3NlcnRpb25FcnJvciwgZ29vZy5kZWJ1Zy5FcnJvcik7Cmdvb2cuYXNzZXJ0cy5Bc3NlcnRpb25FcnJvci5wcm90b3R5cGUubmFtZSA9ICJBc3NlcnRpb25FcnJvciI7Cmdvb2cuYXNzZXJ0cy5kb0Fzc2VydEZhaWx1cmVfID0gZnVuY3Rpb24gJGdvb2ckYXNzZXJ0cyRkb0Fzc2VydEZhaWx1cmVfJChkZWZhdWx0TWVzc2FnZSwgZGVmYXVsdEFyZ3MsIGdpdmVuTWVzc2FnZSwgZ2l2ZW5BcmdzKSB7CiAgdmFyIG1lc3NhZ2UgPSAiQXNzZXJ0aW9uIGZhaWxlZCI7CiAgaWYoZ2l2ZW5NZXNzYWdlKSB7CiAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2UgKyAoIjogIiArIGdpdmVuTWVzc2FnZSksIGFyZ3MgPSBnaXZlbkFyZ3MKICB9ZWxzZSB7CiAgICBkZWZhdWx0TWVzc2FnZSAmJiAobWVzc2FnZSArPSAiOiAiICsgZGVmYXVsdE1lc3NhZ2UsIGFyZ3MgPSBkZWZhdWx0QXJncykKICB9CiAgdGhyb3cgbmV3IGdvb2cuYXNzZXJ0cy5Bc3NlcnRpb25FcnJvcigiIiArIG1lc3NhZ2UsIGFyZ3MgfHwgW10pOwp9Owpnb29nLmFzc2VydHMuYXNzZXJ0ID0gZnVuY3Rpb24gJGdvb2ckYXNzZXJ0cyRhc3NlcnQkKGNvbmRpdGlvbiwgb3B0X21lc3NhZ2UsIHZhcl9hcmdzKSB7CiAgZ29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTICYmICFjb25kaXRpb24gJiYgZ29vZy5hc3NlcnRzLmRvQXNzZXJ0RmFpbHVyZV8oIiIsIG51bGwsIG9wdF9tZXNzYWdlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpKTsKICByZXR1cm4gY29uZGl0aW9uCn07Cmdvb2cuYXNzZXJ0cy5mYWlsID0gZnVuY3Rpb24gJGdvb2ckYXNzZXJ0cyRmYWlsJChvcHRfbWVzc2FnZSwgdmFyX2FyZ3MpIHsKICBpZihnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFMpIHsKICAgIHRocm93IG5ldyBnb29nLmFzc2VydHMuQXNzZXJ0aW9uRXJyb3IoIkZhaWx1cmUiICsgKG9wdF9tZXNzYWdlID8gIjogIiArIG9wdF9tZXNzYWdlIDogIiIpLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKICB9Cn07Cmdvb2cuYXNzZXJ0cy5hc3NlcnROdW1iZXIgPSBmdW5jdGlvbiAkZ29vZyRhc3NlcnRzJGFzc2VydE51bWJlciQodmFsdWUsIG9wdF9tZXNzYWdlLCB2YXJfYXJncykgewogIGdvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyAmJiAhZ29vZy5pc051bWJlcih2YWx1ZSkgJiYgZ29vZy5hc3NlcnRzLmRvQXNzZXJ0RmFpbHVyZV8oIkV4cGVjdGVkIG51bWJlciBidXQgZ290ICVzOiAlcy4iLCBbZ29vZy50eXBlT2YodmFsdWUpLCB2YWx1ZV0sIG9wdF9tZXNzYWdlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpKTsKICByZXR1cm4gdmFsdWUKfTsKZ29vZy5hc3NlcnRzLmFzc2VydFN0cmluZyA9IGZ1bmN0aW9uICRnb29nJGFzc2VydHMkYXNzZXJ0U3RyaW5nJCh2YWx1ZSwgb3B0X21lc3NhZ2UsIHZhcl9hcmdzKSB7CiAgZ29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTICYmICFnb29nLmlzU3RyaW5nKHZhbHVlKSAmJiBnb29nLmFzc2VydHMuZG9Bc3NlcnRGYWlsdXJlXygiRXhwZWN0ZWQgc3RyaW5nIGJ1dCBnb3QgJXM6ICVzLiIsIFtnb29nLnR5cGVPZih2YWx1ZSksIHZhbHVlXSwgb3B0X21lc3NhZ2UsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikpOwogIHJldHVybiB2YWx1ZQp9Owpnb29nLmFzc2VydHMuYXNzZXJ0RnVuY3Rpb24gPSBmdW5jdGlvbiAkZ29vZyRhc3NlcnRzJGFzc2VydEZ1bmN0aW9uJCh2YWx1ZSwgb3B0X21lc3NhZ2UsIHZhcl9hcmdzKSB7CiAgZ29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTICYmICFnb29nLmlzRnVuY3Rpb24odmFsdWUpICYmIGdvb2cuYXNzZXJ0cy5kb0Fzc2VydEZhaWx1cmVfKCJFeHBlY3RlZCBmdW5jdGlvbiBidXQgZ290ICVzOiAlcy4iLCBbZ29vZy50eXBlT2YodmFsdWUpLCB2YWx1ZV0sIG9wdF9tZXNzYWdlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpKTsKICByZXR1cm4gdmFsdWUKfTsKZ29vZy5hc3NlcnRzLmFzc2VydE9iamVjdCA9IGZ1bmN0aW9uICRnb29nJGFzc2VydHMkYXNzZXJ0T2JqZWN0JCh2YWx1ZSwgb3B0X21lc3NhZ2UsIHZhcl9hcmdzKSB7CiAgZ29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTICYmICFnb29nLmlzT2JqZWN0KHZhbHVlKSAmJiBnb29nLmFzc2VydHMuZG9Bc3NlcnRGYWlsdXJlXygiRXhwZWN0ZWQgb2JqZWN0IGJ1dCBnb3QgJXM6ICVzLiIsIFtnb29nLnR5cGVPZih2YWx1ZSksIHZhbHVlXSwgb3B0X21lc3NhZ2UsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikpOwogIHJldHVybiB2YWx1ZQp9Owpnb29nLmFzc2VydHMuYXNzZXJ0QXJyYXkgPSBmdW5jdGlvbiAkZ29vZyRhc3NlcnRzJGFzc2VydEFycmF5JCh2YWx1ZSwgb3B0X21lc3NhZ2UsIHZhcl9hcmdzKSB7CiAgZ29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTICYmICFnb29nLmlzQXJyYXkodmFsdWUpICYmIGdvb2cuYXNzZXJ0cy5kb0Fzc2VydEZhaWx1cmVfKCJFeHBlY3RlZCBhcnJheSBidXQgZ290ICVzOiAlcy4iLCBbZ29vZy50eXBlT2YodmFsdWUpLCB2YWx1ZV0sIG9wdF9tZXNzYWdlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpKTsKICByZXR1cm4gdmFsdWUKfTsKZ29vZy5hc3NlcnRzLmFzc2VydEJvb2xlYW4gPSBmdW5jdGlvbiAkZ29vZyRhc3NlcnRzJGFzc2VydEJvb2xlYW4kKHZhbHVlLCBvcHRfbWVzc2FnZSwgdmFyX2FyZ3MpIHsKICBnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFMgJiYgIWdvb2cuaXNCb29sZWFuKHZhbHVlKSAmJiBnb29nLmFzc2VydHMuZG9Bc3NlcnRGYWlsdXJlXygiRXhwZWN0ZWQgYm9vbGVhbiBidXQgZ290ICVzOiAlcy4iLCBbZ29vZy50eXBlT2YodmFsdWUpLCB2YWx1ZV0sIG9wdF9tZXNzYWdlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpKTsKICByZXR1cm4gdmFsdWUKfTsKZ29vZy5hc3NlcnRzLmFzc2VydEluc3RhbmNlb2YgPSBmdW5jdGlvbiAkZ29vZyRhc3NlcnRzJGFzc2VydEluc3RhbmNlb2YkKHZhbHVlLCB0eXBlLCBvcHRfbWVzc2FnZSwgdmFyX2FyZ3MpIHsKICBnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFMgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIHR5cGUpICYmIGdvb2cuYXNzZXJ0cy5kb0Fzc2VydEZhaWx1cmVfKCJpbnN0YW5jZW9mIGNoZWNrIGZhaWxlZC4iLCBudWxsLCBvcHRfbWVzc2FnZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKSkKfTsKZ29vZy5hcnJheSA9IHt9Owpnb29nLk5BVElWRV9BUlJBWV9QUk9UT1RZUEVTID0gITA7Cmdvb2cuYXJyYXkucGVlayA9IGZ1bmN0aW9uICRnb29nJGFycmF5JHBlZWskKGFycmF5KSB7CiAgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdCn07Cmdvb2cuYXJyYXkuQVJSQVlfUFJPVE9UWVBFXyA9IEFycmF5LnByb3RvdHlwZTsKZ29vZy5hcnJheS5pbmRleE9mID0gZ29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyAmJiBnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8uaW5kZXhPZiA/IGZ1bmN0aW9uKGFyciwgb2JqLCBvcHRfZnJvbUluZGV4KSB7CiAgZ29vZy5hc3NlcnRzLmFzc2VydChudWxsICE9IGFyci5sZW5ndGgpOwogIHJldHVybiBnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8uaW5kZXhPZi5jYWxsKGFyciwgb2JqLCBvcHRfZnJvbUluZGV4KQp9IDogZnVuY3Rpb24oYXJyLCBvYmosIG9wdF9mcm9tSW5kZXgpIHsKICB2YXIgZnJvbUluZGV4ID0gbnVsbCA9PSBvcHRfZnJvbUluZGV4ID8gMCA6IDAgPiBvcHRfZnJvbUluZGV4ID8gTWF0aC5tYXgoMCwgYXJyLmxlbmd0aCArIG9wdF9mcm9tSW5kZXgpIDogb3B0X2Zyb21JbmRleDsKICBpZihnb29nLmlzU3RyaW5nKGFycikpIHsKICAgIHJldHVybiFnb29nLmlzU3RyaW5nKG9iaikgfHwgMSAhPSBvYmoubGVuZ3RoID8gLTEgOiBhcnIuaW5kZXhPZihvYmosIGZyb21JbmRleCkKICB9CiAgZm9yKHZhciBpID0gZnJvbUluZGV4O2kgPCBhcnIubGVuZ3RoO2krKykgewogICAgaWYoaSBpbiBhcnIgJiYgYXJyW2ldID09PSBvYmopIHsKICAgICAgcmV0dXJuIGkKICAgIH0KICB9CiAgcmV0dXJuLTEKfTsKZ29vZy5hcnJheS5sYXN0SW5kZXhPZiA9IGdvb2cuTkFUSVZFX0FSUkFZX1BST1RPVFlQRVMgJiYgZ29vZy5hcnJheS5BUlJBWV9QUk9UT1RZUEVfLmxhc3RJbmRleE9mID8gZnVuY3Rpb24oYXJyLCBvYmosIG9wdF9mcm9tSW5kZXgpIHsKICBnb29nLmFzc2VydHMuYXNzZXJ0KG51bGwgIT0gYXJyLmxlbmd0aCk7CiAgdmFyIGZyb21JbmRleCA9IG51bGwgPT0gb3B0X2Zyb21JbmRleCA/IGFyci5sZW5ndGggLSAxIDogb3B0X2Zyb21JbmRleDsKICByZXR1cm4gZ29vZy5hcnJheS5BUlJBWV9QUk9UT1RZUEVfLmxhc3RJbmRleE9mLmNhbGwoYXJyLCBvYmosIGZyb21JbmRleCkKfSA6IGZ1bmN0aW9uKGFyciwgb2JqLCBvcHRfZnJvbUluZGV4KSB7CiAgdmFyIGZyb21JbmRleCA9IG51bGwgPT0gb3B0X2Zyb21JbmRleCA/IGFyci5sZW5ndGggLSAxIDogb3B0X2Zyb21JbmRleDsKICAwID4gZnJvbUluZGV4ICYmIChmcm9tSW5kZXggPSBNYXRoLm1heCgwLCBhcnIubGVuZ3RoICsgZnJvbUluZGV4KSk7CiAgaWYoZ29vZy5pc1N0cmluZyhhcnIpKSB7CiAgICByZXR1cm4hZ29vZy5pc1N0cmluZyhvYmopIHx8IDEgIT0gb2JqLmxlbmd0aCA/IC0xIDogYXJyLmxhc3RJbmRleE9mKG9iaiwgZnJvbUluZGV4KQogIH0KICBmb3IodmFyIGkgPSBmcm9tSW5kZXg7MCA8PSBpO2ktLSkgewogICAgaWYoaSBpbiBhcnIgJiYgYXJyW2ldID09PSBvYmopIHsKICAgICAgcmV0dXJuIGkKICAgIH0KICB9CiAgcmV0dXJuLTEKfTsKZ29vZy5hcnJheS5mb3JFYWNoID0gZ29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyAmJiBnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8uZm9yRWFjaCA/IGZ1bmN0aW9uKGFyciwgZiwgb3B0X29iaikgewogIGdvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCAhPSBhcnIubGVuZ3RoKTsKICBnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8uZm9yRWFjaC5jYWxsKGFyciwgZiwgb3B0X29iaikKfSA6IGZ1bmN0aW9uKGFyciwgZiwgb3B0X29iaikgewogIGZvcih2YXIgbCA9IGFyci5sZW5ndGgsIGFycjIgPSBnb29nLmlzU3RyaW5nKGFycikgPyBhcnIuc3BsaXQoIiIpIDogYXJyLCBpID0gMDtpIDwgbDtpKyspIHsKICAgIGkgaW4gYXJyMiAmJiBmLmNhbGwob3B0X29iaiwgYXJyMltpXSwgaSwgYXJyKQogIH0KfTsKZ29vZy5hcnJheS5mb3JFYWNoUmlnaHQgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRmb3JFYWNoUmlnaHQkKGFyciwgZiwgb3B0X29iaikgewogIGZvcih2YXIgbCA9IGFyci5sZW5ndGgsIGFycjIgPSBnb29nLmlzU3RyaW5nKGFycikgPyBhcnIuc3BsaXQoIiIpIDogYXJyLCBpID0gbCAtIDE7MCA8PSBpOy0taSkgewogICAgaSBpbiBhcnIyICYmIGYuY2FsbChvcHRfb2JqLCBhcnIyW2ldLCBpLCBhcnIpCiAgfQp9Owpnb29nLmFycmF5LmZpbHRlciA9IGdvb2cuTkFUSVZFX0FSUkFZX1BST1RPVFlQRVMgJiYgZ29vZy5hcnJheS5BUlJBWV9QUk9UT1RZUEVfLmZpbHRlciA/IGZ1bmN0aW9uKGFyciwgZiwgb3B0X29iaikgewogIGdvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCAhPSBhcnIubGVuZ3RoKTsKICByZXR1cm4gZ29vZy5hcnJheS5BUlJBWV9QUk9UT1RZUEVfLmZpbHRlci5jYWxsKGFyciwgZiwgb3B0X29iaikKfSA6IGZ1bmN0aW9uKGFyciwgZiwgb3B0X29iaikgewogIGZvcih2YXIgbCA9IGFyci5sZW5ndGgsIHJlcyA9IFtdLCByZXNMZW5ndGggPSAwLCBhcnIyID0gZ29vZy5pc1N0cmluZyhhcnIpID8gYXJyLnNwbGl0KCIiKSA6IGFyciwgaSA9IDA7aSA8IGw7aSsrKSB7CiAgICBpZihpIGluIGFycjIpIHsKICAgICAgdmFyIHZhbCA9IGFycjJbaV07CiAgICAgIGYuY2FsbChvcHRfb2JqLCB2YWwsIGksIGFycikgJiYgKHJlc1tyZXNMZW5ndGgrK10gPSB2YWwpCiAgICB9CiAgfQogIHJldHVybiByZXMKfTsKZ29vZy5hcnJheS5tYXAgPSBnb29nLk5BVElWRV9BUlJBWV9QUk9UT1RZUEVTICYmIGdvb2cuYXJyYXkuQVJSQVlfUFJPVE9UWVBFXy5tYXAgPyBmdW5jdGlvbihhcnIsIGYsIG9wdF9vYmopIHsKICBnb29nLmFzc2VydHMuYXNzZXJ0KG51bGwgIT0gYXJyLmxlbmd0aCk7CiAgcmV0dXJuIGdvb2cuYXJyYXkuQVJSQVlfUFJPVE9UWVBFXy5tYXAuY2FsbChhcnIsIGYsIG9wdF9vYmopCn0gOiBmdW5jdGlvbihhcnIsIGYsIG9wdF9vYmopIHsKICBmb3IodmFyIGwgPSBhcnIubGVuZ3RoLCByZXMgPSBBcnJheShsKSwgYXJyMiA9IGdvb2cuaXNTdHJpbmcoYXJyKSA/IGFyci5zcGxpdCgiIikgOiBhcnIsIGkgPSAwO2kgPCBsO2krKykgewogICAgaSBpbiBhcnIyICYmIChyZXNbaV0gPSBmLmNhbGwob3B0X29iaiwgYXJyMltpXSwgaSwgYXJyKSkKICB9CiAgcmV0dXJuIHJlcwp9Owpnb29nLmFycmF5LnJlZHVjZSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JHJlZHVjZSQoYXJyLCBmLCB2YWwkJDAsIG9wdF9vYmopIHsKICBpZihhcnIucmVkdWNlKSB7CiAgICByZXR1cm4gb3B0X29iaiA/IGFyci5yZWR1Y2UoZ29vZy5iaW5kKGYsIG9wdF9vYmopLCB2YWwkJDApIDogYXJyLnJlZHVjZShmLCB2YWwkJDApCiAgfQogIHZhciBydmFsID0gdmFsJCQwOwogIGdvb2cuYXJyYXkuZm9yRWFjaChhcnIsIGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHsKICAgIHJ2YWwgPSBmLmNhbGwob3B0X29iaiwgcnZhbCwgdmFsLCBpbmRleCwgYXJyKQogIH0pOwogIHJldHVybiBydmFsCn07Cmdvb2cuYXJyYXkucmVkdWNlUmlnaHQgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRyZWR1Y2VSaWdodCQoYXJyLCBmLCB2YWwkJDAsIG9wdF9vYmopIHsKICBpZihhcnIucmVkdWNlUmlnaHQpIHsKICAgIHJldHVybiBvcHRfb2JqID8gYXJyLnJlZHVjZVJpZ2h0KGdvb2cuYmluZChmLCBvcHRfb2JqKSwgdmFsJCQwKSA6IGFyci5yZWR1Y2VSaWdodChmLCB2YWwkJDApCiAgfQogIHZhciBydmFsID0gdmFsJCQwOwogIGdvb2cuYXJyYXkuZm9yRWFjaFJpZ2h0KGFyciwgZnVuY3Rpb24odmFsLCBpbmRleCkgewogICAgcnZhbCA9IGYuY2FsbChvcHRfb2JqLCBydmFsLCB2YWwsIGluZGV4LCBhcnIpCiAgfSk7CiAgcmV0dXJuIHJ2YWwKfTsKZ29vZy5hcnJheS5zb21lID0gZ29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyAmJiBnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8uc29tZSA/IGZ1bmN0aW9uKGFyciwgZiwgb3B0X29iaikgewogIGdvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCAhPSBhcnIubGVuZ3RoKTsKICByZXR1cm4gZ29vZy5hcnJheS5BUlJBWV9QUk9UT1RZUEVfLnNvbWUuY2FsbChhcnIsIGYsIG9wdF9vYmopCn0gOiBmdW5jdGlvbihhcnIsIGYsIG9wdF9vYmopIHsKICBmb3IodmFyIGwgPSBhcnIubGVuZ3RoLCBhcnIyID0gZ29vZy5pc1N0cmluZyhhcnIpID8gYXJyLnNwbGl0KCIiKSA6IGFyciwgaSA9IDA7aSA8IGw7aSsrKSB7CiAgICBpZihpIGluIGFycjIgJiYgZi5jYWxsKG9wdF9vYmosIGFycjJbaV0sIGksIGFycikpIHsKICAgICAgcmV0dXJuITAKICAgIH0KICB9CiAgcmV0dXJuITEKfTsKZ29vZy5hcnJheS5ldmVyeSA9IGdvb2cuTkFUSVZFX0FSUkFZX1BST1RPVFlQRVMgJiYgZ29vZy5hcnJheS5BUlJBWV9QUk9UT1RZUEVfLmV2ZXJ5ID8gZnVuY3Rpb24oYXJyLCBmLCBvcHRfb2JqKSB7CiAgZ29vZy5hc3NlcnRzLmFzc2VydChudWxsICE9IGFyci5sZW5ndGgpOwogIHJldHVybiBnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8uZXZlcnkuY2FsbChhcnIsIGYsIG9wdF9vYmopCn0gOiBmdW5jdGlvbihhcnIsIGYsIG9wdF9vYmopIHsKICBmb3IodmFyIGwgPSBhcnIubGVuZ3RoLCBhcnIyID0gZ29vZy5pc1N0cmluZyhhcnIpID8gYXJyLnNwbGl0KCIiKSA6IGFyciwgaSA9IDA7aSA8IGw7aSsrKSB7CiAgICBpZihpIGluIGFycjIgJiYgIWYuY2FsbChvcHRfb2JqLCBhcnIyW2ldLCBpLCBhcnIpKSB7CiAgICAgIHJldHVybiExCiAgICB9CiAgfQogIHJldHVybiEwCn07Cmdvb2cuYXJyYXkuZmluZCA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGZpbmQkKGFyciwgZiwgb3B0X29iaikgewogIHZhciBpID0gZ29vZy5hcnJheS5maW5kSW5kZXgoYXJyLCBmLCBvcHRfb2JqKTsKICByZXR1cm4gMCA+IGkgPyBudWxsIDogZ29vZy5pc1N0cmluZyhhcnIpID8gYXJyLmNoYXJBdChpKSA6IGFycltpXQp9Owpnb29nLmFycmF5LmZpbmRJbmRleCA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGZpbmRJbmRleCQoYXJyLCBmLCBvcHRfb2JqKSB7CiAgZm9yKHZhciBsID0gYXJyLmxlbmd0aCwgYXJyMiA9IGdvb2cuaXNTdHJpbmcoYXJyKSA/IGFyci5zcGxpdCgiIikgOiBhcnIsIGkgPSAwO2kgPCBsO2krKykgewogICAgaWYoaSBpbiBhcnIyICYmIGYuY2FsbChvcHRfb2JqLCBhcnIyW2ldLCBpLCBhcnIpKSB7CiAgICAgIHJldHVybiBpCiAgICB9CiAgfQogIHJldHVybi0xCn07Cmdvb2cuYXJyYXkuZmluZFJpZ2h0ID0gZnVuY3Rpb24gJGdvb2ckYXJyYXkkZmluZFJpZ2h0JChhcnIsIGYsIG9wdF9vYmopIHsKICB2YXIgaSA9IGdvb2cuYXJyYXkuZmluZEluZGV4UmlnaHQoYXJyLCBmLCBvcHRfb2JqKTsKICByZXR1cm4gMCA+IGkgPyBudWxsIDogZ29vZy5pc1N0cmluZyhhcnIpID8gYXJyLmNoYXJBdChpKSA6IGFycltpXQp9Owpnb29nLmFycmF5LmZpbmRJbmRleFJpZ2h0ID0gZnVuY3Rpb24gJGdvb2ckYXJyYXkkZmluZEluZGV4UmlnaHQkKGFyciwgZiwgb3B0X29iaikgewogIGZvcih2YXIgbCA9IGFyci5sZW5ndGgsIGFycjIgPSBnb29nLmlzU3RyaW5nKGFycikgPyBhcnIuc3BsaXQoIiIpIDogYXJyLCBpID0gbCAtIDE7MCA8PSBpO2ktLSkgewogICAgaWYoaSBpbiBhcnIyICYmIGYuY2FsbChvcHRfb2JqLCBhcnIyW2ldLCBpLCBhcnIpKSB7CiAgICAgIHJldHVybiBpCiAgICB9CiAgfQogIHJldHVybi0xCn07Cmdvb2cuYXJyYXkuY29udGFpbnMgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRjb250YWlucyQoYXJyLCBvYmopIHsKICByZXR1cm4gMCA8PSBnb29nLmFycmF5LmluZGV4T2YoYXJyLCBvYmopCn07Cmdvb2cuYXJyYXkuaXNFbXB0eSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGlzRW1wdHkkKGFycikgewogIHJldHVybiAwID09IGFyci5sZW5ndGgKfTsKZ29vZy5hcnJheS5jbGVhciA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGNsZWFyJChhcnIpIHsKICBpZighZ29vZy5pc0FycmF5KGFycikpIHsKICAgIGZvcih2YXIgaSA9IGFyci5sZW5ndGggLSAxOzAgPD0gaTtpLS0pIHsKICAgICAgZGVsZXRlIGFycltpXQogICAgfQogIH0KICBhcnIubGVuZ3RoID0gMAp9Owpnb29nLmFycmF5Lmluc2VydCA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGluc2VydCQoYXJyLCBvYmopIHsKICBnb29nLmFycmF5LmNvbnRhaW5zKGFyciwgb2JqKSB8fCBhcnIucHVzaChvYmopCn07Cmdvb2cuYXJyYXkuaW5zZXJ0QXQgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRpbnNlcnRBdCQoYXJyLCBvYmosIG9wdF9pKSB7CiAgZ29vZy5hcnJheS5zcGxpY2UoYXJyLCBvcHRfaSwgMCwgb2JqKQp9Owpnb29nLmFycmF5Lmluc2VydEFycmF5QXQgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRpbnNlcnRBcnJheUF0JChhcnIsIGVsZW1lbnRzVG9BZGQsIG9wdF9pKSB7CiAgZ29vZy5wYXJ0aWFsKGdvb2cuYXJyYXkuc3BsaWNlLCBhcnIsIG9wdF9pLCAwKS5hcHBseShudWxsLCBlbGVtZW50c1RvQWRkKQp9Owpnb29nLmFycmF5Lmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGluc2VydEJlZm9yZSQoYXJyLCBvYmosIG9wdF9vYmoyKSB7CiAgdmFyIGk7CiAgMiA9PSBhcmd1bWVudHMubGVuZ3RoIHx8IDAgPiAoaSA9IGdvb2cuYXJyYXkuaW5kZXhPZihhcnIsIG9wdF9vYmoyKSkgPyBhcnIucHVzaChvYmopIDogZ29vZy5hcnJheS5pbnNlcnRBdChhcnIsIG9iaiwgaSkKfTsKZ29vZy5hcnJheS5yZW1vdmUgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRyZW1vdmUkKGFyciwgb2JqKSB7CiAgdmFyIGkgPSBnb29nLmFycmF5LmluZGV4T2YoYXJyLCBvYmopLCBydjsKICAocnYgPSAwIDw9IGkpICYmIGdvb2cuYXJyYXkucmVtb3ZlQXQoYXJyLCBpKTsKICByZXR1cm4gcnYKfTsKZ29vZy5hcnJheS5yZW1vdmVBdCA9IGZ1bmN0aW9uICRnb29nJGFycmF5JHJlbW92ZUF0JChhcnIsIGkpIHsKICBnb29nLmFzc2VydHMuYXNzZXJ0KG51bGwgIT0gYXJyLmxlbmd0aCk7CiAgcmV0dXJuIDEgPT0gZ29vZy5hcnJheS5BUlJBWV9QUk9UT1RZUEVfLnNwbGljZS5jYWxsKGFyciwgaSwgMSkubGVuZ3RoCn07Cmdvb2cuYXJyYXkucmVtb3ZlSWYgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRyZW1vdmVJZiQoYXJyLCBmLCBvcHRfb2JqKSB7CiAgdmFyIGkgPSBnb29nLmFycmF5LmZpbmRJbmRleChhcnIsIGYsIG9wdF9vYmopOwogIHJldHVybiAwIDw9IGkgPyAoZ29vZy5hcnJheS5yZW1vdmVBdChhcnIsIGkpLCAhMCkgOiAhMQp9Owpnb29nLmFycmF5LmNvbmNhdCA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGNvbmNhdCQodmFyX2FyZ3MpIHsKICByZXR1cm4gZ29vZy5hcnJheS5BUlJBWV9QUk9UT1RZUEVfLmNvbmNhdC5hcHBseShnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8sIGFyZ3VtZW50cykKfTsKZ29vZy5hcnJheS5jbG9uZSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGNsb25lJChhcnIpIHsKICBpZihnb29nLmlzQXJyYXkoYXJyKSkgewogICAgcmV0dXJuIGdvb2cuYXJyYXkuY29uY2F0KGFycikKICB9CiAgZm9yKHZhciBydiA9IFtdLCBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDtpIDwgbGVuO2krKykgewogICAgcnZbaV0gPSBhcnJbaV0KICB9CiAgcmV0dXJuIHJ2Cn07Cmdvb2cuYXJyYXkudG9BcnJheSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JHRvQXJyYXkkKG9iamVjdCkgewogIHJldHVybiBnb29nLmlzQXJyYXkob2JqZWN0KSA/IGdvb2cuYXJyYXkuY29uY2F0KG9iamVjdCkgOiBnb29nLmFycmF5LmNsb25lKG9iamVjdCkKfTsKZ29vZy5hcnJheS5leHRlbmQgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRleHRlbmQkKGFycjEsIHZhcl9hcmdzKSB7CiAgZm9yKHZhciBpID0gMTtpIDwgYXJndW1lbnRzLmxlbmd0aDtpKyspIHsKICAgIHZhciBhcnIyID0gYXJndW1lbnRzW2ldLCBpc0FycmF5TGlrZTsKICAgIGlmKGdvb2cuaXNBcnJheShhcnIyKSB8fCAoaXNBcnJheUxpa2UgPSBnb29nLmlzQXJyYXlMaWtlKGFycjIpKSAmJiBhcnIyLmhhc093blByb3BlcnR5KCJjYWxsZWUiKSkgewogICAgICBhcnIxLnB1c2guYXBwbHkoYXJyMSwgYXJyMikKICAgIH1lbHNlIHsKICAgICAgaWYoaXNBcnJheUxpa2UpIHsKICAgICAgICBmb3IodmFyIGxlbjEgPSBhcnIxLmxlbmd0aCwgbGVuMiA9IGFycjIubGVuZ3RoLCBqID0gMDtqIDwgbGVuMjtqKyspIHsKICAgICAgICAgIGFycjFbbGVuMSArIGpdID0gYXJyMltqXQogICAgICAgIH0KICAgICAgfWVsc2UgewogICAgICAgIGFycjEucHVzaChhcnIyKQogICAgICB9CiAgICB9CiAgfQp9Owpnb29nLmFycmF5LnNwbGljZSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JHNwbGljZSQoYXJyLCBpbmRleCwgaG93TWFueSwgdmFyX2FyZ3MpIHsKICBnb29nLmFzc2VydHMuYXNzZXJ0KG51bGwgIT0gYXJyLmxlbmd0aCk7CiAgcmV0dXJuIGdvb2cuYXJyYXkuQVJSQVlfUFJPVE9UWVBFXy5zcGxpY2UuYXBwbHkoYXJyLCBnb29nLmFycmF5LnNsaWNlKGFyZ3VtZW50cywgMSkpCn07Cmdvb2cuYXJyYXkuc2xpY2UgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRzbGljZSQoYXJyLCBzdGFydCwgb3B0X2VuZCkgewogIGdvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCAhPSBhcnIubGVuZ3RoKTsKICByZXR1cm4gMiA+PSBhcmd1bWVudHMubGVuZ3RoID8gZ29vZy5hcnJheS5BUlJBWV9QUk9UT1RZUEVfLnNsaWNlLmNhbGwoYXJyLCBzdGFydCkgOiBnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8uc2xpY2UuY2FsbChhcnIsIHN0YXJ0LCBvcHRfZW5kKQp9Owpnb29nLmFycmF5LnJlbW92ZUR1cGxpY2F0ZXMgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRyZW1vdmVEdXBsaWNhdGVzJChhcnIsIG9wdF9ydikgewogIGZvcih2YXIgcmV0dXJuQXJyYXkgPSBvcHRfcnYgfHwgYXJyLCBzZWVuID0ge30sIGN1cnNvckluc2VydCA9IDAsIGN1cnNvclJlYWQgPSAwO2N1cnNvclJlYWQgPCBhcnIubGVuZ3RoOykgewogICAgdmFyIGN1cnJlbnQgPSBhcnJbY3Vyc29yUmVhZCsrXSwga2V5ID0gZ29vZy5pc09iamVjdChjdXJyZW50KSA/ICJvIiArIGdvb2cuZ2V0VWlkKGN1cnJlbnQpIDogKHR5cGVvZiBjdXJyZW50KS5jaGFyQXQoMCkgKyBjdXJyZW50OwogICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlZW4sIGtleSkgfHwgKHNlZW5ba2V5XSA9ICEwLCByZXR1cm5BcnJheVtjdXJzb3JJbnNlcnQrK10gPSBjdXJyZW50KQogIH0KICByZXR1cm5BcnJheS5sZW5ndGggPSBjdXJzb3JJbnNlcnQKfTsKZ29vZy5hcnJheS5iaW5hcnlTZWFyY2ggPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRiaW5hcnlTZWFyY2gkKGFyciwgdGFyZ2V0LCBvcHRfY29tcGFyZUZuKSB7CiAgcmV0dXJuIGdvb2cuYXJyYXkuYmluYXJ5U2VhcmNoXyhhcnIsIG9wdF9jb21wYXJlRm4gfHwgZ29vZy5hcnJheS5kZWZhdWx0Q29tcGFyZSwgITEsIHRhcmdldCkKfTsKZ29vZy5hcnJheS5iaW5hcnlTZWxlY3QgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRiaW5hcnlTZWxlY3QkKGFyciwgZXZhbHVhdG9yLCBvcHRfb2JqKSB7CiAgcmV0dXJuIGdvb2cuYXJyYXkuYmluYXJ5U2VhcmNoXyhhcnIsIGV2YWx1YXRvciwgITAsIHZvaWQgMCwgb3B0X29iaikKfTsKZ29vZy5hcnJheS5iaW5hcnlTZWFyY2hfID0gZnVuY3Rpb24gJGdvb2ckYXJyYXkkYmluYXJ5U2VhcmNoXyQoYXJyLCBjb21wYXJlRm4sIGlzRXZhbHVhdG9yLCBvcHRfdGFyZ2V0LCBvcHRfc2VsZk9iaikgewogIGZvcih2YXIgbGVmdCA9IDAsIHJpZ2h0ID0gYXJyLmxlbmd0aCwgZm91bmQ7bGVmdCA8IHJpZ2h0OykgewogICAgdmFyIG1pZGRsZSA9IGxlZnQgKyByaWdodCA+PiAxLCBjb21wYXJlUmVzdWx0OwogICAgY29tcGFyZVJlc3VsdCA9IGlzRXZhbHVhdG9yID8gY29tcGFyZUZuLmNhbGwob3B0X3NlbGZPYmosIGFyclttaWRkbGVdLCBtaWRkbGUsIGFycikgOiBjb21wYXJlRm4ob3B0X3RhcmdldCwgYXJyW21pZGRsZV0pOwogICAgMCA8IGNvbXBhcmVSZXN1bHQgPyBsZWZ0ID0gbWlkZGxlICsgMSA6IChyaWdodCA9IG1pZGRsZSwgZm91bmQgPSAhY29tcGFyZVJlc3VsdCkKICB9CiAgcmV0dXJuIGZvdW5kID8gbGVmdCA6IH5sZWZ0Cn07Cmdvb2cuYXJyYXkuc29ydCA9IGZ1bmN0aW9uICRnb29nJGFycmF5JHNvcnQkKGFyciwgb3B0X2NvbXBhcmVGbikgewogIGdvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCAhPSBhcnIubGVuZ3RoKTsKICBnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8uc29ydC5jYWxsKGFyciwgb3B0X2NvbXBhcmVGbiB8fCBnb29nLmFycmF5LmRlZmF1bHRDb21wYXJlKQp9Owpnb29nLmFycmF5LnN0YWJsZVNvcnQgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRzdGFibGVTb3J0JChhcnIsIG9wdF9jb21wYXJlRm4pIHsKICBmdW5jdGlvbiBzdGFibGVDb21wYXJlRm4ob2JqMSwgb2JqMikgewogICAgcmV0dXJuIHZhbHVlQ29tcGFyZUZuKG9iajEudmFsdWUsIG9iajIudmFsdWUpIHx8IG9iajEuaW5kZXggLSBvYmoyLmluZGV4CiAgfQogIGZvcih2YXIgaSA9IDA7aSA8IGFyci5sZW5ndGg7aSsrKSB7CiAgICBhcnJbaV0gPSB7aW5kZXg6aSwgdmFsdWU6YXJyW2ldfQogIH0KICB2YXIgdmFsdWVDb21wYXJlRm4gPSBvcHRfY29tcGFyZUZuIHx8IGdvb2cuYXJyYXkuZGVmYXVsdENvbXBhcmU7CiAgZ29vZy5hcnJheS5zb3J0KGFyciwgc3RhYmxlQ29tcGFyZUZuKTsKICBmb3IoaSA9IDA7aSA8IGFyci5sZW5ndGg7aSsrKSB7CiAgICBhcnJbaV0gPSBhcnJbaV0udmFsdWUKICB9Cn07Cmdvb2cuYXJyYXkuc29ydE9iamVjdHNCeUtleSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JHNvcnRPYmplY3RzQnlLZXkkKGFyciwga2V5LCBvcHRfY29tcGFyZUZuKSB7CiAgdmFyIGNvbXBhcmUgPSBvcHRfY29tcGFyZUZuIHx8IGdvb2cuYXJyYXkuZGVmYXVsdENvbXBhcmU7CiAgZ29vZy5hcnJheS5zb3J0KGFyciwgZnVuY3Rpb24oYSwgYikgewogICAgcmV0dXJuIGNvbXBhcmUoYVtrZXldLCBiW2tleV0pCiAgfSkKfTsKZ29vZy5hcnJheS5pc1NvcnRlZCA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGlzU29ydGVkJChhcnIsIG9wdF9jb21wYXJlRm4sIG9wdF9zdHJpY3QpIHsKICBmb3IodmFyIGNvbXBhcmUgPSBvcHRfY29tcGFyZUZuIHx8IGdvb2cuYXJyYXkuZGVmYXVsdENvbXBhcmUsIGkgPSAxO2kgPCBhcnIubGVuZ3RoO2krKykgewogICAgdmFyIGNvbXBhcmVSZXN1bHQgPSBjb21wYXJlKGFycltpIC0gMV0sIGFycltpXSk7CiAgICBpZigwIDwgY29tcGFyZVJlc3VsdCB8fCAwID09IGNvbXBhcmVSZXN1bHQgJiYgb3B0X3N0cmljdCkgewogICAgICByZXR1cm4hMQogICAgfQogIH0KICByZXR1cm4hMAp9Owpnb29nLmFycmF5LmVxdWFscyA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGVxdWFscyQoYXJyMSwgYXJyMiwgb3B0X2VxdWFsc0ZuKSB7CiAgaWYoIWdvb2cuaXNBcnJheUxpa2UoYXJyMSkgfHwgIWdvb2cuaXNBcnJheUxpa2UoYXJyMikgfHwgYXJyMS5sZW5ndGggIT0gYXJyMi5sZW5ndGgpIHsKICAgIHJldHVybiExCiAgfQogIGZvcih2YXIgbCA9IGFycjEubGVuZ3RoLCBlcXVhbHNGbiA9IG9wdF9lcXVhbHNGbiB8fCBnb29nLmFycmF5LmRlZmF1bHRDb21wYXJlRXF1YWxpdHksIGkgPSAwO2kgPCBsO2krKykgewogICAgaWYoIWVxdWFsc0ZuKGFycjFbaV0sIGFycjJbaV0pKSB7CiAgICAgIHJldHVybiExCiAgICB9CiAgfQogIHJldHVybiEwCn07Cmdvb2cuYXJyYXkuY29tcGFyZSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGNvbXBhcmUkKGFycjEsIGFycjIsIG9wdF9lcXVhbHNGbikgewogIHJldHVybiBnb29nLmFycmF5LmVxdWFscyhhcnIxLCBhcnIyLCBvcHRfZXF1YWxzRm4pCn07Cmdvb2cuYXJyYXkuY29tcGFyZTMgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRjb21wYXJlMyQoYXJyMSwgYXJyMiwgb3B0X2NvbXBhcmVGbikgewogIGZvcih2YXIgY29tcGFyZSA9IG9wdF9jb21wYXJlRm4gfHwgZ29vZy5hcnJheS5kZWZhdWx0Q29tcGFyZSwgbCA9IE1hdGgubWluKGFycjEubGVuZ3RoLCBhcnIyLmxlbmd0aCksIGkgPSAwO2kgPCBsO2krKykgewogICAgdmFyIHJlc3VsdCA9IGNvbXBhcmUoYXJyMVtpXSwgYXJyMltpXSk7CiAgICBpZigwICE9IHJlc3VsdCkgewogICAgICByZXR1cm4gcmVzdWx0CiAgICB9CiAgfQogIHJldHVybiBnb29nLmFycmF5LmRlZmF1bHRDb21wYXJlKGFycjEubGVuZ3RoLCBhcnIyLmxlbmd0aCkKfTsKZ29vZy5hcnJheS5kZWZhdWx0Q29tcGFyZSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGRlZmF1bHRDb21wYXJlJChhLCBiKSB7CiAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwCn07Cmdvb2cuYXJyYXkuZGVmYXVsdENvbXBhcmVFcXVhbGl0eSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGRlZmF1bHRDb21wYXJlRXF1YWxpdHkkKGEsIGIpIHsKICByZXR1cm4gYSA9PT0gYgp9Owpnb29nLmFycmF5LmJpbmFyeUluc2VydCA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGJpbmFyeUluc2VydCQoYXJyYXksIHZhbHVlLCBvcHRfY29tcGFyZUZuKSB7CiAgdmFyIGluZGV4ID0gZ29vZy5hcnJheS5iaW5hcnlTZWFyY2goYXJyYXksIHZhbHVlLCBvcHRfY29tcGFyZUZuKTsKICByZXR1cm4gMCA+IGluZGV4ID8gKGdvb2cuYXJyYXkuaW5zZXJ0QXQoYXJyYXksIHZhbHVlLCAtKGluZGV4ICsgMSkpLCAhMCkgOiAhMQp9Owpnb29nLmFycmF5LmJpbmFyeVJlbW92ZSA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGJpbmFyeVJlbW92ZSQoYXJyYXksIHZhbHVlLCBvcHRfY29tcGFyZUZuKSB7CiAgdmFyIGluZGV4ID0gZ29vZy5hcnJheS5iaW5hcnlTZWFyY2goYXJyYXksIHZhbHVlLCBvcHRfY29tcGFyZUZuKTsKICByZXR1cm4gMCA8PSBpbmRleCA/IGdvb2cuYXJyYXkucmVtb3ZlQXQoYXJyYXksIGluZGV4KSA6ICExCn07Cmdvb2cuYXJyYXkuYnVja2V0ID0gZnVuY3Rpb24gJGdvb2ckYXJyYXkkYnVja2V0JChhcnJheSwgc29ydGVyKSB7CiAgZm9yKHZhciBidWNrZXRzID0ge30sIGkgPSAwO2kgPCBhcnJheS5sZW5ndGg7aSsrKSB7CiAgICB2YXIgdmFsdWUgPSBhcnJheVtpXSwga2V5ID0gc29ydGVyKHZhbHVlLCBpLCBhcnJheSk7CiAgICBpZihnb29nLmlzRGVmKGtleSkpIHsKICAgICAgdmFyIGJ1Y2tldCA9IGJ1Y2tldHNba2V5XSB8fCAoYnVja2V0c1trZXldID0gW10pOwogICAgICBidWNrZXQucHVzaCh2YWx1ZSkKICAgIH0KICB9CiAgcmV0dXJuIGJ1Y2tldHMKfTsKZ29vZy5hcnJheS5yZXBlYXQgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRyZXBlYXQkKHZhbHVlLCBuKSB7CiAgZm9yKHZhciBhcnJheSA9IFtdLCBpID0gMDtpIDwgbjtpKyspIHsKICAgIGFycmF5W2ldID0gdmFsdWUKICB9CiAgcmV0dXJuIGFycmF5Cn07Cmdvb2cuYXJyYXkuZmxhdHRlbiA9IGZ1bmN0aW9uICRnb29nJGFycmF5JGZsYXR0ZW4kKHZhcl9hcmdzKSB7CiAgZm9yKHZhciByZXN1bHQgPSBbXSwgaSA9IDA7aSA8IGFyZ3VtZW50cy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgZWxlbWVudCA9IGFyZ3VtZW50c1tpXTsKICAgIGdvb2cuaXNBcnJheShlbGVtZW50KSA/IHJlc3VsdC5wdXNoLmFwcGx5KHJlc3VsdCwgZ29vZy5hcnJheS5mbGF0dGVuLmFwcGx5KG51bGwsIGVsZW1lbnQpKSA6IHJlc3VsdC5wdXNoKGVsZW1lbnQpCiAgfQogIHJldHVybiByZXN1bHQKfTsKZ29vZy5hcnJheS5yb3RhdGUgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRyb3RhdGUkKGFycmF5LCBuKSB7CiAgZ29vZy5hc3NlcnRzLmFzc2VydChudWxsICE9IGFycmF5Lmxlbmd0aCk7CiAgYXJyYXkubGVuZ3RoICYmIChuICU9IGFycmF5Lmxlbmd0aCwgMCA8IG4gPyBnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8udW5zaGlmdC5hcHBseShhcnJheSwgYXJyYXkuc3BsaWNlKC1uLCBuKSkgOiAwID4gbiAmJiBnb29nLmFycmF5LkFSUkFZX1BST1RPVFlQRV8ucHVzaC5hcHBseShhcnJheSwgYXJyYXkuc3BsaWNlKDAsIC1uKSkpOwogIHJldHVybiBhcnJheQp9Owpnb29nLmFycmF5LnppcCA9IGZ1bmN0aW9uICRnb29nJGFycmF5JHppcCQodmFyX2FyZ3MpIHsKICBpZighYXJndW1lbnRzLmxlbmd0aCkgewogICAgcmV0dXJuW10KICB9CiAgZm9yKHZhciByZXN1bHQgPSBbXSwgaSA9IDA7O2krKykgewogICAgZm9yKHZhciB2YWx1ZSA9IFtdLCBqID0gMDtqIDwgYXJndW1lbnRzLmxlbmd0aDtqKyspIHsKICAgICAgdmFyIGFyciA9IGFyZ3VtZW50c1tqXTsKICAgICAgaWYoaSA+PSBhcnIubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICB9CiAgICAgIHZhbHVlLnB1c2goYXJyW2ldKQogICAgfQogICAgcmVzdWx0LnB1c2godmFsdWUpCiAgfQp9Owpnb29nLmFycmF5LnNodWZmbGUgPSBmdW5jdGlvbiAkZ29vZyRhcnJheSRzaHVmZmxlJChhcnIsIG9wdF9yYW5kRm4pIHsKICBmb3IodmFyIHJhbmRGbiA9IG9wdF9yYW5kRm4gfHwgTWF0aC5yYW5kb20sIGkgPSBhcnIubGVuZ3RoIC0gMTswIDwgaTtpLS0pIHsKICAgIHZhciBqID0gTWF0aC5mbG9vcihyYW5kRm4oKSAqIChpICsgMSkpLCB0bXAgPSBhcnJbaV07CiAgICBhcnJbaV0gPSBhcnJbal07CiAgICBhcnJbal0gPSB0bXAKICB9Cn07Cmdvb2cuZGlzcG9zYWJsZSA9IHt9Owpnb29nLmRpc3Bvc2FibGUuSURpc3Bvc2FibGUgPSBmdW5jdGlvbiAkZ29vZyRkaXNwb3NhYmxlJElEaXNwb3NhYmxlJCgpIHsKfTsKZ29vZy5EaXNwb3NhYmxlID0gZnVuY3Rpb24gJGdvb2ckRGlzcG9zYWJsZSQoKSB7CiAgZ29vZy5EaXNwb3NhYmxlLkVOQUJMRV9NT05JVE9SSU5HICYmIChnb29nLkRpc3Bvc2FibGUuaW5zdGFuY2VzX1tnb29nLmdldFVpZCh0aGlzKV0gPSB0aGlzKQp9Owpnb29nLkRpc3Bvc2FibGUuRU5BQkxFX01PTklUT1JJTkcgPSAhMTsKZ29vZy5EaXNwb3NhYmxlLmluc3RhbmNlc18gPSB7fTsKZ29vZy5EaXNwb3NhYmxlLmdldFVuZGlzcG9zZWRPYmplY3RzID0gZnVuY3Rpb24gJGdvb2ckRGlzcG9zYWJsZSRnZXRVbmRpc3Bvc2VkT2JqZWN0cyQoKSB7CiAgdmFyIHJldCA9IFtdLCBpZDsKICBmb3IoaWQgaW4gZ29vZy5EaXNwb3NhYmxlLmluc3RhbmNlc18pIHsKICAgIGdvb2cuRGlzcG9zYWJsZS5pbnN0YW5jZXNfLmhhc093blByb3BlcnR5KGlkKSAmJiByZXQucHVzaChnb29nLkRpc3Bvc2FibGUuaW5zdGFuY2VzX1tOdW1iZXIoaWQpXSkKICB9CiAgcmV0dXJuIHJldAp9Owpnb29nLkRpc3Bvc2FibGUuY2xlYXJVbmRpc3Bvc2VkT2JqZWN0cyA9IGZ1bmN0aW9uICRnb29nJERpc3Bvc2FibGUkY2xlYXJVbmRpc3Bvc2VkT2JqZWN0cyQoKSB7CiAgZ29vZy5EaXNwb3NhYmxlLmluc3RhbmNlc18gPSB7fQp9Owpnb29nLkRpc3Bvc2FibGUucHJvdG90eXBlLmRpc3Bvc2VkXyA9ICExOwpnb29nLkRpc3Bvc2FibGUucHJvdG90eXBlLmlzRGlzcG9zZWQgPSBmdW5jdGlvbiAkZ29vZyREaXNwb3NhYmxlJCRpc0Rpc3Bvc2VkJCgpIHsKICByZXR1cm4gdGhpcy5kaXNwb3NlZF8KfTsKZ29vZy5EaXNwb3NhYmxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gJGdvb2ckRGlzcG9zYWJsZSQkZGlzcG9zZSQoKSB7CiAgaWYoIXRoaXMuZGlzcG9zZWRfICYmICh0aGlzLmRpc3Bvc2VkXyA9ICEwLCB0aGlzLmRpc3Bvc2VJbnRlcm5hbCgpLCBnb29nLkRpc3Bvc2FibGUuRU5BQkxFX01PTklUT1JJTkcpKSB7CiAgICB2YXIgdWlkID0gZ29vZy5nZXRVaWQodGhpcyk7CiAgICBpZighZ29vZy5EaXNwb3NhYmxlLmluc3RhbmNlc18uaGFzT3duUHJvcGVydHkodWlkKSkgewogICAgICB0aHJvdyBFcnJvcih0aGlzICsgIiBkaWQgbm90IGNhbGwgdGhlIGdvb2cuRGlzcG9zYWJsZSBiYXNlIGNvbnN0cnVjdG9yIG9yIHdhcyBkaXNwb3NlZCBvZiBhZnRlciBhIGNsZWFyVW5kaXNwb3NlZE9iamVjdHMgY2FsbCIpOwogICAgfQogICAgZGVsZXRlIGdvb2cuRGlzcG9zYWJsZS5pbnN0YW5jZXNfW3VpZF0KICB9Cn07Cmdvb2cuRGlzcG9zYWJsZS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGdvb2ckRGlzcG9zYWJsZSQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0aGlzLmRlcGVuZGVudERpc3Bvc2FibGVzXyAmJiBnb29nLmRpc3Bvc2VBbGwuYXBwbHkobnVsbCwgdGhpcy5kZXBlbmRlbnREaXNwb3NhYmxlc18pCn07Cmdvb2cuZGlzcG9zZSA9IGZ1bmN0aW9uICRnb29nJGRpc3Bvc2UkKG9iaikgewogIG9iaiAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBvYmouZGlzcG9zZSAmJiBvYmouZGlzcG9zZSgpCn07Cmdvb2cuZGlzcG9zZUFsbCA9IGZ1bmN0aW9uICRnb29nJGRpc3Bvc2VBbGwkKHZhcl9hcmdzKSB7CiAgZm9yKHZhciBpID0gMCwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtpIDwgbGVuOysraSkgewogICAgdmFyIGRpc3Bvc2FibGUgPSBhcmd1bWVudHNbaV07CiAgICBnb29nLmlzQXJyYXlMaWtlKGRpc3Bvc2FibGUpID8gZ29vZy5kaXNwb3NlQWxsLmFwcGx5KG51bGwsIGRpc3Bvc2FibGUpIDogZ29vZy5kaXNwb3NlKGRpc3Bvc2FibGUpCiAgfQp9Owpnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeSA9IHt9Owpnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRW50cnlQb2ludE1vbml0b3IkKCkgewp9Owpnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeS5yZWZMaXN0XyA9IFtdOwpnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeS5tb25pdG9yc18gPSBbXTsKZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnkubW9uaXRvcnNNYXlFeGlzdF8gPSAhMTsKZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnkucmVnaXN0ZXIgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRlbnRyeVBvaW50UmVnaXN0cnkkcmVnaXN0ZXIkKGNhbGxiYWNrKSB7CiAgZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnkucmVmTGlzdF9bZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnkucmVmTGlzdF8ubGVuZ3RoXSA9IGNhbGxiYWNrOwogIGlmKGdvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5Lm1vbml0b3JzTWF5RXhpc3RfKSB7CiAgICBmb3IodmFyIG1vbml0b3JzID0gZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnkubW9uaXRvcnNfLCBpID0gMDtpIDwgbW9uaXRvcnMubGVuZ3RoO2krKykgewogICAgICBjYWxsYmFjayhnb29nLmJpbmQobW9uaXRvcnNbaV0ud3JhcCwgbW9uaXRvcnNbaV0pKQogICAgfQogIH0KfTsKZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnkubW9uaXRvckFsbCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJGVudHJ5UG9pbnRSZWdpc3RyeSRtb25pdG9yQWxsJChtb25pdG9yKSB7CiAgZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnkubW9uaXRvcnNNYXlFeGlzdF8gPSAhMDsKICBmb3IodmFyIHRyYW5zZm9ybWVyID0gZ29vZy5iaW5kKG1vbml0b3Iud3JhcCwgbW9uaXRvciksIGkgPSAwO2kgPCBnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeS5yZWZMaXN0Xy5sZW5ndGg7aSsrKSB7CiAgICBnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeS5yZWZMaXN0X1tpXSh0cmFuc2Zvcm1lcikKICB9CiAgZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnkubW9uaXRvcnNfLnB1c2gobW9uaXRvcikKfTsKZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnkudW5tb25pdG9yQWxsSWZQb3NzaWJsZSA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJGVudHJ5UG9pbnRSZWdpc3RyeSR1bm1vbml0b3JBbGxJZlBvc3NpYmxlJChtb25pdG9yKSB7CiAgdmFyIG1vbml0b3JzID0gZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnkubW9uaXRvcnNfOwogIGdvb2cuYXNzZXJ0cy5hc3NlcnQobW9uaXRvciA9PSBtb25pdG9yc1ttb25pdG9ycy5sZW5ndGggLSAxXSwgIk9ubHkgdGhlIG1vc3QgcmVjZW50IG1vbml0b3IgY2FuIGJlIHVud3JhcHBlZC4iKTsKICBmb3IodmFyIHRyYW5zZm9ybWVyID0gZ29vZy5iaW5kKG1vbml0b3IudW53cmFwLCBtb25pdG9yKSwgaSA9IDA7aSA8IGdvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5LnJlZkxpc3RfLmxlbmd0aDtpKyspIHsKICAgIGdvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5LnJlZkxpc3RfW2ldKHRyYW5zZm9ybWVyKQogIH0KICBtb25pdG9ycy5sZW5ndGgtLQp9Owpnb29nLmRlYnVnLmVycm9ySGFuZGxlcldlYWtEZXAgPSB7cHJvdGVjdEVudHJ5UG9pbnQ6ZnVuY3Rpb24gJGdvb2ckZGVidWckZXJyb3JIYW5kbGVyV2Vha0RlcCRwcm90ZWN0RW50cnlQb2ludCQoZm4pIHsKICByZXR1cm4gZm4KfX07Cmdvb2cub2JqZWN0ID0ge307Cmdvb2cub2JqZWN0LmZvckVhY2ggPSBmdW5jdGlvbiAkZ29vZyRvYmplY3QkZm9yRWFjaCQob2JqLCBmLCBvcHRfb2JqKSB7CiAgZm9yKHZhciBrZXkgaW4gb2JqKSB7CiAgICBmLmNhbGwob3B0X29iaiwgb2JqW2tleV0sIGtleSwgb2JqKQogIH0KfTsKZ29vZy5vYmplY3QuZmlsdGVyID0gZnVuY3Rpb24gJGdvb2ckb2JqZWN0JGZpbHRlciQob2JqLCBmLCBvcHRfb2JqKSB7CiAgdmFyIHJlcyA9IHt9LCBrZXk7CiAgZm9yKGtleSBpbiBvYmopIHsKICAgIGYuY2FsbChvcHRfb2JqLCBvYmpba2V5XSwga2V5LCBvYmopICYmIChyZXNba2V5XSA9IG9ialtrZXldKQogIH0KICByZXR1cm4gcmVzCn07Cmdvb2cub2JqZWN0Lm1hcCA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRtYXAkKG9iaiwgZiwgb3B0X29iaikgewogIHZhciByZXMgPSB7fSwga2V5OwogIGZvcihrZXkgaW4gb2JqKSB7CiAgICByZXNba2V5XSA9IGYuY2FsbChvcHRfb2JqLCBvYmpba2V5XSwga2V5LCBvYmopCiAgfQogIHJldHVybiByZXMKfTsKZ29vZy5vYmplY3Quc29tZSA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRzb21lJChvYmosIGYsIG9wdF9vYmopIHsKICBmb3IodmFyIGtleSBpbiBvYmopIHsKICAgIGlmKGYuY2FsbChvcHRfb2JqLCBvYmpba2V5XSwga2V5LCBvYmopKSB7CiAgICAgIHJldHVybiEwCiAgICB9CiAgfQogIHJldHVybiExCn07Cmdvb2cub2JqZWN0LmV2ZXJ5ID0gZnVuY3Rpb24gJGdvb2ckb2JqZWN0JGV2ZXJ5JChvYmosIGYsIG9wdF9vYmopIHsKICBmb3IodmFyIGtleSBpbiBvYmopIHsKICAgIGlmKCFmLmNhbGwob3B0X29iaiwgb2JqW2tleV0sIGtleSwgb2JqKSkgewogICAgICByZXR1cm4hMQogICAgfQogIH0KICByZXR1cm4hMAp9Owpnb29nLm9iamVjdC5nZXRDb3VudCA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRnZXRDb3VudCQob2JqKSB7CiAgdmFyIHJ2ID0gMCwga2V5OwogIGZvcihrZXkgaW4gb2JqKSB7CiAgICBydisrCiAgfQogIHJldHVybiBydgp9Owpnb29nLm9iamVjdC5nZXRBbnlLZXkgPSBmdW5jdGlvbiAkZ29vZyRvYmplY3QkZ2V0QW55S2V5JChvYmopIHsKICBmb3IodmFyIGtleSBpbiBvYmopIHsKICAgIHJldHVybiBrZXkKICB9Cn07Cmdvb2cub2JqZWN0LmdldEFueVZhbHVlID0gZnVuY3Rpb24gJGdvb2ckb2JqZWN0JGdldEFueVZhbHVlJChvYmopIHsKICBmb3IodmFyIGtleSBpbiBvYmopIHsKICAgIHJldHVybiBvYmpba2V5XQogIH0KfTsKZ29vZy5vYmplY3QuY29udGFpbnMgPSBmdW5jdGlvbiAkZ29vZyRvYmplY3QkY29udGFpbnMkKG9iaiwgdmFsKSB7CiAgcmV0dXJuIGdvb2cub2JqZWN0LmNvbnRhaW5zVmFsdWUob2JqLCB2YWwpCn07Cmdvb2cub2JqZWN0LmdldFZhbHVlcyA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRnZXRWYWx1ZXMkKG9iaikgewogIHZhciByZXMgPSBbXSwgaSA9IDAsIGtleTsKICBmb3Ioa2V5IGluIG9iaikgewogICAgcmVzW2krK10gPSBvYmpba2V5XQogIH0KICByZXR1cm4gcmVzCn07Cmdvb2cub2JqZWN0LmdldEtleXMgPSBmdW5jdGlvbiAkZ29vZyRvYmplY3QkZ2V0S2V5cyQob2JqKSB7CiAgdmFyIHJlcyA9IFtdLCBpID0gMCwga2V5OwogIGZvcihrZXkgaW4gb2JqKSB7CiAgICByZXNbaSsrXSA9IGtleQogIH0KICByZXR1cm4gcmVzCn07Cmdvb2cub2JqZWN0LmdldFZhbHVlQnlLZXlzID0gZnVuY3Rpb24gJGdvb2ckb2JqZWN0JGdldFZhbHVlQnlLZXlzJChvYmosIHZhcl9hcmdzKSB7CiAgZm9yKHZhciBpc0FycmF5TGlrZSA9IGdvb2cuaXNBcnJheUxpa2UodmFyX2FyZ3MpLCBrZXlzID0gaXNBcnJheUxpa2UgPyB2YXJfYXJncyA6IGFyZ3VtZW50cywgaSA9IGlzQXJyYXlMaWtlID8gMCA6IDE7aSA8IGtleXMubGVuZ3RoICYmICEob2JqID0gb2JqW2tleXNbaV1dLCAhZ29vZy5pc0RlZihvYmopKTtpKyspIHsKICB9CiAgcmV0dXJuIG9iagp9Owpnb29nLm9iamVjdC5jb250YWluc0tleSA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRjb250YWluc0tleSQob2JqLCBrZXkpIHsKICByZXR1cm4ga2V5IGluIG9iagp9Owpnb29nLm9iamVjdC5jb250YWluc1ZhbHVlID0gZnVuY3Rpb24gJGdvb2ckb2JqZWN0JGNvbnRhaW5zVmFsdWUkKG9iaiwgdmFsKSB7CiAgZm9yKHZhciBrZXkgaW4gb2JqKSB7CiAgICBpZihvYmpba2V5XSA9PSB2YWwpIHsKICAgICAgcmV0dXJuITAKICAgIH0KICB9CiAgcmV0dXJuITEKfTsKZ29vZy5vYmplY3QuZmluZEtleSA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRmaW5kS2V5JChvYmosIGYsIG9wdF90aGlzKSB7CiAgZm9yKHZhciBrZXkgaW4gb2JqKSB7CiAgICBpZihmLmNhbGwob3B0X3RoaXMsIG9ialtrZXldLCBrZXksIG9iaikpIHsKICAgICAgcmV0dXJuIGtleQogICAgfQogIH0KfTsKZ29vZy5vYmplY3QuZmluZFZhbHVlID0gZnVuY3Rpb24gJGdvb2ckb2JqZWN0JGZpbmRWYWx1ZSQob2JqLCBmLCBvcHRfdGhpcykgewogIHZhciBrZXkgPSBnb29nLm9iamVjdC5maW5kS2V5KG9iaiwgZiwgb3B0X3RoaXMpOwogIHJldHVybiBrZXkgJiYgb2JqW2tleV0KfTsKZ29vZy5vYmplY3QuaXNFbXB0eSA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRpc0VtcHR5JChvYmopIHsKICBmb3IodmFyIGtleSBpbiBvYmopIHsKICAgIHJldHVybiExCiAgfQogIHJldHVybiEwCn07Cmdvb2cub2JqZWN0LmNsZWFyID0gZnVuY3Rpb24gJGdvb2ckb2JqZWN0JGNsZWFyJChvYmopIHsKICBmb3IodmFyIGkgaW4gb2JqKSB7CiAgICBkZWxldGUgb2JqW2ldCiAgfQp9Owpnb29nLm9iamVjdC5yZW1vdmUgPSBmdW5jdGlvbiAkZ29vZyRvYmplY3QkcmVtb3ZlJChvYmosIGtleSkgewogIHZhciBydjsKICAocnYgPSBrZXkgaW4gb2JqKSAmJiBkZWxldGUgb2JqW2tleV07CiAgcmV0dXJuIHJ2Cn07Cmdvb2cub2JqZWN0LmFkZCA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRhZGQkKG9iaiwga2V5LCB2YWwpIHsKICBpZihrZXkgaW4gb2JqKSB7CiAgICB0aHJvdyBFcnJvcignVGhlIG9iamVjdCBhbHJlYWR5IGNvbnRhaW5zIHRoZSBrZXkgIicgKyBrZXkgKyAnIicpOwogIH0KICBnb29nLm9iamVjdC5zZXQob2JqLCBrZXksIHZhbCkKfTsKZ29vZy5vYmplY3QuZ2V0ID0gZnVuY3Rpb24gJGdvb2ckb2JqZWN0JGdldCQob2JqLCBrZXksIG9wdF92YWwpIHsKICByZXR1cm4ga2V5IGluIG9iaiA/IG9ialtrZXldIDogb3B0X3ZhbAp9Owpnb29nLm9iamVjdC5zZXQgPSBmdW5jdGlvbiAkZ29vZyRvYmplY3Qkc2V0JChvYmosIGtleSwgdmFsdWUpIHsKICBvYmpba2V5XSA9IHZhbHVlCn07Cmdvb2cub2JqZWN0LnNldElmVW5kZWZpbmVkID0gZnVuY3Rpb24gJGdvb2ckb2JqZWN0JHNldElmVW5kZWZpbmVkJChvYmosIGtleSwgdmFsdWUpIHsKICByZXR1cm4ga2V5IGluIG9iaiA/IG9ialtrZXldIDogb2JqW2tleV0gPSB2YWx1ZQp9Owpnb29nLm9iamVjdC5jbG9uZSA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRjbG9uZSQob2JqKSB7CiAgdmFyIHJlcyA9IHt9LCBrZXk7CiAgZm9yKGtleSBpbiBvYmopIHsKICAgIHJlc1trZXldID0gb2JqW2tleV0KICB9CiAgcmV0dXJuIHJlcwp9Owpnb29nLm9iamVjdC51bnNhZmVDbG9uZSA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCR1bnNhZmVDbG9uZSQob2JqKSB7CiAgdmFyIHR5cGUgPSBnb29nLnR5cGVPZihvYmopOwogIGlmKCJvYmplY3QiID09IHR5cGUgfHwgImFycmF5IiA9PSB0eXBlKSB7CiAgICBpZihvYmouY2xvbmUpIHsKICAgICAgcmV0dXJuIG9iai5jbG9uZSgpCiAgICB9CiAgICB2YXIgY2xvbmUgPSAiYXJyYXkiID09IHR5cGUgPyBbXSA6IHt9LCBrZXk7CiAgICBmb3Ioa2V5IGluIG9iaikgewogICAgICBjbG9uZVtrZXldID0gZ29vZy5vYmplY3QudW5zYWZlQ2xvbmUob2JqW2tleV0pCiAgICB9CiAgICByZXR1cm4gY2xvbmUKICB9CiAgcmV0dXJuIG9iagp9Owpnb29nLm9iamVjdC50cmFuc3Bvc2UgPSBmdW5jdGlvbiAkZ29vZyRvYmplY3QkdHJhbnNwb3NlJChvYmopIHsKICB2YXIgdHJhbnNwb3NlZCA9IHt9LCBrZXk7CiAgZm9yKGtleSBpbiBvYmopIHsKICAgIHRyYW5zcG9zZWRbb2JqW2tleV1dID0ga2V5CiAgfQogIHJldHVybiB0cmFuc3Bvc2VkCn07Cmdvb2cub2JqZWN0LlBST1RPVFlQRV9GSUVMRFNfID0gImNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZiIuc3BsaXQoIiwiKTsKZ29vZy5vYmplY3QuZXh0ZW5kID0gZnVuY3Rpb24gJGdvb2ckb2JqZWN0JGV4dGVuZCQodGFyZ2V0LCB2YXJfYXJncykgewogIGZvcih2YXIga2V5LCBzb3VyY2UsIGkgPSAxO2kgPCBhcmd1bWVudHMubGVuZ3RoO2krKykgewogICAgc291cmNlID0gYXJndW1lbnRzW2ldOwogICAgZm9yKGtleSBpbiBzb3VyY2UpIHsKICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XQogICAgfQogICAgZm9yKHZhciBqID0gMDtqIDwgZ29vZy5vYmplY3QuUFJPVE9UWVBFX0ZJRUxEU18ubGVuZ3RoO2orKykgewogICAgICBrZXkgPSBnb29nLm9iamVjdC5QUk9UT1RZUEVfRklFTERTX1tqXSwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSAmJiAodGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XSkKICAgIH0KICB9Cn07Cmdvb2cub2JqZWN0LmNyZWF0ZSA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRjcmVhdGUkKHZhcl9hcmdzKSB7CiAgdmFyIGFyZ0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgaWYoMSA9PSBhcmdMZW5ndGggJiYgZ29vZy5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHsKICAgIHJldHVybiBnb29nLm9iamVjdC5jcmVhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzWzBdKQogIH0KICBpZihhcmdMZW5ndGggJSAyKSB7CiAgICB0aHJvdyBFcnJvcigiVW5ldmVuIG51bWJlciBvZiBhcmd1bWVudHMiKTsKICB9CiAgZm9yKHZhciBydiA9IHt9LCBpID0gMDtpIDwgYXJnTGVuZ3RoO2kgKz0gMikgewogICAgcnZbYXJndW1lbnRzW2ldXSA9IGFyZ3VtZW50c1tpICsgMV0KICB9CiAgcmV0dXJuIHJ2Cn07Cmdvb2cub2JqZWN0LmNyZWF0ZVNldCA9IGZ1bmN0aW9uICRnb29nJG9iamVjdCRjcmVhdGVTZXQkKHZhcl9hcmdzKSB7CiAgdmFyIGFyZ0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgaWYoMSA9PSBhcmdMZW5ndGggJiYgZ29vZy5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHsKICAgIHJldHVybiBnb29nLm9iamVjdC5jcmVhdGVTZXQuYXBwbHkobnVsbCwgYXJndW1lbnRzWzBdKQogIH0KICBmb3IodmFyIHJ2ID0ge30sIGkgPSAwO2kgPCBhcmdMZW5ndGg7aSsrKSB7CiAgICBydlthcmd1bWVudHNbaV1dID0gITAKICB9CiAgcmV0dXJuIHJ2Cn07Cmdvb2cudXNlckFnZW50ID0ge307Cmdvb2cudXNlckFnZW50LkFTU1VNRV9JRSA9ICExOwpnb29nLnVzZXJBZ2VudC5BU1NVTUVfR0VDS08gPSAhMTsKZ29vZy51c2VyQWdlbnQuQVNTVU1FX1dFQktJVCA9ICExOwpnb29nLnVzZXJBZ2VudC5BU1NVTUVfTU9CSUxFX1dFQktJVCA9ICExOwpnb29nLnVzZXJBZ2VudC5BU1NVTUVfT1BFUkEgPSAhMTsKZ29vZy51c2VyQWdlbnQuQVNTVU1FX0FOWV9WRVJTSU9OID0gITE7Cmdvb2cudXNlckFnZW50LkJST1dTRVJfS05PV05fID0gZ29vZy51c2VyQWdlbnQuQVNTVU1FX0lFIHx8IGdvb2cudXNlckFnZW50LkFTU1VNRV9HRUNLTyB8fCBnb29nLnVzZXJBZ2VudC5BU1NVTUVfTU9CSUxFX1dFQktJVCB8fCBnb29nLnVzZXJBZ2VudC5BU1NVTUVfV0VCS0lUIHx8IGdvb2cudXNlckFnZW50LkFTU1VNRV9PUEVSQTsKZ29vZy51c2VyQWdlbnQuZ2V0VXNlckFnZW50U3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckdXNlckFnZW50JGdldFVzZXJBZ2VudFN0cmluZyQoKSB7CiAgcmV0dXJuIGdvb2cuZ2xvYmFsLm5hdmlnYXRvciA/IGdvb2cuZ2xvYmFsLm5hdmlnYXRvci51c2VyQWdlbnQgOiBudWxsCn07Cmdvb2cudXNlckFnZW50LmdldE5hdmlnYXRvciA9IGZ1bmN0aW9uICRnb29nJHVzZXJBZ2VudCRnZXROYXZpZ2F0b3IkKCkgewogIHJldHVybiBnb29nLmdsb2JhbC5uYXZpZ2F0b3IKfTsKZ29vZy51c2VyQWdlbnQuaW5pdF8gPSBmdW5jdGlvbiAkZ29vZyR1c2VyQWdlbnQkaW5pdF8kKCkgewogIGdvb2cudXNlckFnZW50LmRldGVjdGVkT3BlcmFfID0gITE7CiAgZ29vZy51c2VyQWdlbnQuZGV0ZWN0ZWRJZV8gPSAhMTsKICBnb29nLnVzZXJBZ2VudC5kZXRlY3RlZFdlYmtpdF8gPSAhMTsKICBnb29nLnVzZXJBZ2VudC5kZXRlY3RlZE1vYmlsZV8gPSAhMTsKICBnb29nLnVzZXJBZ2VudC5kZXRlY3RlZEdlY2tvXyA9ICExOwogIHZhciB1YTsKICBpZighZ29vZy51c2VyQWdlbnQuQlJPV1NFUl9LTk9XTl8gJiYgKHVhID0gZ29vZy51c2VyQWdlbnQuZ2V0VXNlckFnZW50U3RyaW5nKCkpKSB7CiAgICB2YXIgbmF2aWdhdG9yID0gZ29vZy51c2VyQWdlbnQuZ2V0TmF2aWdhdG9yKCk7CiAgICBnb29nLnVzZXJBZ2VudC5kZXRlY3RlZE9wZXJhXyA9IDAgPT0gdWEuaW5kZXhPZigiT3BlcmEiKTsKICAgIGdvb2cudXNlckFnZW50LmRldGVjdGVkSWVfID0gIWdvb2cudXNlckFnZW50LmRldGVjdGVkT3BlcmFfICYmIC0xICE9IHVhLmluZGV4T2YoIk1TSUUiKTsKICAgIGdvb2cudXNlckFnZW50LmRldGVjdGVkV2Via2l0XyA9ICFnb29nLnVzZXJBZ2VudC5kZXRlY3RlZE9wZXJhXyAmJiAtMSAhPSB1YS5pbmRleE9mKCJXZWJLaXQiKTsKICAgIGdvb2cudXNlckFnZW50LmRldGVjdGVkTW9iaWxlXyA9IGdvb2cudXNlckFnZW50LmRldGVjdGVkV2Via2l0XyAmJiAtMSAhPSB1YS5pbmRleE9mKCJNb2JpbGUiKTsKICAgIGdvb2cudXNlckFnZW50LmRldGVjdGVkR2Vja29fID0gIWdvb2cudXNlckFnZW50LmRldGVjdGVkT3BlcmFfICYmICFnb29nLnVzZXJBZ2VudC5kZXRlY3RlZFdlYmtpdF8gJiYgIkdlY2tvIiA9PSBuYXZpZ2F0b3IucHJvZHVjdAogIH0KfTsKZ29vZy51c2VyQWdlbnQuQlJPV1NFUl9LTk9XTl8gfHwgZ29vZy51c2VyQWdlbnQuaW5pdF8oKTsKZ29vZy51c2VyQWdlbnQuT1BFUkEgPSBnb29nLnVzZXJBZ2VudC5CUk9XU0VSX0tOT1dOXyA/IGdvb2cudXNlckFnZW50LkFTU1VNRV9PUEVSQSA6IGdvb2cudXNlckFnZW50LmRldGVjdGVkT3BlcmFfOwpnb29nLnVzZXJBZ2VudC5JRSA9IGdvb2cudXNlckFnZW50LkJST1dTRVJfS05PV05fID8gZ29vZy51c2VyQWdlbnQuQVNTVU1FX0lFIDogZ29vZy51c2VyQWdlbnQuZGV0ZWN0ZWRJZV87Cmdvb2cudXNlckFnZW50LkdFQ0tPID0gZ29vZy51c2VyQWdlbnQuQlJPV1NFUl9LTk9XTl8gPyBnb29nLnVzZXJBZ2VudC5BU1NVTUVfR0VDS08gOiBnb29nLnVzZXJBZ2VudC5kZXRlY3RlZEdlY2tvXzsKZ29vZy51c2VyQWdlbnQuV0VCS0lUID0gZ29vZy51c2VyQWdlbnQuQlJPV1NFUl9LTk9XTl8gPyBnb29nLnVzZXJBZ2VudC5BU1NVTUVfV0VCS0lUIHx8IGdvb2cudXNlckFnZW50LkFTU1VNRV9NT0JJTEVfV0VCS0lUIDogZ29vZy51c2VyQWdlbnQuZGV0ZWN0ZWRXZWJraXRfOwpnb29nLnVzZXJBZ2VudC5NT0JJTEUgPSBnb29nLnVzZXJBZ2VudC5BU1NVTUVfTU9CSUxFX1dFQktJVCB8fCBnb29nLnVzZXJBZ2VudC5kZXRlY3RlZE1vYmlsZV87Cmdvb2cudXNlckFnZW50LlNBRkFSSSA9IGdvb2cudXNlckFnZW50LldFQktJVDsKZ29vZy51c2VyQWdlbnQuZGV0ZXJtaW5lUGxhdGZvcm1fID0gZnVuY3Rpb24gJGdvb2ckdXNlckFnZW50JGRldGVybWluZVBsYXRmb3JtXyQoKSB7CiAgdmFyIG5hdmlnYXRvciA9IGdvb2cudXNlckFnZW50LmdldE5hdmlnYXRvcigpOwogIHJldHVybiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnBsYXRmb3JtIHx8ICIiCn07Cmdvb2cudXNlckFnZW50LlBMQVRGT1JNID0gZ29vZy51c2VyQWdlbnQuZGV0ZXJtaW5lUGxhdGZvcm1fKCk7Cmdvb2cudXNlckFnZW50LkFTU1VNRV9NQUMgPSAhMTsKZ29vZy51c2VyQWdlbnQuQVNTVU1FX1dJTkRPV1MgPSAhMTsKZ29vZy51c2VyQWdlbnQuQVNTVU1FX0xJTlVYID0gITE7Cmdvb2cudXNlckFnZW50LkFTU1VNRV9YMTEgPSAhMTsKZ29vZy51c2VyQWdlbnQuUExBVEZPUk1fS05PV05fID0gZ29vZy51c2VyQWdlbnQuQVNTVU1FX01BQyB8fCBnb29nLnVzZXJBZ2VudC5BU1NVTUVfV0lORE9XUyB8fCBnb29nLnVzZXJBZ2VudC5BU1NVTUVfTElOVVggfHwgZ29vZy51c2VyQWdlbnQuQVNTVU1FX1gxMTsKZ29vZy51c2VyQWdlbnQuaW5pdFBsYXRmb3JtXyA9IGZ1bmN0aW9uICRnb29nJHVzZXJBZ2VudCRpbml0UGxhdGZvcm1fJCgpIHsKICBnb29nLnVzZXJBZ2VudC5kZXRlY3RlZE1hY18gPSBnb29nLnN0cmluZy5jb250YWlucyhnb29nLnVzZXJBZ2VudC5QTEFURk9STSwgIk1hYyIpOwogIGdvb2cudXNlckFnZW50LmRldGVjdGVkV2luZG93c18gPSBnb29nLnN0cmluZy5jb250YWlucyhnb29nLnVzZXJBZ2VudC5QTEFURk9STSwgIldpbiIpOwogIGdvb2cudXNlckFnZW50LmRldGVjdGVkTGludXhfID0gZ29vZy5zdHJpbmcuY29udGFpbnMoZ29vZy51c2VyQWdlbnQuUExBVEZPUk0sICJMaW51eCIpOwogIGdvb2cudXNlckFnZW50LmRldGVjdGVkWDExXyA9ICEhZ29vZy51c2VyQWdlbnQuZ2V0TmF2aWdhdG9yKCkgJiYgZ29vZy5zdHJpbmcuY29udGFpbnMoZ29vZy51c2VyQWdlbnQuZ2V0TmF2aWdhdG9yKCkuYXBwVmVyc2lvbiB8fCAiIiwgIlgxMSIpCn07Cmdvb2cudXNlckFnZW50LlBMQVRGT1JNX0tOT1dOXyB8fCBnb29nLnVzZXJBZ2VudC5pbml0UGxhdGZvcm1fKCk7Cmdvb2cudXNlckFnZW50Lk1BQyA9IGdvb2cudXNlckFnZW50LlBMQVRGT1JNX0tOT1dOXyA/IGdvb2cudXNlckFnZW50LkFTU1VNRV9NQUMgOiBnb29nLnVzZXJBZ2VudC5kZXRlY3RlZE1hY187Cmdvb2cudXNlckFnZW50LldJTkRPV1MgPSBnb29nLnVzZXJBZ2VudC5QTEFURk9STV9LTk9XTl8gPyBnb29nLnVzZXJBZ2VudC5BU1NVTUVfV0lORE9XUyA6IGdvb2cudXNlckFnZW50LmRldGVjdGVkV2luZG93c187Cmdvb2cudXNlckFnZW50LkxJTlVYID0gZ29vZy51c2VyQWdlbnQuUExBVEZPUk1fS05PV05fID8gZ29vZy51c2VyQWdlbnQuQVNTVU1FX0xJTlVYIDogZ29vZy51c2VyQWdlbnQuZGV0ZWN0ZWRMaW51eF87Cmdvb2cudXNlckFnZW50LlgxMSA9IGdvb2cudXNlckFnZW50LlBMQVRGT1JNX0tOT1dOXyA/IGdvb2cudXNlckFnZW50LkFTU1VNRV9YMTEgOiBnb29nLnVzZXJBZ2VudC5kZXRlY3RlZFgxMV87Cmdvb2cudXNlckFnZW50LmRldGVybWluZVZlcnNpb25fID0gZnVuY3Rpb24gJGdvb2ckdXNlckFnZW50JGRldGVybWluZVZlcnNpb25fJCgpIHsKICB2YXIgdmVyc2lvbiA9ICIiLCByZTsKICBpZihnb29nLnVzZXJBZ2VudC5PUEVSQSAmJiBnb29nLmdsb2JhbC5vcGVyYSkgewogICAgdmFyIG9wZXJhVmVyc2lvbiA9IGdvb2cuZ2xvYmFsLm9wZXJhLnZlcnNpb24sIHZlcnNpb24gPSAiZnVuY3Rpb24iID09IHR5cGVvZiBvcGVyYVZlcnNpb24gPyBvcGVyYVZlcnNpb24oKSA6IG9wZXJhVmVyc2lvbgogIH1lbHNlIHsKICAgIGlmKGdvb2cudXNlckFnZW50LkdFQ0tPID8gcmUgPSAvcnZcOihbXlwpO10rKShcKXw7KS8gOiBnb29nLnVzZXJBZ2VudC5JRSA/IHJlID0gL01TSUVccysoW15cKTtdKykoXCl8OykvIDogZ29vZy51c2VyQWdlbnQuV0VCS0lUICYmIChyZSA9IC9XZWJLaXRcLyhcUyspLyksIHJlKSB7CiAgICAgIHZhciBhcnIgPSByZS5leGVjKGdvb2cudXNlckFnZW50LmdldFVzZXJBZ2VudFN0cmluZygpKSwgdmVyc2lvbiA9IGFyciA/IGFyclsxXSA6ICIiCiAgICB9CiAgfQogIGlmKGdvb2cudXNlckFnZW50LklFKSB7CiAgICB2YXIgZG9jTW9kZSA9IGdvb2cudXNlckFnZW50LmdldERvY3VtZW50TW9kZV8oKTsKICAgIGlmKGRvY01vZGUgPiBwYXJzZUZsb2F0KHZlcnNpb24pKSB7CiAgICAgIHJldHVybiIiICsgZG9jTW9kZQogICAgfQogIH0KICByZXR1cm4gdmVyc2lvbgp9Owpnb29nLnVzZXJBZ2VudC5nZXREb2N1bWVudE1vZGVfID0gZnVuY3Rpb24gJGdvb2ckdXNlckFnZW50JGdldERvY3VtZW50TW9kZV8kKCkgewogIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKICByZXR1cm4gZG9jID8gZG9jLmRvY3VtZW50TW9kZSA6IHZvaWQgMAp9Owpnb29nLnVzZXJBZ2VudC5WRVJTSU9OID0gZ29vZy51c2VyQWdlbnQuZGV0ZXJtaW5lVmVyc2lvbl8oKTsKZ29vZy51c2VyQWdlbnQuY29tcGFyZSA9IGZ1bmN0aW9uICRnb29nJHVzZXJBZ2VudCRjb21wYXJlJCh2MSwgdjIpIHsKICByZXR1cm4gZ29vZy5zdHJpbmcuY29tcGFyZVZlcnNpb25zKHYxLCB2MikKfTsKZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uQ2FjaGVfID0ge307Cmdvb2cudXNlckFnZW50LmlzVmVyc2lvbiA9IGZ1bmN0aW9uICRnb29nJHVzZXJBZ2VudCRpc1ZlcnNpb24kKHZlcnNpb24pIHsKICByZXR1cm4gZ29vZy51c2VyQWdlbnQuQVNTVU1FX0FOWV9WRVJTSU9OIHx8IGdvb2cudXNlckFnZW50LmlzVmVyc2lvbkNhY2hlX1t2ZXJzaW9uXSB8fCAoZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uQ2FjaGVfW3ZlcnNpb25dID0gMCA8PSBnb29nLnN0cmluZy5jb21wYXJlVmVyc2lvbnMoZ29vZy51c2VyQWdlbnQuVkVSU0lPTiwgdmVyc2lvbikpCn07Cmdvb2cudXNlckFnZW50LmlzRG9jdW1lbnRNb2RlQ2FjaGVfID0ge307Cmdvb2cudXNlckFnZW50LmlzRG9jdW1lbnRNb2RlID0gZnVuY3Rpb24gJGdvb2ckdXNlckFnZW50JGlzRG9jdW1lbnRNb2RlJChkb2N1bWVudE1vZGUpIHsKICByZXR1cm4gZ29vZy51c2VyQWdlbnQuaXNEb2N1bWVudE1vZGVDYWNoZV9bZG9jdW1lbnRNb2RlXSB8fCAoZ29vZy51c2VyQWdlbnQuaXNEb2N1bWVudE1vZGVDYWNoZV9bZG9jdW1lbnRNb2RlXSA9IGdvb2cudXNlckFnZW50LklFICYmICEhZG9jdW1lbnQuZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA+PSBkb2N1bWVudE1vZGUpCn07Cmdvb2cucmVmbGVjdCA9IHt9Owpnb29nLnJlZmxlY3Qub2JqZWN0ID0gZnVuY3Rpb24gJGdvb2ckcmVmbGVjdCRvYmplY3QkKHR5cGUsIG9iamVjdCkgewogIHJldHVybiBvYmplY3QKfTsKZ29vZy5yZWZsZWN0LnNpbmtWYWx1ZSA9IGZ1bmN0aW9uICRnb29nJHJlZmxlY3Qkc2lua1ZhbHVlJCh4KSB7CiAgZ29vZy5yZWZsZWN0LnNpbmtWYWx1ZVsiICJdKHgpOwogIHJldHVybiB4Cn07Cmdvb2cucmVmbGVjdC5zaW5rVmFsdWVbIiAiXSA9IGdvb2cubnVsbEZ1bmN0aW9uOwpnb29nLnJlZmxlY3QuY2FuQWNjZXNzUHJvcGVydHkgPSBmdW5jdGlvbiAkZ29vZyRyZWZsZWN0JGNhbkFjY2Vzc1Byb3BlcnR5JChvYmosIHByb3ApIHsKICB0cnkgewogICAgcmV0dXJuIGdvb2cucmVmbGVjdC5zaW5rVmFsdWUob2JqW3Byb3BdKSwgITAKICB9Y2F0Y2goZSkgewogIH0KICByZXR1cm4hMQp9Owpnb29nLmV2ZW50cyA9IHt9Owpnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZSA9IHtIQVNfVzNDX0JVVFRPTjohZ29vZy51c2VyQWdlbnQuSUUgfHwgZ29vZy51c2VyQWdlbnQuaXNEb2N1bWVudE1vZGUoOSksIEhBU19XM0NfRVZFTlRfU1VQUE9SVDohZ29vZy51c2VyQWdlbnQuSUUgfHwgZ29vZy51c2VyQWdlbnQuaXNEb2N1bWVudE1vZGUoOSksIFNFVF9LRVlfQ09ERV9UT19QUkVWRU5UX0RFRkFVTFQ6Z29vZy51c2VyQWdlbnQuSUUgJiYgIWdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiOCIpLCBIQVNfTkFWSUdBVE9SX09OTElORV9QUk9QRVJUWTohZ29vZy51c2VyQWdlbnQuV0VCS0lUIHx8IGdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiNTI4IiksIEhBU19IVE1MNV9ORVRXT1JLX0VWRU5UX1NVUFBPUlQ6Z29vZy51c2VyQWdlbnQuR0VDS08gJiYgZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uKCIxLjliIikgfHwgZ29vZy51c2VyQWdlbnQuSUUgJiYgZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uKCI4IikgfHwgZ29vZy51c2VyQWdlbnQuT1BFUkEgJiYgCmdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiOS41IikgfHwgZ29vZy51c2VyQWdlbnQuV0VCS0lUICYmIGdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiNTI4IiksIEhUTUw1X05FVFdPUktfRVZFTlRTX0ZJUkVfT05fQk9EWTpnb29nLnVzZXJBZ2VudC5HRUNLTyAmJiAhZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uKCI4IikgfHwgZ29vZy51c2VyQWdlbnQuSUUgJiYgIWdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiOSIpfTsKZ29vZy5ldmVudHMuRXZlbnQgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkRXZlbnQkKHR5cGUsIG9wdF90YXJnZXQpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKTsKICB0aGlzLnR5cGUgPSB0eXBlOwogIHRoaXMuY3VycmVudFRhcmdldCA9IHRoaXMudGFyZ2V0ID0gb3B0X3RhcmdldAp9Owpnb29nLmluaGVyaXRzKGdvb2cuZXZlbnRzLkV2ZW50LCBnb29nLkRpc3Bvc2FibGUpOwpnb29nLmV2ZW50cy5FdmVudC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50JCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGRlbGV0ZSB0aGlzLnR5cGU7CiAgZGVsZXRlIHRoaXMudGFyZ2V0OwogIGRlbGV0ZSB0aGlzLmN1cnJlbnRUYXJnZXQKfTsKZ29vZy5ldmVudHMuRXZlbnQucHJvdG90eXBlLnByb3BhZ2F0aW9uU3RvcHBlZF8gPSAhMTsKZ29vZy5ldmVudHMuRXZlbnQucHJvdG90eXBlLnJldHVyblZhbHVlXyA9ICEwOwpnb29nLmV2ZW50cy5FdmVudC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50JCRzdG9wUHJvcGFnYXRpb24kKCkgewogIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkXyA9ICEwCn07Cmdvb2cuZXZlbnRzLkV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRFdmVudCQkcHJldmVudERlZmF1bHQkKCkgewogIHRoaXMucmV0dXJuVmFsdWVfID0gITEKfTsKZ29vZy5ldmVudHMuRXZlbnQuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50JHN0b3BQcm9wYWdhdGlvbiQoZSkgewogIGUuc3RvcFByb3BhZ2F0aW9uKCkKfTsKZ29vZy5ldmVudHMuRXZlbnQucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkRXZlbnQkcHJldmVudERlZmF1bHQkKGUpIHsKICBlLnByZXZlbnREZWZhdWx0KCkKfTsKZ29vZy5ldmVudHMuRXZlbnRUeXBlID0ge0NMSUNLOiJjbGljayIsIERCTENMSUNLOiJkYmxjbGljayIsIE1PVVNFRE9XTjoibW91c2Vkb3duIiwgTU9VU0VVUDoibW91c2V1cCIsIE1PVVNFT1ZFUjoibW91c2VvdmVyIiwgTU9VU0VPVVQ6Im1vdXNlb3V0IiwgTU9VU0VNT1ZFOiJtb3VzZW1vdmUiLCBTRUxFQ1RTVEFSVDoic2VsZWN0c3RhcnQiLCBLRVlQUkVTUzoia2V5cHJlc3MiLCBLRVlET1dOOiJrZXlkb3duIiwgS0VZVVA6ImtleXVwIiwgQkxVUjoiYmx1ciIsIEZPQ1VTOiJmb2N1cyIsIERFQUNUSVZBVEU6ImRlYWN0aXZhdGUiLCBGT0NVU0lOOmdvb2cudXNlckFnZW50LklFID8gImZvY3VzaW4iIDogIkRPTUZvY3VzSW4iLCBGT0NVU09VVDpnb29nLnVzZXJBZ2VudC5JRSA/ICJmb2N1c291dCIgOiAiRE9NRm9jdXNPdXQiLCBDSEFOR0U6ImNoYW5nZSIsIFNFTEVDVDoic2VsZWN0IiwgU1VCTUlUOiJzdWJtaXQiLCBJTlBVVDoiaW5wdXQiLCBQUk9QRVJUWUNIQU5HRToicHJvcGVydHljaGFuZ2UiLCAKRFJBR1NUQVJUOiJkcmFnc3RhcnQiLCBEUkFHRU5URVI6ImRyYWdlbnRlciIsIERSQUdPVkVSOiJkcmFnb3ZlciIsIERSQUdMRUFWRToiZHJhZ2xlYXZlIiwgRFJPUDoiZHJvcCIsIFRPVUNIU1RBUlQ6InRvdWNoc3RhcnQiLCBUT1VDSE1PVkU6InRvdWNobW92ZSIsIFRPVUNIRU5EOiJ0b3VjaGVuZCIsIFRPVUNIQ0FOQ0VMOiJ0b3VjaGNhbmNlbCIsIENPTlRFWFRNRU5VOiJjb250ZXh0bWVudSIsIEVSUk9SOiJlcnJvciIsIEhFTFA6ImhlbHAiLCBMT0FEOiJsb2FkIiwgTE9TRUNBUFRVUkU6Imxvc2VjYXB0dXJlIiwgUkVBRFlTVEFURUNIQU5HRToicmVhZHlzdGF0ZWNoYW5nZSIsIFJFU0laRToicmVzaXplIiwgU0NST0xMOiJzY3JvbGwiLCBVTkxPQUQ6InVubG9hZCIsIEhBU0hDSEFOR0U6Imhhc2hjaGFuZ2UiLCBQQUdFSElERToicGFnZWhpZGUiLCBQQUdFU0hPVzoicGFnZXNob3ciLCBQT1BTVEFURToicG9wc3RhdGUiLCBDT1BZOiJjb3B5IiwgUEFTVEU6InBhc3RlIiwgQ1VUOiJjdXQiLCAKQkVGT1JFQ09QWToiYmVmb3JlY29weSIsIEJFRk9SRUNVVDoiYmVmb3JlY3V0IiwgQkVGT1JFUEFTVEU6ImJlZm9yZXBhc3RlIiwgTUVTU0FHRToibWVzc2FnZSIsIENPTk5FQ1Q6ImNvbm5lY3QiLCBUUkFOU0lUSU9ORU5EOmdvb2cudXNlckFnZW50LldFQktJVCA/ICJ3ZWJraXRUcmFuc2l0aW9uRW5kIiA6IGdvb2cudXNlckFnZW50Lk9QRVJBID8gIm9UcmFuc2l0aW9uRW5kIiA6ICJ0cmFuc2l0aW9uZW5kIn07Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRCcm93c2VyRXZlbnQkKG9wdF9lLCBvcHRfY3VycmVudFRhcmdldCkgewogIG9wdF9lICYmIHRoaXMuaW5pdChvcHRfZSwgb3B0X2N1cnJlbnRUYXJnZXQpCn07Cmdvb2cuaW5oZXJpdHMoZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5Nb3VzZUJ1dHRvbiA9IHtMRUZUOjAsIE1JRERMRToxLCBSSUdIVDoyfTsKZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50LklFQnV0dG9uTWFwID0gWzEsIDQsIDJdOwpnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQucHJvdG90eXBlLnRhcmdldCA9IG51bGw7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUucmVsYXRlZFRhcmdldCA9IG51bGw7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUub2Zmc2V0WCA9IDA7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUub2Zmc2V0WSA9IDA7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUuY2xpZW50WCA9IDA7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUuY2xpZW50WSA9IDA7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUuc2NyZWVuWCA9IDA7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUuc2NyZWVuWSA9IDA7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUuYnV0dG9uID0gMDsKZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50LnByb3RvdHlwZS5rZXlDb2RlID0gMDsKZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50LnByb3RvdHlwZS5jaGFyQ29kZSA9IDA7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUuY3RybEtleSA9ICExOwpnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQucHJvdG90eXBlLmFsdEtleSA9ICExOwpnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQucHJvdG90eXBlLnNoaWZ0S2V5ID0gITE7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUubWV0YUtleSA9ICExOwpnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQucHJvdG90eXBlLmV2ZW50XyA9IG51bGw7Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRCcm93c2VyRXZlbnQkJGluaXQkKGUsIG9wdF9jdXJyZW50VGFyZ2V0KSB7CiAgdmFyIHR5cGUgPSB0aGlzLnR5cGUgPSBlLnR5cGU7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0eXBlKTsKICB0aGlzLnRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDsKICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBvcHRfY3VycmVudFRhcmdldDsKICB2YXIgcmVsYXRlZFRhcmdldCA9IGUucmVsYXRlZFRhcmdldDsKICByZWxhdGVkVGFyZ2V0ID8gZ29vZy51c2VyQWdlbnQuR0VDS08gJiYgKGdvb2cucmVmbGVjdC5jYW5BY2Nlc3NQcm9wZXJ0eShyZWxhdGVkVGFyZ2V0LCAibm9kZU5hbWUiKSB8fCAocmVsYXRlZFRhcmdldCA9IG51bGwpKSA6IHR5cGUgPT0gZ29vZy5ldmVudHMuRXZlbnRUeXBlLk1PVVNFT1ZFUiA/IHJlbGF0ZWRUYXJnZXQgPSBlLmZyb21FbGVtZW50IDogdHlwZSA9PSBnb29nLmV2ZW50cy5FdmVudFR5cGUuTU9VU0VPVVQgJiYgKHJlbGF0ZWRUYXJnZXQgPSBlLnRvRWxlbWVudCk7CiAgdGhpcy5yZWxhdGVkVGFyZ2V0ID0gcmVsYXRlZFRhcmdldDsKICB0aGlzLm9mZnNldFggPSBnb29nLnVzZXJBZ2VudC5XRUJLSVQgfHwgdm9pZCAwICE9PSBlLm9mZnNldFggPyBlLm9mZnNldFggOiBlLmxheWVyWDsKICB0aGlzLm9mZnNldFkgPSBnb29nLnVzZXJBZ2VudC5XRUJLSVQgfHwgdm9pZCAwICE9PSBlLm9mZnNldFkgPyBlLm9mZnNldFkgOiBlLmxheWVyWTsKICB0aGlzLmNsaWVudFggPSB2b2lkIDAgIT09IGUuY2xpZW50WCA/IGUuY2xpZW50WCA6IGUucGFnZVg7CiAgdGhpcy5jbGllbnRZID0gdm9pZCAwICE9PSBlLmNsaWVudFkgPyBlLmNsaWVudFkgOiBlLnBhZ2VZOwogIHRoaXMuc2NyZWVuWCA9IGUuc2NyZWVuWCB8fCAwOwogIHRoaXMuc2NyZWVuWSA9IGUuc2NyZWVuWSB8fCAwOwogIHRoaXMuYnV0dG9uID0gZS5idXR0b247CiAgdGhpcy5rZXlDb2RlID0gZS5rZXlDb2RlIHx8IDA7CiAgdGhpcy5jaGFyQ29kZSA9IGUuY2hhckNvZGUgfHwgKCJrZXlwcmVzcyIgPT0gdHlwZSA/IGUua2V5Q29kZSA6IDApOwogIHRoaXMuY3RybEtleSA9IGUuY3RybEtleTsKICB0aGlzLmFsdEtleSA9IGUuYWx0S2V5OwogIHRoaXMuc2hpZnRLZXkgPSBlLnNoaWZ0S2V5OwogIHRoaXMubWV0YUtleSA9IGUubWV0YUtleTsKICB0aGlzLnN0YXRlID0gZS5zdGF0ZTsKICB0aGlzLmV2ZW50XyA9IGU7CiAgZGVsZXRlIHRoaXMucmV0dXJuVmFsdWVfOwogIGRlbGV0ZSB0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZF8KfTsKZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50LnByb3RvdHlwZS5pc0J1dHRvbiA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRCcm93c2VyRXZlbnQkJGlzQnV0dG9uJChidXR0b24pIHsKICByZXR1cm4gZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUuSEFTX1czQ19CVVRUT04gPyB0aGlzLmV2ZW50Xy5idXR0b24gPT0gYnV0dG9uIDogImNsaWNrIiA9PSB0aGlzLnR5cGUgPyBidXR0b24gPT0gZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50Lk1vdXNlQnV0dG9uLkxFRlQgOiAhISh0aGlzLmV2ZW50Xy5idXR0b24gJiBnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuSUVCdXR0b25NYXBbYnV0dG9uXSkKfTsKZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50LnByb3RvdHlwZS5pc01vdXNlQWN0aW9uQnV0dG9uID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEJyb3dzZXJFdmVudCQkaXNNb3VzZUFjdGlvbkJ1dHRvbiQoKSB7CiAgcmV0dXJuIHRoaXMuaXNCdXR0b24oZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50Lk1vdXNlQnV0dG9uLkxFRlQpICYmICEoZ29vZy51c2VyQWdlbnQuV0VCS0lUICYmIGdvb2cudXNlckFnZW50Lk1BQyAmJiB0aGlzLmN0cmxLZXkpCn07Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEJyb3dzZXJFdmVudCQkc3RvcFByb3BhZ2F0aW9uJCgpIHsKICBnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuc3VwZXJDbGFzc18uc3RvcFByb3BhZ2F0aW9uLmNhbGwodGhpcyk7CiAgdGhpcy5ldmVudF8uc3RvcFByb3BhZ2F0aW9uID8gdGhpcy5ldmVudF8uc3RvcFByb3BhZ2F0aW9uKCkgOiB0aGlzLmV2ZW50Xy5jYW5jZWxCdWJibGUgPSAhMAp9Owpnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEJyb3dzZXJFdmVudCQkcHJldmVudERlZmF1bHQkKCkgewogIGdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5zdXBlckNsYXNzXy5wcmV2ZW50RGVmYXVsdC5jYWxsKHRoaXMpOwogIHZhciBiZSA9IHRoaXMuZXZlbnRfOwogIGlmKGJlLnByZXZlbnREZWZhdWx0KSB7CiAgICBiZS5wcmV2ZW50RGVmYXVsdCgpCiAgfWVsc2UgewogICAgaWYoYmUucmV0dXJuVmFsdWUgPSAhMSwgZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUuU0VUX0tFWV9DT0RFX1RPX1BSRVZFTlRfREVGQVVMVCkgewogICAgICB0cnkgewogICAgICAgIGlmKGJlLmN0cmxLZXkgfHwgMTEyIDw9IGJlLmtleUNvZGUgJiYgMTIzID49IGJlLmtleUNvZGUpIHsKICAgICAgICAgIGJlLmtleUNvZGUgPSAtMQogICAgICAgIH0KICAgICAgfWNhdGNoKGV4KSB7CiAgICAgIH0KICAgIH0KICB9Cn07Cmdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5wcm90b3R5cGUuZ2V0QnJvd3NlckV2ZW50ID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEJyb3dzZXJFdmVudCQkZ2V0QnJvd3NlckV2ZW50JCgpIHsKICByZXR1cm4gdGhpcy5ldmVudF8KfTsKZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkQnJvd3NlckV2ZW50JCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICB0aGlzLnJlbGF0ZWRUYXJnZXQgPSB0aGlzLmN1cnJlbnRUYXJnZXQgPSB0aGlzLnRhcmdldCA9IHRoaXMuZXZlbnRfID0gbnVsbAp9Owpnb29nLmV2ZW50cy5FdmVudFdyYXBwZXIgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkRXZlbnRXcmFwcGVyJCgpIHsKfTsKZ29vZy5ldmVudHMuRXZlbnRXcmFwcGVyLnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkRXZlbnRXcmFwcGVyJCRsaXN0ZW4kKCkgewp9Owpnb29nLmV2ZW50cy5FdmVudFdyYXBwZXIucHJvdG90eXBlLnVubGlzdGVuID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50V3JhcHBlciQkdW5saXN0ZW4kKCkgewp9Owpnb29nLmV2ZW50cy5MaXN0ZW5lciA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRMaXN0ZW5lciQoKSB7Cn07Cmdvb2cuZXZlbnRzLkxpc3RlbmVyLmNvdW50ZXJfID0gMDsKZ29vZy5ldmVudHMuTGlzdGVuZXIucHJvdG90eXBlLmtleSA9IDA7Cmdvb2cuZXZlbnRzLkxpc3RlbmVyLnByb3RvdHlwZS5yZW1vdmVkID0gITE7Cmdvb2cuZXZlbnRzLkxpc3RlbmVyLnByb3RvdHlwZS5jYWxsT25jZSA9ICExOwpnb29nLmV2ZW50cy5MaXN0ZW5lci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRMaXN0ZW5lciQkaW5pdCQobGlzdGVuZXIsIHByb3h5LCBzcmMsIHR5cGUsIGNhcHR1cmUsIG9wdF9oYW5kbGVyKSB7CiAgaWYoZ29vZy5pc0Z1bmN0aW9uKGxpc3RlbmVyKSkgewogICAgdGhpcy5pc0Z1bmN0aW9uTGlzdGVuZXJfID0gITAKICB9ZWxzZSB7CiAgICBpZihsaXN0ZW5lciAmJiBsaXN0ZW5lci5oYW5kbGVFdmVudCAmJiBnb29nLmlzRnVuY3Rpb24obGlzdGVuZXIuaGFuZGxlRXZlbnQpKSB7CiAgICAgIHRoaXMuaXNGdW5jdGlvbkxpc3RlbmVyXyA9ICExCiAgICB9ZWxzZSB7CiAgICAgIHRocm93IEVycm9yKCJJbnZhbGlkIGxpc3RlbmVyIGFyZ3VtZW50Iik7CiAgICB9CiAgfQogIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKICB0aGlzLnByb3h5ID0gcHJveHk7CiAgdGhpcy5zcmMgPSBzcmM7CiAgdGhpcy50eXBlID0gdHlwZTsKICB0aGlzLmNhcHR1cmUgPSAhIWNhcHR1cmU7CiAgdGhpcy5oYW5kbGVyID0gb3B0X2hhbmRsZXI7CiAgdGhpcy5jYWxsT25jZSA9ICExOwogIHRoaXMua2V5ID0gKytnb29nLmV2ZW50cy5MaXN0ZW5lci5jb3VudGVyXzsKICB0aGlzLnJlbW92ZWQgPSAhMQp9Owpnb29nLmV2ZW50cy5MaXN0ZW5lci5wcm90b3R5cGUuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkTGlzdGVuZXIkJGhhbmRsZUV2ZW50JChldmVudE9iamVjdCkgewogIHJldHVybiB0aGlzLmlzRnVuY3Rpb25MaXN0ZW5lcl8gPyB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy5oYW5kbGVyIHx8IHRoaXMuc3JjLCBldmVudE9iamVjdCkgOiB0aGlzLmxpc3RlbmVyLmhhbmRsZUV2ZW50LmNhbGwodGhpcy5saXN0ZW5lciwgZXZlbnRPYmplY3QpCn07Cmdvb2cuZXZlbnRzLkFTU1VNRV9HT09EX0dDID0gITE7Cmdvb2cuZXZlbnRzLmxpc3RlbmVyc18gPSB7fTsKZ29vZy5ldmVudHMubGlzdGVuZXJUcmVlXyA9IHt9Owpnb29nLmV2ZW50cy5zb3VyY2VzXyA9IHt9Owpnb29nLmV2ZW50cy5vblN0cmluZ18gPSAib24iOwpnb29nLmV2ZW50cy5vblN0cmluZ01hcF8gPSB7fTsKZ29vZy5ldmVudHMua2V5U2VwYXJhdG9yXyA9ICJfIjsKZ29vZy5ldmVudHMubGlzdGVuID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJGxpc3RlbiQoc3JjLCB0eXBlLCBsaXN0ZW5lciwgb3B0X2NhcHQsIG9wdF9oYW5kbGVyKSB7CiAgaWYodHlwZSkgewogICAgaWYoZ29vZy5pc0FycmF5KHR5cGUpKSB7CiAgICAgIGZvcih2YXIgaSA9IDA7aSA8IHR5cGUubGVuZ3RoO2krKykgewogICAgICAgIGdvb2cuZXZlbnRzLmxpc3RlbihzcmMsIHR5cGVbaV0sIGxpc3RlbmVyLCBvcHRfY2FwdCwgb3B0X2hhbmRsZXIpCiAgICAgIH0KICAgICAgcmV0dXJuIG51bGwKICAgIH0KICAgIHZhciBjYXB0dXJlID0gISFvcHRfY2FwdCwgbWFwID0gZ29vZy5ldmVudHMubGlzdGVuZXJUcmVlXzsKICAgIHR5cGUgaW4gbWFwIHx8IChtYXBbdHlwZV0gPSB7Y291bnRfOjAsIHJlbWFpbmluZ186MH0pOwogICAgbWFwID0gbWFwW3R5cGVdOwogICAgY2FwdHVyZSBpbiBtYXAgfHwgKG1hcFtjYXB0dXJlXSA9IHtjb3VudF86MCwgcmVtYWluaW5nXzowfSwgbWFwLmNvdW50XysrKTsKICAgIHZhciBtYXAgPSBtYXBbY2FwdHVyZV0sIHNyY1VpZCA9IGdvb2cuZ2V0VWlkKHNyYyksIGxpc3RlbmVyQXJyYXksIGxpc3RlbmVyT2JqOwogICAgbWFwLnJlbWFpbmluZ18rKzsKICAgIGlmKG1hcFtzcmNVaWRdKSB7CiAgICAgIGxpc3RlbmVyQXJyYXkgPSBtYXBbc3JjVWlkXTsKICAgICAgZm9yKGkgPSAwO2kgPCBsaXN0ZW5lckFycmF5Lmxlbmd0aDtpKyspIHsKICAgICAgICBpZihsaXN0ZW5lck9iaiA9IGxpc3RlbmVyQXJyYXlbaV0sIGxpc3RlbmVyT2JqLmxpc3RlbmVyID09IGxpc3RlbmVyICYmIGxpc3RlbmVyT2JqLmhhbmRsZXIgPT0gb3B0X2hhbmRsZXIpIHsKICAgICAgICAgIGlmKGxpc3RlbmVyT2JqLnJlbW92ZWQpIHsKICAgICAgICAgICAgYnJlYWsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBsaXN0ZW5lckFycmF5W2ldLmtleQogICAgICAgIH0KICAgICAgfQogICAgfWVsc2UgewogICAgICBsaXN0ZW5lckFycmF5ID0gbWFwW3NyY1VpZF0gPSBbXSwgbWFwLmNvdW50XysrCiAgICB9CiAgICB2YXIgcHJveHkgPSBnb29nLmV2ZW50cy5nZXRQcm94eSgpOwogICAgcHJveHkuc3JjID0gc3JjOwogICAgbGlzdGVuZXJPYmogPSBuZXcgZ29vZy5ldmVudHMuTGlzdGVuZXI7CiAgICBsaXN0ZW5lck9iai5pbml0KGxpc3RlbmVyLCBwcm94eSwgc3JjLCB0eXBlLCBjYXB0dXJlLCBvcHRfaGFuZGxlcik7CiAgICB2YXIga2V5ID0gbGlzdGVuZXJPYmoua2V5OwogICAgcHJveHkua2V5ID0ga2V5OwogICAgbGlzdGVuZXJBcnJheS5wdXNoKGxpc3RlbmVyT2JqKTsKICAgIGdvb2cuZXZlbnRzLmxpc3RlbmVyc19ba2V5XSA9IGxpc3RlbmVyT2JqOwogICAgZ29vZy5ldmVudHMuc291cmNlc19bc3JjVWlkXSB8fCAoZ29vZy5ldmVudHMuc291cmNlc19bc3JjVWlkXSA9IFtdKTsKICAgIGdvb2cuZXZlbnRzLnNvdXJjZXNfW3NyY1VpZF0ucHVzaChsaXN0ZW5lck9iaik7CiAgICBzcmMuYWRkRXZlbnRMaXN0ZW5lciA/IChzcmMgPT0gZ29vZy5nbG9iYWwgfHwgIXNyYy5jdXN0b21FdmVudF8pICYmIHNyYy5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHByb3h5LCBjYXB0dXJlKSA6IHNyYy5hdHRhY2hFdmVudChnb29nLmV2ZW50cy5nZXRPblN0cmluZ18odHlwZSksIHByb3h5KTsKICAgIHJldHVybiBrZXkKICB9CiAgdGhyb3cgRXJyb3IoIkludmFsaWQgZXZlbnQgdHlwZSIpOwp9Owpnb29nLmV2ZW50cy5nZXRQcm94eSA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRnZXRQcm94eSQoKSB7CiAgdmFyIHByb3h5Q2FsbGJhY2tGdW5jdGlvbiA9IGdvb2cuZXZlbnRzLmhhbmRsZUJyb3dzZXJFdmVudF8sIGYgPSBnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZS5IQVNfVzNDX0VWRU5UX1NVUFBPUlQgPyBmdW5jdGlvbihldmVudE9iamVjdCkgewogICAgcmV0dXJuIHByb3h5Q2FsbGJhY2tGdW5jdGlvbi5jYWxsKGYuc3JjLCBmLmtleSwgZXZlbnRPYmplY3QpCiAgfSA6IGZ1bmN0aW9uKGV2ZW50T2JqZWN0KSB7CiAgICB2YXIgdiA9IHByb3h5Q2FsbGJhY2tGdW5jdGlvbi5jYWxsKGYuc3JjLCBmLmtleSwgZXZlbnRPYmplY3QpOwogICAgaWYoIXYpIHsKICAgICAgcmV0dXJuIHYKICAgIH0KICB9OwogIHJldHVybiBmCn07Cmdvb2cuZXZlbnRzLmxpc3Rlbk9uY2UgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkbGlzdGVuT25jZSQoc3JjLCB0eXBlLCBsaXN0ZW5lciwgb3B0X2NhcHQsIG9wdF9oYW5kbGVyKSB7CiAgaWYoZ29vZy5pc0FycmF5KHR5cGUpKSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCB0eXBlLmxlbmd0aDtpKyspIHsKICAgICAgZ29vZy5ldmVudHMubGlzdGVuT25jZShzcmMsIHR5cGVbaV0sIGxpc3RlbmVyLCBvcHRfY2FwdCwgb3B0X2hhbmRsZXIpCiAgICB9CiAgICByZXR1cm4gbnVsbAogIH0KICB2YXIga2V5ID0gZ29vZy5ldmVudHMubGlzdGVuKHNyYywgdHlwZSwgbGlzdGVuZXIsIG9wdF9jYXB0LCBvcHRfaGFuZGxlciksIGxpc3RlbmVyT2JqID0gZ29vZy5ldmVudHMubGlzdGVuZXJzX1trZXldOwogIGxpc3RlbmVyT2JqLmNhbGxPbmNlID0gITA7CiAgcmV0dXJuIGtleQp9Owpnb29nLmV2ZW50cy5saXN0ZW5XaXRoV3JhcHBlciA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRsaXN0ZW5XaXRoV3JhcHBlciQoc3JjLCB3cmFwcGVyLCBsaXN0ZW5lciwgb3B0X2NhcHQsIG9wdF9oYW5kbGVyKSB7CiAgd3JhcHBlci5saXN0ZW4oc3JjLCBsaXN0ZW5lciwgb3B0X2NhcHQsIG9wdF9oYW5kbGVyKQp9Owpnb29nLmV2ZW50cy51bmxpc3RlbiA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyR1bmxpc3RlbiQoc3JjLCB0eXBlLCBsaXN0ZW5lciwgb3B0X2NhcHQsIG9wdF9oYW5kbGVyKSB7CiAgaWYoZ29vZy5pc0FycmF5KHR5cGUpKSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCB0eXBlLmxlbmd0aDtpKyspIHsKICAgICAgZ29vZy5ldmVudHMudW5saXN0ZW4oc3JjLCB0eXBlW2ldLCBsaXN0ZW5lciwgb3B0X2NhcHQsIG9wdF9oYW5kbGVyKQogICAgfQogICAgcmV0dXJuIG51bGwKICB9CiAgdmFyIGNhcHR1cmUgPSAhIW9wdF9jYXB0LCBsaXN0ZW5lckFycmF5ID0gZ29vZy5ldmVudHMuZ2V0TGlzdGVuZXJzXyhzcmMsIHR5cGUsIGNhcHR1cmUpOwogIGlmKCFsaXN0ZW5lckFycmF5KSB7CiAgICByZXR1cm4hMQogIH0KICBmb3IoaSA9IDA7aSA8IGxpc3RlbmVyQXJyYXkubGVuZ3RoO2krKykgewogICAgaWYobGlzdGVuZXJBcnJheVtpXS5saXN0ZW5lciA9PSBsaXN0ZW5lciAmJiBsaXN0ZW5lckFycmF5W2ldLmNhcHR1cmUgPT0gY2FwdHVyZSAmJiBsaXN0ZW5lckFycmF5W2ldLmhhbmRsZXIgPT0gb3B0X2hhbmRsZXIpIHsKICAgICAgcmV0dXJuIGdvb2cuZXZlbnRzLnVubGlzdGVuQnlLZXkobGlzdGVuZXJBcnJheVtpXS5rZXkpCiAgICB9CiAgfQogIHJldHVybiExCn07Cmdvb2cuZXZlbnRzLnVubGlzdGVuQnlLZXkgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkdW5saXN0ZW5CeUtleSQoa2V5KSB7CiAgaWYoIWdvb2cuZXZlbnRzLmxpc3RlbmVyc19ba2V5XSkgewogICAgcmV0dXJuITEKICB9CiAgdmFyIGxpc3RlbmVyID0gZ29vZy5ldmVudHMubGlzdGVuZXJzX1trZXldOwogIGlmKGxpc3RlbmVyLnJlbW92ZWQpIHsKICAgIHJldHVybiExCiAgfQogIHZhciBzcmMgPSBsaXN0ZW5lci5zcmMsIHR5cGUgPSBsaXN0ZW5lci50eXBlLCBwcm94eSA9IGxpc3RlbmVyLnByb3h5LCBjYXB0dXJlID0gbGlzdGVuZXIuY2FwdHVyZTsKICBzcmMucmVtb3ZlRXZlbnRMaXN0ZW5lciA/IChzcmMgPT0gZ29vZy5nbG9iYWwgfHwgIXNyYy5jdXN0b21FdmVudF8pICYmIHNyYy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHByb3h5LCBjYXB0dXJlKSA6IHNyYy5kZXRhY2hFdmVudCAmJiBzcmMuZGV0YWNoRXZlbnQoZ29vZy5ldmVudHMuZ2V0T25TdHJpbmdfKHR5cGUpLCBwcm94eSk7CiAgdmFyIHNyY1VpZCA9IGdvb2cuZ2V0VWlkKHNyYyksIGxpc3RlbmVyQXJyYXkgPSBnb29nLmV2ZW50cy5saXN0ZW5lclRyZWVfW3R5cGVdW2NhcHR1cmVdW3NyY1VpZF07CiAgaWYoZ29vZy5ldmVudHMuc291cmNlc19bc3JjVWlkXSkgewogICAgdmFyIHNvdXJjZXNBcnJheSA9IGdvb2cuZXZlbnRzLnNvdXJjZXNfW3NyY1VpZF07CiAgICBnb29nLmFycmF5LnJlbW92ZShzb3VyY2VzQXJyYXksIGxpc3RlbmVyKTsKICAgIDAgPT0gc291cmNlc0FycmF5Lmxlbmd0aCAmJiBkZWxldGUgZ29vZy5ldmVudHMuc291cmNlc19bc3JjVWlkXQogIH0KICBsaXN0ZW5lci5yZW1vdmVkID0gITA7CiAgbGlzdGVuZXJBcnJheS5uZWVkc0NsZWFudXBfID0gITA7CiAgZ29vZy5ldmVudHMuY2xlYW5VcF8odHlwZSwgY2FwdHVyZSwgc3JjVWlkLCBsaXN0ZW5lckFycmF5KTsKICBkZWxldGUgZ29vZy5ldmVudHMubGlzdGVuZXJzX1trZXldOwogIHJldHVybiEwCn07Cmdvb2cuZXZlbnRzLnVubGlzdGVuV2l0aFdyYXBwZXIgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkdW5saXN0ZW5XaXRoV3JhcHBlciQoc3JjLCB3cmFwcGVyLCBsaXN0ZW5lciwgb3B0X2NhcHQsIG9wdF9oYW5kbGVyKSB7CiAgd3JhcHBlci51bmxpc3RlbihzcmMsIGxpc3RlbmVyLCBvcHRfY2FwdCwgb3B0X2hhbmRsZXIpCn07Cmdvb2cuZXZlbnRzLmNsZWFuVXBfID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJGNsZWFuVXBfJCh0eXBlLCBjYXB0dXJlLCBzcmNVaWQsIGxpc3RlbmVyQXJyYXkpIHsKICBpZighbGlzdGVuZXJBcnJheS5sb2NrZWRfICYmIGxpc3RlbmVyQXJyYXkubmVlZHNDbGVhbnVwXykgewogICAgZm9yKHZhciBvbGRJbmRleCA9IDAsIG5ld0luZGV4ID0gMDtvbGRJbmRleCA8IGxpc3RlbmVyQXJyYXkubGVuZ3RoO29sZEluZGV4KyspIHsKICAgICAgaWYobGlzdGVuZXJBcnJheVtvbGRJbmRleF0ucmVtb3ZlZCkgewogICAgICAgIHZhciBwcm94eSA9IGxpc3RlbmVyQXJyYXlbb2xkSW5kZXhdLnByb3h5OwogICAgICAgIHByb3h5LnNyYyA9IG51bGwKICAgICAgfWVsc2UgewogICAgICAgIG9sZEluZGV4ICE9IG5ld0luZGV4ICYmIChsaXN0ZW5lckFycmF5W25ld0luZGV4XSA9IGxpc3RlbmVyQXJyYXlbb2xkSW5kZXhdKSwgbmV3SW5kZXgrKwogICAgICB9CiAgICB9CiAgICBsaXN0ZW5lckFycmF5Lmxlbmd0aCA9IG5ld0luZGV4OwogICAgbGlzdGVuZXJBcnJheS5uZWVkc0NsZWFudXBfID0gITE7CiAgICAwID09IG5ld0luZGV4ICYmIChkZWxldGUgZ29vZy5ldmVudHMubGlzdGVuZXJUcmVlX1t0eXBlXVtjYXB0dXJlXVtzcmNVaWRdLCBnb29nLmV2ZW50cy5saXN0ZW5lclRyZWVfW3R5cGVdW2NhcHR1cmVdLmNvdW50Xy0tLCAwID09IGdvb2cuZXZlbnRzLmxpc3RlbmVyVHJlZV9bdHlwZV1bY2FwdHVyZV0uY291bnRfICYmIChkZWxldGUgZ29vZy5ldmVudHMubGlzdGVuZXJUcmVlX1t0eXBlXVtjYXB0dXJlXSwgZ29vZy5ldmVudHMubGlzdGVuZXJUcmVlX1t0eXBlXS5jb3VudF8tLSksIDAgPT0gZ29vZy5ldmVudHMubGlzdGVuZXJUcmVlX1t0eXBlXS5jb3VudF8gJiYgZGVsZXRlIGdvb2cuZXZlbnRzLmxpc3RlbmVyVHJlZV9bdHlwZV0pCiAgfQp9Owpnb29nLmV2ZW50cy5yZW1vdmVBbGwgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkcmVtb3ZlQWxsJChvcHRfb2JqLCBvcHRfdHlwZSwgb3B0X2NhcHQpIHsKICB2YXIgY291bnQgPSAwLCBub09iaiA9IG51bGwgPT0gb3B0X29iaiwgbm9UeXBlID0gbnVsbCA9PSBvcHRfdHlwZSwgbm9DYXB0ID0gbnVsbCA9PSBvcHRfY2FwdCwgb3B0X2NhcHQgPSAhIW9wdF9jYXB0OwogIGlmKG5vT2JqKSB7CiAgICBnb29nLm9iamVjdC5mb3JFYWNoKGdvb2cuZXZlbnRzLnNvdXJjZXNfLCBmdW5jdGlvbihsaXN0ZW5lcnMpIHsKICAgICAgZm9yKHZhciBpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7MCA8PSBpO2ktLSkgewogICAgICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTsKICAgICAgICBpZigobm9UeXBlIHx8IG9wdF90eXBlID09IGxpc3RlbmVyLnR5cGUpICYmIChub0NhcHQgfHwgb3B0X2NhcHQgPT0gbGlzdGVuZXIuY2FwdHVyZSkpIHsKICAgICAgICAgIGdvb2cuZXZlbnRzLnVubGlzdGVuQnlLZXkobGlzdGVuZXIua2V5KSwgY291bnQrKwogICAgICAgIH0KICAgICAgfQogICAgfSkKICB9ZWxzZSB7CiAgICB2YXIgc3JjVWlkID0gZ29vZy5nZXRVaWQob3B0X29iaik7CiAgICBpZihnb29nLmV2ZW50cy5zb3VyY2VzX1tzcmNVaWRdKSB7CiAgICAgIGZvcih2YXIgc291cmNlc0FycmF5ID0gZ29vZy5ldmVudHMuc291cmNlc19bc3JjVWlkXSwgaSQkMCA9IHNvdXJjZXNBcnJheS5sZW5ndGggLSAxOzAgPD0gaSQkMDtpJCQwLS0pIHsKICAgICAgICB2YXIgbGlzdGVuZXIkJDAgPSBzb3VyY2VzQXJyYXlbaSQkMF07CiAgICAgICAgaWYoKG5vVHlwZSB8fCBvcHRfdHlwZSA9PSBsaXN0ZW5lciQkMC50eXBlKSAmJiAobm9DYXB0IHx8IG9wdF9jYXB0ID09IGxpc3RlbmVyJCQwLmNhcHR1cmUpKSB7CiAgICAgICAgICBnb29nLmV2ZW50cy51bmxpc3RlbkJ5S2V5KGxpc3RlbmVyJCQwLmtleSksIGNvdW50KysKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGNvdW50Cn07Cmdvb2cuZXZlbnRzLmdldExpc3RlbmVycyA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRnZXRMaXN0ZW5lcnMkKG9iaiwgdHlwZSwgY2FwdHVyZSkgewogIHJldHVybiBnb29nLmV2ZW50cy5nZXRMaXN0ZW5lcnNfKG9iaiwgdHlwZSwgY2FwdHVyZSkgfHwgW10KfTsKZ29vZy5ldmVudHMuZ2V0TGlzdGVuZXJzXyA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRnZXRMaXN0ZW5lcnNfJChvYmosIHR5cGUsIGNhcHR1cmUpIHsKICB2YXIgbWFwID0gZ29vZy5ldmVudHMubGlzdGVuZXJUcmVlXzsKICBpZih0eXBlIGluIG1hcCAmJiAobWFwID0gbWFwW3R5cGVdLCBjYXB0dXJlIGluIG1hcCkpIHsKICAgIHZhciBtYXAgPSBtYXBbY2FwdHVyZV0sIG9ialVpZCA9IGdvb2cuZ2V0VWlkKG9iaik7CiAgICBpZihtYXBbb2JqVWlkXSkgewogICAgICByZXR1cm4gbWFwW29ialVpZF0KICAgIH0KICB9CiAgcmV0dXJuIG51bGwKfTsKZ29vZy5ldmVudHMuZ2V0TGlzdGVuZXIgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkZ2V0TGlzdGVuZXIkKHNyYywgdHlwZSwgbGlzdGVuZXIsIG9wdF9jYXB0LCBvcHRfaGFuZGxlcikgewogIHZhciBjYXB0dXJlID0gISFvcHRfY2FwdCwgbGlzdGVuZXJBcnJheSA9IGdvb2cuZXZlbnRzLmdldExpc3RlbmVyc18oc3JjLCB0eXBlLCBjYXB0dXJlKTsKICBpZihsaXN0ZW5lckFycmF5KSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCBsaXN0ZW5lckFycmF5Lmxlbmd0aDtpKyspIHsKICAgICAgaWYoIWxpc3RlbmVyQXJyYXlbaV0ucmVtb3ZlZCAmJiBsaXN0ZW5lckFycmF5W2ldLmxpc3RlbmVyID09IGxpc3RlbmVyICYmIGxpc3RlbmVyQXJyYXlbaV0uY2FwdHVyZSA9PSBjYXB0dXJlICYmIGxpc3RlbmVyQXJyYXlbaV0uaGFuZGxlciA9PSBvcHRfaGFuZGxlcikgewogICAgICAgIHJldHVybiBsaXN0ZW5lckFycmF5W2ldCiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG51bGwKfTsKZ29vZy5ldmVudHMuaGFzTGlzdGVuZXIgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkaGFzTGlzdGVuZXIkKG9iaiwgb3B0X3R5cGUsIG9wdF9jYXB0dXJlKSB7CiAgdmFyIG9ialVpZCA9IGdvb2cuZ2V0VWlkKG9iaiksIGxpc3RlbmVycyA9IGdvb2cuZXZlbnRzLnNvdXJjZXNfW29ialVpZF07CiAgaWYobGlzdGVuZXJzKSB7CiAgICB2YXIgaGFzVHlwZSA9IGdvb2cuaXNEZWYob3B0X3R5cGUpLCBoYXNDYXB0dXJlID0gZ29vZy5pc0RlZihvcHRfY2FwdHVyZSk7CiAgICBpZihoYXNUeXBlICYmIGhhc0NhcHR1cmUpIHsKICAgICAgdmFyIG1hcCA9IGdvb2cuZXZlbnRzLmxpc3RlbmVyVHJlZV9bb3B0X3R5cGVdOwogICAgICByZXR1cm4hIW1hcCAmJiAhIW1hcFtvcHRfY2FwdHVyZV0gJiYgb2JqVWlkIGluIG1hcFtvcHRfY2FwdHVyZV0KICAgIH0KICAgIHJldHVybiFoYXNUeXBlICYmICFoYXNDYXB0dXJlID8gITAgOiBnb29nLmFycmF5LnNvbWUobGlzdGVuZXJzLCBmdW5jdGlvbihsaXN0ZW5lcikgewogICAgICByZXR1cm4gaGFzVHlwZSAmJiBsaXN0ZW5lci50eXBlID09IG9wdF90eXBlIHx8IGhhc0NhcHR1cmUgJiYgbGlzdGVuZXIuY2FwdHVyZSA9PSBvcHRfY2FwdHVyZQogICAgfSkKICB9CiAgcmV0dXJuITEKfTsKZ29vZy5ldmVudHMuZXhwb3NlID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJGV4cG9zZSQoZSkgewogIHZhciBzdHIgPSBbXSwga2V5OwogIGZvcihrZXkgaW4gZSkgewogICAgZVtrZXldICYmIGVba2V5XS5pZCA/IHN0ci5wdXNoKGtleSArICIgPSAiICsgZVtrZXldICsgIiAoIiArIGVba2V5XS5pZCArICIpIikgOiBzdHIucHVzaChrZXkgKyAiID0gIiArIGVba2V5XSkKICB9CiAgcmV0dXJuIHN0ci5qb2luKCJcbiIpCn07Cmdvb2cuZXZlbnRzLmdldE9uU3RyaW5nXyA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRnZXRPblN0cmluZ18kKHR5cGUpIHsKICByZXR1cm4gdHlwZSBpbiBnb29nLmV2ZW50cy5vblN0cmluZ01hcF8gPyBnb29nLmV2ZW50cy5vblN0cmluZ01hcF9bdHlwZV0gOiBnb29nLmV2ZW50cy5vblN0cmluZ01hcF9bdHlwZV0gPSBnb29nLmV2ZW50cy5vblN0cmluZ18gKyB0eXBlCn07Cmdvb2cuZXZlbnRzLmZpcmVMaXN0ZW5lcnMgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkZmlyZUxpc3RlbmVycyQob2JqLCB0eXBlLCBjYXB0dXJlLCBldmVudE9iamVjdCkgewogIHZhciBtYXAgPSBnb29nLmV2ZW50cy5saXN0ZW5lclRyZWVfOwogIHJldHVybiB0eXBlIGluIG1hcCAmJiAobWFwID0gbWFwW3R5cGVdLCBjYXB0dXJlIGluIG1hcCkgPyBnb29nLmV2ZW50cy5maXJlTGlzdGVuZXJzXyhtYXBbY2FwdHVyZV0sIG9iaiwgdHlwZSwgY2FwdHVyZSwgZXZlbnRPYmplY3QpIDogITAKfTsKZ29vZy5ldmVudHMuZmlyZUxpc3RlbmVyc18gPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkZmlyZUxpc3RlbmVyc18kKG1hcCwgb2JqLCB0eXBlLCBjYXB0dXJlLCBldmVudE9iamVjdCkgewogIHZhciByZXR2YWwgPSAxLCBvYmpVaWQgPSBnb29nLmdldFVpZChvYmopOwogIGlmKG1hcFtvYmpVaWRdKSB7CiAgICBtYXAucmVtYWluaW5nXy0tOwogICAgdmFyIGxpc3RlbmVyQXJyYXkgPSBtYXBbb2JqVWlkXTsKICAgIGxpc3RlbmVyQXJyYXkubG9ja2VkXyA/IGxpc3RlbmVyQXJyYXkubG9ja2VkXysrIDogbGlzdGVuZXJBcnJheS5sb2NrZWRfID0gMTsKICAgIHRyeSB7CiAgICAgIGZvcih2YXIgbGVuZ3RoID0gbGlzdGVuZXJBcnJheS5sZW5ndGgsIGkgPSAwO2kgPCBsZW5ndGg7aSsrKSB7CiAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJBcnJheVtpXTsKICAgICAgICBsaXN0ZW5lciAmJiAhbGlzdGVuZXIucmVtb3ZlZCAmJiAocmV0dmFsICY9ICExICE9PSBnb29nLmV2ZW50cy5maXJlTGlzdGVuZXIobGlzdGVuZXIsIGV2ZW50T2JqZWN0KSkKICAgICAgfQogICAgfWZpbmFsbHkgewogICAgICBsaXN0ZW5lckFycmF5LmxvY2tlZF8tLSwgZ29vZy5ldmVudHMuY2xlYW5VcF8odHlwZSwgY2FwdHVyZSwgb2JqVWlkLCBsaXN0ZW5lckFycmF5KQogICAgfQogIH0KICByZXR1cm4gQm9vbGVhbihyZXR2YWwpCn07Cmdvb2cuZXZlbnRzLmZpcmVMaXN0ZW5lciA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRmaXJlTGlzdGVuZXIkKGxpc3RlbmVyLCBldmVudE9iamVjdCkgewogIHZhciBydiA9IGxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50T2JqZWN0KTsKICBsaXN0ZW5lci5jYWxsT25jZSAmJiBnb29nLmV2ZW50cy51bmxpc3RlbkJ5S2V5KGxpc3RlbmVyLmtleSk7CiAgcmV0dXJuIHJ2Cn07Cmdvb2cuZXZlbnRzLmdldFRvdGFsTGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRnZXRUb3RhbExpc3RlbmVyQ291bnQkKCkgewogIHJldHVybiBnb29nLm9iamVjdC5nZXRDb3VudChnb29nLmV2ZW50cy5saXN0ZW5lcnNfKQp9Owpnb29nLmV2ZW50cy5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJGRpc3BhdGNoRXZlbnQkKHNyYywgZSkgewogIHZhciB0eXBlID0gZS50eXBlIHx8IGUsIG1hcCA9IGdvb2cuZXZlbnRzLmxpc3RlbmVyVHJlZV87CiAgaWYoISh0eXBlIGluIG1hcCkpIHsKICAgIHJldHVybiEwCiAgfQogIGlmKGdvb2cuaXNTdHJpbmcoZSkpIHsKICAgIGUgPSBuZXcgZ29vZy5ldmVudHMuRXZlbnQoZSwgc3JjKQogIH1lbHNlIHsKICAgIGlmKGUgaW5zdGFuY2VvZiBnb29nLmV2ZW50cy5FdmVudCkgewogICAgICBlLnRhcmdldCA9IGUudGFyZ2V0IHx8IHNyYwogICAgfWVsc2UgewogICAgICB2YXIgb2xkRXZlbnQgPSBlLCBlID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50KHR5cGUsIHNyYyk7CiAgICAgIGdvb2cub2JqZWN0LmV4dGVuZChlLCBvbGRFdmVudCkKICAgIH0KICB9CiAgdmFyIHJ2ID0gMSwgYW5jZXN0b3JzLCBtYXAgPSBtYXBbdHlwZV0sIGhhc0NhcHR1cmUgPSAhMCBpbiBtYXAsIHRhcmdldHNNYXA7CiAgaWYoaGFzQ2FwdHVyZSkgewogICAgYW5jZXN0b3JzID0gW107CiAgICBmb3IodmFyIHBhcmVudCA9IHNyYztwYXJlbnQ7cGFyZW50ID0gcGFyZW50LmdldFBhcmVudEV2ZW50VGFyZ2V0KCkpIHsKICAgICAgYW5jZXN0b3JzLnB1c2gocGFyZW50KQogICAgfQogICAgdGFyZ2V0c01hcCA9IG1hcFshMF07CiAgICB0YXJnZXRzTWFwLnJlbWFpbmluZ18gPSB0YXJnZXRzTWFwLmNvdW50XzsKICAgIGZvcih2YXIgaSA9IGFuY2VzdG9ycy5sZW5ndGggLSAxOyFlLnByb3BhZ2F0aW9uU3RvcHBlZF8gJiYgMCA8PSBpICYmIHRhcmdldHNNYXAucmVtYWluaW5nXztpLS0pIHsKICAgICAgZS5jdXJyZW50VGFyZ2V0ID0gYW5jZXN0b3JzW2ldLCBydiAmPSBnb29nLmV2ZW50cy5maXJlTGlzdGVuZXJzXyh0YXJnZXRzTWFwLCBhbmNlc3RvcnNbaV0sIGUudHlwZSwgITAsIGUpICYmICExICE9IGUucmV0dXJuVmFsdWVfCiAgICB9CiAgfQogIHZhciBoYXNCdWJibGUgPSAhMSBpbiBtYXA7CiAgaWYoaGFzQnViYmxlKSB7CiAgICBpZih0YXJnZXRzTWFwID0gbWFwWyExXSwgdGFyZ2V0c01hcC5yZW1haW5pbmdfID0gdGFyZ2V0c01hcC5jb3VudF8sIGhhc0NhcHR1cmUpIHsKICAgICAgZm9yKGkgPSAwOyFlLnByb3BhZ2F0aW9uU3RvcHBlZF8gJiYgaSA8IGFuY2VzdG9ycy5sZW5ndGggJiYgdGFyZ2V0c01hcC5yZW1haW5pbmdfO2krKykgewogICAgICAgIGUuY3VycmVudFRhcmdldCA9IGFuY2VzdG9yc1tpXSwgcnYgJj0gZ29vZy5ldmVudHMuZmlyZUxpc3RlbmVyc18odGFyZ2V0c01hcCwgYW5jZXN0b3JzW2ldLCBlLnR5cGUsICExLCBlKSAmJiAhMSAhPSBlLnJldHVyblZhbHVlXwogICAgICB9CiAgICB9ZWxzZSB7CiAgICAgIGZvcih2YXIgY3VycmVudCA9IHNyYzshZS5wcm9wYWdhdGlvblN0b3BwZWRfICYmIGN1cnJlbnQgJiYgdGFyZ2V0c01hcC5yZW1haW5pbmdfO2N1cnJlbnQgPSBjdXJyZW50LmdldFBhcmVudEV2ZW50VGFyZ2V0KCkpIHsKICAgICAgICBlLmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50LCBydiAmPSBnb29nLmV2ZW50cy5maXJlTGlzdGVuZXJzXyh0YXJnZXRzTWFwLCBjdXJyZW50LCBlLnR5cGUsICExLCBlKSAmJiAhMSAhPSBlLnJldHVyblZhbHVlXwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBCb29sZWFuKHJ2KQp9Owpnb29nLmV2ZW50cy5wcm90ZWN0QnJvd3NlckV2ZW50RW50cnlQb2ludCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRwcm90ZWN0QnJvd3NlckV2ZW50RW50cnlQb2ludCQoZXJyb3JIYW5kbGVyKSB7CiAgZ29vZy5ldmVudHMuaGFuZGxlQnJvd3NlckV2ZW50XyA9IGVycm9ySGFuZGxlci5wcm90ZWN0RW50cnlQb2ludChnb29nLmV2ZW50cy5oYW5kbGVCcm93c2VyRXZlbnRfKQp9Owpnb29nLmV2ZW50cy5oYW5kbGVCcm93c2VyRXZlbnRfID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJGhhbmRsZUJyb3dzZXJFdmVudF8kKGtleSwgb3B0X2V2dCkgewogIGlmKCFnb29nLmV2ZW50cy5saXN0ZW5lcnNfW2tleV0pIHsKICAgIHJldHVybiEwCiAgfQogIHZhciBsaXN0ZW5lciA9IGdvb2cuZXZlbnRzLmxpc3RlbmVyc19ba2V5XSwgdHlwZSA9IGxpc3RlbmVyLnR5cGUsIG1hcCA9IGdvb2cuZXZlbnRzLmxpc3RlbmVyVHJlZV87CiAgaWYoISh0eXBlIGluIG1hcCkpIHsKICAgIHJldHVybiEwCiAgfQogIHZhciBtYXAgPSBtYXBbdHlwZV0sIHJldHZhbCwgdGFyZ2V0c01hcDsKICBpZighZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUuSEFTX1czQ19FVkVOVF9TVVBQT1JUKSB7CiAgICB2YXIgaWVFdmVudCA9IG9wdF9ldnQgfHwgZ29vZy5nZXRPYmplY3RCeU5hbWUoIndpbmRvdy5ldmVudCIpLCBoYXNDYXB0dXJlID0gITAgaW4gbWFwLCBoYXNCdWJibGUgPSAhMSBpbiBtYXA7CiAgICBpZihoYXNDYXB0dXJlKSB7CiAgICAgIGlmKGdvb2cuZXZlbnRzLmlzTWFya2VkSWVFdmVudF8oaWVFdmVudCkpIHsKICAgICAgICByZXR1cm4hMAogICAgICB9CiAgICAgIGdvb2cuZXZlbnRzLm1hcmtJZUV2ZW50XyhpZUV2ZW50KQogICAgfQogICAgdmFyIGV2dCA9IG5ldyBnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQ7CiAgICBldnQuaW5pdChpZUV2ZW50LCB0aGlzKTsKICAgIHJldHZhbCA9ICEwOwogICAgdHJ5IHsKICAgICAgaWYoaGFzQ2FwdHVyZSkgewogICAgICAgIGZvcih2YXIgYW5jZXN0b3JzID0gW10sIHBhcmVudCA9IGV2dC5jdXJyZW50VGFyZ2V0O3BhcmVudDtwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSkgewogICAgICAgICAgYW5jZXN0b3JzLnB1c2gocGFyZW50KQogICAgICAgIH0KICAgICAgICB0YXJnZXRzTWFwID0gbWFwWyEwXTsKICAgICAgICB0YXJnZXRzTWFwLnJlbWFpbmluZ18gPSB0YXJnZXRzTWFwLmNvdW50XzsKICAgICAgICBmb3IodmFyIGkgPSBhbmNlc3RvcnMubGVuZ3RoIC0gMTshZXZ0LnByb3BhZ2F0aW9uU3RvcHBlZF8gJiYgMCA8PSBpICYmIHRhcmdldHNNYXAucmVtYWluaW5nXztpLS0pIHsKICAgICAgICAgIGV2dC5jdXJyZW50VGFyZ2V0ID0gYW5jZXN0b3JzW2ldLCByZXR2YWwgJj0gZ29vZy5ldmVudHMuZmlyZUxpc3RlbmVyc18odGFyZ2V0c01hcCwgYW5jZXN0b3JzW2ldLCB0eXBlLCAhMCwgZXZ0KQogICAgICAgIH0KICAgICAgICBpZihoYXNCdWJibGUpIHsKICAgICAgICAgIHRhcmdldHNNYXAgPSBtYXBbITFdOwogICAgICAgICAgdGFyZ2V0c01hcC5yZW1haW5pbmdfID0gdGFyZ2V0c01hcC5jb3VudF87CiAgICAgICAgICBmb3IoaSA9IDA7IWV2dC5wcm9wYWdhdGlvblN0b3BwZWRfICYmIGkgPCBhbmNlc3RvcnMubGVuZ3RoICYmIHRhcmdldHNNYXAucmVtYWluaW5nXztpKyspIHsKICAgICAgICAgICAgZXZ0LmN1cnJlbnRUYXJnZXQgPSBhbmNlc3RvcnNbaV0sIHJldHZhbCAmPSBnb29nLmV2ZW50cy5maXJlTGlzdGVuZXJzXyh0YXJnZXRzTWFwLCBhbmNlc3RvcnNbaV0sIHR5cGUsICExLCBldnQpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9ZWxzZSB7CiAgICAgICAgcmV0dmFsID0gZ29vZy5ldmVudHMuZmlyZUxpc3RlbmVyKGxpc3RlbmVyLCBldnQpCiAgICAgIH0KICAgIH1maW5hbGx5IHsKICAgICAgYW5jZXN0b3JzICYmIChhbmNlc3RvcnMubGVuZ3RoID0gMCksIGV2dC5kaXNwb3NlKCkKICAgIH0KICAgIHJldHVybiByZXR2YWwKICB9CiAgdmFyIGJlID0gbmV3IGdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudChvcHRfZXZ0LCB0aGlzKTsKICB0cnkgewogICAgcmV0dmFsID0gZ29vZy5ldmVudHMuZmlyZUxpc3RlbmVyKGxpc3RlbmVyLCBiZSkKICB9ZmluYWxseSB7CiAgICBiZS5kaXNwb3NlKCkKICB9CiAgcmV0dXJuIHJldHZhbAp9Owpnb29nLmV2ZW50cy5tYXJrSWVFdmVudF8gPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkbWFya0llRXZlbnRfJChlKSB7CiAgdmFyIHVzZVJldHVyblZhbHVlID0gITE7CiAgaWYoMCA9PSBlLmtleUNvZGUpIHsKICAgIHRyeSB7CiAgICAgIGUua2V5Q29kZSA9IC0xOwogICAgICByZXR1cm4KICAgIH1jYXRjaChleCkgewogICAgICB1c2VSZXR1cm5WYWx1ZSA9ICEwCiAgICB9CiAgfQogIGlmKHVzZVJldHVyblZhbHVlIHx8IHZvaWQgMCA9PSBlLnJldHVyblZhbHVlKSB7CiAgICBlLnJldHVyblZhbHVlID0gITAKICB9Cn07Cmdvb2cuZXZlbnRzLmlzTWFya2VkSWVFdmVudF8gPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkaXNNYXJrZWRJZUV2ZW50XyQoZSkgewogIHJldHVybiAwID4gZS5rZXlDb2RlIHx8IHZvaWQgMCAhPSBlLnJldHVyblZhbHVlCn07Cmdvb2cuZXZlbnRzLnVuaXF1ZUlkQ291bnRlcl8gPSAwOwpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRnZXRVbmlxdWVJZCQoaWRlbnRpZmllcikgewogIHJldHVybiBpZGVudGlmaWVyICsgIl8iICsgZ29vZy5ldmVudHMudW5pcXVlSWRDb3VudGVyXysrCn07Cmdvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5LnJlZ2lzdGVyKGZ1bmN0aW9uKHRyYW5zZm9ybWVyKSB7CiAgZ29vZy5ldmVudHMuaGFuZGxlQnJvd3NlckV2ZW50XyA9IHRyYW5zZm9ybWVyKGdvb2cuZXZlbnRzLmhhbmRsZUJyb3dzZXJFdmVudF8pCn0pOwpnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkRXZlbnRIYW5kbGVyJChvcHRfaGFuZGxlcikgewogIGdvb2cuRGlzcG9zYWJsZS5jYWxsKHRoaXMpOwogIHRoaXMuaGFuZGxlcl8gPSBvcHRfaGFuZGxlcjsKICB0aGlzLmtleXNfID0gW10KfTsKZ29vZy5pbmhlcml0cyhnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIsIGdvb2cuRGlzcG9zYWJsZSk7Cmdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlci50eXBlQXJyYXlfID0gW107Cmdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlci5wcm90b3R5cGUubGlzdGVuID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50SGFuZGxlciQkbGlzdGVuJChzcmMsIHR5cGUsIG9wdF9mbiwgb3B0X2NhcHR1cmUsIG9wdF9oYW5kbGVyKSB7CiAgZ29vZy5pc0FycmF5KHR5cGUpIHx8IChnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIudHlwZUFycmF5X1swXSA9IHR5cGUsIHR5cGUgPSBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIudHlwZUFycmF5Xyk7CiAgZm9yKHZhciBpID0gMDtpIDwgdHlwZS5sZW5ndGg7aSsrKSB7CiAgICB2YXIga2V5ID0gZ29vZy5ldmVudHMubGlzdGVuKHNyYywgdHlwZVtpXSwgb3B0X2ZuIHx8IHRoaXMsIG9wdF9jYXB0dXJlIHx8ICExLCBvcHRfaGFuZGxlciB8fCB0aGlzLmhhbmRsZXJfIHx8IHRoaXMpOwogICAgdGhpcy5rZXlzXy5wdXNoKGtleSkKICB9CiAgcmV0dXJuIHRoaXMKfTsKZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyLnByb3RvdHlwZS5saXN0ZW5PbmNlID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50SGFuZGxlciQkbGlzdGVuT25jZSQoc3JjLCB0eXBlLCBvcHRfZm4sIG9wdF9jYXB0dXJlLCBvcHRfaGFuZGxlcikgewogIGlmKGdvb2cuaXNBcnJheSh0eXBlKSkgewogICAgZm9yKHZhciBpID0gMDtpIDwgdHlwZS5sZW5ndGg7aSsrKSB7CiAgICAgIHRoaXMubGlzdGVuT25jZShzcmMsIHR5cGVbaV0sIG9wdF9mbiwgb3B0X2NhcHR1cmUsIG9wdF9oYW5kbGVyKQogICAgfQogIH1lbHNlIHsKICAgIHZhciBrZXkgPSBnb29nLmV2ZW50cy5saXN0ZW5PbmNlKHNyYywgdHlwZSwgb3B0X2ZuIHx8IHRoaXMsIG9wdF9jYXB0dXJlLCBvcHRfaGFuZGxlciB8fCB0aGlzLmhhbmRsZXJfIHx8IHRoaXMpOwogICAgdGhpcy5rZXlzXy5wdXNoKGtleSkKICB9CiAgcmV0dXJuIHRoaXMKfTsKZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyLnByb3RvdHlwZS5saXN0ZW5XaXRoV3JhcHBlciA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRFdmVudEhhbmRsZXIkJGxpc3RlbldpdGhXcmFwcGVyJChzcmMsIHdyYXBwZXIsIGxpc3RlbmVyLCBvcHRfY2FwdCwgb3B0X2hhbmRsZXIpIHsKICB3cmFwcGVyLmxpc3RlbihzcmMsIGxpc3RlbmVyLCBvcHRfY2FwdCwgb3B0X2hhbmRsZXIgfHwgdGhpcy5oYW5kbGVyXywgdGhpcyk7CiAgcmV0dXJuIHRoaXMKfTsKZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bmxpc3RlbiA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRFdmVudEhhbmRsZXIkJHVubGlzdGVuJChzcmMsIHR5cGUsIG9wdF9mbiwgb3B0X2NhcHR1cmUsIG9wdF9oYW5kbGVyKSB7CiAgaWYoZ29vZy5pc0FycmF5KHR5cGUpKSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCB0eXBlLmxlbmd0aDtpKyspIHsKICAgICAgdGhpcy51bmxpc3RlbihzcmMsIHR5cGVbaV0sIG9wdF9mbiwgb3B0X2NhcHR1cmUsIG9wdF9oYW5kbGVyKQogICAgfQogIH1lbHNlIHsKICAgIHZhciBsaXN0ZW5lciA9IGdvb2cuZXZlbnRzLmdldExpc3RlbmVyKHNyYywgdHlwZSwgb3B0X2ZuIHx8IHRoaXMsIG9wdF9jYXB0dXJlLCBvcHRfaGFuZGxlciB8fCB0aGlzLmhhbmRsZXJfIHx8IHRoaXMpOwogICAgaWYobGlzdGVuZXIpIHsKICAgICAgdmFyIGtleSA9IGxpc3RlbmVyLmtleTsKICAgICAgZ29vZy5ldmVudHMudW5saXN0ZW5CeUtleShrZXkpOwogICAgICBnb29nLmFycmF5LnJlbW92ZSh0aGlzLmtleXNfLCBrZXkpCiAgICB9CiAgfQogIHJldHVybiB0aGlzCn07Cmdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlci5wcm90b3R5cGUudW5saXN0ZW5XaXRoV3JhcHBlciA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRFdmVudEhhbmRsZXIkJHVubGlzdGVuV2l0aFdyYXBwZXIkKHNyYywgd3JhcHBlciwgbGlzdGVuZXIsIG9wdF9jYXB0LCBvcHRfaGFuZGxlcikgewogIHdyYXBwZXIudW5saXN0ZW4oc3JjLCBsaXN0ZW5lciwgb3B0X2NhcHQsIG9wdF9oYW5kbGVyIHx8IHRoaXMuaGFuZGxlcl8sIHRoaXMpOwogIHJldHVybiB0aGlzCn07Cmdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlci5wcm90b3R5cGUucmVtb3ZlQWxsID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50SGFuZGxlciQkcmVtb3ZlQWxsJCgpIHsKICBnb29nLmFycmF5LmZvckVhY2godGhpcy5rZXlzXywgZ29vZy5ldmVudHMudW5saXN0ZW5CeUtleSk7CiAgdGhpcy5rZXlzXy5sZW5ndGggPSAwCn07Cmdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50SGFuZGxlciQkZGlzcG9zZUludGVybmFsJCgpIHsKICBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5yZW1vdmVBbGwoKQp9Owpnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50SGFuZGxlciQkaGFuZGxlRXZlbnQkKCkgewogIHRocm93IEVycm9yKCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkIik7Cn07Cmdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50VGFyZ2V0JCgpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKQp9Owpnb29nLmluaGVyaXRzKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LCBnb29nLkRpc3Bvc2FibGUpOwpnb29nLmV2ZW50cy5FdmVudFRhcmdldC5wcm90b3R5cGUuY3VzdG9tRXZlbnRfID0gITA7Cmdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5wYXJlbnRFdmVudFRhcmdldF8gPSBudWxsOwpnb29nLmV2ZW50cy5FdmVudFRhcmdldC5wcm90b3R5cGUuZ2V0UGFyZW50RXZlbnRUYXJnZXQgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkRXZlbnRUYXJnZXQkJGdldFBhcmVudEV2ZW50VGFyZ2V0JCgpIHsKICByZXR1cm4gdGhpcy5wYXJlbnRFdmVudFRhcmdldF8KfTsKZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQucHJvdG90eXBlLnNldFBhcmVudEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50VGFyZ2V0JCRzZXRQYXJlbnRFdmVudFRhcmdldCQocGFyZW50KSB7CiAgdGhpcy5wYXJlbnRFdmVudFRhcmdldF8gPSBwYXJlbnQKfTsKZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkRXZlbnRUYXJnZXQkJGFkZEV2ZW50TGlzdGVuZXIkKHR5cGUsIGhhbmRsZXIsIG9wdF9jYXB0dXJlLCBvcHRfaGFuZGxlclNjb3BlKSB7CiAgZ29vZy5ldmVudHMubGlzdGVuKHRoaXMsIHR5cGUsIGhhbmRsZXIsIG9wdF9jYXB0dXJlLCBvcHRfaGFuZGxlclNjb3BlKQp9Owpnb29nLmV2ZW50cy5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRFdmVudFRhcmdldCQkcmVtb3ZlRXZlbnRMaXN0ZW5lciQodHlwZSwgaGFuZGxlciwgb3B0X2NhcHR1cmUsIG9wdF9oYW5kbGVyU2NvcGUpIHsKICBnb29nLmV2ZW50cy51bmxpc3Rlbih0aGlzLCB0eXBlLCBoYW5kbGVyLCBvcHRfY2FwdHVyZSwgb3B0X2hhbmRsZXJTY29wZSkKfTsKZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQucHJvdG90eXBlLmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkRXZlbnRUYXJnZXQkJGRpc3BhdGNoRXZlbnQkKGUpIHsKICByZXR1cm4gZ29vZy5ldmVudHMuZGlzcGF0Y2hFdmVudCh0aGlzLCBlKQp9Owpnb29nLmV2ZW50cy5FdmVudFRhcmdldC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEV2ZW50VGFyZ2V0JCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpOwogIGdvb2cuZXZlbnRzLnJlbW92ZUFsbCh0aGlzKTsKICB0aGlzLnBhcmVudEV2ZW50VGFyZ2V0XyA9IG51bGwKfTsKZ29vZy5zdHJ1Y3RzID0ge307Cmdvb2cuc3RydWN0cy5Db2xsZWN0aW9uID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRDb2xsZWN0aW9uJCgpIHsKfTsKZ29vZy5pdGVyID0ge307Cmdvb2cuaXRlci5TdG9wSXRlcmF0aW9uID0gIlN0b3BJdGVyYXRpb24iIGluIGdvb2cuZ2xvYmFsID8gZ29vZy5nbG9iYWwuU3RvcEl0ZXJhdGlvbiA6IEVycm9yKCJTdG9wSXRlcmF0aW9uIik7Cmdvb2cuaXRlci5JdGVyYXRvciA9IGZ1bmN0aW9uICRnb29nJGl0ZXIkSXRlcmF0b3IkKCkgewp9Owpnb29nLml0ZXIuSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAkZ29vZyRpdGVyJEl0ZXJhdG9yJCRuZXh0JCgpIHsKICB0aHJvdyBnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbjsKfTsKZ29vZy5pdGVyLkl0ZXJhdG9yLnByb3RvdHlwZS5fX2l0ZXJhdG9yX18gPSBmdW5jdGlvbiAkZ29vZyRpdGVyJEl0ZXJhdG9yJCRfX2l0ZXJhdG9yX18kKCkgewogIHJldHVybiB0aGlzCn07Cmdvb2cuaXRlci50b0l0ZXJhdG9yID0gZnVuY3Rpb24gJGdvb2ckaXRlciR0b0l0ZXJhdG9yJChpdGVyYWJsZSkgewogIGlmKGl0ZXJhYmxlIGluc3RhbmNlb2YgZ29vZy5pdGVyLkl0ZXJhdG9yKSB7CiAgICByZXR1cm4gaXRlcmFibGUKICB9CiAgaWYoImZ1bmN0aW9uIiA9PSB0eXBlb2YgaXRlcmFibGUuX19pdGVyYXRvcl9fKSB7CiAgICByZXR1cm4gaXRlcmFibGUuX19pdGVyYXRvcl9fKCExKQogIH0KICBpZihnb29nLmlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkgewogICAgdmFyIGkgPSAwLCBuZXdJdGVyID0gbmV3IGdvb2cuaXRlci5JdGVyYXRvcjsKICAgIG5ld0l0ZXIubmV4dCA9IGZ1bmN0aW9uICRuZXdJdGVyJG5leHQkKCkgewogICAgICBmb3IoOzspIHsKICAgICAgICBpZihpID49IGl0ZXJhYmxlLmxlbmd0aCkgewogICAgICAgICAgdGhyb3cgZ29vZy5pdGVyLlN0b3BJdGVyYXRpb247CiAgICAgICAgfQogICAgICAgIGlmKGkgaW4gaXRlcmFibGUpIHsKICAgICAgICAgIHJldHVybiBpdGVyYWJsZVtpKytdCiAgICAgICAgfQogICAgICAgIGkrKwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIG5ld0l0ZXIKICB9CiAgdGhyb3cgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpOwp9Owpnb29nLml0ZXIuZm9yRWFjaCA9IGZ1bmN0aW9uICRnb29nJGl0ZXIkZm9yRWFjaCQoaXRlcmFibGUsIGYsIG9wdF9vYmopIHsKICBpZihnb29nLmlzQXJyYXlMaWtlKGl0ZXJhYmxlKSkgewogICAgdHJ5IHsKICAgICAgZ29vZy5hcnJheS5mb3JFYWNoKGl0ZXJhYmxlLCBmLCBvcHRfb2JqKQogICAgfWNhdGNoKGV4KSB7CiAgICAgIGlmKGV4ICE9PSBnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICB9CiAgfWVsc2UgewogICAgaXRlcmFibGUgPSBnb29nLml0ZXIudG9JdGVyYXRvcihpdGVyYWJsZSk7CiAgICB0cnkgewogICAgICBmb3IoOzspIHsKICAgICAgICBmLmNhbGwob3B0X29iaiwgaXRlcmFibGUubmV4dCgpLCB2b2lkIDAsIGl0ZXJhYmxlKQogICAgICB9CiAgICB9Y2F0Y2goZXgkJDApIHsKICAgICAgaWYoZXgkJDAgIT09IGdvb2cuaXRlci5TdG9wSXRlcmF0aW9uKSB7CiAgICAgICAgdGhyb3cgZXgkJDA7CiAgICAgIH0KICAgIH0KICB9Cn07Cmdvb2cuaXRlci5maWx0ZXIgPSBmdW5jdGlvbiAkZ29vZyRpdGVyJGZpbHRlciQoaXRlcmFibGUsIGYsIG9wdF9vYmopIHsKICB2YXIgaXRlcmFibGUgPSBnb29nLml0ZXIudG9JdGVyYXRvcihpdGVyYWJsZSksIG5ld0l0ZXIgPSBuZXcgZ29vZy5pdGVyLkl0ZXJhdG9yOwogIG5ld0l0ZXIubmV4dCA9IGZ1bmN0aW9uICRuZXdJdGVyJG5leHQkKCkgewogICAgZm9yKDs7KSB7CiAgICAgIHZhciB2YWwgPSBpdGVyYWJsZS5uZXh0KCk7CiAgICAgIGlmKGYuY2FsbChvcHRfb2JqLCB2YWwsIHZvaWQgMCwgaXRlcmFibGUpKSB7CiAgICAgICAgcmV0dXJuIHZhbAogICAgICB9CiAgICB9CiAgfTsKICByZXR1cm4gbmV3SXRlcgp9Owpnb29nLml0ZXIucmFuZ2UgPSBmdW5jdGlvbiAkZ29vZyRpdGVyJHJhbmdlJChzdGFydE9yU3RvcCwgb3B0X3N0b3AsIG9wdF9zdGVwKSB7CiAgdmFyIHN0YXJ0ID0gMCwgc3RvcCA9IHN0YXJ0T3JTdG9wLCBzdGVwID0gb3B0X3N0ZXAgfHwgMTsKICAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiAoc3RhcnQgPSBzdGFydE9yU3RvcCwgc3RvcCA9IG9wdF9zdG9wKTsKICBpZigwID09IHN0ZXApIHsKICAgIHRocm93IEVycm9yKCJSYW5nZSBzdGVwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHplcm8iKTsKICB9CiAgdmFyIG5ld0l0ZXIgPSBuZXcgZ29vZy5pdGVyLkl0ZXJhdG9yOwogIG5ld0l0ZXIubmV4dCA9IGZ1bmN0aW9uICRuZXdJdGVyJG5leHQkKCkgewogICAgaWYoMCA8IHN0ZXAgJiYgc3RhcnQgPj0gc3RvcCB8fCAwID4gc3RlcCAmJiBzdGFydCA8PSBzdG9wKSB7CiAgICAgIHRocm93IGdvb2cuaXRlci5TdG9wSXRlcmF0aW9uOwogICAgfQogICAgdmFyIHJ2ID0gc3RhcnQ7CiAgICBzdGFydCArPSBzdGVwOwogICAgcmV0dXJuIHJ2CiAgfTsKICByZXR1cm4gbmV3SXRlcgp9Owpnb29nLml0ZXIuam9pbiA9IGZ1bmN0aW9uICRnb29nJGl0ZXIkam9pbiQoaXRlcmFibGUsIGRlbGltaW5hdG9yKSB7CiAgcmV0dXJuIGdvb2cuaXRlci50b0FycmF5KGl0ZXJhYmxlKS5qb2luKGRlbGltaW5hdG9yKQp9Owpnb29nLml0ZXIubWFwID0gZnVuY3Rpb24gJGdvb2ckaXRlciRtYXAkKGl0ZXJhYmxlLCBmLCBvcHRfb2JqKSB7CiAgdmFyIGl0ZXJhYmxlID0gZ29vZy5pdGVyLnRvSXRlcmF0b3IoaXRlcmFibGUpLCBuZXdJdGVyID0gbmV3IGdvb2cuaXRlci5JdGVyYXRvcjsKICBuZXdJdGVyLm5leHQgPSBmdW5jdGlvbiAkbmV3SXRlciRuZXh0JCgpIHsKICAgIGZvcig7OykgewogICAgICB2YXIgdmFsID0gaXRlcmFibGUubmV4dCgpOwogICAgICByZXR1cm4gZi5jYWxsKG9wdF9vYmosIHZhbCwgdm9pZCAwLCBpdGVyYWJsZSkKICAgIH0KICB9OwogIHJldHVybiBuZXdJdGVyCn07Cmdvb2cuaXRlci5yZWR1Y2UgPSBmdW5jdGlvbiAkZ29vZyRpdGVyJHJlZHVjZSQoaXRlcmFibGUsIGYsIHZhbCQkMCwgb3B0X29iaikgewogIHZhciBydmFsID0gdmFsJCQwOwogIGdvb2cuaXRlci5mb3JFYWNoKGl0ZXJhYmxlLCBmdW5jdGlvbih2YWwpIHsKICAgIHJ2YWwgPSBmLmNhbGwob3B0X29iaiwgcnZhbCwgdmFsKQogIH0pOwogIHJldHVybiBydmFsCn07Cmdvb2cuaXRlci5zb21lID0gZnVuY3Rpb24gJGdvb2ckaXRlciRzb21lJChpdGVyYWJsZSwgZiwgb3B0X29iaikgewogIGl0ZXJhYmxlID0gZ29vZy5pdGVyLnRvSXRlcmF0b3IoaXRlcmFibGUpOwogIHRyeSB7CiAgICBmb3IoOzspIHsKICAgICAgaWYoZi5jYWxsKG9wdF9vYmosIGl0ZXJhYmxlLm5leHQoKSwgdm9pZCAwLCBpdGVyYWJsZSkpIHsKICAgICAgICByZXR1cm4hMAogICAgICB9CiAgICB9CiAgfWNhdGNoKGV4KSB7CiAgICBpZihleCAhPT0gZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24pIHsKICAgICAgdGhyb3cgZXg7CiAgICB9CiAgfQogIHJldHVybiExCn07Cmdvb2cuaXRlci5ldmVyeSA9IGZ1bmN0aW9uICRnb29nJGl0ZXIkZXZlcnkkKGl0ZXJhYmxlLCBmLCBvcHRfb2JqKSB7CiAgaXRlcmFibGUgPSBnb29nLml0ZXIudG9JdGVyYXRvcihpdGVyYWJsZSk7CiAgdHJ5IHsKICAgIGZvcig7OykgewogICAgICBpZighZi5jYWxsKG9wdF9vYmosIGl0ZXJhYmxlLm5leHQoKSwgdm9pZCAwLCBpdGVyYWJsZSkpIHsKICAgICAgICByZXR1cm4hMQogICAgICB9CiAgICB9CiAgfWNhdGNoKGV4KSB7CiAgICBpZihleCAhPT0gZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24pIHsKICAgICAgdGhyb3cgZXg7CiAgICB9CiAgfQogIHJldHVybiEwCn07Cmdvb2cuaXRlci5jaGFpbiA9IGZ1bmN0aW9uICRnb29nJGl0ZXIkY2hhaW4kKHZhcl9hcmdzKSB7CiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsIGxlbmd0aCA9IGFyZ3MubGVuZ3RoLCBpID0gMCwgbmV3SXRlciA9IG5ldyBnb29nLml0ZXIuSXRlcmF0b3I7CiAgbmV3SXRlci5uZXh0ID0gZnVuY3Rpb24gJG5ld0l0ZXIkbmV4dCQoKSB7CiAgICB0cnkgewogICAgICBpZihpID49IGxlbmd0aCkgewogICAgICAgIHRocm93IGdvb2cuaXRlci5TdG9wSXRlcmF0aW9uOwogICAgICB9CiAgICAgIHZhciBjdXJyZW50ID0gZ29vZy5pdGVyLnRvSXRlcmF0b3IoYXJnc1tpXSk7CiAgICAgIHJldHVybiBjdXJyZW50Lm5leHQoKQogICAgfWNhdGNoKGV4KSB7CiAgICAgIGlmKGV4ICE9PSBnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiB8fCBpID49IGxlbmd0aCkgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGkrKzsKICAgICAgcmV0dXJuIHRoaXMubmV4dCgpCiAgICB9CiAgfTsKICByZXR1cm4gbmV3SXRlcgp9Owpnb29nLml0ZXIuZHJvcFdoaWxlID0gZnVuY3Rpb24gJGdvb2ckaXRlciRkcm9wV2hpbGUkKGl0ZXJhYmxlLCBmLCBvcHRfb2JqKSB7CiAgdmFyIGl0ZXJhYmxlID0gZ29vZy5pdGVyLnRvSXRlcmF0b3IoaXRlcmFibGUpLCBuZXdJdGVyID0gbmV3IGdvb2cuaXRlci5JdGVyYXRvciwgZHJvcHBpbmcgPSAhMDsKICBuZXdJdGVyLm5leHQgPSBmdW5jdGlvbiAkbmV3SXRlciRuZXh0JCgpIHsKICAgIGZvcig7OykgewogICAgICB2YXIgdmFsID0gaXRlcmFibGUubmV4dCgpOwogICAgICBpZighZHJvcHBpbmcgfHwgIWYuY2FsbChvcHRfb2JqLCB2YWwsIHZvaWQgMCwgaXRlcmFibGUpKSB7CiAgICAgICAgcmV0dXJuIGRyb3BwaW5nID0gITEsIHZhbAogICAgICB9CiAgICB9CiAgfTsKICByZXR1cm4gbmV3SXRlcgp9Owpnb29nLml0ZXIudGFrZVdoaWxlID0gZnVuY3Rpb24gJGdvb2ckaXRlciR0YWtlV2hpbGUkKGl0ZXJhYmxlLCBmLCBvcHRfb2JqKSB7CiAgdmFyIGl0ZXJhYmxlID0gZ29vZy5pdGVyLnRvSXRlcmF0b3IoaXRlcmFibGUpLCBuZXdJdGVyID0gbmV3IGdvb2cuaXRlci5JdGVyYXRvciwgdGFraW5nID0gITA7CiAgbmV3SXRlci5uZXh0ID0gZnVuY3Rpb24gJG5ld0l0ZXIkbmV4dCQoKSB7CiAgICBmb3IoOzspIHsKICAgICAgaWYodGFraW5nKSB7CiAgICAgICAgdmFyIHZhbCA9IGl0ZXJhYmxlLm5leHQoKTsKICAgICAgICBpZihmLmNhbGwob3B0X29iaiwgdmFsLCB2b2lkIDAsIGl0ZXJhYmxlKSkgewogICAgICAgICAgcmV0dXJuIHZhbAogICAgICAgIH0KICAgICAgICB0YWtpbmcgPSAhMQogICAgICB9ZWxzZSB7CiAgICAgICAgdGhyb3cgZ29vZy5pdGVyLlN0b3BJdGVyYXRpb247CiAgICAgIH0KICAgIH0KICB9OwogIHJldHVybiBuZXdJdGVyCn07Cmdvb2cuaXRlci50b0FycmF5ID0gZnVuY3Rpb24gJGdvb2ckaXRlciR0b0FycmF5JChpdGVyYWJsZSkgewogIGlmKGdvb2cuaXNBcnJheUxpa2UoaXRlcmFibGUpKSB7CiAgICByZXR1cm4gZ29vZy5hcnJheS50b0FycmF5KGl0ZXJhYmxlKQogIH0KICB2YXIgaXRlcmFibGUgPSBnb29nLml0ZXIudG9JdGVyYXRvcihpdGVyYWJsZSksIGFycmF5ID0gW107CiAgZ29vZy5pdGVyLmZvckVhY2goaXRlcmFibGUsIGZ1bmN0aW9uKHZhbCkgewogICAgYXJyYXkucHVzaCh2YWwpCiAgfSk7CiAgcmV0dXJuIGFycmF5Cn07Cmdvb2cuaXRlci5lcXVhbHMgPSBmdW5jdGlvbiAkZ29vZyRpdGVyJGVxdWFscyQoaXRlcmFibGUxLCBpdGVyYWJsZTIpIHsKICB2YXIgaXRlcmFibGUxID0gZ29vZy5pdGVyLnRvSXRlcmF0b3IoaXRlcmFibGUxKSwgaXRlcmFibGUyID0gZ29vZy5pdGVyLnRvSXRlcmF0b3IoaXRlcmFibGUyKSwgYjEsIGIyOwogIHRyeSB7CiAgICBmb3IoOzspIHsKICAgICAgYjEgPSBiMiA9ICExOwogICAgICB2YXIgdmFsMSA9IGl0ZXJhYmxlMS5uZXh0KCk7CiAgICAgIGIxID0gITA7CiAgICAgIHZhciB2YWwyID0gaXRlcmFibGUyLm5leHQoKTsKICAgICAgYjIgPSAhMDsKICAgICAgaWYodmFsMSAhPSB2YWwyKSB7CiAgICAgICAgYnJlYWsKICAgICAgfQogICAgfQogIH1jYXRjaChleCkgewogICAgaWYoZXggIT09IGdvb2cuaXRlci5TdG9wSXRlcmF0aW9uKSB7CiAgICAgIHRocm93IGV4OwogICAgfQogICAgaWYoYjEgJiYgIWIyKSB7CiAgICAgIHJldHVybiExCiAgICB9CiAgICBpZighYjIpIHsKICAgICAgdHJ5IHsKICAgICAgICBpdGVyYWJsZTIubmV4dCgpCiAgICAgIH1jYXRjaChleDEpIHsKICAgICAgICBpZihleDEgIT09IGdvb2cuaXRlci5TdG9wSXRlcmF0aW9uKSB7CiAgICAgICAgICB0aHJvdyBleDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiEwCiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuITEKfTsKZ29vZy5pdGVyLm5leHRPclZhbHVlID0gZnVuY3Rpb24gJGdvb2ckaXRlciRuZXh0T3JWYWx1ZSQoaXRlcmFibGUsIGRlZmF1bHRWYWx1ZSkgewogIHRyeSB7CiAgICByZXR1cm4gZ29vZy5pdGVyLnRvSXRlcmF0b3IoaXRlcmFibGUpLm5leHQoKQogIH1jYXRjaChlKSB7CiAgICBpZihlICE9IGdvb2cuaXRlci5TdG9wSXRlcmF0aW9uKSB7CiAgICAgIHRocm93IGU7CiAgICB9CiAgICByZXR1cm4gZGVmYXVsdFZhbHVlCiAgfQp9Owpnb29nLml0ZXIucHJvZHVjdCA9IGZ1bmN0aW9uICRnb29nJGl0ZXIkcHJvZHVjdCQodmFyX2FyZ3MpIHsKICB2YXIgc29tZUFycmF5RW1wdHkgPSBnb29nLmFycmF5LnNvbWUoYXJndW1lbnRzLCBmdW5jdGlvbihhcnIpIHsKICAgIHJldHVybiFhcnIubGVuZ3RoCiAgfSk7CiAgaWYoc29tZUFycmF5RW1wdHkgfHwgIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgIHJldHVybiBuZXcgZ29vZy5pdGVyLkl0ZXJhdG9yCiAgfQogIHZhciBpdGVyID0gbmV3IGdvb2cuaXRlci5JdGVyYXRvciwgYXJyYXlzID0gYXJndW1lbnRzLCBpbmRpY2llcyA9IGdvb2cuYXJyYXkucmVwZWF0KDAsIGFycmF5cy5sZW5ndGgpOwogIGl0ZXIubmV4dCA9IGZ1bmN0aW9uICRpdGVyJG5leHQkKCkgewogICAgaWYoaW5kaWNpZXMpIHsKICAgICAgZm9yKHZhciByZXRWYWwgPSBnb29nLmFycmF5Lm1hcChpbmRpY2llcywgZnVuY3Rpb24odmFsdWVJbmRleCwgYXJyYXlJbmRleCkgewogICAgICAgIHJldHVybiBhcnJheXNbYXJyYXlJbmRleF1bdmFsdWVJbmRleF0KICAgICAgfSksIGkgPSBpbmRpY2llcy5sZW5ndGggLSAxOzAgPD0gaTtpLS0pIHsKICAgICAgICBnb29nLmFzc2VydHMuYXNzZXJ0KGluZGljaWVzKTsKICAgICAgICBpZihpbmRpY2llc1tpXSA8IGFycmF5c1tpXS5sZW5ndGggLSAxKSB7CiAgICAgICAgICBpbmRpY2llc1tpXSsrOwogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgICAgaWYoMCA9PSBpKSB7CiAgICAgICAgICBpbmRpY2llcyA9IG51bGw7CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICBpbmRpY2llc1tpXSA9IDAKICAgICAgfQogICAgICByZXR1cm4gcmV0VmFsCiAgICB9CiAgICB0aHJvdyBnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbjsKICB9OwogIHJldHVybiBpdGVyCn07Cmdvb2cuaXRlci5jeWNsZSA9IGZ1bmN0aW9uICRnb29nJGl0ZXIkY3ljbGUkKGl0ZXJhYmxlKSB7CiAgdmFyIGJhc2VJdGVyYXRvciA9IGdvb2cuaXRlci50b0l0ZXJhdG9yKGl0ZXJhYmxlKSwgY2FjaGUgPSBbXSwgY2FjaGVJbmRleCA9IDAsIGl0ZXIgPSBuZXcgZ29vZy5pdGVyLkl0ZXJhdG9yLCB1c2VDYWNoZSA9ICExOwogIGl0ZXIubmV4dCA9IGZ1bmN0aW9uICRpdGVyJG5leHQkKCkgewogICAgdmFyIHJldHVybkVsZW1lbnQgPSBudWxsOwogICAgaWYoIXVzZUNhY2hlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIHJldHVybkVsZW1lbnQgPSBiYXNlSXRlcmF0b3IubmV4dCgpLCBjYWNoZS5wdXNoKHJldHVybkVsZW1lbnQpLCByZXR1cm5FbGVtZW50CiAgICAgIH1jYXRjaChlKSB7CiAgICAgICAgaWYoZSAhPSBnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiB8fCBnb29nLmFycmF5LmlzRW1wdHkoY2FjaGUpKSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgICB1c2VDYWNoZSA9ICEwCiAgICAgIH0KICAgIH0KICAgIHJldHVybkVsZW1lbnQgPSBjYWNoZVtjYWNoZUluZGV4XTsKICAgIGNhY2hlSW5kZXggPSAoY2FjaGVJbmRleCArIDEpICUgY2FjaGUubGVuZ3RoOwogICAgcmV0dXJuIHJldHVybkVsZW1lbnQKICB9OwogIHJldHVybiBpdGVyCn07Cmdvb2cuc3RydWN0cy5nZXRDb3VudCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkZ2V0Q291bnQkKGNvbCkgewogIHJldHVybiJmdW5jdGlvbiIgPT0gdHlwZW9mIGNvbC5nZXRDb3VudCA/IGNvbC5nZXRDb3VudCgpIDogZ29vZy5pc0FycmF5TGlrZShjb2wpIHx8IGdvb2cuaXNTdHJpbmcoY29sKSA/IGNvbC5sZW5ndGggOiBnb29nLm9iamVjdC5nZXRDb3VudChjb2wpCn07Cmdvb2cuc3RydWN0cy5nZXRWYWx1ZXMgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJGdldFZhbHVlcyQoY29sKSB7CiAgaWYoImZ1bmN0aW9uIiA9PSB0eXBlb2YgY29sLmdldFZhbHVlcykgewogICAgcmV0dXJuIGNvbC5nZXRWYWx1ZXMoKQogIH0KICBpZihnb29nLmlzU3RyaW5nKGNvbCkpIHsKICAgIHJldHVybiBjb2wuc3BsaXQoIiIpCiAgfQogIGlmKGdvb2cuaXNBcnJheUxpa2UoY29sKSkgewogICAgZm9yKHZhciBydiA9IFtdLCBsID0gY29sLmxlbmd0aCwgaSA9IDA7aSA8IGw7aSsrKSB7CiAgICAgIHJ2LnB1c2goY29sW2ldKQogICAgfQogICAgcmV0dXJuIHJ2CiAgfQogIHJldHVybiBnb29nLm9iamVjdC5nZXRWYWx1ZXMoY29sKQp9Owpnb29nLnN0cnVjdHMuZ2V0S2V5cyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkZ2V0S2V5cyQoY29sKSB7CiAgaWYoImZ1bmN0aW9uIiA9PSB0eXBlb2YgY29sLmdldEtleXMpIHsKICAgIHJldHVybiBjb2wuZ2V0S2V5cygpCiAgfQogIGlmKCJmdW5jdGlvbiIgIT0gdHlwZW9mIGNvbC5nZXRWYWx1ZXMpIHsKICAgIGlmKGdvb2cuaXNBcnJheUxpa2UoY29sKSB8fCBnb29nLmlzU3RyaW5nKGNvbCkpIHsKICAgICAgZm9yKHZhciBydiA9IFtdLCBsID0gY29sLmxlbmd0aCwgaSA9IDA7aSA8IGw7aSsrKSB7CiAgICAgICAgcnYucHVzaChpKQogICAgICB9CiAgICAgIHJldHVybiBydgogICAgfQogICAgcmV0dXJuIGdvb2cub2JqZWN0LmdldEtleXMoY29sKQogIH0KfTsKZ29vZy5zdHJ1Y3RzLmNvbnRhaW5zID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRjb250YWlucyQoY29sLCB2YWwpIHsKICByZXR1cm4iZnVuY3Rpb24iID09IHR5cGVvZiBjb2wuY29udGFpbnMgPyBjb2wuY29udGFpbnModmFsKSA6ICJmdW5jdGlvbiIgPT0gdHlwZW9mIGNvbC5jb250YWluc1ZhbHVlID8gY29sLmNvbnRhaW5zVmFsdWUodmFsKSA6IGdvb2cuaXNBcnJheUxpa2UoY29sKSB8fCBnb29nLmlzU3RyaW5nKGNvbCkgPyBnb29nLmFycmF5LmNvbnRhaW5zKGNvbCwgdmFsKSA6IGdvb2cub2JqZWN0LmNvbnRhaW5zVmFsdWUoY29sLCB2YWwpCn07Cmdvb2cuc3RydWN0cy5pc0VtcHR5ID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRpc0VtcHR5JChjb2wpIHsKICByZXR1cm4iZnVuY3Rpb24iID09IHR5cGVvZiBjb2wuaXNFbXB0eSA/IGNvbC5pc0VtcHR5KCkgOiBnb29nLmlzQXJyYXlMaWtlKGNvbCkgfHwgZ29vZy5pc1N0cmluZyhjb2wpID8gZ29vZy5hcnJheS5pc0VtcHR5KGNvbCkgOiBnb29nLm9iamVjdC5pc0VtcHR5KGNvbCkKfTsKZ29vZy5zdHJ1Y3RzLmNsZWFyID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRjbGVhciQoY29sKSB7CiAgImZ1bmN0aW9uIiA9PSB0eXBlb2YgY29sLmNsZWFyID8gY29sLmNsZWFyKCkgOiBnb29nLmlzQXJyYXlMaWtlKGNvbCkgPyBnb29nLmFycmF5LmNsZWFyKGNvbCkgOiBnb29nLm9iamVjdC5jbGVhcihjb2wpCn07Cmdvb2cuc3RydWN0cy5mb3JFYWNoID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRmb3JFYWNoJChjb2wsIGYsIG9wdF9vYmopIHsKICBpZigiZnVuY3Rpb24iID09IHR5cGVvZiBjb2wuZm9yRWFjaCkgewogICAgY29sLmZvckVhY2goZiwgb3B0X29iaikKICB9ZWxzZSB7CiAgICBpZihnb29nLmlzQXJyYXlMaWtlKGNvbCkgfHwgZ29vZy5pc1N0cmluZyhjb2wpKSB7CiAgICAgIGdvb2cuYXJyYXkuZm9yRWFjaChjb2wsIGYsIG9wdF9vYmopCiAgICB9ZWxzZSB7CiAgICAgIGZvcih2YXIga2V5cyA9IGdvb2cuc3RydWN0cy5nZXRLZXlzKGNvbCksIHZhbHVlcyA9IGdvb2cuc3RydWN0cy5nZXRWYWx1ZXMoY29sKSwgbCA9IHZhbHVlcy5sZW5ndGgsIGkgPSAwO2kgPCBsO2krKykgewogICAgICAgIGYuY2FsbChvcHRfb2JqLCB2YWx1ZXNbaV0sIGtleXMgJiYga2V5c1tpXSwgY29sKQogICAgICB9CiAgICB9CiAgfQp9Owpnb29nLnN0cnVjdHMuZmlsdGVyID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRmaWx0ZXIkKGNvbCwgZiwgb3B0X29iaikgewogIGlmKCJmdW5jdGlvbiIgPT0gdHlwZW9mIGNvbC5maWx0ZXIpIHsKICAgIHJldHVybiBjb2wuZmlsdGVyKGYsIG9wdF9vYmopCiAgfQogIGlmKGdvb2cuaXNBcnJheUxpa2UoY29sKSB8fCBnb29nLmlzU3RyaW5nKGNvbCkpIHsKICAgIHJldHVybiBnb29nLmFycmF5LmZpbHRlcihjb2wsIGYsIG9wdF9vYmopCiAgfQogIHZhciBydiwga2V5cyA9IGdvb2cuc3RydWN0cy5nZXRLZXlzKGNvbCksIHZhbHVlcyA9IGdvb2cuc3RydWN0cy5nZXRWYWx1ZXMoY29sKSwgbCA9IHZhbHVlcy5sZW5ndGg7CiAgaWYoa2V5cykgewogICAgcnYgPSB7fTsKICAgIGZvcih2YXIgaSA9IDA7aSA8IGw7aSsrKSB7CiAgICAgIGYuY2FsbChvcHRfb2JqLCB2YWx1ZXNbaV0sIGtleXNbaV0sIGNvbCkgJiYgKHJ2W2tleXNbaV1dID0gdmFsdWVzW2ldKQogICAgfQogIH1lbHNlIHsKICAgIHJ2ID0gW107CiAgICBmb3IoaSA9IDA7aSA8IGw7aSsrKSB7CiAgICAgIGYuY2FsbChvcHRfb2JqLCB2YWx1ZXNbaV0sIHZvaWQgMCwgY29sKSAmJiBydi5wdXNoKHZhbHVlc1tpXSkKICAgIH0KICB9CiAgcmV0dXJuIHJ2Cn07Cmdvb2cuc3RydWN0cy5tYXAgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJG1hcCQoY29sLCBmLCBvcHRfb2JqKSB7CiAgaWYoImZ1bmN0aW9uIiA9PSB0eXBlb2YgY29sLm1hcCkgewogICAgcmV0dXJuIGNvbC5tYXAoZiwgb3B0X29iaikKICB9CiAgaWYoZ29vZy5pc0FycmF5TGlrZShjb2wpIHx8IGdvb2cuaXNTdHJpbmcoY29sKSkgewogICAgcmV0dXJuIGdvb2cuYXJyYXkubWFwKGNvbCwgZiwgb3B0X29iaikKICB9CiAgdmFyIHJ2LCBrZXlzID0gZ29vZy5zdHJ1Y3RzLmdldEtleXMoY29sKSwgdmFsdWVzID0gZ29vZy5zdHJ1Y3RzLmdldFZhbHVlcyhjb2wpLCBsID0gdmFsdWVzLmxlbmd0aDsKICBpZihrZXlzKSB7CiAgICBydiA9IHt9OwogICAgZm9yKHZhciBpID0gMDtpIDwgbDtpKyspIHsKICAgICAgcnZba2V5c1tpXV0gPSBmLmNhbGwob3B0X29iaiwgdmFsdWVzW2ldLCBrZXlzW2ldLCBjb2wpCiAgICB9CiAgfWVsc2UgewogICAgcnYgPSBbXTsKICAgIGZvcihpID0gMDtpIDwgbDtpKyspIHsKICAgICAgcnZbaV0gPSBmLmNhbGwob3B0X29iaiwgdmFsdWVzW2ldLCB2b2lkIDAsIGNvbCkKICAgIH0KICB9CiAgcmV0dXJuIHJ2Cn07Cmdvb2cuc3RydWN0cy5zb21lID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRzb21lJChjb2wsIGYsIG9wdF9vYmopIHsKICBpZigiZnVuY3Rpb24iID09IHR5cGVvZiBjb2wuc29tZSkgewogICAgcmV0dXJuIGNvbC5zb21lKGYsIG9wdF9vYmopCiAgfQogIGlmKGdvb2cuaXNBcnJheUxpa2UoY29sKSB8fCBnb29nLmlzU3RyaW5nKGNvbCkpIHsKICAgIHJldHVybiBnb29nLmFycmF5LnNvbWUoY29sLCBmLCBvcHRfb2JqKQogIH0KICBmb3IodmFyIGtleXMgPSBnb29nLnN0cnVjdHMuZ2V0S2V5cyhjb2wpLCB2YWx1ZXMgPSBnb29nLnN0cnVjdHMuZ2V0VmFsdWVzKGNvbCksIGwgPSB2YWx1ZXMubGVuZ3RoLCBpID0gMDtpIDwgbDtpKyspIHsKICAgIGlmKGYuY2FsbChvcHRfb2JqLCB2YWx1ZXNbaV0sIGtleXMgJiYga2V5c1tpXSwgY29sKSkgewogICAgICByZXR1cm4hMAogICAgfQogIH0KICByZXR1cm4hMQp9Owpnb29nLnN0cnVjdHMuZXZlcnkgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJGV2ZXJ5JChjb2wsIGYsIG9wdF9vYmopIHsKICBpZigiZnVuY3Rpb24iID09IHR5cGVvZiBjb2wuZXZlcnkpIHsKICAgIHJldHVybiBjb2wuZXZlcnkoZiwgb3B0X29iaikKICB9CiAgaWYoZ29vZy5pc0FycmF5TGlrZShjb2wpIHx8IGdvb2cuaXNTdHJpbmcoY29sKSkgewogICAgcmV0dXJuIGdvb2cuYXJyYXkuZXZlcnkoY29sLCBmLCBvcHRfb2JqKQogIH0KICBmb3IodmFyIGtleXMgPSBnb29nLnN0cnVjdHMuZ2V0S2V5cyhjb2wpLCB2YWx1ZXMgPSBnb29nLnN0cnVjdHMuZ2V0VmFsdWVzKGNvbCksIGwgPSB2YWx1ZXMubGVuZ3RoLCBpID0gMDtpIDwgbDtpKyspIHsKICAgIGlmKCFmLmNhbGwob3B0X29iaiwgdmFsdWVzW2ldLCBrZXlzICYmIGtleXNbaV0sIGNvbCkpIHsKICAgICAgcmV0dXJuITEKICAgIH0KICB9CiAgcmV0dXJuITAKfTsKZ29vZy5zdHJ1Y3RzLk1hcCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTWFwJChvcHRfbWFwLCB2YXJfYXJncykgewogIHRoaXMubWFwXyA9IHt9OwogIHRoaXMua2V5c18gPSBbXTsKICB2YXIgYXJnTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICBpZigxIDwgYXJnTGVuZ3RoKSB7CiAgICBpZihhcmdMZW5ndGggJSAyKSB7CiAgICAgIHRocm93IEVycm9yKCJVbmV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cyIpOwogICAgfQogICAgZm9yKHZhciBpID0gMDtpIDwgYXJnTGVuZ3RoO2kgKz0gMikgewogICAgICB0aGlzLnNldChhcmd1bWVudHNbaV0sIGFyZ3VtZW50c1tpICsgMV0pCiAgICB9CiAgfWVsc2UgewogICAgb3B0X21hcCAmJiB0aGlzLmFkZEFsbChvcHRfbWFwKQogIH0KfTsKZ29vZy5zdHJ1Y3RzLk1hcC5wcm90b3R5cGUuY291bnRfID0gMDsKZ29vZy5zdHJ1Y3RzLk1hcC5wcm90b3R5cGUudmVyc2lvbl8gPSAwOwpnb29nLnN0cnVjdHMuTWFwLnByb3RvdHlwZS5nZXRDb3VudCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTWFwJCRnZXRDb3VudCQoKSB7CiAgcmV0dXJuIHRoaXMuY291bnRfCn07Cmdvb2cuc3RydWN0cy5NYXAucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTWFwJCRnZXRWYWx1ZXMkKCkgewogIHRoaXMuY2xlYW51cEtleXNBcnJheV8oKTsKICBmb3IodmFyIHJ2ID0gW10sIGkgPSAwO2kgPCB0aGlzLmtleXNfLmxlbmd0aDtpKyspIHsKICAgIHZhciBrZXkgPSB0aGlzLmtleXNfW2ldOwogICAgcnYucHVzaCh0aGlzLm1hcF9ba2V5XSkKICB9CiAgcmV0dXJuIHJ2Cn07Cmdvb2cuc3RydWN0cy5NYXAucHJvdG90eXBlLmdldEtleXMgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJE1hcCQkZ2V0S2V5cyQoKSB7CiAgdGhpcy5jbGVhbnVwS2V5c0FycmF5XygpOwogIHJldHVybiB0aGlzLmtleXNfLmNvbmNhdCgpCn07Cmdvb2cuc3RydWN0cy5NYXAucHJvdG90eXBlLmNvbnRhaW5zS2V5ID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRNYXAkJGNvbnRhaW5zS2V5JChrZXkpIHsKICByZXR1cm4gZ29vZy5zdHJ1Y3RzLk1hcC5oYXNLZXlfKHRoaXMubWFwXywga2V5KQp9Owpnb29nLnN0cnVjdHMuTWFwLnByb3RvdHlwZS5jb250YWluc1ZhbHVlID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRNYXAkJGNvbnRhaW5zVmFsdWUkKHZhbCkgewogIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMua2V5c18ubGVuZ3RoO2krKykgewogICAgdmFyIGtleSA9IHRoaXMua2V5c19baV07CiAgICBpZihnb29nLnN0cnVjdHMuTWFwLmhhc0tleV8odGhpcy5tYXBfLCBrZXkpICYmIHRoaXMubWFwX1trZXldID09IHZhbCkgewogICAgICByZXR1cm4hMAogICAgfQogIH0KICByZXR1cm4hMQp9Owpnb29nLnN0cnVjdHMuTWFwLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJE1hcCQkZXF1YWxzJChvdGhlck1hcCwgb3B0X2VxdWFsaXR5Rm4pIHsKICBpZih0aGlzID09PSBvdGhlck1hcCkgewogICAgcmV0dXJuITAKICB9CiAgaWYodGhpcy5jb3VudF8gIT0gb3RoZXJNYXAuZ2V0Q291bnQoKSkgewogICAgcmV0dXJuITEKICB9CiAgdmFyIGVxdWFsaXR5Rm4gPSBvcHRfZXF1YWxpdHlGbiB8fCBnb29nLnN0cnVjdHMuTWFwLmRlZmF1bHRFcXVhbHM7CiAgdGhpcy5jbGVhbnVwS2V5c0FycmF5XygpOwogIGZvcih2YXIga2V5LCBpID0gMDtrZXkgPSB0aGlzLmtleXNfW2ldO2krKykgewogICAgaWYoIWVxdWFsaXR5Rm4odGhpcy5nZXQoa2V5KSwgb3RoZXJNYXAuZ2V0KGtleSkpKSB7CiAgICAgIHJldHVybiExCiAgICB9CiAgfQogIHJldHVybiEwCn07Cmdvb2cuc3RydWN0cy5NYXAuZGVmYXVsdEVxdWFscyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTWFwJGRlZmF1bHRFcXVhbHMkKGEsIGIpIHsKICByZXR1cm4gYSA9PT0gYgp9Owpnb29nLnN0cnVjdHMuTWFwLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRNYXAkJGlzRW1wdHkkKCkgewogIHJldHVybiAwID09IHRoaXMuY291bnRfCn07Cmdvb2cuc3RydWN0cy5NYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRNYXAkJGNsZWFyJCgpIHsKICB0aGlzLm1hcF8gPSB7fTsKICB0aGlzLnZlcnNpb25fID0gdGhpcy5jb3VudF8gPSB0aGlzLmtleXNfLmxlbmd0aCA9IDAKfTsKZ29vZy5zdHJ1Y3RzLk1hcC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRNYXAkJHJlbW92ZSQoa2V5KSB7CiAgcmV0dXJuIGdvb2cuc3RydWN0cy5NYXAuaGFzS2V5Xyh0aGlzLm1hcF8sIGtleSkgPyAoZGVsZXRlIHRoaXMubWFwX1trZXldLCB0aGlzLmNvdW50Xy0tLCB0aGlzLnZlcnNpb25fKyssIHRoaXMua2V5c18ubGVuZ3RoID4gMiAqIHRoaXMuY291bnRfICYmIHRoaXMuY2xlYW51cEtleXNBcnJheV8oKSwgITApIDogITEKfTsKZ29vZy5zdHJ1Y3RzLk1hcC5wcm90b3R5cGUuY2xlYW51cEtleXNBcnJheV8gPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJE1hcCQkY2xlYW51cEtleXNBcnJheV8kKCkgewogIGlmKHRoaXMuY291bnRfICE9IHRoaXMua2V5c18ubGVuZ3RoKSB7CiAgICBmb3IodmFyIHNyY0luZGV4ID0gMCwgZGVzdEluZGV4ID0gMDtzcmNJbmRleCA8IHRoaXMua2V5c18ubGVuZ3RoOykgewogICAgICB2YXIga2V5ID0gdGhpcy5rZXlzX1tzcmNJbmRleF07CiAgICAgIGdvb2cuc3RydWN0cy5NYXAuaGFzS2V5Xyh0aGlzLm1hcF8sIGtleSkgJiYgKHRoaXMua2V5c19bZGVzdEluZGV4KytdID0ga2V5KTsKICAgICAgc3JjSW5kZXgrKwogICAgfQogICAgdGhpcy5rZXlzXy5sZW5ndGggPSBkZXN0SW5kZXgKICB9CiAgaWYodGhpcy5jb3VudF8gIT0gdGhpcy5rZXlzXy5sZW5ndGgpIHsKICAgIGZvcih2YXIgc2VlbiA9IHt9LCBkZXN0SW5kZXggPSBzcmNJbmRleCA9IDA7c3JjSW5kZXggPCB0aGlzLmtleXNfLmxlbmd0aDspIHsKICAgICAga2V5ID0gdGhpcy5rZXlzX1tzcmNJbmRleF0sIGdvb2cuc3RydWN0cy5NYXAuaGFzS2V5XyhzZWVuLCBrZXkpIHx8ICh0aGlzLmtleXNfW2Rlc3RJbmRleCsrXSA9IGtleSwgc2VlbltrZXldID0gMSksIHNyY0luZGV4KysKICAgIH0KICAgIHRoaXMua2V5c18ubGVuZ3RoID0gZGVzdEluZGV4CiAgfQp9Owpnb29nLnN0cnVjdHMuTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJE1hcCQkZ2V0JChrZXksIG9wdF92YWwpIHsKICByZXR1cm4gZ29vZy5zdHJ1Y3RzLk1hcC5oYXNLZXlfKHRoaXMubWFwXywga2V5KSA/IHRoaXMubWFwX1trZXldIDogb3B0X3ZhbAp9Owpnb29nLnN0cnVjdHMuTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJE1hcCQkc2V0JChrZXksIHZhbHVlKSB7CiAgZ29vZy5zdHJ1Y3RzLk1hcC5oYXNLZXlfKHRoaXMubWFwXywga2V5KSB8fCAodGhpcy5jb3VudF8rKywgdGhpcy5rZXlzXy5wdXNoKGtleSksIHRoaXMudmVyc2lvbl8rKyk7CiAgdGhpcy5tYXBfW2tleV0gPSB2YWx1ZQp9Owpnb29nLnN0cnVjdHMuTWFwLnByb3RvdHlwZS5hZGRBbGwgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJE1hcCQkYWRkQWxsJChtYXApIHsKICB2YXIga2V5cywgdmFsdWVzOwogIG1hcCBpbnN0YW5jZW9mIGdvb2cuc3RydWN0cy5NYXAgPyAoa2V5cyA9IG1hcC5nZXRLZXlzKCksIHZhbHVlcyA9IG1hcC5nZXRWYWx1ZXMoKSkgOiAoa2V5cyA9IGdvb2cub2JqZWN0LmdldEtleXMobWFwKSwgdmFsdWVzID0gZ29vZy5vYmplY3QuZ2V0VmFsdWVzKG1hcCkpOwogIGZvcih2YXIgaSA9IDA7aSA8IGtleXMubGVuZ3RoO2krKykgewogICAgdGhpcy5zZXQoa2V5c1tpXSwgdmFsdWVzW2ldKQogIH0KfTsKZ29vZy5zdHJ1Y3RzLk1hcC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJE1hcCQkY2xvbmUkKCkgewogIHJldHVybiBuZXcgZ29vZy5zdHJ1Y3RzLk1hcCh0aGlzKQp9Owpnb29nLnN0cnVjdHMuTWFwLnByb3RvdHlwZS50cmFuc3Bvc2UgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJE1hcCQkdHJhbnNwb3NlJCgpIHsKICBmb3IodmFyIHRyYW5zcG9zZWQgPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcCwgaSA9IDA7aSA8IHRoaXMua2V5c18ubGVuZ3RoO2krKykgewogICAgdmFyIGtleSA9IHRoaXMua2V5c19baV0sIHZhbHVlID0gdGhpcy5tYXBfW2tleV07CiAgICB0cmFuc3Bvc2VkLnNldCh2YWx1ZSwga2V5KQogIH0KICByZXR1cm4gdHJhbnNwb3NlZAp9Owpnb29nLnN0cnVjdHMuTWFwLnByb3RvdHlwZS5nZXRLZXlJdGVyYXRvciA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTWFwJCRnZXRLZXlJdGVyYXRvciQoKSB7CiAgcmV0dXJuIHRoaXMuX19pdGVyYXRvcl9fKCEwKQp9Owpnb29nLnN0cnVjdHMuTWFwLnByb3RvdHlwZS5fX2l0ZXJhdG9yX18gPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJE1hcCQkX19pdGVyYXRvcl9fJChvcHRfa2V5cykgewogIHRoaXMuY2xlYW51cEtleXNBcnJheV8oKTsKICB2YXIgaSA9IDAsIGtleXMgPSB0aGlzLmtleXNfLCBtYXAgPSB0aGlzLm1hcF8sIHZlcnNpb24gPSB0aGlzLnZlcnNpb25fLCBzZWxmT2JqID0gdGhpcywgbmV3SXRlciA9IG5ldyBnb29nLml0ZXIuSXRlcmF0b3I7CiAgbmV3SXRlci5uZXh0ID0gZnVuY3Rpb24gJG5ld0l0ZXIkbmV4dCQoKSB7CiAgICBmb3IoOzspIHsKICAgICAgaWYodmVyc2lvbiAhPSBzZWxmT2JqLnZlcnNpb25fKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoIlRoZSBtYXAgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGl0ZXJhdG9yIHdhcyBjcmVhdGVkIik7CiAgICAgIH0KICAgICAgaWYoaSA+PSBrZXlzLmxlbmd0aCkgewogICAgICAgIHRocm93IGdvb2cuaXRlci5TdG9wSXRlcmF0aW9uOwogICAgICB9CiAgICAgIHZhciBrZXkgPSBrZXlzW2krK107CiAgICAgIHJldHVybiBvcHRfa2V5cyA/IGtleSA6IG1hcFtrZXldCiAgICB9CiAgfTsKICByZXR1cm4gbmV3SXRlcgp9Owpnb29nLnN0cnVjdHMuTWFwLmhhc0tleV8gPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJE1hcCRoYXNLZXlfJChvYmosIGtleSkgewogIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpCn07Cmdvb2cuc3RydWN0cy5TZXQgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJFNldCQob3B0X3ZhbHVlcykgewogIHRoaXMubWFwXyA9IG5ldyBnb29nLnN0cnVjdHMuTWFwOwogIG9wdF92YWx1ZXMgJiYgdGhpcy5hZGRBbGwob3B0X3ZhbHVlcykKfTsKZ29vZy5zdHJ1Y3RzLlNldC5nZXRLZXlfID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRTZXQkZ2V0S2V5XyQodmFsKSB7CiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsOwogIHJldHVybiJvYmplY3QiID09IHR5cGUgJiYgdmFsIHx8ICJmdW5jdGlvbiIgPT0gdHlwZSA/ICJvIiArIGdvb2cuZ2V0VWlkKHZhbCkgOiB0eXBlLnN1YnN0cigwLCAxKSArIHZhbAp9Owpnb29nLnN0cnVjdHMuU2V0LnByb3RvdHlwZS5nZXRDb3VudCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2V0JCRnZXRDb3VudCQoKSB7CiAgcmV0dXJuIHRoaXMubWFwXy5nZXRDb3VudCgpCn07Cmdvb2cuc3RydWN0cy5TZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2V0JCRhZGQkKGVsZW1lbnQpIHsKICB0aGlzLm1hcF8uc2V0KGdvb2cuc3RydWN0cy5TZXQuZ2V0S2V5XyhlbGVtZW50KSwgZWxlbWVudCkKfTsKZ29vZy5zdHJ1Y3RzLlNldC5wcm90b3R5cGUuYWRkQWxsID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRTZXQkJGFkZEFsbCQoY29sKSB7CiAgZm9yKHZhciB2YWx1ZXMgPSBnb29nLnN0cnVjdHMuZ2V0VmFsdWVzKGNvbCksIGwgPSB2YWx1ZXMubGVuZ3RoLCBpID0gMDtpIDwgbDtpKyspIHsKICAgIHRoaXMuYWRkKHZhbHVlc1tpXSkKICB9Cn07Cmdvb2cuc3RydWN0cy5TZXQucHJvdG90eXBlLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2V0JCRyZW1vdmVBbGwkKGNvbCkgewogIGZvcih2YXIgdmFsdWVzID0gZ29vZy5zdHJ1Y3RzLmdldFZhbHVlcyhjb2wpLCBsID0gdmFsdWVzLmxlbmd0aCwgaSA9IDA7aSA8IGw7aSsrKSB7CiAgICB0aGlzLnJlbW92ZSh2YWx1ZXNbaV0pCiAgfQp9Owpnb29nLnN0cnVjdHMuU2V0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJFNldCQkcmVtb3ZlJChlbGVtZW50KSB7CiAgcmV0dXJuIHRoaXMubWFwXy5yZW1vdmUoZ29vZy5zdHJ1Y3RzLlNldC5nZXRLZXlfKGVsZW1lbnQpKQp9Owpnb29nLnN0cnVjdHMuU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2V0JCRjbGVhciQoKSB7CiAgdGhpcy5tYXBfLmNsZWFyKCkKfTsKZ29vZy5zdHJ1Y3RzLlNldC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2V0JCRpc0VtcHR5JCgpIHsKICByZXR1cm4gdGhpcy5tYXBfLmlzRW1wdHkoKQp9Owpnb29nLnN0cnVjdHMuU2V0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2V0JCRjb250YWlucyQoZWxlbWVudCkgewogIHJldHVybiB0aGlzLm1hcF8uY29udGFpbnNLZXkoZ29vZy5zdHJ1Y3RzLlNldC5nZXRLZXlfKGVsZW1lbnQpKQp9Owpnb29nLnN0cnVjdHMuU2V0LnByb3RvdHlwZS5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJFNldCQkaW50ZXJzZWN0aW9uJChjb2wpIHsKICBmb3IodmFyIHJlc3VsdCA9IG5ldyBnb29nLnN0cnVjdHMuU2V0LCB2YWx1ZXMgPSBnb29nLnN0cnVjdHMuZ2V0VmFsdWVzKGNvbCksIGkgPSAwO2kgPCB2YWx1ZXMubGVuZ3RoO2krKykgewogICAgdmFyIHZhbHVlID0gdmFsdWVzW2ldOwogICAgdGhpcy5jb250YWlucyh2YWx1ZSkgJiYgcmVzdWx0LmFkZCh2YWx1ZSkKICB9CiAgcmV0dXJuIHJlc3VsdAp9Owpnb29nLnN0cnVjdHMuU2V0LnByb3RvdHlwZS5kaWZmZXJlbmNlID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRTZXQkJGRpZmZlcmVuY2UkKGNvbCkgewogIHZhciByZXN1bHQgPSB0aGlzLmNsb25lKCk7CiAgcmVzdWx0LnJlbW92ZUFsbChjb2wpOwogIHJldHVybiByZXN1bHQKfTsKZ29vZy5zdHJ1Y3RzLlNldC5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRTZXQkJGdldFZhbHVlcyQoKSB7CiAgcmV0dXJuIHRoaXMubWFwXy5nZXRWYWx1ZXMoKQp9Owpnb29nLnN0cnVjdHMuU2V0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2V0JCRjbG9uZSQoKSB7CiAgcmV0dXJuIG5ldyBnb29nLnN0cnVjdHMuU2V0KHRoaXMpCn07Cmdvb2cuc3RydWN0cy5TZXQucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2V0JCRlcXVhbHMkKGNvbCkgewogIHJldHVybiB0aGlzLmdldENvdW50KCkgPT0gZ29vZy5zdHJ1Y3RzLmdldENvdW50KGNvbCkgJiYgdGhpcy5pc1N1YnNldE9mKGNvbCkKfTsKZ29vZy5zdHJ1Y3RzLlNldC5wcm90b3R5cGUuaXNTdWJzZXRPZiA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2V0JCRpc1N1YnNldE9mJChjb2wpIHsKICB2YXIgY29sQ291bnQgPSBnb29nLnN0cnVjdHMuZ2V0Q291bnQoY29sKTsKICBpZih0aGlzLmdldENvdW50KCkgPiBjb2xDb3VudCkgewogICAgcmV0dXJuITEKICB9CiAgIShjb2wgaW5zdGFuY2VvZiBnb29nLnN0cnVjdHMuU2V0KSAmJiA1IDwgY29sQ291bnQgJiYgKGNvbCA9IG5ldyBnb29nLnN0cnVjdHMuU2V0KGNvbCkpOwogIHJldHVybiBnb29nLnN0cnVjdHMuZXZlcnkodGhpcywgZnVuY3Rpb24odmFsdWUpIHsKICAgIHJldHVybiBnb29nLnN0cnVjdHMuY29udGFpbnMoY29sLCB2YWx1ZSkKICB9KQp9Owpnb29nLnN0cnVjdHMuU2V0LnByb3RvdHlwZS5fX2l0ZXJhdG9yX18gPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJFNldCQkX19pdGVyYXRvcl9fJCgpIHsKICByZXR1cm4gdGhpcy5tYXBfLl9faXRlcmF0b3JfXyghMSkKfTsKZ29vZy5kZWJ1Zy5jYXRjaEVycm9ycyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJGNhdGNoRXJyb3JzJChsb2dGdW5jLCBvcHRfY2FuY2VsLCBvcHRfdGFyZ2V0KSB7CiAgdmFyIHRhcmdldCA9IG9wdF90YXJnZXQgfHwgZ29vZy5nbG9iYWwsIG9sZEVycm9ySGFuZGxlciA9IHRhcmdldC5vbmVycm9yLCByZXRWYWwgPSAhIW9wdF9jYW5jZWw7CiAgZ29vZy51c2VyQWdlbnQuV0VCS0lUICYmICFnb29nLnVzZXJBZ2VudC5pc1ZlcnNpb24oIjUzNS4zIikgJiYgKHJldFZhbCA9ICFyZXRWYWwpOwogIHRhcmdldC5vbmVycm9yID0gZnVuY3Rpb24gJHRhcmdldCRvbmVycm9yJChtZXNzYWdlLCB1cmwsIGxpbmUpIHsKICAgIG9sZEVycm9ySGFuZGxlciAmJiBvbGRFcnJvckhhbmRsZXIobWVzc2FnZSwgdXJsLCBsaW5lKTsKICAgIGxvZ0Z1bmMoe21lc3NhZ2U6bWVzc2FnZSwgZmlsZU5hbWU6dXJsLCBsaW5lOmxpbmV9KTsKICAgIHJldHVybiByZXRWYWwKICB9Cn07Cmdvb2cuZGVidWcuZXhwb3NlID0gZnVuY3Rpb24gJGdvb2ckZGVidWckZXhwb3NlJChvYmosIG9wdF9zaG93Rm4pIHsKICBpZigidW5kZWZpbmVkIiA9PSB0eXBlb2Ygb2JqKSB7CiAgICByZXR1cm4idW5kZWZpbmVkIgogIH0KICBpZihudWxsID09IG9iaikgewogICAgcmV0dXJuIk5VTEwiCiAgfQogIHZhciBzdHIgPSBbXSwgeDsKICBmb3IoeCBpbiBvYmopIHsKICAgIGlmKG9wdF9zaG93Rm4gfHwgIWdvb2cuaXNGdW5jdGlvbihvYmpbeF0pKSB7CiAgICAgIHZhciBzID0geCArICIgPSAiOwogICAgICB0cnkgewogICAgICAgIHMgKz0gb2JqW3hdCiAgICAgIH1jYXRjaChlKSB7CiAgICAgICAgcyArPSAiKioqICIgKyBlICsgIiAqKioiCiAgICAgIH0KICAgICAgc3RyLnB1c2gocykKICAgIH0KICB9CiAgcmV0dXJuIHN0ci5qb2luKCJcbiIpCn07Cmdvb2cuZGVidWcuZGVlcEV4cG9zZSA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJGRlZXBFeHBvc2UkKG9iaiQkMCwgb3B0X3Nob3dGbikgewogIHZhciBwcmV2aW91cyA9IG5ldyBnb29nLnN0cnVjdHMuU2V0LCBzdHIgPSBbXSwgaGVscGVyID0gZnVuY3Rpb24gJGhlbHBlciQob2JqLCBzcGFjZSkgewogICAgdmFyIG5lc3RzcGFjZSA9IHNwYWNlICsgIiAgIjsKICAgIHRyeSB7CiAgICAgIGlmKGdvb2cuaXNEZWYob2JqKSkgewogICAgICAgIGlmKGdvb2cuaXNOdWxsKG9iaikpIHsKICAgICAgICAgIHN0ci5wdXNoKCJOVUxMIikKICAgICAgICB9ZWxzZSB7CiAgICAgICAgICBpZihnb29nLmlzU3RyaW5nKG9iaikpIHsKICAgICAgICAgICAgc3RyLnB1c2goJyInICsgb2JqLnJlcGxhY2UoL1xuL2csICJcbiIgKyBzcGFjZSkgKyAnIicpCiAgICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgIGlmKGdvb2cuaXNGdW5jdGlvbihvYmopKSB7CiAgICAgICAgICAgICAgc3RyLnB1c2goKCIiICsgb2JqKS5yZXBsYWNlKC9cbi9nLCAiXG4iICsgc3BhY2UpKQogICAgICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgICAgaWYoZ29vZy5pc09iamVjdChvYmopKSB7CiAgICAgICAgICAgICAgICBpZihwcmV2aW91cy5jb250YWlucyhvYmopKSB7CiAgICAgICAgICAgICAgICAgIHN0ci5wdXNoKCIqKiogcmVmZXJlbmNlIGxvb3AgZGV0ZWN0ZWQgKioqIikKICAgICAgICAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgICAgICAgcHJldmlvdXMuYWRkKG9iaik7CiAgICAgICAgICAgICAgICAgIHN0ci5wdXNoKCJ7Iik7CiAgICAgICAgICAgICAgICAgIGZvcih2YXIgeCBpbiBvYmopIHsKICAgICAgICAgICAgICAgICAgICBpZihvcHRfc2hvd0ZuIHx8ICFnb29nLmlzRnVuY3Rpb24ob2JqW3hdKSkgewogICAgICAgICAgICAgICAgICAgICAgc3RyLnB1c2goIlxuIiksIHN0ci5wdXNoKG5lc3RzcGFjZSksIHN0ci5wdXNoKHggKyAiID0gIiksIGhlbHBlcihvYmpbeF0sIG5lc3RzcGFjZSkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3RyLnB1c2goIlxuIiArIHNwYWNlICsgIn0iKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgICAgIHN0ci5wdXNoKG9iaikKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH1lbHNlIHsKICAgICAgICBzdHIucHVzaCgidW5kZWZpbmVkIikKICAgICAgfQogICAgfWNhdGNoKGUpIHsKICAgICAgc3RyLnB1c2goIioqKiAiICsgZSArICIgKioqIikKICAgIH0KICB9OwogIGhlbHBlcihvYmokJDAsICIiKTsKICByZXR1cm4gc3RyLmpvaW4oIiIpCn07Cmdvb2cuZGVidWcuZXhwb3NlQXJyYXkgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRleHBvc2VBcnJheSQoYXJyKSB7CiAgZm9yKHZhciBzdHIgPSBbXSwgaSA9IDA7aSA8IGFyci5sZW5ndGg7aSsrKSB7CiAgICBnb29nLmlzQXJyYXkoYXJyW2ldKSA/IHN0ci5wdXNoKGdvb2cuZGVidWcuZXhwb3NlQXJyYXkoYXJyW2ldKSkgOiBzdHIucHVzaChhcnJbaV0pCiAgfQogIHJldHVybiJbICIgKyBzdHIuam9pbigiLCAiKSArICIgXSIKfTsKZ29vZy5kZWJ1Zy5leHBvc2VFeGNlcHRpb24gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRleHBvc2VFeGNlcHRpb24kKGVyciwgb3B0X2ZuKSB7CiAgdHJ5IHsKICAgIHZhciBlID0gZ29vZy5kZWJ1Zy5ub3JtYWxpemVFcnJvck9iamVjdChlcnIpLCBlcnJvciA9ICJNZXNzYWdlOiAiICsgZ29vZy5zdHJpbmcuaHRtbEVzY2FwZShlLm1lc3NhZ2UpICsgJ1xuVXJsOiA8YSBocmVmPSJ2aWV3LXNvdXJjZTonICsgZS5maWxlTmFtZSArICciIHRhcmdldD0iX25ldyI+JyArIGUuZmlsZU5hbWUgKyAiPC9hPlxuTGluZTogIiArIGUubGluZU51bWJlciArICJcblxuQnJvd3NlciBzdGFjazpcbiIgKyBnb29nLnN0cmluZy5odG1sRXNjYXBlKGUuc3RhY2sgKyAiLT4gIikgKyAiW2VuZF1cblxuSlMgc3RhY2sgdHJhdmVyc2FsOlxuIiArIGdvb2cuc3RyaW5nLmh0bWxFc2NhcGUoZ29vZy5kZWJ1Zy5nZXRTdGFja3RyYWNlKG9wdF9mbikgKyAiLT4gIik7CiAgICByZXR1cm4gZXJyb3IKICB9Y2F0Y2goZTIpIHsKICAgIHJldHVybiJFeGNlcHRpb24gdHJ5aW5nIHRvIGV4cG9zZSBleGNlcHRpb24hIFlvdSB3aW4sIHdlIGxvc2UuICIgKyBlMgogIH0KfTsKZ29vZy5kZWJ1Zy5ub3JtYWxpemVFcnJvck9iamVjdCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJG5vcm1hbGl6ZUVycm9yT2JqZWN0JChlcnIpIHsKICB2YXIgaHJlZiA9IGdvb2cuZ2V0T2JqZWN0QnlOYW1lKCJ3aW5kb3cubG9jYXRpb24uaHJlZiIpOwogIGlmKGdvb2cuaXNTdHJpbmcoZXJyKSkgewogICAgcmV0dXJue21lc3NhZ2U6ZXJyLCBuYW1lOiJVbmtub3duIGVycm9yIiwgbGluZU51bWJlcjoiTm90IGF2YWlsYWJsZSIsIGZpbGVOYW1lOmhyZWYsIHN0YWNrOiJOb3QgYXZhaWxhYmxlIn0KICB9CiAgdmFyIGxpbmVOdW1iZXIsIGZpbGVOYW1lLCB0aHJld0Vycm9yID0gITE7CiAgdHJ5IHsKICAgIGxpbmVOdW1iZXIgPSBlcnIubGluZU51bWJlciB8fCBlcnIubGluZSB8fCAiTm90IGF2YWlsYWJsZSIKICB9Y2F0Y2goZSkgewogICAgbGluZU51bWJlciA9ICJOb3QgYXZhaWxhYmxlIiwgdGhyZXdFcnJvciA9ICEwCiAgfQogIHRyeSB7CiAgICBmaWxlTmFtZSA9IGVyci5maWxlTmFtZSB8fCBlcnIuZmlsZW5hbWUgfHwgZXJyLnNvdXJjZVVSTCB8fCBocmVmCiAgfWNhdGNoKGUkJDApIHsKICAgIGZpbGVOYW1lID0gIk5vdCBhdmFpbGFibGUiLCB0aHJld0Vycm9yID0gITAKICB9CiAgcmV0dXJuIHRocmV3RXJyb3IgfHwgIWVyci5saW5lTnVtYmVyIHx8ICFlcnIuZmlsZU5hbWUgfHwgIWVyci5zdGFjayA/IHttZXNzYWdlOmVyci5tZXNzYWdlLCBuYW1lOmVyci5uYW1lLCBsaW5lTnVtYmVyOmxpbmVOdW1iZXIsIGZpbGVOYW1lOmZpbGVOYW1lLCBzdGFjazplcnIuc3RhY2sgfHwgIk5vdCBhdmFpbGFibGUifSA6IGVycgp9Owpnb29nLmRlYnVnLmVuaGFuY2VFcnJvciA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJGVuaGFuY2VFcnJvciQoZXJyLCBvcHRfbWVzc2FnZSkgewogIHZhciBlcnJvciA9ICJzdHJpbmciID09IHR5cGVvZiBlcnIgPyBFcnJvcihlcnIpIDogZXJyOwogIGVycm9yLnN0YWNrIHx8IChlcnJvci5zdGFjayA9IGdvb2cuZGVidWcuZ2V0U3RhY2t0cmFjZShhcmd1bWVudHMuY2FsbGVlLmNhbGxlcikpOwogIGlmKG9wdF9tZXNzYWdlKSB7CiAgICBmb3IodmFyIHggPSAwO2Vycm9yWyJtZXNzYWdlIiArIHhdOykgewogICAgICArK3gKICAgIH0KICAgIGVycm9yWyJtZXNzYWdlIiArIHhdID0gIiIgKyBvcHRfbWVzc2FnZQogIH0KICByZXR1cm4gZXJyb3IKfTsKZ29vZy5kZWJ1Zy5nZXRTdGFja3RyYWNlU2ltcGxlID0gZnVuY3Rpb24gJGdvb2ckZGVidWckZ2V0U3RhY2t0cmFjZVNpbXBsZSQob3B0X2RlcHRoKSB7CiAgZm9yKHZhciBzYiA9IFtdLCBmbiA9IGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyLCBkZXB0aCA9IDA7Zm4gJiYgKCFvcHRfZGVwdGggfHwgZGVwdGggPCBvcHRfZGVwdGgpOykgewogICAgc2IucHVzaChnb29nLmRlYnVnLmdldEZ1bmN0aW9uTmFtZShmbikpOwogICAgc2IucHVzaCgiKClcbiIpOwogICAgdHJ5IHsKICAgICAgZm4gPSBmbi5jYWxsZXIKICAgIH1jYXRjaChlKSB7CiAgICAgIHNiLnB1c2goIltleGNlcHRpb24gdHJ5aW5nIHRvIGdldCBjYWxsZXJdXG4iKTsKICAgICAgYnJlYWsKICAgIH0KICAgIGRlcHRoKys7CiAgICBpZihkZXB0aCA+PSBnb29nLmRlYnVnLk1BWF9TVEFDS19ERVBUSCkgewogICAgICBzYi5wdXNoKCJbLi4ubG9uZyBzdGFjay4uLl0iKTsKICAgICAgYnJlYWsKICAgIH0KICB9CiAgb3B0X2RlcHRoICYmIGRlcHRoID49IG9wdF9kZXB0aCA/IHNiLnB1c2goIlsuLi5yZWFjaGVkIG1heCBkZXB0aCBsaW1pdC4uLl0iKSA6IHNiLnB1c2goIltlbmRdIik7CiAgcmV0dXJuIHNiLmpvaW4oIiIpCn07Cmdvb2cuZGVidWcuTUFYX1NUQUNLX0RFUFRIID0gNTA7Cmdvb2cuZGVidWcuZ2V0U3RhY2t0cmFjZSA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJGdldFN0YWNrdHJhY2UkKG9wdF9mbikgewogIHJldHVybiBnb29nLmRlYnVnLmdldFN0YWNrdHJhY2VIZWxwZXJfKG9wdF9mbiB8fCBhcmd1bWVudHMuY2FsbGVlLmNhbGxlciwgW10pCn07Cmdvb2cuZGVidWcuZ2V0U3RhY2t0cmFjZUhlbHBlcl8gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRnZXRTdGFja3RyYWNlSGVscGVyXyQoZm4sIHZpc2l0ZWQpIHsKICB2YXIgc2IgPSBbXTsKICBpZihnb29nLmFycmF5LmNvbnRhaW5zKHZpc2l0ZWQsIGZuKSkgewogICAgc2IucHVzaCgiWy4uLmNpcmN1bGFyIHJlZmVyZW5jZS4uLl0iKQogIH1lbHNlIHsKICAgIGlmKGZuICYmIHZpc2l0ZWQubGVuZ3RoIDwgZ29vZy5kZWJ1Zy5NQVhfU1RBQ0tfREVQVEgpIHsKICAgICAgc2IucHVzaChnb29nLmRlYnVnLmdldEZ1bmN0aW9uTmFtZShmbikgKyAiKCIpOwogICAgICBmb3IodmFyIGFyZ3MgPSBmbi5hcmd1bWVudHMsIGkgPSAwO2kgPCBhcmdzLmxlbmd0aDtpKyspIHsKICAgICAgICAwIDwgaSAmJiBzYi5wdXNoKCIsICIpOwogICAgICAgIHZhciBhcmdEZXNjLCBhcmcgPSBhcmdzW2ldOwogICAgICAgIHN3aXRjaCh0eXBlb2YgYXJnKSB7CiAgICAgICAgICBjYXNlICJvYmplY3QiOgogICAgICAgICAgICBhcmdEZXNjID0gYXJnID8gIm9iamVjdCIgOiAibnVsbCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgICAgICAgYXJnRGVzYyA9IGFyZzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgICBhcmdEZXNjID0gIiIgKyBhcmc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYm9vbGVhbiI6CiAgICAgICAgICAgIGFyZ0Rlc2MgPSBhcmcgPyAidHJ1ZSIgOiAiZmFsc2UiOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImZ1bmN0aW9uIjoKICAgICAgICAgICAgYXJnRGVzYyA9IChhcmdEZXNjID0gZ29vZy5kZWJ1Zy5nZXRGdW5jdGlvbk5hbWUoYXJnKSkgPyBhcmdEZXNjIDogIltmbl0iOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGFyZ0Rlc2MgPSB0eXBlb2YgYXJnCiAgICAgICAgfQogICAgICAgIDQwIDwgYXJnRGVzYy5sZW5ndGggJiYgKGFyZ0Rlc2MgPSBhcmdEZXNjLnN1YnN0cigwLCA0MCkgKyAiLi4uIik7CiAgICAgICAgc2IucHVzaChhcmdEZXNjKQogICAgICB9CiAgICAgIHZpc2l0ZWQucHVzaChmbik7CiAgICAgIHNiLnB1c2goIilcbiIpOwogICAgICB0cnkgewogICAgICAgIHNiLnB1c2goZ29vZy5kZWJ1Zy5nZXRTdGFja3RyYWNlSGVscGVyXyhmbi5jYWxsZXIsIHZpc2l0ZWQpKQogICAgICB9Y2F0Y2goZSkgewogICAgICAgIHNiLnB1c2goIltleGNlcHRpb24gdHJ5aW5nIHRvIGdldCBjYWxsZXJdXG4iKQogICAgICB9CiAgICB9ZWxzZSB7CiAgICAgIGZuID8gc2IucHVzaCgiWy4uLmxvbmcgc3RhY2suLi5dIikgOiBzYi5wdXNoKCJbZW5kXSIpCiAgICB9CiAgfQogIHJldHVybiBzYi5qb2luKCIiKQp9Owpnb29nLmRlYnVnLnNldEZ1bmN0aW9uUmVzb2x2ZXIgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRzZXRGdW5jdGlvblJlc29sdmVyJChyZXNvbHZlcikgewogIGdvb2cuZGVidWcuZm5OYW1lUmVzb2x2ZXJfID0gcmVzb2x2ZXIKfTsKZ29vZy5kZWJ1Zy5nZXRGdW5jdGlvbk5hbWUgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRnZXRGdW5jdGlvbk5hbWUkKGZuKSB7CiAgaWYoZ29vZy5kZWJ1Zy5mbk5hbWVDYWNoZV9bZm5dKSB7CiAgICByZXR1cm4gZ29vZy5kZWJ1Zy5mbk5hbWVDYWNoZV9bZm5dCiAgfQogIGlmKGdvb2cuZGVidWcuZm5OYW1lUmVzb2x2ZXJfKSB7CiAgICB2YXIgbmFtZSA9IGdvb2cuZGVidWcuZm5OYW1lUmVzb2x2ZXJfKGZuKTsKICAgIGlmKG5hbWUpIHsKICAgICAgcmV0dXJuIGdvb2cuZGVidWcuZm5OYW1lQ2FjaGVfW2ZuXSA9IG5hbWUKICAgIH0KICB9CiAgdmFyIGZ1bmN0aW9uU291cmNlID0gIiIgKyBmbjsKICBpZighZ29vZy5kZWJ1Zy5mbk5hbWVDYWNoZV9bZnVuY3Rpb25Tb3VyY2VdKSB7CiAgICB2YXIgbWF0Y2hlcyA9IC9mdW5jdGlvbiAoW15cKF0rKS8uZXhlYyhmdW5jdGlvblNvdXJjZSk7CiAgICBpZihtYXRjaGVzKSB7CiAgICAgIHZhciBtZXRob2QgPSBtYXRjaGVzWzFdOwogICAgICBnb29nLmRlYnVnLmZuTmFtZUNhY2hlX1tmdW5jdGlvblNvdXJjZV0gPSBtZXRob2QKICAgIH1lbHNlIHsKICAgICAgZ29vZy5kZWJ1Zy5mbk5hbWVDYWNoZV9bZnVuY3Rpb25Tb3VyY2VdID0gIltBbm9ueW1vdXNdIgogICAgfQogIH0KICByZXR1cm4gZ29vZy5kZWJ1Zy5mbk5hbWVDYWNoZV9bZnVuY3Rpb25Tb3VyY2VdCn07Cmdvb2cuZGVidWcubWFrZVdoaXRlc3BhY2VWaXNpYmxlID0gZnVuY3Rpb24gJGdvb2ckZGVidWckbWFrZVdoaXRlc3BhY2VWaXNpYmxlJChzdHJpbmcpIHsKICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyAvZywgIltfXSIpLnJlcGxhY2UoL1xmL2csICJbZl0iKS5yZXBsYWNlKC9cbi9nLCAiW25dXG4iKS5yZXBsYWNlKC9cci9nLCAiW3JdIikucmVwbGFjZSgvXHQvZywgIlt0XSIpCn07Cmdvb2cuZGVidWcuZm5OYW1lQ2FjaGVfID0ge307Cmdvb2cuZGVidWcuTG9nUmVjb3JkID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nUmVjb3JkJChsZXZlbCwgbXNnLCBsb2dnZXJOYW1lLCBvcHRfdGltZSwgb3B0X3NlcXVlbmNlTnVtYmVyKSB7CiAgdGhpcy5yZXNldChsZXZlbCwgbXNnLCBsb2dnZXJOYW1lLCBvcHRfdGltZSwgb3B0X3NlcXVlbmNlTnVtYmVyKQp9Owpnb29nLmRlYnVnLkxvZ1JlY29yZC5wcm90b3R5cGUuZXhjZXB0aW9uXyA9IG51bGw7Cmdvb2cuZGVidWcuTG9nUmVjb3JkLnByb3RvdHlwZS5leGNlcHRpb25UZXh0XyA9IG51bGw7Cmdvb2cuZGVidWcuTG9nUmVjb3JkLkVOQUJMRV9TRVFVRU5DRV9OVU1CRVJTID0gITA7Cmdvb2cuZGVidWcuTG9nUmVjb3JkLm5leHRTZXF1ZW5jZU51bWJlcl8gPSAwOwpnb29nLmRlYnVnLkxvZ1JlY29yZC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dSZWNvcmQkJHJlc2V0JChsZXZlbCwgbXNnLCBsb2dnZXJOYW1lLCBvcHRfdGltZSwgb3B0X3NlcXVlbmNlTnVtYmVyKSB7CiAgZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQuRU5BQkxFX1NFUVVFTkNFX05VTUJFUlMgJiYgKCJudW1iZXIiID09IHR5cGVvZiBvcHRfc2VxdWVuY2VOdW1iZXIgfHwgZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQubmV4dFNlcXVlbmNlTnVtYmVyXysrKTsKICB0aGlzLnRpbWVfID0gb3B0X3RpbWUgfHwgZ29vZy5ub3coKTsKICB0aGlzLmxldmVsXyA9IGxldmVsOwogIHRoaXMubXNnXyA9IG1zZzsKICB0aGlzLmxvZ2dlck5hbWVfID0gbG9nZ2VyTmFtZTsKICBkZWxldGUgdGhpcy5leGNlcHRpb25fOwogIGRlbGV0ZSB0aGlzLmV4Y2VwdGlvblRleHRfCn07Cmdvb2cuZGVidWcuTG9nUmVjb3JkLnByb3RvdHlwZS5nZXRMb2dnZXJOYW1lID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nUmVjb3JkJCRnZXRMb2dnZXJOYW1lJCgpIHsKICByZXR1cm4gdGhpcy5sb2dnZXJOYW1lXwp9Owpnb29nLmRlYnVnLkxvZ1JlY29yZC5wcm90b3R5cGUuZ2V0RXhjZXB0aW9uID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nUmVjb3JkJCRnZXRFeGNlcHRpb24kKCkgewogIHJldHVybiB0aGlzLmV4Y2VwdGlvbl8KfTsKZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQucHJvdG90eXBlLnNldEV4Y2VwdGlvbiA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ1JlY29yZCQkc2V0RXhjZXB0aW9uJChleGNlcHRpb24pIHsKICB0aGlzLmV4Y2VwdGlvbl8gPSBleGNlcHRpb24KfTsKZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQucHJvdG90eXBlLmdldEV4Y2VwdGlvblRleHQgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dSZWNvcmQkJGdldEV4Y2VwdGlvblRleHQkKCkgewogIHJldHVybiB0aGlzLmV4Y2VwdGlvblRleHRfCn07Cmdvb2cuZGVidWcuTG9nUmVjb3JkLnByb3RvdHlwZS5zZXRFeGNlcHRpb25UZXh0ID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nUmVjb3JkJCRzZXRFeGNlcHRpb25UZXh0JCh0ZXh0KSB7CiAgdGhpcy5leGNlcHRpb25UZXh0XyA9IHRleHQKfTsKZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQucHJvdG90eXBlLmdldExldmVsID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nUmVjb3JkJCRnZXRMZXZlbCQoKSB7CiAgcmV0dXJuIHRoaXMubGV2ZWxfCn07Cmdvb2cuZGVidWcuTG9nUmVjb3JkLnByb3RvdHlwZS5zZXRMZXZlbCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ1JlY29yZCQkc2V0TGV2ZWwkKGxldmVsKSB7CiAgdGhpcy5sZXZlbF8gPSBsZXZlbAp9Owpnb29nLmRlYnVnLkxvZ1JlY29yZC5wcm90b3R5cGUuZ2V0TWVzc2FnZSA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ1JlY29yZCQkZ2V0TWVzc2FnZSQoKSB7CiAgcmV0dXJuIHRoaXMubXNnXwp9Owpnb29nLmRlYnVnLkxvZ1JlY29yZC5wcm90b3R5cGUuZ2V0TWlsbGlzID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nUmVjb3JkJCRnZXRNaWxsaXMkKCkgewogIHJldHVybiB0aGlzLnRpbWVfCn07Cmdvb2cuZGVidWcuTG9nQnVmZmVyID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nQnVmZmVyJCgpIHsKICBnb29nLmFzc2VydHMuYXNzZXJ0KGdvb2cuZGVidWcuTG9nQnVmZmVyLmlzQnVmZmVyaW5nRW5hYmxlZCgpLCAiQ2Fubm90IHVzZSBnb29nLmRlYnVnLkxvZ0J1ZmZlciB3aXRob3V0IGRlZmluaW5nIGdvb2cuZGVidWcuTG9nQnVmZmVyLkNBUEFDSVRZLiIpOwogIHRoaXMuY2xlYXIoKQp9Owpnb29nLmRlYnVnLkxvZ0J1ZmZlci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ0J1ZmZlciRnZXRJbnN0YW5jZSQoKSB7CiAgZ29vZy5kZWJ1Zy5Mb2dCdWZmZXIuaW5zdGFuY2VfIHx8IChnb29nLmRlYnVnLkxvZ0J1ZmZlci5pbnN0YW5jZV8gPSBuZXcgZ29vZy5kZWJ1Zy5Mb2dCdWZmZXIpOwogIHJldHVybiBnb29nLmRlYnVnLkxvZ0J1ZmZlci5pbnN0YW5jZV8KfTsKZ29vZy5kZWJ1Zy5Mb2dCdWZmZXIuQ0FQQUNJVFkgPSAwOwpnb29nLmRlYnVnLkxvZ0J1ZmZlci5wcm90b3R5cGUuYWRkUmVjb3JkID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nQnVmZmVyJCRhZGRSZWNvcmQkKGxldmVsLCBtc2csIGxvZ2dlck5hbWUpIHsKICB2YXIgY3VySW5kZXggPSAodGhpcy5jdXJJbmRleF8gKyAxKSAlIGdvb2cuZGVidWcuTG9nQnVmZmVyLkNBUEFDSVRZOwogIHRoaXMuY3VySW5kZXhfID0gY3VySW5kZXg7CiAgaWYodGhpcy5pc0Z1bGxfKSB7CiAgICB2YXIgcmV0ID0gdGhpcy5idWZmZXJfW2N1ckluZGV4XTsKICAgIHJldC5yZXNldChsZXZlbCwgbXNnLCBsb2dnZXJOYW1lKTsKICAgIHJldHVybiByZXQKICB9CiAgdGhpcy5pc0Z1bGxfID0gY3VySW5kZXggPT0gZ29vZy5kZWJ1Zy5Mb2dCdWZmZXIuQ0FQQUNJVFkgLSAxOwogIHJldHVybiB0aGlzLmJ1ZmZlcl9bY3VySW5kZXhdID0gbmV3IGdvb2cuZGVidWcuTG9nUmVjb3JkKGxldmVsLCBtc2csIGxvZ2dlck5hbWUpCn07Cmdvb2cuZGVidWcuTG9nQnVmZmVyLmlzQnVmZmVyaW5nRW5hYmxlZCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ0J1ZmZlciRpc0J1ZmZlcmluZ0VuYWJsZWQkKCkgewogIHJldHVybiAwIDwgZ29vZy5kZWJ1Zy5Mb2dCdWZmZXIuQ0FQQUNJVFkKfTsKZ29vZy5kZWJ1Zy5Mb2dCdWZmZXIucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nQnVmZmVyJCRjbGVhciQoKSB7CiAgdGhpcy5idWZmZXJfID0gQXJyYXkoZ29vZy5kZWJ1Zy5Mb2dCdWZmZXIuQ0FQQUNJVFkpOwogIHRoaXMuY3VySW5kZXhfID0gLTE7CiAgdGhpcy5pc0Z1bGxfID0gITEKfTsKZ29vZy5kZWJ1Zy5Mb2dnZXIgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkKG5hbWUpIHsKICB0aGlzLm5hbWVfID0gbmFtZQp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUucGFyZW50XyA9IG51bGw7Cmdvb2cuZGVidWcuTG9nZ2VyLnByb3RvdHlwZS5sZXZlbF8gPSBudWxsOwpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuY2hpbGRyZW5fID0gbnVsbDsKZ29vZy5kZWJ1Zy5Mb2dnZXIucHJvdG90eXBlLmhhbmRsZXJzXyA9IG51bGw7Cmdvb2cuZGVidWcuTG9nZ2VyLkVOQUJMRV9ISUVSQVJDSFkgPSAhMDsKZ29vZy5kZWJ1Zy5Mb2dnZXIuRU5BQkxFX0hJRVJBUkNIWSB8fCAoZ29vZy5kZWJ1Zy5Mb2dnZXIucm9vdEhhbmRsZXJzXyA9IFtdKTsKZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkTGV2ZWwkKG5hbWUsIHZhbHVlKSB7CiAgdGhpcy5uYW1lID0gbmFtZTsKICB0aGlzLnZhbHVlID0gdmFsdWUKfTsKZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nZ2VyJExldmVsJCR0b1N0cmluZyQoKSB7CiAgcmV0dXJuIHRoaXMubmFtZQp9Owpnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5PRkYgPSBuZXcgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwoIk9GRiIsIEluZmluaXR5KTsKZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuU0hPVVQgPSBuZXcgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwoIlNIT1VUIiwgMTIwMCk7Cmdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLlNFVkVSRSA9IG5ldyBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbCgiU0VWRVJFIiwgMUUzKTsKZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuV0FSTklORyA9IG5ldyBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbCgiV0FSTklORyIsIDkwMCk7Cmdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLklORk8gPSBuZXcgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwoIklORk8iLCA4MDApOwpnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5DT05GSUcgPSBuZXcgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwoIkNPTkZJRyIsIDcwMCk7Cmdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLkZJTkUgPSBuZXcgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwoIkZJTkUiLCA1MDApOwpnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5GSU5FUiA9IG5ldyBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbCgiRklORVIiLCA0MDApOwpnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5GSU5FU1QgPSBuZXcgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwoIkZJTkVTVCIsIDMwMCk7Cmdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLkFMTCA9IG5ldyBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbCgiQUxMIiwgMCk7Cmdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLlBSRURFRklORURfTEVWRUxTID0gW2dvb2cuZGVidWcuTG9nZ2VyLkxldmVsLk9GRiwgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuU0hPVVQsIGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLlNFVkVSRSwgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuV0FSTklORywgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuSU5GTywgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuQ09ORklHLCBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5GSU5FLCBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5GSU5FUiwgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuRklORVNULCBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5BTExdOwpnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5wcmVkZWZpbmVkTGV2ZWxzQ2FjaGVfID0gbnVsbDsKZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuY3JlYXRlUHJlZGVmaW5lZExldmVsc0NhY2hlXyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ2dlciRMZXZlbCRjcmVhdGVQcmVkZWZpbmVkTGV2ZWxzQ2FjaGVfJCgpIHsKICBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5wcmVkZWZpbmVkTGV2ZWxzQ2FjaGVfID0ge307CiAgZm9yKHZhciBpID0gMCwgbGV2ZWw7bGV2ZWwgPSBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5QUkVERUZJTkVEX0xFVkVMU1tpXTtpKyspIHsKICAgIGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLnByZWRlZmluZWRMZXZlbHNDYWNoZV9bbGV2ZWwudmFsdWVdID0gbGV2ZWwsIGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLnByZWRlZmluZWRMZXZlbHNDYWNoZV9bbGV2ZWwubmFtZV0gPSBsZXZlbAogIH0KfTsKZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuZ2V0UHJlZGVmaW5lZExldmVsID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nZ2VyJExldmVsJGdldFByZWRlZmluZWRMZXZlbCQobmFtZSkgewogIGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLnByZWRlZmluZWRMZXZlbHNDYWNoZV8gfHwgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuY3JlYXRlUHJlZGVmaW5lZExldmVsc0NhY2hlXygpOwogIHJldHVybiBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5wcmVkZWZpbmVkTGV2ZWxzQ2FjaGVfW25hbWVdIHx8IG51bGwKfTsKZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuZ2V0UHJlZGVmaW5lZExldmVsQnlWYWx1ZSA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ2dlciRMZXZlbCRnZXRQcmVkZWZpbmVkTGV2ZWxCeVZhbHVlJCh2YWx1ZSkgewogIGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLnByZWRlZmluZWRMZXZlbHNDYWNoZV8gfHwgZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuY3JlYXRlUHJlZGVmaW5lZExldmVsc0NhY2hlXygpOwogIGlmKHZhbHVlIGluIGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLnByZWRlZmluZWRMZXZlbHNDYWNoZV8pIHsKICAgIHJldHVybiBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5wcmVkZWZpbmVkTGV2ZWxzQ2FjaGVfW3ZhbHVlXQogIH0KICBmb3IodmFyIGkgPSAwO2kgPCBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5QUkVERUZJTkVEX0xFVkVMUy5sZW5ndGg7KytpKSB7CiAgICB2YXIgbGV2ZWwgPSBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5QUkVERUZJTkVEX0xFVkVMU1tpXTsKICAgIGlmKGxldmVsLnZhbHVlIDw9IHZhbHVlKSB7CiAgICAgIHJldHVybiBsZXZlbAogICAgfQogIH0KICByZXR1cm4gbnVsbAp9Owpnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkZ2V0TG9nZ2VyJChuYW1lKSB7CiAgcmV0dXJuIGdvb2cuZGVidWcuTG9nTWFuYWdlci5nZXRMb2dnZXIobmFtZSkKfTsKZ29vZy5kZWJ1Zy5Mb2dnZXIubG9nVG9Qcm9maWxlcnMgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkbG9nVG9Qcm9maWxlcnMkKG1zZykgewogIGdvb2cuZ2xvYmFsLmNvbnNvbGUgJiYgKGdvb2cuZ2xvYmFsLmNvbnNvbGUudGltZVN0YW1wID8gZ29vZy5nbG9iYWwuY29uc29sZS50aW1lU3RhbXAobXNnKSA6IGdvb2cuZ2xvYmFsLmNvbnNvbGUubWFya1RpbWVsaW5lICYmIGdvb2cuZ2xvYmFsLmNvbnNvbGUubWFya1RpbWVsaW5lKG1zZykpOwogIGdvb2cuZ2xvYmFsLm1zV3JpdGVQcm9maWxlck1hcmsgJiYgZ29vZy5nbG9iYWwubXNXcml0ZVByb2ZpbGVyTWFyayhtc2cpCn07Cmdvb2cuZGVidWcuTG9nZ2VyLnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nZ2VyJCRnZXROYW1lJCgpIHsKICByZXR1cm4gdGhpcy5uYW1lXwp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuYWRkSGFuZGxlciA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ2dlciQkYWRkSGFuZGxlciQoaGFuZGxlcikgewogIGdvb2cuZGVidWcuTG9nZ2VyLkVOQUJMRV9ISUVSQVJDSFkgPyAodGhpcy5oYW5kbGVyc18gfHwgKHRoaXMuaGFuZGxlcnNfID0gW10pLCB0aGlzLmhhbmRsZXJzXy5wdXNoKGhhbmRsZXIpKSA6IChnb29nLmFzc2VydHMuYXNzZXJ0KCF0aGlzLm5hbWVfLCAiQ2Fubm90IGNhbGwgYWRkSGFuZGxlciBvbiBhIG5vbi1yb290IGxvZ2dlciB3aGVuIGdvb2cuZGVidWcuTG9nZ2VyLkVOQUJMRV9ISUVSQVJDSFkgaXMgZmFsc2UuIiksIGdvb2cuZGVidWcuTG9nZ2VyLnJvb3RIYW5kbGVyc18ucHVzaChoYW5kbGVyKSkKfTsKZ29vZy5kZWJ1Zy5Mb2dnZXIucHJvdG90eXBlLnJlbW92ZUhhbmRsZXIgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkJHJlbW92ZUhhbmRsZXIkKGhhbmRsZXIpIHsKICB2YXIgaGFuZGxlcnMgPSBnb29nLmRlYnVnLkxvZ2dlci5FTkFCTEVfSElFUkFSQ0hZID8gdGhpcy5oYW5kbGVyc18gOiBnb29nLmRlYnVnLkxvZ2dlci5yb290SGFuZGxlcnNfOwogIHJldHVybiEhaGFuZGxlcnMgJiYgZ29vZy5hcnJheS5yZW1vdmUoaGFuZGxlcnMsIGhhbmRsZXIpCn07Cmdvb2cuZGVidWcuTG9nZ2VyLnByb3RvdHlwZS5nZXRQYXJlbnQgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkJGdldFBhcmVudCQoKSB7CiAgcmV0dXJuIHRoaXMucGFyZW50Xwp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuZ2V0Q2hpbGRyZW4gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkJGdldENoaWxkcmVuJCgpIHsKICB0aGlzLmNoaWxkcmVuXyB8fCAodGhpcy5jaGlsZHJlbl8gPSB7fSk7CiAgcmV0dXJuIHRoaXMuY2hpbGRyZW5fCn07Cmdvb2cuZGVidWcuTG9nZ2VyLnByb3RvdHlwZS5zZXRMZXZlbCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ2dlciQkc2V0TGV2ZWwkKGxldmVsKSB7CiAgZ29vZy5kZWJ1Zy5Mb2dnZXIuRU5BQkxFX0hJRVJBUkNIWSA/IHRoaXMubGV2ZWxfID0gbGV2ZWwgOiAoZ29vZy5hc3NlcnRzLmFzc2VydCghdGhpcy5uYW1lXywgIkNhbm5vdCBjYWxsIHNldExldmVsKCkgb24gYSBub24tcm9vdCBsb2dnZXIgd2hlbiBnb29nLmRlYnVnLkxvZ2dlci5FTkFCTEVfSElFUkFSQ0hZIGlzIGZhbHNlLiIpLCBnb29nLmRlYnVnLkxvZ2dlci5yb290TGV2ZWxfID0gbGV2ZWwpCn07Cmdvb2cuZGVidWcuTG9nZ2VyLnByb3RvdHlwZS5nZXRMZXZlbCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ2dlciQkZ2V0TGV2ZWwkKCkgewogIHJldHVybiB0aGlzLmxldmVsXwp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuZ2V0RWZmZWN0aXZlTGV2ZWwgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkJGdldEVmZmVjdGl2ZUxldmVsJCgpIHsKICBpZighZ29vZy5kZWJ1Zy5Mb2dnZXIuRU5BQkxFX0hJRVJBUkNIWSkgewogICAgcmV0dXJuIGdvb2cuZGVidWcuTG9nZ2VyLnJvb3RMZXZlbF8KICB9CiAgaWYodGhpcy5sZXZlbF8pIHsKICAgIHJldHVybiB0aGlzLmxldmVsXwogIH0KICBpZih0aGlzLnBhcmVudF8pIHsKICAgIHJldHVybiB0aGlzLnBhcmVudF8uZ2V0RWZmZWN0aXZlTGV2ZWwoKQogIH0KICBnb29nLmFzc2VydHMuZmFpbCgiUm9vdCBsb2dnZXIgaGFzIG5vIGxldmVsIHNldC4iKTsKICByZXR1cm4gbnVsbAp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuaXNMb2dnYWJsZSA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ2dlciQkaXNMb2dnYWJsZSQobGV2ZWwpIHsKICByZXR1cm4gbGV2ZWwudmFsdWUgPj0gdGhpcy5nZXRFZmZlY3RpdmVMZXZlbCgpLnZhbHVlCn07Cmdvb2cuZGVidWcuTG9nZ2VyLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkJGxvZyQobGV2ZWwsIG1zZywgb3B0X2V4Y2VwdGlvbikgewogIHRoaXMuaXNMb2dnYWJsZShsZXZlbCkgJiYgdGhpcy5kb0xvZ1JlY29yZF8odGhpcy5nZXRMb2dSZWNvcmQobGV2ZWwsIG1zZywgb3B0X2V4Y2VwdGlvbikpCn07Cmdvb2cuZGVidWcuTG9nZ2VyLnByb3RvdHlwZS5nZXRMb2dSZWNvcmQgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkJGdldExvZ1JlY29yZCQobGV2ZWwsIG1zZywgb3B0X2V4Y2VwdGlvbikgewogIHZhciBsb2dSZWNvcmQgPSBnb29nLmRlYnVnLkxvZ0J1ZmZlci5pc0J1ZmZlcmluZ0VuYWJsZWQoKSA/IGdvb2cuZGVidWcuTG9nQnVmZmVyLmdldEluc3RhbmNlKCkuYWRkUmVjb3JkKGxldmVsLCBtc2csIHRoaXMubmFtZV8pIDogbmV3IGdvb2cuZGVidWcuTG9nUmVjb3JkKGxldmVsLCAiIiArIG1zZywgdGhpcy5uYW1lXyk7CiAgb3B0X2V4Y2VwdGlvbiAmJiAobG9nUmVjb3JkLnNldEV4Y2VwdGlvbihvcHRfZXhjZXB0aW9uKSwgbG9nUmVjb3JkLnNldEV4Y2VwdGlvblRleHQoZ29vZy5kZWJ1Zy5leHBvc2VFeGNlcHRpb24ob3B0X2V4Y2VwdGlvbiwgYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIpKSk7CiAgcmV0dXJuIGxvZ1JlY29yZAp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuc2V2ZXJlID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nZ2VyJCRzZXZlcmUkKG1zZywgb3B0X2V4Y2VwdGlvbikgewogIHRoaXMubG9nKGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLlNFVkVSRSwgbXNnLCBvcHRfZXhjZXB0aW9uKQp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUud2FybmluZyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ2dlciQkd2FybmluZyQobXNnLCBvcHRfZXhjZXB0aW9uKSB7CiAgdGhpcy5sb2coZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuV0FSTklORywgbXNnLCBvcHRfZXhjZXB0aW9uKQp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ2dlciQkaW5mbyQobXNnLCBvcHRfZXhjZXB0aW9uKSB7CiAgdGhpcy5sb2coZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuSU5GTywgbXNnLCBvcHRfZXhjZXB0aW9uKQp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuY29uZmlnID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nZ2VyJCRjb25maWckKG1zZywgb3B0X2V4Y2VwdGlvbikgewogIHRoaXMubG9nKGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLkNPTkZJRywgbXNnLCBvcHRfZXhjZXB0aW9uKQp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuZmluZSA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ2dlciQkZmluZSQobXNnLCBvcHRfZXhjZXB0aW9uKSB7CiAgdGhpcy5sb2coZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuRklORSwgbXNnLCBvcHRfZXhjZXB0aW9uKQp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuZmluZXN0ID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nZ2VyJCRmaW5lc3QkKG1zZywgb3B0X2V4Y2VwdGlvbikgewogIHRoaXMubG9nKGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLkZJTkVTVCwgbXNnLCBvcHRfZXhjZXB0aW9uKQp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUubG9nUmVjb3JkID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nZ2VyJCRsb2dSZWNvcmQkKGxvZ1JlY29yZCkgewogIHRoaXMuaXNMb2dnYWJsZShsb2dSZWNvcmQuZ2V0TGV2ZWwoKSkgJiYgdGhpcy5kb0xvZ1JlY29yZF8obG9nUmVjb3JkKQp9Owpnb29nLmRlYnVnLkxvZ2dlci5wcm90b3R5cGUuZG9Mb2dSZWNvcmRfID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nZ2VyJCRkb0xvZ1JlY29yZF8kKGxvZ1JlY29yZCkgewogIGdvb2cuZGVidWcuTG9nZ2VyLmxvZ1RvUHJvZmlsZXJzKCJsb2c6IiArIGxvZ1JlY29yZC5nZXRNZXNzYWdlKCkpOwogIGlmKGdvb2cuZGVidWcuTG9nZ2VyLkVOQUJMRV9ISUVSQVJDSFkpIHsKICAgIGZvcih2YXIgdGFyZ2V0ID0gdGhpczt0YXJnZXQ7KSB7CiAgICAgIHRhcmdldC5jYWxsUHVibGlzaF8obG9nUmVjb3JkKSwgdGFyZ2V0ID0gdGFyZ2V0LmdldFBhcmVudCgpCiAgICB9CiAgfWVsc2UgewogICAgZm9yKHZhciBpID0gMCwgaGFuZGxlcjtoYW5kbGVyID0gZ29vZy5kZWJ1Zy5Mb2dnZXIucm9vdEhhbmRsZXJzX1tpKytdOykgewogICAgICBoYW5kbGVyKGxvZ1JlY29yZCkKICAgIH0KICB9Cn07Cmdvb2cuZGVidWcuTG9nZ2VyLnByb3RvdHlwZS5jYWxsUHVibGlzaF8gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dnZXIkJGNhbGxQdWJsaXNoXyQobG9nUmVjb3JkKSB7CiAgaWYodGhpcy5oYW5kbGVyc18pIHsKICAgIGZvcih2YXIgaSA9IDAsIGhhbmRsZXI7aGFuZGxlciA9IHRoaXMuaGFuZGxlcnNfW2ldO2krKykgewogICAgICBoYW5kbGVyKGxvZ1JlY29yZCkKICAgIH0KICB9Cn07Cmdvb2cuZGVidWcuTG9nZ2VyLnByb3RvdHlwZS5zZXRQYXJlbnRfID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nZ2VyJCRzZXRQYXJlbnRfJChwYXJlbnQpIHsKICB0aGlzLnBhcmVudF8gPSBwYXJlbnQKfTsKZ29vZy5kZWJ1Zy5Mb2dnZXIucHJvdG90eXBlLmFkZENoaWxkXyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ2dlciQkYWRkQ2hpbGRfJChuYW1lLCBsb2dnZXIpIHsKICB0aGlzLmdldENoaWxkcmVuKClbbmFtZV0gPSBsb2dnZXIKfTsKZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyID0ge307Cmdvb2cuZGVidWcuTG9nTWFuYWdlci5sb2dnZXJzXyA9IHt9Owpnb29nLmRlYnVnLkxvZ01hbmFnZXIucm9vdExvZ2dlcl8gPSBudWxsOwpnb29nLmRlYnVnLkxvZ01hbmFnZXIuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ01hbmFnZXIkaW5pdGlhbGl6ZSQoKSB7CiAgZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyLnJvb3RMb2dnZXJfIHx8IChnb29nLmRlYnVnLkxvZ01hbmFnZXIucm9vdExvZ2dlcl8gPSBuZXcgZ29vZy5kZWJ1Zy5Mb2dnZXIoIiIpLCBnb29nLmRlYnVnLkxvZ01hbmFnZXIubG9nZ2Vyc19bIiJdID0gZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyLnJvb3RMb2dnZXJfLCBnb29nLmRlYnVnLkxvZ01hbmFnZXIucm9vdExvZ2dlcl8uc2V0TGV2ZWwoZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwuQ09ORklHKSkKfTsKZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyLmdldExvZ2dlcnMgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dNYW5hZ2VyJGdldExvZ2dlcnMkKCkgewogIHJldHVybiBnb29nLmRlYnVnLkxvZ01hbmFnZXIubG9nZ2Vyc18KfTsKZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyLmdldFJvb3QgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dNYW5hZ2VyJGdldFJvb3QkKCkgewogIGdvb2cuZGVidWcuTG9nTWFuYWdlci5pbml0aWFsaXplKCk7CiAgcmV0dXJuIGdvb2cuZGVidWcuTG9nTWFuYWdlci5yb290TG9nZ2VyXwp9Owpnb29nLmRlYnVnLkxvZ01hbmFnZXIuZ2V0TG9nZ2VyID0gZnVuY3Rpb24gJGdvb2ckZGVidWckTG9nTWFuYWdlciRnZXRMb2dnZXIkKG5hbWUpIHsKICBnb29nLmRlYnVnLkxvZ01hbmFnZXIuaW5pdGlhbGl6ZSgpOwogIHZhciByZXQgPSBnb29nLmRlYnVnLkxvZ01hbmFnZXIubG9nZ2Vyc19bbmFtZV07CiAgcmV0dXJuIHJldCB8fCBnb29nLmRlYnVnLkxvZ01hbmFnZXIuY3JlYXRlTG9nZ2VyXyhuYW1lKQp9Owpnb29nLmRlYnVnLkxvZ01hbmFnZXIuY3JlYXRlRnVuY3Rpb25Gb3JDYXRjaEVycm9ycyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJExvZ01hbmFnZXIkY3JlYXRlRnVuY3Rpb25Gb3JDYXRjaEVycm9ycyQob3B0X2xvZ2dlcikgewogIHJldHVybiBmdW5jdGlvbihpbmZvKSB7CiAgICB2YXIgbG9nZ2VyID0gb3B0X2xvZ2dlciB8fCBnb29nLmRlYnVnLkxvZ01hbmFnZXIuZ2V0Um9vdCgpOwogICAgbG9nZ2VyLnNldmVyZSgiRXJyb3I6ICIgKyBpbmZvLm1lc3NhZ2UgKyAiICgiICsgaW5mby5maWxlTmFtZSArICIgQCBMaW5lOiAiICsgaW5mby5saW5lICsgIikiKQogIH0KfTsKZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyLmNyZWF0ZUxvZ2dlcl8gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRMb2dNYW5hZ2VyJGNyZWF0ZUxvZ2dlcl8kKG5hbWUpIHsKICB2YXIgbG9nZ2VyID0gbmV3IGdvb2cuZGVidWcuTG9nZ2VyKG5hbWUpOwogIGlmKGdvb2cuZGVidWcuTG9nZ2VyLkVOQUJMRV9ISUVSQVJDSFkpIHsKICAgIHZhciBsYXN0RG90SW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCIuIiksIHBhcmVudE5hbWUgPSBuYW1lLnN1YnN0cigwLCBsYXN0RG90SW5kZXgpLCBsZWFmTmFtZSA9IG5hbWUuc3Vic3RyKGxhc3REb3RJbmRleCArIDEpLCBwYXJlbnRMb2dnZXIgPSBnb29nLmRlYnVnLkxvZ01hbmFnZXIuZ2V0TG9nZ2VyKHBhcmVudE5hbWUpOwogICAgcGFyZW50TG9nZ2VyLmFkZENoaWxkXyhsZWFmTmFtZSwgbG9nZ2VyKTsKICAgIGxvZ2dlci5zZXRQYXJlbnRfKHBhcmVudExvZ2dlcikKICB9CiAgcmV0dXJuIGdvb2cuZGVidWcuTG9nTWFuYWdlci5sb2dnZXJzX1tuYW1lXSA9IGxvZ2dlcgp9Owp2YXIgdGFsayA9IHttZWRpYTp7fX07CnRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3RvciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENsaWVudDNERGV0ZWN0b3IkKCkgewp9Owp0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IuY2xpZW50M2REZXRlY3RvciA9IG51bGw7Cm51bGwgPT0gdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLmNsaWVudDNkRGV0ZWN0b3IgJiYgKHRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvci5jbGllbnQzZERldGVjdG9yID0gbmV3IHRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvcik7CnRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvci5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IiKTsKdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENsaWVudDNERGV0ZWN0b3IkJHJlc2V0JCgpIHsKICB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IuaGFzQ2xpZW50M0RfID0gdm9pZCAwCn07CnRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvci5wcm90b3R5cGUuaXNJbnN0YWxsZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDbGllbnQzRERldGVjdG9yJCRpc0luc3RhbGxlZCQoKSB7CiAgaWYoIWdvb2cuaXNEZWYodGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLmhhc0NsaWVudDNEXykpIHsKICAgIGlmKHRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvci5oYXNDbGllbnQzRF8gPSAhMSwgdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLmxlZ2FjeVBsdWdpbl8gPSAhMSwgZ29vZy51c2VyQWdlbnQuSUUpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgYXggPSBuZXcgQWN0aXZlWE9iamVjdCgiZ3RwbzNkX2hvc3QuTzNESG9zdENvbnRyb2wiKTsKICAgICAgICB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IuaGFzQ2xpZW50M0RfID0gITA7CiAgICAgICAgdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLnBsdWdpblZlcnNpb25fID0gdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLnBhcnNlVmVyc2lvbl8oYXguZGVzY3JpcHRpb24pCiAgICAgIH1jYXRjaChlKSB7CiAgICAgICAgdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLmxvZ2dlcl8uaW5mbygiR1RQL08zRCBBY3RpdmVYIHBsdWdpbiBub3QgYXZhaWxhYmxlLiIpCiAgICAgIH0KICAgICAgaWYoIXRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvci5oYXNDbGllbnQzRF8pIHsKICAgICAgICB0cnkgewogICAgICAgICAgYXggPSBuZXcgQWN0aXZlWE9iamVjdCgibzNkX2hvc3QuTzNESG9zdENvbnRyb2wiKSwgdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLmhhc0NsaWVudDNEXyA9ICEwLCB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IubGVnYWN5UGx1Z2luXyA9ICEwLCB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IucGx1Z2luVmVyc2lvbl8gPSB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IucGFyc2VWZXJzaW9uXyhheC5kZXNjcmlwdGlvbikKICAgICAgICB9Y2F0Y2goZSQkMCkgewogICAgICAgICAgdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLmxvZ2dlcl8uaW5mbygiTzNEIEFjdGl2ZVggcGx1Z2luIG5vdCBhdmFpbGFibGUuIikKICAgICAgICB9CiAgICAgIH0KICAgIH1lbHNlIHsKICAgICAgaWYoZ29vZy5nbG9iYWwubmF2aWdhdG9yKSB7CiAgICAgICAgdmFyIG1pbWV0eXBlID0gbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24vdm5kLmd0cG8zZC5hdXRvIl07CiAgICAgICAgbWltZXR5cGUgPyBtaW1ldHlwZS5lbmFibGVkUGx1Z2luID8gKHRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvci5oYXNDbGllbnQzRF8gPSAhMCwgdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLnBsdWdpblZlcnNpb25fID0gdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLnBhcnNlVmVyc2lvbl8obWltZXR5cGUuZW5hYmxlZFBsdWdpbi5kZXNjcmlwdGlvbikpIDogdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLmxvZ2dlcl8uaW5mbygiTzNEIG1pbWV0eXBlIG5vdCBlbmFibGVkLiIpIDogdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLmxvZ2dlcl8uaW5mbygiTzNEIG1pbWV0eXBlIG5vdCByZWdpc3RlcmVkLiIpOwogICAgICAgIHRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvci5oYXNDbGllbnQzRF8gfHwgKChtaW1ldHlwZSA9IG5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3ZuZC5vM2QuYXV0byJdKSA/IG1pbWV0eXBlLmVuYWJsZWRQbHVnaW4gPyAodGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLmhhc0NsaWVudDNEXyA9ICEwLCB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IubGVnYWN5UGx1Z2luXyA9ICEwLCB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IucGx1Z2luVmVyc2lvbl8gPSB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IucGFyc2VWZXJzaW9uXyhtaW1ldHlwZS5lbmFibGVkUGx1Z2luLmRlc2NyaXB0aW9uKSkgOiB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IubG9nZ2VyXy5pbmZvKCJPM0QgbWltZXR5cGUgbm90IGVuYWJsZWQuIikgOiB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IubG9nZ2VyXy5pbmZvKCJPM0QgbWltZXR5cGUgbm90IHJlZ2lzdGVyZWQuIikpCiAgICAgIH1lbHNlIHsKICAgICAgICB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IubG9nZ2VyXy53YXJuaW5nKCJHbG9iYWwgbmF2aWdhdG9yIG9iamVjdCBub3QgZGVmaW5lZC4iKQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IuaGFzQ2xpZW50M0RfCn07CnRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvci5wcm90b3R5cGUuaXNMZWdhY3lQbHVnaW4gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDbGllbnQzRERldGVjdG9yJCRpc0xlZ2FjeVBsdWdpbiQoKSB7CiAgcmV0dXJuIHRoaXMuaXNJbnN0YWxsZWQoKSA/IHRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvci5sZWdhY3lQbHVnaW5fIDogITEKfTsKdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLnBhcnNlVmVyc2lvbl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDbGllbnQzRERldGVjdG9yJHBhcnNlVmVyc2lvbl8kKGRlc2NyaXB0aW9uKSB7CiAgdmFyIHZlcnNpb24gPSBkZXNjcmlwdGlvbi5tYXRjaCgvXGQrKD86XC5cZCspKy8pOwogIHJldHVybiB2ZXJzaW9uICYmIHZlcnNpb25bMF0gPyB2ZXJzaW9uWzBdIDogIiIKfTsKdGFsay5tZWRpYS5DbGllbnQzRERldGVjdG9yLnByb3RvdHlwZS5nZXRWZXJzaW9uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2xpZW50M0REZXRlY3RvciQkZ2V0VmVyc2lvbiQoKSB7CiAgcmV0dXJuIHRoaXMuaXNJbnN0YWxsZWQoKSA/IHRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3Rvci5wbHVnaW5WZXJzaW9uXyA6IG51bGwKfTsKZ29vZy5tYXRoID0ge307Cmdvb2cubWF0aC5Db29yZGluYXRlID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRDb29yZGluYXRlJChvcHRfeCwgb3B0X3kpIHsKICB0aGlzLnggPSBnb29nLmlzRGVmKG9wdF94KSA/IG9wdF94IDogMDsKICB0aGlzLnkgPSBnb29nLmlzRGVmKG9wdF95KSA/IG9wdF95IDogMAp9Owpnb29nLm1hdGguQ29vcmRpbmF0ZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJENvb3JkaW5hdGUkJGNsb25lJCgpIHsKICByZXR1cm4gbmV3IGdvb2cubWF0aC5Db29yZGluYXRlKHRoaXMueCwgdGhpcy55KQp9Owpnb29nLkRFQlVHICYmIChnb29nLm1hdGguQ29vcmRpbmF0ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJENvb3JkaW5hdGUkJHRvU3RyaW5nJCgpIHsKICByZXR1cm4iKCIgKyB0aGlzLnggKyAiLCAiICsgdGhpcy55ICsgIikiCn0pOwpnb29nLm1hdGguQ29vcmRpbmF0ZS5lcXVhbHMgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJENvb3JkaW5hdGUkZXF1YWxzJChhLCBiKSB7CiAgcmV0dXJuIGEgPT0gYiA/ICEwIDogIWEgfHwgIWIgPyAhMSA6IGEueCA9PSBiLnggJiYgYS55ID09IGIueQp9Owpnb29nLm1hdGguQ29vcmRpbmF0ZS5kaXN0YW5jZSA9IGZ1bmN0aW9uICRnb29nJG1hdGgkQ29vcmRpbmF0ZSRkaXN0YW5jZSQoYSwgYikgewogIHZhciBkeCA9IGEueCAtIGIueCwgZHkgPSBhLnkgLSBiLnk7CiAgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkKfTsKZ29vZy5tYXRoLkNvb3JkaW5hdGUuc3F1YXJlZERpc3RhbmNlID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRDb29yZGluYXRlJHNxdWFyZWREaXN0YW5jZSQoYSwgYikgewogIHZhciBkeCA9IGEueCAtIGIueCwgZHkgPSBhLnkgLSBiLnk7CiAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5Cn07Cmdvb2cubWF0aC5Db29yZGluYXRlLmRpZmZlcmVuY2UgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJENvb3JkaW5hdGUkZGlmZmVyZW5jZSQoYSwgYikgewogIHJldHVybiBuZXcgZ29vZy5tYXRoLkNvb3JkaW5hdGUoYS54IC0gYi54LCBhLnkgLSBiLnkpCn07Cmdvb2cubWF0aC5Db29yZGluYXRlLnN1bSA9IGZ1bmN0aW9uICRnb29nJG1hdGgkQ29vcmRpbmF0ZSRzdW0kKGEsIGIpIHsKICByZXR1cm4gbmV3IGdvb2cubWF0aC5Db29yZGluYXRlKGEueCArIGIueCwgYS55ICsgYi55KQp9Owpnb29nLm1hdGguU2l6ZSA9IGZ1bmN0aW9uICRnb29nJG1hdGgkU2l6ZSQod2lkdGgsIGhlaWdodCkgewogIHRoaXMud2lkdGggPSB3aWR0aDsKICB0aGlzLmhlaWdodCA9IGhlaWdodAp9Owpnb29nLm1hdGguU2l6ZS5lcXVhbHMgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJFNpemUkZXF1YWxzJChhLCBiKSB7CiAgcmV0dXJuIGEgPT0gYiA/ICEwIDogIWEgfHwgIWIgPyAhMSA6IGEud2lkdGggPT0gYi53aWR0aCAmJiBhLmhlaWdodCA9PSBiLmhlaWdodAp9Owpnb29nLm1hdGguU2l6ZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJFNpemUkJGNsb25lJCgpIHsKICByZXR1cm4gbmV3IGdvb2cubWF0aC5TaXplKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KQp9Owpnb29nLkRFQlVHICYmIChnb29nLm1hdGguU2l6ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJFNpemUkJHRvU3RyaW5nJCgpIHsKICByZXR1cm4iKCIgKyB0aGlzLndpZHRoICsgIiB4ICIgKyB0aGlzLmhlaWdodCArICIpIgp9KTsKZ29vZy5tYXRoLlNpemUucHJvdG90eXBlLmFyZWEgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJFNpemUkJGFyZWEkKCkgewogIHJldHVybiB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQKfTsKZ29vZy5tYXRoLlNpemUucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJFNpemUkJGlzRW1wdHkkKCkgewogIHJldHVybiF0aGlzLmFyZWEoKQp9Owpnb29nLm1hdGguU2l6ZS5wcm90b3R5cGUuY2VpbCA9IGZ1bmN0aW9uICRnb29nJG1hdGgkU2l6ZSQkY2VpbCQoKSB7CiAgdGhpcy53aWR0aCA9IE1hdGguY2VpbCh0aGlzLndpZHRoKTsKICB0aGlzLmhlaWdodCA9IE1hdGguY2VpbCh0aGlzLmhlaWdodCk7CiAgcmV0dXJuIHRoaXMKfTsKZ29vZy5tYXRoLlNpemUucHJvdG90eXBlLmZsb29yID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRTaXplJCRmbG9vciQoKSB7CiAgdGhpcy53aWR0aCA9IE1hdGguZmxvb3IodGhpcy53aWR0aCk7CiAgdGhpcy5oZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMuaGVpZ2h0KTsKICByZXR1cm4gdGhpcwp9Owpnb29nLm1hdGguU2l6ZS5wcm90b3R5cGUucm91bmQgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJFNpemUkJHJvdW5kJCgpIHsKICB0aGlzLndpZHRoID0gTWF0aC5yb3VuZCh0aGlzLndpZHRoKTsKICB0aGlzLmhlaWdodCA9IE1hdGgucm91bmQodGhpcy5oZWlnaHQpOwogIHJldHVybiB0aGlzCn07Cmdvb2cubWF0aC5TaXplLnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uICRnb29nJG1hdGgkU2l6ZSQkc2NhbGUkKHMpIHsKICB0aGlzLndpZHRoICo9IHM7CiAgdGhpcy5oZWlnaHQgKj0gczsKICByZXR1cm4gdGhpcwp9Owpnb29nLmRvbSA9IHt9Owpnb29nLmRvbS5Ccm93c2VyRmVhdHVyZSA9IHtDQU5fQUREX05BTUVfT1JfVFlQRV9BVFRSSUJVVEVTOiFnb29nLnVzZXJBZ2VudC5JRSB8fCBnb29nLnVzZXJBZ2VudC5pc0RvY3VtZW50TW9kZSg5KSwgQ0FOX1VTRV9DSElMRFJFTl9BVFRSSUJVVEU6IWdvb2cudXNlckFnZW50LkdFQ0tPICYmICFnb29nLnVzZXJBZ2VudC5JRSB8fCBnb29nLnVzZXJBZ2VudC5JRSAmJiBnb29nLnVzZXJBZ2VudC5pc0RvY3VtZW50TW9kZSg5KSB8fCBnb29nLnVzZXJBZ2VudC5HRUNLTyAmJiBnb29nLnVzZXJBZ2VudC5pc1ZlcnNpb24oIjEuOS4xIiksIENBTl9VU0VfSU5ORVJfVEVYVDpnb29nLnVzZXJBZ2VudC5JRSAmJiAhZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uKCI5IiksIENBTl9VU0VfUEFSRU5UX0VMRU1FTlRfUFJPUEVSVFk6Z29vZy51c2VyQWdlbnQuSUUgfHwgZ29vZy51c2VyQWdlbnQuT1BFUkEgfHwgZ29vZy51c2VyQWdlbnQuV0VCS0lULCBJTk5FUl9IVE1MX05FRURTX1NDT1BFRF9FTEVNRU5UOmdvb2cudXNlckFnZW50LklFfTsKZ29vZy5kb20uY2xhc3NlcyA9IHt9Owpnb29nLmRvbS5jbGFzc2VzLnNldCA9IGZ1bmN0aW9uICRnb29nJGRvbSRjbGFzc2VzJHNldCQoZWxlbWVudCwgY2xhc3NOYW1lKSB7CiAgZWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc05hbWUKfTsKZ29vZy5kb20uY2xhc3Nlcy5nZXQgPSBmdW5jdGlvbiAkZ29vZyRkb20kY2xhc3NlcyRnZXQkKGVsZW1lbnQpIHsKICB2YXIgY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWU7CiAgcmV0dXJuIGdvb2cuaXNTdHJpbmcoY2xhc3NOYW1lKSAmJiBjbGFzc05hbWUubWF0Y2goL1xTKy9nKSB8fCBbXQp9Owpnb29nLmRvbS5jbGFzc2VzLmFkZCA9IGZ1bmN0aW9uICRnb29nJGRvbSRjbGFzc2VzJGFkZCQoZWxlbWVudCwgdmFyX2FyZ3MpIHsKICB2YXIgY2xhc3NlcyA9IGdvb2cuZG9tLmNsYXNzZXMuZ2V0KGVsZW1lbnQpLCBhcmdzID0gZ29vZy5hcnJheS5zbGljZShhcmd1bWVudHMsIDEpLCBleHBlY3RlZENvdW50ID0gY2xhc3Nlcy5sZW5ndGggKyBhcmdzLmxlbmd0aDsKICBnb29nLmRvbS5jbGFzc2VzLmFkZF8oY2xhc3NlcywgYXJncyk7CiAgZWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc2VzLmpvaW4oIiAiKTsKICByZXR1cm4gY2xhc3Nlcy5sZW5ndGggPT0gZXhwZWN0ZWRDb3VudAp9Owpnb29nLmRvbS5jbGFzc2VzLnJlbW92ZSA9IGZ1bmN0aW9uICRnb29nJGRvbSRjbGFzc2VzJHJlbW92ZSQoZWxlbWVudCwgdmFyX2FyZ3MpIHsKICB2YXIgY2xhc3NlcyA9IGdvb2cuZG9tLmNsYXNzZXMuZ2V0KGVsZW1lbnQpLCBhcmdzID0gZ29vZy5hcnJheS5zbGljZShhcmd1bWVudHMsIDEpLCBuZXdDbGFzc2VzID0gZ29vZy5kb20uY2xhc3Nlcy5nZXREaWZmZXJlbmNlXyhjbGFzc2VzLCBhcmdzKTsKICBlbGVtZW50LmNsYXNzTmFtZSA9IG5ld0NsYXNzZXMuam9pbigiICIpOwogIHJldHVybiBuZXdDbGFzc2VzLmxlbmd0aCA9PSBjbGFzc2VzLmxlbmd0aCAtIGFyZ3MubGVuZ3RoCn07Cmdvb2cuZG9tLmNsYXNzZXMuYWRkXyA9IGZ1bmN0aW9uICRnb29nJGRvbSRjbGFzc2VzJGFkZF8kKGNsYXNzZXMsIGFyZ3MpIHsKICBmb3IodmFyIGkgPSAwO2kgPCBhcmdzLmxlbmd0aDtpKyspIHsKICAgIGdvb2cuYXJyYXkuY29udGFpbnMoY2xhc3NlcywgYXJnc1tpXSkgfHwgY2xhc3Nlcy5wdXNoKGFyZ3NbaV0pCiAgfQp9Owpnb29nLmRvbS5jbGFzc2VzLmdldERpZmZlcmVuY2VfID0gZnVuY3Rpb24gJGdvb2ckZG9tJGNsYXNzZXMkZ2V0RGlmZmVyZW5jZV8kKGFycjEsIGFycjIpIHsKICByZXR1cm4gZ29vZy5hcnJheS5maWx0ZXIoYXJyMSwgZnVuY3Rpb24oaXRlbSkgewogICAgcmV0dXJuIWdvb2cuYXJyYXkuY29udGFpbnMoYXJyMiwgaXRlbSkKICB9KQp9Owpnb29nLmRvbS5jbGFzc2VzLnN3YXAgPSBmdW5jdGlvbiAkZ29vZyRkb20kY2xhc3NlcyRzd2FwJChlbGVtZW50LCBmcm9tQ2xhc3MsIHRvQ2xhc3MpIHsKICBmb3IodmFyIGNsYXNzZXMgPSBnb29nLmRvbS5jbGFzc2VzLmdldChlbGVtZW50KSwgcmVtb3ZlZCA9ICExLCBpID0gMDtpIDwgY2xhc3Nlcy5sZW5ndGg7aSsrKSB7CiAgICBjbGFzc2VzW2ldID09IGZyb21DbGFzcyAmJiAoZ29vZy5hcnJheS5zcGxpY2UoY2xhc3NlcywgaS0tLCAxKSwgcmVtb3ZlZCA9ICEwKQogIH0KICByZW1vdmVkICYmIChjbGFzc2VzLnB1c2godG9DbGFzcyksIGVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3Nlcy5qb2luKCIgIikpOwogIHJldHVybiByZW1vdmVkCn07Cmdvb2cuZG9tLmNsYXNzZXMuYWRkUmVtb3ZlID0gZnVuY3Rpb24gJGdvb2ckZG9tJGNsYXNzZXMkYWRkUmVtb3ZlJChlbGVtZW50LCBjbGFzc2VzVG9SZW1vdmUsIGNsYXNzZXNUb0FkZCkgewogIHZhciBjbGFzc2VzID0gZ29vZy5kb20uY2xhc3Nlcy5nZXQoZWxlbWVudCk7CiAgZ29vZy5pc1N0cmluZyhjbGFzc2VzVG9SZW1vdmUpID8gZ29vZy5hcnJheS5yZW1vdmUoY2xhc3NlcywgY2xhc3Nlc1RvUmVtb3ZlKSA6IGdvb2cuaXNBcnJheShjbGFzc2VzVG9SZW1vdmUpICYmIChjbGFzc2VzID0gZ29vZy5kb20uY2xhc3Nlcy5nZXREaWZmZXJlbmNlXyhjbGFzc2VzLCBjbGFzc2VzVG9SZW1vdmUpKTsKICBnb29nLmlzU3RyaW5nKGNsYXNzZXNUb0FkZCkgJiYgIWdvb2cuYXJyYXkuY29udGFpbnMoY2xhc3NlcywgY2xhc3Nlc1RvQWRkKSA/IGNsYXNzZXMucHVzaChjbGFzc2VzVG9BZGQpIDogZ29vZy5pc0FycmF5KGNsYXNzZXNUb0FkZCkgJiYgZ29vZy5kb20uY2xhc3Nlcy5hZGRfKGNsYXNzZXMsIGNsYXNzZXNUb0FkZCk7CiAgZWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc2VzLmpvaW4oIiAiKQp9Owpnb29nLmRvbS5jbGFzc2VzLmhhcyA9IGZ1bmN0aW9uICRnb29nJGRvbSRjbGFzc2VzJGhhcyQoZWxlbWVudCwgY2xhc3NOYW1lKSB7CiAgcmV0dXJuIGdvb2cuYXJyYXkuY29udGFpbnMoZ29vZy5kb20uY2xhc3Nlcy5nZXQoZWxlbWVudCksIGNsYXNzTmFtZSkKfTsKZ29vZy5kb20uY2xhc3Nlcy5lbmFibGUgPSBmdW5jdGlvbiAkZ29vZyRkb20kY2xhc3NlcyRlbmFibGUkKGVsZW1lbnQsIGNsYXNzTmFtZSwgZW5hYmxlZCkgewogIGVuYWJsZWQgPyBnb29nLmRvbS5jbGFzc2VzLmFkZChlbGVtZW50LCBjbGFzc05hbWUpIDogZ29vZy5kb20uY2xhc3Nlcy5yZW1vdmUoZWxlbWVudCwgY2xhc3NOYW1lKQp9Owpnb29nLmRvbS5jbGFzc2VzLnRvZ2dsZSA9IGZ1bmN0aW9uICRnb29nJGRvbSRjbGFzc2VzJHRvZ2dsZSQoZWxlbWVudCwgY2xhc3NOYW1lKSB7CiAgdmFyIGFkZCA9ICFnb29nLmRvbS5jbGFzc2VzLmhhcyhlbGVtZW50LCBjbGFzc05hbWUpOwogIGdvb2cuZG9tLmNsYXNzZXMuZW5hYmxlKGVsZW1lbnQsIGNsYXNzTmFtZSwgYWRkKTsKICByZXR1cm4gYWRkCn07Cmdvb2cuZG9tLlRhZ05hbWUgPSB7QToiQSIsIEFCQlI6IkFCQlIiLCBBQ1JPTllNOiJBQ1JPTllNIiwgQUREUkVTUzoiQUREUkVTUyIsIEFQUExFVDoiQVBQTEVUIiwgQVJFQToiQVJFQSIsIEFVRElPOiJBVURJTyIsIEI6IkIiLCBCQVNFOiJCQVNFIiwgQkFTRUZPTlQ6IkJBU0VGT05UIiwgQkRPOiJCRE8iLCBCSUc6IkJJRyIsIEJMT0NLUVVPVEU6IkJMT0NLUVVPVEUiLCBCT0RZOiJCT0RZIiwgQlI6IkJSIiwgQlVUVE9OOiJCVVRUT04iLCBDQU5WQVM6IkNBTlZBUyIsIENBUFRJT046IkNBUFRJT04iLCBDRU5URVI6IkNFTlRFUiIsIENJVEU6IkNJVEUiLCBDT0RFOiJDT0RFIiwgQ09MOiJDT0wiLCBDT0xHUk9VUDoiQ09MR1JPVVAiLCBERDoiREQiLCBERUw6IkRFTCIsIERGTjoiREZOIiwgRElSOiJESVIiLCBESVY6IkRJViIsIERMOiJETCIsIERUOiJEVCIsIEVNOiJFTSIsIEZJRUxEU0VUOiJGSUVMRFNFVCIsIEZPTlQ6IkZPTlQiLCBGT1JNOiJGT1JNIiwgRlJBTUU6IkZSQU1FIiwgCkZSQU1FU0VUOiJGUkFNRVNFVCIsIEgxOiJIMSIsIEgyOiJIMiIsIEgzOiJIMyIsIEg0OiJINCIsIEg1OiJINSIsIEg2OiJINiIsIEhFQUQ6IkhFQUQiLCBIUjoiSFIiLCBIVE1MOiJIVE1MIiwgSToiSSIsIElGUkFNRToiSUZSQU1FIiwgSU1HOiJJTUciLCBJTlBVVDoiSU5QVVQiLCBJTlM6IklOUyIsIElTSU5ERVg6IklTSU5ERVgiLCBLQkQ6IktCRCIsIExBQkVMOiJMQUJFTCIsIExFR0VORDoiTEVHRU5EIiwgTEk6IkxJIiwgTElOSzoiTElOSyIsIE1BUDoiTUFQIiwgTUVOVToiTUVOVSIsIE1FVEE6Ik1FVEEiLCBOT0ZSQU1FUzoiTk9GUkFNRVMiLCBOT1NDUklQVDoiTk9TQ1JJUFQiLCBPQkpFQ1Q6Ik9CSkVDVCIsIE9MOiJPTCIsIE9QVEdST1VQOiJPUFRHUk9VUCIsIE9QVElPTjoiT1BUSU9OIiwgUDoiUCIsIFBBUkFNOiJQQVJBTSIsIFBSRToiUFJFIiwgUToiUSIsIFM6IlMiLCBTQU1QOiJTQU1QIiwgU0NSSVBUOiJTQ1JJUFQiLCBTRUxFQ1Q6IlNFTEVDVCIsIFNNQUxMOiJTTUFMTCIsIApTUEFOOiJTUEFOIiwgU1RSSUtFOiJTVFJJS0UiLCBTVFJPTkc6IlNUUk9ORyIsIFNUWUxFOiJTVFlMRSIsIFNVQjoiU1VCIiwgU1VQOiJTVVAiLCBUQUJMRToiVEFCTEUiLCBUQk9EWToiVEJPRFkiLCBURDoiVEQiLCBURVhUQVJFQToiVEVYVEFSRUEiLCBURk9PVDoiVEZPT1QiLCBUSDoiVEgiLCBUSEVBRDoiVEhFQUQiLCBUSVRMRToiVElUTEUiLCBUUjoiVFIiLCBUVDoiVFQiLCBVOiJVIiwgVUw6IlVMIiwgVkFSOiJWQVIiLCBWSURFTzoiVklERU8ifTsKZ29vZy5kb20uQVNTVU1FX1FVSVJLU19NT0RFID0gITE7Cmdvb2cuZG9tLkFTU1VNRV9TVEFOREFSRFNfTU9ERSA9ICExOwpnb29nLmRvbS5DT01QQVRfTU9ERV9LTk9XTl8gPSBnb29nLmRvbS5BU1NVTUVfUVVJUktTX01PREUgfHwgZ29vZy5kb20uQVNTVU1FX1NUQU5EQVJEU19NT0RFOwpnb29nLmRvbS5Ob2RlVHlwZSA9IHtFTEVNRU5UOjEsIEFUVFJJQlVURToyLCBURVhUOjMsIENEQVRBX1NFQ1RJT046NCwgRU5USVRZX1JFRkVSRU5DRTo1LCBFTlRJVFk6NiwgUFJPQ0VTU0lOR19JTlNUUlVDVElPTjo3LCBDT01NRU5UOjgsIERPQ1VNRU5UOjksIERPQ1VNRU5UX1RZUEU6MTAsIERPQ1VNRU5UX0ZSQUdNRU5UOjExLCBOT1RBVElPTjoxMn07Cmdvb2cuZG9tLmdldERvbUhlbHBlciA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXREb21IZWxwZXIkKG9wdF9lbGVtZW50KSB7CiAgcmV0dXJuIG9wdF9lbGVtZW50ID8gbmV3IGdvb2cuZG9tLkRvbUhlbHBlcihnb29nLmRvbS5nZXRPd25lckRvY3VtZW50KG9wdF9lbGVtZW50KSkgOiBnb29nLmRvbS5kZWZhdWx0RG9tSGVscGVyXyB8fCAoZ29vZy5kb20uZGVmYXVsdERvbUhlbHBlcl8gPSBuZXcgZ29vZy5kb20uRG9tSGVscGVyKQp9Owpnb29nLmRvbS5nZXREb2N1bWVudCA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXREb2N1bWVudCQoKSB7CiAgcmV0dXJuIGRvY3VtZW50Cn07Cmdvb2cuZG9tLmdldEVsZW1lbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0RWxlbWVudCQoZWxlbWVudCkgewogIHJldHVybiBnb29nLmlzU3RyaW5nKGVsZW1lbnQpID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCkgOiBlbGVtZW50Cn07Cmdvb2cuZG9tLiQgPSBnb29nLmRvbS5nZXRFbGVtZW50Owpnb29nLmRvbS5nZXRFbGVtZW50c0J5VGFnTmFtZUFuZENsYXNzID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldEVsZW1lbnRzQnlUYWdOYW1lQW5kQ2xhc3MkKG9wdF90YWcsIG9wdF9jbGFzcywgb3B0X2VsKSB7CiAgcmV0dXJuIGdvb2cuZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lQW5kQ2xhc3NfKGRvY3VtZW50LCBvcHRfdGFnLCBvcHRfY2xhc3MsIG9wdF9lbCkKfTsKZ29vZy5kb20uZ2V0RWxlbWVudHNCeUNsYXNzID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldEVsZW1lbnRzQnlDbGFzcyQoY2xhc3NOYW1lLCBvcHRfZWwpIHsKICB2YXIgcGFyZW50ID0gb3B0X2VsIHx8IGRvY3VtZW50OwogIHJldHVybiBnb29nLmRvbS5jYW5Vc2VRdWVyeVNlbGVjdG9yXyhwYXJlbnQpID8gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi4iICsgY2xhc3NOYW1lKSA6IHBhcmVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID8gcGFyZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lKSA6IGdvb2cuZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lQW5kQ2xhc3NfKGRvY3VtZW50LCAiKiIsIGNsYXNzTmFtZSwgb3B0X2VsKQp9Owpnb29nLmRvbS5nZXRFbGVtZW50QnlDbGFzcyA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRFbGVtZW50QnlDbGFzcyQoY2xhc3NOYW1lLCBvcHRfZWwpIHsKICB2YXIgcGFyZW50ID0gb3B0X2VsIHx8IGRvY3VtZW50LCByZXRWYWwgPSBudWxsOwogIHJldHVybihyZXRWYWwgPSBnb29nLmRvbS5jYW5Vc2VRdWVyeVNlbGVjdG9yXyhwYXJlbnQpID8gcGFyZW50LnF1ZXJ5U2VsZWN0b3IoIi4iICsgY2xhc3NOYW1lKSA6IGdvb2cuZG9tLmdldEVsZW1lbnRzQnlDbGFzcyhjbGFzc05hbWUsIG9wdF9lbClbMF0pIHx8IG51bGwKfTsKZ29vZy5kb20uY2FuVXNlUXVlcnlTZWxlY3Rvcl8gPSBmdW5jdGlvbiAkZ29vZyRkb20kY2FuVXNlUXVlcnlTZWxlY3Rvcl8kKHBhcmVudCkgewogIHJldHVybiBwYXJlbnQucXVlcnlTZWxlY3RvckFsbCAmJiBwYXJlbnQucXVlcnlTZWxlY3RvciAmJiAoIWdvb2cudXNlckFnZW50LldFQktJVCB8fCBnb29nLmRvbS5pc0NzczFDb21wYXRNb2RlXyhkb2N1bWVudCkgfHwgZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uKCI1MjgiKSkKfTsKZ29vZy5kb20uZ2V0RWxlbWVudHNCeVRhZ05hbWVBbmRDbGFzc18gPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0RWxlbWVudHNCeVRhZ05hbWVBbmRDbGFzc18kKGRvYywgb3B0X3RhZywgb3B0X2NsYXNzLCBvcHRfZWwpIHsKICB2YXIgcGFyZW50ID0gb3B0X2VsIHx8IGRvYywgdGFnTmFtZSA9IG9wdF90YWcgJiYgIioiICE9IG9wdF90YWcgPyBvcHRfdGFnLnRvVXBwZXJDYXNlKCkgOiAiIjsKICBpZihnb29nLmRvbS5jYW5Vc2VRdWVyeVNlbGVjdG9yXyhwYXJlbnQpICYmICh0YWdOYW1lIHx8IG9wdF9jbGFzcykpIHsKICAgIHZhciBxdWVyeSA9IHRhZ05hbWUgKyAob3B0X2NsYXNzID8gIi4iICsgb3B0X2NsYXNzIDogIiIpOwogICAgcmV0dXJuIHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KQogIH0KICBpZihvcHRfY2xhc3MgJiYgcGFyZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpIHsKICAgIHZhciBlbHMgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShvcHRfY2xhc3MpOwogICAgaWYodGFnTmFtZSkgewogICAgICBmb3IodmFyIGFycmF5TGlrZSA9IHt9LCBsZW4gPSAwLCBpID0gMCwgZWw7ZWwgPSBlbHNbaV07aSsrKSB7CiAgICAgICAgdGFnTmFtZSA9PSBlbC5ub2RlTmFtZSAmJiAoYXJyYXlMaWtlW2xlbisrXSA9IGVsKQogICAgICB9CiAgICAgIGFycmF5TGlrZS5sZW5ndGggPSBsZW47CiAgICAgIHJldHVybiBhcnJheUxpa2UKICAgIH0KICAgIHJldHVybiBlbHMKICB9CiAgZWxzID0gcGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUgfHwgIioiKTsKICBpZihvcHRfY2xhc3MpIHsKICAgIGFycmF5TGlrZSA9IHt9OwogICAgZm9yKGkgPSBsZW4gPSAwO2VsID0gZWxzW2ldO2krKykgewogICAgICB2YXIgY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lOwogICAgICAiZnVuY3Rpb24iID09IHR5cGVvZiBjbGFzc05hbWUuc3BsaXQgJiYgZ29vZy5hcnJheS5jb250YWlucyhjbGFzc05hbWUuc3BsaXQoL1xzKy8pLCBvcHRfY2xhc3MpICYmIChhcnJheUxpa2VbbGVuKytdID0gZWwpCiAgICB9CiAgICBhcnJheUxpa2UubGVuZ3RoID0gbGVuOwogICAgcmV0dXJuIGFycmF5TGlrZQogIH0KICByZXR1cm4gZWxzCn07Cmdvb2cuZG9tLiQkID0gZ29vZy5kb20uZ2V0RWxlbWVudHNCeVRhZ05hbWVBbmRDbGFzczsKZ29vZy5kb20uc2V0UHJvcGVydGllcyA9IGZ1bmN0aW9uICRnb29nJGRvbSRzZXRQcm9wZXJ0aWVzJChlbGVtZW50LCBwcm9wZXJ0aWVzKSB7CiAgZ29vZy5vYmplY3QuZm9yRWFjaChwcm9wZXJ0aWVzLCBmdW5jdGlvbih2YWwsIGtleSkgewogICAgInN0eWxlIiA9PSBrZXkgPyBlbGVtZW50LnN0eWxlLmNzc1RleHQgPSB2YWwgOiAiY2xhc3MiID09IGtleSA/IGVsZW1lbnQuY2xhc3NOYW1lID0gdmFsIDogImZvciIgPT0ga2V5ID8gZWxlbWVudC5odG1sRm9yID0gdmFsIDoga2V5IGluIGdvb2cuZG9tLkRJUkVDVF9BVFRSSUJVVEVfTUFQXyA/IGVsZW1lbnQuc2V0QXR0cmlidXRlKGdvb2cuZG9tLkRJUkVDVF9BVFRSSUJVVEVfTUFQX1trZXldLCB2YWwpIDogZ29vZy5zdHJpbmcuc3RhcnRzV2l0aChrZXksICJhcmlhLSIpID8gZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWwpIDogZWxlbWVudFtrZXldID0gdmFsCiAgfSkKfTsKZ29vZy5kb20uRElSRUNUX0FUVFJJQlVURV9NQVBfID0ge2NlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIsIGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsIGNvbHNwYW46ImNvbFNwYW4iLCByb3dzcGFuOiJyb3dTcGFuIiwgdmFsaWduOiJ2QWxpZ24iLCBoZWlnaHQ6ImhlaWdodCIsIHdpZHRoOiJ3aWR0aCIsIHVzZW1hcDoidXNlTWFwIiwgZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIiwgbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLCB0eXBlOiJ0eXBlIn07Cmdvb2cuZG9tLmdldFZpZXdwb3J0U2l6ZSA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRWaWV3cG9ydFNpemUkKG9wdF93aW5kb3cpIHsKICByZXR1cm4gZ29vZy5kb20uZ2V0Vmlld3BvcnRTaXplXyhvcHRfd2luZG93IHx8IHdpbmRvdykKfTsKZ29vZy5kb20uZ2V0Vmlld3BvcnRTaXplXyA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRWaWV3cG9ydFNpemVfJCh3aW4pIHsKICB2YXIgZG9jID0gd2luLmRvY3VtZW50OwogIGlmKGdvb2cudXNlckFnZW50LldFQktJVCAmJiAhZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uKCI1MDAiKSAmJiAhZ29vZy51c2VyQWdlbnQuTU9CSUxFKSB7CiAgICAidW5kZWZpbmVkIiA9PSB0eXBlb2Ygd2luLmlubmVySGVpZ2h0ICYmICh3aW4gPSB3aW5kb3cpOwogICAgdmFyIGlubmVySGVpZ2h0ID0gd2luLmlubmVySGVpZ2h0LCBzY3JvbGxIZWlnaHQgPSB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDsKICAgIHdpbiA9PSB3aW4udG9wICYmIHNjcm9sbEhlaWdodCA8IGlubmVySGVpZ2h0ICYmIChpbm5lckhlaWdodCAtPSAxNSk7CiAgICByZXR1cm4gbmV3IGdvb2cubWF0aC5TaXplKHdpbi5pbm5lcldpZHRoLCBpbm5lckhlaWdodCkKICB9CiAgdmFyIGVsID0gZ29vZy5kb20uaXNDc3MxQ29tcGF0TW9kZV8oZG9jKSA/IGRvYy5kb2N1bWVudEVsZW1lbnQgOiBkb2MuYm9keTsKICByZXR1cm4gbmV3IGdvb2cubWF0aC5TaXplKGVsLmNsaWVudFdpZHRoLCBlbC5jbGllbnRIZWlnaHQpCn07Cmdvb2cuZG9tLmdldERvY3VtZW50SGVpZ2h0ID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldERvY3VtZW50SGVpZ2h0JCgpIHsKICByZXR1cm4gZ29vZy5kb20uZ2V0RG9jdW1lbnRIZWlnaHRfKHdpbmRvdykKfTsKZ29vZy5kb20uZ2V0RG9jdW1lbnRIZWlnaHRfID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldERvY3VtZW50SGVpZ2h0XyQod2luKSB7CiAgdmFyIGRvYyA9IHdpbi5kb2N1bWVudCwgaGVpZ2h0ID0gMDsKICBpZihkb2MpIHsKICAgIHZhciB2aCA9IGdvb2cuZG9tLmdldFZpZXdwb3J0U2l6ZV8od2luKS5oZWlnaHQsIGJvZHkgPSBkb2MuYm9keSwgZG9jRWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50OwogICAgaWYoZ29vZy5kb20uaXNDc3MxQ29tcGF0TW9kZV8oZG9jKSAmJiBkb2NFbC5zY3JvbGxIZWlnaHQpIHsKICAgICAgaGVpZ2h0ID0gZG9jRWwuc2Nyb2xsSGVpZ2h0ICE9IHZoID8gZG9jRWwuc2Nyb2xsSGVpZ2h0IDogZG9jRWwub2Zmc2V0SGVpZ2h0CiAgICB9ZWxzZSB7CiAgICAgIHZhciBzaCA9IGRvY0VsLnNjcm9sbEhlaWdodCwgb2ggPSBkb2NFbC5vZmZzZXRIZWlnaHQ7CiAgICAgIGRvY0VsLmNsaWVudEhlaWdodCAhPSBvaCAmJiAoc2ggPSBib2R5LnNjcm9sbEhlaWdodCwgb2ggPSBib2R5Lm9mZnNldEhlaWdodCk7CiAgICAgIGhlaWdodCA9IHNoID4gdmggPyBzaCA+IG9oID8gc2ggOiBvaCA6IHNoIDwgb2ggPyBzaCA6IG9oCiAgICB9CiAgfQogIHJldHVybiBoZWlnaHQKfTsKZ29vZy5kb20uZ2V0UGFnZVNjcm9sbCA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRQYWdlU2Nyb2xsJChvcHRfd2luZG93KSB7CiAgdmFyIHdpbiA9IG9wdF93aW5kb3cgfHwgZ29vZy5nbG9iYWwgfHwgd2luZG93OwogIHJldHVybiBnb29nLmRvbS5nZXREb21IZWxwZXIod2luLmRvY3VtZW50KS5nZXREb2N1bWVudFNjcm9sbCgpCn07Cmdvb2cuZG9tLmdldERvY3VtZW50U2Nyb2xsID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldERvY3VtZW50U2Nyb2xsJCgpIHsKICByZXR1cm4gZ29vZy5kb20uZ2V0RG9jdW1lbnRTY3JvbGxfKGRvY3VtZW50KQp9Owpnb29nLmRvbS5nZXREb2N1bWVudFNjcm9sbF8gPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0RG9jdW1lbnRTY3JvbGxfJChkb2MpIHsKICB2YXIgZWwgPSBnb29nLmRvbS5nZXREb2N1bWVudFNjcm9sbEVsZW1lbnRfKGRvYyksIHdpbiA9IGdvb2cuZG9tLmdldFdpbmRvd18oZG9jKTsKICByZXR1cm4gbmV3IGdvb2cubWF0aC5Db29yZGluYXRlKHdpbi5wYWdlWE9mZnNldCB8fCBlbC5zY3JvbGxMZWZ0LCB3aW4ucGFnZVlPZmZzZXQgfHwgZWwuc2Nyb2xsVG9wKQp9Owpnb29nLmRvbS5nZXREb2N1bWVudFNjcm9sbEVsZW1lbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0RG9jdW1lbnRTY3JvbGxFbGVtZW50JCgpIHsKICByZXR1cm4gZ29vZy5kb20uZ2V0RG9jdW1lbnRTY3JvbGxFbGVtZW50Xyhkb2N1bWVudCkKfTsKZ29vZy5kb20uZ2V0RG9jdW1lbnRTY3JvbGxFbGVtZW50XyA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXREb2N1bWVudFNjcm9sbEVsZW1lbnRfJChkb2MpIHsKICByZXR1cm4hZ29vZy51c2VyQWdlbnQuV0VCS0lUICYmIGdvb2cuZG9tLmlzQ3NzMUNvbXBhdE1vZGVfKGRvYykgPyBkb2MuZG9jdW1lbnRFbGVtZW50IDogZG9jLmJvZHkKfTsKZ29vZy5kb20uZ2V0V2luZG93ID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldFdpbmRvdyQob3B0X2RvYykgewogIHJldHVybiBvcHRfZG9jID8gZ29vZy5kb20uZ2V0V2luZG93XyhvcHRfZG9jKSA6IHdpbmRvdwp9Owpnb29nLmRvbS5nZXRXaW5kb3dfID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldFdpbmRvd18kKGRvYykgewogIHJldHVybiBkb2MucGFyZW50V2luZG93IHx8IGRvYy5kZWZhdWx0Vmlldwp9Owpnb29nLmRvbS5jcmVhdGVEb20gPSBmdW5jdGlvbiAkZ29vZyRkb20kY3JlYXRlRG9tJCh0YWdOYW1lLCBvcHRfYXR0cmlidXRlcywgdmFyX2FyZ3MpIHsKICByZXR1cm4gZ29vZy5kb20uY3JlYXRlRG9tXyhkb2N1bWVudCwgYXJndW1lbnRzKQp9Owpnb29nLmRvbS5jcmVhdGVEb21fID0gZnVuY3Rpb24gJGdvb2ckZG9tJGNyZWF0ZURvbV8kKGRvYywgYXJncykgewogIHZhciB0YWdOYW1lID0gYXJnc1swXSwgYXR0cmlidXRlcyA9IGFyZ3NbMV07CiAgaWYoIWdvb2cuZG9tLkJyb3dzZXJGZWF0dXJlLkNBTl9BRERfTkFNRV9PUl9UWVBFX0FUVFJJQlVURVMgJiYgYXR0cmlidXRlcyAmJiAoYXR0cmlidXRlcy5uYW1lIHx8IGF0dHJpYnV0ZXMudHlwZSkpIHsKICAgIHZhciB0YWdOYW1lQXJyID0gWyI8IiwgdGFnTmFtZV07CiAgICBhdHRyaWJ1dGVzLm5hbWUgJiYgdGFnTmFtZUFyci5wdXNoKCcgbmFtZT0iJywgZ29vZy5zdHJpbmcuaHRtbEVzY2FwZShhdHRyaWJ1dGVzLm5hbWUpLCAnIicpOwogICAgaWYoYXR0cmlidXRlcy50eXBlKSB7CiAgICAgIHRhZ05hbWVBcnIucHVzaCgnIHR5cGU9IicsIGdvb2cuc3RyaW5nLmh0bWxFc2NhcGUoYXR0cmlidXRlcy50eXBlKSwgJyInKTsKICAgICAgdmFyIGNsb25lID0ge307CiAgICAgIGdvb2cub2JqZWN0LmV4dGVuZChjbG9uZSwgYXR0cmlidXRlcyk7CiAgICAgIGF0dHJpYnV0ZXMgPSBjbG9uZTsKICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMudHlwZQogICAgfQogICAgdGFnTmFtZUFyci5wdXNoKCI+Iik7CiAgICB0YWdOYW1lID0gdGFnTmFtZUFyci5qb2luKCIiKQogIH0KICB2YXIgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwogIGF0dHJpYnV0ZXMgJiYgKGdvb2cuaXNTdHJpbmcoYXR0cmlidXRlcykgPyBlbGVtZW50LmNsYXNzTmFtZSA9IGF0dHJpYnV0ZXMgOiBnb29nLmlzQXJyYXkoYXR0cmlidXRlcykgPyBnb29nLmRvbS5jbGFzc2VzLmFkZC5hcHBseShudWxsLCBbZWxlbWVudF0uY29uY2F0KGF0dHJpYnV0ZXMpKSA6IGdvb2cuZG9tLnNldFByb3BlcnRpZXMoZWxlbWVudCwgYXR0cmlidXRlcykpOwogIDIgPCBhcmdzLmxlbmd0aCAmJiBnb29nLmRvbS5hcHBlbmRfKGRvYywgZWxlbWVudCwgYXJncywgMik7CiAgcmV0dXJuIGVsZW1lbnQKfTsKZ29vZy5kb20uYXBwZW5kXyA9IGZ1bmN0aW9uICRnb29nJGRvbSRhcHBlbmRfJChkb2MsIHBhcmVudCwgYXJncywgc3RhcnRJbmRleCkgewogIGZ1bmN0aW9uIGNoaWxkSGFuZGxlcihjaGlsZCkgewogICAgY2hpbGQgJiYgcGFyZW50LmFwcGVuZENoaWxkKGdvb2cuaXNTdHJpbmcoY2hpbGQpID8gZG9jLmNyZWF0ZVRleHROb2RlKGNoaWxkKSA6IGNoaWxkKQogIH0KICBmb3IodmFyIGkgPSBzdGFydEluZGV4O2kgPCBhcmdzLmxlbmd0aDtpKyspIHsKICAgIHZhciBhcmcgPSBhcmdzW2ldOwogICAgZ29vZy5pc0FycmF5TGlrZShhcmcpICYmICFnb29nLmRvbS5pc05vZGVMaWtlKGFyZykgPyBnb29nLmFycmF5LmZvckVhY2goZ29vZy5kb20uaXNOb2RlTGlzdChhcmcpID8gZ29vZy5hcnJheS5jbG9uZShhcmcpIDogYXJnLCBjaGlsZEhhbmRsZXIpIDogY2hpbGRIYW5kbGVyKGFyZykKICB9Cn07Cmdvb2cuZG9tLiRkb20gPSBnb29nLmRvbS5jcmVhdGVEb207Cmdvb2cuZG9tLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kY3JlYXRlRWxlbWVudCQobmFtZSkgewogIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpCn07Cmdvb2cuZG9tLmNyZWF0ZVRleHROb2RlID0gZnVuY3Rpb24gJGdvb2ckZG9tJGNyZWF0ZVRleHROb2RlJChjb250ZW50KSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpCn07Cmdvb2cuZG9tLmNyZWF0ZVRhYmxlID0gZnVuY3Rpb24gJGdvb2ckZG9tJGNyZWF0ZVRhYmxlJChyb3dzLCBjb2x1bW5zLCBvcHRfZmlsbFdpdGhOYnNwKSB7CiAgcmV0dXJuIGdvb2cuZG9tLmNyZWF0ZVRhYmxlXyhkb2N1bWVudCwgcm93cywgY29sdW1ucywgISFvcHRfZmlsbFdpdGhOYnNwKQp9Owpnb29nLmRvbS5jcmVhdGVUYWJsZV8gPSBmdW5jdGlvbiAkZ29vZyRkb20kY3JlYXRlVGFibGVfJChkb2MsIHJvd3MsIGNvbHVtbnMsIGZpbGxXaXRoTmJzcCkgewogIGZvcih2YXIgcm93SHRtbCA9IFsiPHRyPiJdLCBpID0gMDtpIDwgY29sdW1ucztpKyspIHsKICAgIHJvd0h0bWwucHVzaChmaWxsV2l0aE5ic3AgPyAiPHRkPiZuYnNwOzwvdGQ+IiA6ICI8dGQ+PC90ZD4iKQogIH0KICByb3dIdG1sLnB1c2goIjwvdHI+Iik7CiAgZm9yKHZhciByb3dIdG1sID0gcm93SHRtbC5qb2luKCIiKSwgdG90YWxIdG1sID0gWyI8dGFibGU+Il0sIGkgPSAwO2kgPCByb3dzO2krKykgewogICAgdG90YWxIdG1sLnB1c2gocm93SHRtbCkKICB9CiAgdG90YWxIdG1sLnB1c2goIjwvdGFibGU+Iik7CiAgdmFyIGVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudChnb29nLmRvbS5UYWdOYW1lLkRJVik7CiAgZWxlbS5pbm5lckhUTUwgPSB0b3RhbEh0bWwuam9pbigiIik7CiAgcmV0dXJuIGVsZW0ucmVtb3ZlQ2hpbGQoZWxlbS5maXJzdENoaWxkKQp9Owpnb29nLmRvbS5odG1sVG9Eb2N1bWVudEZyYWdtZW50ID0gZnVuY3Rpb24gJGdvb2ckZG9tJGh0bWxUb0RvY3VtZW50RnJhZ21lbnQkKGh0bWxTdHJpbmcpIHsKICByZXR1cm4gZ29vZy5kb20uaHRtbFRvRG9jdW1lbnRGcmFnbWVudF8oZG9jdW1lbnQsIGh0bWxTdHJpbmcpCn07Cmdvb2cuZG9tLmh0bWxUb0RvY3VtZW50RnJhZ21lbnRfID0gZnVuY3Rpb24gJGdvb2ckZG9tJGh0bWxUb0RvY3VtZW50RnJhZ21lbnRfJChkb2MsIGh0bWxTdHJpbmcpIHsKICB2YXIgdGVtcERpdiA9IGRvYy5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICBnb29nLmRvbS5Ccm93c2VyRmVhdHVyZS5JTk5FUl9IVE1MX05FRURTX1NDT1BFRF9FTEVNRU5UID8gKHRlbXBEaXYuaW5uZXJIVE1MID0gIjxicj4iICsgaHRtbFN0cmluZywgdGVtcERpdi5yZW1vdmVDaGlsZCh0ZW1wRGl2LmZpcnN0Q2hpbGQpKSA6IHRlbXBEaXYuaW5uZXJIVE1MID0gaHRtbFN0cmluZzsKICBpZigxID09IHRlbXBEaXYuY2hpbGROb2Rlcy5sZW5ndGgpIHsKICAgIHJldHVybiB0ZW1wRGl2LnJlbW92ZUNoaWxkKHRlbXBEaXYuZmlyc3RDaGlsZCkKICB9CiAgZm9yKHZhciBmcmFnbWVudCA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7dGVtcERpdi5maXJzdENoaWxkOykgewogICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGVtcERpdi5maXJzdENoaWxkKQogIH0KICByZXR1cm4gZnJhZ21lbnQKfTsKZ29vZy5kb20uZ2V0Q29tcGF0TW9kZSA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRDb21wYXRNb2RlJCgpIHsKICByZXR1cm4gZ29vZy5kb20uaXNDc3MxQ29tcGF0TW9kZSgpID8gIkNTUzFDb21wYXQiIDogIkJhY2tDb21wYXQiCn07Cmdvb2cuZG9tLmlzQ3NzMUNvbXBhdE1vZGUgPSBmdW5jdGlvbiAkZ29vZyRkb20kaXNDc3MxQ29tcGF0TW9kZSQoKSB7CiAgcmV0dXJuIGdvb2cuZG9tLmlzQ3NzMUNvbXBhdE1vZGVfKGRvY3VtZW50KQp9Owpnb29nLmRvbS5pc0NzczFDb21wYXRNb2RlXyA9IGZ1bmN0aW9uICRnb29nJGRvbSRpc0NzczFDb21wYXRNb2RlXyQoZG9jKSB7CiAgcmV0dXJuIGdvb2cuZG9tLkNPTVBBVF9NT0RFX0tOT1dOXyA/IGdvb2cuZG9tLkFTU1VNRV9TVEFOREFSRFNfTU9ERSA6ICJDU1MxQ29tcGF0IiA9PSBkb2MuY29tcGF0TW9kZQp9Owpnb29nLmRvbS5jYW5IYXZlQ2hpbGRyZW4gPSBmdW5jdGlvbiAkZ29vZyRkb20kY2FuSGF2ZUNoaWxkcmVuJChub2RlKSB7CiAgaWYobm9kZS5ub2RlVHlwZSAhPSBnb29nLmRvbS5Ob2RlVHlwZS5FTEVNRU5UKSB7CiAgICByZXR1cm4hMQogIH0KICBzd2l0Y2gobm9kZS50YWdOYW1lKSB7CiAgICBjYXNlIGdvb2cuZG9tLlRhZ05hbWUuQVBQTEVUOgogICAgOwogICAgY2FzZSBnb29nLmRvbS5UYWdOYW1lLkFSRUE6CiAgICA7CiAgICBjYXNlIGdvb2cuZG9tLlRhZ05hbWUuQkFTRToKICAgIDsKICAgIGNhc2UgZ29vZy5kb20uVGFnTmFtZS5CUjoKICAgIDsKICAgIGNhc2UgZ29vZy5kb20uVGFnTmFtZS5DT0w6CiAgICA7CiAgICBjYXNlIGdvb2cuZG9tLlRhZ05hbWUuRlJBTUU6CiAgICA7CiAgICBjYXNlIGdvb2cuZG9tLlRhZ05hbWUuSFI6CiAgICA7CiAgICBjYXNlIGdvb2cuZG9tLlRhZ05hbWUuSU1HOgogICAgOwogICAgY2FzZSBnb29nLmRvbS5UYWdOYW1lLklOUFVUOgogICAgOwogICAgY2FzZSBnb29nLmRvbS5UYWdOYW1lLklGUkFNRToKICAgIDsKICAgIGNhc2UgZ29vZy5kb20uVGFnTmFtZS5JU0lOREVYOgogICAgOwogICAgY2FzZSBnb29nLmRvbS5UYWdOYW1lLkxJTks6CiAgICA7CiAgICBjYXNlIGdvb2cuZG9tLlRhZ05hbWUuTk9GUkFNRVM6CiAgICA7CiAgICBjYXNlIGdvb2cuZG9tLlRhZ05hbWUuTk9TQ1JJUFQ6CiAgICA7CiAgICBjYXNlIGdvb2cuZG9tLlRhZ05hbWUuTUVUQToKICAgIDsKICAgIGNhc2UgZ29vZy5kb20uVGFnTmFtZS5PQkpFQ1Q6CiAgICA7CiAgICBjYXNlIGdvb2cuZG9tLlRhZ05hbWUuUEFSQU06CiAgICA7CiAgICBjYXNlIGdvb2cuZG9tLlRhZ05hbWUuU0NSSVBUOgogICAgOwogICAgY2FzZSBnb29nLmRvbS5UYWdOYW1lLlNUWUxFOgogICAgICByZXR1cm4hMQogIH0KICByZXR1cm4hMAp9Owpnb29nLmRvbS5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uICRnb29nJGRvbSRhcHBlbmRDaGlsZCQocGFyZW50LCBjaGlsZCkgewogIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCkKfTsKZ29vZy5kb20uYXBwZW5kID0gZnVuY3Rpb24gJGdvb2ckZG9tJGFwcGVuZCQocGFyZW50LCB2YXJfYXJncykgewogIGdvb2cuZG9tLmFwcGVuZF8oZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudChwYXJlbnQpLCBwYXJlbnQsIGFyZ3VtZW50cywgMSkKfTsKZ29vZy5kb20ucmVtb3ZlQ2hpbGRyZW4gPSBmdW5jdGlvbiAkZ29vZyRkb20kcmVtb3ZlQ2hpbGRyZW4kKG5vZGUpIHsKICBmb3IodmFyIGNoaWxkO2NoaWxkID0gbm9kZS5maXJzdENoaWxkOykgewogICAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCkKICB9Cn07Cmdvb2cuZG9tLmluc2VydFNpYmxpbmdCZWZvcmUgPSBmdW5jdGlvbiAkZ29vZyRkb20kaW5zZXJ0U2libGluZ0JlZm9yZSQobmV3Tm9kZSwgcmVmTm9kZSkgewogIHJlZk5vZGUucGFyZW50Tm9kZSAmJiByZWZOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZk5vZGUpCn07Cmdvb2cuZG9tLmluc2VydFNpYmxpbmdBZnRlciA9IGZ1bmN0aW9uICRnb29nJGRvbSRpbnNlcnRTaWJsaW5nQWZ0ZXIkKG5ld05vZGUsIHJlZk5vZGUpIHsKICByZWZOb2RlLnBhcmVudE5vZGUgJiYgcmVmTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZOb2RlLm5leHRTaWJsaW5nKQp9Owpnb29nLmRvbS5pbnNlcnRDaGlsZEF0ID0gZnVuY3Rpb24gJGdvb2ckZG9tJGluc2VydENoaWxkQXQkKHBhcmVudCwgY2hpbGQsIGluZGV4KSB7CiAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgcGFyZW50LmNoaWxkTm9kZXNbaW5kZXhdIHx8IG51bGwpCn07Cmdvb2cuZG9tLnJlbW92ZU5vZGUgPSBmdW5jdGlvbiAkZ29vZyRkb20kcmVtb3ZlTm9kZSQobm9kZSkgewogIHJldHVybiBub2RlICYmIG5vZGUucGFyZW50Tm9kZSA/IG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKSA6IG51bGwKfTsKZ29vZy5kb20ucmVwbGFjZU5vZGUgPSBmdW5jdGlvbiAkZ29vZyRkb20kcmVwbGFjZU5vZGUkKG5ld05vZGUsIG9sZE5vZGUpIHsKICB2YXIgcGFyZW50ID0gb2xkTm9kZS5wYXJlbnROb2RlOwogIHBhcmVudCAmJiBwYXJlbnQucmVwbGFjZUNoaWxkKG5ld05vZGUsIG9sZE5vZGUpCn07Cmdvb2cuZG9tLmZsYXR0ZW5FbGVtZW50ID0gZnVuY3Rpb24gJGdvb2ckZG9tJGZsYXR0ZW5FbGVtZW50JChlbGVtZW50KSB7CiAgdmFyIGNoaWxkLCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7CiAgaWYocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPSBnb29nLmRvbS5Ob2RlVHlwZS5ET0NVTUVOVF9GUkFHTUVOVCkgewogICAgaWYoZWxlbWVudC5yZW1vdmVOb2RlKSB7CiAgICAgIHJldHVybiBlbGVtZW50LnJlbW92ZU5vZGUoITEpCiAgICB9CiAgICBmb3IoO2NoaWxkID0gZWxlbWVudC5maXJzdENoaWxkOykgewogICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBlbGVtZW50KQogICAgfQogICAgcmV0dXJuIGdvb2cuZG9tLnJlbW92ZU5vZGUoZWxlbWVudCkKICB9Cn07Cmdvb2cuZG9tLmdldENoaWxkcmVuID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldENoaWxkcmVuJChlbGVtZW50KSB7CiAgcmV0dXJuIGdvb2cuZG9tLkJyb3dzZXJGZWF0dXJlLkNBTl9VU0VfQ0hJTERSRU5fQVRUUklCVVRFICYmIHZvaWQgMCAhPSBlbGVtZW50LmNoaWxkcmVuID8gZWxlbWVudC5jaGlsZHJlbiA6IGdvb2cuYXJyYXkuZmlsdGVyKGVsZW1lbnQuY2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkgewogICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gZ29vZy5kb20uTm9kZVR5cGUuRUxFTUVOVAogIH0pCn07Cmdvb2cuZG9tLmdldEZpcnN0RWxlbWVudENoaWxkID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldEZpcnN0RWxlbWVudENoaWxkJChub2RlKSB7CiAgcmV0dXJuIHZvaWQgMCAhPSBub2RlLmZpcnN0RWxlbWVudENoaWxkID8gbm9kZS5maXJzdEVsZW1lbnRDaGlsZCA6IGdvb2cuZG9tLmdldE5leHRFbGVtZW50Tm9kZV8obm9kZS5maXJzdENoaWxkLCAhMCkKfTsKZ29vZy5kb20uZ2V0TGFzdEVsZW1lbnRDaGlsZCA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRMYXN0RWxlbWVudENoaWxkJChub2RlKSB7CiAgcmV0dXJuIHZvaWQgMCAhPSBub2RlLmxhc3RFbGVtZW50Q2hpbGQgPyBub2RlLmxhc3RFbGVtZW50Q2hpbGQgOiBnb29nLmRvbS5nZXROZXh0RWxlbWVudE5vZGVfKG5vZGUubGFzdENoaWxkLCAhMSkKfTsKZ29vZy5kb20uZ2V0TmV4dEVsZW1lbnRTaWJsaW5nID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldE5leHRFbGVtZW50U2libGluZyQobm9kZSkgewogIHJldHVybiB2b2lkIDAgIT0gbm9kZS5uZXh0RWxlbWVudFNpYmxpbmcgPyBub2RlLm5leHRFbGVtZW50U2libGluZyA6IGdvb2cuZG9tLmdldE5leHRFbGVtZW50Tm9kZV8obm9kZS5uZXh0U2libGluZywgITApCn07Cmdvb2cuZG9tLmdldFByZXZpb3VzRWxlbWVudFNpYmxpbmcgPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0UHJldmlvdXNFbGVtZW50U2libGluZyQobm9kZSkgewogIHJldHVybiB2b2lkIDAgIT0gbm9kZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID8gbm9kZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIDogZ29vZy5kb20uZ2V0TmV4dEVsZW1lbnROb2RlXyhub2RlLnByZXZpb3VzU2libGluZywgITEpCn07Cmdvb2cuZG9tLmdldE5leHRFbGVtZW50Tm9kZV8gPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0TmV4dEVsZW1lbnROb2RlXyQobm9kZSwgZm9yd2FyZCkgewogIGZvcig7bm9kZSAmJiBub2RlLm5vZGVUeXBlICE9IGdvb2cuZG9tLk5vZGVUeXBlLkVMRU1FTlQ7KSB7CiAgICBub2RlID0gZm9yd2FyZCA/IG5vZGUubmV4dFNpYmxpbmcgOiBub2RlLnByZXZpb3VzU2libGluZwogIH0KICByZXR1cm4gbm9kZQp9Owpnb29nLmRvbS5nZXROZXh0Tm9kZSA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXROZXh0Tm9kZSQobm9kZSkgewogIGlmKCFub2RlKSB7CiAgICByZXR1cm4gbnVsbAogIH0KICBpZihub2RlLmZpcnN0Q2hpbGQpIHsKICAgIHJldHVybiBub2RlLmZpcnN0Q2hpbGQKICB9CiAgZm9yKDtub2RlICYmICFub2RlLm5leHRTaWJsaW5nOykgewogICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZQogIH0KICByZXR1cm4gbm9kZSA/IG5vZGUubmV4dFNpYmxpbmcgOiBudWxsCn07Cmdvb2cuZG9tLmdldFByZXZpb3VzTm9kZSA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRQcmV2aW91c05vZGUkKG5vZGUpIHsKICBpZighbm9kZSkgewogICAgcmV0dXJuIG51bGwKICB9CiAgaWYoIW5vZGUucHJldmlvdXNTaWJsaW5nKSB7CiAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlCiAgfQogIGZvcihub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7bm9kZSAmJiBub2RlLmxhc3RDaGlsZDspIHsKICAgIG5vZGUgPSBub2RlLmxhc3RDaGlsZAogIH0KICByZXR1cm4gbm9kZQp9Owpnb29nLmRvbS5pc05vZGVMaWtlID0gZnVuY3Rpb24gJGdvb2ckZG9tJGlzTm9kZUxpa2UkKG9iaikgewogIHJldHVybiBnb29nLmlzT2JqZWN0KG9iaikgJiYgMCA8IG9iai5ub2RlVHlwZQp9Owpnb29nLmRvbS5pc0VsZW1lbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kaXNFbGVtZW50JChvYmopIHsKICByZXR1cm4gZ29vZy5pc09iamVjdChvYmopICYmIG9iai5ub2RlVHlwZSA9PSBnb29nLmRvbS5Ob2RlVHlwZS5FTEVNRU5UCn07Cmdvb2cuZG9tLmlzV2luZG93ID0gZnVuY3Rpb24gJGdvb2ckZG9tJGlzV2luZG93JChvYmopIHsKICByZXR1cm4gZ29vZy5pc09iamVjdChvYmopICYmIG9iai53aW5kb3cgPT0gb2JqCn07Cmdvb2cuZG9tLmdldFBhcmVudEVsZW1lbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0UGFyZW50RWxlbWVudCQoZWxlbWVudCkgewogIGlmKGdvb2cuZG9tLkJyb3dzZXJGZWF0dXJlLkNBTl9VU0VfUEFSRU5UX0VMRU1FTlRfUFJPUEVSVFkpIHsKICAgIHJldHVybiBlbGVtZW50LnBhcmVudEVsZW1lbnQKICB9CiAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKICByZXR1cm4gZ29vZy5kb20uaXNFbGVtZW50KHBhcmVudCkgPyBwYXJlbnQgOiBudWxsCn07Cmdvb2cuZG9tLmNvbnRhaW5zID0gZnVuY3Rpb24gJGdvb2ckZG9tJGNvbnRhaW5zJChwYXJlbnQsIGRlc2NlbmRhbnQpIHsKICBpZihwYXJlbnQuY29udGFpbnMgJiYgZGVzY2VuZGFudC5ub2RlVHlwZSA9PSBnb29nLmRvbS5Ob2RlVHlwZS5FTEVNRU5UKSB7CiAgICByZXR1cm4gcGFyZW50ID09IGRlc2NlbmRhbnQgfHwgcGFyZW50LmNvbnRhaW5zKGRlc2NlbmRhbnQpCiAgfQogIGlmKCJ1bmRlZmluZWQiICE9IHR5cGVvZiBwYXJlbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHsKICAgIHJldHVybiBwYXJlbnQgPT0gZGVzY2VuZGFudCB8fCBCb29sZWFuKHBhcmVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkZXNjZW5kYW50KSAmIDE2KQogIH0KICBmb3IoO2Rlc2NlbmRhbnQgJiYgcGFyZW50ICE9IGRlc2NlbmRhbnQ7KSB7CiAgICBkZXNjZW5kYW50ID0gZGVzY2VuZGFudC5wYXJlbnROb2RlCiAgfQogIHJldHVybiBkZXNjZW5kYW50ID09IHBhcmVudAp9Owpnb29nLmRvbS5jb21wYXJlTm9kZU9yZGVyID0gZnVuY3Rpb24gJGdvb2ckZG9tJGNvbXBhcmVOb2RlT3JkZXIkKG5vZGUxLCBub2RlMikgewogIGlmKG5vZGUxID09IG5vZGUyKSB7CiAgICByZXR1cm4gMAogIH0KICBpZihub2RlMS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikgewogICAgcmV0dXJuIG5vZGUxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUyKSAmIDIgPyAxIDogLTEKICB9CiAgaWYoInNvdXJjZUluZGV4IiBpbiBub2RlMSB8fCBub2RlMS5wYXJlbnROb2RlICYmICJzb3VyY2VJbmRleCIgaW4gbm9kZTEucGFyZW50Tm9kZSkgewogICAgdmFyIGlzRWxlbWVudDEgPSBub2RlMS5ub2RlVHlwZSA9PSBnb29nLmRvbS5Ob2RlVHlwZS5FTEVNRU5ULCBpc0VsZW1lbnQyID0gbm9kZTIubm9kZVR5cGUgPT0gZ29vZy5kb20uTm9kZVR5cGUuRUxFTUVOVDsKICAgIGlmKGlzRWxlbWVudDEgJiYgaXNFbGVtZW50MikgewogICAgICByZXR1cm4gbm9kZTEuc291cmNlSW5kZXggLSBub2RlMi5zb3VyY2VJbmRleAogICAgfQogICAgdmFyIHBhcmVudDEgPSBub2RlMS5wYXJlbnROb2RlLCBwYXJlbnQyID0gbm9kZTIucGFyZW50Tm9kZTsKICAgIHJldHVybiBwYXJlbnQxID09IHBhcmVudDIgPyBnb29nLmRvbS5jb21wYXJlU2libGluZ09yZGVyXyhub2RlMSwgbm9kZTIpIDogIWlzRWxlbWVudDEgJiYgZ29vZy5kb20uY29udGFpbnMocGFyZW50MSwgbm9kZTIpID8gLTEgKiBnb29nLmRvbS5jb21wYXJlUGFyZW50c0Rlc2NlbmRhbnROb2RlSWVfKG5vZGUxLCBub2RlMikgOiAhaXNFbGVtZW50MiAmJiBnb29nLmRvbS5jb250YWlucyhwYXJlbnQyLCBub2RlMSkgPyBnb29nLmRvbS5jb21wYXJlUGFyZW50c0Rlc2NlbmRhbnROb2RlSWVfKG5vZGUyLCBub2RlMSkgOiAoaXNFbGVtZW50MSA/IG5vZGUxLnNvdXJjZUluZGV4IDogcGFyZW50MS5zb3VyY2VJbmRleCkgLSAoaXNFbGVtZW50MiA/IG5vZGUyLnNvdXJjZUluZGV4IDogcGFyZW50Mi5zb3VyY2VJbmRleCkKICB9CiAgdmFyIGRvYyA9IGdvb2cuZG9tLmdldE93bmVyRG9jdW1lbnQobm9kZTEpLCByYW5nZTEsIHJhbmdlMjsKICByYW5nZTEgPSBkb2MuY3JlYXRlUmFuZ2UoKTsKICByYW5nZTEuc2VsZWN0Tm9kZShub2RlMSk7CiAgcmFuZ2UxLmNvbGxhcHNlKCEwKTsKICByYW5nZTIgPSBkb2MuY3JlYXRlUmFuZ2UoKTsKICByYW5nZTIuc2VsZWN0Tm9kZShub2RlMik7CiAgcmFuZ2UyLmNvbGxhcHNlKCEwKTsKICByZXR1cm4gcmFuZ2UxLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhnb29nLmdsb2JhbC5SYW5nZS5TVEFSVF9UT19FTkQsIHJhbmdlMikKfTsKZ29vZy5kb20uY29tcGFyZVBhcmVudHNEZXNjZW5kYW50Tm9kZUllXyA9IGZ1bmN0aW9uICRnb29nJGRvbSRjb21wYXJlUGFyZW50c0Rlc2NlbmRhbnROb2RlSWVfJCh0ZXh0Tm9kZSwgbm9kZSkgewogIHZhciBwYXJlbnQgPSB0ZXh0Tm9kZS5wYXJlbnROb2RlOwogIGlmKHBhcmVudCA9PSBub2RlKSB7CiAgICByZXR1cm4tMQogIH0KICBmb3IodmFyIHNpYmxpbmcgPSBub2RlO3NpYmxpbmcucGFyZW50Tm9kZSAhPSBwYXJlbnQ7KSB7CiAgICBzaWJsaW5nID0gc2libGluZy5wYXJlbnROb2RlCiAgfQogIHJldHVybiBnb29nLmRvbS5jb21wYXJlU2libGluZ09yZGVyXyhzaWJsaW5nLCB0ZXh0Tm9kZSkKfTsKZ29vZy5kb20uY29tcGFyZVNpYmxpbmdPcmRlcl8gPSBmdW5jdGlvbiAkZ29vZyRkb20kY29tcGFyZVNpYmxpbmdPcmRlcl8kKG5vZGUxLCBub2RlMikgewogIGZvcih2YXIgcyA9IG5vZGUyO3MgPSBzLnByZXZpb3VzU2libGluZzspIHsKICAgIGlmKHMgPT0gbm9kZTEpIHsKICAgICAgcmV0dXJuLTEKICAgIH0KICB9CiAgcmV0dXJuIDEKfTsKZ29vZy5kb20uZmluZENvbW1vbkFuY2VzdG9yID0gZnVuY3Rpb24gJGdvb2ckZG9tJGZpbmRDb21tb25BbmNlc3RvciQodmFyX2FyZ3MpIHsKICB2YXIgaSwgY291bnQgPSBhcmd1bWVudHMubGVuZ3RoOwogIGlmKGNvdW50KSB7CiAgICBpZigxID09IGNvdW50KSB7CiAgICAgIHJldHVybiBhcmd1bWVudHNbMF0KICAgIH0KICB9ZWxzZSB7CiAgICByZXR1cm4gbnVsbAogIH0KICB2YXIgcGF0aHMgPSBbXSwgbWluTGVuZ3RoID0gSW5maW5pdHk7CiAgZm9yKGkgPSAwO2kgPCBjb3VudDtpKyspIHsKICAgIGZvcih2YXIgYW5jZXN0b3JzID0gW10sIG5vZGUgPSBhcmd1bWVudHNbaV07bm9kZTspIHsKICAgICAgYW5jZXN0b3JzLnVuc2hpZnQobm9kZSksIG5vZGUgPSBub2RlLnBhcmVudE5vZGUKICAgIH0KICAgIHBhdGhzLnB1c2goYW5jZXN0b3JzKTsKICAgIG1pbkxlbmd0aCA9IE1hdGgubWluKG1pbkxlbmd0aCwgYW5jZXN0b3JzLmxlbmd0aCkKICB9CiAgdmFyIG91dHB1dCA9IG51bGw7CiAgZm9yKGkgPSAwO2kgPCBtaW5MZW5ndGg7aSsrKSB7CiAgICBmb3IodmFyIGZpcnN0ID0gcGF0aHNbMF1baV0sIGogPSAxO2ogPCBjb3VudDtqKyspIHsKICAgICAgaWYoZmlyc3QgIT0gcGF0aHNbal1baV0pIHsKICAgICAgICByZXR1cm4gb3V0cHV0CiAgICAgIH0KICAgIH0KICAgIG91dHB1dCA9IGZpcnN0CiAgfQogIHJldHVybiBvdXRwdXQKfTsKZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudCA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRPd25lckRvY3VtZW50JChub2RlKSB7CiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gZ29vZy5kb20uTm9kZVR5cGUuRE9DVU1FTlQgPyBub2RlIDogbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUuZG9jdW1lbnQKfTsKZ29vZy5kb20uZ2V0RnJhbWVDb250ZW50RG9jdW1lbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0RnJhbWVDb250ZW50RG9jdW1lbnQkKGZyYW1lKSB7CiAgdmFyIGRvYyA9IGZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OwogIHJldHVybiBkb2MKfTsKZ29vZy5kb20uZ2V0RnJhbWVDb250ZW50V2luZG93ID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldEZyYW1lQ29udGVudFdpbmRvdyQoZnJhbWUpIHsKICByZXR1cm4gZnJhbWUuY29udGVudFdpbmRvdyB8fCBnb29nLmRvbS5nZXRXaW5kb3dfKGdvb2cuZG9tLmdldEZyYW1lQ29udGVudERvY3VtZW50KGZyYW1lKSkKfTsKZ29vZy5kb20uc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kc2V0VGV4dENvbnRlbnQkKGVsZW1lbnQsIHRleHQpIHsKICBpZigidGV4dENvbnRlbnQiIGluIGVsZW1lbnQpIHsKICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0CiAgfWVsc2UgewogICAgaWYoZWxlbWVudC5maXJzdENoaWxkICYmIGVsZW1lbnQuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSBnb29nLmRvbS5Ob2RlVHlwZS5URVhUKSB7CiAgICAgIGZvcig7ZWxlbWVudC5sYXN0Q2hpbGQgIT0gZWxlbWVudC5maXJzdENoaWxkOykgewogICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5sYXN0Q2hpbGQpCiAgICAgIH0KICAgICAgZWxlbWVudC5maXJzdENoaWxkLmRhdGEgPSB0ZXh0CiAgICB9ZWxzZSB7CiAgICAgIGdvb2cuZG9tLnJlbW92ZUNoaWxkcmVuKGVsZW1lbnQpOwogICAgICB2YXIgZG9jID0gZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudChlbGVtZW50KTsKICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUodGV4dCkpCiAgICB9CiAgfQp9Owpnb29nLmRvbS5nZXRPdXRlckh0bWwgPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0T3V0ZXJIdG1sJChlbGVtZW50KSB7CiAgaWYoIm91dGVySFRNTCIgaW4gZWxlbWVudCkgewogICAgcmV0dXJuIGVsZW1lbnQub3V0ZXJIVE1MCiAgfQogIHZhciBkb2MgPSBnb29nLmRvbS5nZXRPd25lckRvY3VtZW50KGVsZW1lbnQpLCBkaXYgPSBkb2MuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgZGl2LmFwcGVuZENoaWxkKGVsZW1lbnQuY2xvbmVOb2RlKCEwKSk7CiAgcmV0dXJuIGRpdi5pbm5lckhUTUwKfTsKZ29vZy5kb20uZmluZE5vZGUgPSBmdW5jdGlvbiAkZ29vZyRkb20kZmluZE5vZGUkKHJvb3QsIHApIHsKICB2YXIgcnYgPSBbXSwgZm91bmQgPSBnb29nLmRvbS5maW5kTm9kZXNfKHJvb3QsIHAsIHJ2LCAhMCk7CiAgcmV0dXJuIGZvdW5kID8gcnZbMF0gOiB2b2lkIDAKfTsKZ29vZy5kb20uZmluZE5vZGVzID0gZnVuY3Rpb24gJGdvb2ckZG9tJGZpbmROb2RlcyQocm9vdCwgcCkgewogIHZhciBydiA9IFtdOwogIGdvb2cuZG9tLmZpbmROb2Rlc18ocm9vdCwgcCwgcnYsICExKTsKICByZXR1cm4gcnYKfTsKZ29vZy5kb20uZmluZE5vZGVzXyA9IGZ1bmN0aW9uICRnb29nJGRvbSRmaW5kTm9kZXNfJChyb290LCBwLCBydiwgZmluZE9uZSkgewogIGlmKG51bGwgIT0gcm9vdCkgewogICAgZm9yKHZhciBjaGlsZCA9IHJvb3QuZmlyc3RDaGlsZDtjaGlsZDspIHsKICAgICAgaWYocChjaGlsZCkgJiYgKHJ2LnB1c2goY2hpbGQpLCBmaW5kT25lKSB8fCBnb29nLmRvbS5maW5kTm9kZXNfKGNoaWxkLCBwLCBydiwgZmluZE9uZSkpIHsKICAgICAgICByZXR1cm4hMAogICAgICB9CiAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcKICAgIH0KICB9CiAgcmV0dXJuITEKfTsKZ29vZy5kb20uVEFHU19UT19JR05PUkVfID0ge1NDUklQVDoxLCBTVFlMRToxLCBIRUFEOjEsIElGUkFNRToxLCBPQkpFQ1Q6MX07Cmdvb2cuZG9tLlBSRURFRklORURfVEFHX1ZBTFVFU18gPSB7SU1HOiIgIiwgQlI6IlxuIn07Cmdvb2cuZG9tLmlzRm9jdXNhYmxlVGFiSW5kZXggPSBmdW5jdGlvbiAkZ29vZyRkb20kaXNGb2N1c2FibGVUYWJJbmRleCQoZWxlbWVudCkgewogIHZhciBhdHRyTm9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTsKICBpZihhdHRyTm9kZSAmJiBhdHRyTm9kZS5zcGVjaWZpZWQpIHsKICAgIHZhciBpbmRleCA9IGVsZW1lbnQudGFiSW5kZXg7CiAgICByZXR1cm4gZ29vZy5pc051bWJlcihpbmRleCkgJiYgMCA8PSBpbmRleCAmJiAzMjc2OCA+IGluZGV4CiAgfQogIHJldHVybiExCn07Cmdvb2cuZG9tLnNldEZvY3VzYWJsZVRhYkluZGV4ID0gZnVuY3Rpb24gJGdvb2ckZG9tJHNldEZvY3VzYWJsZVRhYkluZGV4JChlbGVtZW50LCBlbmFibGUpIHsKICBlbmFibGUgPyBlbGVtZW50LnRhYkluZGV4ID0gMCA6IChlbGVtZW50LnRhYkluZGV4ID0gLTEsIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ0YWJJbmRleCIpKQp9Owpnb29nLmRvbS5nZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRUZXh0Q29udGVudCQobm9kZSkgewogIHZhciB0ZXh0Q29udGVudDsKICBpZihnb29nLmRvbS5Ccm93c2VyRmVhdHVyZS5DQU5fVVNFX0lOTkVSX1RFWFQgJiYgImlubmVyVGV4dCIgaW4gbm9kZSkgewogICAgdGV4dENvbnRlbnQgPSBnb29nLnN0cmluZy5jYW5vbmljYWxpemVOZXdsaW5lcyhub2RlLmlubmVyVGV4dCkKICB9ZWxzZSB7CiAgICB2YXIgYnVmID0gW107CiAgICBnb29nLmRvbS5nZXRUZXh0Q29udGVudF8obm9kZSwgYnVmLCAhMCk7CiAgICB0ZXh0Q29udGVudCA9IGJ1Zi5qb2luKCIiKQogIH0KICB0ZXh0Q29udGVudCA9IHRleHRDb250ZW50LnJlcGxhY2UoLyBceEFEIC9nLCAiICIpLnJlcGxhY2UoL1x4QUQvZywgIiIpOwogIHRleHRDb250ZW50ID0gdGV4dENvbnRlbnQucmVwbGFjZSgvXHUyMDBCL2csICIiKTsKICBnb29nLmRvbS5Ccm93c2VyRmVhdHVyZS5DQU5fVVNFX0lOTkVSX1RFWFQgfHwgKHRleHRDb250ZW50ID0gdGV4dENvbnRlbnQucmVwbGFjZSgvICsvZywgIiAiKSk7CiAgIiAiICE9IHRleHRDb250ZW50ICYmICh0ZXh0Q29udGVudCA9IHRleHRDb250ZW50LnJlcGxhY2UoL15ccyovLCAiIikpOwogIHJldHVybiB0ZXh0Q29udGVudAp9Owpnb29nLmRvbS5nZXRSYXdUZXh0Q29udGVudCA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRSYXdUZXh0Q29udGVudCQobm9kZSkgewogIHZhciBidWYgPSBbXTsKICBnb29nLmRvbS5nZXRUZXh0Q29udGVudF8obm9kZSwgYnVmLCAhMSk7CiAgcmV0dXJuIGJ1Zi5qb2luKCIiKQp9Owpnb29nLmRvbS5nZXRUZXh0Q29udGVudF8gPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0VGV4dENvbnRlbnRfJChub2RlLCBidWYsIG5vcm1hbGl6ZVdoaXRlc3BhY2UpIHsKICBpZighKG5vZGUubm9kZU5hbWUgaW4gZ29vZy5kb20uVEFHU19UT19JR05PUkVfKSkgewogICAgaWYobm9kZS5ub2RlVHlwZSA9PSBnb29nLmRvbS5Ob2RlVHlwZS5URVhUKSB7CiAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2UgPyBidWYucHVzaCgoIiIgKyBub2RlLm5vZGVWYWx1ZSkucmVwbGFjZSgvKFxyXG58XHJ8XG4pL2csICIiKSkgOiBidWYucHVzaChub2RlLm5vZGVWYWx1ZSkKICAgIH1lbHNlIHsKICAgICAgaWYobm9kZS5ub2RlTmFtZSBpbiBnb29nLmRvbS5QUkVERUZJTkVEX1RBR19WQUxVRVNfKSB7CiAgICAgICAgYnVmLnB1c2goZ29vZy5kb20uUFJFREVGSU5FRF9UQUdfVkFMVUVTX1tub2RlLm5vZGVOYW1lXSkKICAgICAgfWVsc2UgewogICAgICAgIGZvcih2YXIgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7Y2hpbGQ7KSB7CiAgICAgICAgICBnb29nLmRvbS5nZXRUZXh0Q29udGVudF8oY2hpbGQsIGJ1Ziwgbm9ybWFsaXplV2hpdGVzcGFjZSksIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07Cmdvb2cuZG9tLmdldE5vZGVUZXh0TGVuZ3RoID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldE5vZGVUZXh0TGVuZ3RoJChub2RlKSB7CiAgcmV0dXJuIGdvb2cuZG9tLmdldFRleHRDb250ZW50KG5vZGUpLmxlbmd0aAp9Owpnb29nLmRvbS5nZXROb2RlVGV4dE9mZnNldCA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXROb2RlVGV4dE9mZnNldCQobm9kZSwgb3B0X29mZnNldFBhcmVudCkgewogIGZvcih2YXIgcm9vdCA9IG9wdF9vZmZzZXRQYXJlbnQgfHwgZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudChub2RlKS5ib2R5LCBidWYgPSBbXTtub2RlICYmIG5vZGUgIT0gcm9vdDspIHsKICAgIGZvcih2YXIgY3VyID0gbm9kZTtjdXIgPSBjdXIucHJldmlvdXNTaWJsaW5nOykgewogICAgICBidWYudW5zaGlmdChnb29nLmRvbS5nZXRUZXh0Q29udGVudChjdXIpKQogICAgfQogICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZQogIH0KICByZXR1cm4gZ29vZy5zdHJpbmcudHJpbUxlZnQoYnVmLmpvaW4oIiIpKS5yZXBsYWNlKC8gKy9nLCAiICIpLmxlbmd0aAp9Owpnb29nLmRvbS5nZXROb2RlQXRPZmZzZXQgPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0Tm9kZUF0T2Zmc2V0JChwYXJlbnQsIG9mZnNldCwgb3B0X3Jlc3VsdCkgewogIGZvcih2YXIgc3RhY2sgPSBbcGFyZW50XSwgcG9zID0gMCwgY3VyOzAgPCBzdGFjay5sZW5ndGggJiYgcG9zIDwgb2Zmc2V0OykgewogICAgaWYoY3VyID0gc3RhY2sucG9wKCksICEoY3VyLm5vZGVOYW1lIGluIGdvb2cuZG9tLlRBR1NfVE9fSUdOT1JFXykpIHsKICAgICAgaWYoY3VyLm5vZGVUeXBlID09IGdvb2cuZG9tLk5vZGVUeXBlLlRFWFQpIHsKICAgICAgICB2YXIgdGV4dCA9IGN1ci5ub2RlVmFsdWUucmVwbGFjZSgvKFxyXG58XHJ8XG4pL2csICIiKS5yZXBsYWNlKC8gKy9nLCAiICIpLCBwb3MgPSBwb3MgKyB0ZXh0Lmxlbmd0aAogICAgICB9ZWxzZSB7CiAgICAgICAgaWYoY3VyLm5vZGVOYW1lIGluIGdvb2cuZG9tLlBSRURFRklORURfVEFHX1ZBTFVFU18pIHsKICAgICAgICAgIHBvcyArPSBnb29nLmRvbS5QUkVERUZJTkVEX1RBR19WQUxVRVNfW2N1ci5ub2RlTmFtZV0ubGVuZ3RoCiAgICAgICAgfWVsc2UgewogICAgICAgICAgZm9yKHZhciBpID0gY3VyLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTswIDw9IGk7aS0tKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goY3VyLmNoaWxkTm9kZXNbaV0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGdvb2cuaXNPYmplY3Qob3B0X3Jlc3VsdCkgJiYgKG9wdF9yZXN1bHQucmVtYWluZGVyID0gY3VyID8gY3VyLm5vZGVWYWx1ZS5sZW5ndGggKyBvZmZzZXQgLSBwb3MgLSAxIDogMCwgb3B0X3Jlc3VsdC5ub2RlID0gY3VyKTsKICByZXR1cm4gY3VyCn07Cmdvb2cuZG9tLmlzTm9kZUxpc3QgPSBmdW5jdGlvbiAkZ29vZyRkb20kaXNOb2RlTGlzdCQodmFsKSB7CiAgaWYodmFsICYmICJudW1iZXIiID09IHR5cGVvZiB2YWwubGVuZ3RoKSB7CiAgICBpZihnb29nLmlzT2JqZWN0KHZhbCkpIHsKICAgICAgcmV0dXJuImZ1bmN0aW9uIiA9PSB0eXBlb2YgdmFsLml0ZW0gfHwgInN0cmluZyIgPT0gdHlwZW9mIHZhbC5pdGVtCiAgICB9CiAgICBpZihnb29nLmlzRnVuY3Rpb24odmFsKSkgewogICAgICByZXR1cm4iZnVuY3Rpb24iID09IHR5cGVvZiB2YWwuaXRlbQogICAgfQogIH0KICByZXR1cm4hMQp9Owpnb29nLmRvbS5nZXRBbmNlc3RvckJ5VGFnTmFtZUFuZENsYXNzID0gZnVuY3Rpb24gJGdvb2ckZG9tJGdldEFuY2VzdG9yQnlUYWdOYW1lQW5kQ2xhc3MkKGVsZW1lbnQsIG9wdF90YWcsIG9wdF9jbGFzcykgewogIHZhciB0YWdOYW1lID0gb3B0X3RhZyA/IG9wdF90YWcudG9VcHBlckNhc2UoKSA6IG51bGw7CiAgcmV0dXJuIGdvb2cuZG9tLmdldEFuY2VzdG9yKGVsZW1lbnQsIGZ1bmN0aW9uKG5vZGUpIHsKICAgIHJldHVybighdGFnTmFtZSB8fCBub2RlLm5vZGVOYW1lID09IHRhZ05hbWUpICYmICghb3B0X2NsYXNzIHx8IGdvb2cuZG9tLmNsYXNzZXMuaGFzKG5vZGUsIG9wdF9jbGFzcykpCiAgfSwgITApCn07Cmdvb2cuZG9tLmdldEFuY2VzdG9yQnlDbGFzcyA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRBbmNlc3RvckJ5Q2xhc3MkKGVsZW1lbnQsIG9wdF9jbGFzcykgewogIHJldHVybiBnb29nLmRvbS5nZXRBbmNlc3RvckJ5VGFnTmFtZUFuZENsYXNzKGVsZW1lbnQsIG51bGwsIG9wdF9jbGFzcykKfTsKZ29vZy5kb20uZ2V0QW5jZXN0b3IgPSBmdW5jdGlvbiAkZ29vZyRkb20kZ2V0QW5jZXN0b3IkKGVsZW1lbnQsIG1hdGNoZXIsIG9wdF9pbmNsdWRlTm9kZSwgb3B0X21heFNlYXJjaFN0ZXBzKSB7CiAgb3B0X2luY2x1ZGVOb2RlIHx8IChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKTsKICBmb3IodmFyIGlnbm9yZVNlYXJjaFN0ZXBzID0gbnVsbCA9PSBvcHRfbWF4U2VhcmNoU3RlcHMsIHN0ZXBzID0gMDtlbGVtZW50ICYmIChpZ25vcmVTZWFyY2hTdGVwcyB8fCBzdGVwcyA8PSBvcHRfbWF4U2VhcmNoU3RlcHMpOykgewogICAgaWYobWF0Y2hlcihlbGVtZW50KSkgewogICAgICByZXR1cm4gZWxlbWVudAogICAgfQogICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKICAgIHN0ZXBzKysKICB9CiAgcmV0dXJuIG51bGwKfTsKZ29vZy5kb20uZ2V0QWN0aXZlRWxlbWVudCA9IGZ1bmN0aW9uICRnb29nJGRvbSRnZXRBY3RpdmVFbGVtZW50JChkb2MpIHsKICB0cnkgewogICAgcmV0dXJuIGRvYyAmJiBkb2MuYWN0aXZlRWxlbWVudAogIH1jYXRjaChlKSB7CiAgfQogIHJldHVybiBudWxsCn07Cmdvb2cuZG9tLkRvbUhlbHBlciA9IGZ1bmN0aW9uICRnb29nJGRvbSREb21IZWxwZXIkKG9wdF9kb2N1bWVudCkgewogIHRoaXMuZG9jdW1lbnRfID0gb3B0X2RvY3VtZW50IHx8IGdvb2cuZ2xvYmFsLmRvY3VtZW50IHx8IGRvY3VtZW50Cn07Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuZ2V0RG9tSGVscGVyID0gZ29vZy5kb20uZ2V0RG9tSGVscGVyOwpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmdldERvY3VtZW50ID0gZnVuY3Rpb24gJGdvb2ckZG9tJERvbUhlbHBlciQkZ2V0RG9jdW1lbnQkKCkgewogIHJldHVybiB0aGlzLmRvY3VtZW50Xwp9Owpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmdldEVsZW1lbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kRG9tSGVscGVyJCRnZXRFbGVtZW50JChlbGVtZW50KSB7CiAgcmV0dXJuIGdvb2cuaXNTdHJpbmcoZWxlbWVudCkgPyB0aGlzLmRvY3VtZW50Xy5nZXRFbGVtZW50QnlJZChlbGVtZW50KSA6IGVsZW1lbnQKfTsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS4kID0gZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXRFbGVtZW50Owpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lQW5kQ2xhc3MgPSBmdW5jdGlvbiAkZ29vZyRkb20kRG9tSGVscGVyJCRnZXRFbGVtZW50c0J5VGFnTmFtZUFuZENsYXNzJChvcHRfdGFnLCBvcHRfY2xhc3MsIG9wdF9lbCkgewogIHJldHVybiBnb29nLmRvbS5nZXRFbGVtZW50c0J5VGFnTmFtZUFuZENsYXNzXyh0aGlzLmRvY3VtZW50Xywgb3B0X3RhZywgb3B0X2NsYXNzLCBvcHRfZWwpCn07Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeUNsYXNzID0gZnVuY3Rpb24gJGdvb2ckZG9tJERvbUhlbHBlciQkZ2V0RWxlbWVudHNCeUNsYXNzJChjbGFzc05hbWUsIG9wdF9lbCkgewogIHZhciBkb2MgPSBvcHRfZWwgfHwgdGhpcy5kb2N1bWVudF87CiAgcmV0dXJuIGdvb2cuZG9tLmdldEVsZW1lbnRzQnlDbGFzcyhjbGFzc05hbWUsIGRvYykKfTsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXRFbGVtZW50QnlDbGFzcyA9IGZ1bmN0aW9uICRnb29nJGRvbSREb21IZWxwZXIkJGdldEVsZW1lbnRCeUNsYXNzJChjbGFzc05hbWUsIG9wdF9lbCkgewogIHZhciBkb2MgPSBvcHRfZWwgfHwgdGhpcy5kb2N1bWVudF87CiAgcmV0dXJuIGdvb2cuZG9tLmdldEVsZW1lbnRCeUNsYXNzKGNsYXNzTmFtZSwgZG9jKQp9Owpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLiQkID0gZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZUFuZENsYXNzOwpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLnNldFByb3BlcnRpZXMgPSBnb29nLmRvbS5zZXRQcm9wZXJ0aWVzOwpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmdldFZpZXdwb3J0U2l6ZSA9IGZ1bmN0aW9uICRnb29nJGRvbSREb21IZWxwZXIkJGdldFZpZXdwb3J0U2l6ZSQob3B0X3dpbmRvdykgewogIHJldHVybiBnb29nLmRvbS5nZXRWaWV3cG9ydFNpemUob3B0X3dpbmRvdyB8fCB0aGlzLmdldFdpbmRvdygpKQp9Owpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmdldERvY3VtZW50SGVpZ2h0ID0gZnVuY3Rpb24gJGdvb2ckZG9tJERvbUhlbHBlciQkZ2V0RG9jdW1lbnRIZWlnaHQkKCkgewogIHJldHVybiBnb29nLmRvbS5nZXREb2N1bWVudEhlaWdodF8odGhpcy5nZXRXaW5kb3coKSkKfTsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5jcmVhdGVEb20gPSBmdW5jdGlvbiAkZ29vZyRkb20kRG9tSGVscGVyJCRjcmVhdGVEb20kKHRhZ05hbWUsIG9wdF9hdHRyaWJ1dGVzLCB2YXJfYXJncykgewogIHJldHVybiBnb29nLmRvbS5jcmVhdGVEb21fKHRoaXMuZG9jdW1lbnRfLCBhcmd1bWVudHMpCn07Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuJGRvbSA9IGdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuY3JlYXRlRG9tOwpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kRG9tSGVscGVyJCRjcmVhdGVFbGVtZW50JChuYW1lKSB7CiAgcmV0dXJuIHRoaXMuZG9jdW1lbnRfLmNyZWF0ZUVsZW1lbnQobmFtZSkKfTsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5jcmVhdGVUZXh0Tm9kZSA9IGZ1bmN0aW9uICRnb29nJGRvbSREb21IZWxwZXIkJGNyZWF0ZVRleHROb2RlJChjb250ZW50KSB7CiAgcmV0dXJuIHRoaXMuZG9jdW1lbnRfLmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpCn07Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuY3JlYXRlVGFibGUgPSBmdW5jdGlvbiAkZ29vZyRkb20kRG9tSGVscGVyJCRjcmVhdGVUYWJsZSQocm93cywgY29sdW1ucywgb3B0X2ZpbGxXaXRoTmJzcCkgewogIHJldHVybiBnb29nLmRvbS5jcmVhdGVUYWJsZV8odGhpcy5kb2N1bWVudF8sIHJvd3MsIGNvbHVtbnMsICEhb3B0X2ZpbGxXaXRoTmJzcCkKfTsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5odG1sVG9Eb2N1bWVudEZyYWdtZW50ID0gZnVuY3Rpb24gJGdvb2ckZG9tJERvbUhlbHBlciQkaHRtbFRvRG9jdW1lbnRGcmFnbWVudCQoaHRtbFN0cmluZykgewogIHJldHVybiBnb29nLmRvbS5odG1sVG9Eb2N1bWVudEZyYWdtZW50Xyh0aGlzLmRvY3VtZW50XywgaHRtbFN0cmluZykKfTsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXRDb21wYXRNb2RlID0gZnVuY3Rpb24gJGdvb2ckZG9tJERvbUhlbHBlciQkZ2V0Q29tcGF0TW9kZSQoKSB7CiAgcmV0dXJuIHRoaXMuaXNDc3MxQ29tcGF0TW9kZSgpID8gIkNTUzFDb21wYXQiIDogIkJhY2tDb21wYXQiCn07Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuaXNDc3MxQ29tcGF0TW9kZSA9IGZ1bmN0aW9uICRnb29nJGRvbSREb21IZWxwZXIkJGlzQ3NzMUNvbXBhdE1vZGUkKCkgewogIHJldHVybiBnb29nLmRvbS5pc0NzczFDb21wYXRNb2RlXyh0aGlzLmRvY3VtZW50XykKfTsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXRXaW5kb3cgPSBmdW5jdGlvbiAkZ29vZyRkb20kRG9tSGVscGVyJCRnZXRXaW5kb3ckKCkgewogIHJldHVybiBnb29nLmRvbS5nZXRXaW5kb3dfKHRoaXMuZG9jdW1lbnRfKQp9Owpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmdldERvY3VtZW50U2Nyb2xsRWxlbWVudCA9IGZ1bmN0aW9uICRnb29nJGRvbSREb21IZWxwZXIkJGdldERvY3VtZW50U2Nyb2xsRWxlbWVudCQoKSB7CiAgcmV0dXJuIGdvb2cuZG9tLmdldERvY3VtZW50U2Nyb2xsRWxlbWVudF8odGhpcy5kb2N1bWVudF8pCn07Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuZ2V0RG9jdW1lbnRTY3JvbGwgPSBmdW5jdGlvbiAkZ29vZyRkb20kRG9tSGVscGVyJCRnZXREb2N1bWVudFNjcm9sbCQoKSB7CiAgcmV0dXJuIGdvb2cuZG9tLmdldERvY3VtZW50U2Nyb2xsXyh0aGlzLmRvY3VtZW50XykKfTsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5hcHBlbmRDaGlsZCA9IGdvb2cuZG9tLmFwcGVuZENoaWxkOwpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmFwcGVuZCA9IGdvb2cuZG9tLmFwcGVuZDsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5yZW1vdmVDaGlsZHJlbiA9IGdvb2cuZG9tLnJlbW92ZUNoaWxkcmVuOwpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmluc2VydFNpYmxpbmdCZWZvcmUgPSBnb29nLmRvbS5pbnNlcnRTaWJsaW5nQmVmb3JlOwpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmluc2VydFNpYmxpbmdBZnRlciA9IGdvb2cuZG9tLmluc2VydFNpYmxpbmdBZnRlcjsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5yZW1vdmVOb2RlID0gZ29vZy5kb20ucmVtb3ZlTm9kZTsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5yZXBsYWNlTm9kZSA9IGdvb2cuZG9tLnJlcGxhY2VOb2RlOwpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmZsYXR0ZW5FbGVtZW50ID0gZ29vZy5kb20uZmxhdHRlbkVsZW1lbnQ7Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuZ2V0Rmlyc3RFbGVtZW50Q2hpbGQgPSBnb29nLmRvbS5nZXRGaXJzdEVsZW1lbnRDaGlsZDsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXRMYXN0RWxlbWVudENoaWxkID0gZ29vZy5kb20uZ2V0TGFzdEVsZW1lbnRDaGlsZDsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXROZXh0RWxlbWVudFNpYmxpbmcgPSBnb29nLmRvbS5nZXROZXh0RWxlbWVudFNpYmxpbmc7Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuZ2V0UHJldmlvdXNFbGVtZW50U2libGluZyA9IGdvb2cuZG9tLmdldFByZXZpb3VzRWxlbWVudFNpYmxpbmc7Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuZ2V0TmV4dE5vZGUgPSBnb29nLmRvbS5nZXROZXh0Tm9kZTsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXRQcmV2aW91c05vZGUgPSBnb29nLmRvbS5nZXRQcmV2aW91c05vZGU7Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuaXNOb2RlTGlrZSA9IGdvb2cuZG9tLmlzTm9kZUxpa2U7Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuY29udGFpbnMgPSBnb29nLmRvbS5jb250YWluczsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXRPd25lckRvY3VtZW50ID0gZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudDsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXRGcmFtZUNvbnRlbnREb2N1bWVudCA9IGdvb2cuZG9tLmdldEZyYW1lQ29udGVudERvY3VtZW50Owpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmdldEZyYW1lQ29udGVudFdpbmRvdyA9IGdvb2cuZG9tLmdldEZyYW1lQ29udGVudFdpbmRvdzsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5zZXRUZXh0Q29udGVudCA9IGdvb2cuZG9tLnNldFRleHRDb250ZW50Owpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmZpbmROb2RlID0gZ29vZy5kb20uZmluZE5vZGU7Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuZmluZE5vZGVzID0gZ29vZy5kb20uZmluZE5vZGVzOwpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmdldFRleHRDb250ZW50ID0gZ29vZy5kb20uZ2V0VGV4dENvbnRlbnQ7Cmdvb2cuZG9tLkRvbUhlbHBlci5wcm90b3R5cGUuZ2V0Tm9kZVRleHRMZW5ndGggPSBnb29nLmRvbS5nZXROb2RlVGV4dExlbmd0aDsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXROb2RlVGV4dE9mZnNldCA9IGdvb2cuZG9tLmdldE5vZGVUZXh0T2Zmc2V0Owpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmdldEFuY2VzdG9yQnlUYWdOYW1lQW5kQ2xhc3MgPSBnb29nLmRvbS5nZXRBbmNlc3RvckJ5VGFnTmFtZUFuZENsYXNzOwpnb29nLmRvbS5Eb21IZWxwZXIucHJvdG90eXBlLmdldEFuY2VzdG9yQnlDbGFzcyA9IGdvb2cuZG9tLmdldEFuY2VzdG9yQnlDbGFzczsKZ29vZy5kb20uRG9tSGVscGVyLnByb3RvdHlwZS5nZXRBbmNlc3RvciA9IGdvb2cuZG9tLmdldEFuY2VzdG9yOwpnb29nLm1hdGguQm94ID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRCb3gkKHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCkgewogIHRoaXMudG9wID0gdG9wOwogIHRoaXMucmlnaHQgPSByaWdodDsKICB0aGlzLmJvdHRvbSA9IGJvdHRvbTsKICB0aGlzLmxlZnQgPSBsZWZ0Cn07Cmdvb2cubWF0aC5Cb3guYm91bmRpbmdCb3ggPSBmdW5jdGlvbiAkZ29vZyRtYXRoJEJveCRib3VuZGluZ0JveCQodmFyX2FyZ3MpIHsKICBmb3IodmFyIGJveCA9IG5ldyBnb29nLm1hdGguQm94KGFyZ3VtZW50c1swXS55LCBhcmd1bWVudHNbMF0ueCwgYXJndW1lbnRzWzBdLnksIGFyZ3VtZW50c1swXS54KSwgaSA9IDE7aSA8IGFyZ3VtZW50cy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgY29vcmQgPSBhcmd1bWVudHNbaV07CiAgICBib3gudG9wID0gTWF0aC5taW4oYm94LnRvcCwgY29vcmQueSk7CiAgICBib3gucmlnaHQgPSBNYXRoLm1heChib3gucmlnaHQsIGNvb3JkLngpOwogICAgYm94LmJvdHRvbSA9IE1hdGgubWF4KGJveC5ib3R0b20sIGNvb3JkLnkpOwogICAgYm94LmxlZnQgPSBNYXRoLm1pbihib3gubGVmdCwgY29vcmQueCkKICB9CiAgcmV0dXJuIGJveAp9Owpnb29nLm1hdGguQm94LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICRnb29nJG1hdGgkQm94JCRjbG9uZSQoKSB7CiAgcmV0dXJuIG5ldyBnb29nLm1hdGguQm94KHRoaXMudG9wLCB0aGlzLnJpZ2h0LCB0aGlzLmJvdHRvbSwgdGhpcy5sZWZ0KQp9Owpnb29nLkRFQlVHICYmIChnb29nLm1hdGguQm94LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICRnb29nJG1hdGgkQm94JCR0b1N0cmluZyQoKSB7CiAgcmV0dXJuIigiICsgdGhpcy50b3AgKyAidCwgIiArIHRoaXMucmlnaHQgKyAiciwgIiArIHRoaXMuYm90dG9tICsgImIsICIgKyB0aGlzLmxlZnQgKyAibCkiCn0pOwpnb29nLm1hdGguQm94LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uICRnb29nJG1hdGgkQm94JCRjb250YWlucyQob3RoZXIpIHsKICByZXR1cm4gZ29vZy5tYXRoLkJveC5jb250YWlucyh0aGlzLCBvdGhlcikKfTsKZ29vZy5tYXRoLkJveC5wcm90b3R5cGUuZXhwYW5kID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRCb3gkJGV4cGFuZCQodG9wLCBvcHRfcmlnaHQsIG9wdF9ib3R0b20sIG9wdF9sZWZ0KSB7CiAgZ29vZy5pc09iamVjdCh0b3ApID8gKHRoaXMudG9wIC09IHRvcC50b3AsIHRoaXMucmlnaHQgKz0gdG9wLnJpZ2h0LCB0aGlzLmJvdHRvbSArPSB0b3AuYm90dG9tLCB0aGlzLmxlZnQgLT0gdG9wLmxlZnQpIDogKHRoaXMudG9wIC09IHRvcCwgdGhpcy5yaWdodCArPSBvcHRfcmlnaHQsIHRoaXMuYm90dG9tICs9IG9wdF9ib3R0b20sIHRoaXMubGVmdCAtPSBvcHRfbGVmdCk7CiAgcmV0dXJuIHRoaXMKfTsKZ29vZy5tYXRoLkJveC5lcXVhbHMgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJEJveCRlcXVhbHMkKGEsIGIpIHsKICByZXR1cm4gYSA9PSBiID8gITAgOiAhYSB8fCAhYiA/ICExIDogYS50b3AgPT0gYi50b3AgJiYgYS5yaWdodCA9PSBiLnJpZ2h0ICYmIGEuYm90dG9tID09IGIuYm90dG9tICYmIGEubGVmdCA9PSBiLmxlZnQKfTsKZ29vZy5tYXRoLkJveC5jb250YWlucyA9IGZ1bmN0aW9uICRnb29nJG1hdGgkQm94JGNvbnRhaW5zJChib3gsIG90aGVyKSB7CiAgcmV0dXJuIWJveCB8fCAhb3RoZXIgPyAhMSA6IG90aGVyIGluc3RhbmNlb2YgZ29vZy5tYXRoLkJveCA/IG90aGVyLmxlZnQgPj0gYm94LmxlZnQgJiYgb3RoZXIucmlnaHQgPD0gYm94LnJpZ2h0ICYmIG90aGVyLnRvcCA+PSBib3gudG9wICYmIG90aGVyLmJvdHRvbSA8PSBib3guYm90dG9tIDogb3RoZXIueCA+PSBib3gubGVmdCAmJiBvdGhlci54IDw9IGJveC5yaWdodCAmJiBvdGhlci55ID49IGJveC50b3AgJiYgb3RoZXIueSA8PSBib3guYm90dG9tCn07Cmdvb2cubWF0aC5Cb3guZGlzdGFuY2UgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJEJveCRkaXN0YW5jZSQoYm94LCBjb29yZCkgewogIHJldHVybiBjb29yZC54ID49IGJveC5sZWZ0ICYmIGNvb3JkLnggPD0gYm94LnJpZ2h0ID8gY29vcmQueSA+PSBib3gudG9wICYmIGNvb3JkLnkgPD0gYm94LmJvdHRvbSA/IDAgOiBjb29yZC55IDwgYm94LnRvcCA/IGJveC50b3AgLSBjb29yZC55IDogY29vcmQueSAtIGJveC5ib3R0b20gOiBjb29yZC55ID49IGJveC50b3AgJiYgY29vcmQueSA8PSBib3guYm90dG9tID8gY29vcmQueCA8IGJveC5sZWZ0ID8gYm94LmxlZnQgLSBjb29yZC54IDogY29vcmQueCAtIGJveC5yaWdodCA6IGdvb2cubWF0aC5Db29yZGluYXRlLmRpc3RhbmNlKGNvb3JkLCBuZXcgZ29vZy5tYXRoLkNvb3JkaW5hdGUoY29vcmQueCA8IGJveC5sZWZ0ID8gYm94LmxlZnQgOiBib3gucmlnaHQsIGNvb3JkLnkgPCBib3gudG9wID8gYm94LnRvcCA6IGJveC5ib3R0b20pKQp9Owpnb29nLm1hdGguQm94LmludGVyc2VjdHMgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJEJveCRpbnRlcnNlY3RzJChhLCBiKSB7CiAgcmV0dXJuIGEubGVmdCA8PSBiLnJpZ2h0ICYmIGIubGVmdCA8PSBhLnJpZ2h0ICYmIGEudG9wIDw9IGIuYm90dG9tICYmIGIudG9wIDw9IGEuYm90dG9tCn07Cmdvb2cubWF0aC5Cb3guaW50ZXJzZWN0c1dpdGhQYWRkaW5nID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRCb3gkaW50ZXJzZWN0c1dpdGhQYWRkaW5nJChhLCBiLCBwYWRkaW5nKSB7CiAgcmV0dXJuIGEubGVmdCA8PSBiLnJpZ2h0ICsgcGFkZGluZyAmJiBiLmxlZnQgPD0gYS5yaWdodCArIHBhZGRpbmcgJiYgYS50b3AgPD0gYi5ib3R0b20gKyBwYWRkaW5nICYmIGIudG9wIDw9IGEuYm90dG9tICsgcGFkZGluZwp9Owpnb29nLm1hdGguUmVjdCA9IGZ1bmN0aW9uICRnb29nJG1hdGgkUmVjdCQoeCwgeSwgdywgaCkgewogIHRoaXMubGVmdCA9IHg7CiAgdGhpcy50b3AgPSB5OwogIHRoaXMud2lkdGggPSB3OwogIHRoaXMuaGVpZ2h0ID0gaAp9Owpnb29nLm1hdGguUmVjdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJFJlY3QkJGNsb25lJCgpIHsKICByZXR1cm4gbmV3IGdvb2cubWF0aC5SZWN0KHRoaXMubGVmdCwgdGhpcy50b3AsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KQp9Owpnb29nLm1hdGguUmVjdC5jcmVhdGVGcm9tQm94ID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRSZWN0JGNyZWF0ZUZyb21Cb3gkKGJveCkgewogIHJldHVybiBuZXcgZ29vZy5tYXRoLlJlY3QoYm94LmxlZnQsIGJveC50b3AsIGJveC5yaWdodCAtIGJveC5sZWZ0LCBib3guYm90dG9tIC0gYm94LnRvcCkKfTsKZ29vZy5ERUJVRyAmJiAoZ29vZy5tYXRoLlJlY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRSZWN0JCR0b1N0cmluZyQoKSB7CiAgcmV0dXJuIigiICsgdGhpcy5sZWZ0ICsgIiwgIiArIHRoaXMudG9wICsgIiAtICIgKyB0aGlzLndpZHRoICsgIncgeCAiICsgdGhpcy5oZWlnaHQgKyAiaCkiCn0pOwpnb29nLm1hdGguUmVjdC5lcXVhbHMgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJFJlY3QkZXF1YWxzJChhLCBiKSB7CiAgcmV0dXJuIGEgPT0gYiA/ICEwIDogIWEgfHwgIWIgPyAhMSA6IGEubGVmdCA9PSBiLmxlZnQgJiYgYS53aWR0aCA9PSBiLndpZHRoICYmIGEudG9wID09IGIudG9wICYmIGEuaGVpZ2h0ID09IGIuaGVpZ2h0Cn07Cmdvb2cubWF0aC5SZWN0LnByb3RvdHlwZS5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiAkZ29vZyRtYXRoJFJlY3QkJGludGVyc2VjdGlvbiQocmVjdCkgewogIHZhciB4MCA9IE1hdGgubWF4KHRoaXMubGVmdCwgcmVjdC5sZWZ0KSwgeDEgPSBNYXRoLm1pbih0aGlzLmxlZnQgKyB0aGlzLndpZHRoLCByZWN0LmxlZnQgKyByZWN0LndpZHRoKTsKICBpZih4MCA8PSB4MSkgewogICAgdmFyIHkwID0gTWF0aC5tYXgodGhpcy50b3AsIHJlY3QudG9wKSwgeTEgPSBNYXRoLm1pbih0aGlzLnRvcCArIHRoaXMuaGVpZ2h0LCByZWN0LnRvcCArIHJlY3QuaGVpZ2h0KTsKICAgIGlmKHkwIDw9IHkxKSB7CiAgICAgIHJldHVybiB0aGlzLmxlZnQgPSB4MCwgdGhpcy50b3AgPSB5MCwgdGhpcy53aWR0aCA9IHgxIC0geDAsIHRoaXMuaGVpZ2h0ID0geTEgLSB5MCwgITAKICAgIH0KICB9CiAgcmV0dXJuITEKfTsKZ29vZy5tYXRoLlJlY3QuaW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRSZWN0JGludGVyc2VjdGlvbiQoYSwgYikgewogIHZhciB4MCA9IE1hdGgubWF4KGEubGVmdCwgYi5sZWZ0KSwgeDEgPSBNYXRoLm1pbihhLmxlZnQgKyBhLndpZHRoLCBiLmxlZnQgKyBiLndpZHRoKTsKICBpZih4MCA8PSB4MSkgewogICAgdmFyIHkwID0gTWF0aC5tYXgoYS50b3AsIGIudG9wKSwgeTEgPSBNYXRoLm1pbihhLnRvcCArIGEuaGVpZ2h0LCBiLnRvcCArIGIuaGVpZ2h0KTsKICAgIGlmKHkwIDw9IHkxKSB7CiAgICAgIHJldHVybiBuZXcgZ29vZy5tYXRoLlJlY3QoeDAsIHkwLCB4MSAtIHgwLCB5MSAtIHkwKQogICAgfQogIH0KICByZXR1cm4gbnVsbAp9Owpnb29nLm1hdGguUmVjdC5pbnRlcnNlY3RzID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRSZWN0JGludGVyc2VjdHMkKGEsIGIpIHsKICByZXR1cm4gYS5sZWZ0IDw9IGIubGVmdCArIGIud2lkdGggJiYgYi5sZWZ0IDw9IGEubGVmdCArIGEud2lkdGggJiYgYS50b3AgPD0gYi50b3AgKyBiLmhlaWdodCAmJiBiLnRvcCA8PSBhLnRvcCArIGEuaGVpZ2h0Cn07Cmdvb2cubWF0aC5SZWN0LnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRSZWN0JCRpbnRlcnNlY3RzJChyZWN0KSB7CiAgcmV0dXJuIGdvb2cubWF0aC5SZWN0LmludGVyc2VjdHModGhpcywgcmVjdCkKfTsKZ29vZy5tYXRoLlJlY3QuZGlmZmVyZW5jZSA9IGZ1bmN0aW9uICRnb29nJG1hdGgkUmVjdCRkaWZmZXJlbmNlJChhLCBiKSB7CiAgdmFyIGludGVyc2VjdGlvbiA9IGdvb2cubWF0aC5SZWN0LmludGVyc2VjdGlvbihhLCBiKTsKICBpZighaW50ZXJzZWN0aW9uIHx8ICFpbnRlcnNlY3Rpb24uaGVpZ2h0IHx8ICFpbnRlcnNlY3Rpb24ud2lkdGgpIHsKICAgIHJldHVyblthLmNsb25lKCldCiAgfQogIHZhciByZXN1bHQgPSBbXSwgdG9wID0gYS50b3AsIGhlaWdodCA9IGEuaGVpZ2h0LCBhciA9IGEubGVmdCArIGEud2lkdGgsIGFiID0gYS50b3AgKyBhLmhlaWdodCwgYnIgPSBiLmxlZnQgKyBiLndpZHRoLCBiYiA9IGIudG9wICsgYi5oZWlnaHQ7CiAgYi50b3AgPiBhLnRvcCAmJiAocmVzdWx0LnB1c2gobmV3IGdvb2cubWF0aC5SZWN0KGEubGVmdCwgYS50b3AsIGEud2lkdGgsIGIudG9wIC0gYS50b3ApKSwgdG9wID0gYi50b3AsIGhlaWdodCAtPSBiLnRvcCAtIGEudG9wKTsKICBiYiA8IGFiICYmIChyZXN1bHQucHVzaChuZXcgZ29vZy5tYXRoLlJlY3QoYS5sZWZ0LCBiYiwgYS53aWR0aCwgYWIgLSBiYikpLCBoZWlnaHQgPSBiYiAtIHRvcCk7CiAgYi5sZWZ0ID4gYS5sZWZ0ICYmIHJlc3VsdC5wdXNoKG5ldyBnb29nLm1hdGguUmVjdChhLmxlZnQsIHRvcCwgYi5sZWZ0IC0gYS5sZWZ0LCBoZWlnaHQpKTsKICBiciA8IGFyICYmIHJlc3VsdC5wdXNoKG5ldyBnb29nLm1hdGguUmVjdChiciwgdG9wLCBhciAtIGJyLCBoZWlnaHQpKTsKICByZXR1cm4gcmVzdWx0Cn07Cmdvb2cubWF0aC5SZWN0LnByb3RvdHlwZS5kaWZmZXJlbmNlID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRSZWN0JCRkaWZmZXJlbmNlJChyZWN0KSB7CiAgcmV0dXJuIGdvb2cubWF0aC5SZWN0LmRpZmZlcmVuY2UodGhpcywgcmVjdCkKfTsKZ29vZy5tYXRoLlJlY3QucHJvdG90eXBlLmJvdW5kaW5nUmVjdCA9IGZ1bmN0aW9uICRnb29nJG1hdGgkUmVjdCQkYm91bmRpbmdSZWN0JChyZWN0KSB7CiAgdmFyIHJpZ2h0ID0gTWF0aC5tYXgodGhpcy5sZWZ0ICsgdGhpcy53aWR0aCwgcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCksIGJvdHRvbSA9IE1hdGgubWF4KHRoaXMudG9wICsgdGhpcy5oZWlnaHQsIHJlY3QudG9wICsgcmVjdC5oZWlnaHQpOwogIHRoaXMubGVmdCA9IE1hdGgubWluKHRoaXMubGVmdCwgcmVjdC5sZWZ0KTsKICB0aGlzLnRvcCA9IE1hdGgubWluKHRoaXMudG9wLCByZWN0LnRvcCk7CiAgdGhpcy53aWR0aCA9IHJpZ2h0IC0gdGhpcy5sZWZ0OwogIHRoaXMuaGVpZ2h0ID0gYm90dG9tIC0gdGhpcy50b3AKfTsKZ29vZy5tYXRoLlJlY3QuYm91bmRpbmdSZWN0ID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRSZWN0JGJvdW5kaW5nUmVjdCQoYSwgYikgewogIGlmKCFhIHx8ICFiKSB7CiAgICByZXR1cm4gbnVsbAogIH0KICB2YXIgY2xvbmUgPSBhLmNsb25lKCk7CiAgY2xvbmUuYm91bmRpbmdSZWN0KGIpOwogIHJldHVybiBjbG9uZQp9Owpnb29nLm1hdGguUmVjdC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAkZ29vZyRtYXRoJFJlY3QkJGNvbnRhaW5zJChhbm90aGVyKSB7CiAgcmV0dXJuIGFub3RoZXIgaW5zdGFuY2VvZiBnb29nLm1hdGguUmVjdCA/IHRoaXMubGVmdCA8PSBhbm90aGVyLmxlZnQgJiYgdGhpcy5sZWZ0ICsgdGhpcy53aWR0aCA+PSBhbm90aGVyLmxlZnQgKyBhbm90aGVyLndpZHRoICYmIHRoaXMudG9wIDw9IGFub3RoZXIudG9wICYmIHRoaXMudG9wICsgdGhpcy5oZWlnaHQgPj0gYW5vdGhlci50b3AgKyBhbm90aGVyLmhlaWdodCA6IGFub3RoZXIueCA+PSB0aGlzLmxlZnQgJiYgYW5vdGhlci54IDw9IHRoaXMubGVmdCArIHRoaXMud2lkdGggJiYgYW5vdGhlci55ID49IHRoaXMudG9wICYmIGFub3RoZXIueSA8PSB0aGlzLnRvcCArIHRoaXMuaGVpZ2h0Cn07Cmdvb2cubWF0aC5SZWN0LnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24gJGdvb2ckbWF0aCRSZWN0JCRnZXRTaXplJCgpIHsKICByZXR1cm4gbmV3IGdvb2cubWF0aC5TaXplKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KQp9Owpnb29nLnN0eWxlID0ge307Cmdvb2cuc3R5bGUuc2V0U3R5bGUgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRzZXRTdHlsZSQoZWxlbWVudCwgc3R5bGUsIG9wdF92YWx1ZSkgewogIGdvb2cuaXNTdHJpbmcoc3R5bGUpID8gZ29vZy5zdHlsZS5zZXRTdHlsZV8oZWxlbWVudCwgb3B0X3ZhbHVlLCBzdHlsZSkgOiBnb29nLm9iamVjdC5mb3JFYWNoKHN0eWxlLCBnb29nLnBhcnRpYWwoZ29vZy5zdHlsZS5zZXRTdHlsZV8sIGVsZW1lbnQpKQp9Owpnb29nLnN0eWxlLnNldFN0eWxlXyA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJHNldFN0eWxlXyQoZWxlbWVudCwgdmFsdWUsIHN0eWxlKSB7CiAgZWxlbWVudC5zdHlsZVtnb29nLnN0cmluZy50b0NhbWVsQ2FzZShzdHlsZSldID0gdmFsdWUKfTsKZ29vZy5zdHlsZS5nZXRTdHlsZSA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldFN0eWxlJChlbGVtZW50LCBwcm9wZXJ0eSkgewogIHJldHVybiBlbGVtZW50LnN0eWxlW2dvb2cuc3RyaW5nLnRvQ2FtZWxDYXNlKHByb3BlcnR5KV0gfHwgIiIKfTsKZ29vZy5zdHlsZS5nZXRDb21wdXRlZFN0eWxlID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0Q29tcHV0ZWRTdHlsZSQoZWxlbWVudCwgcHJvcGVydHkpIHsKICB2YXIgZG9jID0gZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudChlbGVtZW50KTsKICBpZihkb2MuZGVmYXVsdFZpZXcgJiYgZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHsKICAgIHZhciBzdHlsZXMgPSBkb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTsKICAgIGlmKHN0eWxlcykgewogICAgICByZXR1cm4gc3R5bGVzW3Byb3BlcnR5XSB8fCBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSkKICAgIH0KICB9CiAgcmV0dXJuIiIKfTsKZ29vZy5zdHlsZS5nZXRDYXNjYWRlZFN0eWxlID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0Q2FzY2FkZWRTdHlsZSQoZWxlbWVudCwgc3R5bGUpIHsKICByZXR1cm4gZWxlbWVudC5jdXJyZW50U3R5bGUgPyBlbGVtZW50LmN1cnJlbnRTdHlsZVtzdHlsZV0gOiBudWxsCn07Cmdvb2cuc3R5bGUuZ2V0U3R5bGVfID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0U3R5bGVfJChlbGVtZW50LCBzdHlsZSkgewogIHJldHVybiBnb29nLnN0eWxlLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgc3R5bGUpIHx8IGdvb2cuc3R5bGUuZ2V0Q2FzY2FkZWRTdHlsZShlbGVtZW50LCBzdHlsZSkgfHwgZWxlbWVudC5zdHlsZSAmJiBlbGVtZW50LnN0eWxlW3N0eWxlXQp9Owpnb29nLnN0eWxlLmdldENvbXB1dGVkUG9zaXRpb24gPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRDb21wdXRlZFBvc2l0aW9uJChlbGVtZW50KSB7CiAgcmV0dXJuIGdvb2cuc3R5bGUuZ2V0U3R5bGVfKGVsZW1lbnQsICJwb3NpdGlvbiIpCn07Cmdvb2cuc3R5bGUuZ2V0QmFja2dyb3VuZENvbG9yID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0QmFja2dyb3VuZENvbG9yJChlbGVtZW50KSB7CiAgcmV0dXJuIGdvb2cuc3R5bGUuZ2V0U3R5bGVfKGVsZW1lbnQsICJiYWNrZ3JvdW5kQ29sb3IiKQp9Owpnb29nLnN0eWxlLmdldENvbXB1dGVkT3ZlcmZsb3dYID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0Q29tcHV0ZWRPdmVyZmxvd1gkKGVsZW1lbnQpIHsKICByZXR1cm4gZ29vZy5zdHlsZS5nZXRTdHlsZV8oZWxlbWVudCwgIm92ZXJmbG93WCIpCn07Cmdvb2cuc3R5bGUuZ2V0Q29tcHV0ZWRPdmVyZmxvd1kgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRDb21wdXRlZE92ZXJmbG93WSQoZWxlbWVudCkgewogIHJldHVybiBnb29nLnN0eWxlLmdldFN0eWxlXyhlbGVtZW50LCAib3ZlcmZsb3dZIikKfTsKZ29vZy5zdHlsZS5nZXRDb21wdXRlZFpJbmRleCA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldENvbXB1dGVkWkluZGV4JChlbGVtZW50KSB7CiAgcmV0dXJuIGdvb2cuc3R5bGUuZ2V0U3R5bGVfKGVsZW1lbnQsICJ6SW5kZXgiKQp9Owpnb29nLnN0eWxlLmdldENvbXB1dGVkVGV4dEFsaWduID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0Q29tcHV0ZWRUZXh0QWxpZ24kKGVsZW1lbnQpIHsKICByZXR1cm4gZ29vZy5zdHlsZS5nZXRTdHlsZV8oZWxlbWVudCwgInRleHRBbGlnbiIpCn07Cmdvb2cuc3R5bGUuZ2V0Q29tcHV0ZWRDdXJzb3IgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRDb21wdXRlZEN1cnNvciQoZWxlbWVudCkgewogIHJldHVybiBnb29nLnN0eWxlLmdldFN0eWxlXyhlbGVtZW50LCAiY3Vyc29yIikKfTsKZ29vZy5zdHlsZS5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJHNldFBvc2l0aW9uJChlbCwgYXJnMSwgb3B0X2FyZzIpIHsKICB2YXIgeCwgeSwgYnVnZ3lHZWNrb1N1YlBpeGVsUG9zID0gZ29vZy51c2VyQWdlbnQuR0VDS08gJiYgKGdvb2cudXNlckFnZW50Lk1BQyB8fCBnb29nLnVzZXJBZ2VudC5YMTEpICYmIGdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiMS45Iik7CiAgYXJnMSBpbnN0YW5jZW9mIGdvb2cubWF0aC5Db29yZGluYXRlID8gKHggPSBhcmcxLngsIHkgPSBhcmcxLnkpIDogKHggPSBhcmcxLCB5ID0gb3B0X2FyZzIpOwogIGVsLnN0eWxlLmxlZnQgPSBnb29nLnN0eWxlLmdldFBpeGVsU3R5bGVWYWx1ZV8oeCwgYnVnZ3lHZWNrb1N1YlBpeGVsUG9zKTsKICBlbC5zdHlsZS50b3AgPSBnb29nLnN0eWxlLmdldFBpeGVsU3R5bGVWYWx1ZV8oeSwgYnVnZ3lHZWNrb1N1YlBpeGVsUG9zKQp9Owpnb29nLnN0eWxlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0UG9zaXRpb24kKGVsZW1lbnQpIHsKICByZXR1cm4gbmV3IGdvb2cubWF0aC5Db29yZGluYXRlKGVsZW1lbnQub2Zmc2V0TGVmdCwgZWxlbWVudC5vZmZzZXRUb3ApCn07Cmdvb2cuc3R5bGUuZ2V0Q2xpZW50Vmlld3BvcnRFbGVtZW50ID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0Q2xpZW50Vmlld3BvcnRFbGVtZW50JChvcHRfbm9kZSkgewogIHZhciBkb2M7CiAgZG9jID0gb3B0X25vZGUgPyBvcHRfbm9kZS5ub2RlVHlwZSA9PSBnb29nLmRvbS5Ob2RlVHlwZS5ET0NVTUVOVCA/IG9wdF9ub2RlIDogZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudChvcHRfbm9kZSkgOiBnb29nLmRvbS5nZXREb2N1bWVudCgpOwogIHJldHVybiBnb29nLnVzZXJBZ2VudC5JRSAmJiAhZ29vZy51c2VyQWdlbnQuaXNEb2N1bWVudE1vZGUoOSkgJiYgIWdvb2cuZG9tLmdldERvbUhlbHBlcihkb2MpLmlzQ3NzMUNvbXBhdE1vZGUoKSA/IGRvYy5ib2R5IDogZG9jLmRvY3VtZW50RWxlbWVudAp9Owpnb29nLnN0eWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdF8gPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRCb3VuZGluZ0NsaWVudFJlY3RfJChlbCkgewogIHZhciByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgaWYoZ29vZy51c2VyQWdlbnQuSUUpIHsKICAgIHZhciBkb2MgPSBlbC5vd25lckRvY3VtZW50OwogICAgcmVjdC5sZWZ0IC09IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50TGVmdCArIGRvYy5ib2R5LmNsaWVudExlZnQ7CiAgICByZWN0LnRvcCAtPSBkb2MuZG9jdW1lbnRFbGVtZW50LmNsaWVudFRvcCArIGRvYy5ib2R5LmNsaWVudFRvcAogIH0KICByZXR1cm4gcmVjdAp9Owpnb29nLnN0eWxlLmdldE9mZnNldFBhcmVudCA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldE9mZnNldFBhcmVudCQoZWxlbWVudCkgewogIGlmKGdvb2cudXNlckFnZW50LklFICYmICFnb29nLnVzZXJBZ2VudC5pc0RvY3VtZW50TW9kZSg4KSkgewogICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50CiAgfQogIGZvcih2YXIgZG9jID0gZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudChlbGVtZW50KSwgcG9zaXRpb25TdHlsZSA9IGdvb2cuc3R5bGUuZ2V0U3R5bGVfKGVsZW1lbnQsICJwb3NpdGlvbiIpLCBza2lwU3RhdGljID0gImZpeGVkIiA9PSBwb3NpdGlvblN0eWxlIHx8ICJhYnNvbHV0ZSIgPT0gcG9zaXRpb25TdHlsZSwgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO3BhcmVudCAmJiBwYXJlbnQgIT0gZG9jO3BhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7CiAgICBpZihwb3NpdGlvblN0eWxlID0gZ29vZy5zdHlsZS5nZXRTdHlsZV8ocGFyZW50LCAicG9zaXRpb24iKSwgc2tpcFN0YXRpYyA9IHNraXBTdGF0aWMgJiYgInN0YXRpYyIgPT0gcG9zaXRpb25TdHlsZSAmJiBwYXJlbnQgIT0gZG9jLmRvY3VtZW50RWxlbWVudCAmJiBwYXJlbnQgIT0gZG9jLmJvZHksICFza2lwU3RhdGljICYmIChwYXJlbnQuc2Nyb2xsV2lkdGggPiBwYXJlbnQuY2xpZW50V2lkdGggfHwgcGFyZW50LnNjcm9sbEhlaWdodCA+IHBhcmVudC5jbGllbnRIZWlnaHQgfHwgImZpeGVkIiA9PSBwb3NpdGlvblN0eWxlIHx8ICJhYnNvbHV0ZSIgPT0gcG9zaXRpb25TdHlsZSB8fCAicmVsYXRpdmUiID09IHBvc2l0aW9uU3R5bGUpKSB7CiAgICAgIHJldHVybiBwYXJlbnQKICAgIH0KICB9CiAgcmV0dXJuIG51bGwKfTsKZ29vZy5zdHlsZS5nZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQkKGVsZW1lbnQpIHsKICBmb3IodmFyIHZpc2libGVSZWN0ID0gbmV3IGdvb2cubWF0aC5Cb3goMCwgSW5maW5pdHksIEluZmluaXR5LCAwKSwgZG9tID0gZ29vZy5kb20uZ2V0RG9tSGVscGVyKGVsZW1lbnQpLCBib2R5ID0gZG9tLmdldERvY3VtZW50KCkuYm9keSwgZG9jdW1lbnRFbGVtZW50ID0gZG9tLmdldERvY3VtZW50KCkuZG9jdW1lbnRFbGVtZW50LCBzY3JvbGxFbCA9IGRvbS5nZXREb2N1bWVudFNjcm9sbEVsZW1lbnQoKSwgZWwgPSBlbGVtZW50O2VsID0gZ29vZy5zdHlsZS5nZXRPZmZzZXRQYXJlbnQoZWwpOykgewogICAgaWYoKCFnb29nLnVzZXJBZ2VudC5JRSB8fCAwICE9IGVsLmNsaWVudFdpZHRoKSAmJiAoIWdvb2cudXNlckFnZW50LldFQktJVCB8fCAwICE9IGVsLmNsaWVudEhlaWdodCB8fCBlbCAhPSBib2R5KSAmJiBlbCAhPSBib2R5ICYmIGVsICE9IGRvY3VtZW50RWxlbWVudCAmJiAidmlzaWJsZSIgIT0gZ29vZy5zdHlsZS5nZXRTdHlsZV8oZWwsICJvdmVyZmxvdyIpKSB7CiAgICAgIHZhciBwb3MgPSBnb29nLnN0eWxlLmdldFBhZ2VPZmZzZXQoZWwpLCBjbGllbnQgPSBnb29nLnN0eWxlLmdldENsaWVudExlZnRUb3AoZWwpOwogICAgICBwb3MueCArPSBjbGllbnQueDsKICAgICAgcG9zLnkgKz0gY2xpZW50Lnk7CiAgICAgIHZpc2libGVSZWN0LnRvcCA9IE1hdGgubWF4KHZpc2libGVSZWN0LnRvcCwgcG9zLnkpOwogICAgICB2aXNpYmxlUmVjdC5yaWdodCA9IE1hdGgubWluKHZpc2libGVSZWN0LnJpZ2h0LCBwb3MueCArIGVsLmNsaWVudFdpZHRoKTsKICAgICAgdmlzaWJsZVJlY3QuYm90dG9tID0gTWF0aC5taW4odmlzaWJsZVJlY3QuYm90dG9tLCBwb3MueSArIGVsLmNsaWVudEhlaWdodCk7CiAgICAgIHZpc2libGVSZWN0LmxlZnQgPSBNYXRoLm1heCh2aXNpYmxlUmVjdC5sZWZ0LCBwb3MueCkKICAgIH0KICB9CiAgdmFyIHNjcm9sbFggPSBzY3JvbGxFbC5zY3JvbGxMZWZ0LCBzY3JvbGxZID0gc2Nyb2xsRWwuc2Nyb2xsVG9wOwogIHZpc2libGVSZWN0LmxlZnQgPSBNYXRoLm1heCh2aXNpYmxlUmVjdC5sZWZ0LCBzY3JvbGxYKTsKICB2aXNpYmxlUmVjdC50b3AgPSBNYXRoLm1heCh2aXNpYmxlUmVjdC50b3AsIHNjcm9sbFkpOwogIHZhciB3aW5TaXplID0gZG9tLmdldFZpZXdwb3J0U2l6ZSgpOwogIHZpc2libGVSZWN0LnJpZ2h0ID0gTWF0aC5taW4odmlzaWJsZVJlY3QucmlnaHQsIHNjcm9sbFggKyB3aW5TaXplLndpZHRoKTsKICB2aXNpYmxlUmVjdC5ib3R0b20gPSBNYXRoLm1pbih2aXNpYmxlUmVjdC5ib3R0b20sIHNjcm9sbFkgKyB3aW5TaXplLmhlaWdodCk7CiAgcmV0dXJuIDAgPD0gdmlzaWJsZVJlY3QudG9wICYmIDAgPD0gdmlzaWJsZVJlY3QubGVmdCAmJiB2aXNpYmxlUmVjdC5ib3R0b20gPiB2aXNpYmxlUmVjdC50b3AgJiYgdmlzaWJsZVJlY3QucmlnaHQgPiB2aXNpYmxlUmVjdC5sZWZ0ID8gdmlzaWJsZVJlY3QgOiBudWxsCn07Cmdvb2cuc3R5bGUuZ2V0Q29udGFpbmVyT2Zmc2V0VG9TY3JvbGxJbnRvID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0Q29udGFpbmVyT2Zmc2V0VG9TY3JvbGxJbnRvJChlbGVtZW50LCBjb250YWluZXIsIG9wdF9jZW50ZXIpIHsKICB2YXIgZWxlbWVudFBvcyA9IGdvb2cuc3R5bGUuZ2V0UGFnZU9mZnNldChlbGVtZW50KSwgY29udGFpbmVyUG9zID0gZ29vZy5zdHlsZS5nZXRQYWdlT2Zmc2V0KGNvbnRhaW5lciksIGNvbnRhaW5lckJvcmRlciA9IGdvb2cuc3R5bGUuZ2V0Qm9yZGVyQm94KGNvbnRhaW5lciksIHJlbFggPSBlbGVtZW50UG9zLnggLSBjb250YWluZXJQb3MueCAtIGNvbnRhaW5lckJvcmRlci5sZWZ0LCByZWxZID0gZWxlbWVudFBvcy55IC0gY29udGFpbmVyUG9zLnkgLSBjb250YWluZXJCb3JkZXIudG9wLCBzcGFjZVggPSBjb250YWluZXIuY2xpZW50V2lkdGggLSBlbGVtZW50Lm9mZnNldFdpZHRoLCBzcGFjZVkgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gZWxlbWVudC5vZmZzZXRIZWlnaHQsIHNjcm9sbExlZnQgPSBjb250YWluZXIuc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbFRvcDsKICBvcHRfY2VudGVyID8gKHNjcm9sbExlZnQgKz0gcmVsWCAtIHNwYWNlWCAvIDIsIHNjcm9sbFRvcCArPSByZWxZIC0gc3BhY2VZIC8gMikgOiAoc2Nyb2xsTGVmdCArPSBNYXRoLm1pbihyZWxYLCBNYXRoLm1heChyZWxYIC0gc3BhY2VYLCAwKSksIHNjcm9sbFRvcCArPSBNYXRoLm1pbihyZWxZLCBNYXRoLm1heChyZWxZIC0gc3BhY2VZLCAwKSkpOwogIHJldHVybiBuZXcgZ29vZy5tYXRoLkNvb3JkaW5hdGUoc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wKQp9Owpnb29nLnN0eWxlLnNjcm9sbEludG9Db250YWluZXJWaWV3ID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkc2Nyb2xsSW50b0NvbnRhaW5lclZpZXckKGVsZW1lbnQsIGNvbnRhaW5lciwgb3B0X2NlbnRlcikgewogIHZhciBvZmZzZXQgPSBnb29nLnN0eWxlLmdldENvbnRhaW5lck9mZnNldFRvU2Nyb2xsSW50byhlbGVtZW50LCBjb250YWluZXIsIG9wdF9jZW50ZXIpOwogIGNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gb2Zmc2V0Lng7CiAgY29udGFpbmVyLnNjcm9sbFRvcCA9IG9mZnNldC55Cn07Cmdvb2cuc3R5bGUuZ2V0Q2xpZW50TGVmdFRvcCA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldENsaWVudExlZnRUb3AkKGVsKSB7CiAgaWYoZ29vZy51c2VyQWdlbnQuR0VDS08gJiYgIWdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiMS45IikpIHsKICAgIHZhciBsZWZ0ID0gcGFyc2VGbG9hdChnb29nLnN0eWxlLmdldENvbXB1dGVkU3R5bGUoZWwsICJib3JkZXJMZWZ0V2lkdGgiKSk7CiAgICBpZihnb29nLnN0eWxlLmlzUmlnaHRUb0xlZnQoZWwpKSB7CiAgICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9IGVsLm9mZnNldFdpZHRoIC0gZWwuY2xpZW50V2lkdGggLSBsZWZ0IC0gcGFyc2VGbG9hdChnb29nLnN0eWxlLmdldENvbXB1dGVkU3R5bGUoZWwsICJib3JkZXJSaWdodFdpZHRoIikpLCBsZWZ0ID0gbGVmdCArIHNjcm9sbGJhcldpZHRoCiAgICB9CiAgICByZXR1cm4gbmV3IGdvb2cubWF0aC5Db29yZGluYXRlKGxlZnQsIHBhcnNlRmxvYXQoZ29vZy5zdHlsZS5nZXRDb21wdXRlZFN0eWxlKGVsLCAiYm9yZGVyVG9wV2lkdGgiKSkpCiAgfQogIHJldHVybiBuZXcgZ29vZy5tYXRoLkNvb3JkaW5hdGUoZWwuY2xpZW50TGVmdCwgZWwuY2xpZW50VG9wKQp9Owpnb29nLnN0eWxlLmdldFBhZ2VPZmZzZXQgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRQYWdlT2Zmc2V0JChlbCkgewogIHZhciBib3gsIGRvYyA9IGdvb2cuZG9tLmdldE93bmVyRG9jdW1lbnQoZWwpLCBwb3NpdGlvblN0eWxlID0gZ29vZy5zdHlsZS5nZXRTdHlsZV8oZWwsICJwb3NpdGlvbiIpLCBCVUdHWV9HRUNLT19CT1hfT0JKRUNUID0gZ29vZy51c2VyQWdlbnQuR0VDS08gJiYgZG9jLmdldEJveE9iamVjdEZvciAmJiAhZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmICJhYnNvbHV0ZSIgPT0gcG9zaXRpb25TdHlsZSAmJiAoYm94ID0gZG9jLmdldEJveE9iamVjdEZvcihlbCkpICYmICgwID4gYm94LnNjcmVlblggfHwgMCA+IGJveC5zY3JlZW5ZKSwgcG9zID0gbmV3IGdvb2cubWF0aC5Db29yZGluYXRlKDAsIDApLCB2aWV3cG9ydEVsZW1lbnQgPSBnb29nLnN0eWxlLmdldENsaWVudFZpZXdwb3J0RWxlbWVudChkb2MpOwogIGlmKGVsID09IHZpZXdwb3J0RWxlbWVudCkgewogICAgcmV0dXJuIHBvcwogIH0KICBpZihlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHsKICAgIGJveCA9IGdvb2cuc3R5bGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0XyhlbCk7CiAgICB2YXIgc2Nyb2xsQ29vcmQgPSBnb29nLmRvbS5nZXREb21IZWxwZXIoZG9jKS5nZXREb2N1bWVudFNjcm9sbCgpOwogICAgcG9zLnggPSBib3gubGVmdCArIHNjcm9sbENvb3JkLng7CiAgICBwb3MueSA9IGJveC50b3AgKyBzY3JvbGxDb29yZC55CiAgfWVsc2UgewogICAgaWYoZG9jLmdldEJveE9iamVjdEZvciAmJiAhQlVHR1lfR0VDS09fQk9YX09CSkVDVCkgewogICAgICBib3ggPSBkb2MuZ2V0Qm94T2JqZWN0Rm9yKGVsKTsKICAgICAgdmFyIHZwQm94ID0gZG9jLmdldEJveE9iamVjdEZvcih2aWV3cG9ydEVsZW1lbnQpOwogICAgICBwb3MueCA9IGJveC5zY3JlZW5YIC0gdnBCb3guc2NyZWVuWDsKICAgICAgcG9zLnkgPSBib3guc2NyZWVuWSAtIHZwQm94LnNjcmVlblkKICAgIH1lbHNlIHsKICAgICAgdmFyIHBhcmVudCA9IGVsOwogICAgICBkbyB7CiAgICAgICAgcG9zLnggKz0gcGFyZW50Lm9mZnNldExlZnQ7CiAgICAgICAgcG9zLnkgKz0gcGFyZW50Lm9mZnNldFRvcDsKICAgICAgICBwYXJlbnQgIT0gZWwgJiYgKHBvcy54ICs9IHBhcmVudC5jbGllbnRMZWZ0IHx8IDAsIHBvcy55ICs9IHBhcmVudC5jbGllbnRUb3AgfHwgMCk7CiAgICAgICAgaWYoZ29vZy51c2VyQWdlbnQuV0VCS0lUICYmICJmaXhlZCIgPT0gZ29vZy5zdHlsZS5nZXRDb21wdXRlZFBvc2l0aW9uKHBhcmVudCkpIHsKICAgICAgICAgIHBvcy54ICs9IGRvYy5ib2R5LnNjcm9sbExlZnQ7CiAgICAgICAgICBwb3MueSArPSBkb2MuYm9keS5zY3JvbGxUb3A7CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICBwYXJlbnQgPSBwYXJlbnQub2Zmc2V0UGFyZW50CiAgICAgIH13aGlsZShwYXJlbnQgJiYgcGFyZW50ICE9IGVsKTsKICAgICAgaWYoZ29vZy51c2VyQWdlbnQuT1BFUkEgfHwgZ29vZy51c2VyQWdlbnQuV0VCS0lUICYmICJhYnNvbHV0ZSIgPT0gcG9zaXRpb25TdHlsZSkgewogICAgICAgIHBvcy55IC09IGRvYy5ib2R5Lm9mZnNldFRvcAogICAgICB9CiAgICAgIGZvcihwYXJlbnQgPSBlbDsocGFyZW50ID0gZ29vZy5zdHlsZS5nZXRPZmZzZXRQYXJlbnQocGFyZW50KSkgJiYgcGFyZW50ICE9IGRvYy5ib2R5ICYmIHBhcmVudCAhPSB2aWV3cG9ydEVsZW1lbnQ7KSB7CiAgICAgICAgaWYocG9zLnggLT0gcGFyZW50LnNjcm9sbExlZnQsICFnb29nLnVzZXJBZ2VudC5PUEVSQSB8fCAiVFIiICE9IHBhcmVudC50YWdOYW1lKSB7CiAgICAgICAgICBwb3MueSAtPSBwYXJlbnQuc2Nyb2xsVG9wCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBwb3MKfTsKZ29vZy5zdHlsZS5nZXRQYWdlT2Zmc2V0TGVmdCA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldFBhZ2VPZmZzZXRMZWZ0JChlbCkgewogIHJldHVybiBnb29nLnN0eWxlLmdldFBhZ2VPZmZzZXQoZWwpLngKfTsKZ29vZy5zdHlsZS5nZXRQYWdlT2Zmc2V0VG9wID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0UGFnZU9mZnNldFRvcCQoZWwpIHsKICByZXR1cm4gZ29vZy5zdHlsZS5nZXRQYWdlT2Zmc2V0KGVsKS55Cn07Cmdvb2cuc3R5bGUuZ2V0RnJhbWVkUGFnZU9mZnNldCA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldEZyYW1lZFBhZ2VPZmZzZXQkKGVsLCByZWxhdGl2ZVdpbikgewogIHZhciBwb3NpdGlvbiA9IG5ldyBnb29nLm1hdGguQ29vcmRpbmF0ZSgwLCAwKSwgY3VycmVudFdpbiA9IGdvb2cuZG9tLmdldFdpbmRvdyhnb29nLmRvbS5nZXRPd25lckRvY3VtZW50KGVsKSksIGN1cnJlbnRFbCA9IGVsOwogIGRvIHsKICAgIHZhciBvZmZzZXQgPSBjdXJyZW50V2luID09IHJlbGF0aXZlV2luID8gZ29vZy5zdHlsZS5nZXRQYWdlT2Zmc2V0KGN1cnJlbnRFbCkgOiBnb29nLnN0eWxlLmdldENsaWVudFBvc2l0aW9uKGN1cnJlbnRFbCk7CiAgICBwb3NpdGlvbi54ICs9IG9mZnNldC54OwogICAgcG9zaXRpb24ueSArPSBvZmZzZXQueQogIH13aGlsZShjdXJyZW50V2luICYmIGN1cnJlbnRXaW4gIT0gcmVsYXRpdmVXaW4gJiYgKGN1cnJlbnRFbCA9IGN1cnJlbnRXaW4uZnJhbWVFbGVtZW50KSAmJiAoY3VycmVudFdpbiA9IGN1cnJlbnRXaW4ucGFyZW50KSk7CiAgcmV0dXJuIHBvc2l0aW9uCn07Cmdvb2cuc3R5bGUudHJhbnNsYXRlUmVjdEZvckFub3RoZXJGcmFtZSA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJHRyYW5zbGF0ZVJlY3RGb3JBbm90aGVyRnJhbWUkKHJlY3QsIG9yaWdCYXNlLCBuZXdCYXNlKSB7CiAgaWYob3JpZ0Jhc2UuZ2V0RG9jdW1lbnQoKSAhPSBuZXdCYXNlLmdldERvY3VtZW50KCkpIHsKICAgIHZhciBib2R5ID0gb3JpZ0Jhc2UuZ2V0RG9jdW1lbnQoKS5ib2R5LCBwb3MgPSBnb29nLnN0eWxlLmdldEZyYW1lZFBhZ2VPZmZzZXQoYm9keSwgbmV3QmFzZS5nZXRXaW5kb3coKSksIHBvcyA9IGdvb2cubWF0aC5Db29yZGluYXRlLmRpZmZlcmVuY2UocG9zLCBnb29nLnN0eWxlLmdldFBhZ2VPZmZzZXQoYm9keSkpOwogICAgZ29vZy51c2VyQWdlbnQuSUUgJiYgIW9yaWdCYXNlLmlzQ3NzMUNvbXBhdE1vZGUoKSAmJiAocG9zID0gZ29vZy5tYXRoLkNvb3JkaW5hdGUuZGlmZmVyZW5jZShwb3MsIG9yaWdCYXNlLmdldERvY3VtZW50U2Nyb2xsKCkpKTsKICAgIHJlY3QubGVmdCArPSBwb3MueDsKICAgIHJlY3QudG9wICs9IHBvcy55CiAgfQp9Owpnb29nLnN0eWxlLmdldFJlbGF0aXZlUG9zaXRpb24gPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRSZWxhdGl2ZVBvc2l0aW9uJChhLCBiKSB7CiAgdmFyIGFwID0gZ29vZy5zdHlsZS5nZXRDbGllbnRQb3NpdGlvbihhKSwgYnAgPSBnb29nLnN0eWxlLmdldENsaWVudFBvc2l0aW9uKGIpOwogIHJldHVybiBuZXcgZ29vZy5tYXRoLkNvb3JkaW5hdGUoYXAueCAtIGJwLngsIGFwLnkgLSBicC55KQp9Owpnb29nLnN0eWxlLmdldENsaWVudFBvc2l0aW9uID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0Q2xpZW50UG9zaXRpb24kKGVsKSB7CiAgdmFyIHBvcyA9IG5ldyBnb29nLm1hdGguQ29vcmRpbmF0ZTsKICBpZihlbC5ub2RlVHlwZSA9PSBnb29nLmRvbS5Ob2RlVHlwZS5FTEVNRU5UKSB7CiAgICBpZihlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHsKICAgICAgdmFyIGJveCA9IGdvb2cuc3R5bGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0XyhlbCk7CiAgICAgIHBvcy54ID0gYm94LmxlZnQ7CiAgICAgIHBvcy55ID0gYm94LnRvcAogICAgfWVsc2UgewogICAgICB2YXIgc2Nyb2xsQ29vcmQgPSBnb29nLmRvbS5nZXREb21IZWxwZXIoZWwpLmdldERvY3VtZW50U2Nyb2xsKCksIHBhZ2VDb29yZCA9IGdvb2cuc3R5bGUuZ2V0UGFnZU9mZnNldChlbCk7CiAgICAgIHBvcy54ID0gcGFnZUNvb3JkLnggLSBzY3JvbGxDb29yZC54OwogICAgICBwb3MueSA9IHBhZ2VDb29yZC55IC0gc2Nyb2xsQ29vcmQueQogICAgfQogIH1lbHNlIHsKICAgIHZhciBpc0Fic3RyYWN0ZWRFdmVudCA9IGdvb2cuaXNGdW5jdGlvbihlbC5nZXRCcm93c2VyRXZlbnQpLCB0YXJnZXRFdmVudCA9IGVsOwogICAgZWwudGFyZ2V0VG91Y2hlcyA/IHRhcmdldEV2ZW50ID0gZWwudGFyZ2V0VG91Y2hlc1swXSA6IGlzQWJzdHJhY3RlZEV2ZW50ICYmIGVsLmdldEJyb3dzZXJFdmVudCgpLnRhcmdldFRvdWNoZXMgJiYgKHRhcmdldEV2ZW50ID0gZWwuZ2V0QnJvd3NlckV2ZW50KCkudGFyZ2V0VG91Y2hlc1swXSk7CiAgICBwb3MueCA9IHRhcmdldEV2ZW50LmNsaWVudFg7CiAgICBwb3MueSA9IHRhcmdldEV2ZW50LmNsaWVudFkKICB9CiAgcmV0dXJuIHBvcwp9Owpnb29nLnN0eWxlLnNldFBhZ2VPZmZzZXQgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRzZXRQYWdlT2Zmc2V0JChlbCwgeCwgb3B0X3kpIHsKICB2YXIgY3VyID0gZ29vZy5zdHlsZS5nZXRQYWdlT2Zmc2V0KGVsKTsKICB4IGluc3RhbmNlb2YgZ29vZy5tYXRoLkNvb3JkaW5hdGUgJiYgKG9wdF95ID0geC55LCB4ID0geC54KTsKICB2YXIgZHggPSB4IC0gY3VyLngsIGR5ID0gb3B0X3kgLSBjdXIueTsKICBnb29nLnN0eWxlLnNldFBvc2l0aW9uKGVsLCBlbC5vZmZzZXRMZWZ0ICsgZHgsIGVsLm9mZnNldFRvcCArIGR5KQp9Owpnb29nLnN0eWxlLnNldFNpemUgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRzZXRTaXplJChlbGVtZW50LCB3LCBvcHRfaCkgewogIHZhciBoOwogIGlmKHcgaW5zdGFuY2VvZiBnb29nLm1hdGguU2l6ZSkgewogICAgaCA9IHcuaGVpZ2h0LCB3ID0gdy53aWR0aAogIH1lbHNlIHsKICAgIGlmKHZvaWQgMCA9PSBvcHRfaCkgewogICAgICB0aHJvdyBFcnJvcigibWlzc2luZyBoZWlnaHQgYXJndW1lbnQiKTsKICAgIH0KICAgIGggPSBvcHRfaAogIH0KICBnb29nLnN0eWxlLnNldFdpZHRoKGVsZW1lbnQsIHcpOwogIGdvb2cuc3R5bGUuc2V0SGVpZ2h0KGVsZW1lbnQsIGgpCn07Cmdvb2cuc3R5bGUuZ2V0UGl4ZWxTdHlsZVZhbHVlXyA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldFBpeGVsU3R5bGVWYWx1ZV8kKHZhbHVlLCByb3VuZCkgewogICJudW1iZXIiID09IHR5cGVvZiB2YWx1ZSAmJiAodmFsdWUgPSAocm91bmQgPyBNYXRoLnJvdW5kKHZhbHVlKSA6IHZhbHVlKSArICJweCIpOwogIHJldHVybiB2YWx1ZQp9Owpnb29nLnN0eWxlLnNldEhlaWdodCA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJHNldEhlaWdodCQoZWxlbWVudCwgaGVpZ2h0KSB7CiAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBnb29nLnN0eWxlLmdldFBpeGVsU3R5bGVWYWx1ZV8oaGVpZ2h0LCAhMCkKfTsKZ29vZy5zdHlsZS5zZXRXaWR0aCA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJHNldFdpZHRoJChlbGVtZW50LCB3aWR0aCkgewogIGVsZW1lbnQuc3R5bGUud2lkdGggPSBnb29nLnN0eWxlLmdldFBpeGVsU3R5bGVWYWx1ZV8od2lkdGgsICEwKQp9Owpnb29nLnN0eWxlLmdldFNpemUgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRTaXplJChlbGVtZW50KSB7CiAgaWYoIm5vbmUiICE9IGdvb2cuc3R5bGUuZ2V0U3R5bGVfKGVsZW1lbnQsICJkaXNwbGF5IikpIHsKICAgIHJldHVybiBnb29nLnN0eWxlLmdldFNpemVXaXRoRGlzcGxheV8oZWxlbWVudCkKICB9CiAgdmFyIHN0eWxlID0gZWxlbWVudC5zdHlsZSwgb3JpZ2luYWxEaXNwbGF5ID0gc3R5bGUuZGlzcGxheSwgb3JpZ2luYWxWaXNpYmlsaXR5ID0gc3R5bGUudmlzaWJpbGl0eSwgb3JpZ2luYWxQb3NpdGlvbiA9IHN0eWxlLnBvc2l0aW9uOwogIHN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICBzdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOwogIHZhciBzaXplID0gZ29vZy5zdHlsZS5nZXRTaXplV2l0aERpc3BsYXlfKGVsZW1lbnQpOwogIHN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CiAgc3R5bGUucG9zaXRpb24gPSBvcmlnaW5hbFBvc2l0aW9uOwogIHN0eWxlLnZpc2liaWxpdHkgPSBvcmlnaW5hbFZpc2liaWxpdHk7CiAgcmV0dXJuIHNpemUKfTsKZ29vZy5zdHlsZS5nZXRTaXplV2l0aERpc3BsYXlfID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0U2l6ZVdpdGhEaXNwbGF5XyQoZWxlbWVudCkgewogIHZhciBvZmZzZXRXaWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGgsIG9mZnNldEhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0LCB3ZWJraXRPZmZzZXRzWmVybyA9IGdvb2cudXNlckFnZW50LldFQktJVCAmJiAhb2Zmc2V0V2lkdGggJiYgIW9mZnNldEhlaWdodDsKICBpZigoIWdvb2cuaXNEZWYob2Zmc2V0V2lkdGgpIHx8IHdlYmtpdE9mZnNldHNaZXJvKSAmJiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCkgewogICAgdmFyIGNsaWVudFJlY3QgPSBnb29nLnN0eWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdF8oZWxlbWVudCk7CiAgICByZXR1cm4gbmV3IGdvb2cubWF0aC5TaXplKGNsaWVudFJlY3QucmlnaHQgLSBjbGllbnRSZWN0LmxlZnQsIGNsaWVudFJlY3QuYm90dG9tIC0gY2xpZW50UmVjdC50b3ApCiAgfQogIHJldHVybiBuZXcgZ29vZy5tYXRoLlNpemUob2Zmc2V0V2lkdGgsIG9mZnNldEhlaWdodCkKfTsKZ29vZy5zdHlsZS5nZXRCb3VuZHMgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRCb3VuZHMkKGVsZW1lbnQpIHsKICB2YXIgbyA9IGdvb2cuc3R5bGUuZ2V0UGFnZU9mZnNldChlbGVtZW50KSwgcyA9IGdvb2cuc3R5bGUuZ2V0U2l6ZShlbGVtZW50KTsKICByZXR1cm4gbmV3IGdvb2cubWF0aC5SZWN0KG8ueCwgby55LCBzLndpZHRoLCBzLmhlaWdodCkKfTsKZ29vZy5zdHlsZS50b0NhbWVsQ2FzZSA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJHRvQ2FtZWxDYXNlJChzZWxlY3RvcikgewogIHJldHVybiBnb29nLnN0cmluZy50b0NhbWVsQ2FzZSgiIiArIHNlbGVjdG9yKQp9Owpnb29nLnN0eWxlLnRvU2VsZWN0b3JDYXNlID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkdG9TZWxlY3RvckNhc2UkKHNlbGVjdG9yKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnRvU2VsZWN0b3JDYXNlKHNlbGVjdG9yKQp9Owpnb29nLnN0eWxlLmdldE9wYWNpdHkgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRPcGFjaXR5JChlbCkgewogIHZhciBzdHlsZSA9IGVsLnN0eWxlLCByZXN1bHQgPSAiIjsKICBpZigib3BhY2l0eSIgaW4gc3R5bGUpIHsKICAgIHJlc3VsdCA9IHN0eWxlLm9wYWNpdHkKICB9ZWxzZSB7CiAgICBpZigiTW96T3BhY2l0eSIgaW4gc3R5bGUpIHsKICAgICAgcmVzdWx0ID0gc3R5bGUuTW96T3BhY2l0eQogICAgfWVsc2UgewogICAgICBpZigiZmlsdGVyIiBpbiBzdHlsZSkgewogICAgICAgIHZhciBtYXRjaCA9IHN0eWxlLmZpbHRlci5tYXRjaCgvYWxwaGFcKG9wYWNpdHk9KFtcZC5dKylcKS8pOwogICAgICAgIG1hdGNoICYmIChyZXN1bHQgPSAiIiArIG1hdGNoWzFdIC8gMTAwKQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiIiID09IHJlc3VsdCA/IHJlc3VsdCA6IE51bWJlcihyZXN1bHQpCn07Cmdvb2cuc3R5bGUuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJHNldE9wYWNpdHkkKGVsLCBhbHBoYSkgewogIHZhciBzdHlsZSA9IGVsLnN0eWxlOwogICJvcGFjaXR5IiBpbiBzdHlsZSA/IHN0eWxlLm9wYWNpdHkgPSBhbHBoYSA6ICJNb3pPcGFjaXR5IiBpbiBzdHlsZSA/IHN0eWxlLk1vek9wYWNpdHkgPSBhbHBoYSA6ICJmaWx0ZXIiIGluIHN0eWxlICYmIChzdHlsZS5maWx0ZXIgPSAiIiA9PT0gYWxwaGEgPyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyAxMDAgKiBhbHBoYSArICIpIikKfTsKZ29vZy5zdHlsZS5zZXRUcmFuc3BhcmVudEJhY2tncm91bmRJbWFnZSA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJHNldFRyYW5zcGFyZW50QmFja2dyb3VuZEltYWdlJChlbCwgc3JjKSB7CiAgdmFyIHN0eWxlID0gZWwuc3R5bGU7CiAgZ29vZy51c2VyQWdlbnQuSUUgJiYgIWdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiOCIpID8gc3R5bGUuZmlsdGVyID0gJ3Byb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0iJyArIHNyYyArICciLCBzaXppbmdNZXRob2Q9ImNyb3AiKScgOiAoc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgc3JjICsgIikiLCBzdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSAidG9wIGxlZnQiLCBzdHlsZS5iYWNrZ3JvdW5kUmVwZWF0ID0gIm5vLXJlcGVhdCIpCn07Cmdvb2cuc3R5bGUuY2xlYXJUcmFuc3BhcmVudEJhY2tncm91bmRJbWFnZSA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGNsZWFyVHJhbnNwYXJlbnRCYWNrZ3JvdW5kSW1hZ2UkKGVsKSB7CiAgdmFyIHN0eWxlID0gZWwuc3R5bGU7CiAgImZpbHRlciIgaW4gc3R5bGUgPyBzdHlsZS5maWx0ZXIgPSAiIiA6IHN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJub25lIgp9Owpnb29nLnN0eWxlLnNob3dFbGVtZW50ID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkc2hvd0VsZW1lbnQkKGVsLCBkaXNwbGF5KSB7CiAgZWwuc3R5bGUuZGlzcGxheSA9IGRpc3BsYXkgPyAiIiA6ICJub25lIgp9Owpnb29nLnN0eWxlLmlzRWxlbWVudFNob3duID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkaXNFbGVtZW50U2hvd24kKGVsKSB7CiAgcmV0dXJuIm5vbmUiICE9IGVsLnN0eWxlLmRpc3BsYXkKfTsKZ29vZy5zdHlsZS5pbnN0YWxsU3R5bGVzID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkaW5zdGFsbFN0eWxlcyQoc3R5bGVzU3RyaW5nLCBvcHRfbm9kZSkgewogIHZhciBkaCA9IGdvb2cuZG9tLmdldERvbUhlbHBlcihvcHRfbm9kZSksIHN0eWxlU2hlZXQgPSBudWxsOwogIGlmKGdvb2cudXNlckFnZW50LklFKSB7CiAgICBzdHlsZVNoZWV0ID0gZGguZ2V0RG9jdW1lbnQoKS5jcmVhdGVTdHlsZVNoZWV0KCksIGdvb2cuc3R5bGUuc2V0U3R5bGVzKHN0eWxlU2hlZXQsIHN0eWxlc1N0cmluZykKICB9ZWxzZSB7CiAgICB2YXIgaGVhZCA9IGRoLmdldEVsZW1lbnRzQnlUYWdOYW1lQW5kQ2xhc3MoImhlYWQiKVswXTsKICAgIGlmKCFoZWFkKSB7CiAgICAgIHZhciBib2R5ID0gZGguZ2V0RWxlbWVudHNCeVRhZ05hbWVBbmRDbGFzcygiYm9keSIpWzBdLCBoZWFkID0gZGguY3JlYXRlRG9tKCJoZWFkIik7CiAgICAgIGJvZHkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaGVhZCwgYm9keSkKICAgIH0KICAgIHN0eWxlU2hlZXQgPSBkaC5jcmVhdGVEb20oInN0eWxlIik7CiAgICBnb29nLnN0eWxlLnNldFN0eWxlcyhzdHlsZVNoZWV0LCBzdHlsZXNTdHJpbmcpOwogICAgZGguYXBwZW5kQ2hpbGQoaGVhZCwgc3R5bGVTaGVldCkKICB9CiAgcmV0dXJuIHN0eWxlU2hlZXQKfTsKZ29vZy5zdHlsZS51bmluc3RhbGxTdHlsZXMgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSR1bmluc3RhbGxTdHlsZXMkKHN0eWxlU2hlZXQpIHsKICB2YXIgbm9kZSA9IHN0eWxlU2hlZXQub3duZXJOb2RlIHx8IHN0eWxlU2hlZXQub3duaW5nRWxlbWVudCB8fCBzdHlsZVNoZWV0OwogIGdvb2cuZG9tLnJlbW92ZU5vZGUobm9kZSkKfTsKZ29vZy5zdHlsZS5zZXRTdHlsZXMgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRzZXRTdHlsZXMkKGVsZW1lbnQsIHN0eWxlc1N0cmluZykgewogIGlmKGdvb2cudXNlckFnZW50LklFKSB7CiAgICBlbGVtZW50LmNzc1RleHQgPSBzdHlsZXNTdHJpbmcKICB9ZWxzZSB7CiAgICB2YXIgcHJvcFRvU2V0ID0gZ29vZy51c2VyQWdlbnQuV0VCS0lUID8gImlubmVyVGV4dCIgOiAiaW5uZXJIVE1MIjsKICAgIGVsZW1lbnRbcHJvcFRvU2V0XSA9IHN0eWxlc1N0cmluZwogIH0KfTsKZ29vZy5zdHlsZS5zZXRQcmVXcmFwID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkc2V0UHJlV3JhcCQoZWwpIHsKICB2YXIgc3R5bGUgPSBlbC5zdHlsZTsKICBnb29nLnVzZXJBZ2VudC5JRSAmJiAhZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uKCI4IikgPyAoc3R5bGUud2hpdGVTcGFjZSA9ICJwcmUiLCBzdHlsZS53b3JkV3JhcCA9ICJicmVhay13b3JkIikgOiBzdHlsZS53aGl0ZVNwYWNlID0gZ29vZy51c2VyQWdlbnQuR0VDS08gPyAiLW1vei1wcmUtd3JhcCIgOiAicHJlLXdyYXAiCn07Cmdvb2cuc3R5bGUuc2V0SW5saW5lQmxvY2sgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRzZXRJbmxpbmVCbG9jayQoZWwpIHsKICB2YXIgc3R5bGUgPSBlbC5zdHlsZTsKICBzdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CiAgZ29vZy51c2VyQWdlbnQuSUUgJiYgIWdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiOCIpID8gKHN0eWxlLnpvb20gPSAiMSIsIHN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIikgOiBzdHlsZS5kaXNwbGF5ID0gZ29vZy51c2VyQWdlbnQuR0VDS08gPyBnb29nLnVzZXJBZ2VudC5pc1ZlcnNpb24oIjEuOWEiKSA/ICJpbmxpbmUtYmxvY2siIDogIi1tb3otaW5saW5lLWJveCIgOiAiaW5saW5lLWJsb2NrIgp9Owpnb29nLnN0eWxlLmlzUmlnaHRUb0xlZnQgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRpc1JpZ2h0VG9MZWZ0JChlbCkgewogIHJldHVybiJydGwiID09IGdvb2cuc3R5bGUuZ2V0U3R5bGVfKGVsLCAiZGlyZWN0aW9uIikKfTsKZ29vZy5zdHlsZS51bnNlbGVjdGFibGVTdHlsZV8gPSBnb29nLnVzZXJBZ2VudC5HRUNLTyA/ICJNb3pVc2VyU2VsZWN0IiA6IGdvb2cudXNlckFnZW50LldFQktJVCA/ICJXZWJraXRVc2VyU2VsZWN0IiA6IG51bGw7Cmdvb2cuc3R5bGUuaXNVbnNlbGVjdGFibGUgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRpc1Vuc2VsZWN0YWJsZSQoZWwpIHsKICByZXR1cm4gZ29vZy5zdHlsZS51bnNlbGVjdGFibGVTdHlsZV8gPyAibm9uZSIgPT0gZWwuc3R5bGVbZ29vZy5zdHlsZS51bnNlbGVjdGFibGVTdHlsZV9dLnRvTG93ZXJDYXNlKCkgOiBnb29nLnVzZXJBZ2VudC5JRSB8fCBnb29nLnVzZXJBZ2VudC5PUEVSQSA/ICJvbiIgPT0gZWwuZ2V0QXR0cmlidXRlKCJ1bnNlbGVjdGFibGUiKSA6ICExCn07Cmdvb2cuc3R5bGUuc2V0VW5zZWxlY3RhYmxlID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkc2V0VW5zZWxlY3RhYmxlJChlbCwgdW5zZWxlY3RhYmxlLCBvcHRfbm9SZWN1cnNlKSB7CiAgdmFyIGRlc2NlbmRhbnRzID0gIW9wdF9ub1JlY3Vyc2UgPyBlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpIDogbnVsbCwgbmFtZSA9IGdvb2cuc3R5bGUudW5zZWxlY3RhYmxlU3R5bGVfOwogIGlmKG5hbWUpIHsKICAgIHZhciB2YWx1ZSA9IHVuc2VsZWN0YWJsZSA/ICJub25lIiA6ICIiOwogICAgZWwuc3R5bGVbbmFtZV0gPSB2YWx1ZTsKICAgIGlmKGRlc2NlbmRhbnRzKSB7CiAgICAgIGZvcih2YXIgaSA9IDAsIGRlc2NlbmRhbnQ7ZGVzY2VuZGFudCA9IGRlc2NlbmRhbnRzW2ldO2krKykgewogICAgICAgIGRlc2NlbmRhbnQuc3R5bGVbbmFtZV0gPSB2YWx1ZQogICAgICB9CiAgICB9CiAgfWVsc2UgewogICAgaWYoZ29vZy51c2VyQWdlbnQuSUUgfHwgZ29vZy51c2VyQWdlbnQuT1BFUkEpIHsKICAgICAgaWYodmFsdWUgPSB1bnNlbGVjdGFibGUgPyAib24iIDogIiIsIGVsLnNldEF0dHJpYnV0ZSgidW5zZWxlY3RhYmxlIiwgdmFsdWUpLCBkZXNjZW5kYW50cykgewogICAgICAgIGZvcihpID0gMDtkZXNjZW5kYW50ID0gZGVzY2VuZGFudHNbaV07aSsrKSB7CiAgICAgICAgICBkZXNjZW5kYW50LnNldEF0dHJpYnV0ZSgidW5zZWxlY3RhYmxlIiwgdmFsdWUpCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9Owpnb29nLnN0eWxlLmdldEJvcmRlckJveFNpemUgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRCb3JkZXJCb3hTaXplJChlbGVtZW50KSB7CiAgcmV0dXJuIG5ldyBnb29nLm1hdGguU2l6ZShlbGVtZW50Lm9mZnNldFdpZHRoLCBlbGVtZW50Lm9mZnNldEhlaWdodCkKfTsKZ29vZy5zdHlsZS5zZXRCb3JkZXJCb3hTaXplID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkc2V0Qm9yZGVyQm94U2l6ZSQoZWxlbWVudCwgc2l6ZSkgewogIHZhciBkb2MgPSBnb29nLmRvbS5nZXRPd25lckRvY3VtZW50KGVsZW1lbnQpLCBpc0NzczFDb21wYXRNb2RlID0gZ29vZy5kb20uZ2V0RG9tSGVscGVyKGRvYykuaXNDc3MxQ29tcGF0TW9kZSgpOwogIGlmKGdvb2cudXNlckFnZW50LklFICYmICghaXNDc3MxQ29tcGF0TW9kZSB8fCAhZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uKCI4IikpKSB7CiAgICB2YXIgc3R5bGUgPSBlbGVtZW50LnN0eWxlOwogICAgaWYoaXNDc3MxQ29tcGF0TW9kZSkgewogICAgICB2YXIgcGFkZGluZ0JveCA9IGdvb2cuc3R5bGUuZ2V0UGFkZGluZ0JveChlbGVtZW50KSwgYm9yZGVyQm94ID0gZ29vZy5zdHlsZS5nZXRCb3JkZXJCb3goZWxlbWVudCk7CiAgICAgIHN0eWxlLnBpeGVsV2lkdGggPSBzaXplLndpZHRoIC0gYm9yZGVyQm94LmxlZnQgLSBwYWRkaW5nQm94LmxlZnQgLSBwYWRkaW5nQm94LnJpZ2h0IC0gYm9yZGVyQm94LnJpZ2h0OwogICAgICBzdHlsZS5waXhlbEhlaWdodCA9IHNpemUuaGVpZ2h0IC0gYm9yZGVyQm94LnRvcCAtIHBhZGRpbmdCb3gudG9wIC0gcGFkZGluZ0JveC5ib3R0b20gLSBib3JkZXJCb3guYm90dG9tCiAgICB9ZWxzZSB7CiAgICAgIHN0eWxlLnBpeGVsV2lkdGggPSBzaXplLndpZHRoLCBzdHlsZS5waXhlbEhlaWdodCA9IHNpemUuaGVpZ2h0CiAgICB9CiAgfWVsc2UgewogICAgZ29vZy5zdHlsZS5zZXRCb3hTaXppbmdTaXplXyhlbGVtZW50LCBzaXplLCAiYm9yZGVyLWJveCIpCiAgfQp9Owpnb29nLnN0eWxlLmdldENvbnRlbnRCb3hTaXplID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0Q29udGVudEJveFNpemUkKGVsZW1lbnQpIHsKICB2YXIgZG9jID0gZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudChlbGVtZW50KSwgaWVDdXJyZW50U3R5bGUgPSBnb29nLnVzZXJBZ2VudC5JRSAmJiBlbGVtZW50LmN1cnJlbnRTdHlsZTsKICBpZihpZUN1cnJlbnRTdHlsZSAmJiBnb29nLmRvbS5nZXREb21IZWxwZXIoZG9jKS5pc0NzczFDb21wYXRNb2RlKCkgJiYgImF1dG8iICE9IGllQ3VycmVudFN0eWxlLndpZHRoICYmICJhdXRvIiAhPSBpZUN1cnJlbnRTdHlsZS5oZWlnaHQgJiYgIWllQ3VycmVudFN0eWxlLmJveFNpemluZykgewogICAgdmFyIHdpZHRoID0gZ29vZy5zdHlsZS5nZXRJZVBpeGVsVmFsdWVfKGVsZW1lbnQsIGllQ3VycmVudFN0eWxlLndpZHRoLCAid2lkdGgiLCAicGl4ZWxXaWR0aCIpLCBoZWlnaHQgPSBnb29nLnN0eWxlLmdldEllUGl4ZWxWYWx1ZV8oZWxlbWVudCwgaWVDdXJyZW50U3R5bGUuaGVpZ2h0LCAiaGVpZ2h0IiwgInBpeGVsSGVpZ2h0Iik7CiAgICByZXR1cm4gbmV3IGdvb2cubWF0aC5TaXplKHdpZHRoLCBoZWlnaHQpCiAgfQogIHZhciBib3JkZXJCb3hTaXplID0gZ29vZy5zdHlsZS5nZXRCb3JkZXJCb3hTaXplKGVsZW1lbnQpLCBwYWRkaW5nQm94ID0gZ29vZy5zdHlsZS5nZXRQYWRkaW5nQm94KGVsZW1lbnQpLCBib3JkZXJCb3ggPSBnb29nLnN0eWxlLmdldEJvcmRlckJveChlbGVtZW50KTsKICByZXR1cm4gbmV3IGdvb2cubWF0aC5TaXplKGJvcmRlckJveFNpemUud2lkdGggLSBib3JkZXJCb3gubGVmdCAtIHBhZGRpbmdCb3gubGVmdCAtIHBhZGRpbmdCb3gucmlnaHQgLSBib3JkZXJCb3gucmlnaHQsIGJvcmRlckJveFNpemUuaGVpZ2h0IC0gYm9yZGVyQm94LnRvcCAtIHBhZGRpbmdCb3gudG9wIC0gcGFkZGluZ0JveC5ib3R0b20gLSBib3JkZXJCb3guYm90dG9tKQp9Owpnb29nLnN0eWxlLnNldENvbnRlbnRCb3hTaXplID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkc2V0Q29udGVudEJveFNpemUkKGVsZW1lbnQsIHNpemUpIHsKICB2YXIgZG9jID0gZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudChlbGVtZW50KSwgaXNDc3MxQ29tcGF0TW9kZSA9IGdvb2cuZG9tLmdldERvbUhlbHBlcihkb2MpLmlzQ3NzMUNvbXBhdE1vZGUoKTsKICBpZihnb29nLnVzZXJBZ2VudC5JRSAmJiAoIWlzQ3NzMUNvbXBhdE1vZGUgfHwgIWdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiOCIpKSkgewogICAgdmFyIHN0eWxlID0gZWxlbWVudC5zdHlsZTsKICAgIGlmKGlzQ3NzMUNvbXBhdE1vZGUpIHsKICAgICAgc3R5bGUucGl4ZWxXaWR0aCA9IHNpemUud2lkdGgsIHN0eWxlLnBpeGVsSGVpZ2h0ID0gc2l6ZS5oZWlnaHQKICAgIH1lbHNlIHsKICAgICAgdmFyIHBhZGRpbmdCb3ggPSBnb29nLnN0eWxlLmdldFBhZGRpbmdCb3goZWxlbWVudCksIGJvcmRlckJveCA9IGdvb2cuc3R5bGUuZ2V0Qm9yZGVyQm94KGVsZW1lbnQpOwogICAgICBzdHlsZS5waXhlbFdpZHRoID0gc2l6ZS53aWR0aCArIGJvcmRlckJveC5sZWZ0ICsgcGFkZGluZ0JveC5sZWZ0ICsgcGFkZGluZ0JveC5yaWdodCArIGJvcmRlckJveC5yaWdodDsKICAgICAgc3R5bGUucGl4ZWxIZWlnaHQgPSBzaXplLmhlaWdodCArIGJvcmRlckJveC50b3AgKyBwYWRkaW5nQm94LnRvcCArIHBhZGRpbmdCb3guYm90dG9tICsgYm9yZGVyQm94LmJvdHRvbQogICAgfQogIH1lbHNlIHsKICAgIGdvb2cuc3R5bGUuc2V0Qm94U2l6aW5nU2l6ZV8oZWxlbWVudCwgc2l6ZSwgImNvbnRlbnQtYm94IikKICB9Cn07Cmdvb2cuc3R5bGUuc2V0Qm94U2l6aW5nU2l6ZV8gPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRzZXRCb3hTaXppbmdTaXplXyQoZWxlbWVudCwgc2l6ZSwgYm94U2l6aW5nKSB7CiAgdmFyIHN0eWxlID0gZWxlbWVudC5zdHlsZTsKICBnb29nLnVzZXJBZ2VudC5HRUNLTyA/IHN0eWxlLk1vekJveFNpemluZyA9IGJveFNpemluZyA6IGdvb2cudXNlckFnZW50LldFQktJVCA/IHN0eWxlLldlYmtpdEJveFNpemluZyA9IGJveFNpemluZyA6IHN0eWxlLmJveFNpemluZyA9IGJveFNpemluZzsKICBzdHlsZS53aWR0aCA9IE1hdGgubWF4KHNpemUud2lkdGgsIDApICsgInB4IjsKICBzdHlsZS5oZWlnaHQgPSBNYXRoLm1heChzaXplLmhlaWdodCwgMCkgKyAicHgiCn07Cmdvb2cuc3R5bGUuZ2V0SWVQaXhlbFZhbHVlXyA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldEllUGl4ZWxWYWx1ZV8kKGVsZW1lbnQsIHZhbHVlLCBuYW1lLCBwaXhlbE5hbWUpIHsKICBpZigvXlxkK3B4PyQvLnRlc3QodmFsdWUpKSB7CiAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKQogIH0KICB2YXIgb2xkU3R5bGVWYWx1ZSA9IGVsZW1lbnQuc3R5bGVbbmFtZV0sIG9sZFJ1bnRpbWVWYWx1ZSA9IGVsZW1lbnQucnVudGltZVN0eWxlW25hbWVdOwogIGVsZW1lbnQucnVudGltZVN0eWxlW25hbWVdID0gZWxlbWVudC5jdXJyZW50U3R5bGVbbmFtZV07CiAgZWxlbWVudC5zdHlsZVtuYW1lXSA9IHZhbHVlOwogIHZhciBwaXhlbFZhbHVlID0gZWxlbWVudC5zdHlsZVtwaXhlbE5hbWVdOwogIGVsZW1lbnQuc3R5bGVbbmFtZV0gPSBvbGRTdHlsZVZhbHVlOwogIGVsZW1lbnQucnVudGltZVN0eWxlW25hbWVdID0gb2xkUnVudGltZVZhbHVlOwogIHJldHVybiBwaXhlbFZhbHVlCn07Cmdvb2cuc3R5bGUuZ2V0SWVQaXhlbERpc3RhbmNlXyA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldEllUGl4ZWxEaXN0YW5jZV8kKGVsZW1lbnQsIHByb3BOYW1lKSB7CiAgcmV0dXJuIGdvb2cuc3R5bGUuZ2V0SWVQaXhlbFZhbHVlXyhlbGVtZW50LCBnb29nLnN0eWxlLmdldENhc2NhZGVkU3R5bGUoZWxlbWVudCwgcHJvcE5hbWUpLCAibGVmdCIsICJwaXhlbExlZnQiKQp9Owpnb29nLnN0eWxlLmdldEJveF8gPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRCb3hfJChlbGVtZW50LCBzdHlsZVByZWZpeCkgewogIGlmKGdvb2cudXNlckFnZW50LklFKSB7CiAgICB2YXIgbGVmdCA9IGdvb2cuc3R5bGUuZ2V0SWVQaXhlbERpc3RhbmNlXyhlbGVtZW50LCBzdHlsZVByZWZpeCArICJMZWZ0IiksIHJpZ2h0ID0gZ29vZy5zdHlsZS5nZXRJZVBpeGVsRGlzdGFuY2VfKGVsZW1lbnQsIHN0eWxlUHJlZml4ICsgIlJpZ2h0IiksIHRvcCA9IGdvb2cuc3R5bGUuZ2V0SWVQaXhlbERpc3RhbmNlXyhlbGVtZW50LCBzdHlsZVByZWZpeCArICJUb3AiKSwgYm90dG9tID0gZ29vZy5zdHlsZS5nZXRJZVBpeGVsRGlzdGFuY2VfKGVsZW1lbnQsIHN0eWxlUHJlZml4ICsgIkJvdHRvbSIpOwogICAgcmV0dXJuIG5ldyBnb29nLm1hdGguQm94KHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCkKICB9CiAgbGVmdCA9IGdvb2cuc3R5bGUuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBzdHlsZVByZWZpeCArICJMZWZ0Iik7CiAgcmlnaHQgPSBnb29nLnN0eWxlLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgc3R5bGVQcmVmaXggKyAiUmlnaHQiKTsKICB0b3AgPSBnb29nLnN0eWxlLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgc3R5bGVQcmVmaXggKyAiVG9wIik7CiAgYm90dG9tID0gZ29vZy5zdHlsZS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIHN0eWxlUHJlZml4ICsgIkJvdHRvbSIpOwogIHJldHVybiBuZXcgZ29vZy5tYXRoLkJveChwYXJzZUZsb2F0KHRvcCksIHBhcnNlRmxvYXQocmlnaHQpLCBwYXJzZUZsb2F0KGJvdHRvbSksIHBhcnNlRmxvYXQobGVmdCkpCn07Cmdvb2cuc3R5bGUuZ2V0UGFkZGluZ0JveCA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldFBhZGRpbmdCb3gkKGVsZW1lbnQpIHsKICByZXR1cm4gZ29vZy5zdHlsZS5nZXRCb3hfKGVsZW1lbnQsICJwYWRkaW5nIikKfTsKZ29vZy5zdHlsZS5nZXRNYXJnaW5Cb3ggPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRNYXJnaW5Cb3gkKGVsZW1lbnQpIHsKICByZXR1cm4gZ29vZy5zdHlsZS5nZXRCb3hfKGVsZW1lbnQsICJtYXJnaW4iKQp9Owpnb29nLnN0eWxlLmllQm9yZGVyV2lkdGhLZXl3b3Jkc18gPSB7dGhpbjoyLCBtZWRpdW06NCwgdGhpY2s6Nn07Cmdvb2cuc3R5bGUuZ2V0SWVQaXhlbEJvcmRlcl8gPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRJZVBpeGVsQm9yZGVyXyQoZWxlbWVudCwgcHJvcCkgewogIGlmKCJub25lIiA9PSBnb29nLnN0eWxlLmdldENhc2NhZGVkU3R5bGUoZWxlbWVudCwgcHJvcCArICJTdHlsZSIpKSB7CiAgICByZXR1cm4gMAogIH0KICB2YXIgd2lkdGggPSBnb29nLnN0eWxlLmdldENhc2NhZGVkU3R5bGUoZWxlbWVudCwgcHJvcCArICJXaWR0aCIpOwogIHJldHVybiB3aWR0aCBpbiBnb29nLnN0eWxlLmllQm9yZGVyV2lkdGhLZXl3b3Jkc18gPyBnb29nLnN0eWxlLmllQm9yZGVyV2lkdGhLZXl3b3Jkc19bd2lkdGhdIDogZ29vZy5zdHlsZS5nZXRJZVBpeGVsVmFsdWVfKGVsZW1lbnQsIHdpZHRoLCAibGVmdCIsICJwaXhlbExlZnQiKQp9Owpnb29nLnN0eWxlLmdldEJvcmRlckJveCA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldEJvcmRlckJveCQoZWxlbWVudCkgewogIGlmKGdvb2cudXNlckFnZW50LklFKSB7CiAgICB2YXIgbGVmdCA9IGdvb2cuc3R5bGUuZ2V0SWVQaXhlbEJvcmRlcl8oZWxlbWVudCwgImJvcmRlckxlZnQiKSwgcmlnaHQgPSBnb29nLnN0eWxlLmdldEllUGl4ZWxCb3JkZXJfKGVsZW1lbnQsICJib3JkZXJSaWdodCIpLCB0b3AgPSBnb29nLnN0eWxlLmdldEllUGl4ZWxCb3JkZXJfKGVsZW1lbnQsICJib3JkZXJUb3AiKSwgYm90dG9tID0gZ29vZy5zdHlsZS5nZXRJZVBpeGVsQm9yZGVyXyhlbGVtZW50LCAiYm9yZGVyQm90dG9tIik7CiAgICByZXR1cm4gbmV3IGdvb2cubWF0aC5Cb3godG9wLCByaWdodCwgYm90dG9tLCBsZWZ0KQogIH0KICBsZWZ0ID0gZ29vZy5zdHlsZS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsICJib3JkZXJMZWZ0V2lkdGgiKTsKICByaWdodCA9IGdvb2cuc3R5bGUuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCAiYm9yZGVyUmlnaHRXaWR0aCIpOwogIHRvcCA9IGdvb2cuc3R5bGUuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCAiYm9yZGVyVG9wV2lkdGgiKTsKICBib3R0b20gPSBnb29nLnN0eWxlLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgImJvcmRlckJvdHRvbVdpZHRoIik7CiAgcmV0dXJuIG5ldyBnb29nLm1hdGguQm94KHBhcnNlRmxvYXQodG9wKSwgcGFyc2VGbG9hdChyaWdodCksIHBhcnNlRmxvYXQoYm90dG9tKSwgcGFyc2VGbG9hdChsZWZ0KSkKfTsKZ29vZy5zdHlsZS5nZXRGb250RmFtaWx5ID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0Rm9udEZhbWlseSQoZWwpIHsKICB2YXIgZG9jID0gZ29vZy5kb20uZ2V0T3duZXJEb2N1bWVudChlbCksIGZvbnQgPSAiIjsKICBpZihkb2MuYm9keS5jcmVhdGVUZXh0UmFuZ2UpIHsKICAgIHZhciByYW5nZSA9IGRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwogICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQoZWwpOwogICAgdHJ5IHsKICAgICAgZm9udCA9IHJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCJGb250TmFtZSIpCiAgICB9Y2F0Y2goZSkgewogICAgICBmb250ID0gIiIKICAgIH0KICB9CiAgZm9udCB8fCAoZm9udCA9IGdvb2cuc3R5bGUuZ2V0U3R5bGVfKGVsLCAiZm9udEZhbWlseSIpKTsKICB2YXIgZm9udHNBcnJheSA9IGZvbnQuc3BsaXQoIiwiKTsKICAxIDwgZm9udHNBcnJheS5sZW5ndGggJiYgKGZvbnQgPSBmb250c0FycmF5WzBdKTsKICByZXR1cm4gZ29vZy5zdHJpbmcuc3RyaXBRdW90ZXMoZm9udCwgIlwiJyIpCn07Cmdvb2cuc3R5bGUubGVuZ3RoVW5pdFJlZ2V4XyA9IC9bXlxkXSskLzsKZ29vZy5zdHlsZS5nZXRMZW5ndGhVbml0cyA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldExlbmd0aFVuaXRzJCh2YWx1ZSkgewogIHZhciB1bml0cyA9IHZhbHVlLm1hdGNoKGdvb2cuc3R5bGUubGVuZ3RoVW5pdFJlZ2V4Xyk7CiAgcmV0dXJuIHVuaXRzICYmIHVuaXRzWzBdIHx8IG51bGwKfTsKZ29vZy5zdHlsZS5BQlNPTFVURV9DU1NfTEVOR1RIX1VOSVRTXyA9IHtjbToxLCAiaW4iOjEsIG1tOjEsIHBjOjEsIHB0OjF9Owpnb29nLnN0eWxlLkNPTlZFUlRJQkxFX1JFTEFUSVZFX0NTU19VTklUU18gPSB7ZW06MSwgZXg6MX07Cmdvb2cuc3R5bGUuZ2V0Rm9udFNpemUgPSBmdW5jdGlvbiAkZ29vZyRzdHlsZSRnZXRGb250U2l6ZSQoZWwpIHsKICB2YXIgZm9udFNpemUgPSBnb29nLnN0eWxlLmdldFN0eWxlXyhlbCwgImZvbnRTaXplIiksIHNpemVVbml0cyA9IGdvb2cuc3R5bGUuZ2V0TGVuZ3RoVW5pdHMoZm9udFNpemUpOwogIGlmKGZvbnRTaXplICYmICJweCIgPT0gc2l6ZVVuaXRzKSB7CiAgICByZXR1cm4gcGFyc2VJbnQoZm9udFNpemUsIDEwKQogIH0KICBpZihnb29nLnVzZXJBZ2VudC5JRSkgewogICAgaWYoc2l6ZVVuaXRzIGluIGdvb2cuc3R5bGUuQUJTT0xVVEVfQ1NTX0xFTkdUSF9VTklUU18pIHsKICAgICAgcmV0dXJuIGdvb2cuc3R5bGUuZ2V0SWVQaXhlbFZhbHVlXyhlbCwgZm9udFNpemUsICJsZWZ0IiwgInBpeGVsTGVmdCIpCiAgICB9CiAgICBpZihlbC5wYXJlbnROb2RlICYmIGVsLnBhcmVudE5vZGUubm9kZVR5cGUgPT0gZ29vZy5kb20uTm9kZVR5cGUuRUxFTUVOVCAmJiBzaXplVW5pdHMgaW4gZ29vZy5zdHlsZS5DT05WRVJUSUJMRV9SRUxBVElWRV9DU1NfVU5JVFNfKSB7CiAgICAgIHZhciBwYXJlbnRFbGVtZW50ID0gZWwucGFyZW50Tm9kZSwgcGFyZW50U2l6ZSA9IGdvb2cuc3R5bGUuZ2V0U3R5bGVfKHBhcmVudEVsZW1lbnQsICJmb250U2l6ZSIpOwogICAgICByZXR1cm4gZ29vZy5zdHlsZS5nZXRJZVBpeGVsVmFsdWVfKHBhcmVudEVsZW1lbnQsIGZvbnRTaXplID09IHBhcmVudFNpemUgPyAiMWVtIiA6IGZvbnRTaXplLCAibGVmdCIsICJwaXhlbExlZnQiKQogICAgfQogIH0KICB2YXIgc2l6ZUVsZW1lbnQgPSBnb29nLmRvbS5jcmVhdGVEb20oInNwYW4iLCB7c3R5bGU6InZpc2liaWxpdHk6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRlO2xpbmUtaGVpZ2h0OjA7cGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2hlaWdodDoxZW07In0pOwogIGdvb2cuZG9tLmFwcGVuZENoaWxkKGVsLCBzaXplRWxlbWVudCk7CiAgZm9udFNpemUgPSBzaXplRWxlbWVudC5vZmZzZXRIZWlnaHQ7CiAgZ29vZy5kb20ucmVtb3ZlTm9kZShzaXplRWxlbWVudCk7CiAgcmV0dXJuIGZvbnRTaXplCn07Cmdvb2cuc3R5bGUucGFyc2VTdHlsZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJHBhcnNlU3R5bGVBdHRyaWJ1dGUkKHZhbHVlKSB7CiAgdmFyIHJlc3VsdCA9IHt9OwogIGdvb2cuYXJyYXkuZm9yRWFjaCh2YWx1ZS5zcGxpdCgvXHMqO1xzKi8pLCBmdW5jdGlvbihwYWlyKSB7CiAgICB2YXIga2V5VmFsdWUgPSBwYWlyLnNwbGl0KC9ccyo6XHMqLyk7CiAgICAyID09IGtleVZhbHVlLmxlbmd0aCAmJiAocmVzdWx0W2dvb2cuc3RyaW5nLnRvQ2FtZWxDYXNlKGtleVZhbHVlWzBdLnRvTG93ZXJDYXNlKCkpXSA9IGtleVZhbHVlWzFdKQogIH0pOwogIHJldHVybiByZXN1bHQKfTsKZ29vZy5zdHlsZS50b1N0eWxlQXR0cmlidXRlID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkdG9TdHlsZUF0dHJpYnV0ZSQob2JqKSB7CiAgdmFyIGJ1ZmZlciA9IFtdOwogIGdvb2cub2JqZWN0LmZvckVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICBidWZmZXIucHVzaChnb29nLnN0cmluZy50b1NlbGVjdG9yQ2FzZShrZXkpLCAiOiIsIHZhbHVlLCAiOyIpCiAgfSk7CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKQp9Owpnb29nLnN0eWxlLnNldEZsb2F0ID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkc2V0RmxvYXQkKGVsLCB2YWx1ZSkgewogIGVsLnN0eWxlW2dvb2cudXNlckFnZW50LklFID8gInN0eWxlRmxvYXQiIDogImNzc0Zsb2F0Il0gPSB2YWx1ZQp9Owpnb29nLnN0eWxlLmdldEZsb2F0ID0gZnVuY3Rpb24gJGdvb2ckc3R5bGUkZ2V0RmxvYXQkKGVsKSB7CiAgcmV0dXJuIGVsLnN0eWxlW2dvb2cudXNlckFnZW50LklFID8gInN0eWxlRmxvYXQiIDogImNzc0Zsb2F0Il0gfHwgIiIKfTsKZ29vZy5zdHlsZS5nZXRTY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uICRnb29nJHN0eWxlJGdldFNjcm9sbGJhcldpZHRoJChvcHRfY2xhc3NOYW1lKSB7CiAgdmFyIG91dGVyRGl2ID0gZ29vZy5kb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgb3B0X2NsYXNzTmFtZSAmJiAob3V0ZXJEaXYuY2xhc3NOYW1lID0gb3B0X2NsYXNzTmFtZSk7CiAgb3V0ZXJEaXYuc3R5bGUuY3NzVGV4dCA9ICJ2aXNpYmxpdHk6aGlkZGVuO292ZXJmbG93OmF1dG87cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7d2lkdGg6MTAwcHg7aGVpZ2h0OjEwMHB4IjsKICB2YXIgaW5uZXJEaXYgPSBnb29nLmRvbS5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICBnb29nLnN0eWxlLnNldFNpemUoaW5uZXJEaXYsICIyMDBweCIsICIyMDBweCIpOwogIG91dGVyRGl2LmFwcGVuZENoaWxkKGlubmVyRGl2KTsKICBnb29nLmRvbS5hcHBlbmRDaGlsZChnb29nLmRvbS5nZXREb2N1bWVudCgpLmJvZHksIG91dGVyRGl2KTsKICB2YXIgd2lkdGggPSBvdXRlckRpdi5vZmZzZXRXaWR0aCAtIG91dGVyRGl2LmNsaWVudFdpZHRoOwogIGdvb2cuZG9tLnJlbW92ZU5vZGUob3V0ZXJEaXYpOwogIHJldHVybiB3aWR0aAp9Owp0YWxrLm1lZGlhLmMzZCA9IHt9Owp0YWxrLm1lZGlhLmMzZC5DM2RPYmplY3QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQzNkT2JqZWN0JChvcHRfcmVuZGVyTW9kZSwgb3B0X3Ntb290aE1vZGUsIG9wdF9jbGVhckNvbG9yKSB7CiAgdGhpcy5yZW5kZXJNb2RlXyA9IG9wdF9yZW5kZXJNb2RlIHx8ICJBdXRvIjsKICB0aGlzLnNtb290aE1vZGVfID0gb3B0X3Ntb290aE1vZGUgfHwgITE7CiAgdGhpcy5jbGVhckNvbG9yXyA9IG9wdF9jbGVhckNvbG9yIHx8IFswLCAwLCAwLCAxXQp9Owp0YWxrLm1lZGlhLmMzZC5DM2RPYmplY3Quc3RhdGljSWRDb3VudF8gPSAxOwp0YWxrLm1lZGlhLmMzZC5DM2RPYmplY3QucHJvdG90eXBlLndyaXRlSFRNTCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRDM2RPYmplY3QkJHdyaXRlSFRNTCQoY29udGFpbmVyLCBvcHRfaWQpIHsKICB0aGlzLmNvbnRhaW5lcl8gPSBnb29nLmRvbS5nZXRFbGVtZW50KGNvbnRhaW5lcik7CiAgdGhpcy5kb21fID0gZ29vZy5kb20uZ2V0RG9tSGVscGVyKHRoaXMuY29udGFpbmVyXyk7CiAgdGhpcy5pZF8gPSBvcHRfaWQgfHwgImNsaWVudDNkIiArIHRhbGsubWVkaWEuYzNkLkMzZE9iamVjdC5zdGF0aWNJZENvdW50XysrOwogIHZhciBjbGllbnQzRERldGVjdG9yID0gbmV3IHRhbGsubWVkaWEuQ2xpZW50M0REZXRlY3RvciwgaHRtbCwgcGx1Z2luSWQ7CiAgZ29vZy51c2VyQWdlbnQuSUUgPyAoaHRtbCA9ICc8b2JqZWN0IGNsYXNzaWQ9IkNMU0lEOiVzIiB0YWJJbmRleD0iLTEiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGlkPSIlcyI+PHBhcmFtIG5hbWU9Im8zZF9mZWF0dXJlcyIgdmFsdWU9IlJlbmRlck1vZGU9JXMsQmFja2dyb3VuZENvbG9yPVslczolczolczolc10lcyIvPjwvb2JqZWN0PicsIHBsdWdpbklkID0gY2xpZW50M0REZXRlY3Rvci5pc0xlZ2FjeVBsdWdpbigpID8gIjk2NjZBNzcyLTQwN0UtNEY5MC1CQzM3LTk4MkU4MTYwRUIyRCIgOiAiOTc5M2ZiYmYtZTlkYi0zYjAxLWIzMjItMzQzMGNiY2YzY2Q1IikgOiAoaHRtbCA9ICc8b2JqZWN0IHR5cGU9IiVzIiB0YWJJbmRleD0iLTEiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGlkPSIlcyIgbzNkX2ZlYXR1cmVzPSJSZW5kZXJNb2RlPSVzLEJhY2tncm91bmRDb2xvcj1bJXM6JXM6JXM6JXNdJXMiPjwvb2JqZWN0PicsIHBsdWdpbklkID0gY2xpZW50M0REZXRlY3Rvci5pc0xlZ2FjeVBsdWdpbigpID8gCiAgImFwcGxpY2F0aW9uL3ZuZC5vM2QuYXV0byIgOiAiYXBwbGljYXRpb24vdm5kLmd0cG8zZC5hdXRvIik7CiAgdGhpcy5jb250YWluZXJfLmlubmVySFRNTCA9IGdvb2cuc3RyaW5nLnN1YnMoaHRtbCwgcGx1Z2luSWQsIHRoaXMuaWRfLCB0aGlzLnJlbmRlck1vZGVfLCB0aGlzLmNsZWFyQ29sb3JfWzBdLCB0aGlzLmNsZWFyQ29sb3JfWzFdLCB0aGlzLmNsZWFyQ29sb3JfWzJdLCB0aGlzLmNsZWFyQ29sb3JfWzNdLCB0aGlzLnNtb290aE1vZGVfID8gIixTbW9vdGhUZXh0dXJlVXBkYXRlcyIgOiAiIik7CiAgdGhpcy5jM2RfID0gdGhpcy5kb21fLmdldEVsZW1lbnQodGhpcy5pZF8pCn07CnRhbGsubWVkaWEuYzNkLkMzZE9iamVjdC5wcm90b3R5cGUuZ2V0UGx1Z2luID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEMzZE9iamVjdCQkZ2V0UGx1Z2luJCgpIHsKICByZXR1cm4gdGhpcy5jM2RfCn07CnRhbGsubWVkaWEuYzNkLkMzZE9iamVjdC5wcm90b3R5cGUuaXNTY3JpcHRhYmxlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEMzZE9iamVjdCQkaXNTY3JpcHRhYmxlJCgpIHsKICByZXR1cm4gZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5jM2RfKSAmJiBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmMzZF8uY2xpZW50KQp9Owp0YWxrLm1lZGlhLmMzZC5DM2RPYmplY3QucHJvdG90eXBlLnJlbW92ZUhUTUwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQzNkT2JqZWN0JCRyZW1vdmVIVE1MJCgpIHsKICB0aGlzLmNvbnRhaW5lcl8gJiYgKHRoaXMuY29udGFpbmVyXy5pbm5lckhUTUwgPSAiIik7CiAgZGVsZXRlIHRoaXMuY29udGFpbmVyXzsKICBkZWxldGUgdGhpcy5kb21fOwogIGRlbGV0ZSB0aGlzLmlkXzsKICBkZWxldGUgdGhpcy5jM2RfCn07CnRhbGsubWVkaWEuYzNkLkMzZE9iamVjdC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQzNkT2JqZWN0JCRnZXRXaWR0aCQoKSB7CiAgcmV0dXJuIGdvb2cuc3R5bGUuZ2V0U2l6ZSh0aGlzLmMzZF8pLndpZHRoCn07CnRhbGsubWVkaWEuYzNkLkMzZE9iamVjdC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEMzZE9iamVjdCQkZ2V0SGVpZ2h0JCgpIHsKICByZXR1cm4gZ29vZy5zdHlsZS5nZXRTaXplKHRoaXMuYzNkXykuaGVpZ2h0Cn07CnRhbGsubWVkaWEuYzNkLkMzZE9iamVjdC5wcm90b3R5cGUuaXNSZW5kZXJlclVuaW5pdGlhbGl6ZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQzNkT2JqZWN0JCRpc1JlbmRlcmVyVW5pbml0aWFsaXplZCQoKSB7CiAgcmV0dXJuIXRoaXMuaXNTY3JpcHRhYmxlKCkgfHwgdGhpcy5jM2RfLmNsaWVudC5yZW5kZXJlckluaXRTdGF0dXMgPT0gdGhpcy5jM2RfLm8zZC5SZW5kZXJlci5VTklOSVRJQUxJWkVECn07CnRhbGsubWVkaWEuYzNkLmhlbHBlcnMgPSB7fTsKdGFsay5tZWRpYS5jM2QuY29tcHV0ZVRleHR1cmVDb29yZHMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkY29tcHV0ZVRleHR1cmVDb29yZHMkKGVtYldpZHRoLCBlbWJIZWlnaHQsIGJ1ZldpZHRoLCBidWZIZWlnaHQsIG1pcnJvclgsIG1pcnJvclkpIHsKICB2YXIgdyA9IGVtYldpZHRoIC8gYnVmV2lkdGgsIGggPSBlbWJIZWlnaHQgLyBidWZIZWlnaHQ7CiAgcmV0dXJuW21pcnJvclggPyB3IDogMCwgbWlycm9yWSA/IGggOiAwLCBtaXJyb3JYID8gdyA6IDAsIG1pcnJvclkgPyAwIDogaCwgbWlycm9yWCA/IDAgOiB3LCBtaXJyb3JZID8gMCA6IGgsIG1pcnJvclggPyAwIDogdywgbWlycm9yWSA/IGggOiAwXQp9Owp0YWxrLm1lZGlhLmMzZC5jcmVhdGVPcnRob2dyYXBoaWNNYXRyaXggPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkY3JlYXRlT3J0aG9ncmFwaGljTWF0cml4JChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikgewogIHJldHVybltbMiAvIChyaWdodCAtIGxlZnQpLCAwLCAwLCAwXSwgWzAsIDIgLyAodG9wIC0gYm90dG9tKSwgMCwgMF0sIFswLCAwLCAxIC8gKG5lYXIgLSBmYXIpLCAwXSwgWyhsZWZ0ICsgcmlnaHQpIC8gKGxlZnQgLSByaWdodCksIChib3R0b20gKyB0b3ApIC8gKGJvdHRvbSAtIHRvcCksIG5lYXIgLyAobmVhciAtIGZhciksIDFdXQp9Owp0YWxrLm1lZGlhLmMzZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2Qkbm9ybWFsaXplJChhKSB7CiAgZm9yKHZhciByID0gW10sIG4gPSAwLCBhTGVuZ3RoID0gYS5sZW5ndGgsIGkgPSAwO2kgPCBhTGVuZ3RoOysraSkgewogICAgbiArPSBhW2ldICogYVtpXQogIH0KICBuID0gTWF0aC5zcXJ0KG4pOwogIGZvcihpID0gMDtpIDwgYUxlbmd0aDsrK2kpIHsKICAgIHJbaV0gPSBhW2ldIC8gbgogIH0KICByZXR1cm4gcgp9Owp0YWxrLm1lZGlhLmMzZC5zdWJWZWN0b3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2Qkc3ViVmVjdG9yJChhLCBiKSB7CiAgZm9yKHZhciByID0gW10sIGFMZW5ndGggPSBhLmxlbmd0aCwgaSA9IDA7aSA8IGFMZW5ndGg7KytpKSB7CiAgICByW2ldID0gYVtpXSAtIGJbaV0KICB9CiAgcmV0dXJuIHIKfTsKdGFsay5tZWRpYS5jM2QuY3Jvc3MgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkY3Jvc3MkKGEsIGIpIHsKICByZXR1cm5bYVsxXSAqIGJbMl0gLSBhWzJdICogYlsxXSwgYVsyXSAqIGJbMF0gLSBhWzBdICogYlsyXSwgYVswXSAqIGJbMV0gLSBhWzFdICogYlswXV0KfTsKdGFsay5tZWRpYS5jM2QuaW52ZXJzZTQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkaW52ZXJzZTQkKG0pIHsKICB2YXIgdG1wXzAgPSBtWzJdWzJdICogbVszXVszXSwgdG1wXzEgPSBtWzNdWzJdICogbVsyXVszXSwgdG1wXzIgPSBtWzFdWzJdICogbVszXVszXSwgdG1wXzMgPSBtWzNdWzJdICogbVsxXVszXSwgdG1wXzQgPSBtWzFdWzJdICogbVsyXVszXSwgdG1wXzUgPSBtWzJdWzJdICogbVsxXVszXSwgdG1wXzYgPSBtWzBdWzJdICogbVszXVszXSwgdG1wXzcgPSBtWzNdWzJdICogbVswXVszXSwgdG1wXzggPSBtWzBdWzJdICogbVsyXVszXSwgdG1wXzkgPSBtWzJdWzJdICogbVswXVszXSwgdG1wXzEwID0gbVswXVsyXSAqIG1bMV1bM10sIHRtcF8xMSA9IG1bMV1bMl0gKiBtWzBdWzNdLCB0bXBfMTIgPSBtWzJdWzBdICogbVszXVsxXSwgdG1wXzEzID0gbVszXVswXSAqIG1bMl1bMV0sIHRtcF8xNCA9IG1bMV1bMF0gKiBtWzNdWzFdLCB0bXBfMTUgPSBtWzNdWzBdICogbVsxXVsxXSwgdG1wXzE2ID0gbVsxXVswXSAqIG1bMl1bMV0sIHRtcF8xNyA9IG1bMl1bMF0gKiBtWzFdWzFdLCB0bXBfMTggPSAKICBtWzBdWzBdICogbVszXVsxXSwgdG1wXzE5ID0gbVszXVswXSAqIG1bMF1bMV0sIHRtcF8yMCA9IG1bMF1bMF0gKiBtWzJdWzFdLCB0bXBfMjEgPSBtWzJdWzBdICogbVswXVsxXSwgdG1wXzIyID0gbVswXVswXSAqIG1bMV1bMV0sIHRtcF8yMyA9IG1bMV1bMF0gKiBtWzBdWzFdLCB0MCA9IHRtcF8wICogbVsxXVsxXSArIHRtcF8zICogbVsyXVsxXSArIHRtcF80ICogbVszXVsxXSAtICh0bXBfMSAqIG1bMV1bMV0gKyB0bXBfMiAqIG1bMl1bMV0gKyB0bXBfNSAqIG1bM11bMV0pLCB0MSA9IHRtcF8xICogbVswXVsxXSArIHRtcF82ICogbVsyXVsxXSArIHRtcF85ICogbVszXVsxXSAtICh0bXBfMCAqIG1bMF1bMV0gKyB0bXBfNyAqIG1bMl1bMV0gKyB0bXBfOCAqIG1bM11bMV0pLCB0MiA9IHRtcF8yICogbVswXVsxXSArIHRtcF83ICogbVsxXVsxXSArIHRtcF8xMCAqIG1bM11bMV0gLSAodG1wXzMgKiBtWzBdWzFdICsgdG1wXzYgKiBtWzFdWzFdICsgdG1wXzExICogbVszXVsxXSksIAogIHQzID0gdG1wXzUgKiBtWzBdWzFdICsgdG1wXzggKiBtWzFdWzFdICsgdG1wXzExICogbVsyXVsxXSAtICh0bXBfNCAqIG1bMF1bMV0gKyB0bXBfOSAqIG1bMV1bMV0gKyB0bXBfMTAgKiBtWzJdWzFdKSwgZCA9IDEgLyAobVswXVswXSAqIHQwICsgbVsxXVswXSAqIHQxICsgbVsyXVswXSAqIHQyICsgbVszXVswXSAqIHQzKTsKICByZXR1cm5bW2QgKiB0MCwgZCAqIHQxLCBkICogdDIsIGQgKiB0M10sIFtkICogKHRtcF8xICogbVsxXVswXSArIHRtcF8yICogbVsyXVswXSArIHRtcF81ICogbVszXVswXSAtICh0bXBfMCAqIG1bMV1bMF0gKyB0bXBfMyAqIG1bMl1bMF0gKyB0bXBfNCAqIG1bM11bMF0pKSwgZCAqICh0bXBfMCAqIG1bMF1bMF0gKyB0bXBfNyAqIG1bMl1bMF0gKyB0bXBfOCAqIG1bM11bMF0gLSAodG1wXzEgKiBtWzBdWzBdICsgdG1wXzYgKiBtWzJdWzBdICsgdG1wXzkgKiBtWzNdWzBdKSksIGQgKiAodG1wXzMgKiBtWzBdWzBdICsgdG1wXzYgKiBtWzFdWzBdICsgdG1wXzExICogbVszXVswXSAtICh0bXBfMiAqIG1bMF1bMF0gKyB0bXBfNyAqIG1bMV1bMF0gKyB0bXBfMTAgKiBtWzNdWzBdKSksIGQgKiAodG1wXzQgKiBtWzBdWzBdICsgdG1wXzkgKiBtWzFdWzBdICsgdG1wXzEwICogbVsyXVswXSAtICh0bXBfNSAqIG1bMF1bMF0gKyB0bXBfOCAqIG1bMV1bMF0gKyB0bXBfMTEgKiBtWzJdWzBdKSldLCAKICBbZCAqICh0bXBfMTIgKiBtWzFdWzNdICsgdG1wXzE1ICogbVsyXVszXSArIHRtcF8xNiAqIG1bM11bM10gLSAodG1wXzEzICogbVsxXVszXSArIHRtcF8xNCAqIG1bMl1bM10gKyB0bXBfMTcgKiBtWzNdWzNdKSksIGQgKiAodG1wXzEzICogbVswXVszXSArIHRtcF8xOCAqIG1bMl1bM10gKyB0bXBfMjEgKiBtWzNdWzNdIC0gKHRtcF8xMiAqIG1bMF1bM10gKyB0bXBfMTkgKiBtWzJdWzNdICsgdG1wXzIwICogbVszXVszXSkpLCBkICogKHRtcF8xNCAqIG1bMF1bM10gKyB0bXBfMTkgKiBtWzFdWzNdICsgdG1wXzIyICogbVszXVszXSAtICh0bXBfMTUgKiBtWzBdWzNdICsgdG1wXzE4ICogbVsxXVszXSArIHRtcF8yMyAqIG1bM11bM10pKSwgZCAqICh0bXBfMTcgKiBtWzBdWzNdICsgdG1wXzIwICogbVsxXVszXSArIHRtcF8yMyAqIG1bMl1bM10gLSAodG1wXzE2ICogbVswXVszXSArIHRtcF8yMSAqIG1bMV1bM10gKyB0bXBfMjIgKiBtWzJdWzNdKSldLCBbZCAqICh0bXBfMTQgKiAKICBtWzJdWzJdICsgdG1wXzE3ICogbVszXVsyXSArIHRtcF8xMyAqIG1bMV1bMl0gLSAodG1wXzE2ICogbVszXVsyXSArIHRtcF8xMiAqIG1bMV1bMl0gKyB0bXBfMTUgKiBtWzJdWzJdKSksIGQgKiAodG1wXzIwICogbVszXVsyXSArIHRtcF8xMiAqIG1bMF1bMl0gKyB0bXBfMTkgKiBtWzJdWzJdIC0gKHRtcF8xOCAqIG1bMl1bMl0gKyB0bXBfMjEgKiBtWzNdWzJdICsgdG1wXzEzICogbVswXVsyXSkpLCBkICogKHRtcF8xOCAqIG1bMV1bMl0gKyB0bXBfMjMgKiBtWzNdWzJdICsgdG1wXzE1ICogbVswXVsyXSAtICh0bXBfMjIgKiBtWzNdWzJdICsgdG1wXzE0ICogbVswXVsyXSArIHRtcF8xOSAqIG1bMV1bMl0pKSwgZCAqICh0bXBfMjIgKiBtWzJdWzJdICsgdG1wXzE2ICogbVswXVsyXSArIHRtcF8yMSAqIG1bMV1bMl0gLSAodG1wXzIwICogbVsxXVsyXSArIHRtcF8yMyAqIG1bMl1bMl0gKyB0bXBfMTcgKiBtWzBdWzJdKSldXQp9Owp0YWxrLm1lZGlhLmMzZC5jcmVhdGVMb29rQXRNYXRyaXggPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkY3JlYXRlTG9va0F0TWF0cml4JChleWUsIHRhcmdldCwgdXApIHsKICB2YXIgdnogPSB0YWxrLm1lZGlhLmMzZC5ub3JtYWxpemUodGFsay5tZWRpYS5jM2Quc3ViVmVjdG9yKGV5ZSwgdGFyZ2V0KS5zbGljZSgwLCAzKSkuY29uY2F0KDApLCB2eCA9IHRhbGsubWVkaWEuYzNkLm5vcm1hbGl6ZSh0YWxrLm1lZGlhLmMzZC5jcm9zcyh1cCwgdnopKS5jb25jYXQoMCksIHZ5ID0gdGFsay5tZWRpYS5jM2QuY3Jvc3ModnosIHZ4KS5jb25jYXQoMCk7CiAgcmV0dXJuIHRhbGsubWVkaWEuYzNkLmludmVyc2U0KFt2eCwgdnksIHZ6LCBleWUuY29uY2F0KDEpXSkKfTsKdGFsay5tZWRpYS5jM2QuYWRkRXZlbnRDYWxsYmFjayA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRhZGRFdmVudENhbGxiYWNrJChjM2QsIHR5cGUsIGhhbmRsZXIpIHsKICBjM2QuZXZlbnRDYWxsYmFja01hcCA9IGMzZC5ldmVudENhbGxiYWNrTWFwIHx8IFtdOwogIHZhciBjYWxsYmFja3MgPSBjM2QuZXZlbnRDYWxsYmFja01hcFt0eXBlXTsKICBpZighY2FsbGJhY2tzIHx8IDAgPT0gY2FsbGJhY2tzLmxlbmd0aCkgewogICAgY2FsbGJhY2tzID0gYzNkLmV2ZW50Q2FsbGJhY2tNYXBbdHlwZV0gPSBbXSwgYzNkLmNsaWVudC5zZXRFdmVudENhbGxiYWNrKHR5cGUsIGdvb2cuYmluZChmdW5jdGlvbihldmVudCkgewogICAgICBmb3IodmFyIGkgaW4gY2FsbGJhY2tzKSB7CiAgICAgICAgY2FsbGJhY2tzW2ldKGV2ZW50KQogICAgICB9CiAgICB9LCBjYWxsYmFja3MpKQogIH1lbHNlIHsKICAgIGZvcih2YXIgaSQkMCBpbiBjYWxsYmFja3MpIHsKICAgICAgaWYoY2FsbGJhY2tzW2kkJDBdID09IGhhbmRsZXIpIHsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgfQogIH0KICBjYWxsYmFja3MucHVzaChoYW5kbGVyKQp9Owp0YWxrLm1lZGlhLmMzZC5yZW1vdmVFdmVudENhbGxiYWNrID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJHJlbW92ZUV2ZW50Q2FsbGJhY2skKGMzZCwgdHlwZSwgaGFuZGxlcikgewogIGlmKGMzZC5ldmVudENhbGxiYWNrTWFwKSB7CiAgICB2YXIgY2FsbGJhY2tzID0gYzNkLmV2ZW50Q2FsbGJhY2tNYXBbdHlwZV07CiAgICBpZihjYWxsYmFja3MpIHsKICAgICAgZm9yKHZhciBpIGluIGNhbGxiYWNrcykgewogICAgICAgIGlmKGNhbGxiYWNrc1tpXSA9PSBoYW5kbGVyKSB7CiAgICAgICAgICAxID09IGNhbGxiYWNrcy5sZW5ndGggJiYgYzNkLmNsaWVudC5jbGVhckV2ZW50Q2FsbGJhY2sodHlwZSk7CiAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGksIDEpOwogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CnRhbGsubWVkaWEuYzNkLnBvd2VyT2ZUd29DZWlsaW5nID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJHBvd2VyT2ZUd29DZWlsaW5nJCh2YWwpIHsKICBpZigwID49IHZhbCkgewogICAgcmV0dXJuIDAKICB9CiAgdmFsLS07CiAgZm9yKHZhciBzaGlmdCA9IDE7MCAhPSAodmFsICsgMSAmIHZhbCk7KSB7CiAgICB2YWwgfD0gdmFsID4+IHNoaWZ0LCBzaGlmdCA8PD0gMQogIH0KICByZXR1cm4gdmFsICsgMQp9Owp0YWxrLm1lZGlhLmMzZC5yYXN0ZXJpemVTb2xpZFF1YXJ0ZXJDaXJjbGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkcmFzdGVyaXplU29saWRRdWFydGVyQ2lyY2xlJChjYW52YXMsIGNhbnZhc1BhaW50LCB4LCB5LCByYWRpdXMsIHF1YWRyYW50KSB7CiAgaWYoISgwLjUgPiByYWRpdXMpKSB7CiAgICBmb3IodmFyIHNxdWFyZVNpemUgPSBNYXRoLmZsb29yKE1hdGguc3FydChyYWRpdXMgKiByYWRpdXMgLyAyKSksIHhtdWx0ID0gMSA9PSBxdWFkcmFudCB8fCAyID09IHF1YWRyYW50ID8gMSA6IC0xLCB5bXVsdCA9IDIgPT0gcXVhZHJhbnQgfHwgMyA9PSBxdWFkcmFudCA/IDEgOiAtMSwgaSA9IDA7aSA8PSBzcXVhcmVTaXplO2krKykgewogICAgICB2YXIgbGluZUNlbnRlciA9IGkgKyAwLjUsIGxpbmVMZW5ndGggPSBNYXRoLnNxcnQocmFkaXVzICogcmFkaXVzIC0gbGluZUNlbnRlciAqIGxpbmVDZW50ZXIpOwogICAgICBjYW52YXMuZHJhd1JlY3QoeCArIGkgKiB4bXVsdCwgeSArIHNxdWFyZVNpemUgKiB5bXVsdCwgeCArIChpICsgMSkgKiB4bXVsdCwgeSArIGxpbmVMZW5ndGggKiB5bXVsdCwgY2FudmFzUGFpbnQpOwogICAgICBpICE9IHNxdWFyZVNpemUgJiYgY2FudmFzLmRyYXdSZWN0KHgsIHkgKyBpICogeW11bHQsIHggKyBsaW5lTGVuZ3RoICogeG11bHQsIHkgKyAoaSArIDEpICogeW11bHQsIGNhbnZhc1BhaW50KQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5jM2QuQzNkRXZlbnRUYXJnZXQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQzNkRXZlbnRUYXJnZXQkKCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5ib3VuZE9uS2V5UHJlc3NfID0gZ29vZy5iaW5kKHRoaXMub25LZXlQcmVzc18sIHRoaXMpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuQzNkRXZlbnRUYXJnZXQsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKdGFsay5tZWRpYS5jM2QuQzNkRXZlbnRUYXJnZXQuTWFwcGVkRXZlbnRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEMzZEV2ZW50VGFyZ2V0JE1hcHBlZEV2ZW50XyQoZSkgewogIHRoaXMudHlwZSA9IGUudHlwZTsKICB0aGlzLmtleUNvZGUgPSBlLmtleUNvZGU7CiAgdGhpcy53aGljaCA9ICh0aGlzLmNoYXJDb2RlID0gZS5jaGFyQ29kZSkgfHwgZS5rZXlDb2RlOwogIHRoaXMuY3RybEtleSA9IGUuY3RybEtleTsKICB0aGlzLmFsdEtleSA9IGUuYWx0S2V5OwogIHRoaXMuc2hpZnRLZXkgPSBlLnNoaWZ0S2V5OwogIHRoaXMubWV0YUtleSA9IGUubWV0YUtleQp9Owp0YWxrLm1lZGlhLmMzZC5DM2RFdmVudFRhcmdldC5wcm90b3R5cGUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5jM2QuQzNkRXZlbnRUYXJnZXQiKTsKdGFsay5tZWRpYS5jM2QuQzNkRXZlbnRUYXJnZXQucHJvdG90eXBlLnNldEMzZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRDM2RFdmVudFRhcmdldCQkc2V0QzNkJChjM2RPYmplY3QpIHsKICB0aGlzLmMzZE9iamVjdF8gJiYgdGhpcy5yZW1vdmVFdmVudENhbGxiYWNrc18oKTsKICAodGhpcy5jM2RPYmplY3RfID0gYzNkT2JqZWN0KSAmJiB0aGlzLmFkZEV2ZW50Q2FsbGJhY2tzXygpCn07CnRhbGsubWVkaWEuYzNkLkMzZEV2ZW50VGFyZ2V0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQzNkRXZlbnRUYXJnZXQkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGFsay5tZWRpYS5jM2QuQzNkRXZlbnRUYXJnZXQuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5jM2RPYmplY3RfICYmIHRoaXMucmVtb3ZlRXZlbnRDYWxsYmFja3NfKCkKfTsKdGFsay5tZWRpYS5jM2QuQzNkRXZlbnRUYXJnZXQucHJvdG90eXBlLm9uS2V5UHJlc3NfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEMzZEV2ZW50VGFyZ2V0JCRvbktleVByZXNzXyQoZSkgewogIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5DM2RFdmVudFRhcmdldC5NYXBwZWRFdmVudF8oZSkpKQp9Owp0YWxrLm1lZGlhLmMzZC5DM2RFdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRDYWxsYmFja3NfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEMzZEV2ZW50VGFyZ2V0JCRhZGRFdmVudENhbGxiYWNrc18kKCkgewogIHRhbGsubWVkaWEuYzNkLmFkZEV2ZW50Q2FsbGJhY2sodGhpcy5jM2RPYmplY3RfLmdldFBsdWdpbigpLCAia2V5cHJlc3MiLCB0aGlzLmJvdW5kT25LZXlQcmVzc18pOwogIHRoaXMubG9nZ2VyXy5pbmZvKCJBZGRlZCBrZXlwcmVzcyBldmVudCBjYWxsYmFjayBvbiBDM0QgcGx1Z2luLiIpCn07CnRhbGsubWVkaWEuYzNkLkMzZEV2ZW50VGFyZ2V0LnByb3RvdHlwZS5yZW1vdmVFdmVudENhbGxiYWNrc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQzNkRXZlbnRUYXJnZXQkJHJlbW92ZUV2ZW50Q2FsbGJhY2tzXyQoKSB7CiAgdGhpcy5jM2RPYmplY3RfLmlzU2NyaXB0YWJsZSgpICYmICh0YWxrLm1lZGlhLmMzZC5yZW1vdmVFdmVudENhbGxiYWNrKHRoaXMuYzNkT2JqZWN0Xy5nZXRQbHVnaW4oKSwgImtleXByZXNzIiwgdGhpcy5ib3VuZE9uS2V5UHJlc3NfKSwgdGhpcy5sb2dnZXJfLmluZm8oIlJlbW92ZWQga2V5cHJlc3MgZXZlbnQgY2FsbGJhY2sgZnJvbSBDM0QgcGx1Z2luLiIpKQp9Owpnb29nLmpzb24gPSB7fTsKZ29vZy5qc29uLmlzVmFsaWRfID0gZnVuY3Rpb24gJGdvb2ckanNvbiRpc1ZhbGlkXyQocykgewogIGlmKC9eXHMqJC8udGVzdChzKSkgewogICAgcmV0dXJuITEKICB9CiAgdmFyIGJhY2tzbGFzaGVzUmUgPSAvXFxbIlxcXC9iZm5ydHVdL2csIHNpbXBsZVZhbHVlc1JlID0gLyJbXiJcXFxuXHJcdTIwMjhcdTIwMjlceDAwLVx4MDhceDEwLVx4MWZceDgwLVx4OWZdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLCBvcGVuQnJhY2tldHNSZSA9IC8oPzpefDp8LCkoPzpbXHNcdTIwMjhcdTIwMjldKlxbKSsvZywgcmVtYWluZGVyUmUgPSAvXltcXSw6e31cc1x1MjAyOFx1MjAyOV0qJC87CiAgcmV0dXJuIHJlbWFpbmRlclJlLnRlc3Qocy5yZXBsYWNlKGJhY2tzbGFzaGVzUmUsICJAIikucmVwbGFjZShzaW1wbGVWYWx1ZXNSZSwgIl0iKS5yZXBsYWNlKG9wZW5CcmFja2V0c1JlLCAiIikpCn07Cmdvb2cuanNvbi5wYXJzZSA9IGZ1bmN0aW9uICRnb29nJGpzb24kcGFyc2UkKHMpIHsKICB2YXIgbyA9ICIiICsgczsKICBpZihnb29nLmpzb24uaXNWYWxpZF8obykpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBldmFsKCIoIiArIG8gKyAiKSIpCiAgICB9Y2F0Y2goZXgpIHsKICAgIH0KICB9CiAgdGhyb3cgRXJyb3IoIkludmFsaWQgSlNPTiBzdHJpbmc6ICIgKyBvKTsKfTsKZ29vZy5qc29uLnVuc2FmZVBhcnNlID0gZnVuY3Rpb24gJGdvb2ckanNvbiR1bnNhZmVQYXJzZSQocykgewogIHJldHVybiBldmFsKCIoIiArIHMgKyAiKSIpCn07Cmdvb2cuanNvbi5zZXJpYWxpemUgPSBmdW5jdGlvbiAkZ29vZyRqc29uJHNlcmlhbGl6ZSQob2JqZWN0LCBvcHRfcmVwbGFjZXIpIHsKICByZXR1cm4obmV3IGdvb2cuanNvbi5TZXJpYWxpemVyKG9wdF9yZXBsYWNlcikpLnNlcmlhbGl6ZShvYmplY3QpCn07Cmdvb2cuanNvbi5TZXJpYWxpemVyID0gZnVuY3Rpb24gJGdvb2ckanNvbiRTZXJpYWxpemVyJChvcHRfcmVwbGFjZXIpIHsKICB0aGlzLnJlcGxhY2VyXyA9IG9wdF9yZXBsYWNlcgp9Owpnb29nLmpzb24uU2VyaWFsaXplci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gJGdvb2ckanNvbiRTZXJpYWxpemVyJCRzZXJpYWxpemUkKG9iamVjdCkgewogIHZhciBzYiA9IFtdOwogIHRoaXMuc2VyaWFsaXplXyhvYmplY3QsIHNiKTsKICByZXR1cm4gc2Iuam9pbigiIikKfTsKZ29vZy5qc29uLlNlcmlhbGl6ZXIucHJvdG90eXBlLnNlcmlhbGl6ZV8gPSBmdW5jdGlvbiAkZ29vZyRqc29uJFNlcmlhbGl6ZXIkJHNlcmlhbGl6ZV8kKG9iamVjdCwgc2IpIHsKICBzd2l0Y2godHlwZW9mIG9iamVjdCkgewogICAgY2FzZSAic3RyaW5nIjoKICAgICAgdGhpcy5zZXJpYWxpemVTdHJpbmdfKG9iamVjdCwgc2IpOwogICAgICBicmVhazsKICAgIGNhc2UgIm51bWJlciI6CiAgICAgIHRoaXMuc2VyaWFsaXplTnVtYmVyXyhvYmplY3QsIHNiKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJib29sZWFuIjoKICAgICAgc2IucHVzaChvYmplY3QpOwogICAgICBicmVhazsKICAgIGNhc2UgInVuZGVmaW5lZCI6CiAgICAgIHNiLnB1c2goIm51bGwiKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJvYmplY3QiOgogICAgICBpZihudWxsID09IG9iamVjdCkgewogICAgICAgIHNiLnB1c2goIm51bGwiKTsKICAgICAgICBicmVhawogICAgICB9CiAgICAgIGlmKGdvb2cuaXNBcnJheShvYmplY3QpKSB7CiAgICAgICAgdGhpcy5zZXJpYWxpemVBcnJheV8ob2JqZWN0LCBzYik7CiAgICAgICAgYnJlYWsKICAgICAgfQogICAgICB0aGlzLnNlcmlhbGl6ZU9iamVjdF8ob2JqZWN0LCBzYik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiZnVuY3Rpb24iOgogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93IEVycm9yKCJVbmtub3duIHR5cGU6ICIgKyB0eXBlb2Ygb2JqZWN0KTsKICB9Cn07Cmdvb2cuanNvbi5TZXJpYWxpemVyLmNoYXJUb0pzb25DaGFyQ2FjaGVfID0geyciJzonXFwiJywgIlxcIjoiXFxcXCIsICIvIjoiXFwvIiwgIlx1MDAwOCI6IlxcYiIsICJcdTAwMGMiOiJcXGYiLCAiXG4iOiJcXG4iLCAiXHIiOiJcXHIiLCAiXHQiOiJcXHQiLCAiXHgwQiI6IlxcdTAwMGIifTsKZ29vZy5qc29uLlNlcmlhbGl6ZXIuY2hhcnNUb1JlcGxhY2VfID0gL1x1ZmZmZi8udGVzdCgiXHVmZmZmIikgPyAvW1xcXCJceDAwLVx4MWZceDdmLVx1ZmZmZl0vZyA6IC9bXFxcIlx4MDAtXHgxZlx4N2YtXHhmZl0vZzsKZ29vZy5qc29uLlNlcmlhbGl6ZXIucHJvdG90eXBlLnNlcmlhbGl6ZVN0cmluZ18gPSBmdW5jdGlvbiAkZ29vZyRqc29uJFNlcmlhbGl6ZXIkJHNlcmlhbGl6ZVN0cmluZ18kKHMsIHNiKSB7CiAgc2IucHVzaCgnIicsIHMucmVwbGFjZShnb29nLmpzb24uU2VyaWFsaXplci5jaGFyc1RvUmVwbGFjZV8sIGZ1bmN0aW9uKGMpIHsKICAgIGlmKGMgaW4gZ29vZy5qc29uLlNlcmlhbGl6ZXIuY2hhclRvSnNvbkNoYXJDYWNoZV8pIHsKICAgICAgcmV0dXJuIGdvb2cuanNvbi5TZXJpYWxpemVyLmNoYXJUb0pzb25DaGFyQ2FjaGVfW2NdCiAgICB9CiAgICB2YXIgY2MgPSBjLmNoYXJDb2RlQXQoMCksIHJ2ID0gIlxcdSI7CiAgICAxNiA+IGNjID8gcnYgKz0gIjAwMCIgOiAyNTYgPiBjYyA/IHJ2ICs9ICIwMCIgOiA0MDk2ID4gY2MgJiYgKHJ2ICs9ICIwIik7CiAgICByZXR1cm4gZ29vZy5qc29uLlNlcmlhbGl6ZXIuY2hhclRvSnNvbkNoYXJDYWNoZV9bY10gPSBydiArIGNjLnRvU3RyaW5nKDE2KQogIH0pLCAnIicpCn07Cmdvb2cuanNvbi5TZXJpYWxpemVyLnByb3RvdHlwZS5zZXJpYWxpemVOdW1iZXJfID0gZnVuY3Rpb24gJGdvb2ckanNvbiRTZXJpYWxpemVyJCRzZXJpYWxpemVOdW1iZXJfJChuLCBzYikgewogIHNiLnB1c2goaXNGaW5pdGUobikgJiYgIWlzTmFOKG4pID8gbiA6ICJudWxsIikKfTsKZ29vZy5qc29uLlNlcmlhbGl6ZXIucHJvdG90eXBlLnNlcmlhbGl6ZUFycmF5XyA9IGZ1bmN0aW9uICRnb29nJGpzb24kU2VyaWFsaXplciQkc2VyaWFsaXplQXJyYXlfJChhcnIsIHNiKSB7CiAgdmFyIGwgPSBhcnIubGVuZ3RoOwogIHNiLnB1c2goIlsiKTsKICBmb3IodmFyIHNlcCA9ICIiLCBpID0gMDtpIDwgbDtpKyspIHsKICAgIHNiLnB1c2goc2VwKTsKICAgIHZhciB2YWx1ZSA9IGFycltpXTsKICAgIHRoaXMuc2VyaWFsaXplXyh0aGlzLnJlcGxhY2VyXyA/IHRoaXMucmVwbGFjZXJfLmNhbGwoYXJyLCAiIiArIGksIHZhbHVlKSA6IHZhbHVlLCBzYik7CiAgICBzZXAgPSAiLCIKICB9CiAgc2IucHVzaCgiXSIpCn07Cmdvb2cuanNvbi5TZXJpYWxpemVyLnByb3RvdHlwZS5zZXJpYWxpemVPYmplY3RfID0gZnVuY3Rpb24gJGdvb2ckanNvbiRTZXJpYWxpemVyJCRzZXJpYWxpemVPYmplY3RfJChvYmosIHNiKSB7CiAgc2IucHVzaCgieyIpOwogIHZhciBzZXAgPSAiIiwga2V5OwogIGZvcihrZXkgaW4gb2JqKSB7CiAgICBpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7CiAgICAgIHZhciB2YWx1ZSA9IG9ialtrZXldOwogICAgICAiZnVuY3Rpb24iICE9IHR5cGVvZiB2YWx1ZSAmJiAoc2IucHVzaChzZXApLCB0aGlzLnNlcmlhbGl6ZVN0cmluZ18oa2V5LCBzYiksIHNiLnB1c2goIjoiKSwgdGhpcy5zZXJpYWxpemVfKHRoaXMucmVwbGFjZXJfID8gdGhpcy5yZXBsYWNlcl8uY2FsbChvYmosIGtleSwgdmFsdWUpIDogdmFsdWUsIHNiKSwgc2VwID0gIiwiKQogICAgfQogIH0KICBzYi5wdXNoKCJ9IikKfTsKdmFyIGFwcHMgPSB7Y2hhdDp7fX07CmFwcHMuY2hhdC5jb3JlID0ge307CmFwcHMuY2hhdC5jb3JlLkppZCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkKGRvbWFpbiwgbm9kZSwgcmVzb3VyY2UpIHsKICB0aGlzLmRvbWFpbl8gPSBkb21haW4gfHwgbnVsbDsKICB0aGlzLm5vZGVfID0gYXBwcy5jaGF0LmNvcmUuSmlkLm5vcm1hbGl6ZUppZENoYXJhY3RlcnNfKG5vZGUpIHx8IG51bGw7CiAgdGhpcy5yZXNvdXJjZV8gPSByZXNvdXJjZSB8fCBudWxsCn07CmFwcHMuY2hhdC5jb3JlLkppZC5FTUFJTF9SRUdFWFAgPSAvXihbYS16QS1aMC05ISMkJSo/fF57fSs9Xy4nXFwtXSkrXEAoKFthLXpBLVowLTlcLV0pK1wuKStbYS16QS1aMC05XXsyLDZ9JC87CmFwcHMuY2hhdC5jb3JlLkppZC5OQU1FRF9QTVVDX1BBVFRFUk5fUkVHRVhQID0gL25hbWVkLXByaXZhdGUtY2hhdC1bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0vOwphcHBzLmNoYXQuY29yZS5KaWQuUE1VQ19QQVRURVJOX1JFR0VYUCA9IC8obXV2Yy18bmFtZWQtKT9wcml2YXRlLWNoYXQtWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9LzsKYXBwcy5jaGF0LmNvcmUuSmlkLlZPSUNFX1BBVFRFUk5fUkVHRVhQID0gL14oWzAtOV0rXC4pP3ZvaWNlXC5nb29nbGVcLmNvbSQvOwphcHBzLmNoYXQuY29yZS5KaWQuUFVCTElDUFJPRklMRV9ET01BSU4gPSAicHVibGljLnRhbGsuZ29vZ2xlLmNvbSI7CmFwcHMuY2hhdC5jb3JlLkppZC5HQUlBX0pJRF9ET01BSU4gPSAiaWQudGFsay5nb29nbGUuY29tIjsKYXBwcy5jaGF0LmNvcmUuSmlkLlBIT05FT05MWV9ET01BSU4gPSAiY29udGFjdC50YWxrLmdvb2dsZS5jb20iOwphcHBzLmNoYXQuY29yZS5KaWQuVk9JQ0VfRE9NQUlOID0gInZvaWNlLmdvb2dsZS5jb20iOwphcHBzLmNoYXQuY29yZS5KaWQuVElOS0VSQkVMTF9ET01BSU4gPSAicHN0bi1jb25mZXJlbmNlLmdvb2dsZS5jb20iOwphcHBzLmNoYXQuY29yZS5KaWQuR0NPTU1fUExBQ0VIT0xERVJfTVVDX0RPTUFJTiA9ICJtdXZjLmdvb2dsZS5jb20iOwphcHBzLmNoYXQuY29yZS5KaWQuRE9NQUlOX01VQ19ET01BSU5fUFJFRklYID0gImNvbmZlcmVuY2UuIjsKYXBwcy5jaGF0LmNvcmUuSmlkLkRPTUFJTl9NVUNfRE9NQUlOX1NVRkZJWEVTID0gWyIuZ29vZ2xlLmNvbSIsICIuZ21haWwuY29tIl07CmFwcHMuY2hhdC5jb3JlLkppZC5HVkNfUkVTT1VSQ0VfUFJFRklYID0gImd2YyI7CmFwcHMuY2hhdC5jb3JlLkppZC5GQ19QTVVDX1BBVFRFUk5fUkVHRVhQID0gL2ZjLWNoYXQtLiovOwphcHBzLmNoYXQuY29yZS5KaWQuUEFUVEVSTl9BUE9TVFJPUEhFID0gUmVnRXhwKCInIiwgImciKTsKYXBwcy5jaGF0LmNvcmUuSmlkLlBBVFRFUk5fRU5DT0RFRF9BUE9TVFJPUEhFID0gUmVnRXhwKCJcXFxcMjciLCAiZyIpOwphcHBzLmNoYXQuY29yZS5KaWQuUkVQTEFDRU1FTlRfQVBPU1RST1BIRSA9ICInIjsKYXBwcy5jaGF0LmNvcmUuSmlkLlJFUExBQ0VNRU5UX0VOQ09ERURfQVBPU1RST1BIRSA9ICJcXDI3IjsKYXBwcy5jaGF0LmNvcmUuSmlkLklzVmFsaWRFbWFpbCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkSXNWYWxpZEVtYWlsJChzdHIpIHsKICByZXR1cm4gYXBwcy5jaGF0LmNvcmUuSmlkLkVNQUlMX1JFR0VYUC50ZXN0KHN0cikKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLmlzUHN0bkNvbmZlcmVuY2VKaWQgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJGlzUHN0bkNvbmZlcmVuY2VKaWQkKGppZCkgewogIGdvb2cuaXNTdHJpbmcoamlkKSAmJiAoamlkID0gYXBwcy5jaGF0LmNvcmUuSmlkLkZyb21TdHJpbmcoamlkKSk7CiAgcmV0dXJuIGFwcHMuY2hhdC5jb3JlLkppZC5USU5LRVJCRUxMX0RPTUFJTiA9PSBqaWQuZ2V0RG9tYWluKCkKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLmlzR2NvbW1QbGFjZWhvbGRlck11YyA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkaXNHY29tbVBsYWNlaG9sZGVyTXVjJChqaWQpIHsKICBnb29nLmlzU3RyaW5nKGppZCkgJiYgKGppZCA9IGFwcHMuY2hhdC5jb3JlLkppZC5Gcm9tU3RyaW5nKGppZCkpOwogIHJldHVybiBhcHBzLmNoYXQuY29yZS5KaWQuR0NPTU1fUExBQ0VIT0xERVJfTVVDX0RPTUFJTiA9PSBqaWQuZ2V0RG9tYWluKCkKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLmlzRG9tYWluTXVjID0gZnVuY3Rpb24gJGFwcHMkY2hhdCRjb3JlJEppZCRpc0RvbWFpbk11YyQoamlkKSB7CiAgZ29vZy5pc1N0cmluZyhqaWQpICYmIChqaWQgPSBhcHBzLmNoYXQuY29yZS5KaWQuRnJvbVN0cmluZyhqaWQpKTsKICB2YXIgaGFzTXV2Y1ByZWZpeCA9IGdvb2cuc3RyaW5nLnN0YXJ0c1dpdGgoamlkLmdldERvbWFpbigpIHx8ICIiLCBhcHBzLmNoYXQuY29yZS5KaWQuRE9NQUlOX01VQ19ET01BSU5fUFJFRklYKSwgaGFzTXV2Y1N1ZmZpeCA9ICExOwogIGlmKGhhc011dmNQcmVmaXgpIHsKICAgIGZvcih2YXIgaSA9IDA7aSA8IGFwcHMuY2hhdC5jb3JlLkppZC5ET01BSU5fTVVDX0RPTUFJTl9TVUZGSVhFUy5sZW5ndGg7aSsrKSB7CiAgICAgIGlmKGdvb2cuc3RyaW5nLmVuZHNXaXRoKGppZC5nZXREb21haW4oKSB8fCAiIiwgYXBwcy5jaGF0LmNvcmUuSmlkLkRPTUFJTl9NVUNfRE9NQUlOX1NVRkZJWEVTW2ldKSkgewogICAgICAgIGhhc011dmNTdWZmaXggPSAhMDsKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBoYXNNdXZjUHJlZml4ICYmIGhhc011dmNTdWZmaXgKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLmNyZWF0ZU11Y0RvbWFpbiA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkY3JlYXRlTXVjRG9tYWluJChtZUppZCkgewogIGdvb2cuaXNTdHJpbmcobWVKaWQpICYmIChtZUppZCA9IGFwcHMuY2hhdC5jb3JlLkppZC5Gcm9tU3RyaW5nKG1lSmlkKSk7CiAgcmV0dXJuIGFwcHMuY2hhdC5jb3JlLkppZC5ET01BSU5fTVVDX0RPTUFJTl9QUkVGSVggKyBtZUppZC5nZXREb21haW4oKQp9OwphcHBzLmNoYXQuY29yZS5KaWQuSXNOYW1lZFJvb21KaWQgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJElzTmFtZWRSb29tSmlkJChqaWRTdHIpIHsKICB2YXIgamlkID0gYXBwcy5jaGF0LmNvcmUuSmlkLkZyb21TdHJpbmcoamlkU3RyKTsKICByZXR1cm4gamlkLmlzTmFtZWRSb29tSmlkKCkKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLklzUm9vbUppZCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkSXNSb29tSmlkJChqaWRTdHIpIHsKICB2YXIgamlkID0gYXBwcy5jaGF0LmNvcmUuSmlkLkZyb21TdHJpbmcoamlkU3RyKTsKICByZXR1cm4gamlkLmlzUm9vbUppZCgpCn07CmFwcHMuY2hhdC5jb3JlLkppZC5Jc1ZvaWNlT25seUppZCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkSXNWb2ljZU9ubHlKaWQkKGppZFN0cikgewogIHZhciBqaWQgPSBhcHBzLmNoYXQuY29yZS5KaWQuRnJvbVN0cmluZyhqaWRTdHIpOwogIHJldHVybiBhcHBzLmNoYXQuY29yZS5KaWQuVk9JQ0VfUEFUVEVSTl9SRUdFWFAudGVzdChqaWQuZ2V0RG9tYWluKCkpCn07CmFwcHMuY2hhdC5jb3JlLkppZC5Jc1B1YmxpY1Byb2ZpbGVKaWQgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJElzUHVibGljUHJvZmlsZUppZCQoamlkKSB7CiAgZ29vZy5pc1N0cmluZyhqaWQpICYmIChqaWQgPSBhcHBzLmNoYXQuY29yZS5KaWQuRnJvbVN0cmluZyhqaWQpKTsKICByZXR1cm4gamlkLmdldERvbWFpbigpID09IGFwcHMuY2hhdC5jb3JlLkppZC5QVUJMSUNQUk9GSUxFX0RPTUFJTgp9OwphcHBzLmNoYXQuY29yZS5KaWQuZ2V0TXVjVXNlckppZCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkZ2V0TXVjVXNlckppZCQocm9vbUppZCkgewogIHZhciBuaWNrID0gYXBwcy5jaGF0LmNvcmUuSmlkLnJlc291cmNlKHJvb21KaWQpOwogIGlmKG5pY2spIHsKICAgIHZhciBhdCA9IG5pY2subGFzdEluZGV4T2YoIl8iKTsKICAgIGlmKDAgPCBhdCkgewogICAgICByZXR1cm5bbmljay5zdWJzdHIoMCwgYXQpLCBuaWNrLnN1YnN0cihhdCArIDEpXS5qb2luKCJAIikKICAgIH0KICB9CiAgcmV0dXJuIG51bGwKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLklzR2FpYUppZCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkSXNHYWlhSmlkJChqaWRTdHIpIHsKICByZXR1cm4gYXBwcy5jaGF0LmNvcmUuSmlkLkZyb21TdHJpbmcoamlkU3RyKS5pc0dhaWFKaWQoKQp9OwphcHBzLmNoYXQuY29yZS5KaWQuSXNQaG9uZU9ubHlKaWQgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJElzUGhvbmVPbmx5SmlkJChqaWRTdHIpIHsKICB2YXIgamlkID0gYXBwcy5jaGF0LmNvcmUuSmlkLkZyb21TdHJpbmcoamlkU3RyKTsKICByZXR1cm4gZ29vZy5pc0RlZkFuZE5vdE51bGwoamlkLmdldE5vZGUoKSkgJiYgamlkLmdldERvbWFpbigpID09IGFwcHMuY2hhdC5jb3JlLkppZC5QSE9ORU9OTFlfRE9NQUlOCn07CmFwcHMuY2hhdC5jb3JlLkppZC5pc0JvdEppZCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkaXNCb3RKaWQkKGppZFN0cikgewogIHZhciBqaWQgPSBhcHBzLmNoYXQuY29yZS5KaWQuRnJvbVN0cmluZyhqaWRTdHIpOwogIHJldHVybiBnb29nLmlzRGVmQW5kTm90TnVsbChqaWQuZ2V0Tm9kZSgpKSAmJiAoImJvdC50YWxrLmdvb2dsZS5jb20iID09IGppZC5nZXREb21haW4oKSB8fCAicHJvbS5jb3JwLmdvb2dsZS5jb20iID09IGppZC5nZXREb21haW4oKSB8fCAiYXBwc3BvdC5jb20iID09IGppZC5nZXREb21haW4oKSB8fCAvcHJvbWNoYXRcLmNvcnBcLmdvb2dsZVwuY29tJC8udGVzdChqaWQuZ2V0RG9tYWluKCkpIHx8IC9hcHBzcG90Y2hhdFwuY29tJC8udGVzdChqaWQuZ2V0RG9tYWluKCkpKQp9OwphcHBzLmNoYXQuY29yZS5KaWQuY2FuU2VuZEVtYWlsID0gZnVuY3Rpb24gJGFwcHMkY2hhdCRjb3JlJEppZCRjYW5TZW5kRW1haWwkKGppZFN0cikgewogIHJldHVybiFhcHBzLmNoYXQuY29yZS5KaWQuaXNCb3RKaWQoamlkU3RyKSAmJiAhYXBwcy5jaGF0LmNvcmUuSmlkLklzUHVibGljUHJvZmlsZUppZChqaWRTdHIpICYmICFhcHBzLmNoYXQuY29yZS5KaWQuSXNQaG9uZU9ubHlKaWQoamlkU3RyKSAmJiAhYXBwcy5jaGF0LmNvcmUuSmlkLklzVm9pY2VPbmx5SmlkKGppZFN0cikKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLmlzVmFsaWQgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJGlzVmFsaWQkKGppZCkgewogIHJldHVybiBhcHBzLmNoYXQuY29yZS5KaWQuSXNWYWxpZEVtYWlsKGFwcHMuY2hhdC5jb3JlLkppZC51bnBhcnNlZEJhcmVQYXJ0KGppZCkpCn07CmFwcHMuY2hhdC5jb3JlLkppZC5lcXVhbHNCYXJlID0gZnVuY3Rpb24gJGFwcHMkY2hhdCRjb3JlJEppZCRlcXVhbHNCYXJlJChqaWRBLCBqaWRCKSB7CiAgZ29vZy5pc1N0cmluZyhqaWRBKSAmJiAoamlkQSA9IGFwcHMuY2hhdC5jb3JlLkppZC5Gcm9tU3RyaW5nKGppZEEpKTsKICByZXR1cm4gamlkQS5lcXVhbHNCYXJlKGppZEIpCn07CmFwcHMuY2hhdC5jb3JlLkppZC5pc0JhcmUgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJGlzQmFyZSQoamlkKSB7CiAgcmV0dXJuIG51bGwgPT0gYXBwcy5jaGF0LmNvcmUuSmlkLkZyb21TdHJpbmcoamlkKS5nZXRSZXNvdXJjZSgpCn07CmFwcHMuY2hhdC5jb3JlLkppZC5iYXJlUGFydCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkYmFyZVBhcnQkKGZ1bGxKaWQpIHsKICByZXR1cm4gYXBwcy5jaGF0LmNvcmUuSmlkLnVucGFyc2VkQmFyZVBhcnQoZnVsbEppZCkKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLnVucGFyc2VkQmFyZVBhcnQgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJHVucGFyc2VkQmFyZVBhcnQkKGZ1bGxKaWQpIHsKICB2YXIgc2xhc2hJbmRleCA9IGZ1bGxKaWQuaW5kZXhPZigiLyIpOwogIHJldHVybi0xID09IHNsYXNoSW5kZXggPyBmdWxsSmlkIDogZnVsbEppZC5zdWJzdHJpbmcoMCwgc2xhc2hJbmRleCkKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLm5vcm1hbGl6ZWRCYXJlUGFydCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkbm9ybWFsaXplZEJhcmVQYXJ0JChzdHIpIHsKICByZXR1cm4gYXBwcy5jaGF0LmNvcmUuSmlkLkZyb21TdHJpbmcoc3RyKS5tYWtlQmFyZSgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKQp9OwphcHBzLmNoYXQuY29yZS5KaWQubm9kZSA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkbm9kZSQoamlkKSB7CiAgcmV0dXJuIGFwcHMuY2hhdC5jb3JlLkppZC5Gcm9tU3RyaW5nKGppZCkuZ2V0Tm9kZSgpCn07CmFwcHMuY2hhdC5jb3JlLkppZC5kb21haW4gPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJGRvbWFpbiQoamlkKSB7CiAgcmV0dXJuIGFwcHMuY2hhdC5jb3JlLkppZC5Gcm9tU3RyaW5nKGppZCkuZ2V0RG9tYWluKCkKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLnJlc291cmNlID0gZnVuY3Rpb24gJGFwcHMkY2hhdCRjb3JlJEppZCRyZXNvdXJjZSQoamlkKSB7CiAgcmV0dXJuIGFwcHMuY2hhdC5jb3JlLkppZC5Gcm9tU3RyaW5nKGppZCkuZ2V0UmVzb3VyY2UoKQp9OwphcHBzLmNoYXQuY29yZS5KaWQuRnJvbVN0cmluZyA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkRnJvbVN0cmluZyQoc3RyKSB7CiAgdmFyIHNsSW5kZXggPSBzdHIuaW5kZXhPZigiLyIpLCBhdEluZGV4ID0gc3RyLmluZGV4T2YoIkAiKSwgcmVzb3VyY2UgPSBudWxsOwogIDAgPiBzbEluZGV4ID8gc2xJbmRleCA9IHN0ci5sZW5ndGggOiBzbEluZGV4ICsgMSA8IHN0ci5sZW5ndGggJiYgKHJlc291cmNlID0gc3RyLnN1YnN0cmluZyhzbEluZGV4ICsgMSkpOwogIHZhciBub2RlID0gbnVsbDsKICAwIDw9IGF0SW5kZXggJiYgKGF0SW5kZXggPCBzbEluZGV4ID8gMCA8IGF0SW5kZXggJiYgKG5vZGUgPSBzdHIuc3Vic3RyaW5nKDAsIGF0SW5kZXgpKSA6IGF0SW5kZXggPSAtMSk7CiAgdmFyIGRvbWFpbiA9IHN0ci5zdWJzdHJpbmcoYXRJbmRleCArIDEsIHNsSW5kZXgpOwogIHJldHVybiBuZXcgYXBwcy5jaGF0LmNvcmUuSmlkKGRvbWFpbiwgbm9kZSwgcmVzb3VyY2UpCn07CmFwcHMuY2hhdC5jb3JlLkppZC5ub3JtYWxpemVKaWRDaGFyYWN0ZXJzXyA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkbm9ybWFsaXplSmlkQ2hhcmFjdGVyc18kKGppZFN0cikgewogIHJldHVybiBqaWRTdHIgPyBqaWRTdHIucmVwbGFjZShhcHBzLmNoYXQuY29yZS5KaWQuUEFUVEVSTl9BUE9TVFJPUEhFLCBhcHBzLmNoYXQuY29yZS5KaWQuUkVQTEFDRU1FTlRfRU5DT0RFRF9BUE9TVFJPUEhFKSA6IGppZFN0cgp9OwphcHBzLmNoYXQuY29yZS5KaWQudW5ub3JtYWxpemVKaWRTdHJpbmdGb3JEaXNwbGF5ID0gZnVuY3Rpb24gJGFwcHMkY2hhdCRjb3JlJEppZCR1bm5vcm1hbGl6ZUppZFN0cmluZ0ZvckRpc3BsYXkkKGppZFN0cikgewogIHJldHVybiBqaWRTdHIucmVwbGFjZShhcHBzLmNoYXQuY29yZS5KaWQuUEFUVEVSTl9FTkNPREVEX0FQT1NUUk9QSEUsIGFwcHMuY2hhdC5jb3JlLkppZC5SRVBMQUNFTUVOVF9BUE9TVFJPUEhFKQp9OwphcHBzLmNoYXQuY29yZS5KaWQucHJvdG90eXBlLmdldERvbWFpbiA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkJGdldERvbWFpbiQoKSB7CiAgcmV0dXJuIHRoaXMuZG9tYWluXwp9OwphcHBzLmNoYXQuY29yZS5KaWQucHJvdG90eXBlLmdldE5vZGUgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJCRnZXROb2RlJCgpIHsKICByZXR1cm4gdGhpcy5ub2RlXwp9OwphcHBzLmNoYXQuY29yZS5KaWQucHJvdG90eXBlLmdldFJlc291cmNlID0gZnVuY3Rpb24gJGFwcHMkY2hhdCRjb3JlJEppZCQkZ2V0UmVzb3VyY2UkKCkgewogIHJldHVybiB0aGlzLnJlc291cmNlXwp9OwphcHBzLmNoYXQuY29yZS5KaWQucHJvdG90eXBlLmlzR2FpYUppZCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkJGlzR2FpYUppZCQoKSB7CiAgcmV0dXJuIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMuZ2V0Tm9kZSgpKSAmJiB0aGlzLmdldERvbWFpbigpID09IGFwcHMuY2hhdC5jb3JlLkppZC5HQUlBX0pJRF9ET01BSU4KfTsKYXBwcy5jaGF0LmNvcmUuSmlkLnByb3RvdHlwZS5pc05hbWVkUm9vbUppZCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkJGlzTmFtZWRSb29tSmlkJCgpIHsKICByZXR1cm4iZ3JvdXBjaGF0Lmdvb2dsZS5jb20iID09IHRoaXMuZ2V0RG9tYWluKCkgJiYgYXBwcy5jaGF0LmNvcmUuSmlkLk5BTUVEX1BNVUNfUEFUVEVSTl9SRUdFWFAudGVzdCh0aGlzLmdldE5vZGUoKSkKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLnByb3RvdHlwZS5pc1Jvb21KaWQgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJCRpc1Jvb21KaWQkKCkgewogIHJldHVybiJncm91cGNoYXQuZ29vZ2xlLmNvbSIgPT0gdGhpcy5nZXREb21haW4oKSAmJiBhcHBzLmNoYXQuY29yZS5KaWQuUE1VQ19QQVRURVJOX1JFR0VYUC50ZXN0KHRoaXMuZ2V0Tm9kZSgpKSB8fCAiZnJpZW5kY29ubmVjdGNoYXQuZ29vZ2xlLmNvbSIgPT0gdGhpcy5nZXREb21haW4oKSAmJiBhcHBzLmNoYXQuY29yZS5KaWQuRkNfUE1VQ19QQVRURVJOX1JFR0VYUC50ZXN0KHRoaXMuZ2V0Tm9kZSgpKSB8fCBhcHBzLmNoYXQuY29yZS5KaWQuaXNEb21haW5NdWModGhpcykgfHwgYXBwcy5jaGF0LmNvcmUuSmlkLmlzR2NvbW1QbGFjZWhvbGRlck11Yyh0aGlzKQp9OwphcHBzLmNoYXQuY29yZS5KaWQucHJvdG90eXBlLmlzQmFyZUppZCA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkJGlzQmFyZUppZCQoKSB7CiAgcmV0dXJuIG51bGwgPT0gdGhpcy5yZXNvdXJjZV8KfTsKYXBwcy5jaGF0LmNvcmUuSmlkLnByb3RvdHlwZS5tYWtlQmFyZSA9IGZ1bmN0aW9uICRhcHBzJGNoYXQkY29yZSRKaWQkJG1ha2VCYXJlJCgpIHsKICByZXR1cm4gdGhpcy5pc0JhcmVKaWQoKSA/IHRoaXMgOiBuZXcgYXBwcy5jaGF0LmNvcmUuSmlkKHRoaXMuZG9tYWluXywgdGhpcy5ub2RlXywgbnVsbCkKfTsKYXBwcy5jaGF0LmNvcmUuSmlkLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJCRlcXVhbHMkKHRoYXQpIHsKICByZXR1cm4gdGhpcy5kb21haW5fID09IHRoYXQuZG9tYWluXyAmJiB0aGlzLm5vZGVfID09IHRoYXQubm9kZV8gJiYgdGhpcy5yZXNvdXJjZV8gPT0gdGhhdC5yZXNvdXJjZV8KfTsKYXBwcy5jaGF0LmNvcmUuSmlkLnByb3RvdHlwZS5lcXVhbHNCYXJlID0gZnVuY3Rpb24gJGFwcHMkY2hhdCRjb3JlJEppZCQkZXF1YWxzQmFyZSQob3RoZXJKaWQpIHsKICBnb29nLmlzU3RyaW5nKG90aGVySmlkKSAmJiAob3RoZXJKaWQgPSBhcHBzLmNoYXQuY29yZS5KaWQuRnJvbVN0cmluZyhvdGhlckppZCkpOwogIHJldHVybiB0aGlzLm5vZGVfID09IG90aGVySmlkLm5vZGVfICYmIHRoaXMuZG9tYWluXyA9PSBvdGhlckppZC5kb21haW5fCn07CmFwcHMuY2hhdC5jb3JlLkppZC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JGNvcmUkSmlkJCR0b1N0cmluZyQoKSB7CiAgdmFyIEEgPSBbXTsKICBudWxsICE9IHRoaXMubm9kZV8gJiYgKEEucHVzaCh0aGlzLm5vZGVfKSwgQS5wdXNoKCJAIikpOwogIEEucHVzaCh0aGlzLmRvbWFpbl8pOwogIG51bGwgIT0gdGhpcy5yZXNvdXJjZV8gJiYgKEEucHVzaCgiLyIpLCBBLnB1c2godGhpcy5yZXNvdXJjZV8pKTsKICByZXR1cm4gQS5qb2luKCIiKQp9Owp2YXIgZmF2YSA9IHtzZXJ2aWNlczp7fX07CmZhdmEuc2VydmljZXMudW5pcXVlSWRDb3VudGVyXyA9IDA7CmZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQgPSBmdW5jdGlvbiAkZmF2YSRzZXJ2aWNlcyRnZXRVbmlxdWVJZCQobmFtZSkgewogIHJldHVybiBuYW1lICsgZmF2YS5zZXJ2aWNlcy51bmlxdWVJZENvdW50ZXJfKysKfTsKZmF2YS5zZXJ2aWNlcy5BQ1RJVklUWV9NT05JVE9SID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiYWN0aXZpdHktbW9uaXRvciIpOwpmYXZhLnNlcnZpY2VzLkFQUF9MSUZFVElNRSA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImFwcGxpZmV0aW1lIik7CmZhdmEuc2VydmljZXMuQVNZTkNfT1BFUkFUSU9OUyA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImFzeW5jb3BzIik7CmZhdmEuc2VydmljZXMuQVVESU8gPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJhdWRpbyIpOwpmYXZhLnNlcnZpY2VzLkJST1dTRVJfQ0hBTk5FTCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImJyb3dzZXJjaGFubmVsIik7CmZhdmEuc2VydmljZXMuQ0FOVkFTID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiY2FudmFzIik7CmZhdmEuc2VydmljZXMuQ0FOVkFTX0NPTkZJR1VSQVRJT04gPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJjYW52YXNjb25maWd1cmF0aW9uIik7CmZhdmEuc2VydmljZXMuQ0hBVCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImNoYXQiKTsKZmF2YS5zZXJ2aWNlcy5DU0kgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJjc2kiKTsKZmF2YS5zZXJ2aWNlcy5EQVRBID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiZGF0YSIpOwpmYXZhLnNlcnZpY2VzLkRBVEFTVE9SRV9VUERBVEVSID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiZGF0YXN0b3JldXBkYXRlciIpOwpmYXZhLnNlcnZpY2VzLkRFT0JGVVNDQVRJT04gPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJkZW9iZnVzY2F0aW9uIik7CmZhdmEuc2VydmljZXMuRElBR05PU1RJQ1MgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJkaWFnbm9zdGljcyIpOwpmYXZhLnNlcnZpY2VzLkRPTSA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImRvbSIpOwpmYXZhLnNlcnZpY2VzLkRSQUdfRFJPUCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImRyYWctZHJvcCIpOwpmYXZhLnNlcnZpY2VzLkNPTkRJVElPTkFMX0ZFQVRVUkVTID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiY29uZGl0aW9uYWxmZWF0dXJlcyIpOwpmYXZhLnNlcnZpY2VzLkVYUE9SVF9TRVJWSUNFID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiZXhwb3J0c2VydmljZSIpOwpmYXZhLnNlcnZpY2VzLkZJWEVEX0xBWU9VVF9IRUxQRVIgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJmaXhlZC1sYXlvdXQtaGVscGVyIik7CmZhdmEuc2VydmljZXMuR0JBUiA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImdiYXIiKTsKZmF2YS5zZXJ2aWNlcy5ISVNUT1JZID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiaGlzdG9yeSIpOwpmYXZhLnNlcnZpY2VzLkhJU1RPUllfTUFOQUdFUiA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImhpc3RvcnltYW5hZ2VyIik7CmZhdmEuc2VydmljZXMuSElTVE9SWV9SRUdJU1RSWSA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImhpc3RvcnlyZWdpc3RyeSIpOwpmYXZhLnNlcnZpY2VzLklERU5USVRZID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiaWRlbnRpdHkiKTsKZmF2YS5zZXJ2aWNlcy5JRV9DVVRfQ09QWSA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImllY3V0Y29weSIpOwpmYXZhLnNlcnZpY2VzLklNUFJFU1NJT05TID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiaW1wcmVzc2lvbnMiKTsKZmF2YS5zZXJ2aWNlcy5LRVlCT0FSRF9TSE9SVENVVF9IQU5ETEVSID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgic2hvcnRjdXRoYW5kbGVyIik7CmZhdmEuc2VydmljZXMuS0VZQk9BUkRfU0hPUlRDVVRfUkVHSVNUUlkgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJzaG9ydGN1dHJlZ2lzdHJ5Iik7CmZhdmEuc2VydmljZXMuTUFJTCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoIm1haWwiKTsKZmF2YS5zZXJ2aWNlcy5NT0xFID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgibW9sZSIpOwpmYXZhLnNlcnZpY2VzLk1PTEVfTUFOQUdFUiA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoIm1vbGVtYW5hZ2VyIik7CmZhdmEuc2VydmljZXMuTkFWQkFSID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgibmF2YmFyIik7CmZhdmEuc2VydmljZXMuTkFWSUdBVElPTiA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoIm5hdmlnYXRpb24iKTsKZmF2YS5zZXJ2aWNlcy5ORVRXT1JLX0RJQUdOT1NUSUNTID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgibmV0d29yay1kaWFnbm9zdGljcyIpOwpmYXZhLnNlcnZpY2VzLk5PVElGSUNBVElPTiA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoIm5vdGlmaWNhdGlvbiIpOwpmYXZhLnNlcnZpY2VzLk9GRkxJTkUgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJvZmZsaW5lIik7CmZhdmEuc2VydmljZXMuT1VUQk9VTkRfVk9JQ0UgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJvdXRib3VuZHZvaWNlIik7CmZhdmEuc2VydmljZXMuUExBQ0VfTUFOQUdFUiA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoInBsYWNlbWFuYWdlciIpOwpmYXZhLnNlcnZpY2VzLlBMQUNFX1JFR0lTVFJZID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgicGxhY2VyZWdpc3RyeSIpOwpmYXZhLnNlcnZpY2VzLlBSRUZFVENIID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgicHJlZmV0Y2giKTsKZmF2YS5zZXJ2aWNlcy5SRUxBVElWRV9EQVRFX0NPTlRST0xMRVIgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJyZWxhdGl2ZWRhdGVjb250cm9sbGVyIik7CmZhdmEuc2VydmljZXMuUkVRVUVTVCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoInJlcXVlc3QiKTsKZmF2YS5zZXJ2aWNlcy5TQ0hFRFVMRVIgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJzY2hlZHVsZXIiKTsKZmF2YS5zZXJ2aWNlcy5TRVJWRVJfRVJST1JTID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgic2VydmVyZXJyb3JzIik7CmZhdmEuc2VydmljZXMuU09ZX1JFTkRFUkVSID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgic295cmVuZGVyZXIiKTsKZmF2YS5zZXJ2aWNlcy5TT1lfUkVOREVSRVJfQ09ORklHID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgic295cmVuZGVyZXJjb25maWciKTsKZmF2YS5zZXJ2aWNlcy5URUFST0ZGX01BTkFHRVIgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJ0ZWFyb2ZmLW1hbmFnZXIiKTsKZmF2YS5zZXJ2aWNlcy5URUFST0ZGX1NIQVJFRF9EQVRBID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgidGVhcm9mZi1zaGFyZWQtZGF0YSIpOwpmYXZhLnNlcnZpY2VzLlRFQVJPRkZfUkVHSVNUUlkgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJ0ZWFyb2ZmLXJlZ2lzdHJ5Iik7CmZhdmEuc2VydmljZXMuVElUTEVfQkFSID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgidGl0bGUtYmFyIik7CmZhdmEuc2VydmljZXMuVE9BU1RfTk9USUZJRVIgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJ0b2FzdC1ub3RpZmllciIpOwpmYXZhLnNlcnZpY2VzLlVTRVJfQUNUSU9OID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgidXNlcmFjdGlvbiIpOwpmYXZhLnNlcnZpY2VzLlZJRVdQT1JUID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgidmlld3BvcnQiKTsKZmF2YS5zZXJ2aWNlcy5WSUVXX0RJQUdOT1NUSUNTID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgidmlld2RpYWdub3N0aWNzIik7CmZhdmEuc2VydmljZXMuVklFV19NQU5BR0VSID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgidmlld21hbmFnZXIiKTsKZmF2YS5zZXJ2aWNlcy5WSUVXX1JFR0lTVFJZID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgidmlld3JlZ2lzdHJ5Iik7CmZhdmEuc2VydmljZXMuV0lORE9XID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgid2luZG93Iik7CmZhdmEuc2VydmljZXMuV0lORE9XX09QRU5FUl9VVElMID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgid2luZG93LW9wZW5lci11dGlsIik7CmZhdmEuc2VydmljZXMuV0lORE9XX1dJREdFVCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoIndpbmRvd3dpZGdldCIpOwpmYXZhLnNlcnZpY2VzLlhTUkYgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJ4c3JmIik7Cmdvb2cuc3RydWN0cy5RdWV1ZSA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkUXVldWUkKCkgewogIHRoaXMuZWxlbWVudHNfID0gW10KfTsKZ29vZy5zdHJ1Y3RzLlF1ZXVlLnByb3RvdHlwZS5oZWFkXyA9IDA7Cmdvb2cuc3RydWN0cy5RdWV1ZS5wcm90b3R5cGUudGFpbF8gPSAwOwpnb29nLnN0cnVjdHMuUXVldWUucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJFF1ZXVlJCRlbnF1ZXVlJChlbGVtZW50KSB7CiAgdGhpcy5lbGVtZW50c19bdGhpcy50YWlsXysrXSA9IGVsZW1lbnQKfTsKZ29vZy5zdHJ1Y3RzLlF1ZXVlLnByb3RvdHlwZS5kZXF1ZXVlID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRRdWV1ZSQkZGVxdWV1ZSQoKSB7CiAgaWYodGhpcy5oZWFkXyAhPSB0aGlzLnRhaWxfKSB7CiAgICB2YXIgcmVzdWx0ID0gdGhpcy5lbGVtZW50c19bdGhpcy5oZWFkX107CiAgICBkZWxldGUgdGhpcy5lbGVtZW50c19bdGhpcy5oZWFkX107CiAgICB0aGlzLmhlYWRfKys7CiAgICByZXR1cm4gcmVzdWx0CiAgfQp9Owpnb29nLnN0cnVjdHMuUXVldWUucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJFF1ZXVlJCRwZWVrJCgpIHsKICByZXR1cm4gdGhpcy5oZWFkXyA9PSB0aGlzLnRhaWxfID8gdm9pZCAwIDogdGhpcy5lbGVtZW50c19bdGhpcy5oZWFkX10KfTsKZ29vZy5zdHJ1Y3RzLlF1ZXVlLnByb3RvdHlwZS5nZXRDb3VudCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkUXVldWUkJGdldENvdW50JCgpIHsKICByZXR1cm4gdGhpcy50YWlsXyAtIHRoaXMuaGVhZF8KfTsKZ29vZy5zdHJ1Y3RzLlF1ZXVlLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRRdWV1ZSQkaXNFbXB0eSQoKSB7CiAgcmV0dXJuIDAgPT0gdGhpcy50YWlsXyAtIHRoaXMuaGVhZF8KfTsKZ29vZy5zdHJ1Y3RzLlF1ZXVlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkUXVldWUkJGNsZWFyJCgpIHsKICB0aGlzLnRhaWxfID0gdGhpcy5oZWFkXyA9IHRoaXMuZWxlbWVudHNfLmxlbmd0aCA9IDAKfTsKZ29vZy5zdHJ1Y3RzLlF1ZXVlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkUXVldWUkJGNvbnRhaW5zJChvYmopIHsKICByZXR1cm4gZ29vZy5hcnJheS5jb250YWlucyh0aGlzLmVsZW1lbnRzXywgb2JqKQp9Owpnb29nLnN0cnVjdHMuUXVldWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkUXVldWUkJHJlbW92ZSQob2JqKSB7CiAgdmFyIGluZGV4ID0gZ29vZy5hcnJheS5pbmRleE9mKHRoaXMuZWxlbWVudHNfLCBvYmopOwogIGlmKDAgPiBpbmRleCkgewogICAgcmV0dXJuITEKICB9CiAgaW5kZXggPT0gdGhpcy5oZWFkXyA/IHRoaXMuZGVxdWV1ZSgpIDogKGdvb2cuYXJyYXkucmVtb3ZlQXQodGhpcy5lbGVtZW50c18sIGluZGV4KSwgdGhpcy50YWlsXy0tKTsKICByZXR1cm4hMAp9Owpnb29nLnN0cnVjdHMuUXVldWUucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkUXVldWUkJGdldFZhbHVlcyQoKSB7CiAgcmV0dXJuIHRoaXMuZWxlbWVudHNfLnNsaWNlKHRoaXMuaGVhZF8sIHRoaXMudGFpbF8pCn07Cmdvb2cuVGltZXIgPSBmdW5jdGlvbiAkZ29vZyRUaW1lciQob3B0X2ludGVydmFsLCBvcHRfdGltZXJPYmplY3QpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuaW50ZXJ2YWxfID0gb3B0X2ludGVydmFsIHx8IDE7CiAgdGhpcy50aW1lck9iamVjdF8gPSBvcHRfdGltZXJPYmplY3QgfHwgZ29vZy5UaW1lci5kZWZhdWx0VGltZXJPYmplY3Q7CiAgdGhpcy5ib3VuZFRpY2tfID0gZ29vZy5iaW5kKHRoaXMudGlja18sIHRoaXMpOwogIHRoaXMubGFzdF8gPSBnb29nLm5vdygpCn07Cmdvb2cuaW5oZXJpdHMoZ29vZy5UaW1lciwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwpnb29nLlRpbWVyLk1BWF9USU1FT1VUXyA9IDIxNDc0ODM2NDc7Cmdvb2cuVGltZXIucHJvdG90eXBlLmVuYWJsZWQgPSAhMTsKZ29vZy5UaW1lci5kZWZhdWx0VGltZXJPYmplY3QgPSBnb29nLmdsb2JhbC53aW5kb3c7Cmdvb2cuVGltZXIuaW50ZXJ2YWxTY2FsZSA9IDAuODsKZ29vZy5UaW1lci5wcm90b3R5cGUudGltZXJfID0gbnVsbDsKZ29vZy5UaW1lci5wcm90b3R5cGUuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbiAkZ29vZyRUaW1lciQkc2V0SW50ZXJ2YWwkKGludGVydmFsKSB7CiAgdGhpcy5pbnRlcnZhbF8gPSBpbnRlcnZhbDsKICB0aGlzLnRpbWVyXyAmJiB0aGlzLmVuYWJsZWQgPyAodGhpcy5zdG9wKCksIHRoaXMuc3RhcnQoKSkgOiB0aGlzLnRpbWVyXyAmJiB0aGlzLnN0b3AoKQp9Owpnb29nLlRpbWVyLnByb3RvdHlwZS50aWNrXyA9IGZ1bmN0aW9uICRnb29nJFRpbWVyJCR0aWNrXyQoKSB7CiAgaWYodGhpcy5lbmFibGVkKSB7CiAgICB2YXIgZWxhcHNlZCA9IGdvb2cubm93KCkgLSB0aGlzLmxhc3RfOwogICAgMCA8IGVsYXBzZWQgJiYgZWxhcHNlZCA8IHRoaXMuaW50ZXJ2YWxfICogZ29vZy5UaW1lci5pbnRlcnZhbFNjYWxlID8gdGhpcy50aW1lcl8gPSB0aGlzLnRpbWVyT2JqZWN0Xy5zZXRUaW1lb3V0KHRoaXMuYm91bmRUaWNrXywgdGhpcy5pbnRlcnZhbF8gLSBlbGFwc2VkKSA6ICh0aGlzLmRpc3BhdGNoVGljaygpLCB0aGlzLmVuYWJsZWQgJiYgKHRoaXMudGltZXJfID0gdGhpcy50aW1lck9iamVjdF8uc2V0VGltZW91dCh0aGlzLmJvdW5kVGlja18sIHRoaXMuaW50ZXJ2YWxfKSwgdGhpcy5sYXN0XyA9IGdvb2cubm93KCkpKQogIH0KfTsKZ29vZy5UaW1lci5wcm90b3R5cGUuZGlzcGF0Y2hUaWNrID0gZnVuY3Rpb24gJGdvb2ckVGltZXIkJGRpc3BhdGNoVGljayQoKSB7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KGdvb2cuVGltZXIuVElDSykKfTsKZ29vZy5UaW1lci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAkZ29vZyRUaW1lciQkc3RhcnQkKCkgewogIHRoaXMuZW5hYmxlZCA9ICEwOwogIHRoaXMudGltZXJfIHx8ICh0aGlzLnRpbWVyXyA9IHRoaXMudGltZXJPYmplY3RfLnNldFRpbWVvdXQodGhpcy5ib3VuZFRpY2tfLCB0aGlzLmludGVydmFsXyksIHRoaXMubGFzdF8gPSBnb29nLm5vdygpKQp9Owpnb29nLlRpbWVyLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gJGdvb2ckVGltZXIkJHN0b3AkKCkgewogIHRoaXMuZW5hYmxlZCA9ICExOwogIHRoaXMudGltZXJfICYmICh0aGlzLnRpbWVyT2JqZWN0Xy5jbGVhclRpbWVvdXQodGhpcy50aW1lcl8pLCB0aGlzLnRpbWVyXyA9IG51bGwpCn07Cmdvb2cuVGltZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRnb29nJFRpbWVyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuVGltZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5zdG9wKCk7CiAgZGVsZXRlIHRoaXMudGltZXJPYmplY3RfCn07Cmdvb2cuVGltZXIuVElDSyA9ICJ0aWNrIjsKZ29vZy5UaW1lci5jYWxsT25jZSA9IGZ1bmN0aW9uICRnb29nJFRpbWVyJGNhbGxPbmNlJChsaXN0ZW5lciwgb3B0X2RlbGF5LCBvcHRfaGFuZGxlcikgewogIGlmKGdvb2cuaXNGdW5jdGlvbihsaXN0ZW5lcikpIHsKICAgIG9wdF9oYW5kbGVyICYmIChsaXN0ZW5lciA9IGdvb2cuYmluZChsaXN0ZW5lciwgb3B0X2hhbmRsZXIpKQogIH1lbHNlIHsKICAgIGlmKGxpc3RlbmVyICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIGxpc3RlbmVyLmhhbmRsZUV2ZW50KSB7CiAgICAgIGxpc3RlbmVyID0gZ29vZy5iaW5kKGxpc3RlbmVyLmhhbmRsZUV2ZW50LCBsaXN0ZW5lcikKICAgIH1lbHNlIHsKICAgICAgdGhyb3cgRXJyb3IoIkludmFsaWQgbGlzdGVuZXIgYXJndW1lbnQiKTsKICAgIH0KICB9CiAgcmV0dXJuIG9wdF9kZWxheSA+IGdvb2cuVGltZXIuTUFYX1RJTUVPVVRfID8gLTEgOiBnb29nLlRpbWVyLmRlZmF1bHRUaW1lck9iamVjdC5zZXRUaW1lb3V0KGxpc3RlbmVyLCBvcHRfZGVsYXkgfHwgMCkKfTsKZ29vZy5UaW1lci5jbGVhciA9IGZ1bmN0aW9uICRnb29nJFRpbWVyJGNsZWFyJCh0aW1lcklkKSB7CiAgZ29vZy5UaW1lci5kZWZhdWx0VGltZXJPYmplY3QuY2xlYXJUaW1lb3V0KHRpbWVySWQpCn07CnRhbGsubWVkaWEuV2FybmluZ0NvZGVzID0ge307CnRhbGsubWVkaWEuQ2FsbFR5cGUgPSB7Tk9ORTowLCBWT0lDRToxLCBWT0lDRU1BSUw6MiwgVklERU86MywgVEVTVDo0fTsKdGFsay5tZWRpYS5DYWxsVHlwZUZvckRpc3BsYXkgPSB7TVVMVElXQVk6Im11bHRpd2F5IiwgUEhPTkU6InBob25lIiwgVklERU86InZpZGVvIiwgVk9JQ0U6InZvaWNlIn07CnRhbGsubWVkaWEuSWRsZVNpZ25hbCA9IHtOT05FOjAsIEFDVElWRToxLCBJRExFOjJ9Owp0YWxrLm1lZGlhLlBsdWdpbkxvZ0xldmVsID0ge0VSUk9SOiJMU19FUlJPUiIsIFdBUk5JTkc6IkxTX1dBUk5JTkciLCBJTkZPOiJMU19JTkZPIiwgVkVSQk9TRToiTFNfVkVSQk9TRSIsIFNFTlNJVElWRToiTFNfU0VOU0lUSVZFIn07CnRhbGsubWVkaWEuU2hhcmVkV2luZG93RXZlbnQgPSB7V0lORE9XX0NMT1NFOiJ3aW5kb3ctY2xvc2UiLCBXSU5ET1dfTUlOSU1JWkU6IndpbmRvdy1taW5pbWl6ZSIsIFdJTkRPV19SRVNUT1JFOiJ3aW5kb3ctcmVzdG9yZSJ9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudCA9IHtWRVJTSU9OOiJtZiIsIEVSUk9SOiJmZSIsIFdBUk5JTkc6ImZ3IiwgRU5EX0NBTEw6ImVuZCIsIE1FU1NBR0U6ImYtbXNnIiwgT1VUR09JTkdfTUVTU0FHRToib2YtbXNnIiwgU1RSRUFNX09OOiJzdHJlYW1vbiIsIFNUUkVBTV9SRUFEWToic3RyZWFtcmVhZHkiLCBTVFJFQU1fT0ZGOiJzdHJlYW1vZmYiLCBHRVRfREVWSUNFX1BSRUZTOiJnZXRkZXZpY2VzdGF0ZSIsIFNFVF9ERVZJQ0VfUFJFRlM6InNldGRldmljZXN0YXRlIiwgUkVBRFk6ImYtcmVhZHkiLCBGTFVURVNUQVRFOiJmcyIsIEZMVVRFU1RBVEVfQ0hBTkdFRDoiZmx1dGVzdGF0ZSIsIERFQUQ6ImYtZGVhZCIsIENPTk5FQ1RJTkc6ImYtY29ubmVjdCIsIEFVRElPX0lORk86ImphaSIsIENPTU1BTkQ6ImNvbW1hbmQiLCBVUExPQURfTE9HX1JFU1BPTlNFOiJ1cGxvYWRsb2dyZXNwb25zZSIsIENPTk5FQ1RfSU1QUkVTU0lPTjoibG9nLWNvbm5lY3QiLCBUUkFOU1BPUlRfU1RBVEU6InRyc3RhdGUiLCAKU0hBUkVfV0lORE9XUzoic2hhcmUtd2luZG93cyIsIFNIQVJFX05PVElGWToic2hhcmUtbm90aWZ5IiwgU0hBUkVfUkVTVUxUOiJzaGFyZS1yZXN1bHQiLCBQSU5HOiJwaW5nIiwgQ0FMTF9JTVBSRVNTSU9OOiJjYWxsLWltcHJlc3Npb24iLCBDSEVDS19DT05ORUNUSVZJVFk6ImNoZWNrY29ubmVjdGl2aXR5IiwgUFJPQ0VTU0lOR19USU1FOiJwcm9jZXNzaW5ndGltZSJ9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5FcnJvckNvZGVzID0ge0NPTk5FQ1RJVklUWV9MT1NUOiIxIiwgQlJPV1NFUl9OT1RfUkVTUE9OU0U6IjEwMiJ9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5Db21tYW5kcyA9IHtBQ0NFUFQ6ImFjY2VwdCIsIERFQ0xJTkU6ImRlY2xpbmUifTsKdGFsay5tZWRpYS5VaUV2ZW50cyA9IHtTV0lUQ0hfTUVESUFfVUk6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImNsb3NlX21lZGlhX3VpIil9Owp0YWxrLm1lZGlhLlN3aXRjaE1lZGlhVWlFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFN3aXRjaE1lZGlhVWlFdmVudCQoKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLlVpRXZlbnRzLlNXSVRDSF9NRURJQV9VSSkKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLlN3aXRjaE1lZGlhVWlFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLlVpTWVzc2FnZVR5cGVzID0ge1RBTEtfUExVR0lOOiJwbHVnaW4tZGF0YSIsIEpJTkdMRToiY29ubmVjdC1kYXRhIn07CnRhbGsubWVkaWEuVWlNZXNzYWdlcyA9IHtzdHJlYW1vbjoxLCBzdHJlYW1vZmY6MSwgc3RyZWFtcmVhZHk6MSwgc3RyZWFtZmFpbGVkOjEsIGpybmc6MSwgamE6MX07CnRhbGsubWVkaWEuVWlNb2RlID0ge0JJRzoiYiIsIE5PUk1BTDoibiJ9Owp0YWxrLm1lZGlhLk1lZGlhVHlwZSA9IHtBVURJTzoiYSIsIFZJREVPOiJ2In07CnRhbGsubWVkaWEuQVVESU9fSU5GT19TUEVBS0VSU19TRUxGID0gMDsKdGFsay5tZWRpYS5BVURJT19JTkZPX1NQRUFLRVJTX1ZPTFVNRVMgPSAxOwp0YWxrLm1lZGlhLkFVRElPX0lORk9fU0VTU0lPTl9JRF9QQVJBTSA9IDI7CnRhbGsubWVkaWEuQVVESU9fSU5GT19JTlBVVF9MRVZFTF9QQVJBTSA9IDM7CnRhbGsubWVkaWEuQVVESU9fSU5GT19TUEVBS0VSU19QQVJBTSA9IDQ7CnRhbGsubWVkaWEuQ2FsbGFibGVTdGF0ZSA9IHtDQUxMQUJMRToiYyIsIElOU1RBTExBQkxFOiJwIiwgSU5TVEFMTEFCTEVfRkxBU0g6ImYiLCBVUEdSQURFX0ZMQVNIOiJ1ZiIsIElOVklUQUJMRToiaSIsIERJU0FCTEVEX09GRkxJTkU6Im9mZiIsIERJU0FCTEVEX0JMT0NLRUQ6ImJsIiwgRElTQUJMRURfSU5fQ0FMTDoiaWMiLCBESVNBQkxFRF9JTl9DQUxMX0pJRDoiaWNqIiwgRElTQUJMRURfTVVDOiJtdSIsIERJU0FCTEVEX1VOSU5WSVRBQkxFOiJvcyIsIE5PX0FVRElPX1NQRUFLRVJTOiJuYXMiLCBOT19BVURJT19NSUM6Im5hbSIsIERJU0FCTEVEX0FJTToiYWltIiwgUEhPTkVfTk9UX1NFVFVQOiJwbnMiLCBESVNBQkxFRF9QT0xJQ1k6InBvbCIsIFNJR05FRF9PVVQ6InNvIiwgRElTQ09OTkVDVEVEOiJkbyIsIElOVkFMSURfTlVNQkVSOiJpbiIsIEhJRERFTl9VTkFWQUlMQUJMRToidW4ifTsKdGFsay5tZWRpYS5DQUxMX1RJTUVPVVRfTVMgPSA5RTQ7CnRhbGsubWVkaWEuVklERU9fQVNQRUNUX1JBVElPID0gMS42Owp0YWxrLm1lZGlhLk9ORV9UT19PTkVfUkVNT1RFX1ZJREVPX1NTUkMgPSAiMCI7CnRhbGsubWVkaWEuRXZlbnRTb3VyY2UgPSB7VVNFUjowLCBHQURHRVQ6MSwgUExVR0lOOjJ9Owp0YWxrLm1lZGlhLkNhbGxFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxFdmVudCQodHlwZSwganNvbikgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdHlwZSk7CiAgdGhpcy5qc29uID0ganNvbjsKICB0aGlzLm1zZ1R5cGUgPSB0aGlzLmdldE1zZ1R5cGVfKGpzb24pOwogIHRoaXMudGltZXN0YW1wID0gZ29vZy5ub3coKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbEV2ZW50LmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoInRhbGsubWVkaWEuQ2FsbEV2ZW50Iik7CnRhbGsubWVkaWEuQ2FsbEV2ZW50LnByb3RvdHlwZS5nZXRQYXJzZWRNc2cgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsRXZlbnQkJGdldFBhcnNlZE1zZyQoKSB7CiAgdGhpcy5wYXJzZWRNc2dfIHx8ICh0aGlzLnBhcnNlZE1zZ18gPSB0aGlzLmpzb24gPyBnb29nLmpzb24ucGFyc2UodGhpcy5qc29uKSA6IG51bGwpOwogIHJldHVybiB0aGlzLnBhcnNlZE1zZ18KfTsKdGFsay5tZWRpYS5DYWxsRXZlbnQucHJvdG90eXBlLmdldE1zZ1R5cGVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbEV2ZW50JCRnZXRNc2dUeXBlXyQoanNvbikgewogIHRyeSB7CiAgICB2YXIgdHlwZSA9IGpzb24ubWF0Y2goJyIuKj8iJylbMF07CiAgICByZXR1cm4gdHlwZS5zdWJzdHJpbmcoMSwgdHlwZS5sZW5ndGggLSAxKQogIH1jYXRjaChlKSB7CiAgICByZXR1cm4gdGFsay5tZWRpYS5DYWxsRXZlbnQubG9nZ2VyXy53YXJuaW5nKCJXZSByZWNlaXZlZCBhbiBlbXB0eSBtZXNzYWdlIGZyb20gdGhlIHBsdWdpbiIpLCAiIgogIH0KfTsKdmFyIGpzcGIgPSB7TWVzc2FnZTpmdW5jdGlvbigpIHsKfX07CmpzcGIuTWVzc2FnZS5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRqc3BiJE1lc3NhZ2UkJGdldEpzUGJNZXNzYWdlSWQkKCkgewp9Owpqc3BiLk1lc3NhZ2UubWF0ZXJpYWxpemVFeHRlbnNpb25PYmplY3QgPSBmdW5jdGlvbiAkanNwYiRNZXNzYWdlJG1hdGVyaWFsaXplRXh0ZW5zaW9uT2JqZWN0JChhcnJheSwgZXhwZWN0ZWRJbmRleCkgewogIHZhciBvYmo7CiAgaWYoYXJyYXkubGVuZ3RoKSB7CiAgICB2YXIgZm91bmRJbmRleCA9IGFycmF5Lmxlbmd0aCAtIDE7CiAgICBpZigob2JqID0gYXJyYXlbZm91bmRJbmRleF0pICYmICJvYmplY3QiID09IHR5cGVvZiBvYmogJiYgIm51bWJlciIgIT0gdHlwZW9mIG9iai5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZvdW5kSW5kZXggPCBleHBlY3RlZEluZGV4ICYmIChhcnJheVtleHBlY3RlZEluZGV4XSA9IG9iaiwgZGVsZXRlIGFycmF5W2ZvdW5kSW5kZXhdKSwgb2JqCiAgICB9CiAgfQogIG9iaiA9IHt9OwogIHJldHVybiBhcnJheVtNYXRoLm1heChhcnJheS5sZW5ndGgsIGV4cGVjdGVkSW5kZXgpXSA9IG9iagp9Owpqc3BiLk1lc3NhZ2UudG9PYmplY3RMaXN0ID0gZnVuY3Rpb24gJGpzcGIkTWVzc2FnZSR0b09iamVjdExpc3QkKGZpZWxkLCB0b09iamVjdEZuKSB7CiAgZm9yKHZhciByZXN1bHQgPSBbXSwgaSA9IDA7aSA8IGZpZWxkLmxlbmd0aDtpKyspIHsKICAgIHJlc3VsdFtpXSA9IHRvT2JqZWN0Rm4uY2FsbChmaWVsZFtpXSkKICB9CiAgcmV0dXJuIHJlc3VsdAp9Owpqc3BiLk1lc3NhZ2UudG9NYXAgPSBmdW5jdGlvbiAkanNwYiRNZXNzYWdlJHRvTWFwJChmaWVsZCwgbWFwS2V5R2V0dGVyRm4sIHRvT2JqZWN0Rm4pIHsKICBmb3IodmFyIHJlc3VsdCA9IHt9LCBpID0gMDtpIDwgZmllbGQubGVuZ3RoO2krKykgewogICAgcmVzdWx0W21hcEtleUdldHRlckZuLmNhbGwoZmllbGRbaV0pXSA9IHRvT2JqZWN0Rm4uY2FsbChmaWVsZFtpXSkKICB9CiAgcmV0dXJuIHJlc3VsdAp9Owpqc3BiLk1lc3NhZ2UucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAkanNwYiRNZXNzYWdlJCR0b0FycmF5JCgpIHsKICByZXR1cm4gdGhpcy5hcnJheQp9Owpqc3BiLk1lc3NhZ2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gJGpzcGIkTWVzc2FnZSQkdG9TdHJpbmckKCkgewogIHJldHVybiB0aGlzLmFycmF5LnRvU3RyaW5nKCkKfTsKanNwYi5NZXNzYWdlLnByb3RvdHlwZS5nZXRFeHRlbnNpb24gPSBmdW5jdGlvbiAkanNwYiRNZXNzYWdlJCRnZXRFeHRlbnNpb24kKGZpZWxkSW5mbykgewogIHZhciBpbmRleCA9IGZpZWxkSW5mby5maWVsZEluZGV4OwogIGdvb2cuYXNzZXJ0cy5hc3NlcnQoISF0aGlzLmV4dGVuc2lvbldyYXBwZXJzLCAiVHJ5aW5nIHRvIGdldCBmaWVsZCBpbmRleCAiICsgaW5kZXggKyAiIG9uIGEgbm9uLWV4dGVuZGFibGUgb2JqZWN0LiIpOwogIHZhciBjdG9yID0gZmllbGRJbmZvLmN0b3I7CiAgIXRoaXMuZXh0ZW5zaW9uV3JhcHBlcnNbaW5kZXhdICYmIHRoaXMuZXh0ZW5zaW9uT2JqZWN0W2luZGV4XSAmJiAodGhpcy5leHRlbnNpb25XcmFwcGVyc1tpbmRleF0gPSBuZXcgY3Rvcih0aGlzLmV4dGVuc2lvbk9iamVjdFtpbmRleF0pKTsKICByZXR1cm4gdGhpcy5leHRlbnNpb25XcmFwcGVyc1tpbmRleF0KfTsKanNwYi5NZXNzYWdlLmRpZmZlcmVuY2UgPSBmdW5jdGlvbiAkanNwYiRNZXNzYWdlJGRpZmZlcmVuY2UkKG0xLCBtMikgewogIGlmKCEobTEgaW5zdGFuY2VvZiBtMi5jb25zdHJ1Y3RvcikpIHsKICAgIHRocm93IEVycm9yKCJNZXNzYWdlcyBoYXZlIGRpZmZlcmVudCB0eXBlcy4iKTsKICB9CiAgdmFyIGFycjEgPSBtMS50b0FycmF5KCksIGFycjIgPSBtMi50b0FycmF5KCksIHJlcyA9IFtdLCBzdGFydCA9IDAsIGxlbmd0aCA9IGFycjEubGVuZ3RoID4gYXJyMi5sZW5ndGggPyBhcnIxLmxlbmd0aCA6IGFycjIubGVuZ3RoOwogIG0xLmdldEpzUGJNZXNzYWdlSWQoKSAmJiAocmVzWzBdID0gbTEuZ2V0SnNQYk1lc3NhZ2VJZCgpLCBzdGFydCA9IDEpOwogIGZvcih2YXIgaSA9IHN0YXJ0O2kgPCBsZW5ndGg7aSsrKSB7CiAgICBqc3BiLk1lc3NhZ2UuY29tcGFyZUZpZWxkcyhhcnIxW2ldLCBhcnIyW2ldKSB8fCAocmVzW2ldID0gYXJyMltpXSkKICB9CiAgcmV0dXJuIG5ldyBtMS5jb25zdHJ1Y3RvcihyZXMpCn07CmpzcGIuTWVzc2FnZS5lcXVhbHMgPSBmdW5jdGlvbiAkanNwYiRNZXNzYWdlJGVxdWFscyQobTEsIG0yKSB7CiAgcmV0dXJuIG0xID09IG0yIHx8ICEoIW0xIHx8ICFtMikgJiYgbTEgaW5zdGFuY2VvZiBtMi5jb25zdHJ1Y3RvciAmJiBqc3BiLk1lc3NhZ2UuY29tcGFyZUZpZWxkcyhtMS50b0FycmF5KCksIG0yLnRvQXJyYXkoKSkKfTsKanNwYi5NZXNzYWdlLmNvbXBhcmVGaWVsZHMgPSBmdW5jdGlvbiAkanNwYiRNZXNzYWdlJGNvbXBhcmVGaWVsZHMkKGZpZWxkMSwgZmllbGQyKSB7CiAgaWYoZ29vZy5pc09iamVjdChmaWVsZDEpICYmIGdvb2cuaXNPYmplY3QoZmllbGQyKSkgewogICAgdmFyIG9iajEgPSBmaWVsZDEsIG9iajIgPSBmaWVsZDIsIG5hbWU7CiAgICBmb3IobmFtZSBpbiBvYmoxKSB7CiAgICAgIGlmKCFqc3BiLk1lc3NhZ2UuY29tcGFyZUZpZWxkcyhvYmoxW25hbWVdLCBvYmoyW25hbWVdKSkgewogICAgICAgIHJldHVybiExCiAgICAgIH0KICAgIH0KICAgIGZvcihuYW1lIGluIG9iajIpIHsKICAgICAgaWYoIShuYW1lIGluIG9iajEpICYmICFqc3BiLk1lc3NhZ2UuY29tcGFyZUZpZWxkcyhvYmoxW25hbWVdLCBvYmoyW25hbWVdKSkgewogICAgICAgIHJldHVybiExCiAgICAgIH0KICAgIH0KICAgIHJldHVybiEwCiAgfQogIHJldHVybiBmaWVsZDEgPT09IGZpZWxkMiB8fCBudWxsID09IGZpZWxkMSAmJiBudWxsID09IGZpZWxkMgp9Owpqc3BiLk1lc3NhZ2UuYnVpbGRNZXNzYWdlRnJvbUFycmF5ID0gZnVuY3Rpb24gJGpzcGIkTWVzc2FnZSRidWlsZE1lc3NhZ2VGcm9tQXJyYXkkKGRhdGEpIHsKICB2YXIgbWVzc2FnZUN0b3IgPSBqc3BiLk1lc3NhZ2UucmVnaXN0cnlfW2RhdGFbMF1dOwogIGlmKCFtZXNzYWdlQ3RvcikgewogICAgdGhyb3cgRXJyb3IoIlVua25vd24gSnNQYiBtZXNzYWdlIHR5cGU6ICIgKyBkYXRhWzBdKTsKICB9CiAgcmV0dXJuIG5ldyBtZXNzYWdlQ3RvcihkYXRhKQp9Owpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZSA9IGZ1bmN0aW9uICRqc3BiJE1lc3NhZ2UkcmVnaXN0ZXJNZXNzYWdlVHlwZSQoaWQsIGNvbnN0cnVjdG9yKSB7CiAganNwYi5NZXNzYWdlLnJlZ2lzdHJ5X1tpZF0gPSBjb25zdHJ1Y3Rvcgp9Owpqc3BiLk1lc3NhZ2UucmVnaXN0cnlfID0ge307CnZhciBwcm90byA9IHthcHBzOnt9fTsKcHJvdG8uYXBwcy5jaGF0ID0ge307CnByb3RvLmFwcHMuY2hhdC5mbHV0ZSA9IHt9Owpwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkZmx1dGUkQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSQob3B0X2RhdGEpIHsKICBqc3BiLk1lc3NhZ2UuY2FsbCh0aGlzKTsKICB0aGlzLmFycmF5ID0gb3B0X2RhdGEgfHwgWyJmdDpjY3IiXTsKICB0aGlzLmFycmF5WzFdID0gdGhpcy5hcnJheVsxXSB8fCBbXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZS5tZXNzYWdlSWQgPSAiZnQ6Y2NyIjsKanNwYi5NZXNzYWdlLnJlZ2lzdGVyTWVzc2FnZVR5cGUocHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UubWVzc2FnZUlkLCBwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSk7CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRmbHV0ZSRDb25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlJCRnZXRKc1BiTWVzc2FnZUlkJCgpIHsKICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UubWVzc2FnZUlkCn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLnByb3RvdHlwZS5zZXROaWNMaXN0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRmbHV0ZSRDb25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlJCRzZXROaWNMaXN0JCh2YWx1ZSkgewogIHZhbHVlID0gdmFsdWUgfHwgW107CiAgdGhpcy5hcnJheVsxXSA9IFtdOwogIGZvcih2YXIgaSA9IDA7aSA8IHZhbHVlLmxlbmd0aDtpKyspIHsKICAgIHRoaXMuYXJyYXlbMV1baV0gPSB2YWx1ZVtpXS50b0FycmF5KCkKICB9Cn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8gPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JGZsdXRlJENvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UkTmljSW5mbyQob3B0X2RhdGEpIHsKICBqc3BiLk1lc3NhZ2UuY2FsbCh0aGlzKTsKICB0aGlzLmFycmF5ID0gb3B0X2RhdGEgfHwgW107CiAgdGhpcy5hcnJheVs3XSA9IHRoaXMuYXJyYXlbN10gfHwgW107CiAgdGhpcy5hcnJheVs4XSA9IHRoaXMuYXJyYXlbOF0gfHwgW107CiAgdGhpcy5hcnJheVs5XSA9IHRoaXMuYXJyYXlbOV0gfHwgW107CiAgdGhpcy5hcnJheVsxMF0gPSB0aGlzLmFycmF5WzEwXSB8fCBbXTsKICB0aGlzLmFycmF5WzExXSA9IHRoaXMuYXJyYXlbMTFdIHx8IFtdOwogIHRoaXMuYXJyYXlbMTJdID0gdGhpcy5hcnJheVsxMl0gfHwgW10KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZS5OaWNJbmZvLCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZS5OaWNJbmZvLnByb3RvdHlwZS5zZXRMb2NhbElwID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRmbHV0ZSRDb25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlJE5pY0luZm8kJHNldExvY2FsSXAkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVswXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8ucHJvdG90eXBlLnNldEV4dGVybmFsSXAgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JGZsdXRlJENvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UkTmljSW5mbyQkc2V0RXh0ZXJuYWxJcCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzFdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UuTmljSW5mby5wcm90b3R5cGUuc2V0U3R1blNlcnZlcklwID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRmbHV0ZSRDb25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlJE5pY0luZm8kJHNldFN0dW5TZXJ2ZXJJcCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzJdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UuTmljSW5mby5wcm90b3R5cGUuc2V0TWVkaWFTZXJ2ZXJJcCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkZmx1dGUkQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSROaWNJbmZvJCRzZXRNZWRpYVNlcnZlcklwJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbM10gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZS5OaWNJbmZvLnByb3RvdHlwZS5zZXRQcm94eUlwID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRmbHV0ZSRDb25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlJE5pY0luZm8kJHNldFByb3h5SXAkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs0XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8ucHJvdG90eXBlLnNldFByb3h5VHlwZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkZmx1dGUkQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSROaWNJbmZvJCRzZXRQcm94eVR5cGUkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs1XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8ucHJvdG90eXBlLnNldFByb3h5QXV0aCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkZmx1dGUkQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSROaWNJbmZvJCRzZXRQcm94eUF1dGgkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs2XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8ucHJvdG90eXBlLnNldFN0dW5MaXN0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRmbHV0ZSRDb25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlJE5pY0luZm8kJHNldFN0dW5MaXN0JCh2YWx1ZSkgewogIHZhbHVlID0gdmFsdWUgfHwgW107CiAgdGhpcy5hcnJheVs3XSA9IFtdOwogIGZvcih2YXIgaSA9IDA7aSA8IHZhbHVlLmxlbmd0aDtpKyspIHsKICAgIHRoaXMuYXJyYXlbN11baV0gPSB2YWx1ZVtpXS50b0FycmF5KCkKICB9Cn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8ucHJvdG90eXBlLnNldEh0dHBMaXN0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRmbHV0ZSRDb25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlJE5pY0luZm8kJHNldEh0dHBMaXN0JCh2YWx1ZSkgewogIHZhbHVlID0gdmFsdWUgfHwgW107CiAgdGhpcy5hcnJheVs4XSA9IFtdOwogIGZvcih2YXIgaSA9IDA7aSA8IHZhbHVlLmxlbmd0aDtpKyspIHsKICAgIHRoaXMuYXJyYXlbOF1baV0gPSB2YWx1ZVtpXS50b0FycmF5KCkKICB9Cn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8ucHJvdG90eXBlLnNldEh0dHBzTGlzdCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkZmx1dGUkQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSROaWNJbmZvJCRzZXRIdHRwc0xpc3QkKHZhbHVlKSB7CiAgdmFsdWUgPSB2YWx1ZSB8fCBbXTsKICB0aGlzLmFycmF5WzldID0gW107CiAgZm9yKHZhciBpID0gMDtpIDwgdmFsdWUubGVuZ3RoO2krKykgewogICAgdGhpcy5hcnJheVs5XVtpXSA9IHZhbHVlW2ldLnRvQXJyYXkoKQogIH0KfTsKcHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UuTmljSW5mby5wcm90b3R5cGUuc2V0VWRwTGlzdCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkZmx1dGUkQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSROaWNJbmZvJCRzZXRVZHBMaXN0JCh2YWx1ZSkgewogIHZhbHVlID0gdmFsdWUgfHwgW107CiAgdGhpcy5hcnJheVsxMF0gPSBbXTsKICBmb3IodmFyIGkgPSAwO2kgPCB2YWx1ZS5sZW5ndGg7aSsrKSB7CiAgICB0aGlzLmFycmF5WzEwXVtpXSA9IHZhbHVlW2ldLnRvQXJyYXkoKQogIH0KfTsKcHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UuTmljSW5mby5wcm90b3R5cGUuc2V0VGNwTGlzdCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkZmx1dGUkQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSROaWNJbmZvJCRzZXRUY3BMaXN0JCh2YWx1ZSkgewogIHZhbHVlID0gdmFsdWUgfHwgW107CiAgdGhpcy5hcnJheVsxMV0gPSBbXTsKICBmb3IodmFyIGkgPSAwO2kgPCB2YWx1ZS5sZW5ndGg7aSsrKSB7CiAgICB0aGlzLmFycmF5WzExXVtpXSA9IHZhbHVlW2ldLnRvQXJyYXkoKQogIH0KfTsKcHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UuTmljSW5mby5wcm90b3R5cGUuc2V0U3NsdGNwTGlzdCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkZmx1dGUkQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSROaWNJbmZvJCRzZXRTc2x0Y3BMaXN0JCh2YWx1ZSkgewogIHZhbHVlID0gdmFsdWUgfHwgW107CiAgdGhpcy5hcnJheVsxMl0gPSBbXTsKICBmb3IodmFyIGkgPSAwO2kgPCB2YWx1ZS5sZW5ndGg7aSsrKSB7CiAgICB0aGlzLmFycmF5WzEyXVtpXSA9IHZhbHVlW2ldLnRvQXJyYXkoKQogIH0KfTsKcHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UuTmljSW5mby5Qcm94eVR5cGUgPSB7VFlQRV9OT05FOjAsIFRZUEVfSFRUUFM6MSwgVFlQRV9TT0NLUzU6MiwgVFlQRV9VTktOT1dOOjN9Owpwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZS5OaWNJbmZvLlByb3h5QXV0aCA9IHtBVVRIX05PTkU6MCwgQVVUSF9CQVNJQzoxLCBBVVRIX1VOS05PV046Mn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8uUmVzdWx0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRmbHV0ZSRDb25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlJE5pY0luZm8kUmVzdWx0JChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8uUmVzdWx0LCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZS5OaWNJbmZvLlJlc3VsdC5wcm90b3R5cGUuc2V0UnR0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRmbHV0ZSRDb25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlJE5pY0luZm8kUmVzdWx0JCRzZXRSdHQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVswXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8uUmVzdWx0LnByb3RvdHlwZS5nZXRFcnJvciA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkZmx1dGUkQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSROaWNJbmZvJFJlc3VsdCQkZ2V0RXJyb3IkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzFdCn07CnByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8uUmVzdWx0LnByb3RvdHlwZS5zZXRFcnJvciA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkZmx1dGUkQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSROaWNJbmZvJFJlc3VsdCQkc2V0RXJyb3IkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnRhbGsubWVkaWEuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCQobXNnLCBvcHRfZGF0YSkgewogIHByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLmNhbGwodGhpcywgb3B0X2RhdGEpOwogIHRoaXMuamlkID0gbXNnW3RhbGsubWVkaWEuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQuQ29udGVudEluZGV4LkpJRF07CiAgdGhpcy5zZXNzaW9uSWQgPSBtc2dbdGFsay5tZWRpYS5Db25uZWN0aXZpdHlDaGVja1Jlc3VsdC5Db250ZW50SW5kZXguSURdOwogIHZhciBuaWNMaXN0ID0gW107CiAgaWYobXNnW3RhbGsubWVkaWEuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQuQ29udGVudEluZGV4Lk5JQ1NdKSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCBtc2dbdGFsay5tZWRpYS5Db25uZWN0aXZpdHlDaGVja1Jlc3VsdC5Db250ZW50SW5kZXguTklDU10ubGVuZ3RoO2krKykgewogICAgICBuaWNMaXN0LnB1c2godGhpcy5jcmVhdGVOaWNJbmZvXyhtc2dbdGFsay5tZWRpYS5Db25uZWN0aXZpdHlDaGVja1Jlc3VsdC5Db250ZW50SW5kZXguTklDU11baV0pKQogICAgfQogIH0KICB0aGlzLnNldE5pY0xpc3QobmljTGlzdCkKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNvbm5lY3Rpdml0eUNoZWNrUmVzdWx0LCBwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZSk7CnRhbGsubWVkaWEuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQuUHJveHlUeXBlXyA9IHtOT05FOiJub25lIiwgSFRUUF9PUl9IVFRQUzoiaHR0cHMiLCBTT0NLUzU6InNvY2tzNSIsIFVOS05PV046InVua25vd24ifTsKdGFsay5tZWRpYS5Db25uZWN0aXZpdHlDaGVja1Jlc3VsdC5Qcm94eUF1dGhfID0ge05PTkU6Im5vbmUiLCBCQVNJQzoiYmFzaWMiLCBVTktOT1dOOiJ1bmtub3duIn07CnRhbGsubWVkaWEuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQuQ29udGVudEluZGV4ID0ge1RZUEU6MCwgSklEOjEsIElEOjIsIE5JQ1M6M307CnRhbGsubWVkaWEuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQucHJvdG90eXBlLnNldFByb3h5SW5mb18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCQkc2V0UHJveHlJbmZvXyQobmljLCB0eXBlLCBhdXRoKSB7CiAgc3dpdGNoKHR5cGUpIHsKICAgIGNhc2UgdGFsay5tZWRpYS5Db25uZWN0aXZpdHlDaGVja1Jlc3VsdC5Qcm94eVR5cGVfLk5PTkU6CiAgICAgIG5pYy5zZXRQcm94eVR5cGUocHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UuTmljSW5mby5Qcm94eVR5cGUuVFlQRV9OT05FKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHRhbGsubWVkaWEuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQuUHJveHlUeXBlXy5IVFRQX09SX0hUVFBTOgogICAgICBuaWMuc2V0UHJveHlUeXBlKHByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8uUHJveHlUeXBlLlRZUEVfSFRUUFMpOwogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5Db25uZWN0aXZpdHlDaGVja1Jlc3VsdC5Qcm94eVR5cGVfLlNPQ0tTNToKICAgICAgbmljLnNldFByb3h5VHlwZShwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZS5OaWNJbmZvLlByb3h5VHlwZS5UWVBFX1NPQ0tTNSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgbmljLnNldFByb3h5VHlwZShwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZS5OaWNJbmZvLlByb3h5VHlwZS5UWVBFX1VOS05PV04pCiAgfQogIHN3aXRjaChhdXRoKSB7CiAgICBjYXNlIHRhbGsubWVkaWEuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQuUHJveHlBdXRoXy5OT05FOgogICAgICBuaWMuc2V0UHJveHlBdXRoKHByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8uUHJveHlBdXRoLkFVVEhfTk9ORSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSB0YWxrLm1lZGlhLkNvbm5lY3Rpdml0eUNoZWNrUmVzdWx0LlByb3h5QXV0aF8uQkFTSUM6CiAgICAgIG5pYy5zZXRQcm94eUF1dGgocHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UuTmljSW5mby5Qcm94eUF1dGguQVVUSF9CQVNJQyk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgbmljLnNldFByb3h5QXV0aChwcm90by5hcHBzLmNoYXQuZmx1dGUuQ29ubmVjdGl2aXR5Q2hlY2tSZXNwb25zZS5OaWNJbmZvLlByb3h5QXV0aC5BVVRIX1VOS05PV04pCiAgfQp9Owp0YWxrLm1lZGlhLkNvbm5lY3Rpdml0eUNoZWNrUmVzdWx0LnByb3RvdHlwZS5jcmVhdGVOaWNJbmZvXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENvbm5lY3Rpdml0eUNoZWNrUmVzdWx0JCRjcmVhdGVOaWNJbmZvXyQobmljKSB7CiAgdmFyIG5pY0luZm8gPSBuZXcgcHJvdG8uYXBwcy5jaGF0LmZsdXRlLkNvbm5lY3Rpdml0eUNoZWNrUmVzcG9uc2UuTmljSW5mbzsKICBuaWNJbmZvLnNldExvY2FsSXAobmljLmxvY2FsSXApOwogIG5pY0luZm8uc2V0RXh0ZXJuYWxJcChuaWMuZXh0ZXJuYWxJcCk7CiAgbmljSW5mby5zZXRTdHVuU2VydmVySXAobmljLnN0dW5TZXJ2ZXJJcCk7CiAgbmljSW5mby5zZXRNZWRpYVNlcnZlcklwKG5pYy5tZWRpYVNlcnZlcklwKTsKICBuaWNJbmZvLnNldFByb3h5SXAobmljLnByb3h5SXApOwogIHRoaXMuc2V0UHJveHlJbmZvXyhuaWNJbmZvLCBuaWMucHJveHlUeXBlLCBuaWMucHJveHlBdXRoKTsKICBuaWNJbmZvLnNldFN0dW5MaXN0KHRoaXMuY3JlYXRlUmVzdWx0c18obmljLnN0dW4pKTsKICBuaWNJbmZvLnNldEh0dHBMaXN0KHRoaXMuY3JlYXRlUmVzdWx0c18obmljLmh0dHApKTsKICBuaWNJbmZvLnNldEh0dHBzTGlzdCh0aGlzLmNyZWF0ZVJlc3VsdHNfKG5pYy5odHRwcykpOwogIG5pY0luZm8uc2V0VWRwTGlzdCh0aGlzLmNyZWF0ZVJlc3VsdHNfKG5pYy51ZHApKTsKICBuaWNJbmZvLnNldFRjcExpc3QodGhpcy5jcmVhdGVSZXN1bHRzXyhuaWMudGNwKSk7CiAgbmljSW5mby5zZXRTc2x0Y3BMaXN0KHRoaXMuY3JlYXRlUmVzdWx0c18obmljLnNzbHRjcCkpOwogIHJldHVybiBuaWNJbmZvCn07CnRhbGsubWVkaWEuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQucHJvdG90eXBlLmNyZWF0ZVJlc3VsdHNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQkJGNyZWF0ZVJlc3VsdHNfJChyZXMpIHsKICBmb3IodmFyIHJlc3VsdHMgPSBbXSwgaSA9IDA7aSA8IHJlcy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgcmVzdWx0ID0gbmV3IHByb3RvLmFwcHMuY2hhdC5mbHV0ZS5Db25uZWN0aXZpdHlDaGVja1Jlc3BvbnNlLk5pY0luZm8uUmVzdWx0OwogICAgcmVzdWx0LnNldFJ0dChyZXNbaV0ucnR0KTsKICAgIHJlc3VsdC5zZXRFcnJvcihyZXNbaV0uZXJyb3IpOwogICAgcmVzdWx0cy5wdXNoKHJlc3VsdCkKICB9CiAgcmV0dXJuIHJlc3VsdHMKfTsKdGFsay5tZWRpYS5DcnlwdG8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDcnlwdG8kKCkgewp9Owpnb29nLmFkZFNpbmdsZXRvbkdldHRlcih0YWxrLm1lZGlhLkNyeXB0byk7CnRhbGsubWVkaWEuQ3J5cHRvLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLkNyeXB0byIpOwp0YWxrLm1lZGlhLkNyeXB0by5wcm90b3R5cGUuaGFzRW5jcnlwdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENyeXB0byQkaGFzRW5jcnlwdGlvbiQoanNvbikgewogIGlmKGpzb24pIHsKICAgIGZvcih2YXIgc3VpdGVzID0gdGhpcy5nZXRDaXBoZXJTdWl0ZXNfKGpzb24pLCBpID0gMDtpIDwgc3VpdGVzLmxlbmd0aDtpKyspIHsKICAgICAgaWYodGhpcy5pc0NpcGhlclN1aXRlU2VjdXJlXyhzdWl0ZXNbaV0pKSB7CiAgICAgICAgcmV0dXJuITAKICAgICAgfQogICAgfQogIH0KICByZXR1cm4hMQp9Owp0YWxrLm1lZGlhLkNyeXB0by5wcm90b3R5cGUuZ2V0Q2lwaGVyU3VpdGVzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENyeXB0byQkZ2V0Q2lwaGVyU3VpdGVzXyQoanNvbikgewogIHZhciBvYmogPSBqc29uLmNyeXB0bzsKICBpZighb2JqKSB7CiAgICByZXR1cm5bXQogIH0KICBpZihvYmogaW5zdGFuY2VvZiBBcnJheSkgewogICAgZm9yKHZhciBsaXN0ID0gW10sIGkgPSAwO2kgPCBqc29uLmNyeXB0by5sZW5ndGg7aSsrKSB7CiAgICAgIGxpc3QucHVzaChvYmpbaV0uY3MpCiAgICB9CiAgICByZXR1cm4gbGlzdAogIH0KICByZXR1cm5bb2JqLmNzXQp9Owp0YWxrLm1lZGlhLkNyeXB0by5wcm90b3R5cGUuaXNDaXBoZXJTdWl0ZVNlY3VyZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDcnlwdG8kJGlzQ2lwaGVyU3VpdGVTZWN1cmVfJChzdWl0ZSkgewogIHJldHVybiEhKHN1aXRlICYmICJOVUxMIiAhPSBzdWl0ZSkKfTsKZ29vZy51c2VyQWdlbnQuZmxhc2ggPSB7fTsKZ29vZy51c2VyQWdlbnQuZmxhc2guQVNTVU1FX05PX0ZMQVNIID0gITE7Cmdvb2cudXNlckFnZW50LmZsYXNoLmRldGVjdGVkRmxhc2hfID0gITE7Cmdvb2cudXNlckFnZW50LmZsYXNoLmRldGVjdGVkRmxhc2hWZXJzaW9uXyA9ICIiOwpnb29nLnVzZXJBZ2VudC5mbGFzaC5pbml0XyA9IGZ1bmN0aW9uICRnb29nJHVzZXJBZ2VudCRmbGFzaCRpbml0XyQoKSB7CiAgaWYobmF2aWdhdG9yLnBsdWdpbnMgJiYgbmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoKSB7CiAgICB2YXIgcGx1Z2luID0gbmF2aWdhdG9yLnBsdWdpbnNbIlNob2Nrd2F2ZSBGbGFzaCJdOwogICAgcGx1Z2luICYmIChnb29nLnVzZXJBZ2VudC5mbGFzaC5kZXRlY3RlZEZsYXNoXyA9ICEwLCBwbHVnaW4uZGVzY3JpcHRpb24gJiYgKGdvb2cudXNlckFnZW50LmZsYXNoLmRldGVjdGVkRmxhc2hWZXJzaW9uXyA9IGdvb2cudXNlckFnZW50LmZsYXNoLmdldFZlcnNpb25fKHBsdWdpbi5kZXNjcmlwdGlvbikpKTsKICAgIG5hdmlnYXRvci5wbHVnaW5zWyJTaG9ja3dhdmUgRmxhc2ggMi4wIl0gJiYgKGdvb2cudXNlckFnZW50LmZsYXNoLmRldGVjdGVkRmxhc2hfID0gITAsIGdvb2cudXNlckFnZW50LmZsYXNoLmRldGVjdGVkRmxhc2hWZXJzaW9uXyA9ICIyLjAuMC4xMSIpCiAgfWVsc2UgewogICAgaWYobmF2aWdhdG9yLm1pbWVUeXBlcyAmJiBuYXZpZ2F0b3IubWltZVR5cGVzLmxlbmd0aCkgewogICAgICB2YXIgbWltZVR5cGUgPSBuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdOwogICAgICBnb29nLnVzZXJBZ2VudC5mbGFzaC5kZXRlY3RlZEZsYXNoXyA9IG1pbWVUeXBlICYmIG1pbWVUeXBlLmVuYWJsZWRQbHVnaW47CiAgICAgIGdvb2cudXNlckFnZW50LmZsYXNoLmRldGVjdGVkRmxhc2hfICYmIChnb29nLnVzZXJBZ2VudC5mbGFzaC5kZXRlY3RlZEZsYXNoVmVyc2lvbl8gPSBnb29nLnVzZXJBZ2VudC5mbGFzaC5nZXRWZXJzaW9uXyhtaW1lVHlwZS5lbmFibGVkUGx1Z2luLmRlc2NyaXB0aW9uKSkKICAgIH1lbHNlIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgYXggPSBuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNyIpOwogICAgICAgIGdvb2cudXNlckFnZW50LmZsYXNoLmRldGVjdGVkRmxhc2hfID0gITA7CiAgICAgICAgZ29vZy51c2VyQWdlbnQuZmxhc2guZGV0ZWN0ZWRGbGFzaFZlcnNpb25fID0gZ29vZy51c2VyQWdlbnQuZmxhc2guZ2V0VmVyc2lvbl8oYXguR2V0VmFyaWFibGUoIiR2ZXJzaW9uIikpCiAgICAgIH1jYXRjaChlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGF4ID0gbmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoLjYiKSwgZ29vZy51c2VyQWdlbnQuZmxhc2guZGV0ZWN0ZWRGbGFzaF8gPSAhMCwgZ29vZy51c2VyQWdlbnQuZmxhc2guZGV0ZWN0ZWRGbGFzaFZlcnNpb25fID0gIjYuMC4yMSIKICAgICAgICB9Y2F0Y2goZTIpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF4ID0gbmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIiksIGdvb2cudXNlckFnZW50LmZsYXNoLmRldGVjdGVkRmxhc2hfID0gITAsIGdvb2cudXNlckFnZW50LmZsYXNoLmRldGVjdGVkRmxhc2hWZXJzaW9uXyA9IGdvb2cudXNlckFnZW50LmZsYXNoLmdldFZlcnNpb25fKGF4LkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpKQogICAgICAgICAgfWNhdGNoKGUzKSB7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9Owpnb29nLnVzZXJBZ2VudC5mbGFzaC5nZXRWZXJzaW9uXyA9IGZ1bmN0aW9uICRnb29nJHVzZXJBZ2VudCRmbGFzaCRnZXRWZXJzaW9uXyQoZGVzYykgewogIHZhciBtYXRjaGVzID0gZGVzYy5tYXRjaCgvW1xkXSsvZyk7CiAgbWF0Y2hlcy5sZW5ndGggPSAzOwogIHJldHVybiBtYXRjaGVzLmpvaW4oIi4iKQp9Owpnb29nLnVzZXJBZ2VudC5mbGFzaC5BU1NVTUVfTk9fRkxBU0ggfHwgZ29vZy51c2VyQWdlbnQuZmxhc2guaW5pdF8oKTsKZ29vZy51c2VyQWdlbnQuZmxhc2guSEFTX0ZMQVNIID0gZ29vZy51c2VyQWdlbnQuZmxhc2guZGV0ZWN0ZWRGbGFzaF87Cmdvb2cudXNlckFnZW50LmZsYXNoLlZFUlNJT04gPSBnb29nLnVzZXJBZ2VudC5mbGFzaC5kZXRlY3RlZEZsYXNoVmVyc2lvbl87Cmdvb2cudXNlckFnZW50LmZsYXNoLmlzVmVyc2lvbiA9IGZ1bmN0aW9uICRnb29nJHVzZXJBZ2VudCRmbGFzaCRpc1ZlcnNpb24kKHZlcnNpb24pIHsKICByZXR1cm4gMCA8PSBnb29nLnN0cmluZy5jb21wYXJlVmVyc2lvbnMoZ29vZy51c2VyQWdlbnQuZmxhc2guVkVSU0lPTiwgdmVyc2lvbikKfTsKZ29vZy51c2VyQWdlbnQucHJvZHVjdCA9IHt9Owpnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9GSVJFRk9YID0gITE7Cmdvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0NBTUlOTyA9ICExOwpnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9JUEhPTkUgPSAhMTsKZ29vZy51c2VyQWdlbnQucHJvZHVjdC5BU1NVTUVfSVBBRCA9ICExOwpnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9BTkRST0lEID0gITE7Cmdvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0NIUk9NRSA9ICExOwpnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9TQUZBUkkgPSAhMTsKZ29vZy51c2VyQWdlbnQucHJvZHVjdC5QUk9EVUNUX0tOT1dOXyA9IGdvb2cudXNlckFnZW50LkFTU1VNRV9JRSB8fCBnb29nLnVzZXJBZ2VudC5BU1NVTUVfT1BFUkEgfHwgZ29vZy51c2VyQWdlbnQucHJvZHVjdC5BU1NVTUVfRklSRUZPWCB8fCBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9DQU1JTk8gfHwgZ29vZy51c2VyQWdlbnQucHJvZHVjdC5BU1NVTUVfSVBIT05FIHx8IGdvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0lQQUQgfHwgZ29vZy51c2VyQWdlbnQucHJvZHVjdC5BU1NVTUVfQU5EUk9JRCB8fCBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9DSFJPTUUgfHwgZ29vZy51c2VyQWdlbnQucHJvZHVjdC5BU1NVTUVfU0FGQVJJOwpnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmluaXRfID0gZnVuY3Rpb24gJGdvb2ckdXNlckFnZW50JHByb2R1Y3QkaW5pdF8kKCkgewogIGdvb2cudXNlckFnZW50LnByb2R1Y3QuZGV0ZWN0ZWRGaXJlZm94XyA9ICExOwogIGdvb2cudXNlckFnZW50LnByb2R1Y3QuZGV0ZWN0ZWRDYW1pbm9fID0gITE7CiAgZ29vZy51c2VyQWdlbnQucHJvZHVjdC5kZXRlY3RlZElwaG9uZV8gPSAhMTsKICBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmRldGVjdGVkSXBhZF8gPSAhMTsKICBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmRldGVjdGVkQW5kcm9pZF8gPSAhMTsKICBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmRldGVjdGVkQ2hyb21lXyA9ICExOwogIGdvb2cudXNlckFnZW50LnByb2R1Y3QuZGV0ZWN0ZWRTYWZhcmlfID0gITE7CiAgdmFyIHVhID0gZ29vZy51c2VyQWdlbnQuZ2V0VXNlckFnZW50U3RyaW5nKCk7CiAgdWEgJiYgKC0xICE9IHVhLmluZGV4T2YoIkZpcmVmb3giKSA/IGdvb2cudXNlckFnZW50LnByb2R1Y3QuZGV0ZWN0ZWRGaXJlZm94XyA9ICEwIDogLTEgIT0gdWEuaW5kZXhPZigiQ2FtaW5vIikgPyBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmRldGVjdGVkQ2FtaW5vXyA9ICEwIDogLTEgIT0gdWEuaW5kZXhPZigiaVBob25lIikgfHwgLTEgIT0gdWEuaW5kZXhPZigiaVBvZCIpID8gZ29vZy51c2VyQWdlbnQucHJvZHVjdC5kZXRlY3RlZElwaG9uZV8gPSAhMCA6IC0xICE9IHVhLmluZGV4T2YoImlQYWQiKSA/IGdvb2cudXNlckFnZW50LnByb2R1Y3QuZGV0ZWN0ZWRJcGFkXyA9ICEwIDogLTEgIT0gdWEuaW5kZXhPZigiQW5kcm9pZCIpID8gZ29vZy51c2VyQWdlbnQucHJvZHVjdC5kZXRlY3RlZEFuZHJvaWRfID0gITAgOiAtMSAhPSB1YS5pbmRleE9mKCJDaHJvbWUiKSA/IGdvb2cudXNlckFnZW50LnByb2R1Y3QuZGV0ZWN0ZWRDaHJvbWVfID0gITAgOiAtMSAhPSB1YS5pbmRleE9mKCJTYWZhcmkiKSAmJiAKICAoZ29vZy51c2VyQWdlbnQucHJvZHVjdC5kZXRlY3RlZFNhZmFyaV8gPSAhMCkpCn07Cmdvb2cudXNlckFnZW50LnByb2R1Y3QuUFJPRFVDVF9LTk9XTl8gfHwgZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pbml0XygpOwpnb29nLnVzZXJBZ2VudC5wcm9kdWN0Lk9QRVJBID0gZ29vZy51c2VyQWdlbnQuT1BFUkE7Cmdvb2cudXNlckFnZW50LnByb2R1Y3QuSUUgPSBnb29nLnVzZXJBZ2VudC5JRTsKZ29vZy51c2VyQWdlbnQucHJvZHVjdC5GSVJFRk9YID0gZ29vZy51c2VyQWdlbnQucHJvZHVjdC5QUk9EVUNUX0tOT1dOXyA/IGdvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0ZJUkVGT1ggOiBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmRldGVjdGVkRmlyZWZveF87Cmdvb2cudXNlckFnZW50LnByb2R1Y3QuQ0FNSU5PID0gZ29vZy51c2VyQWdlbnQucHJvZHVjdC5QUk9EVUNUX0tOT1dOXyA/IGdvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0NBTUlOTyA6IGdvb2cudXNlckFnZW50LnByb2R1Y3QuZGV0ZWN0ZWRDYW1pbm9fOwpnb29nLnVzZXJBZ2VudC5wcm9kdWN0LklQSE9ORSA9IGdvb2cudXNlckFnZW50LnByb2R1Y3QuUFJPRFVDVF9LTk9XTl8gPyBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9JUEhPTkUgOiBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmRldGVjdGVkSXBob25lXzsKZ29vZy51c2VyQWdlbnQucHJvZHVjdC5JUEFEID0gZ29vZy51c2VyQWdlbnQucHJvZHVjdC5QUk9EVUNUX0tOT1dOXyA/IGdvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0lQQUQgOiBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmRldGVjdGVkSXBhZF87Cmdvb2cudXNlckFnZW50LnByb2R1Y3QuQU5EUk9JRCA9IGdvb2cudXNlckFnZW50LnByb2R1Y3QuUFJPRFVDVF9LTk9XTl8gPyBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9BTkRST0lEIDogZ29vZy51c2VyQWdlbnQucHJvZHVjdC5kZXRlY3RlZEFuZHJvaWRfOwpnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkNIUk9NRSA9IGdvb2cudXNlckFnZW50LnByb2R1Y3QuUFJPRFVDVF9LTk9XTl8gPyBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9DSFJPTUUgOiBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmRldGVjdGVkQ2hyb21lXzsKZ29vZy51c2VyQWdlbnQucHJvZHVjdC5TQUZBUkkgPSBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LlBST0RVQ1RfS05PV05fID8gZ29vZy51c2VyQWdlbnQucHJvZHVjdC5BU1NVTUVfU0FGQVJJIDogZ29vZy51c2VyQWdlbnQucHJvZHVjdC5kZXRlY3RlZFNhZmFyaV87CnRhbGsubWVkaWEuRmxhc2hEZXRlY3RvciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoRGV0ZWN0b3IkKCkgewp9Owp0YWxrLm1lZGlhLkZsYXNoRGV0ZWN0b3IuUkVRVUlSRURfVkVSU0lPTl8gPSAiOC4wLjAiOwp0YWxrLm1lZGlhLkZsYXNoRGV0ZWN0b3IubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5GbGFzaERldGVjdG9yIik7CnRhbGsubWVkaWEuRmxhc2hEZXRlY3Rvci5wcm90b3R5cGUuaGFzRmxhc2hJbnN0YWxsZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaERldGVjdG9yJCRoYXNGbGFzaEluc3RhbGxlZCQoKSB7CiAgcmV0dXJuIGdvb2cudXNlckFnZW50LmZsYXNoLkhBU19GTEFTSAp9Owp0YWxrLm1lZGlhLkZsYXNoRGV0ZWN0b3IucHJvdG90eXBlLmhhc1JlcXVpcmVkRmxhc2hWZXJzaW9uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hEZXRlY3RvciQkaGFzUmVxdWlyZWRGbGFzaFZlcnNpb24kKCkgewogIGlmKGdvb2cudXNlckFnZW50Lk1BQyB8fCBnb29nLnVzZXJBZ2VudC5XSU5ET1dTKSB7CiAgICByZXR1cm4gZ29vZy51c2VyQWdlbnQuZmxhc2guaXNWZXJzaW9uKHRhbGsubWVkaWEuRmxhc2hEZXRlY3Rvci5SRVFVSVJFRF9WRVJTSU9OXykKICB9CiAgZ29vZy51c2VyQWdlbnQuTElOVVggfHwgdGFsay5tZWRpYS5GbGFzaERldGVjdG9yLmxvZ2dlcl8ud2FybmluZygiVW5zdXBwb3J0ZWQgcGxhdGZvcm0sIG5laXRoZXIgTWFjLCBXaW5kb3dzLCBub3IgTGludXgiKTsKICByZXR1cm4hMQp9Owp0YWxrLm1lZGlhLkZsYXNoRGV0ZWN0b3IuU0VSVklDRV9JRCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoInRhbGsubWVkaWEuRmxhc2hEZXRlY3RvciIpOwp0YWxrLm1lZGlhLkZsYXNoRGV0ZWN0b3IuZ2V0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hEZXRlY3RvciRnZXQkKGFwcENvbnRleHQpIHsKICByZXR1cm4gYXBwQ29udGV4dC5nZXQodGFsay5tZWRpYS5GbGFzaERldGVjdG9yLlNFUlZJQ0VfSUQpCn07CnRhbGsubWVkaWEuRmxhc2hEZXRlY3Rvci5yZWdpc3RlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoRGV0ZWN0b3IkcmVnaXN0ZXIkKGFwcENvbnRleHQpIHsKICB2YXIgZmxhc2hEZXRlY3RvciA9IG5ldyB0YWxrLm1lZGlhLkZsYXNoRGV0ZWN0b3I7CiAgYXBwQ29udGV4dC5yZWdpc3RlclNlcnZpY2UodGFsay5tZWRpYS5GbGFzaERldGVjdG9yLlNFUlZJQ0VfSUQsIGZsYXNoRGV0ZWN0b3IpOwogIHJldHVybiBmbGFzaERldGVjdG9yCn07CnRhbGsubWVkaWEuUmVuZGVyZXJEZXRlY3RvciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFJlbmRlcmVyRGV0ZWN0b3IkKGVuYWJsZU8zZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5mbGFzaF8gPSBuZXcgdGFsay5tZWRpYS5GbGFzaERldGVjdG9yOwogIHRoaXMuZW5hYmxlTzNkXyA9IGVuYWJsZU8zZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuUmVuZGVyZXJEZXRlY3RvciwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwp0YWxrLm1lZGlhLlJlbmRlcmVyRGV0ZWN0b3IuRXZlbnQgPSB7Q0FQQUJJTElUSUVTX0NIQU5HRUQ6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImNhcGFiaWxpdGllc19jaGFuZ2VkIil9Owp0YWxrLm1lZGlhLlJlbmRlcmVyRGV0ZWN0b3IuQ2FwYWJpbGl0aWVzQ2hhbmdlZEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUmVuZGVyZXJEZXRlY3RvciRDYXBhYmlsaXRpZXNDaGFuZ2VkRXZlbnQkKCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5SZW5kZXJlckRldGVjdG9yLkV2ZW50LkNBUEFCSUxJVElFU19DSEFOR0VEKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuUmVuZGVyZXJEZXRlY3Rvci5DYXBhYmlsaXRpZXNDaGFuZ2VkRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5SZW5kZXJlckRldGVjdG9yLlJFTkRFUl9NQUdJQ0NBTV9DQVBBQklMSVRZID0gMTsKdGFsay5tZWRpYS5SZW5kZXJlckRldGVjdG9yLlJFTkRFUl9DTElFTlQzRF9DQVBBQklMSVRZID0gMjsKdGFsay5tZWRpYS5SZW5kZXJlckRldGVjdG9yLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoInRhbGsubWVkaWEuUmVuZGVyZXJEZXRlY3RvciIpOwp0YWxrLm1lZGlhLlJlbmRlcmVyRGV0ZWN0b3IucHJvdG90eXBlLmdldEZsYXNoRGV0ZWN0b3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRSZW5kZXJlckRldGVjdG9yJCRnZXRGbGFzaERldGVjdG9yJCgpIHsKICByZXR1cm4gdGhpcy5mbGFzaF8KfTsKdGFsay5tZWRpYS5SZW5kZXJlckRldGVjdG9yLnByb3RvdHlwZS5pc08zZFN1cHBvcnRlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFJlbmRlcmVyRGV0ZWN0b3IkJGlzTzNkU3VwcG9ydGVkJCgpIHsKICByZXR1cm4gdGhpcy5lbmFibGVPM2RfICYmICEhdGhpcy5nZXRDbGllbnQzRERldGVjdG9yKCkKfTsKdGFsay5tZWRpYS5SZW5kZXJlckRldGVjdG9yLnByb3RvdHlwZS5nZXRDbGllbnQzRERldGVjdG9yID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUmVuZGVyZXJEZXRlY3RvciQkZ2V0Q2xpZW50M0REZXRlY3RvciQoKSB7CiAgZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5jbGllbnQzZERldGVjdG9yXykgfHwgKHRoaXMuY2xpZW50M2REZXRlY3Rvcl8gPSB0YWxrLm1lZGlhLkNsaWVudDNERGV0ZWN0b3IuY2xpZW50M2REZXRlY3Rvcik7CiAgcmV0dXJuIHRoaXMuY2xpZW50M2REZXRlY3Rvcl8KfTsKdGFsay5tZWRpYS5SZW5kZXJlckRldGVjdG9yLnByb3RvdHlwZS5nZXRDYXBhYmlsaXRpZXMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRSZW5kZXJlckRldGVjdG9yJCRnZXRDYXBhYmlsaXRpZXMkKCkgewogIHZhciBjYXBzID0gMDsKICB0aGlzLmlzTzNkU3VwcG9ydGVkKCkgJiYgdGhpcy5nZXRDbGllbnQzRERldGVjdG9yKCkuaXNJbnN0YWxsZWQoKSAmJiAoY2FwcyB8PSB0YWxrLm1lZGlhLlJlbmRlcmVyRGV0ZWN0b3IuUkVOREVSX0NMSUVOVDNEX0NBUEFCSUxJVFkpOwogIHRoaXMuZ2V0Rmxhc2hEZXRlY3RvcigpLmhhc0ZsYXNoSW5zdGFsbGVkKCkgJiYgdGhpcy5nZXRGbGFzaERldGVjdG9yKCkuaGFzUmVxdWlyZWRGbGFzaFZlcnNpb24oKSAmJiAoY2FwcyB8PSB0YWxrLm1lZGlhLlJlbmRlcmVyRGV0ZWN0b3IuUkVOREVSX01BR0lDQ0FNX0NBUEFCSUxJVFkpOwogIHJldHVybiBjYXBzCn07CnZhciBjaGF0ID0ge2NsaWVudDp7fSwgY29tbW9uOnt9fTsKY2hhdC5jbGllbnQuRXhwZXJpbWVudHMgPSB7QUxQSEE6ImFsIiwgQVBQOiJhcCIsIEFQUERFVjoiYWQiLCBBVVRPX1BMVUdJTl9MT0dfVVBMT0FEOiJhdSIsIEFVVE9DT01QTEVURV9DTE9TVVJFOiJhY2MiLCBCRVRBOiJiZSIsIEJVRERZUE9VTkNFOiJicCIsIENBTEVOREFSX0RBVEE6ImNkIiwgQ0FMTF9ERUJVRzoiY2RiIiwgQ0FMTF9JTl9DT05UQUNUX01PTEU6ImNjbSIsIENBTExfTVlfUEhPTkU6ImNtcCIsIENIQVRfSEFOR09VVDoiY2giLCBDSEFUX0hBTkdPVVRfR1BMVVNfT05MWToiY2hnIiwgQ0hBVF9IQU5HT1VUX1BVU0g6ImNocCIsIENIQVRTVE9SRV9NT0RFTDoiY3NtIiwgQ0hFQ0tfQ09OTkVDVElWSVRZOiJjYyIsIENMSUVOVDNEOiJjMyIsIENMT1NVUkVfREVWSUNFX1NFVFRJTkdTOiJjZHMiLCBDT09LSUVfSU1QUkVTU0lPTlM6ImNpIiwgQ1BVX0FEQVBUQVRJT046ImZjYSIsIENSWVBUT19DQUxMUzoiY3JwIiwgREVTS1RPUF9DQVBUVVJFOiJmZGMiLCBETkRGSUxFVFJBTlNGRVI6ImRuZCIsIApGSUxFVFJBTlNGRVI6ImZ0IiwgRlJJRU5EX1NVR0dFU1Q6ImZzIiwgRlJJRU5EX1NVR0dFU1RfTk9fRU1BSUw6ImZzZSIsIEdDT01NX0NVU1RPTV9ZT1VUVUJFOiJnY3kiLCBHQ09NTV9ERUJVR19QQU5FOiJnZHAiLCBHQ09NTV9ERUZFUl9ET0NVTUVOVF9BQ0xJTkc6ImdkZCIsIEdDT01NX0RJU0FCTEVfSEVMUF9UQUI6ImdodCIsIEdDT01NX0RJU0FCTEVfT05FX09OX09ORV9DSEFUOiJkb2MiLCBHQ09NTV9ESVNBQkxFX1NUSUxMX1RIRVJFOiJnc2QiLCBHQ09NTV9ESVNBQkxFX1lPVVRVQkU6ImdkeSIsIEdDT01NX0RJU0NPVVJBR0VfQkFEX0NMSUVOVDoiZ2JjIiwgR0NPTU1fRFVNUF9SVFBfSEVBREVSOiJnZGgiLCBHQ09NTV9FWFBFUklNRU5UQUxfR0FER0VUUzoiZ2VnIiwgR0NPTU1fRk9SQ0VfTU9ERVJBVE9SOiJnZm0iLCBHQ09NTV9GVUxMX1ZPSUNFX0FDQ09VTlQ6ImdmdiIsIEdDT01NX0dSQUNFRlVMX0RFR1JBREFUSU9OOiJnZ2QiLCBHQ09NTV9IQU5HT1VUU19QUk86ImdocCIsIApHQ09NTV9IQU5HT1VUU19QUk9fU1VQUFJFU1NfV0hJVEVCT0FSRDoiZ3N3IiwgR0NPTU1fSEFOR09VVFNfUFJPX1NVUFBSRVNTX05PVEVTOiJnc24iLCBHQ09NTV9MT0NBTF9QUkVWSUVXOiJnbHYiLCBHQ09NTV9NRURJQV9JU1NVRVM6ImdtaSIsIEdDT01NX01FRVRJTkdMSVZFOiJnbWwiLCBHQ09NTV9NVUxUSVdBWV9XQ1NfRkFJTE9WRVI6Imd3ZiIsIEdDT01NX1BTVE5fQUxMT1dfSU5UTF9DQUxMUzoiZ3BhIiwgR0NPTU1fUFNUTl9ISURFX1BIT05FX05VTUJFUl9JTl9KSUQ6ImdwaCIsIEdDT01NX1BSSVZBVEVfTVVDUzoiZ3BtIiwgR0NPTU1fUkVDUlVJVDoiZ3JjIiwgR0NPTU1fU0hBUkVEX1NQQUNFUzoiZ3NzIiwgR0NPTU1fU0hPUlRfU1RJTExfVEhFUkU6InNzdCIsIEdDT01NX1NIT1dfRVZFUllPTkU6ImdzZSIsIEdDT01NX1NLSVBfUFNUTl9DSEVDS1M6InNwYyIsIEdDT01NX1NVUlZFWV9URVhUSU5QVVQ6ImdzdCIsIEdDT01NX1dBUk5JTkdfTUVTU0FHRToiZ3dtIiwgR1JPVVBTX0lOX1NVUEVSTU9MRVM6ImdzIiwgCkdWQ19CUklER0VfSElHSF9CSVRfUkFURToiZ2JoIiwgR1ZDX0hBTkdPVVRfQVBQUzoiZ2hhIiwgR1ZDX0lOVEVSTkFMOiJndmkiLCBHVkNfTVVDX0pPSU46ImdtaiIsIEdWQ19ORVdfRkVFREJBQ0s6ImduZiIsIEdWQ19PTERfQlJJREdFOiJnb2IiLCBIQU5HT1VUOiJobyIsIEhBTkdPVVRfQUREX1JFUVVJUkVEX1NDT1BFUzoiaHJzIiwgSEFOR09VVF9BRERfVE9fQkxPQ0tFRF9DSVJDTEU6ImhhYiIsIEhBTkdPVVRfQU1CQVNTQURPUjoiaGEiLCBIQU5HT1VUX0FQUF9QSUNLRVI6ImhhcCIsIEhBTkdPVVRfQVVUT19SRUNPTk5FQ1Q6ImhhciIsIEhBTkdPVVRfQkxPQ0tJTkc6ImhibCIsIEhBTkdPVVRfQkxPQ0tJTkdfUExVU19PTkU6ImhicCIsIEhBTkdPVVRfQlJPQURDQVNUX0FDTF9TRVJWSUNFOiJoYnMiLCBIQU5HT1VUX0JST0FEQ0FTVF9BTExPV19QQVJUSUNJUEFOVFNfVE9fSU5WSVRFX09USEVSUzoiaGJpIiwgSEFOR09VVF9CUk9BRENBU1RFUjoiaGIiLCBIQU5HT1VUX0NBTExfSVNTVUVTOiJoY2kiLCAKSEFOR09VVF9DQUxMQkFDSzoiaGNiIiwgSEFOR09VVF9DU0lfVFJBQ0tJTkc6ImNzaSIsIEhBTkdPVVRfREVWX1BSRVZJRVc6ImhkcCIsIEhBTkdPVVRfRU1QVFlfUk9PTToiaGVyIiwgSEFOR09VVF9FTVBUWV9ST09NX01VVEU6ImhybSIsIEhBTkdPVVRfRU5BQkxFX0ZMSVBQWToiaGVmIiwgSEFOR09VVF9FWFRFUk5BTF9VU0VSX0lOVklURToiaGVpIiwgSEFOR09VVF9GT1JDRV9KT0lOOiJoZmoiLCBIQU5HT1VUX05PX0dSRUVOUk9PTV9PTl9DUkVBVEU6ImhuZyIsIEhBTkdPVVRfSEFQUElORVNTX1NVUlZFWToiaGhzIiwgSEFOR09VVF9IQVBQSU5FU1NfU1VSVkVZX1RFU1Q6ImhodCIsIEhBTkdPVVRfSElERV9QVUJMSVNIX0JST0FEQ0FTVF9CVVRUT046ImhocCIsIEhBTkdPVVRfSU5fUFJPRFVDVF9IRUxQX1NFVFRJTkdTOiJoaXMiLCBIQU5HT1VUX0lOVklURV9UT19NT0JJTEU6ImhpbSIsIEhBTkdPVVRfSk9JTlRMWV9BSDoiaGphIiwgSEFOR09VVF9MQVRFTkNZX1JPT01fQ0hFQ0s6ImhsciIsIApIQU5HT1VUX0xPR19TUEVBS0VSX0NIQU5HRUQ6ImhscyIsIEhBTkdPVVRfTUFKRUw6ImhtaiIsIEhBTkdPVVRfTUFLRV9NSU5PUjoiaG1tIiwgSEFOR09VVF9NRURJQV9FRkZFQ1RTX0RFQlVHOiJobWQiLCBIQU5HT1VUX01PVkVNQkVSOiJobSIsIEhBTkdPVVRfTkVXX0NIQVRfSU5WSVRFOiJuY2kiLCBIQU5HT1VUX05FV0NISVBTOiJobmMiLCBIQU5HT1VUX1BMVUdJTl9IRUxQX1BBTkU6ImhwaCIsIEhBTkdPVVRfUFJPX1RIUk9UVExJTkc6ImhwdCIsIEhBTkdPVVRfUFNUTl9PVVQ6ImhwbyIsIEhBTkdPVVRfUVVBTElUWV9TRVRUSU5HUzoiaHFzIiwgSEFOR09VVF9SRU1PVEVfS0lDSzoiaHJrIiwgSEFOR09VVF9TQVRJU0ZBQ1RJT05fU1VSVkVZOiJoc3MiLCBIQU5HT1VUX1NBVElTRkFDVElPTl9TVVJWRVlfVEVTVDoiaHN0IiwgSEFOR09VVF9TSE9QUElOR19BUFA6ImhzYSIsIEhBTkdPVVRfU0hPV19BQlVTRV9VSToiaHNiIiwgSEFOR09VVF9TSE9XX1JFUE9SVF9JU1NVRVM6ImhzciIsIApIQU5HT1VUX1NPQ0lBTF9HUkFQSF9SRUNJUElFTlQ6ImhzZyIsIEhBTkdPVVRfVEhST1RUTElORzoiaHQiLCBIQU5HT1VUX1RST1VCTEVTSE9PVElOR19NT0RFOiJodG0iLCBIQU5HT1VUX1lPVVRVQkVfQlJPQURDQVNUOiJoeWIiLCBISURFX09UUjoiaG90IiwgSE9TVF9OT1RJRklDQVRJT05TOiJobiIsIEhUTUw1X0FVRElPOiJoNWEiLCBJTlZJVEVfU1VHR0VTVElPTlM6ImlzIiwgSk1JX0xPR0dJTkdfVUk6ImpsdSIsIEpPSU5UTFlfUFJFU0hBUkVfRElBTE9HOiJqcHMiLCBLRVlCT0FSRF9NVVRFOiJ0bSIsIExBTkRJTkdfUEFHRV9EQU5HRVJPVVM6ImxwIiwgTElDRU5TSU5HOiJsaWMiLCBMSVRFX0RFQlVHOiJsZCIsIExJVEVST1NURVJfRU1QVFk6ImxlIiwgTUVESUFfRUZGRUNUUzoibWVmIiwgTUVFVElORzoibXRnIiwgTUVFVElOR19GSU5JU0hfRElBTE9HOiJtZmQiLCBNRUVUSU5HX0ZJTklTSF9ESUFMT0dfUkFORE9NOiJtZnIiLCBNRUVUSU5HX1BIT05FX0lOVklURToibXBpIiwgCk1VQzoibWMiLCBOQU1FRF9IQU5HT1VUUzoibmFoIiwgTkVXX0hPVkVSOiJuaCIsIE5FV19NT0xFUzoibm0iLCBORVdfUVVJQ0tMSVNUOiJucSIsIFBMVUdJTl9BU1lOQ19NRVNTQUdFOiJwYW0iLCBSRUNFTlRfQ0hBVFNfUVVJQ0tMSVNUOiJyY3EiLCBOT19DT05GSURFTlRJQUw6Im5jIiwgTk9URklMRVRSQU5TRkVSOiJuZnQiLCBPMkRfR0NPTU06Im9nYyIsIE8yRF9HT09HTEU6Im9nIiwgTzNEX1NNT09USDoib3NtIiwgT1pfQ0hBVF9DSVJDTEU6Im9jYyIsIE9aX0NIQVRfQ0lSQ0xFX0RJQUxPRzoibzBpIiwgT1pfQ0lSQ0xFX0RJQUxPR19XSVRIX0NISVBTOiJvZGMiLCBPWl9DSVJDTEVTX09GRl9CWV9ERUZBVUxUOiJvb2QiLCBPWl9DSEFUX0lOVklURV9ESUFMT0c6Im9jaSIsIE9aX0NJUkNMRVNfV0lUSE9VVF9QUk9NTzoib2NzIiwgT1pfRElTQUJMRV9QUkVTRU5DRV9TRVRUSU5HUzoib3BzIiwgT1pfSUVfVU5MT0FEX0RFVEVDVElPTjoiaXVkIiwgT1pfUFJPRklMRUNBUkQ6Im9wYyIsIApPWl9QUk9GSUxFQ0FSRF9GQUxMQkFDSzoib3BmIiwgUElOR19CUk9XU0VSOiJwYnIiLCBQT1BPVVQ6InBvIiwgUFJFU0VOVDoicHN0IiwgUFJJVkFURV9ST09NOiJwcnIiLCBQUk9GSUxFQ0FSRF9GUkFNRToicGYiLCBQUk9NTzoicHIiLCBQUk9NUFRFRF9NRURJQUdST0tfRlJPTV9SRVBPUlRfSVNTVUU6InBtciIsIFBVQkxJQ19QUk9GSUxFX0lOVklURVM6InBwaSIsIFFVQVNBUl9ESVNBQkxFX0VNQkVEOiJxZGUiLCBRVUFTQVJfSE9TVF9BUElfREFOR0VST1VTOiJxaGEiLCBRVUFTQVJfSU5fQUxMX0JST1dTRVI6InFpYSIsIFFVQVNBUl9MQU5ESU5HX1BBR0U6InFscCIsIFFVQVNBUl9NT0xFX1dSQVBQRVJfSUZSQU1FOiJxbXciLCBRVUFTQVJfSE9TVF9DSEFOTkVMOiJxaGMiLCBRVUFTQVJfUEFORUxTOiJxcCIsIFFVQVNBUl9QUkVTRVJWRV9NT0xFU19EVVJJTkdfUkVMT0FEOiJxbXIiLCBRVUFTQVJfUkVMT0FEX0RBVEFfU0VSVklDRToicXJzIiwgUkVKRUNUX1RIRU5fQkxPQ0s6InJ0YiIsIApST1NURVJfSElTVE9SWV9UQUI6InJodCIsIFNNUzoic3MiLCBTVUdHRVNUX0ZSSUVORFNfVE86InNmIiwgU1VQRVJNT0xFX0NMSUVOVF9IRUFMVEg6InNjaCIsIFNVUEVSTU9MRV9DTElFTlRfSEVBTFRIMjoic2MyIiwgU1VQRVJNT0xFX0RJU0FCTEVfTVVDX09UUjoic2RtIiwgU1VQRVJNT0xFX0lETEVfRVJST1JfREVURUNUSU9OOiJzaWUiLCBTVVBFUk1PTEVfUFJFU0VOQ0VfQUM6InNwYSIsIFNVUEVSTU9MRV9QUkVTRU5DRV9DU19TWU5DOiJzY3MiLCBTVVBFUk1PTEVfUFJFU0VOQ0VfSURMRToic3BpIiwgU1VQRVJNT0xFX1BSRVNFTkNFX1NVTU1BUllfTVNHOiJzc20iLCBTVVBFUk1PTEVfUkVNT1ZFX0JBTkRBSURfSEFDSzoic3JiIiwgU1VQRVJNT0xFX1NIT1dfREFURV9GT1JfT0xEX0NIQVRTOiJzc2QiLCBTVVBFUk1PTEVfU0hPV19OT19PRkZMSU5FX1RFWFQ6InNzbiIsIFNVUEVSTU9MRV9TVEFUVVNfUEFORUxfUDE6InNwMSIsIFNVUEVSTU9MRV9TVEFUVVNfUEFORUxfUDI6InNwMiIsIApXRUJSVENfVklERU86Ind2IiwgV0VCUlRDX1ZJREVPX05SOiJ2bnIiLCBVTklGWV9NRV9QUkVTRU5DRToidW1wIiwgVklERU86InZkIiwgVk9JQ0U6InZwIiwgVk9JQ0VfU01TOiJ2cyIsIFlPVVJfQ0lSQ0xFUzoieW8ifTsKY2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zID0ge0pOX1NFTlRfRlJPTV9DTElFTlQ6ImpucyIsIEpOX1NFTlRfRlJPTV9DTElFTlRfSU5fQkFEX1NUQVRFOiJqbnNiIiwgSk5fUkVDRUlWRURfSU5fQ0xJRU5UOiJqbnIiLCBKQUNLX1NFTlRfRlJPTV9DTElFTlQ6ImphcyIsIEpBQ0tfU0VOVF9GUk9NX0NMSUVOVF9JTl9CQURfU1RBVEU6Imphc2IiLCBKQUNLX1JFQ0VJVkVEX0lOX0NMSUVOVDoiamFyIiwgSlRSX1JFQ0VJVkVEX0lOX0NMSUVOVDoianRyIiwgV01fQ1BVX01BWEVEX09VVDoid21jbSIsIFdNX0NQVV9OT1JNQUw6IndtY24iLCBXTV9SRUNFSVZFRF9BVURJT19KSVRURVI6IndtcmFqIiwgV01fU0VOVF9BVURJT19KSVRURVI6Indtc2FqIiwgV01fQVVESU9fUkJfU0FNRToid21hcnMiLCBXUF9BVURJT19PVEhFUjoiYXBhbyIsIFdQX0FVRElPX1JFQ19PUEVOOiJ3cGFybyIsIFdQX0FVRElPX1JFQ19NVVRFRDoid3Bhcm0iLCBXUF9BVURJT19SRUNfU0lMRU5UOiJ3cGFycyIsIApXUF9BVURJT19SRUNfU0FUVVJBVElPTjoid3BhcmEiLCBXUF9BVURJT19SRUNfUkVNT1ZFRDoid3BhcnIiLCBXUF9BVURJT19SRUNfUlVOVElNRToid3BhcnUiLCBXUF9BVURJT19SRUNfU1JUUDoid3BhcnAiLCBXUF9BVURJT19QTEFZX09QRU46IndwYXBvIiwgV1BfQVVESU9fUExBWV9NVVRFRDoid3BhcG0iLCBXUF9BVURJT19QTEFZX1JFTU9WRUQ6IndwYXByIiwgV1BfQVVESU9fUExBWV9SVU5USU1FOiJ3YXBydCIsIFdQX0FVRElPX1BMQVlfU1JUUDoid3BhcHAiLCBXUF9BVURJT19QTEFZX1NSVFBfQVVUSDoid3BhcGEiLCBXUF9WSURFT19PVEhFUjoid3B2byIsIFdQX1ZJREVPX1JFQ19PUEVOOiJ3cHZybyIsIFdQX1ZJREVPX1JFQ19OT19ERVZJQ0U6IndwdnJuIiwgV1BfVklERU9fUkVDX0lOX1VTRToid3BydnUiLCBXUF9WSURFT19SRUNfUkVNT1ZFRDoid3B2cnIiLCBXUF9WSURFT19SRUNfU1JUUDoid3B2cnAiLCBXUF9WSURFT19QTEFZX1NSVFA6IndwdnBwIiwgV1BfVklERU9fUExBWV9TUlRQX0FVVEg6IndwdnBhIiwgCldDX1VTRV9UQ1A6IndjdGNwIiwgV0NfTE9TRV9BTExfV1JJVEFCSUxJVFk6IndjbGF3IiwgV0NfTE9TRV9QQVJUSUFMX1dSSVRBQklMSVRZOiJ3Y2xwdyIsIFdDX0RJU0FCTEVfRklMTVNUUklQOiJ3Y2RmIiwgSVNTVUVfU1VSVkVZX0RJU1BMQVlFRDoiaXNkIiwgSVNTVUVfU1VSVkVZX1NVQk1JVFRFRDoiaXNzIiwgSVNTVUVfU1VSVkVZX0NBTkNFTExFRDoiaXNjIiwgSEFQUElORVNTX1NVUlZFWV9ESVNQTEFZRUQ6ImhzZCIsIEhBUFBJTkVTU19TVVJWRVlfWUVTOiJoc3kiLCBIQVBQSU5FU1NfU1VSVkVZX05POiJoc24iLCBVQV9ESVNBQkxFX0ZTOiJ1YWRmIiwgVUFfQ0FOQ0VMX0RJU0FCTEVfRlM6InVhY2RmIiwgVUFfR0NPTU1fVE9PTEJBUl9TRVRUSU5HOiJ1YWd0cyIsIE1HQ19NVVRFX01JQzoibWdjbW0iLCBNR0NfTVVURV9DQU1FUkE6Im1nY21jIiwgTUdDX1VOTVVURV9NSUM6Im1nY3VtIiwgTUdDX1VOTVVURV9DQU1FUkE6Im1nY3VjIiwgTUdDX01VVEVfT1RIRVI6Im1nbW8iLCAKTUdDX1NDUkVFTkNBU1RfU1RBUlQ6Im1nY3NzIiwgTUdDX1NDUkVFTkNBU1RfU1RPUDoibWdjc3AiLCBJTl9QUk9EVUNUX0hFTFBfU0VUVElOR1NfTE9BRDoiaXBocyIsIEhBTkdPVVRfSk9JTkVEX1NBTkRCQVI6Imhqc2IiLCBIQU5HT1VUX0pPSU5FRF9TVFJFQU06Imhqc3QiLCBIQU5HT1VUX0pPSU5FRF9NSU5JQkFSOiJoam1iIiwgSEFOR09VVF9KT0lORURfR01BSUw6ImhqZ20iLCBQTFVHSU5fTUVTU0FHRV9QUk9DRVNTSU5HX1RIUkVTX0VYQ0VFREVEOiJwbXB0IiwgUExVR0lOX01FU1NBR0VfV0FJVElOR19USFJFU19FWENFRURFRDoicG13dCIsIFBMVUdJTl9QSU5HX05PVF9SRUNFSVZFRDoicHBuciIsIFZJREVPX1JFTkRFUl9TSE9SVF9GUkVFWkU6InZyc2YiLCBWSURFT19SRU5ERVJfTE9OR19GUkVFWkU6InZybGYifTsKY2hhdC5jb21tb24uRW5kcG9pbnRJbXByZXNzaW9ucyA9IHtST1NURVJfRVhQQU5ERURfV0lUSF9PTkxJTkVfQ09OVEFDVFM6InJlb2MiLCBST1NURVJfQVZBSUxBQkxFX0NPTlRBQ1RTX1pFUk86InJhYzAiLCBST1NURVJfQVZBSUxBQkxFX0NPTlRBQ1RTX09ORToicmFjMSIsIFJPU1RFUl9BVkFJTEFCTEVfQ09OVEFDVFNfVFdPOiJyYWMyIiwgUk9TVEVSX0FWQUlMQUJMRV9DT05UQUNUU19GT1VSOiJyYTQiLCBST1NURVJfQVZBSUxBQkxFX0NPTlRBQ1RTX0VJR0hUOiJyYWM4IiwgUk9TVEVSX0FWQUlMQUJMRV9DT05UQUNUU19TSVhURUVOOiJyYWMxNiIsIFJPU1RFUl9BVkFJTEFCTEVfQ09OVEFDVFNfTU9SRToicmFjbSIsIExJVEVfUk9TVEVSX1JFTkRFUkVEOiJscnIiLCBMSVRFX1JPU1RFUl9TRUxFQ1RFRF9DT05UQUNUOiJsc2MiLCBMSVRFX1JPU1RFUl9TRUxFQ1RFRF9MSU5LOiJsc2wiLCBMSVRFX1JPU1RFUl9BQ19RVUVSWToibGFxIiwgQlBfQ0hBTkdFX1BST0ZJTEVfQ0FSRDoiYnBjaCIsIApCUF9DSEFOR0VfQVVUT19DT01QTEVURToiYnBhYyIsIEJQX0NIQU5HRV9NT0xFOiJicGNtIiwgTU9MRV9DSEFUX09QRU5fQVRURU1QVDoibWNhIiwgTU9MRV9DSEFUX09QRU5fU1VDQ0VTUzoibWNzIiwgTU9MRV9DSEFUX1VTRVJfT1BFTl9BVFRFTVBUOiJtY3VhIiwgTU9MRV9DSEFUX1VTRVJfT1BFTl9TVUNDRVNTOiJtY3VzIiwgTU9MRV9OT05DSEFUX09QRU5fQVRURU1QVDoibW5hIiwgTU9MRV9OT05DSEFUX09QRU5fU1VDQ0VTUzoibW5zIiwgTU9MRV9DTE9TRUQ6Im1jIiwgTU9MRV9QT1BfSU46Im1waSIsIE1PTEVfUE9QX09VVDoibXBvIiwgTU9MRV9QT1BfT1VUX0ZBSUxVUkU6Im1wZSIsIENIQVRfSU5JVElBVEVfVE9UQUw6ImNpdCIsIENIQVRfSU5JVElBVEVfRlJPTV9ST1NURVI6ImNpciIsIENIQVRfSU5JVElBVEVfRlJPTV9QUk9GSUxFQ0FSRDoiY2lwIiwgQ0hBVF9JTklUSUFURV9GUk9NX0FVVE9DT01QTEVURToiY2ljIiwgQ0hBVF9JTklUSUFURV9GUk9NX0FQSToiY2lhIiwgCk1FU1NBR0VfU0VOVF9GUk9NX01PTEU6Im5tcyIsIENIQVRfVVBEQVRFX1JFQ0VJVkVEX0lOX01PTEU6Im5tZCIsIEFDVElPTl9UT09MQkFSX1ZJREVPX0NMSUNLOiJhdHYiLCBBQ1RJT05fVE9PTEJBUl9WT0lDRV9DTElDSzoiYXRhIiwgQUNUSU9OX1RPT0xCQVJfR1JPVVBfQ0xJQ0s6ImF0ZyIsIEFDVElPTl9UT09MQkFSX01VVEVfTUlDOiJhdG1tIiwgQUNUSU9OX01FTlVfVklERU9fQ0xJQ0s6ImFtdiIsIEFDVElPTl9NRU5VX1ZPSUNFX0NMSUNLOiJhbWEiLCBBQ1RJT05fRklMRV9UUkFOU0ZFUl9DTElDSzoiYWZ0IiwgQUNUSU9OX1NUQVJUX1ZJREVPOiJhc3YiLCBBQ1RJT05fU1RBUlRfVk9JQ0U6ImFzYSIsIEFDVElPTl9TVEFSVF9WSURFT19IQVNfVE9PTEJBUjoiYXN2dCIsIEFDVElPTl9TVEFSVF9WT0lDRV9IQVNfVE9PTEJBUjoiYXNhdCIsIEFDVElPTl9FUlJPUl9WSURFTzoiYWV2IiwgQUNUSU9OX0VSUk9SX1ZPSUNFOiJhZWEiLCBBQ1RJT05fSU5WSVRFOiJhaXZ0IiwgQUNUSU9OX0lOU1RBTExfRkxBU0g6ImFpZiIsIApBQ1RJT05fVVBHUkFERV9GTEFTSDoiYWl1IiwgQUNUSU9OX0lOU1RBTExfUExVR0lOOiJhaXAiLCBBQ1RJT05fS0VZQk9BUkRfTVVURV9NSUM6ImFrbW0iLCBBQ1RJT05fVE9PTEJBUl9IQU5HT1VUX0lOVklURToiYWhpIiwgQUNUSU9OX1RPT0xCQVJfSEFOR09VVF9BQ0NFUFQ6ImFoYSIsIEFDVElPTl9UT09MQkFSX0hBTkdPVVRfSUdOT1JFOiJhaGciLCBIRUFMVEhfUkVTUE9OU0VfU0xPVzoiaHJzIiwgSEVBTFRIX1RPT01BTllfQ09OVEFDVFM6Imh0YyIsIEhFQUxUSF9UT09NQU5ZX0NPTlRBQ1RTX1FVSUNLTElTVDoiaHRjcSIsIEhFQUxUSF9RVUlDS0xJU1RfR0VOX1NMT1c6ImhxZ3MiLCBJRExFX0VYVF9JX0FDVF9JX0NBQ0hFX0E6ImlpaWEiLCBJRExFX0VYVF9JX0FDVF9BX0NBQ0hFX0U6ImlpYWUiLCBJRExFX0VYVF9BX0FDVF9JX0NBQ0hFX0U6ImlhaWUiLCBJRExFX0VYVF9BX0FDVF9BX0NBQ0hFX0k6ImlhYWkiLCBJRExFX0VYVF9VX0FDVF9JX0NBQ0hFX0E6Iml1aWEiLCAKSURMRV9FWFRfVV9BQ1RfQV9DQUNIRV9JOiJpdWFpIiwgU0lHTklOR19JTjoic2kiLCBTSUdOSU5HX09VVDoic28iLCBTSUdOSU5HX0lOX0ZST01fU01VUkZfU0VUVElORzoic2kxIiwgU0lHTklOR19PVVRfRlJPTV9TTVVSRl9TRVRUSU5HOiJzbzEiLCBTSUdOSU5HX09VVF9GUk9NX05PVElGSUNBVElPTlNfT05MWToic28yIiwgU0lHTklOR19PVVRfRlJPTV9NRU5VOiJzbzMiLCBTSUdOSU5HX09VVF9GUk9NX09PQjoic280IiwgU0VOVF9NRV9QUkVTRU5DRV9DSEFOR0U6InNtcCIsIFNFTlRfTUVfUFJFU0VOQ0VfQ0hBTkdFX09GRkxJTkU6InNtbyIsIFNFVF9TSEFSRURfUFJFU0VOQ0U6InNzcCIsIE5BVElWRV9JRExFX0NPUlJFQ1RFRF9UT19BQ1RJVkU6Im5pYSIsIE5BVElWRV9JRExFX0NPUlJFQ1RFRF9UT19JRExFOiJuaWkiLCBOQVRJVkVfSURMRV9BR1JFRU1FTlQ6Im5pcyIsIFBST01PX0lOVFJPX0NPTlRBQ1RfQ0xJQ0s6InBpYyIsIFBST01PX0lOVFJPX0xFQVJOTU9SRV9DTElDSzoicGlsIiwgClBST01PX0lOVFJPX0NMT1NFOiJwaXgiLCBQUk9NT19JTlRST19GQUlMOiJwaWYiLCBFUlJPUl9DQU5OT1RfU0VORF9NQVA6ImVjbnMiLCBFUlJPUl9DSEFOTkVMX05PVF9CT1VORDoiZWNuYiIsIEVSUk9SX01PTEVfRkFJTEVEX1RPX0lOSVRJQUxJWkU6ImVtZiIsIEVSUk9SX01PTEVfUExBQ0VIT0xERVJfVElNRU9VVDoiZW1uIiwgRVJST1JfTU9MRV9PTlJFQURZX0VYQ0VQVElPTjoiZW1lIiwgVU5FWFBFQ1RFRF9PTl9NT0xFX1JFQURZOiJlbSIsIFVORVhQRUNURURfQkFEX0ZSSUVORF9TVUdHOiJlYmZzIiwgVU5FWFBFQ1RFRF9TRU5EX1RPX1NFUlZFUl9FWENFUFRJT046ImVzdHN4IiwgVU5FWFBFQ1RFRF9TRU5EX1RPX1NFUlZFUl9FUlJPUjoiZXN0c3IiLCBGU19QQU5FTF9GUklFTkRfU1VHR19ESVNQTEFZRUQ6ImZzcGZkIiwgRlNfUEFORUxfRlJJRU5EX1NVR0dfUkVGUkVTSDoiZnNwZnIiLCBGU19QQU5FTF9GUklFTkRfU1VHR19BREQ6ImZzcGZhIiwgRlNfUEFORUxfRlJJRU5EX1NVR0dfSUdOT1JFOiJmc3BmaSIsIApGU19QQU5FTF9GUklFTkRfU1VHR19NT1JFOiJmc3BmbSIsIEZTX1BBTkVMX1NZU19TVUdHX0RJU1BMQVlFRDoiZnNwc2QiLCBGU19QQU5FTF9TWVNfU1VHR19SRUZSRVNIOiJmc3BzciIsIEZTX1BBTkVMX1NZU19TVUdHX0FERDoiZnNwc2EiLCBGU19QQU5FTF9TWVNfU1VHR19JR05PUkU6ImZzcHNpIiwgRlNfUEFORUxfU1lTX1NVR0dfTU9SRToiZnNwc20iLCBGU19JTlZJVEVfRlJJRU5EX1NVR0dfQUREOiJmc2lmYSIsIEZTX0lOVklURV9GUklFTkRfU1VHR19JR05PUkU6ImZzaWZpIiwgRlNfSU5WSVRFX1NZU19TVUdHX0FERDoiZnNpc2EiLCBGU19JTlZJVEVfU1lTX1NVR0dfSUdOT1JFOiJmc2lzaSIsIEZTX0lOVklURV9CT1RfQUREOiJmc2liYSIsIFNGVF9QQU5FTF9ESVNQTEFZRUQ6InNmdGQiLCBTRlRfUEFORUxfWUVTOiJzZnR5IiwgU0ZUX1BBTkVMX05POiJzZnRuIiwgU0ZUX0FVVE9DT01QTEVURV9TVUdHRVNUOiJzZmFzIiwgU0ZUX1BST0ZJTEVfU1VHR0VTVDoic2ZwcyIsIApTRlRfTU9MRV9TVUdHRVNUOiJzZm1zIiwgU0ZUX0RJQUxPR19TVUdHRVNUOiJzZnRzIiwgSU5WSVRFX1NVR0dFU1RJT05fQ09OVEFDVDoiZWlzYyIsIElOVklURV9TVUdHRVNUSU9OX0ZPTEtTOiJlaXNmIiwgSU5WSVRFX1BST0ZJTEU6ImVpcCIsIElOVklURV9CT1Q6ImVpYiIsIElOVklURV9NQU5VQUxMWToiZWltIiwgRlRfU0laRV9NSVNTX1JFTEFZX1NFVkVSOiJmdHNtcyIsIEZUX1NJWkVfTUlTU19SRUNFSVZFUjoiZnRzbXIiLCBGVF9TSVpFX1RPT19MQVJHRToiZnRzdGwiLCBGVF9VTlNBRkVfQVRURU1QVFM6ImZ0dWEiLCBGVF9DT01QTEVURURfVFJBTlNGRVI6ImZ0c3QiLCBGVF9DQU5DRUxFRF9UUkFOU0ZFUjoiZnRjdCIsIEZUX0RORF9DT01QTEVURURfVFJBTlNGRVI6ImZ0ZHMiLCBGVF9ETkRfQ0FOQ0VMRURfVFJBTlNGRVI6ImZ0ZGMiLCBHQ09NTV9BQ1RJT05fRElBTFBBRF9PUEVOOiJnY2RwbyIsIEdDT01NX0FDVElPTl9ESUFMUEFEX0NMT1NFOiJnY2RwYyIsIEdDT01NX0FDVElPTl9BQ1RJT05CQVJfVklERU86ImdjYXYiLCAKR0NPTU1fQUNUSU9OX0FDVElPTkJBUl9QSE9ORV9QU1ROOiJnY2FwcCIsIEdDT01NX0FDVElPTl9BQ1RJT05CQVJfUEhPTkVfVk9JQ0U6ImdjYXB2IiwgR0NPTU1fQUNUSU9OX0FDVElPTkJBUl9DSEFUOiJnY2FjIiwgR0NPTU1fQUNUSU9OX0FDVElPTkJBUl9TTVM6ImdjYXMiLCBHQ09NTV9BQ1RJT05fQUNUSU9OQkFSX0VNQUlMOiJnY2FlIiwgR0NPTU1fQUNUSU9OX1NFQVJDSF9DT01QTEVURUQ6Imdjc2MiLCBHQ09NTV9BQ1RJT05fUk9TVEVSX0NMSUNLOiJnY3JjIiwgR0NPTU1fTVVMVElXQVlfV0NTX0ZBSUxPVkVSX0FUVEVNUFQ6ImdtZmEiLCBHQ09NTV9NVUxUSVdBWV9XQ1NfRkFJTE9WRVJfU1VDQ0VFREVEOiJnbWZzIiwgR0NPTU1fTVVMVElXQVlfV0NTX0ZBSUxPVkVSX0ZBSUxFRDoiZ21mZiIsIEdDT01NX01VTFRJV0FZX1dDU19GQUlMT1ZFUl9GQUlMRURfQ0FMTF9FTkRFRDoiZ21mY2UiLCBHQ09NTV9NVUxUSVdBWV9XQ1NfRkFJTE9WRVJfRkFJTEVEX1RJTUVPVVRfUkVDT05ORUNUOiJnbWZ0ciIsIApHQ09NTV9NVUxUSVdBWV9XQ1NfRkFJTE9WRVJfRkFJTEVEX1NFU1NJT05fUkVTVE9SRToiZ21mZnMiLCBHQ09NTV9NVUxUSVdBWV9XQ1NfRkFJTE9WRVJfRkFJTEVEX1RJTUVPVVRfU0VTU0lPTl9SRVNUT1JFOiJnbWZ0cyIsIEdDT01NX01VTFRJV0FZX1dDU19GQUlMT1ZFUl9GQUlMRURfSk9JTl9ST09NOiJnbWZmaiIsIEdDT01NX01VTFRJV0FZX1dDU19GQUlMT1ZFUl9GQUlMRURfVElNRU9VVF9KT0lOX1JPT006ImdtZnRqIiwgTUdDX0NBTExfSU5JVDoibWdjY2kiLCBNR0NfQ0FMTF9TVEFSVDoibWdjY3MiLCBNR0NfQ0FMTF9BQ1RJVkU6Im1nY2NhIiwgTUdDX0NBTExfRU5EOiJtZ2NjZSIsIE1HQ19DQUxMX0ZBSUxFRDoibWdjY2YiLCBNR0NfQ0FMTF9SRVNUQVJUOiJtZ2NjciIsIE1HQ19DQUxMX1RSWUFHQUlOOiJtZ2NjdCIsIE1HQ19TVEFSVF9BVVRPOiJtZ2NzYSIsIE1HQ19TVEFSVF9NQU5VQUw6Im1nY3NtIiwgTUdDX01VQ19EUk9QT1VUOiJtZ2NtZCIsIFRBTEtfUExVR0lOX0NPTk5FQ1RfT0s6InRwY28iLCAKVEFMS19QTFVHSU5fQ09OTkVDVF9FUlJPUjoidHBjZSIsIFBMVUdJTl9FUlJPUl9TT0xWRURfQllfUkVGUkVTSDoicGVzZiIsIFBMVUdJTl9FUlJPUl9TT0xWRURfQllfUkVJTlNUQUxMOiJwZXNpIiwgUExVR0lOX0VSUk9SX1NPTFZFRF9CWV9VTktOT1dOOiJwZXN1IiwgUExVR0lOX1NUQVRFX09LX1RPX0VSUk9SOiJwb2UiLCBQTFVHSU5fRVJST1JfUkVGUkVTSF9ET05FOiJwZWZkIiwgUExVR0lOX0VSUk9SX1VOSU5TVEFMTF9ET05FOiJwZXVkIiwgUExVR0lOX0VSUk9SX1JFSU5TVEFMTF9ET05FOiJwZXJkIiwgUExVR0lOX0VSUk9SX1JFUE9SVF9VTlNPTFZFRDoicGVydSIsIFFfU0VORFRPRVhURU5TSU9OOiJxc3RlIiwgUV9SRUNFSVZFRF9GUk9NX0VYVEVOU0lPTjoicXJmZSIsIFFfVE9BU1RTX0RJU1BMQVlFRDoicXRvZCIsIFFfTk9USUZJQ0FUSU9OU19QUk9DRVNTRUQ6InFub3AiLCBRX05PVElGSUNBVElPTlNfU0VOVF9UT19UT0FTVDoicW5zdCIsIFFfVFJBWV9ET1VCTEVfQ0xJQ0s6InF0ZGNsIiwgClFfSU5TVEFOQ0VDT1VOVDoicWljIiwgTEVHQUNZX0NIQVRfSU5JVElBVEVfRlJPTV9ST1NURVI6ImxjaXIiLCBMRUdBQ1lfQ0hBVF9JTklUSUFURV9GUk9NX1BST0ZJTEVDQVJEOiJsY2lwIn07CmNoYXQuY29tbW9uLkdsb2JhbEltcHJlc3Npb25zID0ge0JST1dTRVJfQ0hBTk5FTF9GSVJTVF9DT05ORUNUOiJiY2ZjIiwgQlJPV1NFUl9DSEFOTkVMX1JFQ09OTkVDVDoiYmNyYyIsIEJST1dTRVJfQ0hBTk5FTF9ESVNDT05ORUNUX0NMT1NFOiJiY2RjIiwgQlJPV1NFUl9DSEFOTkVMX0RJU0NPTk5FQ1RfRVJST1I6ImJjZGUiLCBCUk9XU0VSX0NIQU5ORUxfTkVWRVJfQ09OTkVDVEVEOiJiY25jIiwgUk9TVEVSX0NPTk5FQ1Q6InJjIiwgUk9TVEVSX1JFQ09OTkVDVDoicnIiLCBIQU5HT1VUX0xBTkRJTkdfUEFHRToiaGxwIiwgSEFOR09VVF9DQUxMX0ZBSUxFRDoiaGNmIiwgSEFOR09VVF9SRUNPTk5FQ1RfQVRURU1QVDoiaHJhIiwgSEFOR09VVF9SRUNPTk5FQ1RfUkVKT0lOOiJocnIiLCBIQU5HT1VUX1JFQ09OTkVDVF9GQUlMRUQ6ImhyZiIsIEhBTkdPVVRfUkVDT05ORUNUX1JPT01fRlVMTDoiaHJyZiIsIEhBTkdPVVRfUkVDT05ORUNUX1NVQ0NFU1M6Imhyb2siLCBIQU5HT1VUX1JFQ09OTkVDVF9UT09fTUFOWToiaHJ0bSIsIApYUENfQ0hBTk5FTF9OT1RfQ09OTkVDVEVEOiJ4Y25jIiwgWFBDX0NIQU5ORUxfQ09OTkVDVEVEX0FGVEVSX1RJTUVPVVQ6InhjY2F0In07CmNoYXQuY29tbW9uLk11Y0ltcHJlc3Npb25zID0ge0hBTkdPVVRfQUNUSU9OX1lPVVRVQkU6ImhheXQiLCBIQU5HT1VUX0FDVElPTl9BUFBTOiJoYWFwIiwgSEFOR09VVF9BQ1RJT05fU0hPUFBJTkc6Imhhc2giLCBIQU5HT1VUX0FDVElPTl9KT0lOVExZOiJoYWpsIiwgSEFOR09VVF9FUlJPUl9ZT1VUVUJFX0xPQUQ6ImhleXRsIiwgSEFOR09VVF9TVUNDRVNTX0FQUF9MT0FEOiJoc2FsIiwgSEFOR09VVF9TVUNDRVNTX0FQUF9VTkxPQUQ6ImhzYXUiLCBIQU5HT1VUX0VSUk9SX0FQUF9MT0FEOiJoZWFsIiwgSEFOR09VVF9FUlJPUl9TSE9QUElOR19MT0FEOiJoZXNoIiwgSEFOR09VVF9FUlJPUl9KT0lOVExZX0xPQUQ6ImhlamwiLCBIQU5HT1VUX1NQRUFLRVJfQ0hBTkdFRDoiaGFzYyIsIEhBTkdPVVRfQUNUSU9OX0dST1VQX0NIQVQ6ImhhZ2MiLCBIQU5HT1VUX0FDVElPTl9JTlZJVEU6ImhhaSIsIEhBTkdPVVRfQkxPQ0tfVVNFUjoiaGJ1IiwgSEFOR09VVF9CUk9BRENBU1RfUFVCTElTSDoiaGJwIiwgCkhBTkdPVVRfQlJPQURDQVNUX1NUQVJUOiJoYnMiLCBIQU5HT1VUX0ZPUkNFX0pPSU46ImhmaiIsIEhBTkdPVVRfUkVNT1RFX0tJQ0s6ImhyayIsIEFQUF9CUklER0VfRVJST1JfVU5JTklUOiJiZXVuIiwgQVBQX0JSSURHRV9FUlJPUl9VTkVYUEVDVEVEOiJiZXdlIiwgQVBQX0JSSURHRV9FUlJPUl9BUFBfTE9BRDoiYmVnbCIsIEFQUF9CUklER0VfRVJST1JfSUZSQU1FX0lEOiJiZWlmIiwgQVBQX0JSSURHRV9FUlJPUl9BUElfTE9BRDoiYmVhcGkiLCBBUFBfQlJJREdFX0VSUk9SX1NFUlZFUjoiYmVzIiwgQVBQX0JSSURHRV9FUlJPUl9JTklUSUFMX0RBVEE6ImJlaWQiLCBBUFBfQlJJREdFX0VSUk9SX0lOSVRJQUxfUEFSVElDSVBBTlRTOiJiZWlwIiwgQVBQX0JSSURHRV9FUlJPUl9SRUFEWToiYmVyIiwgRklMTVNUUklQX1BBUlRJQ0lQQU5UX09SX0ZFRURfTlVMTDoiZnBmbiJ9OwpjaGF0LmNvbW1vbi5VbmV4cGVjdGVkQ29kZVBhdGhzID0ge0REVDoiZCIsIEVGRVJOQU5ERVo6ImUiLCBDT09MTUFOMjoiYyIsIEpFTk5ZUkFFOiJqIiwgVE9CWUo6InQiLCBJTlZBTElEX05PVElGSUNBVElPTjoiaW4iLCBJTlZBTElEX01FU1NBR0U6ImltIiwgRVhJVF9NRUVUSU5HX0VYQ0VQVElPTjoiZW1lIiwgTk9fUFJPRklMRV9VUkw6Im5wdSIsIFJFTU9URV9LSUNLX05VTEw6InJrbiIsIERVUExJQ0FURV9TSE9SVENVVF9UQVJHRVQ6ImRzdCIsIERVUExJQ0FURV9LRVlCT0FSRF9TSE9SVENVVFM6ImRrcyIsIERFTEVHQVRFX09OX0NIQVRfTVNHX0VSUk9SOiJkb2NtZSJ9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbkNoYW5uZWwkKG9wdF9kb21IZWxwZXIsIG9wdF9tZkluZm8sIG9wdF9hc3luY0hhbmRsZVBsdWdpbk1zZykgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5kb21fID0gb3B0X2RvbUhlbHBlciB8fCBnb29nLmRvbS5nZXREb21IZWxwZXIoKTsKICB0aGlzLmluaXRpYWxpemVXYWl0XyA9IDA7CiAgdGhpcy5tZkluZm9fID0gb3B0X21mSW5mbyB8fCB7fTsKICB0aGlzLmNvbm5lY3RTdGF0ZV8gPSBbXTsKICB0aGlzLnJlY29yZGVkRXZlbnRzXyA9IG51bGw7CiAgdGhpcy5hc3luY0hhbmRsZVBsdWdpbk1zZ18gPSBvcHRfYXN5bmNIYW5kbGVQbHVnaW5Nc2cgfHwgITEKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuUkVUUllfSU5JVElBTElaRV9XQUlUX01TID0gMjUwOwp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLk1BWF9JTklUSUFMSVpFX1dBSVRfTVMgPSA4RTM7CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuUExVR0lOX0NPTk5FQ1RJT05fV0FJVF9NUyA9IDFFNDsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5NRVNTQUdFX1BST0NFU1NJTkdfU0xPV19USFJFU0hfTVNfID0gNUUzOwp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLk1FU1NBR0VfTE9OR19XQUlUX1RIUkVTSF9NU18gPSAzRTM7CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuU3RhdGVzID0ge0NSRUFURURPTV9GQUlMRUQ6LTMsIFNFVE9OTUVTU0FHRV9GQUlMRUQ6LTIsIEdPVF9GTFVURURFQUQ6LTEsIFVOSU5JVElBTElaRUQ6MCwgQ1JFQVRFRE9NX1NVQ0NFRURFRDoxLCBTRVRPTk1FU1NBR0VfU1VDQ0VFREVEOjIsIE9OTUVTU0FHRV9DQUxMRUQ6MywgR09UX0ZMVVRFUkVBRFk6NCwgR09UX01GOjV9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnByb3RvdHlwZS5zdGF0ZV8gPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLlN0YXRlcy5VTklOSVRJQUxJWkVEOwp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsIik7CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwucHJvdG90eXBlLnNob3VsZFNlbmRKbWlEYXRhXyA9ICExOwp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnByb3RvdHlwZS5zdGFydGVkTGlzdGVuaW5nXyA9ICExOwp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnByb3RvdHlwZS5tYXhNZXNzYWdlUHJvY2Vzc2luZ1RpbWVfID0gMDsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5JbXByZXNzaW9uRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCRJbXByZXNzaW9uRXZlbnQkKCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuQ09OTkVDVF9JTVBSRVNTSU9OKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuSW1wcmVzc2lvbkV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuQ2FsbEltcHJlc3Npb25FdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5DaGFubmVsJENhbGxJbXByZXNzaW9uRXZlbnQkKGNhbGxJbXByZXNzaW9uKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5DQUxMX0lNUFJFU1NJT04pOwogIHRoaXMuaW1wcmVzc2lvbiA9IGNhbGxJbXByZXNzaW9uCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5DYWxsSW1wcmVzc2lvbkV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuTWVzc2FnZVByb2Nlc3NpbmdUaW1lRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCRNZXNzYWdlUHJvY2Vzc2luZ1RpbWVFdmVudCQodGltZUluTWlsbGlzKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5QUk9DRVNTSU5HX1RJTUUpOwogIHRoaXMucHJvY2Vzc2luZ1RpbWUgPSB0aW1lSW5NaWxsaXMKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5DaGFubmVsJCRpbml0aWFsaXplJChvcHRfcGx1Z2luRG9jdW1lbnQpIHsKICBpZih0aGlzLnN0YXRlXyAhPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLlN0YXRlcy5VTklOSVRJQUxJWkVEKSB7CiAgICByZXR1cm4gdGhpcy5zdGF0ZV8gIT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5TdGF0ZXMuQ1JFQVRFRE9NX0ZBSUxFRAogIH0KICBpZihnb29nLnVzZXJBZ2VudC5JRSkgewogICAgdHJ5IHsKICAgICAgdGhpcy5sb2dnZXJfLmluZm8oIkF0dGVtcHRpbmcgdG8gbG9hZCBHVFAgYWN0aXZlWCBwbHVnaW4iKSwgd2luZG93LmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsIGdvb2cuYmluZCh0aGlzLmRpc3Bvc2VDaGFubmVsXywgdGhpcykpLCB0aGlzLmNoYW5uZWxfID0gbmV3IEFjdGl2ZVhPYmplY3QoIkdvb2dsZVRhbGsuUGx1Z2luIikKICAgIH1jYXRjaChlKSB7CiAgICAgIHRoaXMubG9nZ2VyXy5pbmZvKCJHVFAgYWN0aXZlWCBwbHVnaW4gd2FzIG5vdCBsb2FkZWQiKSwgdGhpcy5jaGFubmVsXyA9IG51bGwKICAgIH0KICB9ZWxzZSB7CiAgICBpZihnb29nLmdsb2JhbC5uYXZpZ2F0b3IpIHsKICAgICAgaWYobmF2aWdhdG9yLnBsdWdpbnMucmVmcmVzaCgpLCB0aGlzLmxvZ2dlcl8uaW5mbygiQXR0ZW1wdGluZyB0byBsb2FkIGd0cCBOcGFwaSBwbHVnaW4iKSwgbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24vZ29vZ2xldGFsayJdKSB7CiAgICAgICAgdGhpcy5wbHVnaW5Eb2N1bWVudF8gPSBvcHRfcGx1Z2luRG9jdW1lbnQgfHwgdGhpcy5kb21fLmdldERvY3VtZW50KCk7CiAgICAgICAgdmFyIHBsdWdpbkRPTSA9IHRoaXMucGx1Z2luRG9jdW1lbnRfLmNyZWF0ZUVsZW1lbnQoImVtYmVkIik7CiAgICAgICAgcGx1Z2luRE9NLmlkID0gInBsdWdpbiI7CiAgICAgICAgcGx1Z2luRE9NLm5hbWUgPSAicGx1Z2luIjsKICAgICAgICBwbHVnaW5ET00ud2lkdGggPSAxOwogICAgICAgIHBsdWdpbkRPTS5oZWlnaHQgPSAxOwogICAgICAgIHBsdWdpbkRPTS50eXBlID0gImFwcGxpY2F0aW9uL2dvb2dsZXRhbGsiOwogICAgICAgIHRoaXMucGx1Z2luRG9jdW1lbnRfLmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChwbHVnaW5ET00pOwogICAgICAgIHRoaXMuY2hhbm5lbF8gPSBwbHVnaW5ET007CiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZU9iamVjdF8gPSB0aGlzLmdldFBvc3RNZXNzYWdlT2JqZWN0XygpOwogICAgICAgIHRoaXMuc2VydmVyT3JpZ2luXyA9IGdvb2cudXJpLnV0aWxzLmdldEhvc3QodGhpcy5wbHVnaW5Eb2N1bWVudF8uVVJMKQogICAgICB9ZWxzZSB7CiAgICAgICAgdGhpcy5sb2dnZXJfLmluZm8oIkdUUCBtaW1lIHR5cGUgbm90IHJlZ2lzdGVyZWQuIiksIHRoaXMuY2hhbm5lbF8gPSBudWxsCiAgICAgIH0KICAgIH1lbHNlIHsKICAgICAgdGhpcy5sb2dnZXJfLndhcm5pbmcoIkdsb2JhbCBuYXZpZ2F0b3Igb2JqZWN0IG5vdCBkZWZpbmVkISIpLCB0aGlzLmNoYW5uZWxfID0gbnVsbAogICAgfQogIH0KICB0aGlzLmNoYW5uZWxfID8gKHRoaXMubG9nZ2VyXy5pbmZvKCJHVFAgcGx1Z2luIGVtYmVkZGVkLCBhc3NpZ25pbmcgY2FsbGJhY2suIiksIHRoaXMuc3RhdGVfID0gdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5TdGF0ZXMuQ1JFQVRFRE9NX1NVQ0NFRURFRCwgdGhpcy5wdXNoQ29ubmVjdFN0YXR1c18oe3N0ZXA6ImRvbSJ9KSwgdGhpcy5jb25uZWN0UmVwb3J0VGltZXJfID0gZ29vZy5UaW1lci5jYWxsT25jZSh0aGlzLnNlbmRDb25uZWN0UmVwb3J0XywgdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5QTFVHSU5fQ09OTkVDVElPTl9XQUlUX01TLCB0aGlzKSwgdGhpcy5maW5pc2hJbml0aWFsaXphdGlvbl8oKSkgOiAodGhpcy5zdGF0ZV8gPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLlN0YXRlcy5DUkVBVEVET01fRkFJTEVELCB0aGlzLmxvZ2dlcl8uaW5mbygiRmFpbGVkIHRvIGluc3RhbnRpYXRlIEdUUCBwbHVnaW4uIikpOwogIHJldHVybiEhdGhpcy5jaGFubmVsXwp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnByb3RvdHlwZS5maW5pc2hJbml0aWFsaXphdGlvbl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCQkZmluaXNoSW5pdGlhbGl6YXRpb25fJCgpIHsKICBpZih0aGlzLnN0YXRlXyA9PSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLlN0YXRlcy5DUkVBVEVET01fU1VDQ0VFREVEKSB7CiAgICBpZih0aGlzLmluaXRpYWxpemVXYWl0XyA8IHRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuTUFYX0lOSVRJQUxJWkVfV0FJVF9NUykgewogICAgICBnb29nLlRpbWVyLmNhbGxPbmNlKHRoaXMuZmluaXNoSW5pdGlhbGl6YXRpb25fLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLlJFVFJZX0lOSVRJQUxJWkVfV0FJVF9NUywgdGhpcyk7CiAgICAgIHRoaXMuaW5pdGlhbGl6ZVdhaXRfICs9IHRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuUkVUUllfSU5JVElBTElaRV9XQUlUX01TOwogICAgICB0cnkgewogICAgICAgIHRoaXMuYXN5bmNIYW5kbGVQbHVnaW5Nc2dfICYmIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMucG9zdE1lc3NhZ2VPYmplY3RfKSA/ICh0aGlzLnN0YXJ0TGlzdGVuaW5nXygpLCB0aGlzLmNoYW5uZWxfLm9ubWVzc2FnZSA9IGdvb2cuYmluZCh0aGlzLmZvcndhcmRQbHVnaW5NZXNzYWdlXywgdGhpcykpIDogdGhpcy5jaGFubmVsXy5vbm1lc3NhZ2UgPSBnb29nLmJpbmQodGhpcy5oYW5kbGVEYWVtb25NZXNzYWdlLCB0aGlzKSwgdGhpcy5zdGF0ZV8gPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLlN0YXRlcy5TRVRPTk1FU1NBR0VfU1VDQ0VFREVELCB0aGlzLnB1c2hDb25uZWN0U3RhdHVzXyh7c3RlcDoiY2FsbGJhY2sifSkKICAgICAgfWNhdGNoKGUpIHsKICAgICAgICB0aGlzLmxvZ2dlcl8uaW5mbygiR1RQIEJQIGluaXRpYWxpemF0aW9uIGZhaWxlZCwgcmV0cnlpbmcgaW4gIiArIHRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuUkVUUllfSU5JVElBTElaRV9XQUlUX01TICsgIiBtcyIsIGUpLCB0aGlzLnB1c2hDb25uZWN0U3RhdHVzXyh7c3RlcDoiY2FsbGJhY2siLCBlcnJvcjplLm5hbWUsIG1zZzplLm1lc3NhZ2V9KQogICAgICB9CiAgICB9ZWxzZSB7CiAgICAgIHRoaXMubG9nZ2VyXy5zZXZlcmUoIkhpdCBtYXggcmV0cmllcyBmb3IgaW5pdGlhbGl6aW5nIFRhbGtQbHVnaW5DaGFubmVsLCBxdWl0dGluZy4iKSwgdGhpcy5zdGF0ZV8gPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLlN0YXRlcy5TRVRPTk1FU1NBR0VfRkFJTEVELCB0aGlzLnB1c2hDb25uZWN0U3RhdHVzXyh7c3RlcDoiY2FsbGJhY2siLCBlcnJvcjoidGltZW91dCJ9KSwgdGhpcy5ub3RpZnlDaGFubmVsRGVhZF8oKQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5wcm90b3R5cGUuZ2V0UG9zdE1lc3NhZ2VPYmplY3RfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbkNoYW5uZWwkJGdldFBvc3RNZXNzYWdlT2JqZWN0XyQoKSB7CiAgcmV0dXJuIGdvb2cudXNlckFnZW50LklFID8gbnVsbCA6IGdvb2cuZG9tLmdldFdpbmRvdyh0aGlzLnBsdWdpbkRvY3VtZW50XykucG9zdE1lc3NhZ2UgPyBnb29nLmRvbS5nZXRXaW5kb3codGhpcy5wbHVnaW5Eb2N1bWVudF8pIDogdGhpcy5wbHVnaW5Eb2N1bWVudF8ucG9zdE1lc3NhZ2UgPyB0aGlzLnBsdWdpbkRvY3VtZW50XyA6IG51bGwKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5wcm90b3R5cGUuc3RhcnRMaXN0ZW5pbmdfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbkNoYW5uZWwkJHN0YXJ0TGlzdGVuaW5nXyQoKSB7CiAgdGhpcy5zdGFydGVkTGlzdGVuaW5nXyB8fCAodGhpcy5wb3N0TWVzc2FnZU9iamVjdF8uYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIGdvb2cuYmluZCh0aGlzLm9uTWVzc2FnZV8sIHRoaXMpLCAhMSksIHRoaXMuc3RhcnRlZExpc3RlbmluZ18gPSAhMCkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5wcm90b3R5cGUuc3RvcExpc3RlbmluZ18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCQkc3RvcExpc3RlbmluZ18kKCkgewogIHRoaXMuc3RhcnRlZExpc3RlbmluZ18gJiYgKHRoaXMucG9zdE1lc3NhZ2VPYmplY3RfLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBnb29nLmJpbmQodGhpcy5vbk1lc3NhZ2VfLCB0aGlzKSwgITEpLCB0aGlzLnN0YXJ0ZWRMaXN0ZW5pbmdfID0gITEpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuQVBJX1ZFUlNJT05fTEFURVNUXyA9IDI7CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwucHJvdG90eXBlLmV4Y2hhbmdlVmVyc2lvbl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCQkZXhjaGFuZ2VWZXJzaW9uXyQoKSB7CiAgZ29vZy5vYmplY3QuZXh0ZW5kKHRoaXMubWZJbmZvXywge2RvbWFpbjpkb2N1bWVudC5kb21haW4sIHVzZXJhZ2VudDpnb29nLnVzZXJBZ2VudC5nZXRVc2VyQWdlbnRTdHJpbmcoKSwgcGx1Z2ludmVyc2lvbjp0aGlzLmNoYW5uZWxfLnZlcnNpb259KTsKICB0aGlzLnNlbmQoZ29vZy5qc29uLnNlcmlhbGl6ZShbIm1mIiwgdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5BUElfVkVSU0lPTl9MQVRFU1RfLCB0aGlzLm1mSW5mb19dKSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5wcm90b3R5cGUuc2V0TWZJbmZvID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbkNoYW5uZWwkJHNldE1mSW5mbyQobWZJbmZvKSB7CiAgdGhpcy5tZkluZm9fID0gbWZJbmZvOwogIHRoaXMuc3RhdGVfID49IHRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuU3RhdGVzLkdPVF9GTFVURVJFQURZICYmIHRoaXMuZXhjaGFuZ2VWZXJzaW9uXygpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCQkc2VuZCQobWVzc2FnZSkgewogIHRoaXMubG9nZ2VyXy5maW5lc3QoIlNlbmRpbmcgR1RQIGRhZW1vbiBtZXNzYWdlOiAiICsgbWVzc2FnZSk7CiAgaWYodGhpcy5zdGF0ZV8gPCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLlN0YXRlcy5PTk1FU1NBR0VfQ0FMTEVEKSB7CiAgICB0aGlzLmxvZ2dlcl8ud2FybmluZygiQ2hhbm5lbCBub3QgcmVhZHkgb3IgYWJsZSB0byBzZW5kIGEgbWVzc2FnZSIpCiAgfWVsc2UgewogICAgdHJ5IHsKICAgICAgdGhpcy5jaGFubmVsXy5zZW5kKG1lc3NhZ2UpCiAgICB9Y2F0Y2goZSkgewogICAgICB0aGlzLmxvZ2dlcl8ud2FybmluZygiRXhjZXB0aW9uIHdoaWxlIHNlbmRpbmcgbWVzc2FnZSAiICsgbWVzc2FnZSArICIgdG8gcGx1Z2luOiAiICsgZSk7CiAgICAgIHJldHVybgogICAgfQogICAgdmFyIGV2ZW50ID0gbmV3IHRhbGsubWVkaWEuQ2FsbEV2ZW50KHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50Lk9VVEdPSU5HX01FU1NBR0UsIG1lc3NhZ2UpOwogICAgdGhpcy5yZWNvcmRFdmVudF8oZXZlbnQpOwogICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KQogIH0KfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5wcm90b3R5cGUuaGFuZGxlRGFlbW9uTWVzc2FnZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5DaGFubmVsJCRoYW5kbGVEYWVtb25NZXNzYWdlJChtZXNzYWdlKSB7CiAgdGhpcy5sb2dnZXJfLmZpbmVzdCgiUmVjZWl2ZWQgR1RQIGRhZW1vbiBtZXNzYWdlOiAiICsgbWVzc2FnZSk7CiAgdGhpcy5zdGF0ZV8gPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5TdGF0ZXMuU0VUT05NRVNTQUdFX1NVQ0NFRURFRCAmJiAodGhpcy5sb2dnZXJfLmluZm8oIkdUUCBCUCBsb2FkIGNvbXBsZXRlLiIpLCB0aGlzLnN0YXRlXyA9IHRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuU3RhdGVzLk9OTUVTU0FHRV9DQUxMRUQpOwogIHZhciBldmVudCA9IG5ldyB0YWxrLm1lZGlhLkNhbGxFdmVudCh0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5NRVNTQUdFLCBtZXNzYWdlKTsKICBpZihldmVudC5tc2dUeXBlID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LkNPTk5FQ1RJTkcpIHsKICAgIHRoaXMuaGFuZGxlQ29ubmVjdFN0YXR1c18oZXZlbnQpCiAgfWVsc2UgewogICAgaWYoZXZlbnQubXNnVHlwZSA9PSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5SRUFEWSkgewogICAgICB0aGlzLmxvZ2dlcl8uaW5mbygiU29ja2V0IHRvIGZsdXRlIGVzdGFibGlzaGVkLiIpLCB0aGlzLnN0YXRlXyA9IHRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuU3RhdGVzLkdPVF9GTFVURVJFQURZLCB0aGlzLnB1c2hDb25uZWN0U3RhdHVzXyh7c3RlcDoicmVhZHkifSksIHRoaXMuZXhjaGFuZ2VWZXJzaW9uXygpCiAgICB9ZWxzZSB7CiAgICAgIGlmKGV2ZW50Lm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuVkVSU0lPTikgewogICAgICAgIHRoaXMubG9nZ2VyXy5pbmZvKCJGbHV0ZSBpcyBvbmxpbmUuIiksIHRoaXMucHVzaENvbm5lY3RTdGF0dXNfKHtvazohMCwgc3RlcDoiZG9uZSJ9KSwgdGhpcy5zdGF0ZV8gPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLlN0YXRlcy5HT1RfTUYKICAgICAgfWVsc2UgewogICAgICAgIGlmKGV2ZW50Lm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuREVBRCkgewogICAgICAgICAgdGhpcy5zdGF0ZV8gPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLlN0YXRlcy5HT1RfRkxVVEVERUFELCB0aGlzLm5vdGlmeUNoYW5uZWxEZWFkXygpCiAgICAgICAgfWVsc2UgewogICAgICAgICAgaWYoIXRoaXMuc2hvdWxkU2VuZEptaURhdGFfICYmICJqbWlkYXRhIiA9PSBldmVudC5tc2dUeXBlKSB7CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgImptaWRhdGEiID09IGV2ZW50Lm1zZ1R5cGUgJiYgKHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5NZXNzYWdlUHJvY2Vzc2luZ1RpbWVFdmVudCh0aGlzLm1heE1lc3NhZ2VQcm9jZXNzaW5nVGltZV8pKSwgdGhpcy5tYXhNZXNzYWdlUHJvY2Vzc2luZ1RpbWVfID0gMCk7CiAgICB2YXIgc3RhcnRUaW1lID0gZ29vZy5ub3coKTsKICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICB2YXIgdGltZUluTWlsbGlzID0gZ29vZy5ub3coKSAtIHN0YXJ0VGltZTsKICAgIHRoaXMubG9nZ2VyXy5maW5lKCJFdmVudDogIiArIGV2ZW50Lm1zZ1R5cGUgKyAiIHByb2Nlc3NlZCBpbiAiICsgdGltZUluTWlsbGlzICsgIiBtaWxsaXNlY29uZHMiKTsKICAgIHRpbWVJbk1pbGxpcyA+IHRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuTUVTU0FHRV9QUk9DRVNTSU5HX1NMT1dfVEhSRVNIX01TXyAmJiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwuQ2FsbEltcHJlc3Npb25FdmVudChjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuUExVR0lOX01FU1NBR0VfUFJPQ0VTU0lOR19USFJFU19FWENFRURFRCkpOwogICAgdGltZUluTWlsbGlzID4gdGhpcy5tYXhNZXNzYWdlUHJvY2Vzc2luZ1RpbWVfICYmICh0aGlzLm1heE1lc3NhZ2VQcm9jZXNzaW5nVGltZV8gPSB0aW1lSW5NaWxsaXMpCiAgfQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnByb3RvdHlwZS5mb3J3YXJkUGx1Z2luTWVzc2FnZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCQkZm9yd2FyZFBsdWdpbk1lc3NhZ2VfJChtZXNzYWdlKSB7CiAgdmFyIG1zZyA9IHttZXNzYWdlOm1lc3NhZ2UsIHRpbWVSZWNlaXZlZDpnb29nLm5vdygpfTsKICB0aGlzLnBvc3RNZXNzYWdlT2JqZWN0Xy5wb3N0TWVzc2FnZShnb29nLmpzb24uc2VyaWFsaXplKG1zZyksIHRoaXMuc2VydmVyT3JpZ2luXykKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5wcm90b3R5cGUub25NZXNzYWdlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5DaGFubmVsJCRvbk1lc3NhZ2VfJChlKSB7CiAgaWYoIXRoaXMuYXN5bmNIYW5kbGVQbHVnaW5Nc2dfIHx8IGUub3JpZ2luICE9IHRoaXMuc2VydmVyT3JpZ2luXyB8fCBlLnNvdXJjZSAhPSBnb29nLmRvbS5nZXRXaW5kb3codGhpcy5wbHVnaW5Eb2N1bWVudF8pKSB7CiAgICB0aGlzLmxvZ2dlcl8ud2FybmluZygiR2V0IGEgbXNnIGluIHRhbGtwbHVnaW5jaGFubmVsIGZyb20gZXh0ZXJuYWwgZG9tYWluOiAiICsgZS5vcmlnaW4gKyAiIG9yIGEgZGlmZmVyZW50IHdpbmRvdzogIiArIGUuZGF0YSkKICB9ZWxzZSB7CiAgICB0cnkgewogICAgICB2YXIgbXNnID0gZ29vZy5qc29uLnBhcnNlKGUuZGF0YSkKICAgIH1jYXRjaChleGNlcHRpb24pIHsKICAgICAgdGhpcy5sb2dnZXJfLndhcm5pbmcoIkV4Y2VwdGlvbiB3aGVuIHBhcnNpbmcgYSBtZXNzYWdlIGZyb20gcGx1Z2luIik7CiAgICAgIHJldHVybgogICAgfQogICAgdmFyIGN1cnJlbnQgPSBnb29nLm5vdygpOwogICAgaWYoMCA+PSBtc2cudGltZVJlY2VpdmVkIHx8IG1zZy50aW1lUmVjZWl2ZWQgPiBjdXJyZW50KSB7CiAgICAgIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJJbnZhbGlkIHRpbWVzdGFtcCEiKQogICAgfWVsc2UgewogICAgICB2YXIgdGltZUluTWlsbGlzID0gY3VycmVudCAtIG1zZy50aW1lUmVjZWl2ZWQ7CiAgICAgIHRoaXMubG9nZ2VyXy5maW5lKCJXYWl0aW5nIHRpbWUgZm9yIGhhbmRsaW5nIHBsdWdpbiBtZXNzYWdlIGlzOiAiICsgdGltZUluTWlsbGlzICsgIiBtaWxsaXNlY29uZHMiKTsKICAgICAgdGhpcy5oYW5kbGVEYWVtb25NZXNzYWdlKG1zZy5tZXNzYWdlKTsKICAgICAgdGltZUluTWlsbGlzID4gdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5NRVNTQUdFX0xPTkdfV0FJVF9USFJFU0hfTVNfICYmIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5DYWxsSW1wcmVzc2lvbkV2ZW50KGNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5QTFVHSU5fTUVTU0FHRV9XQUlUSU5HX1RIUkVTX0VYQ0VFREVEKSkKICAgIH0KICB9Cn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwucHJvdG90eXBlLm5vdGlmeUNoYW5uZWxEZWFkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5DaGFubmVsJCRub3RpZnlDaGFubmVsRGVhZF8kKCkgewogIHZhciBub1ZlcnNpb24gPSBbIm1mIiwgIiIsICIiXTsKICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbEV2ZW50KHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50Lk1FU1NBR0UsIGdvb2cuanNvbi5zZXJpYWxpemUobm9WZXJzaW9uKSkpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwucHJvdG90eXBlLmdldFN0YXR1cyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5DaGFubmVsJCRnZXRTdGF0dXMkKCkgewogIHJldHVybiB0aGlzLnN0YXRlXwp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnByb3RvdHlwZS5nZXRDb25uZWN0U2VxdWVuY2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCQkZ2V0Q29ubmVjdFNlcXVlbmNlJCgpIHsKICByZXR1cm4gdGhpcy5jb25uZWN0U3RhdGVfCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwucHJvdG90eXBlLmRpc3Bvc2VDaGFubmVsXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5DaGFubmVsJCRkaXNwb3NlQ2hhbm5lbF8kKCkgewogIHRoaXMuY2hhbm5lbF8gJiYgKHRoaXMuY2hhbm5lbF8ub25tZXNzYWdlID0gbnVsbCwgIWdvb2cudXNlckFnZW50LklFICYmIGdvb2cuZ2xvYmFsLm5hdmlnYXRvciAmJiBuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi9nb29nbGV0YWxrIl0gJiYgdGhpcy5kb21fLnJlbW92ZU5vZGUodGhpcy5jaGFubmVsXyksIHRoaXMuY2hhbm5lbF8gPSBudWxsKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpOwogIHRoaXMuZGlzcG9zZUNoYW5uZWxfKCk7CiAgdGhpcy5zdG9wTGlzdGVuaW5nXygpOwogIHRoaXMuY29ubmVjdFJlcG9ydFRpbWVyXyAmJiAoZ29vZy5UaW1lci5jbGVhcih0aGlzLmNvbm5lY3RSZXBvcnRUaW1lcl8pLCBkZWxldGUgdGhpcy5jb25uZWN0UmVwb3J0VGltZXJfKTsKICB0aGlzLmNvbm5lY3RTdGF0ZV8gPSBbXTsKICB0aGlzLnNlcnZlck9yaWdpbl8gPSB0aGlzLnBvc3RNZXNzYWdlT2JqZWN0XyA9IHRoaXMuZG9tXyA9IHRoaXMucGx1Z2luRG9jdW1lbnRfID0gbnVsbDsKICB0aGlzLmFzeW5jSGFuZGxlUGx1Z2luTXNnXyA9ICExOwogIHRoaXMubWF4TWVzc2FnZVByb2Nlc3NpbmdUaW1lXyA9IDAKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5wcm90b3R5cGUuaGFuZGxlQ29ubmVjdFN0YXR1c18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCQkaGFuZGxlQ29ubmVjdFN0YXR1c18kKGUpIHsKICB0aGlzLnB1c2hDb25uZWN0U3RhdHVzXyhlLmdldFBhcnNlZE1zZygpLnBvcCgpKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnByb3RvdHlwZS5wdXNoQ29ubmVjdFN0YXR1c18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luQ2hhbm5lbCQkcHVzaENvbm5lY3RTdGF0dXNfJChvKSB7CiAgMTAwID4gdGhpcy5jb25uZWN0U3RhdGVfLmxlbmd0aCAmJiAoby50ID0gIiIgKyBnb29nLm5vdygpLCB0aGlzLmNvbm5lY3RTdGF0ZV8ucHVzaChvKSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbC5wcm90b3R5cGUuc2VuZENvbm5lY3RSZXBvcnRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbkNoYW5uZWwkJHNlbmRDb25uZWN0UmVwb3J0XyQoKSB7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLkltcHJlc3Npb25FdmVudCh0aGlzLmNvbm5lY3RTdGF0ZV8pKTsKICBkZWxldGUgdGhpcy5jb25uZWN0UmVwb3J0VGltZXJfCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwucHJvdG90eXBlLnN0YXJ0UmVjb3JkaW5nID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbkNoYW5uZWwkJHN0YXJ0UmVjb3JkaW5nJCgpIHsKICBnb29nLmFzc2VydHMuYXNzZXJ0KGdvb2cuaXNOdWxsKHRoaXMucmVjb3JkZWRFdmVudHNfKSk7CiAgdGhpcy5yZWNvcmRlZEV2ZW50c18gPSBbXQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5DaGFubmVsLnByb3RvdHlwZS5zdG9wUmVjb3JkaW5nID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbkNoYW5uZWwkJHN0b3BSZWNvcmRpbmckKCkgewogIGdvb2cuYXNzZXJ0cy5hc3NlcnQoIWdvb2cuaXNOdWxsKHRoaXMucmVjb3JkZWRFdmVudHNfKSk7CiAgdmFyIHJlc3VsdCA9IHRoaXMucmVjb3JkZWRFdmVudHNfOwogIHRoaXMucmVjb3JkZWRFdmVudHNfID0gbnVsbDsKICByZXR1cm4gcmVzdWx0Cn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbkNoYW5uZWwucHJvdG90eXBlLnJlY29yZEV2ZW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5DaGFubmVsJCRyZWNvcmRFdmVudF8kKGV2ZW50KSB7CiAgZ29vZy5pc051bGwodGhpcy5yZWNvcmRlZEV2ZW50c18pIHx8IHRoaXMucmVjb3JkZWRFdmVudHNfLnB1c2goZXZlbnQpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kKGJhcmVKaWQsIHJlbmRlcmVyRGV0ZWN0b3IsIG9wdF9tZkluZm8sIG9wdF9leHBlcmltZW50cywgb3B0X2FzeW5jSGFuZGxlUGx1Z2luTXNnKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHRoaXMuYmFyZUppZF8gPSBiYXJlSmlkOwogIHRoaXMucmVuZGVyZXJEZXRlY3Rvcl8gPSByZW5kZXJlckRldGVjdG9yOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5yZW5kZXJlckRldGVjdG9yXywgdGFsay5tZWRpYS5SZW5kZXJlckRldGVjdG9yLkV2ZW50LkNBUEFCSUxJVElFU19DSEFOR0VELCB0aGlzLm9uQ2FwYWJpbGl0aWVzQ2hhbmdlZF8pOwogIHRoaXMubWZJbmZvXyA9IG9wdF9tZkluZm8gfHwge307CiAgZ29vZy5pc0RlZkFuZE5vdE51bGwob3B0X2V4cGVyaW1lbnRzKSAmJiBnb29nLm9iamVjdC5leHRlbmQodGhpcy5tZkluZm9fLCB7ZXhwczpvcHRfZXhwZXJpbWVudHN9KTsKICB0aGlzLmFzeW5jSGFuZGxlUGx1Z2luTXNnXyA9IG9wdF9hc3luY0hhbmRsZVBsdWdpbk1zZyB8fCAhMQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuVGFsa1BsdWdpbiwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwp0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRmx1dGVTdGF0ZSA9IHtQRU5ESU5HOjAsIEFWQUlMQUJMRToxLCBOT1RfQVZBSUxBQkxFOjIsIFJFQ09WRVJJTkc6MywgTk9UX0lOU1RBTExFRDo0fTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLlJFSU5JVElBTElaRV9BTExPV0VEX1NUQVRFUyA9IG5ldyBnb29nLnN0cnVjdHMuU2V0KFt0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRmx1dGVTdGF0ZS5OT1RfSU5TVEFMTEVELCB0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRmx1dGVTdGF0ZS5OT1RfQVZBSUxBQkxFXSk7CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5GbHV0ZVN0YXRlQ2hhbmdlZEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiRGbHV0ZVN0YXRlQ2hhbmdlZEV2ZW50JChuYXRpdmVJZGxlU3RhdGUsIHNlc3Npb25JZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuRkxVVEVTVEFURV9DSEFOR0VEKTsKICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuVGFsa1BsdWdpbi5GbHV0ZVN0YXRlQ2hhbmdlZEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5WSURFT19TRU5EX0NBUEFCSUxJVFkgPSA4Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4uVklERU9fUkVDVl9DQVBBQklMSVRZID0gNDsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLkFVRElPX1NFTkRfQ0FQQUJJTElUWSA9IDI7CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5BVURJT19SRUNWX0NBUEFCSUxJVFkgPSAxOwp0YWxrLm1lZGlhLlRhbGtQbHVnaW4uSlNfVkVSU0lPTiA9IDE7CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5GSVJTVF9SRURfQ09ERUNfVkVSU0lPTl8gPSAiMi4wLjMuMCI7CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5KRUNfMTZYOV9WRVJTSU9OXyA9ICIyLjEuMy4wIjsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLk1FRElBR1JPS19MSVRFX1ZFUlNJT05fID0gIjIuNC4wLjAiOwp0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRklSU1RfRUZGRUNUU19WRVJTSU9OXyA9ICIyLjUuMC4wIjsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLk1VTFRJU1RSRUFNU19WRVJTSU9OXyA9ICIyLjguMC4wIjsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5mbHV0ZVN0YXRlXyA9IHRhbGsubWVkaWEuVGFsa1BsdWdpbi5GbHV0ZVN0YXRlLlBFTkRJTkc7CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5UYWxrUGx1Z2luIik7CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5Db21tYW5kID0ge01JQ19PTjoibWljb24iLCBNSUNfT0ZGOiJtaWNvZmYiLCBQTEFZX1NPVU5EOiJqdG9uZSIsIFBMQVlfRFRNRjoiZHRtZiIsIFJFVkVSVF9ERVZJQ0VfUFJFRlM6InJldmVydGRldmljZXN0YXRlIiwgU0VUX0NBTExfRk9DVVM6InNldGNhbGxmb2N1cyIsIExPU0VfQ0FMTF9GT0NVUzoibG9zZWNhbGxmb2N1cyJ9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRXhwZXJpbWVudCA9IHtNRURJQV9FRkZFQ1RTOiJtZWYiLCBDSEVDS19DT05ORUNUSVZJVFk6ImNjIiwgQ1BVX0FEQVBUQVRJT046ImNwdWFkYXB0YXRpb24iLCBERVNLVE9QX0NBUFRVUkU6ImRlc2t0b3BjYXB0dXJlIiwgUElOR19CUk9XU0VSOiJwaW5nYnJvd3NlciIsIFdFQlJUQ19WSURFTzoid3YiLCBXRUJSVENfVklERU9fTlI6InZuciIsIEtFWUJPQVJEX01VVEU6InRtIn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5Tb3VuZCA9IHtSSU5HOiJyaW5nYmFjayJ9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4uVmVyc2lvbkV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiRWZXJzaW9uRXZlbnQkKGpzb24pIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LlZFUlNJT04pOwogIHRoaXMuanNvbiA9IGpzb24KfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLlRhbGtQbHVnaW4uVmVyc2lvbkV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5FcnJvckV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiRFcnJvckV2ZW50JChlcnJvckRhdGEpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LkVSUk9SKTsKICB0aGlzLmVycm9yRGF0YSA9IGVycm9yRGF0YQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuVGFsa1BsdWdpbi5FcnJvckV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGluaXRpYWxpemUkKG9wdF9wbHVnaW5Eb2N1bWVudCkgewogIHRoaXMucGx1Z2luQ2hhbm5lbF8gPyB0aGlzLmxvZ2dlcl8ud2FybmluZygiaW5pdGlhbGl6ZWQgY2FsbGVkIGFmdGVyIGEgcGx1Z2luIGNoYW5uZWwgaGFzIGFscmVhZHkgYmVlbiBzZXQgdXAiKSA6ICh0aGlzLnBsdWdpbkNoYW5uZWxfID0gdGhpcy5jcmVhdGVQbHVnaW5DaGFubmVsKCksIHRoaXMucGx1Z2luQ2hhbm5lbF8uaW5pdGlhbGl6ZShvcHRfcGx1Z2luRG9jdW1lbnQpID8gKHRoaXMuZmx1dGVTdGF0ZV8gPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRmx1dGVTdGF0ZS5QRU5ESU5HLCB0aGlzLnN0YXJ0Q29ubmVjdGlvblRpbWVyXygpKSA6ICh0aGlzLmRpc3Bvc2VDaGFubmVsXygpLCB0aGlzLmZsdXRlU3RhdGVfID0gdGFsay5tZWRpYS5UYWxrUGx1Z2luLkZsdXRlU3RhdGUuTk9UX0lOU1RBTExFRCwgdGhpcy5maXJlVmVyc2lvbkV2ZW50XygpKSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5kaXNwb3NlQ2hhbm5lbF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRkaXNwb3NlQ2hhbm5lbF8kKCkgewogIHRoaXMucGx1Z2luQ2hhbm5lbF8gJiYgKHRoaXMucGx1Z2luQ2hhbm5lbF8uc2V0UGFyZW50RXZlbnRUYXJnZXQobnVsbCksIHRoaXMucGx1Z2luQ2hhbm5lbF8uZGlzcG9zZSgpLCB0aGlzLnBsdWdpbkNoYW5uZWxfID0gbnVsbCk7CiAgdGhpcy5mbHV0ZVN0YXRlXyA9IHRhbGsubWVkaWEuVGFsa1BsdWdpbi5GbHV0ZVN0YXRlLlBFTkRJTkcKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5zdGFydENvbm5lY3Rpb25UaW1lcl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRzdGFydENvbm5lY3Rpb25UaW1lcl8kKCkgewogIHRoaXMubG9nZ2VyXy5pbmZvKCJTY2hlZHVsaW5nIHBsdWdpbiBjb25uZWN0aW9uIGNoZWNrIik7CiAgZ29vZy5UaW1lci5jYWxsT25jZSh0aGlzLm9uQ29ubmVjdGlvblRpbWVyXywgMTVFMywgdGhpcykKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5vbkNvbm5lY3Rpb25UaW1lcl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRvbkNvbm5lY3Rpb25UaW1lcl8kKCkgewogIHRoaXMucGx1Z2luQ2hhbm5lbF8gJiYgKHRoaXMuZmx1dGVTdGF0ZV8gIT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luLkZsdXRlU3RhdGUuQVZBSUxBQkxFID8gKHRoaXMubG9nZ2VyXy53YXJuaW5nKCJUYWxrUGx1Z2luQ2hhbm5lbCB3YXMgbm90IGFibGUgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBmbHV0ZSBkYWVtb24uIiksIHRoaXMuZmlyZVZlcnNpb25FdmVudF8oKSkgOiB0aGlzLmxvZ2dlcl8uaW5mbygiVGFsa3BsdWdpbiBjb25uZWN0aW9uIGlzIHVwLiIpKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4ucHJvdG90eXBlLmFkZE1mSW5mb01ldGFkYXRhXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGFkZE1mSW5mb01ldGFkYXRhXyQoKSB7CiAgZ29vZy5vYmplY3QuZXh0ZW5kKHRoaXMubWZJbmZvXywge2ppZDp0aGlzLmJhcmVKaWRfLCByZW5kZXJlcjp0aGlzLnJlbmRlcmVyRGV0ZWN0b3JfLmdldENhcGFiaWxpdGllcygpLCB1c2VCcm93c2VySHR0cDp0aGlzLmdldFVzZUJyb3dzZXJIdHRwKCl9KQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4ucHJvdG90eXBlLmNyZWF0ZVBsdWdpbkNoYW5uZWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRjcmVhdGVQbHVnaW5DaGFubmVsJCgpIHsKICB0aGlzLmFkZE1mSW5mb01ldGFkYXRhXygpOwogIHZhciBjbGllbnQzRERldGVjdG9yID0gdGhpcy5yZW5kZXJlckRldGVjdG9yXy5nZXRDbGllbnQzRERldGVjdG9yKCk7CiAgZ29vZy5pc0RlZkFuZE5vdE51bGwoY2xpZW50M0REZXRlY3RvcikgJiYgY2xpZW50M0REZXRlY3Rvci5pc0luc3RhbGxlZCgpICYmIGdvb2cub2JqZWN0LmV4dGVuZCh0aGlzLm1mSW5mb18sIHtvM2RWZXJzaW9uOmNsaWVudDNERGV0ZWN0b3IuZ2V0VmVyc2lvbigpfSk7CiAgdmFyIGNoYW5uZWwgPSBuZXcgdGFsay5tZWRpYS5UYWxrUGx1Z2luQ2hhbm5lbChudWxsLCB0aGlzLm1mSW5mb18sIHRoaXMuYXN5bmNIYW5kbGVQbHVnaW5Nc2dfKTsKICBjaGFubmVsLnNldFBhcmVudEV2ZW50VGFyZ2V0KHRoaXMpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oY2hhbm5lbCwgdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuTUVTU0FHRSwgdGhpcy5oYW5kbGVNZXNzYWdlXyk7CiAgcmV0dXJuIGNoYW5uZWwKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5zZW5kTXNnID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiQkc2VuZE1zZyQobXNnKSB7CiAgdGhpcy5wbHVnaW5DaGFubmVsXyA/IChnb29nLmlzQXJyYXkobXNnKSAmJiAobXNnID0gZ29vZy5qc29uLnNlcmlhbGl6ZShtc2cpKSwgdGhpcy5wbHVnaW5DaGFubmVsXy5zZW5kKG1zZykpIDogdGhpcy5sb2dnZXJfLndhcm5pbmcoIlVuYWJsZSB0byBzZW5kIG1lc3NhZ2UuIENoYW5uZWwgbm90IGluaXRpYWxpemVkLiAiICsgbXNnKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4ucHJvdG90eXBlLmlzQ29ubmVjdGVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiQkaXNDb25uZWN0ZWQkKCkgewogIHJldHVybiB0aGlzLmZsdXRlU3RhdGVfID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbi5GbHV0ZVN0YXRlLkFWQUlMQUJMRQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4ucHJvdG90eXBlLmlzSW5zdGFsbGVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiQkaXNJbnN0YWxsZWQkKCkgewogIHJldHVybiEodGhpcy5mbHV0ZVN0YXRlXyA9PSB0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRmx1dGVTdGF0ZS5OT1RfSU5TVEFMTEVEIHx8IHRoaXMuZmx1dGVTdGF0ZV8gPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luLkZsdXRlU3RhdGUuTk9UX0FWQUlMQUJMRSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5nZXRMb2NhbEppZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGdldExvY2FsSmlkJCgpIHsKICByZXR1cm4gdGhpcy5iYXJlSmlkXwp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4ucHJvdG90eXBlLmhhc0NhbWVyYUluc3RhbGxlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGhhc0NhbWVyYUluc3RhbGxlZCQoKSB7CiAgdmFyIHZlcnNpb25JbmZvID0gdGhpcy5nZXRGbHV0ZVZlcnNpb25JbmZvKCksIHN5c3RlbUluZm87CiAgc3lzdGVtSW5mbyA9IHZlcnNpb25JbmZvID8gdmVyc2lvbkluZm9bNF0gOiB0aGlzLmdlbmVyYXRlU3lzdGVtSW5mbygpOwogIHJldHVybiBzeXN0ZW1JbmZvLmNhcHMgPyAhIShzeXN0ZW1JbmZvLmNhcHMgJiB0YWxrLm1lZGlhLlRhbGtQbHVnaW4uVklERU9fU0VORF9DQVBBQklMSVRZKSA6ICExCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuaGFzQXVkaW9NaWNDYXBhYmlsaXRpZXMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRoYXNBdWRpb01pY0NhcGFiaWxpdGllcyQoKSB7CiAgdmFyIHZlcnNpb25JbmZvID0gdGhpcy5nZXRGbHV0ZVZlcnNpb25JbmZvKCksIHN5c3RlbUluZm87CiAgc3lzdGVtSW5mbyA9IHZlcnNpb25JbmZvID8gdmVyc2lvbkluZm9bNF0gOiB0aGlzLmdlbmVyYXRlU3lzdGVtSW5mbygpOwogIHJldHVybiBzeXN0ZW1JbmZvLmNhcHMgPyAhIShzeXN0ZW1JbmZvLmNhcHMgJiB0YWxrLm1lZGlhLlRhbGtQbHVnaW4uQVVESU9fU0VORF9DQVBBQklMSVRZKSA6ICExCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuaGFzQXVkaW9TcGVha2VyQ2FwYWJpbGl0aWVzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiQkaGFzQXVkaW9TcGVha2VyQ2FwYWJpbGl0aWVzJCgpIHsKICB2YXIgdmVyc2lvbkluZm8gPSB0aGlzLmdldEZsdXRlVmVyc2lvbkluZm8oKSwgc3lzdGVtSW5mbzsKICBzeXN0ZW1JbmZvID0gdmVyc2lvbkluZm8gPyB2ZXJzaW9uSW5mb1s0XSA6IHRoaXMuZ2VuZXJhdGVTeXN0ZW1JbmZvKCk7CiAgcmV0dXJuIHN5c3RlbUluZm8uY2FwcyA/ICEhKHN5c3RlbUluZm8uY2FwcyAmIHRhbGsubWVkaWEuVGFsa1BsdWdpbi5BVURJT19SRUNWX0NBUEFCSUxJVFkpIDogITEKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5nZXRSZW5kZXJDYXBhYmlsaXRpZXMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRnZXRSZW5kZXJDYXBhYmlsaXRpZXMkKG9wdF9tc2cpIHsKICB2YXIgdmVyc2lvbkluZm87CiAgaWYodmVyc2lvbkluZm8gPSB2b2lkIDAgPT0gb3B0X21zZyA/IHRoaXMuZ2V0Rmx1dGVWZXJzaW9uSW5mbygpIDogb3B0X21zZykgewogICAgdmFyIHJlbmRlcmVyID0gdmVyc2lvbkluZm9bNF0ucmVuZGVyZXI7CiAgICBpZihyZW5kZXJlcikgewogICAgICByZXR1cm4gcmVuZGVyZXIKICAgIH0KICB9CiAgcmV0dXJuIDAKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5nZXRWZXJzaW9uXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGdldFZlcnNpb25fJChmZWF0dXJlKSB7CiAgdmFyIHZlcnNpb25JbmZvID0gdGhpcy5nZXRGbHV0ZVZlcnNpb25JbmZvKCk7CiAgaWYodmVyc2lvbkluZm8gJiYgdmVyc2lvbkluZm9bNF1bZmVhdHVyZV0pIHsKICAgIHZhciB2ZXJzaW9uID0gcGFyc2VJbnQodmVyc2lvbkluZm9bNF1bZmVhdHVyZV0sIDEwKTsKICAgIHJldHVybiFpc05hTih2ZXJzaW9uKSAmJiAxIDwgdmVyc2lvbiA/IHZlcnNpb24gOiAxCiAgfQogIHJldHVybiAwCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuY2FuVXNlQ2xpZW50M0QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRjYW5Vc2VDbGllbnQzRCQoKSB7CiAgcmV0dXJuISEodGhpcy5nZXRSZW5kZXJDYXBhYmlsaXRpZXMoKSAmIHRhbGsubWVkaWEuUmVuZGVyZXJEZXRlY3Rvci5SRU5ERVJfQ0xJRU5UM0RfQ0FQQUJJTElUWSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5jYW5Vc2VGbGFzaCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGNhblVzZUZsYXNoJCgpIHsKICByZXR1cm4hISh0aGlzLmdldFJlbmRlckNhcGFiaWxpdGllcygpICYgdGFsay5tZWRpYS5SZW5kZXJlckRldGVjdG9yLlJFTkRFUl9NQUdJQ0NBTV9DQVBBQklMSVRZKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4ucHJvdG90eXBlLmdldFVzZUJyb3dzZXJIdHRwID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiQkZ2V0VXNlQnJvd3Nlckh0dHAkKCkgewogIHJldHVybiEhZ29vZy51c2VyQWdlbnQuTElOVVgKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5vbkNhcGFiaWxpdGllc0NoYW5nZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiQkb25DYXBhYmlsaXRpZXNDaGFuZ2VkXyQoKSB7CiAgdGhpcy5wbHVnaW5DaGFubmVsXyAmJiAodGhpcy5hZGRNZkluZm9NZXRhZGF0YV8oKSwgdGhpcy5wbHVnaW5DaGFubmVsXy5zZXRNZkluZm8odGhpcy5tZkluZm9fKSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5oYW5kbGVNZXNzYWdlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGhhbmRsZU1lc3NhZ2VfJChlKSB7CiAgZS5tc2dUeXBlID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LlZFUlNJT04gPyB0aGlzLmhhbmRsZUZsdXRlVmVyc2lvbk1lc3NhZ2VfKGUuZ2V0UGFyc2VkTXNnKCkpIDogZS5tc2dUeXBlID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LkVSUk9SID8gdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRXJyb3JFdmVudChlLmdldFBhcnNlZE1zZygpKSkgOiAidGVybWFsbCIgPT0gZS5tc2dUeXBlID8gdGhpcy5kaXNwYXRjaEV2ZW50KHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LkVORF9DQUxMKSA6IGUubXNnVHlwZSA9PSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5ERUFEID8gdGhpcy5zdGF0ZUpzb25fID0gdGhpcy52ZXJzaW9uSnNvbl8gPSBudWxsIDogZS5tc2dUeXBlID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LkZMVVRFU1RBVEUgJiYgKHRoaXMuc3RhdGVKc29uXyA9IGUuZ2V0UGFyc2VkTXNnKClbMV0sIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5UYWxrUGx1Z2luLkZsdXRlU3RhdGVDaGFuZ2VkRXZlbnQodGhpcy5nZXROYXRpdmVJZGxlU2lnbmFsXygpLCAKICB0aGlzLmdldE1hY2hpbmVTZXNzaW9uSWRfKCkpKSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5oYW5kbGVGbHV0ZVZlcnNpb25NZXNzYWdlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGhhbmRsZUZsdXRlVmVyc2lvbk1lc3NhZ2VfJChtc2cpIHsKICBpZighbXNnWzFdIHx8IDAgPiBtc2dbMV0uaW5kZXhPZigibmYiKSkgewogICAgdGhpcy52ZXJzaW9uSnNvbl8gPSBtc2csIHRoaXMudmVyc2lvbkpzb25fWzRdIHx8ICh0aGlzLmxvZ2dlcl8ud2FybmluZygnU3lzdGVtIGluZm8gbWlzc2luZyBmcm9tICJtZiIgbXNnOiAnICsgbXNnKSwgdGhpcy52ZXJzaW9uSnNvbl9bNF0gPSB0aGlzLmdlbmVyYXRlU3lzdGVtSW5mbygpKSwgdGhpcy52ZXJzaW9uSnNvbl9bNF0ub3MgPSB0aGlzLmdldE9zTmFtZV8oKSwgdGhpcy52ZXJzaW9uSnNvbl9bNF0uY2xpZW50dmVyID0gdGFsay5tZWRpYS5UYWxrUGx1Z2luLkpTX1ZFUlNJT04sIGdvb2cuaXNEZWYodGhpcy52ZXJzaW9uSnNvbl9bNF0ucmVuZGVyZXIpIHx8ICh0aGlzLnZlcnNpb25Kc29uX1s0XS5yZW5kZXJlciA9IHRhbGsubWVkaWEuUmVuZGVyZXJEZXRlY3Rvci5SRU5ERVJfTUFHSUNDQU1fQ0FQQUJJTElUWSksIHRoaXMudmVyc2lvbkpzb25fWzRdLmJyb3dzZXJSZW5kZXJlciA9IHRoaXMucmVuZGVyZXJEZXRlY3Rvcl8uZ2V0Q2FwYWJpbGl0aWVzKCksIGdvb2cudXNlckFnZW50LmZsYXNoLkhBU19GTEFTSCAmJiAKICAgICh0aGlzLnZlcnNpb25Kc29uX1s0XS5mbGFzaFZlcnNpb24gPSBnb29nLnVzZXJBZ2VudC5mbGFzaC5WRVJTSU9OKSwgZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5yZW5kZXJlckRldGVjdG9yXy5nZXRDbGllbnQzRERldGVjdG9yKCkpICYmICh0aGlzLnZlcnNpb25Kc29uX1s0XS5vM2RWZXJzaW9uID0gdGhpcy5yZW5kZXJlckRldGVjdG9yXy5nZXRDbGllbnQzRERldGVjdG9yKCkuZ2V0VmVyc2lvbigpKQogIH0KICB0aGlzLmZpcmVWZXJzaW9uRXZlbnRfKCkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5maXJlVmVyc2lvbkV2ZW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGZpcmVWZXJzaW9uRXZlbnRfJCgpIHsKICB2YXIgdmVyc2lvbkluZm8gPSB0aGlzLmdldEZsdXRlVmVyc2lvbkluZm8oKTsKICB2ZXJzaW9uSW5mbyAmJiAibmYwIiAhPSB2ZXJzaW9uSW5mb1sxXSA/IHRoaXMuZmx1dGVTdGF0ZV8gPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRmx1dGVTdGF0ZS5BVkFJTEFCTEUgOiB0aGlzLmZsdXRlU3RhdGVfID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbi5GbHV0ZVN0YXRlLkFWQUlMQUJMRSA/IHRoaXMuZmx1dGVTdGF0ZV8gPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRmx1dGVTdGF0ZS5SRUNPVkVSSU5HIDogdGhpcy5mbHV0ZVN0YXRlXyA9PSB0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRmx1dGVTdGF0ZS5QRU5ESU5HICYmICh0aGlzLmZsdXRlU3RhdGVfID0gdGFsay5tZWRpYS5UYWxrUGx1Z2luLkZsdXRlU3RhdGUuTk9UX0FWQUlMQUJMRSk7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLlRhbGtQbHVnaW4uVmVyc2lvbkV2ZW50KHZlcnNpb25JbmZvKSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5nZXRPc05hbWVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiQkZ2V0T3NOYW1lXyQoKSB7CiAgdmFyIG9zID0gIm90aGVyIjsKICBnb29nLnVzZXJBZ2VudC5XSU5ET1dTID8gb3MgPSAid2luZG93cyIgOiBnb29nLnVzZXJBZ2VudC5NQUMgPyBvcyA9IC0xICE9IGdvb2cudXNlckFnZW50LlBMQVRGT1JNLmluZGV4T2YoIkludGVsIikgPyAibWFjIiA6ICJtYWMtcHBjIiA6IDAgPD0gZ29vZy51c2VyQWdlbnQuZ2V0VXNlckFnZW50U3RyaW5nKCkuaW5kZXhPZigiQ3JPUyIpID8gb3MgPSAiY3JvcyIgOiBnb29nLnVzZXJBZ2VudC5MSU5VWCAmJiB0aGlzLnJlbmRlcmVyRGV0ZWN0b3JfLmlzTzNkU3VwcG9ydGVkKCkgJiYgKG9zID0gImxpbnV4Iik7CiAgcmV0dXJuIG9zCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuZ2V0QnJvd3NlclR5cGVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiQkZ2V0QnJvd3NlclR5cGVfJCgpIHsKICB2YXIgYnJvd3NlciA9ICJPdGhlciI7CiAgZ29vZy51c2VyQWdlbnQucHJvZHVjdC5PUEVSQSA/IGJyb3dzZXIgPSAiT3BlcmEiIDogZ29vZy51c2VyQWdlbnQucHJvZHVjdC5JRSA/IGJyb3dzZXIgPSAiSW50ZXJuZXQgRXhwbG9yZXIiIDogZ29vZy51c2VyQWdlbnQucHJvZHVjdC5GSVJFRk9YID8gYnJvd3NlciA9ICJGaXJlZm94IiA6IGdvb2cudXNlckFnZW50LnByb2R1Y3QuQ0FNSU5PID8gYnJvd3NlciA9ICJDYW1pbm8iIDogZ29vZy51c2VyQWdlbnQucHJvZHVjdC5DSFJPTUUgPyBicm93c2VyID0gIkNocm9tZSIgOiBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LlNBRkFSSSAmJiAoYnJvd3NlciA9ICJTYWZhcmkiKTsKICByZXR1cm4gYnJvd3Nlcgp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4ucHJvdG90eXBlLmdldEZsdXRlVmVyc2lvbkluZm8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRnZXRGbHV0ZVZlcnNpb25JbmZvJChvcHRfc2VyaWFsaXplZCkgewogIHZhciB2ZXJzaW9uSW5mbzsKICAhdGhpcy52ZXJzaW9uSnNvbl8gfHwgIiIgPT0gdGhpcy52ZXJzaW9uSnNvbl9bMV0gPyB2ZXJzaW9uSW5mbyA9IFsibWYiLCAibmYwIiwgIjAuMC4wIiwgMSwgdGhpcy5nZW5lcmF0ZVN5c3RlbUluZm8oKV0gOiAodmVyc2lvbkluZm8gPSB0aGlzLnZlcnNpb25Kc29uXy5zbGljZSgpLCB0aGlzLnJlbmRlcmVyRGV0ZWN0b3JfLmdldENhcGFiaWxpdGllcygpICYgdGhpcy5nZXRSZW5kZXJDYXBhYmlsaXRpZXModmVyc2lvbkluZm8pIHx8ICh2ZXJzaW9uSW5mb1sxXSA9ICJuZjAiLCB2ZXJzaW9uSW5mb1syXSA9ICIwLjAuMCIpKTsKICByZXR1cm4gb3B0X3NlcmlhbGl6ZWQgPyBnb29nLmpzb24uc2VyaWFsaXplKHZlcnNpb25JbmZvKSA6IHZlcnNpb25JbmZvCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuZ2V0Rmx1dGVWZXJzaW9uSW5mb1N0ciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGdldEZsdXRlVmVyc2lvbkluZm9TdHIkKCkgewogIHJldHVybiBnb29nLmpzb24uc2VyaWFsaXplKHRoaXMuZ2V0Rmx1dGVWZXJzaW9uSW5mbygpKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4ucHJvdG90eXBlLmdlbmVyYXRlU3lzdGVtSW5mbyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGdlbmVyYXRlU3lzdGVtSW5mbyQoKSB7CiAgdmFyIGNvbm5lY3RTZXF1ZW5jZSA9ICIiOwogIHRoaXMucGx1Z2luQ2hhbm5lbF8gJiYgKGNvbm5lY3RTZXF1ZW5jZSA9IHRoaXMucGx1Z2luQ2hhbm5lbF8uZ2V0Q29ubmVjdFNlcXVlbmNlKCkpOwogIHJldHVybntvczp0aGlzLmdldE9zTmFtZV8oKSwgYnJvd3Nlcjp0aGlzLmdldEJyb3dzZXJUeXBlXygpLCBjbGllbnR2ZXI6dGFsay5tZWRpYS5UYWxrUGx1Z2luLkpTX1ZFUlNJT04sIGNvbm5lY3RzZXF1ZW5jZTpjb25uZWN0U2VxdWVuY2V9Cn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuZ2V0TWFjaGluZUNhbGxUeXBlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiQkZ2V0TWFjaGluZUNhbGxUeXBlJCgpIHsKICBpZighdGhpcy5zdGF0ZUpzb25fKSB7CiAgICByZXR1cm4gdGFsay5tZWRpYS5DYWxsVHlwZS5OT05FCiAgfQogIHN3aXRjaCh0aGlzLnN0YXRlSnNvbl8uY2FsbFR5cGUpIHsKICAgIGNhc2UgInYiOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5DYWxsVHlwZS5WSURFTzsKICAgIGNhc2UgImEiOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5DYWxsVHlwZS5WT0lDRTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiB0YWxrLm1lZGlhLkNhbGxUeXBlLk5PTkUKICB9Cn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuZ2V0TWFjaGluZVNlc3Npb25JZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRnZXRNYWNoaW5lU2Vzc2lvbklkXyQoKSB7CiAgcmV0dXJuIHRoaXMuc3RhdGVKc29uXyA/IHRoaXMuc3RhdGVKc29uXy5jYWxsSWQgOiBudWxsCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuZ2V0TmF0aXZlSWRsZVNpZ25hbF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRnZXROYXRpdmVJZGxlU2lnbmFsXyQoKSB7CiAgaWYoIXRoaXMuc3RhdGVKc29uXykgewogICAgcmV0dXJuIHRhbGsubWVkaWEuSWRsZVNpZ25hbC5OT05FCiAgfQogIHN3aXRjaCh0aGlzLnN0YXRlSnNvbl8ucHIpIHsKICAgIGNhc2UgImkiOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5JZGxlU2lnbmFsLklETEU7CiAgICBjYXNlICJhIjoKICAgICAgcmV0dXJuIHRhbGsubWVkaWEuSWRsZVNpZ25hbC5BQ1RJVkU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gdGFsay5tZWRpYS5JZGxlU2lnbmFsLk5PTkUKICB9Cn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUudGVybWluYXRlQ2FsbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJHRlcm1pbmF0ZUNhbGwkKGppZCwgaWQsIGNhdXNlLCBpc1JlbW90ZSwgb3B0X2RlYnVnSW5mbykgewogIHZhciB0ZXJtaW5hdGVNc2cgPSBbImp0IiwgamlkLCBpZCwgY2F1c2UsIGlzUmVtb3RlXTsKICBvcHRfZGVidWdJbmZvICYmIHRlcm1pbmF0ZU1zZy5wdXNoKG9wdF9kZWJ1Z0luZm8pOwogIHRoaXMuc2VuZE1zZyhnb29nLmpzb24uc2VyaWFsaXplKHRlcm1pbmF0ZU1zZykpOwogIHRoaXMuc2VuZE1zZyhnb29nLmpzb24uc2VyaWFsaXplKFt0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5TVFJFQU1fT0ZGLCBqaWQsIGlkLCAwXSkpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuaGFzTWluaW11bVZlcnNpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRoYXNNaW5pbXVtVmVyc2lvbiQobWluaW11bVZlcnNpb24pIHsKICB2YXIgcGx1Z2luVmVyc2lvbiA9IHRoaXMuZ2V0Rmx1dGVWZXJzaW9uSW5mbygpWzJdOwogIHJldHVybiAwIDw9IGdvb2cuc3RyaW5nLmNvbXBhcmVWZXJzaW9ucyhwbHVnaW5WZXJzaW9uLCBtaW5pbXVtVmVyc2lvbikKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5zdXBwb3J0Rmlyc3RSZWRDb2RlYyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJHN1cHBvcnRGaXJzdFJlZENvZGVjJCgpIHsKICByZXR1cm4gdGhpcy5oYXNNaW5pbXVtVmVyc2lvbih0YWxrLm1lZGlhLlRhbGtQbHVnaW4uRklSU1RfUkVEX0NPREVDX1ZFUlNJT05fKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4ucHJvdG90eXBlLnN1cHBvcnRKZWMxNng5ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbiQkc3VwcG9ydEplYzE2eDkkKCkgewogIHJldHVybiB0aGlzLmhhc01pbmltdW1WZXJzaW9uKHRhbGsubWVkaWEuVGFsa1BsdWdpbi5KRUNfMTZYOV9WRVJTSU9OXykKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luLnByb3RvdHlwZS5zdXBwb3J0TWVkaWFncm9rTGl0ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJHN1cHBvcnRNZWRpYWdyb2tMaXRlJCgpIHsKICByZXR1cm4gdGhpcy5oYXNNaW5pbXVtVmVyc2lvbih0YWxrLm1lZGlhLlRhbGtQbHVnaW4uTUVESUFHUk9LX0xJVEVfVkVSU0lPTl8pCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuc3VwcG9ydE11bHRpU3RyZWFtcyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJHN1cHBvcnRNdWx0aVN0cmVhbXMkKCkgewogIHJldHVybiB0aGlzLmhhc01pbmltdW1WZXJzaW9uKHRhbGsubWVkaWEuVGFsa1BsdWdpbi5NVUxUSVNUUkVBTVNfVkVSU0lPTl8pCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuc3RhcnRSZWNvcmRpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luJCRzdGFydFJlY29yZGluZyQoKSB7CiAgdGhpcy5wbHVnaW5DaGFubmVsXy5zdGFydFJlY29yZGluZygpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbi5wcm90b3R5cGUuc3RvcFJlY29yZGluZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJHN0b3BSZWNvcmRpbmckKCkgewogIHJldHVybiB0aGlzLnBsdWdpbkNoYW5uZWxfLnN0b3BSZWNvcmRpbmcoKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW4ucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW4kJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGFsay5tZWRpYS5UYWxrUGx1Z2luLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5kaXNwb3NlKCk7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbnVsbDsKICB0aGlzLmRpc3Bvc2VDaGFubmVsXygpOwogIHRoaXMubWZJbmZvXyA9IHRoaXMucmVuZGVyZXJEZXRlY3Rvcl8gPSBudWxsCn07CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCgpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuZXZlbnRIYW5kbGVyXyA9IG5ldyBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIodGhpcyk7CiAgdGhpcy52aWRlb0NhcHR1cmVEZXZpY2VzXyA9IFtdOwogIHRoaXMuYXVkaW9JbkRldmljZXNfID0gW107CiAgdGhpcy5hdWRpb091dERldmljZXNfID0gW107CiAgdGhpcy5pc0Nocm9tZU9TXyA9IC9cYmNyb3NcYi9pLnRlc3QoZ29vZy51c2VyQWdlbnQuZ2V0VXNlckFnZW50U3RyaW5nKCkpOwogIHRoaXMubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5EZXZpY2VTdGF0dXMiKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLkFFQ19GTEFHXyA9IDE7CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLkFHQ19GTEFHXyA9IDI7CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLkRFRkFVTFRfREVWSUNFX01BR0lDXyA9ICJfX2RlZmF1bHRfZGV2aWNlIjsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLnZpZGVvQ2FwdHVyZVByZWZfID0gbnVsbDsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmF1ZGlvSW5QcmVmXyA9IG51bGw7CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnByb3RvdHlwZS5hdWRpb091dFByZWZfID0gbnVsbDsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmVjaG9DYW5jZWxsYXRpb25fID0gITE7CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnByb3RvdHlwZS5hdXRvR2FpbkNvbnRyb2xfID0gITE7CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnByb3RvdHlwZS5zZXR0aW5nc0F2YWlsYWJsZV8gPSAhMTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMuVEFMS19QTFVHSU5fVVJMXyA9ICJodHRwOi8vd3d3Lmdvb2dsZS5jb20vY2hhdC92aWRlbyI7CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLkV2ZW50ID0ge1NFVFRJTkdTX0NIQU5HRUQ6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInNjIil9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5EZXZpY2UgPSB7TUlDOiJtaWMiLCBDQU1FUkE6ImNhbWVyYSIsIFNQRUFLRVJTOiJzcGVha2VycyJ9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuZGlzcG9zZSh0aGlzLmV2ZW50SGFuZGxlcl8pOwogIHRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpCn07CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnByb3RvdHlwZS5oYW5kbGVQbHVnaW5NZXNzYWdlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyQkaGFuZGxlUGx1Z2luTWVzc2FnZV8kKGUpIHsKICBpZihlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuVkVSU0lPTikgewogICAgdGhpcy5yZXF1ZXN0RGV2aWNlUHJlZnMoKQogIH1lbHNlIHsKICAgIGlmKGUubXNnVHlwZSA9PSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5GTFVURVNUQVRFKSB7CiAgICAgIHRoaXMubm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2VkXygpCiAgICB9ZWxzZSB7CiAgICAgIGlmKGUubXNnVHlwZSA9PSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5HRVRfREVWSUNFX1BSRUZTKSB7CiAgICAgICAgdGhpcy5sb2dnZXJfLmluZm8oIlJlY2VpdmVkIGRldmljZSBwcmVmcyBtZXNzYWdlLiIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLnNldHRpbmdzQXZhaWxhYmxlXyA9ICExLCB0aGlzLm9uRGV2aWNlUHJlZnNfKGUuZ2V0UGFyc2VkTXNnKCkpCiAgICAgICAgfWNhdGNoKGV4KSB7CiAgICAgICAgICB0aGlzLmxvZ2dlcl8uc2V2ZXJlKGV4KQogICAgICAgIH0KICAgICAgICB0aGlzLm5vdGlmeURldmljZVN0YXRlQ2hhbmdlZF8oKQogICAgICB9CiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUub25EZXZpY2VQcmVmc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSREZXZpY2VTdGF0dXMkJG9uRGV2aWNlUHJlZnNfJChwcmVmcykgewogIHRoaXMudmlkZW9DYXB0dXJlRGV2aWNlc18gPSBwcmVmc1s3XTsKICB0aGlzLmF1ZGlvSW5EZXZpY2VzXyA9IHByZWZzWzNdOwogIHRoaXMuYXVkaW9PdXREZXZpY2VzXyA9IHByZWZzWzVdOwogIHRoaXMubG9jYWxpemVEZWZhdWx0RGV2aWNlVGV4dF8odGhpcy52aWRlb0NhcHR1cmVEZXZpY2VzXyk7CiAgdGhpcy5sb2NhbGl6ZURlZmF1bHREZXZpY2VUZXh0Xyh0aGlzLmF1ZGlvSW5EZXZpY2VzXyk7CiAgdGhpcy5sb2NhbGl6ZURlZmF1bHREZXZpY2VUZXh0Xyh0aGlzLmF1ZGlvT3V0RGV2aWNlc18pOwogIHRoaXMudmlkZW9DYXB0dXJlUHJlZl8gPSB0aGlzLmdldFNlbGVjdGVkRGV2aWNlTmFtZV8odGhpcy52aWRlb0NhcHR1cmVEZXZpY2VzXywgcHJlZnNbNl0pOwogIHRoaXMuYXVkaW9JblByZWZfID0gdGhpcy5nZXRTZWxlY3RlZERldmljZU5hbWVfKHRoaXMuYXVkaW9JbkRldmljZXNfLCBwcmVmc1syXSk7CiAgdGhpcy5hdWRpb091dFByZWZfID0gdGhpcy5nZXRTZWxlY3RlZERldmljZU5hbWVfKHRoaXMuYXVkaW9PdXREZXZpY2VzXywgcHJlZnNbNF0pOwogIHZhciBmbGFncyA9IHByZWZzWzFdOwogIHRoaXMuYXV0b0dhaW5Db250cm9sXyA9ICEhKGZsYWdzICYgdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMuQUdDX0ZMQUdfKTsKICB0aGlzLmVjaG9DYW5jZWxsYXRpb25fID0gISEoZmxhZ3MgJiB0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5BRUNfRkxBR18pOwogIHRoaXMuc2V0dGluZ3NBdmFpbGFibGVfID0gITAKfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmxvY2FsaXplRGVmYXVsdERldmljZVRleHRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRsb2NhbGl6ZURlZmF1bHREZXZpY2VUZXh0XyQoZGV2aWNlTmFtZXMpIHsKICBmb3IodmFyIGkgPSAwO2kgPCBkZXZpY2VOYW1lcy5sZW5ndGg7KytpKSB7CiAgICBpZihkZXZpY2VOYW1lc1tpXSA9PSB0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5ERUZBVUxUX0RFVklDRV9NQUdJQ18pIHsKICAgICAgZGV2aWNlTmFtZXNbaV0gPSAiRGVmYXVsdCBkZXZpY2UiOwogICAgICBicmVhawogICAgfQogIH0KfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmdldFNlbGVjdGVkRGV2aWNlTmFtZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSREZXZpY2VTdGF0dXMkJGdldFNlbGVjdGVkRGV2aWNlTmFtZV8kKGRldmljZU5hbWVzLCBpbmRleCkgewogIHJldHVybiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZGV2aWNlTmFtZXMubGVuZ3RoID8gZGV2aWNlTmFtZXNbaW5kZXhdIDogZGV2aWNlTmFtZXMubGVuZ3RoID8gZGV2aWNlTmFtZXNbMF0gOiBudWxsCn07CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnByb3RvdHlwZS5yZXF1ZXN0RGV2aWNlUHJlZnMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSREZXZpY2VTdGF0dXMkJHJlcXVlc3REZXZpY2VQcmVmcyQoKSB7CiAgdGhpcy50YWxrUGx1Z2luXyAmJiB0aGlzLnRhbGtQbHVnaW5fLnNlbmRNc2coW3RhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LkdFVF9ERVZJQ0VfUFJFRlNdKQp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUuc2V0VGFsa1BsdWdpbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyQkc2V0VGFsa1BsdWdpbiQodGFsa1BsdWdpbikgewogIHRoaXMudGFsa1BsdWdpbl8gJiYgdGhpcy5ldmVudEhhbmRsZXJfLnJlbW92ZUFsbCgpOwogICh0aGlzLnRhbGtQbHVnaW5fID0gdGFsa1BsdWdpbikgJiYgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLnRhbGtQbHVnaW5fLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5NRVNTQUdFLCB0aGlzLmhhbmRsZVBsdWdpbk1lc3NhZ2VfKQp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUubm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyQkbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2VkXyQoKSB7CiAgdGhpcy5wb3B1bGF0ZURldmljZVByb2JsZW1zXygpOwogIHRoaXMubG9nZ2VyXy5pbmZvKCJOb3RpZnlpbmcgdGhhdCBzZXR0aW5ncyBjaGFuZ2VkLiIpOwogIHRoaXMuZGlzcGF0Y2hFdmVudCh0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5FdmVudC5TRVRUSU5HU19DSEFOR0VEKQp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUucG9wdWxhdGVEZXZpY2VQcm9ibGVtc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSREZXZpY2VTdGF0dXMkJHBvcHVsYXRlRGV2aWNlUHJvYmxlbXNfJCgpIHsKICB2YXIgbm90aWNlcyA9IFtdOwogIHRoaXMuZ2V0U2V0dGluZ3NBdmFpbGFibGUoKSAmJiAodGhpcy5oYXNNaWNyb3Bob25lXygpIHx8IG5vdGljZXMucHVzaChuZXcgdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMuTm90aWNlKHRoaXMuZ2V0TWljTWlzc2luZ01zZ18oKSwgdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMuRGV2aWNlLk1JQykpLCB0aGlzLmhhc0NhbWVyYV8oKSB8fCBub3RpY2VzLnB1c2gobmV3IHRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLk5vdGljZSh0aGlzLmdldENhbWVyYU1pc3NpbmdNc2dfKCksIHRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLkRldmljZS5DQU1FUkEpKSwgdGhpcy5oYXNTcGVha2Vyc18oKSB8fCBub3RpY2VzLnB1c2gobmV3IHRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLk5vdGljZSh0aGlzLmdldFNwZWFrZXJzTWlzc2luZ01zZ18oKSwgdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMuRGV2aWNlLlNQRUFLRVJTKSksIHRoaXMuaGFzT3V0ZGF0ZWRQbHVnaW5Qcm9ibGVtKCkgJiYgbm90aWNlcy5wdXNoKG5ldyB0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5Ob3RpY2UodGhpcy5nZXRVcGRhdGVQbHVnaW5Nc2dfKCksIAogIHZvaWQgMCwgdGhpcy5nZXRVcGRhdGVQbHVnaW5UaXRsZV8oKSkpKTsKICB0aGlzLmlzQWxyZWFkeUluQ2FsbF8oKSAmJiBub3RpY2VzLnB1c2gobmV3IHRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLk5vdGljZSh0aGlzLmdldEFscmVhZHlJbkNhbGxNc2dfKCksIHZvaWQgMCwgdGhpcy5nZXRBbHJlYWR5SW5DYWxsVGl0bGVNc2dfKCkpKQp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUuaGFzT3V0ZGF0ZWRQbHVnaW5Qcm9ibGVtID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRoYXNPdXRkYXRlZFBsdWdpblByb2JsZW0kKCkgewogIHJldHVybiB0aGlzLmlzUGx1Z2luT2xkXygpICYmICF0aGlzLmlzQ2hyb21lT1NfCn07CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnByb3RvdHlwZS5nZXRWaWRlb0NhcHR1cmVQcmVmID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRnZXRWaWRlb0NhcHR1cmVQcmVmJCgpIHsKICByZXR1cm4gdGhpcy52aWRlb0NhcHR1cmVQcmVmXwp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUuZ2V0QXVkaW9JblByZWYgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSREZXZpY2VTdGF0dXMkJGdldEF1ZGlvSW5QcmVmJCgpIHsKICByZXR1cm4gdGhpcy5hdWRpb0luUHJlZl8KfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmdldEF1ZGlvT3V0UHJlZiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyQkZ2V0QXVkaW9PdXRQcmVmJCgpIHsKICByZXR1cm4gdGhpcy5hdWRpb091dFByZWZfCn07CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnByb3RvdHlwZS5nZXRBdXRvR2FpbkNvbnRyb2wgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSREZXZpY2VTdGF0dXMkJGdldEF1dG9HYWluQ29udHJvbCQoKSB7CiAgcmV0dXJuIHRoaXMuYXV0b0dhaW5Db250cm9sXwp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUuZ2V0RWNob0NhbmNlbGxhdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyQkZ2V0RWNob0NhbmNlbGxhdGlvbiQoKSB7CiAgcmV0dXJuIHRoaXMuZWNob0NhbmNlbGxhdGlvbl8KfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmdldFNldHRpbmdzQXZhaWxhYmxlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRnZXRTZXR0aW5nc0F2YWlsYWJsZSQoKSB7CiAgcmV0dXJuIHRoaXMuc2V0dGluZ3NBdmFpbGFibGVfCn07CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnByb3RvdHlwZS5nZXREZXZpY2VTZXR0aW5ncyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyQkZ2V0RGV2aWNlU2V0dGluZ3MkKCkgewogIHZhciBzZXR0aW5ncyA9IHthdXRvR2FpbkNvbnRyb2w6dGhpcy5nZXRBdXRvR2FpbkNvbnRyb2woKSwgZWNob0NhbmNlbGxhdGlvbjp0aGlzLmdldEVjaG9DYW5jZWxsYXRpb24oKSwgdmlkZW9DYXB0dXJlUHJlZjp0aGlzLmdldFZpZGVvQ2FwdHVyZVByZWYoKSwgYXVkaW9JblByZWY6dGhpcy5nZXRBdWRpb0luUHJlZigpLCBhdWRpb091dFByZWY6dGhpcy5nZXRBdWRpb091dFByZWYoKX07CiAgcmV0dXJuIHNldHRpbmdzCn07CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRzYXZlJChzZXR0aW5ncywgcGVyc2lzdCkgewogIGlmKHRoaXMudGFsa1BsdWdpbl8pIHsKICAgIHZhciBuZXdTZXR0aW5ncyA9IHRoaXMuZ2V0RGV2aWNlU2V0dGluZ3MoKTsKICAgIGdvb2cub2JqZWN0LmV4dGVuZChuZXdTZXR0aW5ncywgc2V0dGluZ3MpOwogICAgdGhpcy50YWxrUGx1Z2luXy5zZW5kTXNnKHRoaXMubWFrZVNhdmVNc2dfKG5ld1NldHRpbmdzLCBwZXJzaXN0KSk7CiAgICB0aGlzLnJlcXVlc3REZXZpY2VQcmVmcygpCiAgfQp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUubWFrZVNhdmVNc2dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRtYWtlU2F2ZU1zZ18kKHNldHRpbmdzLCBwZXJzaXN0KSB7CiAgdmFyIGF1ZGlvRmxhZ3MgPSBzZXR0aW5ncy5hdXRvR2FpbkNvbnRyb2wgPyB0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5BR0NfRkxBR18gOiAwOwogIHNldHRpbmdzLmVjaG9DYW5jZWxsYXRpb24gJiYgKGF1ZGlvRmxhZ3MgfD0gdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMuQUVDX0ZMQUdfKTsKICB2YXIgYXVkaW9JblNlbGVjdGlvbiA9IGdvb2cuYXJyYXkuaW5kZXhPZih0aGlzLmF1ZGlvSW5EZXZpY2VzXywgc2V0dGluZ3MuYXVkaW9JblByZWYpLCBhdWRpb091dFNlbGVjdGlvbiA9IGdvb2cuYXJyYXkuaW5kZXhPZih0aGlzLmF1ZGlvT3V0RGV2aWNlc18sIHNldHRpbmdzLmF1ZGlvT3V0UHJlZiksIHZpZGVvQ2FwdHVyZVNlbGVjdGlvbiA9IGdvb2cuYXJyYXkuaW5kZXhPZih0aGlzLnZpZGVvQ2FwdHVyZURldmljZXNfLCBzZXR0aW5ncy52aWRlb0NhcHR1cmVQcmVmKTsKICByZXR1cm5bdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuU0VUX0RFVklDRV9QUkVGUywgYXVkaW9GbGFncywgYXVkaW9JblNlbGVjdGlvbiwgYXVkaW9PdXRTZWxlY3Rpb24sIHZpZGVvQ2FwdHVyZVNlbGVjdGlvbiwgcGVyc2lzdF0KfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmlzQWxyZWFkeUluQ2FsbF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSREZXZpY2VTdGF0dXMkJGlzQWxyZWFkeUluQ2FsbF8kKCkgewogIHJldHVybiEhdGhpcy50YWxrUGx1Z2luXyAmJiB0aGlzLnRhbGtQbHVnaW5fLmdldE1hY2hpbmVDYWxsVHlwZSgpICE9IHRhbGsubWVkaWEuQ2FsbFR5cGUuTk9ORQp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUuZ2V0QWxyZWFkeUluQ2FsbFRpdGxlTXNnXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyQkZ2V0QWxyZWFkeUluQ2FsbFRpdGxlTXNnXyQoKSB7CiAgcmV0dXJuIkl0IHNlZW1zIHRoYXQgeW91IGFyZSBhbHJlYWR5IGluIHRoZSB2aWRlbyBjYWxsLiIKfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmdldEFscmVhZHlJbkNhbGxNc2dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRnZXRBbHJlYWR5SW5DYWxsTXNnXyQoKSB7CiAgcmV0dXJuIlBsZWFzZSBjaGVjayBvdGhlciBicm93c2VyIHdpbmRvd3MgYW5kIGhhbmcgdXAgaW4gdGhlcmUuIgp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUuaGFzQ2FtZXJhXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyQkaGFzQ2FtZXJhXyQoKSB7CiAgcmV0dXJuISF0aGlzLnRhbGtQbHVnaW5fICYmIHRoaXMudGFsa1BsdWdpbl8uaGFzQ2FtZXJhSW5zdGFsbGVkKCkKfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmdldENhbWVyYU1pc3NpbmdNc2dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRnZXRDYW1lcmFNaXNzaW5nTXNnXyQoKSB7CiAgcmV0dXJuIllvdSBkb24ndCBoYXZlIGEgY2FtZXJhLiBZb3UgY2FuIHN0aWxsIHVzZSB2b2ljZSBhbmQgdmlkZW8gY2hhdCB3aXRob3V0IGEgY2FtZXJhLiIKfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmhhc01pY3JvcGhvbmVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRoYXNNaWNyb3Bob25lXyQoKSB7CiAgcmV0dXJuIDAgPCB0aGlzLmF1ZGlvSW5EZXZpY2VzXy5sZW5ndGgKfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmdldE1pY01pc3NpbmdNc2dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRnZXRNaWNNaXNzaW5nTXNnXyQoKSB7CiAgcmV0dXJuIllvdSBkb24ndCBoYXZlIGEgbWljcm9waG9uZS4gWW91IG1heSBzdGlsbCB1c2UgdmlkZW8gY2hhdCB3aXRob3V0IHNlbmRpbmcgdm9pY2UuIgp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUuaGFzU3BlYWtlcnNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRGV2aWNlU3RhdHVzJCRoYXNTcGVha2Vyc18kKCkgewogIHJldHVybiAwIDwgdGhpcy5hdWRpb091dERldmljZXNfLmxlbmd0aAp9Owp0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5wcm90b3R5cGUuZ2V0U3BlYWtlcnNNaXNzaW5nTXNnXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyQkZ2V0U3BlYWtlcnNNaXNzaW5nTXNnXyQoKSB7CiAgcmV0dXJuIllvdSBkb24ndCBoYXZlIGFuIGF1ZGlvIG91dHB1dCBkZXZpY2UuIFlvdSBtYXkgc3RpbGwgdXNlIHZpZGVvIGNoYXQgd2l0aG91dCBzb3VuZC4iCn07CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLnByb3RvdHlwZS5pc1BsdWdpbk9sZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSREZXZpY2VTdGF0dXMkJGlzUGx1Z2luT2xkXyQoKSB7CiAgcmV0dXJuISF0aGlzLnRhbGtQbHVnaW5fICYmICIxIiA9PSB0aGlzLnRhbGtQbHVnaW5fLmdldEZsdXRlVmVyc2lvbkluZm8oKVsyXS5jaGFyQXQoMCkKfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmdldFVwZGF0ZVBsdWdpbk1zZ18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSREZXZpY2VTdGF0dXMkJGdldFVwZGF0ZVBsdWdpbk1zZ18kKCkgewogIHJldHVybiJZb3UgYXJlIHVzaW5nIGFuIG91dGRhdGVkIHZlcnNpb24gb2YgR29vZ2xlIFRhbGsgcGx1Z2luLiIKfTsKdGFsay5tZWRpYS5EZXZpY2VTdGF0dXMucHJvdG90eXBlLmdldFVwZGF0ZVBsdWdpblRpdGxlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyQkZ2V0VXBkYXRlUGx1Z2luVGl0bGVfJCgpIHsKICByZXR1cm4iVXBkYXRlIHBsdWdpbi4iCn07CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLk5vdGljZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJERldmljZVN0YXR1cyROb3RpY2UkKG1lc3NhZ2UsIG9wdF9kZXZpY2UsIG9wdF90aXRsZSkgewogIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CiAgdGhpcy5kZXZpY2UgPSBvcHRfZGV2aWNlOwogIHRoaXMudGl0bGUgPSBvcHRfdGl0bGUgfHwgdGhpcy5nZXRUaXRsZUJ5RGV2aWNlXygpCn07CnRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLk5vdGljZS5wcm90b3R5cGUuZ2V0VGl0bGVCeURldmljZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSREZXZpY2VTdGF0dXMkTm90aWNlJCRnZXRUaXRsZUJ5RGV2aWNlXyQoKSB7CiAgcmV0dXJuIHRoaXMuZGV2aWNlID09IHRhbGsubWVkaWEuRGV2aWNlU3RhdHVzLkRldmljZS5NSUMgPyAiTWljcm9waG9uZSIgOiB0aGlzLmRldmljZSA9PSB0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5EZXZpY2UuQ0FNRVJBID8gIkNhbWVyYSIgOiB0aGlzLmRldmljZSA9PSB0YWxrLm1lZGlhLkRldmljZVN0YXR1cy5EZXZpY2UuU1BFQUtFUlMgPyAiU3BlYWtlcnMiIDogIiIKfTsKdGFsay5tZWRpYS5KaW5nbGVNc2dDb252ZXJ0ZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRKaW5nbGVNc2dDb252ZXJ0ZXIkKCkgewogIHRoaXMuY29kZWNzRnJvbUxhc3RKcnRwXyA9IG5ldyBnb29nLnN0cnVjdHMuTWFwCn07CnRhbGsubWVkaWEuSmluZ2xlTXNnQ29udmVydGVyLlNFU1NJT05fSURfSU5ERVggPSAyOwp0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5Kc29uVHlwZXNOZWVkQ29udmVyc2lvbl8gPSB7TE9DQUxfUlRQTUFQOiJqbHJ0cCIsIFJFTU9URV9SVFBNQVA6ImpydHAiLCBWSUVXX1JFUVVFU1Q6Imp2In07CnRhbGsubWVkaWEuSmluZ2xlTXNnQ29udmVydGVyLkpzb25NYXlOZWVkQ29udmVyc2lvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEppbmdsZU1zZ0NvbnZlcnRlciRKc29uTWF5TmVlZENvbnZlcnNpb24kKGpzb24pIHsKICBpZighZ29vZy5pc0RlZkFuZE5vdE51bGwoanNvbikpIHsKICAgIHJldHVybiExCiAgfQogIHZhciB0eXBlU3RhcnRJbmRleCA9IDI7CiAgcmV0dXJuIHR5cGVTdGFydEluZGV4ID09IGpzb24uc2VhcmNoKHRhbGsubWVkaWEuSmluZ2xlTXNnQ29udmVydGVyLkpzb25UeXBlc05lZWRDb252ZXJzaW9uXy5MT0NBTF9SVFBNQVApIHx8IHR5cGVTdGFydEluZGV4ID09IGpzb24uc2VhcmNoKHRhbGsubWVkaWEuSmluZ2xlTXNnQ29udmVydGVyLkpzb25UeXBlc05lZWRDb252ZXJzaW9uXy5SRU1PVEVfUlRQTUFQKSB8fCB0eXBlU3RhcnRJbmRleCA9PSBqc29uLnNlYXJjaCh0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5Kc29uVHlwZXNOZWVkQ29udmVyc2lvbl8uVklFV19SRVFVRVNUKQp9Owp0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5wcm90b3R5cGUuY29udmVydFNlcnZlckpzb25Ub09sZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEppbmdsZU1zZ0NvbnZlcnRlciQkY29udmVydFNlcnZlckpzb25Ub09sZCQoanNvbikgewogIHN3aXRjaChqc29uWzBdKSB7CiAgICBjYXNlIHRhbGsubWVkaWEuSmluZ2xlTXNnQ29udmVydGVyLkpzb25UeXBlc05lZWRDb252ZXJzaW9uXy5MT0NBTF9SVFBNQVA6CiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRKbHJ0cFRvT2xkXyhqc29uKTsKICAgIGNhc2UgdGFsay5tZWRpYS5KaW5nbGVNc2dDb252ZXJ0ZXIuSnNvblR5cGVzTmVlZENvbnZlcnNpb25fLlJFTU9URV9SVFBNQVA6CiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRKcnRwVG9PbGRfKGpzb24pOwogICAgY2FzZSB0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5Kc29uVHlwZXNOZWVkQ29udmVyc2lvbl8uVklFV19SRVFVRVNUOgogICAgICByZXR1cm4gdGhpcy5jb252ZXJ0SnZUb09sZEp1cF8oanNvbik7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm5banNvbl0KICB9Cn07CnRhbGsubWVkaWEuSmluZ2xlTXNnQ29udmVydGVyLnByb3RvdHlwZS5vbkNhbGxFbmQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRKaW5nbGVNc2dDb252ZXJ0ZXIkJG9uQ2FsbEVuZCQoc2Vzc2lvbklkKSB7CiAgdGhpcy5jb2RlY3NGcm9tTGFzdEpydHBfLnJlbW92ZShzZXNzaW9uSWQpCn07CnRhbGsubWVkaWEuSmluZ2xlTXNnQ29udmVydGVyLnByb3RvdHlwZS5jb252ZXJ0SmxydHBUb09sZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRKaW5nbGVNc2dDb252ZXJ0ZXIkJGNvbnZlcnRKbHJ0cFRvT2xkXyQoamxydHApIHsKICByZXR1cm4gNCAhPSBqbHJ0cC5sZW5ndGggPyBbamxydHBdIDogW3RoaXMuY29udmVydFRvT2xkUnRwbWFwXyhqbHJ0cCldCn07CnRhbGsubWVkaWEuSmluZ2xlTXNnQ29udmVydGVyLnByb3RvdHlwZS5jb252ZXJ0SnJ0cFRvT2xkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEppbmdsZU1zZ0NvbnZlcnRlciQkY29udmVydEpydHBUb09sZF8kKGpydHApIHsKICBpZig0ICE9IGpydHAubGVuZ3RoKSB7CiAgICByZXR1cm5banJ0cF0KICB9CiAgdmFyIHNlc3Npb25JZCA9IGpydHBbdGFsay5tZWRpYS5KaW5nbGVNc2dDb252ZXJ0ZXIuU0VTU0lPTl9JRF9JTkRFWF0sIGF1ZGlvID0ganJ0cFszXS5hLCB2aWRlbyA9IGpydHBbM10udiwgY29udmVydGVkID0gW107CiAgaWYodGhpcy53aG9sZURlc2NyaXB0aW9uXyhhdWRpbywgdmlkZW8pKSB7CiAgICB2YXIgcnRwbWFwID0gdGhpcy5jb252ZXJ0VG9PbGRSdHBtYXBfKGpydHApOwogICAgY29udmVydGVkLnB1c2gocnRwbWFwKTsKICAgIHRoaXMuY29kZWNzRnJvbUxhc3RKcnRwXy5zZXQoc2Vzc2lvbklkLCBydHBtYXAuc2xpY2UoMywgNSkpCiAgfWVsc2UgewogICAgaWYodGhpcy5wYXJ0aWFsVXBkYXRlRm9yRmllbGRfKGF1ZGlvLCB2aWRlbywgImNvZGVjcyIpKSB7CiAgICAgIHZhciBqdXAgPSB0aGlzLmNvbnZlcnRUb09sZFJ0cG1hcF8oanJ0cCk7CiAgICAgIGp1cFswXSA9ICJqdXAiOwogICAgICBjb252ZXJ0ZWQucHVzaChqdXApOwogICAgICB0aGlzLmNvZGVjc0Zyb21MYXN0SnJ0cF8uc2V0KHNlc3Npb25JZCwganVwLnNsaWNlKDMsIDUpKQogICAgfQogICAgaWYodGhpcy5wYXJ0aWFsVXBkYXRlRm9yRmllbGRfKGF1ZGlvLCB2aWRlbywgInN0cmVhbXMiKSkgewogICAgICB2YXIganBzID0gdGhpcy5jb252ZXJ0SnJ0cFRvT2xkSnBzKGpydHApLCBjb252ZXJ0ZWQgPSBjb252ZXJ0ZWQuY29uY2F0KGpwcykKICAgIH0KICB9CiAgcmV0dXJuIGNvbnZlcnRlZAp9Owp0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5wcm90b3R5cGUuY29udmVydEp2VG9PbGRKdXBfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkSmluZ2xlTXNnQ29udmVydGVyJCRjb252ZXJ0SnZUb09sZEp1cF8kKGp2KSB7CiAgaWYoNCAhPSBqdi5sZW5ndGgpIHsKICAgIHJldHVybltdCiAgfQogIHZhciBzZXNzaW9uSWQgPSBqdlt0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5TRVNTSU9OX0lEX0lOREVYXSwgbGF0ZXN0Q29kZWNzID0gdGhpcy5jb2RlY3NGcm9tTGFzdEpydHBfLmdldChzZXNzaW9uSWQpOwogIGlmKCFnb29nLmlzRGVmQW5kTm90TnVsbChsYXRlc3RDb2RlY3MpIHx8IDIgIT0gbGF0ZXN0Q29kZWNzLmxlbmd0aCkgewogICAgcmV0dXJuW10KICB9CiAgdmFyIGp1cCA9IFsianVwIl07CiAganVwLnB1c2goanZbMV0pOwogIGp1cC5wdXNoKGp2WzJdKTsKICBqdXAucHVzaChsYXRlc3RDb2RlY3NbMF0pOwogIHZhciBsYXRlc3RWaWRlb0NvZGVjcyA9IGxhdGVzdENvZGVjc1sxXSwgdmlkZW9Db2RlY3MgPSBbXSwgdmlld3MgPSBqdlszXS52OwogIGlmKGdvb2cuaXNEZWZBbmROb3ROdWxsKHZpZXdzKSAmJiAwIDwgdmlld3MubGVuZ3RoKSB7CiAgICBmb3IodmFyIGZpcnN0VmlldyA9IHZpZXdzWzBdLCB3aWR0aCA9IGZpcnN0Vmlldy53aWR0aCwgaGVpZ2h0ID0gZmlyc3RWaWV3LmhlaWdodCwgZnJhbWVyYXRlID0gZmlyc3RWaWV3LmZyYW1lcmF0ZSwgaSA9IDA7aSA8IGxhdGVzdFZpZGVvQ29kZWNzLmxlbmd0aDsrK2kpIHsKICAgICAgdmFyIGNvZGVjID0gbGF0ZXN0VmlkZW9Db2RlY3NbaV07CiAgICAgIHZpZGVvQ29kZWNzLnB1c2goW2NvZGVjWzBdLCBjb2RlY1sxXSwgd2lkdGgsIGhlaWdodCwgZnJhbWVyYXRlXSkKICAgIH0KICB9CiAganVwLnB1c2godmlkZW9Db2RlY3MpOwogIHJldHVybltqdXBdCn07CnRhbGsubWVkaWEuSmluZ2xlTXNnQ29udmVydGVyLnByb3RvdHlwZS5jb252ZXJ0VG9PbGRSdHBtYXBfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkSmluZ2xlTXNnQ29udmVydGVyJCRjb252ZXJ0VG9PbGRSdHBtYXBfJChqcnRwT3JKbHJ0cCkgewogIHZhciBhdWRpbyA9IGpydHBPckpscnRwWzNdLmEsIHZpZGVvID0ganJ0cE9ySmxydHBbM10udiwgcnRwbWFwID0ganJ0cE9ySmxydHAuc2xpY2UoMCwgMyksIGF1ZGlvQ29kZWNzID0gW107CiAgZ29vZy5pc0RlZkFuZE5vdE51bGwoYXVkaW8pICYmIChhdWRpb0NvZGVjcyA9IGF1ZGlvLmNvZGVjcyk7CiAgcnRwbWFwLnB1c2goYXVkaW9Db2RlY3MpOwogIHZhciB2aWRlb0NvZGVjcyA9IFtdOwogIGdvb2cuaXNEZWZBbmROb3ROdWxsKHZpZGVvKSAmJiAodmlkZW9Db2RlY3MgPSB2aWRlby5jb2RlY3MpOwogIHJ0cG1hcC5wdXNoKHZpZGVvQ29kZWNzKTsKICB2YXIgYXVkaW9NZXRhSW5mbyA9IHt9OwogIGdvb2cuaXNEZWZBbmROb3ROdWxsKGF1ZGlvKSAmJiAoYXVkaW9NZXRhSW5mbyA9IHRoaXMuZ2V0UnRwTWFwTWV0YUluZm9fKGF1ZGlvKSk7CiAgcnRwbWFwLnB1c2goYXVkaW9NZXRhSW5mbyk7CiAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwodmlkZW8pKSB7CiAgICB2YXIgdmlkZW9NZXRhSW5mbyA9IHRoaXMuZ2V0UnRwTWFwTWV0YUluZm9fKHZpZGVvKTsKICAgIHJ0cG1hcC5wdXNoKHZpZGVvTWV0YUluZm8pCiAgfQogIHJldHVybiBydHBtYXAKfTsKdGFsay5tZWRpYS5KaW5nbGVNc2dDb252ZXJ0ZXIucHJvdG90eXBlLmNvbnZlcnRKcnRwVG9PbGRKcHMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRKaW5nbGVNc2dDb252ZXJ0ZXIkJGNvbnZlcnRKcnRwVG9PbGRKcHMkKGpydHApIHsKICBpZig0ICE9IGpydHAubGVuZ3RoIHx8ICJqcnRwIiAhPSBqcnRwWzBdKSB7CiAgICByZXR1cm5bXQogIH0KICB2YXIgYXVkaW8gPSBqcnRwWzNdLmEsIHZpZGVvID0ganJ0cFszXS52LCBuaWNrU2V0ID0gbmV3IGdvb2cuc3RydWN0cy5TZXQsIG5pY2tBdWRpb1NzcmNNYXAgPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcDsKICBnb29nLmlzRGVmQW5kTm90TnVsbChhdWRpbykgJiYgZ29vZy5pc0RlZkFuZE5vdE51bGwoYXVkaW8uc3RyZWFtcykgJiYgdGhpcy5nZXROaWNrc0FuZFNzcmNzXyhhdWRpby5zdHJlYW1zLCBuaWNrU2V0LCBuaWNrQXVkaW9Tc3JjTWFwKTsKICB2YXIgbmlja1ZpZGVvU3NyY01hcCA9IG5ldyBnb29nLnN0cnVjdHMuTWFwOwogIGdvb2cuaXNEZWZBbmROb3ROdWxsKHZpZGVvKSAmJiBnb29nLmlzRGVmQW5kTm90TnVsbCh2aWRlby5zdHJlYW1zKSAmJiB0aGlzLmdldE5pY2tzQW5kU3NyY3NfKHZpZGVvLnN0cmVhbXMsIG5pY2tTZXQsIG5pY2tWaWRlb1NzcmNNYXApOwogIGZvcih2YXIganBzID0gW10sIG5pY2tBcnJheSA9IG5pY2tTZXQuZ2V0VmFsdWVzKCksIGkgPSAwO2kgPCBuaWNrQXJyYXkubGVuZ3RoOysraSkgewogICAgdmFyIG5pY2sgPSBuaWNrQXJyYXlbaV0sIGpwID0ganJ0cC5zbGljZSgwLCAzKS5jb25jYXQoW25pY2ssIFtdXSk7CiAgICBqcFswXSA9ICJqcCI7CiAgICB2YXIgc3RyZWFtcyA9IGpwWzRdLCBhdWRpb1NzcmMgPSBuaWNrQXVkaW9Tc3JjTWFwLmdldChuaWNrKTsKICAgIGlmKGdvb2cuaXNEZWZBbmROb3ROdWxsKGF1ZGlvU3NyYykpIHsKICAgICAgdmFyIHN0cmVhbSA9IHt0eXBlOiJhIn07CiAgICAgIHN0cmVhbS5zID0gYXVkaW9Tc3JjLnRvU3RyaW5nKCk7CiAgICAgIHN0cmVhbXMucHVzaChzdHJlYW0pCiAgICB9CiAgICB2YXIgdmlkZW9Tc3JjID0gbmlja1ZpZGVvU3NyY01hcC5nZXQobmljayk7CiAgICBnb29nLmlzRGVmQW5kTm90TnVsbCh2aWRlb1NzcmMpICYmIChzdHJlYW0gPSB7dHlwZToidiJ9LCBzdHJlYW0ucyA9IHZpZGVvU3NyYy50b1N0cmluZygpLCBzdHJlYW1zLnB1c2goc3RyZWFtKSk7CiAgICBqcHMucHVzaChqcCkKICB9CiAgcmV0dXJuIGpwcwp9Owp0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5wcm90b3R5cGUuZ2V0UnRwTWFwTWV0YUluZm9fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkSmluZ2xlTXNnQ29udmVydGVyJCRnZXRSdHBNYXBNZXRhSW5mb18kKGRlc2NyaXB0aW9uKSB7CiAgdmFyIHJ0cE1ldGFJbmZvID0ge307CiAgZ29vZy5pc0RlZkFuZE5vdE51bGwoZGVzY3JpcHRpb24ucnRjcF9tdXgpICYmIChydHBNZXRhSW5mby5ydGNwX211eCA9IGRlc2NyaXB0aW9uLnJ0Y3BfbXV4KTsKICBnb29nLmlzRGVmQW5kTm90TnVsbChkZXNjcmlwdGlvbi5jcnlwdG8pICYmIChydHBNZXRhSW5mby5jcnlwdG8gPSBkZXNjcmlwdGlvbi5jcnlwdG8pOwogIGdvb2cuaXNEZWZBbmROb3ROdWxsKGRlc2NyaXB0aW9uLnN0cmVhbXMpICYmIDAgPCBkZXNjcmlwdGlvbi5zdHJlYW1zLmxlbmd0aCAmJiBnb29nLmlzRGVmQW5kTm90TnVsbChkZXNjcmlwdGlvbi5zdHJlYW1zWzBdLnNzcmNzKSAmJiAwIDwgZGVzY3JpcHRpb24uc3RyZWFtc1swXS5zc3Jjcy5sZW5ndGggJiYgKHJ0cE1ldGFJbmZvLnMgPSBkZXNjcmlwdGlvbi5zdHJlYW1zWzBdLnNzcmNzWzBdLnRvU3RyaW5nKCkpOwogIHJldHVybiBydHBNZXRhSW5mbwp9Owp0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5wcm90b3R5cGUuZ2V0Tmlja3NBbmRTc3Jjc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRKaW5nbGVNc2dDb252ZXJ0ZXIkJGdldE5pY2tzQW5kU3NyY3NfJChzdHJlYW1zLCBuaWNrU2V0LCBuaWNrU3NyY01hcCkgewogIGZvcih2YXIgaSA9IDA7aSA8IHN0cmVhbXMubGVuZ3RoOysraSkgewogICAgdmFyIG5pY2sgPSBzdHJlYW1zW2ldLm5pY2s7CiAgICBnb29nLmlzRGVmQW5kTm90TnVsbChuaWNrKSAmJiAobmlja1NldC5hZGQobmljayksIGdvb2cuaXNEZWZBbmROb3ROdWxsKHN0cmVhbXNbaV0uc3NyY3MpICYmIDAgPCBzdHJlYW1zW2ldLnNzcmNzLmxlbmd0aCAmJiBuaWNrU3NyY01hcC5zZXQobmljaywgc3RyZWFtc1tpXS5zc3Jjc1swXSkpCiAgfQp9Owp0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5wcm90b3R5cGUud2hvbGVEZXNjcmlwdGlvbl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRKaW5nbGVNc2dDb252ZXJ0ZXIkJHdob2xlRGVzY3JpcHRpb25fJChhdWRpbywgdmlkZW8pIHsKICB2YXIgYXVkaW9XaG9sZSA9IGdvb2cuaXNEZWZBbmROb3ROdWxsKGF1ZGlvKSAmJiAhYXVkaW8ucGFydGlhbCwgdmlkZW9XaG9sZSA9IGdvb2cuaXNEZWZBbmROb3ROdWxsKHZpZGVvKSAmJiAhdmlkZW8ucGFydGlhbDsKICByZXR1cm4gYXVkaW9XaG9sZSAmJiAoIWdvb2cuaXNEZWZBbmROb3ROdWxsKHZpZGVvKSB8fCB2aWRlb1dob2xlKQp9Owp0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5wcm90b3R5cGUucGFydGlhbFVwZGF0ZUZvckZpZWxkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEppbmdsZU1zZ0NvbnZlcnRlciQkcGFydGlhbFVwZGF0ZUZvckZpZWxkXyQoYXVkaW8sIHZpZGVvLCBmaWVsZCkgewogIHZhciBhdWRpb1BhcnRpYWxVcGRhdGUgPSBnb29nLmlzRGVmQW5kTm90TnVsbChhdWRpbykgJiYgISFhdWRpby5wYXJ0aWFsICYmIGdvb2cuaXNEZWZBbmROb3ROdWxsKGF1ZGlvW2ZpZWxkXSksIHZpZGVvUGFydGlhbFVwZGF0ZSA9IGdvb2cuaXNEZWZBbmROb3ROdWxsKHZpZGVvKSAmJiAhIXZpZGVvLnBhcnRpYWwgJiYgZ29vZy5pc0RlZkFuZE5vdE51bGwodmlkZW9bZmllbGRdKTsKICByZXR1cm4gYXVkaW9QYXJ0aWFsVXBkYXRlIHx8IHZpZGVvUGFydGlhbFVwZGF0ZQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mbyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyQobXNnKSB7CiAgaWYoNiA+PSBtc2cubGVuZ3RoIHx8ICJ1bmRlZmluZWQiID09IHR5cGVvZiBtc2dbNl0udikgewogICAgbXNnID0gdGhpcy5jb252ZXJ0VG9KbWlkYXRhMl8obXNnKQogIH0KICB0aGlzLmppZCA9IG1zZ1t0YWxrLm1lZGlhLk1lZGlhSW5mby5Db250ZW50SW5kZXguSklEXTsKICB0aGlzLnNlc3Npb25JZCA9IG1zZ1t0YWxrLm1lZGlhLk1lZGlhSW5mby5Db250ZW50SW5kZXguSURdOwogIHRoaXMuZWxhcHNlZFRpbWUgPSBtc2dbdGFsay5tZWRpYS5NZWRpYUluZm8uQ29udGVudEluZGV4LlRJTUVdOwogIHRoaXMuYXVkaW9SZWNlaXZlckluZm9zID0gW107CiAgdGhpcy5hdWRpb1NlbmRlckluZm9zID0gW107CiAgZm9yKHZhciBpID0gMDtpIDwgbXNnW3RhbGsubWVkaWEuTWVkaWFJbmZvLkNvbnRlbnRJbmRleC5JTkZPU11bMF0ubGVuZ3RoO2krKykgewogICAgdmFyIGF1ZGlvID0gbXNnW3RhbGsubWVkaWEuTWVkaWFJbmZvLkNvbnRlbnRJbmRleC5JTkZPU11bMF1baV07CiAgICBhdWRpb1t0YWxrLm1lZGlhLk1lZGlhSW5mby5OYW1lLlRZUEVdID09IHRhbGsubWVkaWEuTWVkaWFJbmZvLlR5cGUuUkVDRUlWRSA/IHRoaXMuYXVkaW9SZWNlaXZlckluZm9zLnB1c2gobmV3IHRhbGsubWVkaWEuTWVkaWFJbmZvLkF1ZGlvUmVjZWl2ZXIoYXVkaW8pKSA6IGF1ZGlvW3RhbGsubWVkaWEuTWVkaWFJbmZvLk5hbWUuVFlQRV0gPT0gdGFsay5tZWRpYS5NZWRpYUluZm8uVHlwZS5TRU5EICYmIHRoaXMuYXVkaW9TZW5kZXJJbmZvcy5wdXNoKG5ldyB0YWxrLm1lZGlhLk1lZGlhSW5mby5BdWRpb1NlbmRlcihhdWRpbykpCiAgfQogIHRoaXMudmlkZW9SZWNlaXZlckluZm9zID0gW107CiAgdGhpcy52aWRlb1NlbmRlckluZm9zID0gW107CiAgaWYobXNnW3RhbGsubWVkaWEuTWVkaWFJbmZvLkNvbnRlbnRJbmRleC5JTkZPU11bMV0pIHsKICAgIGZvcihpID0gMDtpIDwgbXNnW3RhbGsubWVkaWEuTWVkaWFJbmZvLkNvbnRlbnRJbmRleC5JTkZPU11bMV0ubGVuZ3RoO2krKykgewogICAgICB2YXIgdmlkZW8gPSBtc2dbdGFsay5tZWRpYS5NZWRpYUluZm8uQ29udGVudEluZGV4LklORk9TXVsxXVtpXTsKICAgICAgdmlkZW9bdGFsay5tZWRpYS5NZWRpYUluZm8uTmFtZS5UWVBFXSA9PSB0YWxrLm1lZGlhLk1lZGlhSW5mby5UeXBlLlJFQ0VJVkUgPyB0aGlzLnZpZGVvUmVjZWl2ZXJJbmZvcy5wdXNoKG5ldyB0YWxrLm1lZGlhLk1lZGlhSW5mby5WaWRlb1JlY2VpdmVyKHZpZGVvKSkgOiB2aWRlb1t0YWxrLm1lZGlhLk1lZGlhSW5mby5OYW1lLlRZUEVdID09IHRhbGsubWVkaWEuTWVkaWFJbmZvLlR5cGUuU0VORCAmJiB0aGlzLnZpZGVvU2VuZGVySW5mb3MucHVzaChuZXcgdGFsay5tZWRpYS5NZWRpYUluZm8uVmlkZW9TZW5kZXIodmlkZW8pKQogICAgfQogIH0KICB0aGlzLmF1ZGlvQ29ubmVjdGlvbkluZm9zID0gW107CiAgaWYobXNnW3RhbGsubWVkaWEuTWVkaWFJbmZvLkNvbnRlbnRJbmRleC5DT05OXVswXSkgewogICAgZm9yKGkgPSAwO2kgPCBtc2dbdGFsay5tZWRpYS5NZWRpYUluZm8uQ29udGVudEluZGV4LkNPTk5dWzBdLmxlbmd0aDtpKyspIHsKICAgICAgdGhpcy5hdWRpb0Nvbm5lY3Rpb25JbmZvcy5wdXNoKG5ldyB0YWxrLm1lZGlhLk1lZGlhSW5mby5Db25uZWN0aW9uKG1zZ1t0YWxrLm1lZGlhLk1lZGlhSW5mby5Db250ZW50SW5kZXguQ09OTl1bMF1baV0sICJhdWRpbyIpKQogICAgfQogIH0KICB0aGlzLnZpZGVvQ29ubmVjdGlvbkluZm9zID0gW107CiAgaWYobXNnW3RhbGsubWVkaWEuTWVkaWFJbmZvLkNvbnRlbnRJbmRleC5DT05OXVsxXSkgewogICAgZm9yKGkgPSAwO2kgPCBtc2dbdGFsay5tZWRpYS5NZWRpYUluZm8uQ29udGVudEluZGV4LkNPTk5dWzFdLmxlbmd0aDtpKyspIHsKICAgICAgdGhpcy52aWRlb0Nvbm5lY3Rpb25JbmZvcy5wdXNoKG5ldyB0YWxrLm1lZGlhLk1lZGlhSW5mby5Db25uZWN0aW9uKG1zZ1t0YWxrLm1lZGlhLk1lZGlhSW5mby5Db250ZW50SW5kZXguQ09OTl1bMV1baV0sICJ2aWRlbyIpKQogICAgfQogIH0KICB0aGlzLmdsb2JhbEluZm8gPSBuZXcgdGFsay5tZWRpYS5NZWRpYUluZm8uR2xvYmFsKG1zZ1t0YWxrLm1lZGlhLk1lZGlhSW5mby5Db250ZW50SW5kZXguR0xPQkFMXSk7CiAgdGhpcy5wYXJ0aWNpcGFudHMgPSBbXTsKICBpZihnb29nLmlzRGVmQW5kTm90TnVsbChtc2dbdGFsay5tZWRpYS5NZWRpYUluZm8uQ29udGVudEluZGV4LlBBUlRJQ0lQQU5UU10pKSB7CiAgICBmb3IoaSA9IDA7aSA8IG1zZ1t0YWxrLm1lZGlhLk1lZGlhSW5mby5Db250ZW50SW5kZXguUEFSVElDSVBBTlRTXS5sZW5ndGg7aSsrKSB7CiAgICAgIHRoaXMucGFydGljaXBhbnRzLnB1c2gobmV3IHRhbGsubWVkaWEuTWVkaWFJbmZvLlBhcnRpY2lwYW50TG9nKG1zZ1t0YWxrLm1lZGlhLk1lZGlhSW5mby5Db250ZW50SW5kZXguUEFSVElDSVBBTlRTXSkpCiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5FdmVudHMgPSB7TUVESUFfSU5GTzoibWkifTsKdGFsay5tZWRpYS5NZWRpYUluZm8uTWVkaWFJbmZvRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kTWVkaWFJbmZvRXZlbnQkKG1lZGlhSW5mbykgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5NZWRpYUluZm8uRXZlbnRzLk1FRElBX0lORk8pOwogIHRoaXMubWVkaWFJbmZvID0gbWVkaWFJbmZvCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5NZWRpYUluZm8uTWVkaWFJbmZvRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5NZWRpYUluZm8uQ29udGVudEluZGV4ID0ge1RZUEU6MCwgSklEOjEsIElEOjIsIFRJTUU6MywgSU5GT1M6NCwgQ09OTjo1LCBHTE9CQUw6NiwgUEFSVElDSVBBTlRTOjd9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5UeXBlID0ge1JFQ0VJVkU6InIiLCBTRU5EOiJzIn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLk5hbWUgPSB7VFlQRToidCJ9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5wcm90b3R5cGUudG9Kc29uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJCR0b0pzb24kKCkgewogIGZvcih2YXIgYXVkaW9JbmZvcyA9IFtdLCBpID0gMDtpIDwgdGhpcy5hdWRpb1JlY2VpdmVySW5mb3MubGVuZ3RoO2krKykgewogICAgYXVkaW9JbmZvcy5wdXNoKHRoaXMuYXVkaW9SZWNlaXZlckluZm9zW2ldLnRvSnNvbigpKQogIH0KICBmb3IoaSA9IDA7aSA8IHRoaXMuYXVkaW9TZW5kZXJJbmZvcy5sZW5ndGg7aSsrKSB7CiAgICBhdWRpb0luZm9zLnB1c2godGhpcy5hdWRpb1NlbmRlckluZm9zW2ldLnRvSnNvbigpKQogIH0KICBmb3IodmFyIHZpZGVvSW5mb3MgPSBbXSwgaSA9IDA7aSA8IHRoaXMudmlkZW9SZWNlaXZlckluZm9zLmxlbmd0aDtpKyspIHsKICAgIHZpZGVvSW5mb3MucHVzaCh0aGlzLnZpZGVvUmVjZWl2ZXJJbmZvc1tpXS50b0pzb24oKSkKICB9CiAgZm9yKGkgPSAwO2kgPCB0aGlzLnZpZGVvU2VuZGVySW5mb3MubGVuZ3RoO2krKykgewogICAgdmlkZW9JbmZvcy5wdXNoKHRoaXMudmlkZW9TZW5kZXJJbmZvc1tpXS50b0pzb24oKSkKICB9CiAgZm9yKHZhciBhdWRpb1ZpZGVvSW5mb3MgPSBbYXVkaW9JbmZvcywgdmlkZW9JbmZvc10sIGF1ZGlvQ29ubmVjdGlvbkluZm9zID0gW10sIGkgPSAwO2kgPCB0aGlzLmF1ZGlvQ29ubmVjdGlvbkluZm9zLmxlbmd0aDtpKyspIHsKICAgIGF1ZGlvQ29ubmVjdGlvbkluZm9zLnB1c2godGhpcy5hdWRpb0Nvbm5lY3Rpb25JbmZvc1tpXS50b0pzb24oKSkKICB9CiAgZm9yKHZhciB2aWRlb0Nvbm5lY3Rpb25JbmZvcyA9IFtdLCBpID0gMDtpIDwgdGhpcy52aWRlb0Nvbm5lY3Rpb25JbmZvcy5sZW5ndGg7aSsrKSB7CiAgICB2aWRlb0Nvbm5lY3Rpb25JbmZvcy5wdXNoKHRoaXMudmlkZW9Db25uZWN0aW9uSW5mb3NbaV0udG9Kc29uKCkpCiAgfQogIGZvcih2YXIgYXVkaW9WaWRlb0Nvbm5lY3Rpb25JbmZvcyA9IFthdWRpb0Nvbm5lY3Rpb25JbmZvcywgdmlkZW9Db25uZWN0aW9uSW5mb3NdLCBnbG9iYWxJbmZvID0gdGhpcy5nbG9iYWxJbmZvLnRvSnNvbigpLCBwYXJ0aWNpcGFudHMgPSBbXSwgaSA9IDA7aSA8IHRoaXMucGFydGljaXBhbnRzLmxlbmd0aDtpKyspIHsKICAgIHBhcnRpY2lwYW50cy5wdXNoKHRoaXMucGFydGljaXBhbnRzW2ldLnRvSnNvbigpKQogIH0KICB2YXIgbXNnID0gWyJqbWlkYXRhIiwgdGhpcy5qaWQsIHRoaXMuc2Vzc2lvbklkLCB0aGlzLmVsYXBzZWRUaW1lLCBhdWRpb1ZpZGVvSW5mb3MsIGF1ZGlvVmlkZW9Db25uZWN0aW9uSW5mb3MsIGdsb2JhbEluZm8sIHBhcnRpY2lwYW50c107CiAgcmV0dXJuIG1zZwp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5wcm90b3R5cGUuY29udmVydFRvSm1pZGF0YTJfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJCRjb252ZXJ0VG9KbWlkYXRhMl8kKG1zZykgewogIHZhciBtc2cyID0gbXNnLnNsaWNlKDAsIDQpOwogIG1zZzJbNF0gPSBbXTsKICBtc2cyWzVdID0gW107CiAgdmFyIGF1ZGlvID0gbXNnWzRdWzBdLCBhdWRpb1JlY2VpdmVyID0ge3Q6InIiLCBzOi0xLCBiOmF1ZGlvWzddLCBwOmF1ZGlvWzhdLCBmbDphdWRpb1swXSwgcGw6YXVkaW9bMV0sIHNuOmF1ZGlvWzJdLCBqOmF1ZGlvWzNdfSwgYXVkaW9TZW5kZXIgPSB7dDoicyIsIHM6LTEsIGI6YXVkaW9bNV0sIHA6YXVkaW9bNl19OwogIG1zZzJbNF0ucHVzaChbYXVkaW9SZWNlaXZlciwgYXVkaW9TZW5kZXJdKTsKICBpZigxIDwgbXNnWzRdLmxlbmd0aCkgewogICAgdmFyIHZpZGVvID0gbXNnWzRdWzFdLCB2aWRlb1JlY2VpdmVyID0ge3Q6InIiLCBzOi0xLCBiOnZpZGVvWzddLCBmbDp2aWRlb1swXSwgcGw6dmlkZW9bMV19LCB2aWRlb1NlbmRlciA9IHt0OiJzIiwgczotMSwgYjp2aWRlb1s1XSwgcDp2aWRlb1s2XX07CiAgICBtc2cyWzRdLnB1c2goW3ZpZGVvUmVjZWl2ZXIsIHZpZGVvU2VuZGVyXSkKICB9CiAgdmFyIGNvbm5lY3Rpb24gPSBtc2dbNV1bMF0sIGF1ZGlvQ29ubmVjdGlvbiA9IHtmOmNvbm5lY3Rpb25bMF0sIHJ0dDpjb25uZWN0aW9uWzFdLCBzYjpjb25uZWN0aW9uWzJdLCBzYnM6Y29ubmVjdGlvblszXSwgcmI6Y29ubmVjdGlvbls0XSwgcmJzOmNvbm5lY3Rpb25bNV0sIGxjOmNvbm5lY3Rpb25bNl0sIHJjOmNvbm5lY3Rpb25bN119OwogIG1zZzJbNV0ucHVzaChbYXVkaW9Db25uZWN0aW9uXSk7CiAgaWYoMSA8IG1zZ1s1XS5sZW5ndGgpIHsKICAgIHZhciBjb25uZWN0aW9uID0gbXNnWzVdWzFdLCB2aWRlb0Nvbm5lY3Rpb24gPSB7Zjpjb25uZWN0aW9uWzBdLCBydHQ6Y29ubmVjdGlvblsxXSwgc2I6Y29ubmVjdGlvblsyXSwgc2JzOmNvbm5lY3Rpb25bM10sIHJiOmNvbm5lY3Rpb25bNF0sIHJiczpjb25uZWN0aW9uWzVdLCBsYzpjb25uZWN0aW9uWzZdLCByYzpjb25uZWN0aW9uWzddfTsKICAgIG1zZzJbNV0ucHVzaChbdmlkZW9Db25uZWN0aW9uXSkKICB9CiAgdmFyIGdsb2JhbEluZm8gPSB7fTsKICA2ID49IG1zZy5sZW5ndGggPyAoZ2xvYmFsSW5mby52ID0gMSwgZ2xvYmFsSW5mby5jcHVzID0gMSwgZ2xvYmFsSW5mby5jcHUgPSAwLCBnbG9iYWxJbmZvLnRjcHUgPSAwLCBnbG9iYWxJbmZvLnQgPSAwKSA6IChnbG9iYWxJbmZvLnYgPSBtc2dbNl0udiB8fCAxLCBnbG9iYWxJbmZvLmNwdXMgPSBtc2dbNl0uY3B1cyB8fCAxLCBnbG9iYWxJbmZvLmNwdSA9IG1zZ1s2XS5jcHUsIGdsb2JhbEluZm8udGNwdSA9IG1zZ1s2XS50Y3B1LCBnbG9iYWxJbmZvLnBsdWdpbk1zZ1Byb2NUaW1lID0gbXNnWzZdLnQgfHwgMCk7CiAgbXNnMi5wdXNoKGdsb2JhbEluZm8pOwogIG1zZzIucHVzaChbXSk7CiAgcmV0dXJuIG1zZzIKfTsKdGFsay5tZWRpYS5NZWRpYUluZm8ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJCR0b1N0cmluZyQoKSB7CiAgdmFyIHN0cmluZ1JlcCA9IFtdOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoIlxuamlkIiwgdGhpcy5qaWQpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJzZXNzaW9uSWQiLCB0aGlzLnNlc3Npb25JZCkpOwogIHN0cmluZ1JlcC5wdXNoKCJcbkdsb2JhbDoiKTsKICBzdHJpbmdSZXAucHVzaCh0aGlzLmdsb2JhbEluZm8udG9TdHJpbmcoKSk7CiAgc3RyaW5nUmVwLnB1c2goIlxuQXVkaW86Iik7CiAgZm9yKHZhciBpID0gMDtpIDwgdGhpcy5hdWRpb1JlY2VpdmVySW5mb3MubGVuZ3RoO2krKykgewogICAgc3RyaW5nUmVwLnB1c2godGhpcy5hdWRpb1JlY2VpdmVySW5mb3NbaV0udG9TdHJpbmcoKSkKICB9CiAgZm9yKGkgPSAwO2kgPCB0aGlzLmF1ZGlvU2VuZGVySW5mb3MubGVuZ3RoO2krKykgewogICAgc3RyaW5nUmVwLnB1c2godGhpcy5hdWRpb1NlbmRlckluZm9zW2ldLnRvU3RyaW5nKCkpCiAgfQogIGlmKDAgPCB0aGlzLnZpZGVvUmVjZWl2ZXJJbmZvcy5sZW5ndGgpIHsKICAgIHN0cmluZ1JlcC5wdXNoKCJcblZpZGVvOiIpOwogICAgZm9yKGkgPSAwO2kgPCB0aGlzLnZpZGVvUmVjZWl2ZXJJbmZvcy5sZW5ndGg7aSsrKSB7CiAgICAgIHN0cmluZ1JlcC5wdXNoKHRoaXMudmlkZW9SZWNlaXZlckluZm9zW2ldLnRvU3RyaW5nKCkpCiAgICB9CiAgfQogIGlmKHRoaXMudmlkZW9TZW5kZXJJbmZvcykgewogICAgZm9yKGkgPSAwO2kgPCB0aGlzLnZpZGVvU2VuZGVySW5mb3MubGVuZ3RoO2krKykgewogICAgICBzdHJpbmdSZXAucHVzaCh0aGlzLnZpZGVvU2VuZGVySW5mb3NbaV0udG9TdHJpbmcoKSkKICAgIH0KICB9CiAgc3RyaW5nUmVwLnB1c2goIlxuQXVkaW8gY29ubmVjdGlvbnM6Iik7CiAgZm9yKGkgPSAwO2kgPCB0aGlzLmF1ZGlvQ29ubmVjdGlvbkluZm9zLmxlbmd0aDtpKyspIHsKICAgIHN0cmluZ1JlcC5wdXNoKHRoaXMuYXVkaW9Db25uZWN0aW9uSW5mb3NbaV0udG9TdHJpbmcoKSkKICB9CiAgaWYoMCA8IHRoaXMudmlkZW9Db25uZWN0aW9uSW5mb3MubGVuZ3RoKSB7CiAgICBzdHJpbmdSZXAucHVzaCgiXG5WaWRlbyBjb25uZWN0aW9uczoiKTsKICAgIGZvcihpID0gMDtpIDwgdGhpcy52aWRlb0Nvbm5lY3Rpb25JbmZvcy5sZW5ndGg7aSsrKSB7CiAgICAgIHN0cmluZ1JlcC5wdXNoKHRoaXMudmlkZW9Db25uZWN0aW9uSW5mb3NbaV0udG9TdHJpbmcoKSkKICAgIH0KICB9CiAgaWYoMCA8IHRoaXMucGFydGljaXBhbnRzLmxlbmd0aCkgewogICAgc3RyaW5nUmVwLnB1c2goIlxuUGFydGljaXBhbnRzOiIpOwogICAgZm9yKGkgPSAwO2kgPCB0aGlzLnBhcnRpY2lwYW50cy5sZW5ndGg7aSsrKSB7CiAgICAgIHN0cmluZ1JlcC5wdXNoKHRoaXMucGFydGljaXBhbnRzW2ldLnRvU3RyaW5nKCkpCiAgICB9CiAgfQogIHJldHVybiBzdHJpbmdSZXAuam9pbigiXG4iKQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5BdWRpb1NlbmRlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRBdWRpb1NlbmRlciQobXNnKSB7CiAgdGhpcy5zc3JjID0gbXNnLnM7CiAgdGhpcy5ieXRlcyA9IG1zZy5iOwogIHRoaXMucGFja2V0cyA9IG1zZy5wOwogIHRoaXMudGltZXN0YW1wID0gbXNnLnRzIHx8IC0xOwogIHRoaXMubG9zc1JhdGlvID0gbXNnLmZsOwogIHRoaXMubG9zdFBhY2tldHMgPSBtc2cucGwgfHwgLTE7CiAgdGhpcy5oaWdoZXN0U2VxTnVtYmVyID0gbXNnLnNuIHx8IC0xOwogIHRoaXMuaml0dGVyID0gbXNnLmo7CiAgdGhpcy5ydHQgPSBtc2cucnR0OwogIHRoaXMuZW5lcmd5ID0gbXNnLmVuCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLkF1ZGlvU2VuZGVyLnByb3RvdHlwZS5rZXkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kQXVkaW9TZW5kZXIkJGtleSQoKSB7CiAgcmV0dXJuIHRoaXMuc3NyYwp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5BdWRpb1NlbmRlci5wcm90b3R5cGUudG9Kc29uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJEF1ZGlvU2VuZGVyJCR0b0pzb24kKCkgewogIHJldHVybnt0OiJzIiwgczp0aGlzLnNzcmMsIGI6dGhpcy5ieXRlcywgcDp0aGlzLnBhY2tldHMsIHRzOnRoaXMudGltZXN0YW1wLCBmbDp0aGlzLmxvc3NSYXRpbywgcGw6dGhpcy5sb3N0UGFja2V0cywgc246dGhpcy5oaWdoZXN0U2VxTnVtYmVyLCBqOnRoaXMuaml0dGVyLCBydHQ6dGhpcy5ydHQsIGVuOnRoaXMuZW5lcmd5fQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5BdWRpb1NlbmRlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kQXVkaW9TZW5kZXIkJHRvU3RyaW5nJCgpIHsKICByZXR1cm5bZm9ybWF0TGFiZWxBbmRWYWx1ZSgidHlwZSIsICJvdXRnb2luZyIpLCBmb3JtYXRMYWJlbEFuZFZhbHVlKCJTU1JDIiwgdGhpcy5zc3JjKSwgZm9ybWF0TGFiZWxBbmRWYWx1ZSgic2VudCBieXRlcyIsIGZvcm1hdE51bWJlcih0aGlzLmJ5dGVzLCAwKSksIGZvcm1hdExhYmVsQW5kVmFsdWUoInNlbnQgcGFja2V0cyIsIGZvcm1hdE51bWJlcih0aGlzLnBhY2tldHMsIDApKSwgZm9ybWF0TGFiZWxBbmRWYWx1ZSgicmVjZW50IFJUQ1AgdGltZXN0YW1wIiwgZm9ybWF0TnVtYmVyKHRoaXMudGltZXN0YW1wLCAwKSksIGZvcm1hdExhYmVsQW5kVmFsdWUoIlJUUCBsb3NzIHJhdGlvIiwgZm9ybWF0TnVtYmVyKHRoaXMubG9zc1JhdGlvLCAyKSksIGZvcm1hdExhYmVsQW5kVmFsdWUoImxvc3QgUlRQIHBhY2tldHMiLCBmb3JtYXROdW1iZXIodGhpcy5sb3N0UGFja2V0cywgMCkpLCBmb3JtYXRMYWJlbEFuZFZhbHVlKCJoaWdoZXN0IHNlcW51bSIsIGZvcm1hdE51bWJlcih0aGlzLmhpZ2hlc3RTZXFOdW1iZXIsIAogIDApKSwgZm9ybWF0TGFiZWxBbmRWYWx1ZSgiaml0dGVyIiwgZm9ybWF0TnVtYmVyKHRoaXMuaml0dGVyLCAyKSArICIgbXMiKSwgZm9ybWF0TGFiZWxBbmRWYWx1ZSgiUlRUIiwgZm9ybWF0TnVtYmVyKHRoaXMucnR0LCAyKSArICIgbXMiKSwgZm9ybWF0TGFiZWxBbmRWYWx1ZSgiZW5lcmd5IiwgZm9ybWF0TnVtYmVyKHRoaXMuZW5lcmd5LCAwKSldLmpvaW4oIlxuIikKfTsKdGFsay5tZWRpYS5NZWRpYUluZm8uQXVkaW9SZWNlaXZlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRBdWRpb1JlY2VpdmVyJChtc2cpIHsKICB0aGlzLnNzcmMgPSBtc2cuczsKICB0aGlzLmJ5dGVzID0gbXNnLmI7CiAgdGhpcy5wYWNrZXRzID0gbXNnLnA7CiAgdGhpcy5sb3NzUmF0aW8gPSBtc2cuZmw7CiAgdGhpcy5sb3N0UGFja2V0cyA9IG1zZy5wbDsKICB0aGlzLmhpZ2hlc3RTZXFOdW1iZXIgPSBtc2cuc247CiAgdGhpcy5qaXR0ZXIgPSBtc2cuajsKICB0aGlzLmVuZXJneSA9IG1zZy5lbgp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5BdWRpb1JlY2VpdmVyLnByb3RvdHlwZS5rZXkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kQXVkaW9SZWNlaXZlciQka2V5JCgpIHsKICByZXR1cm4gdGhpcy5zc3JjCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLkF1ZGlvUmVjZWl2ZXIucHJvdG90eXBlLnRvSnNvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRBdWRpb1JlY2VpdmVyJCR0b0pzb24kKCkgewogIHJldHVybnt0OiJyIiwgczp0aGlzLnNzcmMsIGI6dGhpcy5ieXRlcywgcDp0aGlzLnBhY2tldHMsIGZsOnRoaXMubG9zc1JhdGlvLCBwbDp0aGlzLmxvc3RQYWNrZXRzLCBzbjp0aGlzLmhpZ2hlc3RTZXFOdW1iZXIsIGo6dGhpcy5qaXR0ZXIsIGVuOnRoaXMuZW5lcmd5fQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5BdWRpb1JlY2VpdmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRBdWRpb1JlY2VpdmVyJCR0b1N0cmluZyQoKSB7CiAgdmFyIHN0cmluZ1JlcCA9IFtdOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoInR5cGUiLCAiaW5jb21pbmciKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiU1NSQyIsIHRoaXMuc3NyYykpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoInJlY2VpdmVkIGJ5dGVzIiwgZm9ybWF0TnVtYmVyKHRoaXMuYnl0ZXMsIDApKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgicmVjZWl2ZWQgcGFja2V0cyIsIGZvcm1hdE51bWJlcih0aGlzLnBhY2tldHMsIDApKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiUlRQIGxvc3MgcmF0aW8iLCBmb3JtYXROdW1iZXIodGhpcy5sb3NzUmF0aW8sIDIpKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgibG9zdCBSVFAgcGFja2V0cyIsIGZvcm1hdE51bWJlcih0aGlzLmxvc3RQYWNrZXRzLCAwKSkpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoImhpZ2hlc3Qgc2VxbnVtIiwgZm9ybWF0TnVtYmVyKHRoaXMuaGlnaGVzdFNlcU51bWJlciwgMCkpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJqaXR0ZXIiLCBmb3JtYXROdW1iZXIodGhpcy5qaXR0ZXIsIDIpICsgIiBtcyIpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJlbmVyZ3kiLCBmb3JtYXROdW1iZXIodGhpcy5lbmVyZ3ksIDApKSk7CiAgcmV0dXJuIHN0cmluZ1JlcC5qb2luKCJcbiIpCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLlZpZGVvU2VuZGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJFZpZGVvU2VuZGVyJChtc2cpIHsKICB0aGlzLnNzcmMgPSBtc2cuczsKICB0aGlzLmJ5dGVzID0gbXNnLmI7CiAgdGhpcy5wYWNrZXRzID0gbXNnLnA7CiAgdGhpcy5sb3NzUmF0aW8gPSBtc2cuZmwgfHwgLTE7CiAgdGhpcy5sb3N0UGFja2V0cyA9IG1zZy5wbCB8fCAtMTsKICB0aGlzLmNhY2hlZFBhY2tldHMgPSBtc2cucGM7CiAgdGhpcy5maXJzID0gbXNnLmZpcjsKICB0aGlzLm5hY2tzID0gbXNnLm5hY2s7CiAgdGhpcy5kaXN0aW5jdE5hY2tzID0gbXNnLmRuYWNrIHx8IC0xOwogIHRoaXMucmV0cmFuc21pdHRlZFBhY2tldHMgPSBtc2cuZHJ0eCB8fCAtMTsKICB0aGlzLnJ0dCA9IG1zZy5ydHQ7CiAgdGhpcy53aWR0aCA9IG1zZy53OwogIHRoaXMuaGVpZ2h0ID0gbXNnLmg7CiAgdGhpcy5mcHNUb0VuY29kZXIgPSBtc2cuZnBzOwogIHRoaXMuZnBzU2VudCA9IG1zZy5zZnBzCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLlZpZGVvU2VuZGVyLnByb3RvdHlwZS5rZXkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kVmlkZW9TZW5kZXIkJGtleSQoKSB7CiAgcmV0dXJuIHRoaXMuc3NyYwp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5WaWRlb1NlbmRlci5wcm90b3R5cGUudG9Kc29uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJFZpZGVvU2VuZGVyJCR0b0pzb24kKCkgewogIHJldHVybnt0OiJzIiwgczp0aGlzLnNzcmMsIGI6dGhpcy5ieXRlcywgcDp0aGlzLnBhY2tldHMsIGZsOnRoaXMubG9zc1JhdGlvLCBwbDp0aGlzLmxvc3RQYWNrZXRzLCBwYzp0aGlzLmNhY2hlZFBhY2tldHMsIGZpcjp0aGlzLmZpcnMsIG5hY2s6dGhpcy5uYWNrcywgZG5hY2s6dGhpcy5kaXN0aW5jdE5hY2tzLCBkcnR4OnRoaXMucmV0cmFuc21pdHRlZFBhY2tldHMsIHJ0dDp0aGlzLnJ0dCwgdzp0aGlzLndpZHRoLCBoOnRoaXMuaGVpZ2h0LCBmcHM6dGhpcy5mcHNUb0VuY29kZXIsIHNmcHM6dGhpcy5mcHNTZW50fQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5WaWRlb1NlbmRlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kVmlkZW9TZW5kZXIkJHRvU3RyaW5nJCgpIHsKICB2YXIgc3RyaW5nUmVwID0gW107CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgidHlwZSIsICJvdXRnb2luZyIpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJTU1JDIiwgdGhpcy5zc3JjKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgic2VudCBieXRlcyIsIGZvcm1hdE51bWJlcih0aGlzLmJ5dGVzLCAwKSkpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoInNlbnQgcGFja2V0cyIsIGZvcm1hdE51bWJlcih0aGlzLnBhY2tldHMsIDApKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiUlRQIGxvc3MgcmF0aW8iLCBmb3JtYXROdW1iZXIodGhpcy5sb3NzUmF0aW8sIDIpKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgibG9zdCBSVFAgcGFja2V0cyIsIGZvcm1hdE51bWJlcih0aGlzLmxvc3RQYWNrZXRzLCAwKSkpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoImNhY2hlZCBwYWNrZXRzIiwgZm9ybWF0TnVtYmVyKHRoaXMuY2FjaGVkUGFja2V0cywgMCkpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCIjIG9mIEZJUnMgcmVjZWl2ZWQiLCBmb3JtYXROdW1iZXIodGhpcy5maXJzLCAwKSkpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoIiMgb2YgTkFDS3MgcmVjZWl2ZWQiLCBmb3JtYXROdW1iZXIodGhpcy5uYWNrcywgMCkpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCIjIG9mIGRpc3RpbmN0IE5BQ0tzIHJlY2VpdmVkIiwgZm9ybWF0TnVtYmVyKHRoaXMuZGlzdGluY3ROYWNrcywgMCkpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCIjIG9mIGRpc3RpbmN0IHBhY2tldHMgcmV0cmFuc21pdHRlZCIsIGZvcm1hdE51bWJlcih0aGlzLnJldHJhbnNtaXR0ZWRQYWNrZXRzLCAwKSkpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoIlJUVCIsIGZvcm1hdE51bWJlcih0aGlzLnJ0dCwgMikgKyAiIG1zIikpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoImZyYW1lIHdpZHRoIiwgZm9ybWF0TnVtYmVyKHRoaXMud2lkdGgsIDApKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiZnJhbWUgaGVpZ2h0IiwgZm9ybWF0TnVtYmVyKHRoaXMuaGVpZ2h0LCAwKSkpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoImZyYW1lcmF0ZSB0byBlbmNvZGVyIiwgZm9ybWF0TnVtYmVyKHRoaXMuZnBzVG9FbmNvZGVyLCAyKSArICIgZnBzIikpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoImZyYW1lcmF0ZSBzZW50IiwgZm9ybWF0TnVtYmVyKHRoaXMuZnBzU2VudCwgMikgKyAiIGZwcyIpKTsKICByZXR1cm4gc3RyaW5nUmVwLmpvaW4oIlxuIikKfTsKdGFsay5tZWRpYS5NZWRpYUluZm8uVmlkZW9SZWNlaXZlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRWaWRlb1JlY2VpdmVyJChtc2cpIHsKICB0aGlzLnNzcmMgPSBtc2cuczsKICB0aGlzLmJ5dGVzID0gbXNnLmI7CiAgdGhpcy5wZXJMYXllckJ5dGVzID0gbXNnLmxiIHx8IC0xOwogIHRoaXMucGFja2V0cyA9IG1zZy5wOwogIHRoaXMubG9zc1JhdGlvID0gbXNnLmZsOwogIHRoaXMubG9zdFBhY2tldHMgPSBtc2cucGw7CiAgdGhpcy5jb25jZWFsZWRQYWNrZXRzID0gbXNnLnB4OwogIHRoaXMuZmlycyA9IG1zZy5maXI7CiAgdGhpcy5uYWNrcyA9IG1zZy5uYWNrOwogIHRoaXMuZGlzdGluY3ROYWNrcyA9IG1zZy5kbmFjayB8fCAtMTsKICB0aGlzLndpZHRoID0gbXNnLnc7CiAgdGhpcy5oZWlnaHQgPSBtc2cuaDsKICB0aGlzLmZwc1JlY3ZlZCA9IG1zZy5yZnBzOwogIHRoaXMuZnBzRGVjb2RlZCA9IG1zZy5kZnBzOwogIHRoaXMuZnBzVG9SZW5kZXJlciA9IG1zZy5mcHM7CiAgdGhpcy5mcHNHcmFwaGljc0lucHV0ID0gbXNnLmdpZnBzIHx8IC0xOwogIHRoaXMuZnBzR3JhcGhpY3NPdXRwdXQgPSBtc2cuZ29mcHMgfHwgLTEKfTsKdGFsay5tZWRpYS5NZWRpYUluZm8uVmlkZW9SZWNlaXZlci5wcm90b3R5cGUua2V5ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJFZpZGVvUmVjZWl2ZXIkJGtleSQoKSB7CiAgcmV0dXJuIHRoaXMuc3NyYwp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5WaWRlb1JlY2VpdmVyLnByb3RvdHlwZS50b0pzb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kVmlkZW9SZWNlaXZlciQkdG9Kc29uJCgpIHsKICByZXR1cm57dDoiciIsIHM6dGhpcy5zc3JjLCBiOnRoaXMuYnl0ZXMsIGxiOnRoaXMucGVyTGF5ZXJCeXRlcywgcDp0aGlzLnBhY2tldHMsIGZsOnRoaXMubG9zc1JhdGlvLCBwbDp0aGlzLmxvc3RQYWNrZXRzLCBweDp0aGlzLmNvbmNlYWxlZFBhY2tldHMsIGZpcjp0aGlzLmZpcnMsIG5hY2s6dGhpcy5uYWNrcywgZG5hY2s6dGhpcy5kaXN0aW5jdE5hY2tzLCB3OnRoaXMud2lkdGgsIGg6dGhpcy5oZWlnaHQsIHJmcHM6dGhpcy5mcHNSZWN2ZWQsIGRmcHM6dGhpcy5mcHNEZWNvZGVkLCBmcHM6dGhpcy5mcHNUb1JlbmRlcmVyLCBnaWZwczp0aGlzLmZwc0dyYXBoaWNzSW5wdXQsIGdvZnBzOnRoaXMuZnBzR3JhcGhpY3NPdXRwdXR9Cn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLlZpZGVvUmVjZWl2ZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJFZpZGVvUmVjZWl2ZXIkJHRvU3RyaW5nJCgpIHsKICB2YXIgc3RyaW5nUmVwID0gW107CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgidHlwZSIsICJpbmNvbWluZyIpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJTU1JDIiwgdGhpcy5zc3JjKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgicmVjZWl2ZWQgYnl0ZXMiLCBmb3JtYXROdW1iZXIodGhpcy5ieXRlcywgMCkpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJwZXItbGF5ZXIgYnl0ZXMgcmVjZWl2ZWQiLCB0aGlzLnBlckxheWVyQnl0ZXMgfHwgIj8iKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgicmVjZWl2ZWQgcGFja2V0cyIsIGZvcm1hdE51bWJlcih0aGlzLnBhY2tldHMsIDApKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiUlRQIGxvc3MgcmF0aW8iLCBmb3JtYXROdW1iZXIodGhpcy5sb3NzUmF0aW8sIDIpKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgibG9zdCBSVFAgcGFja2V0cyIsIGZvcm1hdE51bWJlcih0aGlzLmxvc3RQYWNrZXRzLCAwKSkpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoImNvbmNlYWxlZCBsb3N0IFJUUCBwYWNrZXRzIiwgZm9ybWF0TnVtYmVyKHRoaXMuY29uY2VhbGVkUGFja2V0cywgMCkpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCIjIG9mIEZJUnMgc2VudCIsIGZvcm1hdE51bWJlcih0aGlzLmZpcnMsIDApKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiIyBvZiBOQUNLcyBzZW50IiwgZm9ybWF0TnVtYmVyKHRoaXMubmFja3MsIDApKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiIyBvZiBkaXN0aW5jdCBOQUNLcyBzZW50IiwgZm9ybWF0TnVtYmVyKHRoaXMuZGlzdGluY3ROYWNrcywgMCkpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJmcmFtZSB3aWR0aCIsIGZvcm1hdE51bWJlcih0aGlzLndpZHRoLCAwKSkpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoImZyYW1lIGhlaWdodCIsIGZvcm1hdE51bWJlcih0aGlzLmhlaWdodCwgMCkpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJmcmFtZXJhdGUgcmVjZWl2ZWQiLCBmb3JtYXROdW1iZXIodGhpcy5mcHNSZWN2ZWQsIDIpICsgIiBmcHMiKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiZnJhbWVyYXRlIGRlY29kZWQiLCBmb3JtYXROdW1iZXIodGhpcy5mcHNEZWNvZGVkLCAyKSArICIgZnBzIikpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoImZyYW1lcmF0ZSB0byByZW5kZXJlciIsIGZvcm1hdE51bWJlcih0aGlzLmZwc1RvUmVuZGVyZXIsIDIpICsgIiBmcHMiKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiZnJhbWVyYXRlIGlucHV0IHRvIGdyYXBoaWNzIiwgZm9ybWF0TnVtYmVyKHRoaXMuZnBzR3JhcGhpY3NJbnB1dCwgMikgKyAiIGZwcyIpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJmcmFtZXJhdGUgb3V0cHV0IHRvIGdyYXBoaWNzIiwgZm9ybWF0TnVtYmVyKHRoaXMuZnBzR3JhcGhpY3NPdXRwdXQsIDIpICsgIiBmcHMiKSk7CiAgcmV0dXJuIHN0cmluZ1JlcC5qb2luKCJcbiIpCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLkNvbm5lY3Rpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kQ29ubmVjdGlvbiQobXNnLCBtZWRpYSkgewogIHRoaXMuZmxhZ3MgPSBtc2cuZjsKICB0aGlzLnJ0dCA9IG1zZy5ydHQ7CiAgdGhpcy5zZW5kQnl0ZXMgPSBtc2cuc2I7CiAgdGhpcy5zZW5kQnBicyA9IG1zZy5zYnM7CiAgdGhpcy5yZWN2Qnl0ZXMgPSBtc2cucmI7CiAgdGhpcy5yZWN2QnBicyA9IG1zZy5yYnM7CiAgdGhpcy5sb2NhbENhbmRpZGF0ZSA9IG5ldyB0YWxrLm1lZGlhLk1lZGlhSW5mby5DYW5kaWRhdGUobXNnLmxjKTsKICB0aGlzLnJlbW90ZUNhbmRpZGF0ZSA9IG5ldyB0YWxrLm1lZGlhLk1lZGlhSW5mby5DYW5kaWRhdGUobXNnLnJjKTsKICB0aGlzLm1lZGlhID0gbWVkaWEKfTsKdGFsay5tZWRpYS5NZWRpYUluZm8uQ29ubmVjdGlvbi5wcm90b3R5cGUua2V5ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJENvbm5lY3Rpb24kJGtleSQoKSB7CiAgcmV0dXJuW3RoaXMubG9jYWxDYW5kaWRhdGUsIHRoaXMucmVtb3RlQ2FuZGlkYXRlXS50b1N0cmluZygpCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLkNvbm5lY3Rpb24ucHJvdG90eXBlLnRvSnNvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRDb25uZWN0aW9uJCR0b0pzb24kKCkgewogIHJldHVybntmOnRoaXMuZmxhZ3MsIHJ0dDp0aGlzLnJ0dCwgc2I6dGhpcy5zZW5kQnl0ZXMsIHNiczp0aGlzLnNlbmRCcGJzLCByYjp0aGlzLnJlY3ZCeXRlcywgcmJzOnRoaXMucmVjdkJwYnMsIGxjOmdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMubG9jYWxDYW5kaWRhdGUpID8gdGhpcy5sb2NhbENhbmRpZGF0ZS50b0pzb24oKSA6IFtdLCByYzpnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLnJlbW90ZUNhbmRpZGF0ZSkgPyB0aGlzLnJlbW90ZUNhbmRpZGF0ZS50b0pzb24oKSA6IFtdfQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5Db25uZWN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRDb25uZWN0aW9uJCR0b1N0cmluZyQoKSB7CiAgdmFyIHN0cmluZ1JlcCA9IFtdOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoIlJUVCIsIGZvcm1hdE51bWJlcih0aGlzLnJ0dCwgMikgKyAiIG1zIikpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoInNlbmQgYnl0ZXMiLCBmb3JtYXROdW1iZXIodGhpcy5zZW5kQnl0ZXMsIDApKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgic2VuZCBiaXRyYXRlIiwgZm9ybWF0TnVtYmVyKHRoaXMuc2VuZEJwYnMgLyAxMjgsIDQpICsgIiBrYnBzIikpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoInJlY3YgYnl0ZXMiLCBmb3JtYXROdW1iZXIodGhpcy5yZWN2Qnl0ZXMsIDApKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgicmVjdiBiaXRyYXRlIiwgZm9ybWF0TnVtYmVyKHRoaXMucmVjdkJwYnMgLyAxMjgsIDQpICsgIiBrYnBzIikpOwogIHN0cmluZ1JlcC5wdXNoKCJcbmxvY2FsIGNhbmRpZGF0ZToiKTsKICBzdHJpbmdSZXAucHVzaCh0aGlzLmxvY2FsQ2FuZGlkYXRlLnRvU3RyaW5nKCkpOwogIHN0cmluZ1JlcC5wdXNoKCJcbnJlbW90ZSBjYW5kaWRhdGU6Iik7CiAgc3RyaW5nUmVwLnB1c2godGhpcy5yZW1vdGVDYW5kaWRhdGUudG9TdHJpbmcoKSk7CiAgcmV0dXJuIHN0cmluZ1JlcC5qb2luKCJcbiIpCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLkNvbm5lY3Rpb25GbGFnID0ge0JFU1Q6MSwgV1JJVEFCTEU6MiwgUkVBREFCTEU6NCwgVElNRU9VVDo4LCBORVdDT05ORUNUSU9OOjEwfTsKdGFsay5tZWRpYS5NZWRpYUluZm8uQ29ubmVjdGlvbi5wcm90b3R5cGUuaXNCZXN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJENvbm5lY3Rpb24kJGlzQmVzdCQoKSB7CiAgcmV0dXJuIDAgIT0gKHRoaXMuZmxhZ3MgJiB0YWxrLm1lZGlhLk1lZGlhSW5mby5Db25uZWN0aW9uRmxhZy5CRVNUKQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5Db25uZWN0aW9uLnByb3RvdHlwZS5pc1dyaXRhYmxlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJENvbm5lY3Rpb24kJGlzV3JpdGFibGUkKCkgewogIHJldHVybiAwICE9ICh0aGlzLmZsYWdzICYgdGFsay5tZWRpYS5NZWRpYUluZm8uQ29ubmVjdGlvbkZsYWcuV1JJVEFCTEUpCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLkNvbm5lY3Rpb24ucHJvdG90eXBlLmlzUmVhZGFibGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kQ29ubmVjdGlvbiQkaXNSZWFkYWJsZSQoKSB7CiAgcmV0dXJuIDAgIT0gKHRoaXMuZmxhZ3MgJiB0YWxrLm1lZGlhLk1lZGlhSW5mby5Db25uZWN0aW9uRmxhZy5SRUFEQUJMRSkKfTsKdGFsay5tZWRpYS5NZWRpYUluZm8uQ2FuZGlkYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJENhbmRpZGF0ZSQobXNnKSB7CiAgdGhpcy5uYW1lID0gbXNnWzBdOwogIHRoaXMudHlwZSA9IG1zZ1sxXTsKICB0aGlzLnByb3RvY29sID0gbXNnWzJdOwogIHRoaXMuYWRkcmVzcyA9IG1zZ1szXQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5DYW5kaWRhdGUucHJvdG90eXBlLnRvSnNvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRDYW5kaWRhdGUkJHRvSnNvbiQoKSB7CiAgcmV0dXJuW3RoaXMubmFtZSwgdGhpcy50eXBlLCB0aGlzLnByb3RvY29sLCB0aGlzLmFkZHJlc3NdCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvLkNhbmRpZGF0ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kQ2FuZGlkYXRlJCR0b1N0cmluZyQoKSB7CiAgdmFyIHN0cmluZ1JlcCA9IFtdOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoIm5hbWUiLCB0aGlzLm5hbWUpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJ0eXBlIiwgdGhpcy50eXBlKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgicHJvdG9jb2wiLCB0aGlzLnByb3RvY29sKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiYWRkcmVzcyIsIHRoaXMuYWRkcmVzcykpOwogIHJldHVybiBzdHJpbmdSZXAuam9pbigiXG4iKQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5HbG9iYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kR2xvYmFsJChtc2cpIHsKICB0aGlzLmptaVZlcnNpb24gPSBtc2cudiB8fCAxOwogIHRoaXMuY3B1cyA9IG1zZy5jcHVzIHx8IDE7CiAgdGhpcy5jcHUgPSBtc2cuY3B1OwogIHRoaXMudG90YWxDcHUgPSBtc2cudGNwdTsKICB0aGlzLnBsdWdpbk1zZ1Byb2NUaW1lID0gbXNnLnQgfHwgMAp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mby5HbG9iYWwucHJvdG90eXBlLnRvSnNvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRHbG9iYWwkJHRvSnNvbiQoKSB7CiAgcmV0dXJue3Y6dGhpcy5qbWlWZXJzaW9uLCBjcHVzOnRoaXMuY3B1cywgY3B1OnRoaXMuY3B1LCB0Y3B1OnRoaXMudG90YWxDcHUsIHQ6dGhpcy5wbHVnaW5Nc2dQcm9jVGltZX0KfTsKdGFsay5tZWRpYS5NZWRpYUluZm8uR2xvYmFsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRHbG9iYWwkJHRvU3RyaW5nJCgpIHsKICB2YXIgc3RyaW5nUmVwID0gW107CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiY3B1cyIsIGZvcm1hdE51bWJlcih0aGlzLmNwdXMsIDApKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgiR1RQIENQVSB1c2FnZSIsIGZvcm1hdE51bWJlcih0aGlzLmNwdSwgMikgKyAiJSIpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJUb3RhbCBDUFUgdXNhZ2UiLCBmb3JtYXROdW1iZXIodGhpcy50b3RhbENwdSwgMikgKyAiJSIpKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJBdmVyYWdlIFBsdWdpbiBNZXNzYWdlIFByb2Nlc3NpbmcgVGltZSIsIGZvcm1hdE51bWJlcih0aGlzLnBsdWdpbk1zZ1Byb2NUaW1lLCAwKSArICJtcyIpKTsKICByZXR1cm4gc3RyaW5nUmVwLmpvaW4oIlxuIikKfTsKdGFsay5tZWRpYS5NZWRpYUluZm8uUGFydGljaXBhbnRMb2cgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm8kUGFydGljaXBhbnRMb2ckKG1zZykgewogIHRoaXMubmljayA9IG1zZy5uaWNrOwogIHRoaXMuYXVkaW9Tc3JjcyA9IG1zZy5hdWRpb1NzcmNzIHx8IFtdOwogIHRoaXMudmlkZW9Tc3JjcyA9IG1zZy52aWRlb1NzcmNzIHx8IFtdOwogIHRoaXMucGFydGljaXBhbnQgPSBtc2cucGFydGljaXBhbnQgfHwgIiIKfTsKdGFsay5tZWRpYS5NZWRpYUluZm8uUGFydGljaXBhbnRMb2cucHJvdG90eXBlLnRvSnNvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mbyRQYXJ0aWNpcGFudExvZyQkdG9Kc29uJCgpIHsKICByZXR1cm57bmljazp0aGlzLm5pY2ssIGF1ZGlvU3NyY3M6dGhpcy5hdWRpb1NzcmNzLCB2aWRlb1NzcmNzOnRoaXMudmlkZW9Tc3JjcywgcGFydGljaXBhbnQ6dGhpcy5wYXJ0aWNpcGFudH0KfTsKdGFsay5tZWRpYS5NZWRpYUluZm8uUGFydGljaXBhbnRMb2cucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvJFBhcnRpY2lwYW50TG9nJCR0b1N0cmluZyQoKSB7CiAgdmFyIHN0cmluZ1JlcCA9IFtdOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoIm5pY2siLCB0aGlzLm5pY2spKTsKICBzdHJpbmdSZXAucHVzaChmb3JtYXRMYWJlbEFuZFZhbHVlKCJhdWRpbyBTU1JDcyIsIHRoaXMuYXVkaW9Tc3Jjcy5qb2luKCIsICIpKSk7CiAgc3RyaW5nUmVwLnB1c2goZm9ybWF0TGFiZWxBbmRWYWx1ZSgidmlkZW8gU1NSQ3MiLCB0aGlzLnZpZGVvU3NyY3Muam9pbigiLCAiKSkpOwogIHN0cmluZ1JlcC5wdXNoKGZvcm1hdExhYmVsQW5kVmFsdWUoInBhcnRpY2lwYW50IiwgdGhpcy5wYXJ0aWNpcGFudCkpOwogIHJldHVybiBzdHJpbmdSZXAuam9pbigiXG4iKQp9OwpmdW5jdGlvbiBmb3JtYXROdW1iZXIobnVtYmVyLCBwcmVjaXNpb24pIHsKICByZXR1cm4gZ29vZy5pc0RlZihudW1iZXIpID8gZ29vZy5zdHJpbmcucGFkTnVtYmVyKG51bWJlciwgMCwgcHJlY2lzaW9uKSA6ICI/Igp9CmZ1bmN0aW9uIGZvcm1hdExhYmVsQW5kVmFsdWUobGFiZWwsIHZhbHVlKSB7CiAgcmV0dXJuIiAgIiArIGxhYmVsICsgIiA9ICIgKyB2YWx1ZQp9Cjt0YWxrLm1lZGlhLlNzcmNHZW5lcmF0b3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRTc3JjR2VuZXJhdG9yJChvcHRfbWluLCBvcHRfbWF4KSB7CiAgdGhpcy5nZW5lcmF0ZWRTc3Jjc18gPSBuZXcgZ29vZy5zdHJ1Y3RzLlNldDsKICB0aGlzLnJhbmdlTWluXyA9IG9wdF9taW4gfHwgdGFsay5tZWRpYS5Tc3JjR2VuZXJhdG9yLk1JTl9TU1JDXzsKICB0aGlzLnJhbmdlTWF4XyA9IG9wdF9tYXggfHwgdGFsay5tZWRpYS5Tc3JjR2VuZXJhdG9yLk1BWF9TU1JDXzsKICB0aGlzLnJhbmdlTWluXyA9IE1hdGgubWF4KHRoaXMucmFuZ2VNaW5fLCB0YWxrLm1lZGlhLlNzcmNHZW5lcmF0b3IuTUlOX1NTUkNfKTsKICB0aGlzLnJhbmdlTWF4XyA9IE1hdGgubWluKHRoaXMucmFuZ2VNYXhfLCB0YWxrLm1lZGlhLlNzcmNHZW5lcmF0b3IuTUFYX1NTUkNfKTsKICB0aGlzLnJhbmdlTWluXyA+IHRoaXMucmFuZ2VNYXhfICYmICh0aGlzLnJhbmdlTWluXyA9IHRhbGsubWVkaWEuU3NyY0dlbmVyYXRvci5NSU5fU1NSQ18sIHRoaXMucmFuZ2VNYXhfID0gdGFsay5tZWRpYS5Tc3JjR2VuZXJhdG9yLk1BWF9TU1JDXykKfTsKdGFsay5tZWRpYS5Tc3JjR2VuZXJhdG9yLk1JTl9TU1JDXyA9IDI7CnRhbGsubWVkaWEuU3NyY0dlbmVyYXRvci5NQVhfU1NSQ18gPSA0Mjk0OTY3Mjk1Owp0YWxrLm1lZGlhLlNzcmNHZW5lcmF0b3IucHJvdG90eXBlLmNyZWF0ZVNzcmMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRTc3JjR2VuZXJhdG9yJCRjcmVhdGVTc3JjJCgpIHsKICBmb3IodmFyIHJhbmdlU2l6ZSA9IHRoaXMucmFuZ2VNYXhfIC0gdGhpcy5yYW5nZU1pbl8gKyAxLCBzc3JjID0gTWF0aC5mbG9vcih0aGlzLnJhbmdlTWluXyArIHJhbmdlU2l6ZSAqIE1hdGgucmFuZG9tKCkpLCBjb3VudCA9IDA7dGhpcy5nZW5lcmF0ZWRTc3Jjc18uY29udGFpbnMoc3NyYyk7KSB7CiAgICBpZihzc3JjIDwgdGhpcy5yYW5nZU1heF8gPyArK3NzcmMgOiBzc3JjID0gdGhpcy5yYW5nZU1pbl8sICsrY291bnQgPj0gcmFuZ2VTaXplKSB7CiAgICAgIHJldHVybiBudWxsCiAgICB9CiAgfQogIHRoaXMuZ2VuZXJhdGVkU3NyY3NfLmFkZChzc3JjKTsKICByZXR1cm4gc3NyYwp9Owp0YWxrLm1lZGlhLlN0cmFuZ2VyTWFuYWdlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFN0cmFuZ2VyTWFuYWdlciQoKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuU3RyYW5nZXJNYW5hZ2VyLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CnRhbGsubWVkaWEuU3RyYW5nZXJNYW5hZ2VyLkV2ZW50VHlwZSA9IHtBTExPV19TVFJBTkdFUjpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiYWxsb3dfc3RyYW5nZXIiKX07CnRhbGsubWVkaWEuU3RyYW5nZXJNYW5hZ2VyLkFsbG93U3RyYW5nZXJFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFN0cmFuZ2VyTWFuYWdlciRBbGxvd1N0cmFuZ2VyRXZlbnQkKGppZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5TdHJhbmdlck1hbmFnZXIuRXZlbnRUeXBlLkFMTE9XX1NUUkFOR0VSKTsKICB0aGlzLmppZCA9IGppZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuU3RyYW5nZXJNYW5hZ2VyLkFsbG93U3RyYW5nZXJFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwpnb29nLmV2ZW50cy5LZXlDb2RlcyA9IHtXSU5fS0VZX0ZGX0xJTlVYOjAsIE1BQ19FTlRFUjozLCBCQUNLU1BBQ0U6OCwgVEFCOjksIE5VTV9DRU5URVI6MTIsIEVOVEVSOjEzLCBTSElGVDoxNiwgQ1RSTDoxNywgQUxUOjE4LCBQQVVTRToxOSwgQ0FQU19MT0NLOjIwLCBFU0M6MjcsIFNQQUNFOjMyLCBQQUdFX1VQOjMzLCBQQUdFX0RPV046MzQsIEVORDozNSwgSE9NRTozNiwgTEVGVDozNywgVVA6MzgsIFJJR0hUOjM5LCBET1dOOjQwLCBQUklOVF9TQ1JFRU46NDQsIElOU0VSVDo0NSwgREVMRVRFOjQ2LCBaRVJPOjQ4LCBPTkU6NDksIFRXTzo1MCwgVEhSRUU6NTEsIEZPVVI6NTIsIEZJVkU6NTMsIFNJWDo1NCwgU0VWRU46NTUsIEVJR0hUOjU2LCBOSU5FOjU3LCBGRl9TRU1JQ09MT046NTksIEZGX0VRVUFMUzo2MSwgUVVFU1RJT05fTUFSSzo2MywgQTo2NSwgQjo2NiwgQzo2NywgRDo2OCwgRTo2OSwgRjo3MCwgRzo3MSwgSDo3MiwgSTo3MywgSjo3NCwgSzo3NSwgTDo3NiwgTTo3NywgCk46NzgsIE86NzksIFA6ODAsIFE6ODEsIFI6ODIsIFM6ODMsIFQ6ODQsIFU6ODUsIFY6ODYsIFc6ODcsIFg6ODgsIFk6ODksIFo6OTAsIE1FVEE6OTEsIFdJTl9LRVlfUklHSFQ6OTIsIENPTlRFWFRfTUVOVTo5MywgTlVNX1pFUk86OTYsIE5VTV9PTkU6OTcsIE5VTV9UV086OTgsIE5VTV9USFJFRTo5OSwgTlVNX0ZPVVI6MTAwLCBOVU1fRklWRToxMDEsIE5VTV9TSVg6MTAyLCBOVU1fU0VWRU46MTAzLCBOVU1fRUlHSFQ6MTA0LCBOVU1fTklORToxMDUsIE5VTV9NVUxUSVBMWToxMDYsIE5VTV9QTFVTOjEwNywgTlVNX01JTlVTOjEwOSwgTlVNX1BFUklPRDoxMTAsIE5VTV9ESVZJU0lPTjoxMTEsIEYxOjExMiwgRjI6MTEzLCBGMzoxMTQsIEY0OjExNSwgRjU6MTE2LCBGNjoxMTcsIEY3OjExOCwgRjg6MTE5LCBGOToxMjAsIEYxMDoxMjEsIEYxMToxMjIsIEYxMjoxMjMsIE5VTUxPQ0s6MTQ0LCBTQ1JPTExfTE9DSzoxNDUsIEZJUlNUX01FRElBX0tFWToxNjYsIExBU1RfTUVESUFfS0VZOjE4MywgClNFTUlDT0xPTjoxODYsIERBU0g6MTg5LCBFUVVBTFM6MTg3LCBDT01NQToxODgsIFBFUklPRDoxOTAsIFNMQVNIOjE5MSwgQVBPU1RST1BIRToxOTIsIFRJTERFOjE5MiwgU0lOR0xFX1FVT1RFOjIyMiwgT1BFTl9TUVVBUkVfQlJBQ0tFVDoyMTksIEJBQ0tTTEFTSDoyMjAsIENMT1NFX1NRVUFSRV9CUkFDS0VUOjIyMSwgV0lOX0tFWToyMjQsIE1BQ19GRl9NRVRBOjIyNCwgV0lOX0lNRToyMjksIFBIQU5UT006MjU1fTsKZ29vZy5ldmVudHMuS2V5Q29kZXMuaXNUZXh0TW9kaWZ5aW5nS2V5RXZlbnQgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkS2V5Q29kZXMkaXNUZXh0TW9kaWZ5aW5nS2V5RXZlbnQkKGUpIHsKICBpZihlLmFsdEtleSAmJiAhZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fCBlLmtleUNvZGUgPj0gZ29vZy5ldmVudHMuS2V5Q29kZXMuRjEgJiYgZS5rZXlDb2RlIDw9IGdvb2cuZXZlbnRzLktleUNvZGVzLkYxMikgewogICAgcmV0dXJuITEKICB9CiAgc3dpdGNoKGUua2V5Q29kZSkgewogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5BTFQ6CiAgICA7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLkNBUFNfTE9DSzoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuQ09OVEVYVF9NRU5VOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5DVFJMOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5ET1dOOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5FTkQ6CiAgICA7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLkVTQzoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuSE9NRToKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuSU5TRVJUOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5MRUZUOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5NQUNfRkZfTUVUQToKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuTUVUQToKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuTlVNTE9DSzoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuTlVNX0NFTlRFUjoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuUEFHRV9ET1dOOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5QQUdFX1VQOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5QQVVTRToKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuUEhBTlRPTToKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuUFJJTlRfU0NSRUVOOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5SSUdIVDoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuU0NST0xMX0xPQ0s6CiAgICA7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLlNISUZUOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5VUDoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuV0lOX0tFWToKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuV0lOX0tFWV9SSUdIVDoKICAgICAgcmV0dXJuITE7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLldJTl9LRVlfRkZfTElOVVg6CiAgICAgIHJldHVybiFnb29nLnVzZXJBZ2VudC5HRUNLTzsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBlLmtleUNvZGUgPCBnb29nLmV2ZW50cy5LZXlDb2Rlcy5GSVJTVF9NRURJQV9LRVkgfHwgZS5rZXlDb2RlID4gZ29vZy5ldmVudHMuS2V5Q29kZXMuTEFTVF9NRURJQV9LRVkKICB9Cn07Cmdvb2cuZXZlbnRzLktleUNvZGVzLmZpcmVzS2V5UHJlc3NFdmVudCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRLZXlDb2RlcyRmaXJlc0tleVByZXNzRXZlbnQkKGtleUNvZGUsIG9wdF9oZWxkS2V5Q29kZSwgb3B0X3NoaWZ0S2V5LCBvcHRfY3RybEtleSwgb3B0X2FsdEtleSkgewogIGlmKCFnb29nLnVzZXJBZ2VudC5JRSAmJiAoIWdvb2cudXNlckFnZW50LldFQktJVCB8fCAhZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uKCI1MjUiKSkpIHsKICAgIHJldHVybiEwCiAgfQogIGlmKGdvb2cudXNlckFnZW50Lk1BQyAmJiBvcHRfYWx0S2V5KSB7CiAgICByZXR1cm4gZ29vZy5ldmVudHMuS2V5Q29kZXMuaXNDaGFyYWN0ZXJLZXkoa2V5Q29kZSkKICB9CiAgaWYob3B0X2FsdEtleSAmJiAhb3B0X2N0cmxLZXkgfHwgIW9wdF9zaGlmdEtleSAmJiAob3B0X2hlbGRLZXlDb2RlID09IGdvb2cuZXZlbnRzLktleUNvZGVzLkNUUkwgfHwgb3B0X2hlbGRLZXlDb2RlID09IGdvb2cuZXZlbnRzLktleUNvZGVzLkFMVCkgfHwgZ29vZy51c2VyQWdlbnQuSUUgJiYgb3B0X2N0cmxLZXkgJiYgb3B0X2hlbGRLZXlDb2RlID09IGtleUNvZGUpIHsKICAgIHJldHVybiExCiAgfQogIHN3aXRjaChrZXlDb2RlKSB7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLkVOVEVSOgogICAgICByZXR1cm4hKGdvb2cudXNlckFnZW50LklFICYmIGdvb2cudXNlckFnZW50LmlzRG9jdW1lbnRNb2RlKDkpKTsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuRVNDOgogICAgICByZXR1cm4hZ29vZy51c2VyQWdlbnQuV0VCS0lUCiAgfQogIHJldHVybiBnb29nLmV2ZW50cy5LZXlDb2Rlcy5pc0NoYXJhY3RlcktleShrZXlDb2RlKQp9Owpnb29nLmV2ZW50cy5LZXlDb2Rlcy5pc0NoYXJhY3RlcktleSA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRLZXlDb2RlcyRpc0NoYXJhY3RlcktleSQoa2V5Q29kZSkgewogIGlmKGtleUNvZGUgPj0gZ29vZy5ldmVudHMuS2V5Q29kZXMuWkVSTyAmJiBrZXlDb2RlIDw9IGdvb2cuZXZlbnRzLktleUNvZGVzLk5JTkUgfHwga2V5Q29kZSA+PSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5OVU1fWkVSTyAmJiBrZXlDb2RlIDw9IGdvb2cuZXZlbnRzLktleUNvZGVzLk5VTV9NVUxUSVBMWSB8fCBrZXlDb2RlID49IGdvb2cuZXZlbnRzLktleUNvZGVzLkEgJiYga2V5Q29kZSA8PSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5aIHx8IGdvb2cudXNlckFnZW50LldFQktJVCAmJiAwID09IGtleUNvZGUpIHsKICAgIHJldHVybiEwCiAgfQogIHN3aXRjaChrZXlDb2RlKSB7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLlNQQUNFOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5RVUVTVElPTl9NQVJLOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5OVU1fUExVUzoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuTlVNX01JTlVTOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5OVU1fUEVSSU9EOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5OVU1fRElWSVNJT046CiAgICA7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLlNFTUlDT0xPTjoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuRkZfU0VNSUNPTE9OOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5EQVNIOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5FUVVBTFM6CiAgICA7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLkZGX0VRVUFMUzoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuQ09NTUE6CiAgICA7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLlBFUklPRDoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuU0xBU0g6CiAgICA7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLkFQT1NUUk9QSEU6CiAgICA7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLlNJTkdMRV9RVU9URToKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuT1BFTl9TUVVBUkVfQlJBQ0tFVDoKICAgIDsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuQkFDS1NMQVNIOgogICAgOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5DTE9TRV9TUVVBUkVfQlJBQ0tFVDoKICAgICAgcmV0dXJuITA7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4hMQogIH0KfTsKZ29vZy5ldmVudHMuS2V5Q29kZXMubm9ybWFsaXplR2Vja29LZXlDb2RlID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEtleUNvZGVzJG5vcm1hbGl6ZUdlY2tvS2V5Q29kZSQoa2V5Q29kZSkgewogIHN3aXRjaChrZXlDb2RlKSB7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLkZGX0VRVUFMUzoKICAgICAgcmV0dXJuIGdvb2cuZXZlbnRzLktleUNvZGVzLkVRVUFMUzsKICAgIGNhc2UgZ29vZy5ldmVudHMuS2V5Q29kZXMuRkZfU0VNSUNPTE9OOgogICAgICByZXR1cm4gZ29vZy5ldmVudHMuS2V5Q29kZXMuU0VNSUNPTE9OOwogICAgY2FzZSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5NQUNfRkZfTUVUQToKICAgICAgcmV0dXJuIGdvb2cuZXZlbnRzLktleUNvZGVzLk1FVEE7CiAgICBjYXNlIGdvb2cuZXZlbnRzLktleUNvZGVzLldJTl9LRVlfRkZfTElOVVg6CiAgICAgIHJldHVybiBnb29nLmV2ZW50cy5LZXlDb2Rlcy5XSU5fS0VZOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGtleUNvZGUKICB9Cn07CnRhbGsubWVkaWEuVG9uZSA9IHtPTkU6IjEiLCBUV086IjIiLCBUSFJFRToiMyIsIEZPVVI6IjQiLCBGSVZFOiI1IiwgU0lYOiI2IiwgU0VWRU46IjciLCBFSUdIVDoiOCIsIE5JTkU6IjkiLCBTVEFSOiIqIiwgUE9VTkQ6IiMifTsKdGFsay5tZWRpYS5Ub25lLkRFTEFZID0gMjAwOwp0YWxrLm1lZGlhLlRvbmUuZ2V0QW5kQ2hlY2tEdG1mVG9uZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRvbmUkZ2V0QW5kQ2hlY2tEdG1mVG9uZSQoa2V5Q29kZSwgaXNTaGlmdCkgewogIHZhciB2YWx1ZSA9IG51bGw7CiAgaXNTaGlmdCB8fCAoa2V5Q29kZSA+PSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5aRVJPICYmIGtleUNvZGUgPD0gZ29vZy5ldmVudHMuS2V5Q29kZXMuTklORSAmJiAodmFsdWUgPSAiIiArIChrZXlDb2RlIC0gZ29vZy5ldmVudHMuS2V5Q29kZXMuWkVSTykpLCBrZXlDb2RlID49IGdvb2cuZXZlbnRzLktleUNvZGVzLk5VTV9aRVJPICYmIGtleUNvZGUgPD0gZ29vZy5ldmVudHMuS2V5Q29kZXMuTlVNX05JTkUgJiYgKHZhbHVlID0gIiIgKyAoa2V5Q29kZSAtIGdvb2cuZXZlbnRzLktleUNvZGVzLk5VTV9aRVJPKSkpOwogIGtleUNvZGUgPT0gZ29vZy5ldmVudHMuS2V5Q29kZXMuRUlHSFQgJiYgaXNTaGlmdCB8fCBrZXlDb2RlID09IGdvb2cuZXZlbnRzLktleUNvZGVzLk5VTV9NVUxUSVBMWSA/IHZhbHVlID0gdGFsay5tZWRpYS5Ub25lLlNUQVIgOiBrZXlDb2RlID09IGdvb2cuZXZlbnRzLktleUNvZGVzLlRIUkVFICYmIGlzU2hpZnQgJiYgKHZhbHVlID0gdGFsay5tZWRpYS5Ub25lLlBPVU5EKTsKICBnb29nLmV2ZW50cy5LZXlDb2Rlcy5BIDw9IGtleUNvZGUgJiYga2V5Q29kZSA8PSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5aICYmICh2YWx1ZSA9ICIyMjIzMzM0NDQ1NTU2NjY3Nzc3ODg4OTk5OTkiLmNoYXJBdChrZXlDb2RlIC0gZ29vZy5ldmVudHMuS2V5Q29kZXMuQSkpOwogIHJldHVybiB2YWx1ZQp9Owp0YWxrLm1lZGlhLlRvbmUuY29udmVydExldHRlcnNUb051bWJlcnMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUb25lJGNvbnZlcnRMZXR0ZXJzVG9OdW1iZXJzJChudW1iZXIpIHsKICBudW1iZXIgPSBudW1iZXIudG9Mb3dlckNhc2UoKTsKICBudW1iZXIgPSBudW1iZXIucmVwbGFjZSgvW2FiY10vZywgdGFsay5tZWRpYS5Ub25lLlRXTyk7CiAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UoL1tkZWZdL2csIHRhbGsubWVkaWEuVG9uZS5USFJFRSk7CiAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UoL1tnaGldL2csIHRhbGsubWVkaWEuVG9uZS5GT1VSKTsKICBudW1iZXIgPSBudW1iZXIucmVwbGFjZSgvW2prbF0vZywgdGFsay5tZWRpYS5Ub25lLkZJVkUpOwogIG51bWJlciA9IG51bWJlci5yZXBsYWNlKC9bbW5vXS9nLCB0YWxrLm1lZGlhLlRvbmUuU0lYKTsKICBudW1iZXIgPSBudW1iZXIucmVwbGFjZSgvW3BxcnNdL2csIHRhbGsubWVkaWEuVG9uZS5TRVZFTik7CiAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UoL1t0dXZdL2csIHRhbGsubWVkaWEuVG9uZS5FSUdIVCk7CiAgcmV0dXJuIG51bWJlciA9IG51bWJlci5yZXBsYWNlKC9bd3h5el0vZywgdGFsay5tZWRpYS5Ub25lLk5JTkUpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQoY2FsbGluZ1JlcXVpcmVtZW50cywgb3B0X2FsbG93Q2FsbEhvbGQpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuZmxhc2hEZXRlY3Rvcl8gPSBjYWxsaW5nUmVxdWlyZW1lbnRzLmdldEZsYXNoRGV0ZWN0b3IoKTsKICB0aGlzLnJlcXVpcmVtZW50c18gPSBjYWxsaW5nUmVxdWlyZW1lbnRzOwogIHRoaXMudW5zdGFydGVkQ2FsbHNfID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdGhpcy5hbGxvd0NhbGxIb2xkXyA9ICEhb3B0X2FsbG93Q2FsbEhvbGQ7CiAgdGhpcy5oZWxkQ2FsbHNfID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLmRldmljZVN0YXR1c18gPSBuZXcgdGFsay5tZWRpYS5EZXZpY2VTdGF0dXM7CiAgdGhpcy5zZXRPdXRnb2luZ0NhbGxUaW1lb3V0TXModGhpcy5vdXRnb2luZ0NhbGxUaW1lb3V0TXNfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuU0hBUkVfUkVTVUxULCB0aGlzLm9uU2hhcmVSZXN1bHRfKTsKICB0aGlzLmxvY2FsRGVzY3JpcHRpb25zXyA9IG5ldyBnb29nLnN0cnVjdHMuTWFwCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DYWxsTWFuYWdlciwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoInRhbGsubWVkaWEuQ2FsbE1hbmFnZXIiKTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUubG9jYWxOaWNrXyA9ICIiOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5sb2NhbFByZXZpZXdfID0gITE7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLm91dGdvaW5nQ2FsbFRpbWVvdXRNc18gPSA2RTQ7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLnBlbmRpbmdDbGVhbnVwVGltZW91dF8gPSAyNTA7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLnJlY29yZFRpbWVyXyA9IG51bGw7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuVkFEX1NXSVRDSF9USU1FT1VUXyA9IDFFMzsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5VTldSSVRBQkxFX01TXyA9IDNFMzsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5SRUNPUkRfVElNRU9VVF9NU18gPSA2MTAwOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5zc3JjR2VuZXJhdG9yXyA9IG5ldyB0YWxrLm1lZGlhLlNzcmNHZW5lcmF0b3I7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmppbmdsZU1zZ0NvbnZlcnRlcl8gPSBuZXcgdGFsay5tZWRpYS5KaW5nbGVNc2dDb252ZXJ0ZXI7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLnBhc3NUaHJvdWdoSm1pZGF0YV8gPSAhMDsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5ERUZBVUxUX0FVRElPX1NUUkVBTV9OQU1FXyA9ICJtYWluIGF1ZGlvIjsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5ERUZBVUxUX1ZJREVPX1NUUkVBTV9OQU1FXyA9ICJtYWluIHZpZGVvIjsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudCA9IHtORVdfQ0FMTDoibmMiLCBGQUlMRURfQ0FMTDoiZmMiLCBBQ1RJVkVfQ0FMTDoiYWMiLCBDQUxMX0VOREVEOiJlYyIsIElOQ09NSU5HX0pJTkdMRToiaWoiLCBPVVRHT0lOR19KSU5HTEU6Im9qIiwgSU5TVEFMTF9ORUVERUQ6ImluIiwgU1BFQUtFUl9DSEFOR0VEOiJzYyIsIFNIQVJFX05PVElGWToic24iLCBTSEFSRV9SRVNVTFQ6InNyIiwgU0hBUkVfV0lORE9XUzoic3ciLCBTSE9XX0FWQVRBUjoic2EiLCBTSE9XX1ZJREVPOiJzdiIsIFVQTE9BRF9MT0dfUkVTUE9OU0U6InVsciIsIEFERF9QQVJUSUNJUEFOVDoiYXAiLCBSRU1PVkVfUEFSVElDSVBBTlQ6InJwIiwgTUlDX01VVEU6Im1tIiwgQ0FNRVJBX01VVEU6ImNtIiwgSE9MRF9TVEFURToiaHMiLCBVUERBVEVfUFJFU086InVwIiwgU0NFTkVfU0VMRUNUX0NIQU5HRToic3NjIiwgU0hPV19QUkVTRU5URVI6InNwIiwgUkVDT1JEOiJyIiwgQVVESU9fSU5QVVRfTEVWRUxfQ0hBTkdFRDoiYWlsYyIsIApBVURJT19PVVRQVVRfTEVWRUxfQ0hBTkdFRDoiYW9sYyIsIFdBUk5JTkc6InciLCBKTUlEQVRBOiJqbWlkYXRhIiwgUExVR0lOX1dBUk5JTkc6ImZ3IiwgVFJTVEFURToidHJzdGF0ZSIsIFBBUlRJQ0lQQU5UU19WT0xVTUVfTEVWRUxfVVBEQVRFRDoicHYiLCBDSEVDS19DT05ORUNUSVZJVFk6ZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiY2hlY2tjb25uZWN0aXZpdHkiKX07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSW5zdGFsbE5lZWRlZFR5cGUgPSB7SU5TVEFMTF9QTFVHSU5fTkVFREVEOiJ0cGkiLCBJTlNUQUxMX0ZMQVNIX05FRURFRDoiZmkiLCBVUEdSQURFX0ZMQVNIX05FRURFRDoiZnUiLCBGVUxMU0NSRUVOX1VQR1JBREVfTkVFREVEOiJmcyJ9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkppbmdsZU1lc3NhZ2VfID0ge0lOSVRJQVRFOiJqbiIsIFNUQVJUOiJqc3RhcnQiLCBURVJNSU5BVEU6Imp0IiwgUlRQTUFQOiJqcnRwIiwgTE9DQUxfUlRQTUFQOiJqbHJ0cCIsIFVQREFURToianVwIiwgVFJBTlNQT1JUOiJqdHIiLCBBQ0NFUFQ6ImphIiwgSU5GTzoiamYiLCBBQ0s6ImphY2siLCBFTkNfQ09ORklHOiJqZWMiLCBTWU5DX0NBUEFCSUxJVElFUzoianN5bmMiLCBSRURJUkVDVDoianIifTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5QbHVnaW5TZXJ2ZXJNZXNzYWdlXyA9IHtqYzoxLCBqbWlkYXRhOjEsIGptaXN0YXJ0OjEsIGptaWVuZDoxfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZSA9IHtVU0VSX0VOREVEOjAsIERFQ0xJTkU6MSwgVElNRU9VVDoyLCBFUlJPUjozLCBGTFVURV9FTkRFRDo0LCBCVVNZOjUsIFVOS05PV046NiwgRkxVVEVfTk9UX0VOQUJMRUQ6NywgQ0xJRU5UX0dPTkU6OCwgQkxPQ0tFRDo5LCBDT05ORUNUSVZJVFlfTE9TVDoxMCwgUkVUUllJTkc6MTEsIFRJRV9CUkVBSzoxMiwgUExBWUVSX0VSUk9SOjEzLCBBRE1JTl9FTkRFRDoxNCwgRkFUQUxfUkVTUE9OU0U6MTUsIElOSVRJQVRFX0ZBSUxFRDoxNiwgVU5LTk9XTl9TRVNTSU9OOjE3LCBBTk9USEVSX0NMSUVOVF9BQ0NFUFRFRDoxOCwgSU5DT01QQVRJQkxFX1BBUkFNRVRFUlM6MTksIFNFQ1VSSVRZX0VSUk9SOjIwLCBNVUNfRFJPUE9VVDoyMSwgQ09NTVVOSUNBVElPTl9DSEFOTkVMOjIyLCBGQUlMRURfVFJBTlNQT1JUOjIzLCBOT19DQU5ESURBVEVTOjI0LCBTRVNTSU9OX0VYUElSRUQ6MjUsIFNFUlZFUl9HT05FOjI2LCBOT19DT05ORUNUSVZJVFk6MjcsIApJTlRFUk5BTF9TRVJWRVJfRVJST1I6MjgsIFVOREVGSU5FRF9DT05ESVRJT046MjksIFJFU09VUkNFX0NPTlNUUkFJTlQ6MzAsIE5FVFdPUktfR09ORTozMSwgQlJPV1NFUl9DSEFOTkVMX0ZBSUxFRDozMiwgQkFEX1JFUVVFU1Q6MzMsIFVORVhQRUNURURfQ09ERVBBVEg6MzQsIFBBWU1FTlRfUkVRVUlSRUQ6MzUsIEJST1dTRVJfTk9UX1JFU1BPTlNFOjEwMn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSW5pdGlhdGVDb250ZW50ID0ge0FMVF9KSUQ6ImFsdEppZCIsIE5JQ0s6Im5pY2sifTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5QbGF5U291bmRDb21tYW5kID0ge1NUT1A6MCwgUExBWToxLCBMT09QOjN9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlNvdW5kID0ge1JJTkc6dGFsay5tZWRpYS5UYWxrUGx1Z2luLlNvdW5kLlJJTkd9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmlzRXJyb3JDYXVzZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJGlzRXJyb3JDYXVzZSQoY2F1c2UpIHsKICBzd2l0Y2goY2F1c2UpIHsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5FUlJPUjoKICAgIDsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5DT05ORUNUSVZJVFlfTE9TVDoKICAgIDsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5CUk9XU0VSX05PVF9SRVNQT05TRToKICAgIDsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5QTEFZRVJfRVJST1I6CiAgICA7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRW5kQ2F1c2UuRkFUQUxfUkVTUE9OU0U6CiAgICA7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRW5kQ2F1c2UuSU5JVElBVEVfRkFJTEVEOgogICAgOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLlVOS05PV05fU0VTU0lPTjoKICAgIDsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5GQUlMRURfVFJBTlNQT1JUOgogICAgOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLlNFUlZFUl9HT05FOgogICAgOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLklOVEVSTkFMX1NFUlZFUl9FUlJPUjoKICAgIDsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5VTkRFRklORURfQ09ORElUSU9OOgogICAgOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLkJST1dTRVJfQ0hBTk5FTF9GQUlMRUQ6CiAgICA7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRW5kQ2F1c2UuQkFEX1JFUVVFU1Q6CiAgICA7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRW5kQ2F1c2UuVU5FWFBFQ1RFRF9DT0RFUEFUSDoKICAgICAgcmV0dXJuITA7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4hMQogIH0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5Mb2dDb21tZW50U2V2ZXJpdHkgPSB7Q09NTUVOVDowLCBXQVJOSU5HOjEsIEVSUk9SOjJ9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmludENvZGVUb0VuZENhdXNlXyA9IGdvb2cub2JqZWN0LnRyYW5zcG9zZSh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlKTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5OZXdDYWxsRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciROZXdDYWxsRXZlbnQkKGlzT3V0Z29pbmcsIGppZCwgc2Vzc2lvbklkLCBjYWxsVHlwZSkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5ORVdfQ0FMTCk7CiAgdGhpcy5pc091dGdvaW5nID0gaXNPdXRnb2luZzsKICB0aGlzLmppZCA9IGppZDsKICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKICB0aGlzLmNhbGxUeXBlID0gY2FsbFR5cGUKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLk5ld0NhbGxFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkZhaWxlZENhbGxFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJEZhaWxlZENhbGxFdmVudCQoaXNPdXRnb2luZywgamlkLCBjYWxsVHlwZSkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5GQUlMRURfQ0FMTCk7CiAgdGhpcy5pc091dGdvaW5nID0gaXNPdXRnb2luZzsKICB0aGlzLmppZCA9IGppZDsKICB0aGlzLmNhbGxUeXBlID0gY2FsbFR5cGUKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkZhaWxlZENhbGxFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkFjdGl2ZUNhbGxFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJEFjdGl2ZUNhbGxFdmVudCQoY2FsbCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5BQ1RJVkVfQ0FMTCk7CiAgdGhpcy5yZW1vdGVKaWRzID0gY2FsbC5yZW1vdGVKaWRzOwogIHRoaXMuc2Vzc2lvbklkID0gY2FsbC5zZXNzaW9uSWQ7CiAgdGhpcy5jYWxsVHlwZSA9IGNhbGwudHlwZQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQWN0aXZlQ2FsbEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbEVuZGVkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRDYWxsRW5kZWRFdmVudCQoY2F1c2UsIGlzUmVtb3RlLCBzZXNzaW9uSWQsIGNhbGwpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuQ0FMTF9FTkRFRCk7CiAgdGhpcy5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgdGhpcy5jYWxsID0gY2FsbAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbEVuZGVkRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5JbnN0YWxsTmVlZGVkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRJbnN0YWxsTmVlZGVkRXZlbnQkKGluc3RhbGxUeXBlLCBhdHRlbXB0ZWRDYWxsLCBqaWQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuSU5TVEFMTF9ORUVERUQpOwogIHRoaXMuamlkID0gamlkCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DYWxsTWFuYWdlci5JbnN0YWxsTmVlZGVkRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5TcGVha2VyQ2hhbmdlZEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkU3BlYWtlckNoYW5nZWRFdmVudCQocGFydGljaXBhbnQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuU1BFQUtFUl9DSEFOR0VEKTsKICB0aGlzLnBhcnRpY2lwYW50ID0gcGFydGljaXBhbnQKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlNwZWFrZXJDaGFuZ2VkRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5VcGxvYWRMb2dDb21wbGV0ZUV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkVXBsb2FkTG9nQ29tcGxldGVFdmVudCQoY2hhdEppZCwgaWQsIHN0YXR1cykgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5VUExPQURfTE9HX1JFU1BPTlNFKTsKICB0aGlzLmlkID0gaWQ7CiAgdGhpcy5zdGF0dXMgPSBzdGF0dXMKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlVwbG9hZExvZ0NvbXBsZXRlRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5TaG93UHJlc2VudGVyRmVlZEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkU2hvd1ByZXNlbnRlckZlZWRFdmVudCQobmljaywgc2hvdykgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5TSE9XX1BSRVNFTlRFUik7CiAgdGhpcy5uaWNrID0gbmljazsKICB0aGlzLnNob3cgPSBzaG93Cn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DYWxsTWFuYWdlci5TaG93UHJlc2VudGVyRmVlZEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU2NlbmVTZWxlY3RDaGFuZ2VFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJFNjZW5lU2VsZWN0Q2hhbmdlRXZlbnQkKGppZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5TQ0VORV9TRUxFQ1RfQ0hBTkdFKTsKICB0aGlzLmppZCA9IGppZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU2NlbmVTZWxlY3RDaGFuZ2VFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlByZXNlbnRhdGlvbkZlZWRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJFByZXNlbnRhdGlvbkZlZWRFdmVudCQoamlkLCB1cmwsIG9wdF9uYW1lKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LlVQREFURV9QUkVTTyk7CiAgdGhpcy5qaWQgPSBqaWQ7CiAgdGhpcy51cmwgPSB1cmw7CiAgdGhpcy5uYW1lID0gb3B0X25hbWUgfHwgIiIKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlByZXNlbnRhdGlvbkZlZWRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLk1pY011dGVFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJE1pY011dGVFdmVudCQoY2FsbEppZCwgbXV0ZWQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuTUlDX01VVEUpOwogIHRoaXMubXV0ZWQgPSBtdXRlZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuTWljTXV0ZUV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuUmVjb3JkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRSZWNvcmRFdmVudCQoY2FsbEppZCwgcmVjb3JkKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LlJFQ09SRCk7CiAgdGhpcy5yZWNvcmRpbmcgPSByZWNvcmQKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlJlY29yZEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FtZXJhTXV0ZUV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkQ2FtZXJhTXV0ZUV2ZW50JChtdXRlZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5DQU1FUkFfTVVURSk7CiAgdGhpcy5tdXRlZCA9IG11dGVkCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYW1lcmFNdXRlRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5Ib2xkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRIb2xkRXZlbnQkKGppZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5IT0xEX1NUQVRFKTsKICB0aGlzLmppZCA9IGppZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSG9sZEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU2hhcmVOb3RpZnlFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJFNoYXJlTm90aWZ5RXZlbnQkKCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5TSEFSRV9OT1RJRlkpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DYWxsTWFuYWdlci5TaGFyZU5vdGlmeUV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU2hhcmVSZXN1bHRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJFNoYXJlUmVzdWx0RXZlbnQkKGVycm9yQ29kZSkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5TSEFSRV9SRVNVTFQpOwogIHRoaXMuZXJyb3JDb2RlID0gZXJyb3JDb2RlCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DYWxsTWFuYWdlci5TaGFyZVJlc3VsdEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU2hhcmVSZXN1bHRFdmVudC5wcm90b3R5cGUuaXNTdWNjZXNzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkU2hhcmVSZXN1bHRFdmVudCQkaXNTdWNjZXNzJCgpIHsKICByZXR1cm4gMCA9PSB0aGlzLmVycm9yQ29kZQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlNoYXJlUmVzdWx0RXZlbnQucHJvdG90eXBlLmlzRXJyb3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRTaGFyZVJlc3VsdEV2ZW50JCRpc0Vycm9yJCgpIHsKICByZXR1cm4gMSA8IHRoaXMuZXJyb3JDb2RlCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU2hhcmVXaW5kb3dzRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRTaGFyZVdpbmRvd3NFdmVudCQoKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LlNIQVJFX1dJTkRPV1MpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DYWxsTWFuYWdlci5TaGFyZVdpbmRvd3NFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlNob3dBdmF0YXJFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJFNob3dBdmF0YXJFdmVudCQoKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LlNIT1dfQVZBVEFSKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU2hvd0F2YXRhckV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU2hvd1ZpZGVvRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRTaG93VmlkZW9FdmVudCQoc3NyYywgc2Vzc2lvbklkKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LlNIT1dfVklERU8pOwogIHRoaXMuc3NyYyA9IHNzcmM7CiAgdGhpcy5zZXNzaW9uSWQgPSBzZXNzaW9uSWQKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlNob3dWaWRlb0V2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQWRkUGFydGljaXBhbnRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJEFkZFBhcnRpY2lwYW50RXZlbnQkKHNlc3Npb25JZCwgcGFydGljaXBhbnQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuQUREX1BBUlRJQ0lQQU5UKTsKICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZDsKICB0aGlzLnBhcnRpY2lwYW50ID0gcGFydGljaXBhbnQKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkFkZFBhcnRpY2lwYW50RXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5SZW1vdmVQYXJ0aWNpcGFudEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkUmVtb3ZlUGFydGljaXBhbnRFdmVudCQoc3NyYywgc2Vzc2lvbklkLCBwYXJ0aWNpcGFudCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5SRU1PVkVfUEFSVElDSVBBTlQpOwogIHRoaXMuc3NyYyA9IHNzcmM7CiAgdGhpcy5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgdGhpcy5wYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50Cn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DYWxsTWFuYWdlci5SZW1vdmVQYXJ0aWNpcGFudEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQXVkaW9JbnB1dEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkQXVkaW9JbnB1dEV2ZW50JChsZXZlbCwgc2Vzc2lvbklkKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LkFVRElPX0lOUFVUX0xFVkVMX0NIQU5HRUQpOwogIHRoaXMubGV2ZWwgPSBsZXZlbDsKICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQXVkaW9JbnB1dEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQXVkaW9PdXRwdXRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJEF1ZGlvT3V0cHV0RXZlbnQkKGxldmVsLCBzZXNzaW9uSWQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuQVVESU9fT1VUUFVUX0xFVkVMX0NIQU5HRUQpOwogIHRoaXMubGV2ZWwgPSBsZXZlbDsKICB0aGlzLnNlc3Npb25JZCA9IHNlc3Npb25JZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQXVkaW9PdXRwdXRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkptaWRhdGFFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJEptaWRhdGFFdmVudCQobXNnKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LkpNSURBVEEpOwogIHRoaXMuZGF0YSA9IG5ldyB0YWxrLm1lZGlhLk1lZGlhSW5mbyhtc2cpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DYWxsTWFuYWdlci5KbWlkYXRhRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5Db25uZWN0aXZpdHlDaGVja1Jlc3VsdEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHRFdmVudCQobXNnKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LkNIRUNLX0NPTk5FQ1RJVklUWSk7CiAgdGhpcy5kYXRhID0gbmV3IHRhbGsubWVkaWEuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQobXNnKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlBsdWdpbldhcm5pbmdFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJFBsdWdpbldhcm5pbmdFdmVudCQobXNnKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LlBMVUdJTl9XQVJOSU5HKTsKICB0aGlzLm1zZyA9IG1zZwp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuUGx1Z2luV2FybmluZ0V2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuVHJTdGF0ZUV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkVHJTdGF0ZUV2ZW50JChtc2cpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuVFJTVEFURSk7CiAgdGhpcy5tc2cgPSBtc2cKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlRyU3RhdGVFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5hZGRUb0xvZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRhZGRUb0xvZyQoY29tbWVudCwgb3B0X3Nldiwgb3B0X2V4Y2VwdGlvbikgewogIHZhciB0ZXh0ID0gIiI7CiAgc3dpdGNoKG9wdF9zZXYpIHsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5Mb2dDb21tZW50U2V2ZXJpdHkuRVJST1I6CiAgICAgIHRleHQgPSBnb29nLmpzb24uc2VyaWFsaXplKFsiZXJyb3IiLCBjb21tZW50XSk7CiAgICAgIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy5zZXZlcmUoIkFkZGluZyBlcnJvciB0byBsb2c6ICIgKyB0ZXh0LCBvcHRfZXhjZXB0aW9uKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuTG9nQ29tbWVudFNldmVyaXR5LldBUk5JTkc6CiAgICAgIHRleHQgPSBnb29nLmpzb24uc2VyaWFsaXplKFsid2FybmluZyIsIGNvbW1lbnRdKTsKICAgICAgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5sb2dnZXJfLndhcm5pbmcoIkFkZGluZyB3YXJuaW5nIHRvIGxvZzogIiArIHRleHQsIG9wdF9leGNlcHRpb24pOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRleHQgPSBnb29nLmpzb24uc2VyaWFsaXplKFsiY29tbWVudCIsIGNvbW1lbnRdKSwgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5sb2dnZXJfLmluZm8oIkFkZGluZyBjb21tZW50IHRvIGxvZzogIiArIHRleHQsIG9wdF9leGNlcHRpb24pCiAgfQogIHRyeSB7CiAgICB0aGlzLnRhbGtQbHVnaW5fLnNlbmRNc2codGV4dCkKICB9Y2F0Y2goZSkgewogICAgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5sb2dnZXJfLmluZm8oIkNvdWxkIG5vdCBzZW5kIGxvZyB0byB0YWxrIHBsdWdpbi4gUGx1Z2luIGlzOiAiICsgdGhpcy50YWxrUGx1Z2luXywgZSkKICB9Cn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLnN0YXJ0Q2FsbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRzdGFydENhbGwkKGppZCwgY2FsbFR5cGUpIHsKICBpZighdGhpcy5jaGVja0Nhbk1ha2VDYWxsKGppZCwgY2FsbFR5cGUpKSB7CiAgICByZXR1cm4hMQogIH0KICB0aGlzLmhhc0FjdGl2ZUNhbGwoKSAmJiB0aGlzLmhvbGRDYWxsKCk7CiAgdmFyIG5ld0NhbGwgPSBuZXcgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsKFtqaWRdLCBjYWxsVHlwZSk7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLk5ld0NhbGxFdmVudCghMCwgamlkLCBuZXdDYWxsLnNlc3Npb25JZCwgY2FsbFR5cGUpKTsKICBuZXdDYWxsLnN0YXRlID0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLlN0YXRlLk9VVEdPSU5HX1JJTkc7CiAgbmV3Q2FsbC5pc091dGJvdW5kID0gITA7CiAgdGhpcy5jYWxsU3RhcnRUaW1lcl8uc3RhcnQoKTsKICB0aGlzLmFjdGl2ZUNhbGxfID0gbmV3Q2FsbDsKICB2YXIgZmx1dGVUeXBlU3RyaW5nOwogIHN3aXRjaChjYWxsVHlwZSkgewogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxUeXBlLlZPSUNFOgogICAgOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxUeXBlLlZPSUNFTUFJTDoKICAgICAgZmx1dGVUeXBlU3RyaW5nID0gImEiOwogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsVHlwZS5WSURFTzoKICAgICAgZmx1dGVUeXBlU3RyaW5nID0gInYiOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmxvZ2dlcl8uc2V2ZXJlKCJUcnlpbmcgdG8gaW5pdGlhdGUgdW5zdXBwb3J0ZWQgY2FsbCB0eXBlIiksICEwCiAgfQogIHZhciBqaW5nbGVUeXBlU3RyaW5nOwogIHN3aXRjaChjYWxsVHlwZSkgewogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxUeXBlLlZPSUNFOgogICAgICBqaW5nbGVUeXBlU3RyaW5nID0gImEiOwogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsVHlwZS5WT0lDRU1BSUw6CiAgICAgIGppbmdsZVR5cGVTdHJpbmcgPSAibSI7CiAgICAgIGJyZWFrOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxUeXBlLlZJREVPOgogICAgICBqaW5nbGVUeXBlU3RyaW5nID0gInYiCiAgfQogIHZhciBsb2NhbERlc2NyaXB0aW9uID0gdGhpcy5jcmVhdGVMb2NhbERlc2NyaXB0aW9uXyhuZXdDYWxsKTsKICB0aGlzLnNlbmRKaW5nbGVNc2coWyJqbiIsIHRoaXMuYWN0aXZlQ2FsbF8ucmVtb3RlSmlkc1swXSwgdGhpcy5hY3RpdmVDYWxsXy5zZXNzaW9uSWQsIGppbmdsZVR5cGVTdHJpbmcsICJzIiwgbG9jYWxEZXNjcmlwdGlvbl0pOwogIHRoaXMuc2VuZEZsdXRlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUoWyJqbiIsIHRoaXMuYWN0aXZlQ2FsbF8ucmVtb3RlSmlkc1swXSwgdGhpcy5hY3RpdmVDYWxsXy5zZXNzaW9uSWQsIGZsdXRlVHlwZVN0cmluZywgInMiXSkpOwogIHRoaXMuc2VuZEVuYWJsZUR1bXBSdHBIZWFkZXJNc2dfKGNhbGxUeXBlKTsKICByZXR1cm4hMAp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5jcmVhdGVMb2NhbERlc2NyaXB0aW9uXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRjcmVhdGVMb2NhbERlc2NyaXB0aW9uXyQoY2FsbCkgewogIHZhciBkZXNjcmlwdGlvbiA9IHt9OwogIGlmKGNhbGwudHlwZSA9PSB0YWxrLm1lZGlhLkNhbGxUeXBlLlZPSUNFIHx8IGNhbGwudHlwZSA9PSB0YWxrLm1lZGlhLkNhbGxUeXBlLlZJREVPKSB7CiAgICBkZXNjcmlwdGlvbi5hID0ge30sIGRlc2NyaXB0aW9uLmEucGFydGlhbCA9ICEwLCBkZXNjcmlwdGlvbi5hLnN0cmVhbXMgPSB0aGlzLmNyZWF0ZUxvY2FsQXVkaW9TdHJlYW1zXyhjYWxsKQogIH0KICBjYWxsLnR5cGUgPT0gdGFsay5tZWRpYS5DYWxsVHlwZS5WSURFTyAmJiAoZGVzY3JpcHRpb24udiA9IHt9LCBkZXNjcmlwdGlvbi52LnBhcnRpYWwgPSAhMCwgZGVzY3JpcHRpb24udi5zdHJlYW1zID0gdGhpcy5jcmVhdGVMb2NhbFZpZGVvU3RyZWFtc18oY2FsbCkpOwogIHRoaXMubG9jYWxEZXNjcmlwdGlvbnNfLnNldChjYWxsLnNlc3Npb25JZCwgZGVzY3JpcHRpb24pOwogIHJldHVybiBkZXNjcmlwdGlvbgp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5jcmVhdGVMb2NhbEF1ZGlvU3RyZWFtc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkY3JlYXRlTG9jYWxBdWRpb1N0cmVhbXNfJCgpIHsKICB2YXIgc3NyYyA9IHRoaXMuc3NyY0dlbmVyYXRvcl8uY3JlYXRlU3NyYygpLCBzdHJlYW0gPSB7fTsKICBzdHJlYW0ubmFtZSA9IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuREVGQVVMVF9BVURJT19TVFJFQU1fTkFNRV87CiAgc3RyZWFtLnNzcmNzID0gW3NzcmNdOwogIHJldHVybltzdHJlYW1dCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmNyZWF0ZUxvY2FsVmlkZW9TdHJlYW1zXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRjcmVhdGVMb2NhbFZpZGVvU3RyZWFtc18kKCkgewogIHZhciBzc3JjID0gdGhpcy5zc3JjR2VuZXJhdG9yXy5jcmVhdGVTc3JjKCksIHN0cmVhbSA9IHt9OwogIHN0cmVhbS5uYW1lID0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5ERUZBVUxUX1ZJREVPX1NUUkVBTV9OQU1FXzsKICBzdHJlYW0uc3NyY3MgPSBbc3NyY107CiAgcmV0dXJuW3N0cmVhbV0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuc2VuZEVuYWJsZUR1bXBSdHBIZWFkZXJNc2dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJHNlbmRFbmFibGVEdW1wUnRwSGVhZGVyTXNnXyQoY2FsbFR5cGUpIHsKICBpZih0aGlzLmR1bXBSdHBIZWFkZXJfICYmIHRoaXMudGFsa1BsdWdpbl8gJiYgdGhpcy50YWxrUGx1Z2luXy5zdXBwb3J0TWVkaWFncm9rTGl0ZSgpKSB7CiAgICB2YXIgbWVkaWFUeXBlU3RyaW5nOwogICAgc3dpdGNoKGNhbGxUeXBlKSB7CiAgICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsVHlwZS5WT0lDRToKICAgICAgICBtZWRpYVR5cGVTdHJpbmcgPSAiYSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsVHlwZS5WSURFTzoKICAgICAgICBtZWRpYVR5cGVTdHJpbmcgPSAiYXYiOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybgogICAgfQogICAgdGhpcy5zZW5kRmx1dGVNc2coZ29vZy5qc29uLnNlcmlhbGl6ZShbImRlYnVnIiwgdGhpcy5hY3RpdmVDYWxsXy5yZW1vdGVKaWRzWzBdLCB0aGlzLmFjdGl2ZUNhbGxfLnNlc3Npb25JZCwgIm1nbCIsIHt0eXBlOm1lZGlhVHlwZVN0cmluZywgZGlyZWN0aW9uOiJycyJ9XSkpCiAgfQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5zZW5kRGlzYWJsZUR1bXBSdHBIZWFkZXJNc2dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJHNlbmREaXNhYmxlRHVtcFJ0cEhlYWRlck1zZ18kKGNhbGwpIHsKICB0aGlzLmR1bXBSdHBIZWFkZXJfICYmIHRoaXMudGFsa1BsdWdpbl8gJiYgdGhpcy50YWxrUGx1Z2luXy5zdXBwb3J0TWVkaWFncm9rTGl0ZSgpICYmIHRoaXMuc2VuZEZsdXRlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUoWyJkZWJ1ZyIsIGNhbGwucmVtb3RlSmlkc1swXSwgY2FsbC5zZXNzaW9uSWQsICJtZ2wiLCB7dHlwZToiIiwgZGlyZWN0aW9uOiIifV0pKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5hY2NlcHRDYWxsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGFjY2VwdENhbGwkKGppZCkgewogIHZhciBjYWxsID0gdGhpcy5oZWxkQ2FsbHNfLmdldChhcHBzLmNoYXQuY29yZS5KaWQuYmFyZVBhcnQoamlkKSk7CiAgaWYoIWNhbGwgfHwgY2FsbC5zdGF0ZSAhPSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNhbGwuU3RhdGUuSU5DT01JTkdfUklORykgewogICAgcmV0dXJuIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy53YXJuaW5nKCJObyBjYWxsIGZvciAiICsgamlkKSwgITEKICB9CiAgdGhpcy5oYXNBY3RpdmVDYWxsKCkgJiYgdGhpcy5ob2xkQ2FsbCgpOwogIHZhciBsb2NhbERlc2NyaXB0aW9uID0gdGhpcy5sb2NhbERlc2NyaXB0aW9uc18uZ2V0KGNhbGwuc2Vzc2lvbklkKTsKICBpZighZ29vZy5pc0RlZkFuZE5vdE51bGwobG9jYWxEZXNjcmlwdGlvbikpIHsKICAgIHJldHVybiB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmxvZ2dlcl8ud2FybmluZygibm8gbG9jYWwgZGVzY3JpcHRpb24gZm9yICIgKyBjYWxsLnNlc3Npb25JZCksICExCiAgfQogIHZhciBqaW5nbGVNc2cgPSBbImphIiwgY2FsbC5yZW1vdGVKaWRzWzBdLCBjYWxsLnNlc3Npb25JZCwgbG9jYWxEZXNjcmlwdGlvbl07CiAgdGhpcy5zZW5kSmluZ2xlTXNnKGppbmdsZU1zZyk7CiAgdmFyIGZsdXRlTXNnID0gamluZ2xlTXNnLnNsaWNlKDAsIDMpOwogIHRoaXMuc2VuZEZsdXRlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUoZmx1dGVNc2cpKTsKICBjYWxsLnN0YXRlID0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLlN0YXRlLkFDVElWRV9DQUxMOwogIHRoaXMuaGVsZENhbGxzXy5yZW1vdmUoYXBwcy5jaGF0LmNvcmUuSmlkLmJhcmVQYXJ0KGppZCkpOwogIHRoaXMuYWN0aXZlQ2FsbF8gPSBjYWxsOwogIHZhciBhY3RpdmVDYWxsID0gdGhpcy5nZXRBY3RpdmVDYWxsKCk7CiAgZ29vZy5pc0RlZkFuZE5vdE51bGwoYWN0aXZlQ2FsbCkgJiYgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkFjdGl2ZUNhbGxFdmVudChhY3RpdmVDYWxsLCAhMSkpOwogIHJldHVybiEwCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmdldENhbGxpbmdSZXF1aXJlbWVudHMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkZ2V0Q2FsbGluZ1JlcXVpcmVtZW50cyQoKSB7CiAgcmV0dXJuIHRoaXMucmVxdWlyZW1lbnRzXwp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5jaGVja0Nhbk1ha2VDYWxsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGNoZWNrQ2FuTWFrZUNhbGwkKGppZCwgY2FsbFR5cGUpIHsKICB2YXIgZXJyb3JUeXBlID0gdGhpcy5nZXRJbnN0YWxsRXJyb3JUeXBlKCk7CiAgaWYoZXJyb3JUeXBlKSB7CiAgICB2YXIgaXNWaWRlbyA9IGNhbGxUeXBlID09IHRhbGsubWVkaWEuQ2FsbFR5cGUuVklERU87CiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSW5zdGFsbE5lZWRlZEV2ZW50KGVycm9yVHlwZSwgITAsIGppZCwgaXNWaWRlbykpOwogICAgcmV0dXJuITEKICB9CiAgcmV0dXJuIXRoaXMuY2FuTWFrZU5ld0NhbGxXaXRoKGppZCkgPyAodGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkZhaWxlZENhbGxFdmVudCghMCwgamlkLCBjYWxsVHlwZSkpLCAhMSkgOiAhMAp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5nZXRJbnN0YWxsRXJyb3JUeXBlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGdldEluc3RhbGxFcnJvclR5cGUkKCkgewogIGlmKHRoaXMuaXNGbGFzaFJlcXVpcmVkKCkpIHsKICAgIGlmKCF0aGlzLmZsYXNoRGV0ZWN0b3JfLmhhc0ZsYXNoSW5zdGFsbGVkKCkpIHsKICAgICAgcmV0dXJuIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSW5zdGFsbE5lZWRlZFR5cGUuSU5TVEFMTF9GTEFTSF9ORUVERUQKICAgIH0KICAgIGlmKCF0aGlzLmZsYXNoRGV0ZWN0b3JfLmhhc1JlcXVpcmVkRmxhc2hWZXJzaW9uKCkpIHsKICAgICAgcmV0dXJuIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSW5zdGFsbE5lZWRlZFR5cGUuVVBHUkFERV9GTEFTSF9ORUVERUQKICAgIH0KICB9CiAgcmV0dXJuIXRoaXMuaXNUYWxrUGx1Z2luRW5hYmxlZCgpID8gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5JbnN0YWxsTmVlZGVkVHlwZS5JTlNUQUxMX1BMVUdJTl9ORUVERUQgOiBudWxsCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmhhc0NhbWVyYUluc3RhbGxlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRoYXNDYW1lcmFJbnN0YWxsZWQkKCkgewogIHJldHVybiB0aGlzLnRhbGtQbHVnaW5fID8gdGhpcy50YWxrUGx1Z2luXy5oYXNDYW1lcmFJbnN0YWxsZWQoKSA6ICExCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmhhc0F1ZGlvTWljQ2FwYWJpbGl0aWVzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGhhc0F1ZGlvTWljQ2FwYWJpbGl0aWVzJCgpIHsKICByZXR1cm4gZ29vZy5pc0RlZih0aGlzLnRhbGtQbHVnaW5fKSAmJiB0aGlzLnRhbGtQbHVnaW5fLmhhc0F1ZGlvTWljQ2FwYWJpbGl0aWVzKCkKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuaGFzQXVkaW9TcGVha2VyQ2FwYWJpbGl0aWVzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGhhc0F1ZGlvU3BlYWtlckNhcGFiaWxpdGllcyQoKSB7CiAgcmV0dXJuIGdvb2cuaXNEZWYodGhpcy50YWxrUGx1Z2luXykgJiYgdGhpcy50YWxrUGx1Z2luXy5oYXNBdWRpb1NwZWFrZXJDYXBhYmlsaXRpZXMoKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5zZW5kUGVuZGluZ0R0bWZzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRzZW5kUGVuZGluZ0R0bWZzXyQob3B0X2NhbGwpIHsKICB2YXIgY2FsbCA9IG9wdF9jYWxsIHx8IHRoaXMuYWN0aXZlQ2FsbF8sIG1zZzsKICBpZihjYWxsICYmIGNhbGwucGVuZGluZ0R0bWZNZXNzYWdlc3MubGVuZ3RoKSB7CiAgICBmb3IoO21zZyA9IGNhbGwucGVuZGluZ0R0bWZNZXNzYWdlc3Muc2hpZnQoKTspIHsKICAgICAgdGhpcy50YWxrUGx1Z2luXy5zZW5kTXNnKG1zZykKICAgIH0KICB9Cn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmFsbG93Q2FsbEhvbGQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkYWxsb3dDYWxsSG9sZCQoKSB7CiAgcmV0dXJuIHRoaXMuYWxsb3dDYWxsSG9sZF8KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuaG9sZENhbGwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkaG9sZENhbGwkKCkgewogIGlmKHRoaXMuYWN0aXZlQ2FsbF8pIHsKICAgIGlmKHRoaXMuYWxsb3dDYWxsSG9sZCgpKSB7CiAgICAgIHRoaXMuc2VuZEhvbGRUb1BsdWdpbl8odGhpcy5hY3RpdmVDYWxsXywgITApOwogICAgICB2YXIgamlkID0gYXBwcy5jaGF0LmNvcmUuSmlkLmJhcmVQYXJ0KHRoaXMuYWN0aXZlQ2FsbF8ucmVtb3RlSmlkc1swXSk7CiAgICAgIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy5pbmZvKCJIb2xkIGNhbGwgd2l0aCAiICsgamlkKTsKICAgICAgdGhpcy5hY3RpdmVDYWxsXy5zdGF0ZSA9IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5TdGF0ZS5DQUxMX09OX0hPTEQ7CiAgICAgIHRoaXMuaGVsZENhbGxzXy5zZXQoamlkLCB0aGlzLmFjdGl2ZUNhbGxfKTsKICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlQ2FsbF87CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5Ib2xkRXZlbnQoamlkKSkKICAgIH1lbHNlIHsKICAgICAgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5sb2dnZXJfLnNldmVyZSgiQXR0ZW1wdGluZyB0byBob2xkIGNhbGwgd2hlbiBub3QgYWxsb3dlZC4iKQogICAgfQogIH1lbHNlIHsKICAgIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy5zZXZlcmUoIkF0dGVtcHRpbmcgdG8gaG9sZCBjYWxsIHdpdGggbm8gYWN0aXZlIGNhbGwuIikKICB9Cn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLnNlbmRIb2xkVG9QbHVnaW5fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJHNlbmRIb2xkVG9QbHVnaW5fJChjYWxsLCBpc0hlbGQpIHsKICB2YXIgY29tbWFuZCA9IGlzSGVsZCA/IHRhbGsubWVkaWEuVGFsa1BsdWdpbi5Db21tYW5kLkxPU0VfQ0FMTF9GT0NVUyA6IHRhbGsubWVkaWEuVGFsa1BsdWdpbi5Db21tYW5kLlNFVF9DQUxMX0ZPQ1VTOwogIHRoaXMudGFsa1BsdWdpbl8uc2VuZE1zZyhnb29nLmpzb24uc2VyaWFsaXplKFtjb21tYW5kLCBjYWxsLnJlbW90ZUppZHNbMF0sIGNhbGwuc2Vzc2lvbklkXSkpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmVuZENhbGwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkZW5kQ2FsbCQob3B0X2NhdXNlLCBvcHRfcmVtb3RlSmlkLCBvcHRfc2Vzc2lvbklkLCBvcHRfZGVidWdJbmZvKSB7CiAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwob3B0X2NhdXNlKSAmJiBvcHRfY2F1c2UgPT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5CVVNZICYmIGdvb2cuaXNEZWZBbmROb3ROdWxsKG9wdF9yZW1vdGVKaWQpICYmIGdvb2cuaXNEZWZBbmROb3ROdWxsKG9wdF9zZXNzaW9uSWQpKSB7CiAgICB2YXIgY2FsbCA9IHtyZW1vdGVKaWRzOltvcHRfcmVtb3RlSmlkXSwgc2Vzc2lvbklkOm9wdF9zZXNzaW9uSWR9OwogICAgdGhpcy5zZW5kVGVybWluYXRlXyhjYWxsLCBvcHRfY2F1c2UsIG9wdF9kZWJ1Z0luZm8pCiAgfWVsc2UgewogICAgKGNhbGwgPSB0aGlzLmZpbmRBbmRSZW1vdmVDYWxsXyhvcHRfcmVtb3RlSmlkLCBvcHRfc2Vzc2lvbklkKSkgPyB0aGlzLmRvRW5kQ2FsbF8oY2FsbCwgb3B0X2NhdXNlIHx8IHRoaXMuZGV0ZXJtaW5lRW5kQ2F1c2VfKGNhbGwpLCBvcHRfZGVidWdJbmZvIHx8ICJDYWxsTWFuYWdlci5kZXRlcm1pbmVFbmRDYXVzZV8iKSA6IGdvb2cuaXNEZWZBbmROb3ROdWxsKG9wdF9yZW1vdGVKaWQpID8gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5sb2dnZXJfLndhcm5pbmcoIlRyeWluZyB0byBlbmQgY2FsbCB3aXRoIEpJRCAiICsgb3B0X3JlbW90ZUppZCArICIgYnV0IG5vIHN1Y2ggY2FsbCBleGlzdHMiKSA6IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy53YXJuaW5nKCJUcnlpbmcgdG8gZW5kIGNhbGwsIGJ1dCBubyBhY3RpdmUgY2FsbCIpCiAgfQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5lbmRBbGxDYWxscyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRlbmRBbGxDYWxscyQob3B0X2NhdXNlKSB7CiAgdGhpcy5oYXNBY3RpdmVDYWxsKCkgJiYgdGhpcy5lbmRDYWxsKG9wdF9jYXVzZSk7CiAgZm9yKHZhciBoZWxkSmlkcyA9IHRoaXMuaGVsZENhbGxzXy5nZXRLZXlzKCksIGkgPSAwO2kgPCBoZWxkSmlkcy5sZW5ndGg7aSsrKSB7CiAgICB0aGlzLmVuZENhbGwob3B0X2NhdXNlLCBoZWxkSmlkc1tpXSkKICB9Cn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmZpbmRBbmRSZW1vdmVDYWxsXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRmaW5kQW5kUmVtb3ZlQ2FsbF8kKG9wdF9qaWQsIG9wdF9zZXNzaW9uSWQpIHsKICB2YXIgY2FsbDsKICAoY2FsbCA9IG9wdF9zZXNzaW9uSWQgPyB0aGlzLmZpbmRDYWxsQnlTZXNzaW9uSWRfKG9wdF9zZXNzaW9uSWQpIDogdGhpcy5maW5kQ2FsbChvcHRfamlkKSkgJiYgKGNhbGwgPT0gdGhpcy5hY3RpdmVDYWxsXyA/IGRlbGV0ZSB0aGlzLmFjdGl2ZUNhbGxfIDogb3B0X2ppZCAmJiB0aGlzLmhlbGRDYWxsc18ucmVtb3ZlKGFwcHMuY2hhdC5jb3JlLkppZC5iYXJlUGFydChvcHRfamlkKSkpOwogIHJldHVybiBjYWxsCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmZpbmRDYWxsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGZpbmRDYWxsJChvcHRfamlkKSB7CiAgcmV0dXJuIWdvb2cuaXNEZWZBbmROb3ROdWxsKG9wdF9qaWQpIHx8IHRoaXMuYWN0aXZlQ2FsbF8gJiYgdGhpcy5hY3RpdmVDYWxsXy5pc1dpdGgob3B0X2ppZCkgPyB0aGlzLmFjdGl2ZUNhbGxfIDogdGhpcy5oZWxkQ2FsbHNfLmdldChhcHBzLmNoYXQuY29yZS5KaWQuYmFyZVBhcnQob3B0X2ppZCkpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmZpbmRDYWxsQnlTZXNzaW9uSWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGZpbmRDYWxsQnlTZXNzaW9uSWRfJChzZXNzaW9uSWQpIHsKICBpZih0aGlzLmhhc0FjdGl2ZUNhbGwoKSAmJiB0aGlzLmFjdGl2ZUNhbGxfLnNlc3Npb25JZCA9PSBzZXNzaW9uSWQpIHsKICAgIHJldHVybiB0aGlzLmFjdGl2ZUNhbGxfCiAgfQogIGZvcih2YXIgaGVsZENhbGxzID0gdGhpcy5oZWxkQ2FsbHNfLmdldFZhbHVlcygpLCBpID0gMDtpIDwgaGVsZENhbGxzLmxlbmd0aDtpKyspIHsKICAgIGlmKGhlbGRDYWxsc1tpXS5zZXNzaW9uSWQgPT0gc2Vzc2lvbklkKSB7CiAgICAgIHJldHVybiBoZWxkQ2FsbHNbaV0KICAgIH0KICB9CiAgcmV0dXJuIG51bGwKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuZG9FbmRDYWxsXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRkb0VuZENhbGxfJChjYWxsLCBjYXVzZSwgb3B0X2RlYnVnSW5mbykgewogIGNhbGwuaXNTY3JlZW5jYXN0aW5nICYmIHRoaXMuc3RvcFNjcmVlbmNhc3QoY2FsbCk7CiAgdGhpcy5zZW5kVGVybWluYXRlXyhjYWxsLCBjYXVzZSwgb3B0X2RlYnVnSW5mbyk7CiAgdGhpcy5oYW5kbGVUZXJtaW5hdGVfKGNhbGwsICExLCBjYXVzZSwgb3B0X2RlYnVnSW5mbykKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuc2VuZFRlcm1pbmF0ZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkc2VuZFRlcm1pbmF0ZV8kKGNhbGwsIGNhdXNlLCBvcHRfZGVidWdJbmZvKSB7CiAgdGhpcy51bnN0YXJ0ZWRDYWxsc18ucmVtb3ZlKGNhbGwuc2Vzc2lvbklkKTsKICB2YXIgdGVybWluYXRlTXNnID0gW3RhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSmluZ2xlTWVzc2FnZV8uVEVSTUlOQVRFLCBjYWxsLnJlbW90ZUppZHNbMF0sIGNhbGwuc2Vzc2lvbklkLCBjYXVzZV07CiAgb3B0X2RlYnVnSW5mbyAmJiB0ZXJtaW5hdGVNc2cucHVzaChvcHRfZGVidWdJbmZvKTsKICB0aGlzLnNlbmRKaW5nbGVNc2codGVybWluYXRlTXNnKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5jbGVhclRpbWVvdXRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGNsZWFyVGltZW91dF8kKCkgewogIHRoaXMuY2FsbFN0YXJ0VGltZXJfLnN0b3AoKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5kZXRlcm1pbmVFbmRDYXVzZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkZGV0ZXJtaW5lRW5kQ2F1c2VfJChjYWxsKSB7CiAgaWYoY2FsbCkgewogICAgdmFyIHRpbWUgPSBjYWxsLmxhc3RXcml0YWJsZVRpbWUoKTsKICAgIGlmKC0xID09IHRpbWUpIHsKICAgICAgcmV0dXJuIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRW5kQ2F1c2UuTk9fQ09OTkVDVElWSVRZCiAgICB9CiAgICBpZih0aW1lICsgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5VTldSSVRBQkxFX01TXyA8PSBnb29nLm5vdygpKSB7CiAgICAgIHJldHVybiB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLkNPTk5FQ1RJVklUWV9MT1NUCiAgICB9CiAgfQogIHJldHVybiB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLlVTRVJfRU5ERUQKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuc2VuZEppbmdsZU1zZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRzZW5kSmluZ2xlTXNnJChqaW5nbGVNc2cpIHsKICAic3RyaW5nIiA9PSB0eXBlb2YgamluZ2xlTXNnICYmIChqaW5nbGVNc2cgPSBnb29nLmpzb24ucGFyc2UoamluZ2xlTXNnKSk7CiAgdmFyIGNhbGwgPSB0aGlzLmZpbmRDYWxsQnlTZXNzaW9uSWRfKGppbmdsZU1zZ1syXSk7CiAgY2FsbCAmJiAxID09IGNhbGwucmVtb3RlSmlkcy5sZW5ndGggJiYgKGppbmdsZU1zZ1sxXSA9IGNhbGwucmVtb3RlSmlkc1swXSk7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxFdmVudCh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50Lk9VVEdPSU5HX0pJTkdMRSwgZ29vZy5qc29uLnNlcmlhbGl6ZShqaW5nbGVNc2cpKSkKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuZ2V0Rmx1dGVWZXJzaW9uSW5mbyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRnZXRGbHV0ZVZlcnNpb25JbmZvJCgpIHsKICByZXR1cm4gdGhpcy50YWxrUGx1Z2luXyA/IHRoaXMudGFsa1BsdWdpbl8uZ2V0Rmx1dGVWZXJzaW9uSW5mb1N0cigpIDogbnVsbAp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5zZW5kRmx1dGVNc2cgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkc2VuZEZsdXRlTXNnJChmbHV0ZU1zZykgewogIHRoaXMuaXNUYWxrUGx1Z2luRW5hYmxlZCgpICYmIHRoaXMudGFsa1BsdWdpbl8uc2VuZE1zZyhmbHV0ZU1zZykKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuc2V0T3V0Z29pbmdDYWxsVGltZW91dE1zID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJHNldE91dGdvaW5nQ2FsbFRpbWVvdXRNcyQodGltZSkgewogIDAgPCB0aW1lICYmICh0aGlzLm91dGdvaW5nQ2FsbFRpbWVvdXRNc18gPSB0aW1lLCB0aGlzLmNhbGxTdGFydFRpbWVyXyAmJiAodGhpcy5ldmVudEhhbmRsZXJfLnVubGlzdGVuKHRoaXMuY2FsbFN0YXJ0VGltZXJfLCBnb29nLlRpbWVyLlRJQ0ssIHRoaXMub25DYWxsVGltZW91dF8pLCB0aGlzLmNhbGxTdGFydFRpbWVyXy5kaXNwb3NlKCkpLCB0aGlzLmNhbGxTdGFydFRpbWVyXyA9IG5ldyBnb29nLlRpbWVyKHRoaXMub3V0Z29pbmdDYWxsVGltZW91dE1zXyksIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5jYWxsU3RhcnRUaW1lcl8sIGdvb2cuVGltZXIuVElDSywgdGhpcy5vbkNhbGxUaW1lb3V0XykpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmhhc0FjdGl2ZUNhbGwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkaGFzQWN0aXZlQ2FsbCQoKSB7CiAgcmV0dXJuISF0aGlzLmFjdGl2ZUNhbGxfCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLm1hY2hpbmVIYXNBY3RpdmVDYWxsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJG1hY2hpbmVIYXNBY3RpdmVDYWxsJCgpIHsKICByZXR1cm4gdGhpcy5nZXRNYWNoaW5lQ2FsbFR5cGUoKSAhPSB0YWxrLm1lZGlhLkNhbGxUeXBlLk5PTkUKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuY2FuTWFrZU5ld0NhbGxXaXRoID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGNhbk1ha2VOZXdDYWxsV2l0aCQob3B0X2ppZCkgewogIHJldHVybiB0aGlzLmFsbG93Q2FsbEhvbGQoKSA/IHRoaXMuaGFzQWN0aXZlQ2FsbCgpICYmIHRoaXMuYWN0aXZlQ2FsbF8uc3RhdGUgIT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLlN0YXRlLkFDVElWRV9DQUxMIHx8IG9wdF9qaWQgJiYgdGhpcy5oYXNDYWxsV2l0aChvcHRfamlkKSB8fCAhdGhpcy5oYXNBY3RpdmVDYWxsKCkgJiYgdGhpcy5oZWxkQ2FsbHNfLmlzRW1wdHkoKSAmJiB0aGlzLm1hY2hpbmVIYXNBY3RpdmVDYWxsKCkgPyAhMSA6ICEwIDogMCAhPSB0aGlzLmhlbGRDYWxsc18uZ2V0Q291bnQoKSA/ICExIDogIXRoaXMubWFjaGluZUhhc0FjdGl2ZUNhbGwoKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5zZXRQZW5kaW5nQ2FsbENsZWFudXAgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkc2V0UGVuZGluZ0NhbGxDbGVhbnVwJCgpIHsKICB0aGlzLmhhc1BlbmRpbmdDYWxsQ2xlYW51cF8gPSAhMDsKICBnb29nLlRpbWVyLmNhbGxPbmNlKHRoaXMuY2xlYXJQZW5kaW5nQ2FsbENsZWFudXBfLCB0aGlzLnBlbmRpbmdDbGVhbnVwVGltZW91dF8sIHRoaXMpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmNsZWFyUGVuZGluZ0NhbGxDbGVhbnVwXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRjbGVhclBlbmRpbmdDYWxsQ2xlYW51cF8kKCkgewogIHRoaXMuaGFzUGVuZGluZ0NhbGxDbGVhbnVwXyA9ICExCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmhhbmRsZUZsdXRlU3RhdGVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGhhbmRsZUZsdXRlU3RhdGVfJChlKSB7CiAgdGhpcy5jbGVhclBlbmRpbmdDYWxsQ2xlYW51cF8oKTsKICB0aGlzLmhhc0FjdGl2ZUNhbGwoKSAmJiBlLnNlc3Npb25JZCAmJiB0aGlzLmFjdGl2ZUNhbGxfLnNlc3Npb25JZCAhPSBlLnNlc3Npb25JZCAmJiB0aGlzLmhvbGRDYWxsKCkKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuZ2V0TWFjaGluZUNhbGxUeXBlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGdldE1hY2hpbmVDYWxsVHlwZSQoKSB7CiAgcmV0dXJuITAgPT0gdGhpcy5oYXNQZW5kaW5nQ2FsbENsZWFudXBfID8gdGFsay5tZWRpYS5DYWxsVHlwZS5OT05FIDogdGhpcy5oYXNBY3RpdmVDYWxsKCkgPyB0aGlzLmFjdGl2ZUNhbGxfLnR5cGUgOiB0aGlzLnRhbGtQbHVnaW5fID8gdGhpcy50YWxrUGx1Z2luXy5nZXRNYWNoaW5lQ2FsbFR5cGUoKSA6IHRhbGsubWVkaWEuQ2FsbFR5cGUuTk9ORQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5nZXRBY3RpdmVDYWxsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGdldEFjdGl2ZUNhbGwkKCkgewogIHZhciB0aGVDYWxsID0gbnVsbDsKICB0aGlzLmFjdGl2ZUNhbGxfICYmICh0aGVDYWxsID0gdGhpcy5hY3RpdmVDYWxsXy5jb3B5KCkpOwogIHJldHVybiB0aGVDYWxsCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmhhc0FjdGl2ZUNhbGxXaXRoID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGhhc0FjdGl2ZUNhbGxXaXRoJChqaWQpIHsKICByZXR1cm4gZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5hY3RpdmVDYWxsXykgJiYgdGhpcy5hY3RpdmVDYWxsXy5pc1dpdGgoamlkKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5oYXNDYWxsV2l0aCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRoYXNDYWxsV2l0aCQoamlkKSB7CiAgcmV0dXJuIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMuZmluZENhbGwoamlkKSkKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuaGFuZGxlSmluZ2xlTXNnID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGhhbmRsZUppbmdsZU1zZyQoamluZ2xlSnNvbikgewogIGlmKHRhbGsubWVkaWEuSmluZ2xlTXNnQ29udmVydGVyLkpzb25NYXlOZWVkQ29udmVyc2lvbihqaW5nbGVKc29uKSkgewogICAgdmFyIGpzb24gPSBnb29nLmpzb24ucGFyc2UoamluZ2xlSnNvbik7CiAgICBpZihnb29nLmlzRGVmQW5kTm90TnVsbChqc29uKSkgewogICAgICBmb3IodmFyIGNvbnZlcnRlZEpzb25zID0gdGhpcy5jb252ZXJ0U2VydmVySnNvbihqc29uKSwgaSA9IDA7aSA8IGNvbnZlcnRlZEpzb25zLmxlbmd0aDsrK2kpIHsKICAgICAgICB2YXIganNvblN0cmluZyA9IGdvb2cuanNvbi5zZXJpYWxpemUoY29udmVydGVkSnNvbnNbaV0pOwogICAgICAgIHRoaXMuaW50ZXJuYWxIYW5kbGVKaW5nbGVNc2dfKGpzb25TdHJpbmcpCiAgICAgIH0KICAgIH0KICB9ZWxzZSB7CiAgICB0aGlzLmludGVybmFsSGFuZGxlSmluZ2xlTXNnXyhqaW5nbGVKc29uKQogIH0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuY29udmVydFNlcnZlckpzb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkY29udmVydFNlcnZlckpzb24kKGpzb24pIHsKICB0aGlzLnNldFN0cmVhbXNPZk5ld0pscnRwXyhqc29uKTsKICByZXR1cm4gZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy50YWxrUGx1Z2luXykgJiYgIXRoaXMudGFsa1BsdWdpbl8uc3VwcG9ydE11bHRpU3RyZWFtcygpID8gdGhpcy5qaW5nbGVNc2dDb252ZXJ0ZXJfLmNvbnZlcnRTZXJ2ZXJKc29uVG9PbGQoanNvbikgOiBbanNvbl0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuY29udmVydEpydHBUb09sZEpwcyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRjb252ZXJ0SnJ0cFRvT2xkSnBzJChqcnRwKSB7CiAgcmV0dXJuIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMudGFsa1BsdWdpbl8pICYmIHRoaXMudGFsa1BsdWdpbl8uc3VwcG9ydE11bHRpU3RyZWFtcygpID8gdGhpcy5qaW5nbGVNc2dDb252ZXJ0ZXJfLmNvbnZlcnRKcnRwVG9PbGRKcHMoanJ0cCkgOiBbXQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5zZXRTdHJlYW1zT2ZOZXdKbHJ0cF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkc2V0U3RyZWFtc09mTmV3SmxydHBfJChqc29uKSB7CiAgaWYoNCA9PSBqc29uLmxlbmd0aCAmJiBqc29uWzBdID09IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSmluZ2xlTWVzc2FnZV8uTE9DQUxfUlRQTUFQKSB7CiAgICB2YXIgc2Vzc2lvbklkID0ganNvblt0YWxrLm1lZGlhLkppbmdsZU1zZ0NvbnZlcnRlci5TRVNTSU9OX0lEX0lOREVYXSwgbG9jYWxEZXNjcmlwdGlvbiA9IHRoaXMubG9jYWxEZXNjcmlwdGlvbnNfLmdldChzZXNzaW9uSWQpOwogICAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwobG9jYWxEZXNjcmlwdGlvbikpIHsKICAgICAgdmFyIGF1ZGlvID0ganNvblszXS5hLCBsb2NhbEF1ZGlvID0gbG9jYWxEZXNjcmlwdGlvbi5hOwogICAgICBnb29nLmlzRGVmQW5kTm90TnVsbChhdWRpbykgJiYgZ29vZy5pc0RlZkFuZE5vdE51bGwobG9jYWxBdWRpbykgJiYgKGF1ZGlvLnN0cmVhbXMgPSBsb2NhbEF1ZGlvLnN0cmVhbXMpOwogICAgICB2YXIgdmlkZW8gPSBqc29uWzNdLnYsIGxvY2FsVmlkZW8gPSBsb2NhbERlc2NyaXB0aW9uLnY7CiAgICAgIGdvb2cuaXNEZWZBbmROb3ROdWxsKHZpZGVvKSAmJiBnb29nLmlzRGVmQW5kTm90TnVsbChsb2NhbFZpZGVvKSAmJiAodmlkZW8uc3RyZWFtcyA9IGxvY2FsVmlkZW8uc3RyZWFtcykKICAgIH1lbHNlIHsKICAgICAgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5sb2dnZXJfLndhcm5pbmcoIm5vIGxvY2FsIGRlc2NyaXB0aW9uIGZvciAiICsgc2Vzc2lvbklkKQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuaW50ZXJuYWxIYW5kbGVKaW5nbGVNc2dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGludGVybmFsSGFuZGxlSmluZ2xlTXNnXyQoamluZ2xlSnNvbikgewogIHZhciBpbmNvbWluZ0ppbmdsZSA9IG5ldyB0YWxrLm1lZGlhLkNhbGxFdmVudCh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LklOQ09NSU5HX0pJTkdMRSwgamluZ2xlSnNvbiksIGppbmdsZU1zZyA9IGluY29taW5nSmluZ2xlLmdldFBhcnNlZE1zZygpLCBtc2dUeXBlID0gaW5jb21pbmdKaW5nbGUubXNnVHlwZTsKICB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmxvZ2dlcl8uaW5mbygiSmluZ2xlIG1lc3NhZ2UgLSByZWNlaXZpbmc6ICIgKyBtc2dUeXBlKTsKICBzd2l0Y2gobXNnVHlwZSkgewogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkppbmdsZU1lc3NhZ2VfLklORk86CiAgICAgIHRoaXMuc2VuZEZsdXRlTXNnKGppbmdsZUpzb24pOwogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5KaW5nbGVNZXNzYWdlXy5FTkNfQ09ORklHOgogICAgICB0aGlzLmNoYW5nZUplYzE2eDEwVG8xNng5XyhqaW5nbGVNc2cpICYmIChqaW5nbGVKc29uID0gZ29vZy5qc29uLnNlcmlhbGl6ZShqaW5nbGVNc2cpLCBpbmNvbWluZ0ppbmdsZSA9IG5ldyB0YWxrLm1lZGlhLkNhbGxFdmVudCh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LklOQ09NSU5HX0pJTkdMRSwgamluZ2xlSnNvbiksIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy5pbmZvKCJDaGFuZ2UgamVjIGZyb20gMTY6MTAgdG8gMTY6OSAiICsgamluZ2xlSnNvbikpOwogICAgICB0aGlzLnNlbmRGbHV0ZU1zZyhqaW5nbGVKc29uKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSmluZ2xlTWVzc2FnZV8uU1lOQ19DQVBBQklMSVRJRVM6CiAgICAgIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMuZ2V0VGFsa1BsdWdpbigpKSAmJiB0aGlzLnNlbmRKaW5nbGVNc2codGhpcy5nZXRUYWxrUGx1Z2luKCkuZ2V0Rmx1dGVWZXJzaW9uSW5mbygpKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB2YXIgc2Vzc2lvbklkID0gbXNnVHlwZSA9PSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkppbmdsZU1lc3NhZ2VfLkFDSyA/IGppbmdsZU1zZ1sxXSA6IGppbmdsZU1zZ1syXSwgY2FsbCA9IG1zZ1R5cGUgPT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5KaW5nbGVNZXNzYWdlXy5BQ0sgPyB0aGlzLmZpbmRDYWxsQnlTZXNzaW9uSWRfKHNlc3Npb25JZCkgOiB0aGlzLmZpbmRDYWxsKGppbmdsZU1zZ1sxXSk7CiAgICAgIHRoaXMubWF5YmVRdWV1ZUppbmdsZU1lc3NhZ2VfKHNlc3Npb25JZCwgaW5jb21pbmdKaW5nbGUpOwogICAgICBtc2dUeXBlICE9IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSmluZ2xlTWVzc2FnZV8uQUNLICYmIChjYWxsID0gdGhpcy5maW5kQ2FsbChqaW5nbGVNc2dbMV0pKTsKICAgICAgY2FsbCAmJiB0aGlzLnByb2Nlc3NDYWxsTWVzc2FnZV8oc2Vzc2lvbklkLCBpbmNvbWluZ0ppbmdsZSwgY2FsbCkKICB9CiAgdGhpcy5kaXNwYXRjaEV2ZW50KGluY29taW5nSmluZ2xlKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5jaGFuZ2VKZWMxNngxMFRvMTZ4OV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkY2hhbmdlSmVjMTZ4MTBUbzE2eDlfJChqZWNNc2cpIHsKICByZXR1cm4gdGhpcy5tdWx0aXdheV8gJiYgZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5nZXRUYWxrUGx1Z2luKCkpICYmIHRoaXMuZ2V0VGFsa1BsdWdpbigpLnN1cHBvcnRKZWMxNng5KCkgJiYgMTAgKiBqZWNNc2dbMV1bMF1bMl0gPT0gMTYgKiBqZWNNc2dbMV1bMF1bM10gPyAoamVjTXNnWzFdWzBdWzNdID0gOSAqIGplY01zZ1sxXVswXVsyXSAvIDE2LCAhMCkgOiAhMQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5wcm9jZXNzQ2FsbE1lc3NhZ2VfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJHByb2Nlc3NDYWxsTWVzc2FnZV8kKHNlc3Npb25JZCwgbWVzc2FnZSwgb3B0X2NhbGwpIHsKICB2YXIgamluZ2xlTXNnID0gbWVzc2FnZS5nZXRQYXJzZWRNc2coKSwgZnJvbUppZCA9IGppbmdsZU1zZ1sxXSwganNvblRvRmx1dGUgPSBtZXNzYWdlLmpzb247CiAgc3dpdGNoKG1lc3NhZ2UubXNnVHlwZSkgewogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkppbmdsZU1lc3NhZ2VfLklOSVRJQVRFOgogICAgICB2YXIgbmV3Q2FsbCA9IHRoaXMudW5zdGFydGVkQ2FsbHNfLmdldChzZXNzaW9uSWQpOwogICAgICBpZighdGhpcy5oYW5kbGVJbmNvbWluZ0NhbGxfKGZyb21KaWQsIG5ld0NhbGwpKSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSmluZ2xlTWVzc2FnZV8uVEVSTUlOQVRFOgogICAgICB2YXIgY2FsbFRvUmVtb3ZlID0gdGhpcy5maW5kQW5kUmVtb3ZlQ2FsbF8oZnJvbUppZCwgc2Vzc2lvbklkKTsKICAgICAgaWYoIWNhbGxUb1JlbW92ZSkgewogICAgICAgIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy53YXJuaW5nKCJSZWNlaXZlZCB0ZXJtaW5hdGUgZm9yIG5vbi1leGlzdGVudCBjYWxsIHdpdGggIiArIGZyb21KaWQpOwogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIHRoaXMuaGFuZGxlVGVybWluYXRlXyhjYWxsVG9SZW1vdmUsICEwLCB0aGlzLmdldEVuZENhdXNlXyhqaW5nbGVNc2dbM10pLCBqaW5nbGVNc2dbNF0pOwogICAgICByZXR1cm47CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSmluZ2xlTWVzc2FnZV8uUlRQTUFQOgogICAgICBpZighb3B0X2NhbGwpIHsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB0aGlzLmhhbmRsZVJ0cE1hcF8oamluZ2xlTXNnLCBvcHRfY2FsbCk7CiAgICAgIGpzb25Ub0ZsdXRlID0gZ29vZy5qc29uLnNlcmlhbGl6ZShqaW5nbGVNc2cpOwogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5KaW5nbGVNZXNzYWdlXy5VUERBVEU6CiAgICAgIGlmKCFvcHRfY2FsbCkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIHRoaXMucmVtb3ZlUmVkSWZOb3RTdXBwb3J0ZWRfKGppbmdsZU1zZyk7CiAgICAgIGpzb25Ub0ZsdXRlID0gZ29vZy5qc29uLnNlcmlhbGl6ZShqaW5nbGVNc2cpOwogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5KaW5nbGVNZXNzYWdlXy5BQ0NFUFQ6CiAgICAgIGlmKG9wdF9jYWxsKSB7CiAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRfKCk7CiAgICAgICAgb3B0X2NhbGwuc3RhdGUgPT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLlN0YXRlLklOQ09NSU5HX1JJTkcgJiYgdGhpcy5oYXNBY3RpdmVDYWxsKCkgJiYgdGhpcy5ob2xkQ2FsbCgpOwogICAgICAgIG9wdF9jYWxsLnN0YXRlID0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLlN0YXRlLkFDVElWRV9DQUxMOwogICAgICAgIHRoaXMuaGVsZENhbGxzXy5yZW1vdmUoYXBwcy5jaGF0LmNvcmUuSmlkLmJhcmVQYXJ0KGZyb21KaWQpKTsKICAgICAgICB0aGlzLmFjdGl2ZUNhbGxfID0gb3B0X2NhbGw7CiAgICAgICAgdmFyIGFjdGl2ZUNhbGwgPSB0aGlzLmdldEFjdGl2ZUNhbGwoKTsKICAgICAgICBnb29nLmlzRGVmQW5kTm90TnVsbChhY3RpdmVDYWxsKSAmJiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQWN0aXZlQ2FsbEV2ZW50KGFjdGl2ZUNhbGwsICExKSk7CiAgICAgICAgdGhpcy5hY3RpdmVDYWxsXy5zc3JjTWFwICYmIHRoaXMuc3NyY01hcFVwZGF0ZWQoKQogICAgICB9ZWxzZSB7CiAgICAgICAgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5sb2dnZXJfLndhcm5pbmcoIkFjY2VwdCByZWNlaXZlZCBmb3IgYSBub24tYWN0aXZlIGNhbGwiKQogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkppbmdsZU1lc3NhZ2VfLlRSQU5TUE9SVDoKICAgICAgb3B0X2NhbGwgfHwgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5sb2dnZXJfLndhcm5pbmcoIkEgY2FsbCBoYXMgYmVlbiBzdGFydGVkIG5vdCB1c2luZyBDYWxsTWFuYWdlciIpOwogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5KaW5nbGVNZXNzYWdlXy5BQ0s6CiAgICAgIHRoaXMuc2VuZEppbmdsZU1zZyhbdGFsay5tZWRpYS5DYWxsTWFuYWdlci5KaW5nbGVNZXNzYWdlXy5BQ0ssIHNlc3Npb25JZF0pOwogICAgICBqc29uVG9GbHV0ZSA9IGdvb2cuanNvbi5zZXJpYWxpemUoamluZ2xlTXNnLmNvbmNhdChbZ29vZy5ub3coKV0pKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSmluZ2xlTWVzc2FnZV8uUkVESVJFQ1Q6CiAgICAgIGlmKG9wdF9jYWxsICYmICFvcHRfY2FsbC51cGRhdGVKaWRfKGppbmdsZU1zZ1sxXSwgamluZ2xlTXNnWzNdKSkgewogICAgICAgIHJldHVybgogICAgICB9CiAgfQogIG9wdF9jYWxsICYmIHRoaXMuc2VuZEZsdXRlTXNnKGpzb25Ub0ZsdXRlKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5tYXliZVF1ZXVlSmluZ2xlTWVzc2FnZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkbWF5YmVRdWV1ZUppbmdsZU1lc3NhZ2VfJChzZXNzaW9uSWQsIG1lc3NhZ2UpIHsKICB2YXIgamluZ2xlTXNnID0gbWVzc2FnZS5nZXRQYXJzZWRNc2coKSwgZnJvbUppZCA9IGppbmdsZU1zZ1sxXSwgcGVuZGluZ0NhbGwgPSB0aGlzLnVuc3RhcnRlZENhbGxzXy5nZXQoc2Vzc2lvbklkKTsKICBpZihtZXNzYWdlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5KaW5nbGVNZXNzYWdlXy5JTklUSUFURSkgewogICAgaWYocGVuZGluZ0NhbGwpIHsKICAgICAgdGhpcy5hZGRUb0xvZygnUmVjZWl2ZWQgImpuIiBmb3IgYW4gYWxyZWFkeSBwZW5kaW5nIGNhbGwuIFRoaXMgaXMgbm90IGV4cGVjdGVkJywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5Mb2dDb21tZW50U2V2ZXJpdHkuV0FSTklORykKICAgIH1lbHNlIHsKICAgICAgdmFyIGNhbGxUeXBlID0gInYiID09IGppbmdsZU1zZ1szXSA/IHRhbGsubWVkaWEuQ2FsbFR5cGUuVklERU8gOiB0YWxrLm1lZGlhLkNhbGxUeXBlLlZPSUNFLCBwZW5kaW5nQ2FsbCA9IG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNhbGwoW2Zyb21KaWRdLCBjYWxsVHlwZSwgc2Vzc2lvbklkKTsKICAgICAgdGhpcy51bnN0YXJ0ZWRDYWxsc18uc2V0KHNlc3Npb25JZCwgcGVuZGluZ0NhbGwpOwogICAgICB0aGlzLmNyZWF0ZUxvY2FsRGVzY3JpcHRpb25fKHBlbmRpbmdDYWxsKQogICAgfQogICAgdGhpcy5zZW5kSmluZ2xlTXNnKFt0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkppbmdsZU1lc3NhZ2VfLkFDSywgc2Vzc2lvbklkXSkKICB9ZWxzZSB7CiAgICBpZihtZXNzYWdlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5KaW5nbGVNZXNzYWdlXy5TVEFSVCkgewogICAgICBpZihwZW5kaW5nQ2FsbCkgewogICAgICAgIGZvcig7IXBlbmRpbmdDYWxsLnF1ZXVlZEppbmdsZU1lc3NhZ2VzLmlzRW1wdHkoKTspIHsKICAgICAgICAgIHZhciBjYWxsID0gdGhpcy51bnN0YXJ0ZWRDYWxsc18uZ2V0KHNlc3Npb25JZCk7CiAgICAgICAgICB0aGlzLnByb2Nlc3NDYWxsTWVzc2FnZV8ocGVuZGluZ0NhbGwuc2Vzc2lvbklkLCBwZW5kaW5nQ2FsbC5xdWV1ZWRKaW5nbGVNZXNzYWdlcy5kZXF1ZXVlKCksIGNhbGwpCiAgICAgICAgfQogICAgICAgIHRoaXMudW5zdGFydGVkQ2FsbHNfLnJlbW92ZShwZW5kaW5nQ2FsbC5zZXNzaW9uSWQpCiAgICAgIH1lbHNlIHsKICAgICAgICB0aGlzLmFkZFRvTG9nKCdSZWNlaXZlZCAianN0YXJ0IiBtZXNzYWdlIGJlZm9yZSBpbml0aWF0ZSBtZXNzYWdlLiBDYWxsIHdpbGwgZmFpbCcsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuTG9nQ29tbWVudFNldmVyaXR5LkVSUk9SKQogICAgICB9CiAgICAgIHBlbmRpbmdDYWxsID0gbnVsbAogICAgfWVsc2UgewogICAgICBtZXNzYWdlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5KaW5nbGVNZXNzYWdlXy5URVJNSU5BVEUgJiYgdGhpcy51bnN0YXJ0ZWRDYWxsc18ucmVtb3ZlKHNlc3Npb25JZCkKICAgIH0KICB9CiAgcmV0dXJuIHBlbmRpbmdDYWxsID8gKHBlbmRpbmdDYWxsLnF1ZXVlZEppbmdsZU1lc3NhZ2VzLmVucXVldWUobWVzc2FnZSksICEwKSA6ICExCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmdldEVuZENhdXNlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRnZXRFbmRDYXVzZV8kKGVuZENhdXNlTnVtYmVyKSB7CiAgdmFyIGVuZENhdXNlU3RyID0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5pbnRDb2RlVG9FbmRDYXVzZV9bZW5kQ2F1c2VOdW1iZXJdOwogIHJldHVybiBnb29nLmlzRGVmQW5kTm90TnVsbCh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlW2VuZENhdXNlU3RyXSkgPyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlW2VuZENhdXNlU3RyXSA6IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRW5kQ2F1c2UuVU5LTk9XTgp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5vbkNhbGxUaW1lb3V0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRvbkNhbGxUaW1lb3V0XyQoKSB7CiAgdGhpcy5hY3RpdmVDYWxsXyAmJiB0aGlzLmFjdGl2ZUNhbGxfLnN0YXRlICE9IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5TdGF0ZS5BQ1RJVkVfQ0FMTCA/IHRoaXMuZW5kQ2FsbCh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLlRJTUVPVVQpIDogdGFsay5tZWRpYS5DYWxsTWFuYWdlci5sb2dnZXJfLndhcm5pbmcoIm9uQ2FsbFRpbWVvdXRfKCk6IG5vdCBpbiB0aW1lZC1vdXQgc3RhdGUiKTsKICB0aGlzLmNsZWFyVGltZW91dF8oKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5oYW5kbGVJbmNvbWluZ0NhbGxfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGhhbmRsZUluY29taW5nQ2FsbF8kKGZyb21KaWQsIG5ld0NhbGwsIG9wdF90aW1lb3V0KSB7CiAgdmFyIHNlc3Npb25JZCA9IG5ld0NhbGwuc2Vzc2lvbklkLCBjYWxsVHlwZSA9IG5ld0NhbGwudHlwZTsKICBpZih0aGlzLmlzVGFsa1BsdWdpbkVuYWJsZWQoKSkgewogICAgdmFyIHRlcm1pbmF0ZWQgPSB0aGlzLm1heWJlSGFuZGxlU2ltdWx0YW5lb3VzSW52aXRlXyhmcm9tSmlkLCBuZXdDYWxsKTsKICAgIGlmKHRlcm1pbmF0ZWQpIHsKICAgICAgcmV0dXJuITEKICAgIH0KICAgIGlmKHRoaXMuY2FuTWFrZU5ld0NhbGxXaXRoKGZyb21KaWQpKSB7CiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuTmV3Q2FsbEV2ZW50KCExLCBmcm9tSmlkLCBzZXNzaW9uSWQsIGNhbGxUeXBlKSksIG5ld0NhbGwuc3RhdGUgPSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNhbGwuU3RhdGUuSU5DT01JTkdfUklORywgb3B0X3RpbWVvdXQgJiYgdGhpcy5jYWxsU3RhcnRUaW1lcl8uc3RhcnQoKSwgbmV3Q2FsbC5pc091dGJvdW5kID0gITEsIHRoaXMuaGVsZENhbGxzXy5zZXQoYXBwcy5jaGF0LmNvcmUuSmlkLmJhcmVQYXJ0KGZyb21KaWQpLCBuZXdDYWxsKSwgITAKICAgIH0KICAgIHRoaXMuc2VuZFRlcm1pbmF0ZV8obmV3Q2FsbCwgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5CVVNZKTsKICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5GYWlsZWRDYWxsRXZlbnQoITAsIGZyb21KaWQsIGNhbGxUeXBlKSkKICB9ZWxzZSB7CiAgICB0aGlzLnNlbmRUZXJtaW5hdGVfKG5ld0NhbGwsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRW5kQ2F1c2UuRkxVVEVfTk9UX0VOQUJMRUQpLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmxvZ2dlcl8uc2V2ZXJlKCJUZXJtaW5hdGluZyBjYWxsLCBwbHVnaW4gaXMgbm90IGVuYWJsZWQiKQogIH0KICByZXR1cm4hMQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5tYXliZUhhbmRsZVNpbXVsdGFuZW91c0ludml0ZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkbWF5YmVIYW5kbGVTaW11bHRhbmVvdXNJbnZpdGVfJChmcm9tSmlkLCBuZXdDYWxsKSB7CiAgaWYodGhpcy5oYXNBY3RpdmVDYWxsV2l0aChmcm9tSmlkKSAmJiB0aGlzLmFjdGl2ZUNhbGxfLnN0YXRlID09IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5TdGF0ZS5PVVRHT0lOR19SSU5HKSB7CiAgICBpZihuZXdDYWxsLnNlc3Npb25JZCA8IHRoaXMuYWN0aXZlQ2FsbF8uc2Vzc2lvbklkKSB7CiAgICAgIHRoaXMuaGFuZGxlVGVybWluYXRlXyh0aGlzLmFjdGl2ZUNhbGxfLCAhMSwgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5USUVfQlJFQUspLCBkZWxldGUgdGhpcy5hY3RpdmVDYWxsXywgdGhpcy5zZXRQZW5kaW5nQ2FsbENsZWFudXAoKQogICAgfWVsc2UgewogICAgICByZXR1cm4gdGhpcy5zZW5kVGVybWluYXRlXyhuZXdDYWxsLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLlRJRV9CUkVBSyksICEwCiAgICB9CiAgfQogIHJldHVybiExCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmhhbmRsZVRlcm1pbmF0ZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkaGFuZGxlVGVybWluYXRlXyQoY2FsbCwgaXNSZW1vdGUsIGNhdXNlLCBvcHRfZGVidWdJbmZvKSB7CiAgdGhpcy51bnN0YXJ0ZWRDYWxsc18ucmVtb3ZlKGNhbGwuc2Vzc2lvbklkKTsKICB0aGlzLmxvY2FsRGVzY3JpcHRpb25zXy5yZW1vdmUoY2FsbC5zZXNzaW9uSWQpOwogIHRoaXMuamluZ2xlTXNnQ29udmVydGVyXy5vbkNhbGxFbmQoY2FsbC5zZXNzaW9uSWQpOwogIGNhbGwuaXNPbkhvbGQoKSB8fCAodGhpcy5jbGVhclRpbWVvdXRfKCksIHRoaXMuY2xlYXJWYWRTd2l0Y2hpbmdUaW1lb3V0XygpKTsKICBpZihjYWxsLnNzcmNNYXApIHsKICAgIGZvcih2YXIgbmlja3MgPSBjYWxsLnNzcmNNYXAuZ2V0S2V5cygpLCBpID0gMCwgbmljaztuaWNrID0gbmlja3NbaV07aSsrKSB7CiAgICAgIHZhciBtYXBFbnRyeSA9IGNhbGwuc3NyY01hcC5nZXQobmljayk7CiAgICAgIG1hcEVudHJ5LnVwZGF0ZSA9ICEwOwogICAgICBtYXBFbnRyeS5hdWRpb1NzcmMgPSBudWxsOwogICAgICBtYXBFbnRyeS52aWRlb1NzcmMgPSBudWxsOwogICAgICBtYXBFbnRyeS5uZXdBdWRpb1NzcmMgPSBudWxsOwogICAgICBtYXBFbnRyeS5uZXdWaWRlb1NzcmMgPSBudWxsCiAgICB9CiAgfQogIHRoaXMuc2VuZERpc2FibGVEdW1wUnRwSGVhZGVyTXNnXyhjYWxsKTsKICBpZih0aGlzLmlzVGFsa1BsdWdpbkVuYWJsZWQoKSAmJiAoaXNSZW1vdGUgfHwgY2F1c2UgIT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5GTFVURV9FTkRFRCkpIHsKICAgIG9wdF9kZWJ1Z0luZm8gJiYgdGhpcy5hZGRUb0xvZygiRGVidWcgaW5mbyBmb3IgamluZ2xlIHRlcm1pbmF0ZTogIiArIG9wdF9kZWJ1Z0luZm8pLCB0aGlzLnRhbGtQbHVnaW5fLnRlcm1pbmF0ZUNhbGwoY2FsbC5yZW1vdGVKaWRzWzBdLCBjYWxsLnNlc3Npb25JZCwgY2F1c2UsIGlzUmVtb3RlKQogIH0KICBjYWxsLnNldEVuZENhdXNlKGNhdXNlKTsKICBjYWxsLmNvcHkoKTsKICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbEVuZGVkRXZlbnQoY2F1c2UsIGlzUmVtb3RlLCBjYWxsLnNlc3Npb25JZCwgY2FsbCwgb3B0X2RlYnVnSW5mbykpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmhhbmRsZVJ0cE1hcF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkaGFuZGxlUnRwTWFwXyQoanNvbiwgY2FsbCkgewogIGlmKGNhbGwpIHsKICAgIHZhciBlbmNyeXB0ZWQgPSAhMTsKICAgIGNhbGwudHlwZSA9PSB0YWxrLm1lZGlhLkNhbGxUeXBlLlZPSUNFID8gZW5jcnlwdGVkID0gdGFsay5tZWRpYS5DcnlwdG8uZ2V0SW5zdGFuY2UoKS5oYXNFbmNyeXB0aW9uKGpzb25bNV0pIDogY2FsbC50eXBlID09IHRhbGsubWVkaWEuQ2FsbFR5cGUuVklERU8gJiYgKGVuY3J5cHRlZCA9IHRhbGsubWVkaWEuQ3J5cHRvLmdldEluc3RhbmNlKCkuaGFzRW5jcnlwdGlvbihqc29uWzVdKSAmJiB0YWxrLm1lZGlhLkNyeXB0by5nZXRJbnN0YW5jZSgpLmhhc0VuY3J5cHRpb24oanNvbls2XSkpOwogICAgY2FsbC5zZXRIYXNTcnRwKGVuY3J5cHRlZCk7CiAgICB0aGlzLnJlbW92ZVJlZElmTm90U3VwcG9ydGVkXyhqc29uKQogIH0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUucmVtb3ZlUmVkSWZOb3RTdXBwb3J0ZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJHJlbW92ZVJlZElmTm90U3VwcG9ydGVkXyQoanNvbikgewogIHRoaXMudGFsa1BsdWdpbl8gJiYgIXRoaXMudGFsa1BsdWdpbl8uc3VwcG9ydEZpcnN0UmVkQ29kZWMoKSAmJiA0IDw9IGpzb24ubGVuZ3RoICYmICJyZWQiID09IGpzb25bM11bMF1bMV0gJiYgKGpzb25bM10uc3BsaWNlKDAsIDEpLCB0aGlzLmFkZFRvTG9nKCJSZW1vdmUgdGhlIGZpcnN0IHJlZCBhdWRpbyBjb2RlYyBmb3IgcGx1Z2luICIgKyB0aGlzLnRhbGtQbHVnaW5fLmdldEZsdXRlVmVyc2lvbkluZm8oKVsyXSkpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLnNldFRhbGtQbHVnaW4gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkc2V0VGFsa1BsdWdpbiQodGFsa1BsdWdpbikgewogIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy5pbmZvKCJTZXR0aW5nIHRoZSB0YWxrIHBsdWdpbjogIiArIHRhbGtQbHVnaW4pOwogIHRoaXMudGFsa1BsdWdpbl8gJiYgKHRoaXMuZXZlbnRIYW5kbGVyXy5yZW1vdmVBbGwoKSwgdGhpcy50YWxrUGx1Z2luXy5zZXRQYXJlbnRFdmVudFRhcmdldChudWxsKSk7CiAgdGhpcy50YWxrUGx1Z2luXyA9IHRhbGtQbHVnaW47CiAgdGhpcy5kZXZpY2VTdGF0dXNfLnNldFRhbGtQbHVnaW4odGhpcy50YWxrUGx1Z2luXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLnRhbGtQbHVnaW5fLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5FUlJPUiwgdGhpcy5oYW5kbGVUYWxrUGx1Z2luRXJyb3JNc2dfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMudGFsa1BsdWdpbl8sIHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LlZFUlNJT04sIHRoaXMuaGFuZGxlVGFsa1BsdWdpblZlcnNpb25Nc2dfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMudGFsa1BsdWdpbl8sIHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LkVORF9DQUxMLCB0aGlzLmhhbmRsZVRhbGtQbHVnaW5FbmRDYWxsTXNnXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLnRhbGtQbHVnaW5fLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5DT01NQU5ELCB0aGlzLmhhbmRsZVRhbGtQbHVnaW5Db21tYW5kXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLnRhbGtQbHVnaW5fLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5NRVNTQUdFLCB0aGlzLmhhbmRsZVRhbGtQbHVnaW5NZXNzYWdlXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLnRhbGtQbHVnaW5fLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5GTFVURVNUQVRFX0NIQU5HRUQsIHRoaXMuaGFuZGxlRmx1dGVTdGF0ZV8pOwogIHRoaXMudGFsa1BsdWdpbl8uc2V0UGFyZW50RXZlbnRUYXJnZXQodGhpcykKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuZ2V0VGFsa1BsdWdpbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRnZXRUYWxrUGx1Z2luJCgpIHsKICByZXR1cm4gdGhpcy50YWxrUGx1Z2luXwp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5pc1RhbGtQbHVnaW5FbmFibGVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGlzVGFsa1BsdWdpbkVuYWJsZWQkKCkgewogIHJldHVybiEhdGhpcy50YWxrUGx1Z2luXyAmJiB0aGlzLnRhbGtQbHVnaW5fLmlzQ29ubmVjdGVkKCkKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuaGFuZGxlVGFsa1BsdWdpblZlcnNpb25Nc2dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGhhbmRsZVRhbGtQbHVnaW5WZXJzaW9uTXNnXyQoZSkgewogIHRoaXMuc2VuZEppbmdsZU1zZyhlLmpzb24pCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmhhbmRsZVRhbGtQbHVnaW5FcnJvck1zZ18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkaGFuZGxlVGFsa1BsdWdpbkVycm9yTXNnXyQoZSkgewogIHZhciBjYWxsID0gdGhpcy5maW5kQ2FsbChlLmVycm9yRGF0YVsxXSk7CiAgaWYoY2FsbCkgewogICAgdmFyIGNhdXNlID0gdGhpcy5jb252ZXJ0VGFsa1BsdWdpbkVycm9yVG9FbmRDYXVzZV8oZS5lcnJvckRhdGFbM10pOwogICAgdGhpcy5lbmRDYWxsKGNhdXNlLCBlLmVycm9yRGF0YVsxXSkKICB9Cn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmNvbnZlcnRUYWxrUGx1Z2luRXJyb3JUb0VuZENhdXNlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRjb252ZXJ0VGFsa1BsdWdpbkVycm9yVG9FbmRDYXVzZV8kKGVycm9yKSB7CiAgc3dpdGNoKGVycm9yKSB7CiAgICBjYXNlIHRhbGsubWVkaWEuVGFsa1BsdWdpbkVycm9yQ29kZXMuQ09OTkVDVElWSVRZX0xPU1Q6CiAgICAgIHJldHVybiB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLkNPTk5FQ1RJVklUWV9MT1NUOwogICAgY2FzZSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FcnJvckNvZGVzLkJST1dTRVJfTk9UX1JFU1BPTlNFOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5CUk9XU0VSX05PVF9SRVNQT05TRTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLkVSUk9SCiAgfQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5oYW5kbGVUYWxrUGx1Z2luRW5kQ2FsbE1zZ18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkaGFuZGxlVGFsa1BsdWdpbkVuZENhbGxNc2dfJCgpIHsKICB0aGlzLmVuZEFsbENhbGxzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRW5kQ2F1c2UuRkxVVEVfRU5ERUQpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmhhbmRsZVRhbGtQbHVnaW5Db21tYW5kXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRoYW5kbGVUYWxrUGx1Z2luQ29tbWFuZF8kKGUpIHsKICB2YXIgbXNnID0gZS5nZXRQYXJzZWRNc2coKSwgY2FsbCA9IHRoaXMuZmluZENhbGwobXNnWzFdKTsKICBjYWxsICYmIGNhbGwuc2Vzc2lvbklkID09IG1zZ1syXSAmJiAobXNnWzNdID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbkNvbW1hbmRzLkFDQ0VQVCA/IHRoaXMuYWNjZXB0Q2FsbChtc2dbMV0pIDogbXNnWzNdID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbkNvbW1hbmRzLkRFQ0xJTkUgJiYgdGhpcy5kb0VuZENhbGxfKGNhbGwsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRW5kQ2F1c2UuVVNFUl9FTkRFRCwgIkNhbGxNYW5hZ2VyLmhhbmRsZVRhbGtQbHVnaW5Db21tYW5kXywgdGFsay5tZWRpYS5UYWxrUGx1Z2luQ29tbWFuZHMuREVDTElORSIpKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5oYW5kbGVUYWxrUGx1Z2luTWVzc2FnZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkaGFuZGxlVGFsa1BsdWdpbk1lc3NhZ2VfJChlKSB7CiAgaWYoZS5tc2dUeXBlID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LkFVRElPX0lORk8pIHsKICAgIHRoaXMuaGFuZGxlVGFsa1BsdWdpbkF1ZGlvSW5mb01zZ18oZSkKICB9ZWxzZSB7CiAgICBpZihlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuV0FSTklORykgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuUGx1Z2luV2FybmluZ0V2ZW50KGUuZ2V0UGFyc2VkTXNnKCkpKQogICAgfWVsc2UgewogICAgICBpZihlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuREVBRCkgewogICAgICAgIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy5pbmZvKCJGbHV0ZSBjcmFzaGVkIHdoaWxlIGluIGEgY2FsbCIpLCB0aGlzLmVuZEFsbENhbGxzKHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRW5kQ2F1c2UuRVJST1IpCiAgICAgIH1lbHNlIHsKICAgICAgICBpZihlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuVVBMT0FEX0xPR19SRVNQT05TRSkgewogICAgICAgICAgdGhpcy5kaXNwYXRjaFVwbG9hZExvZ0NvbXBsZXRlZF8oZSkKICAgICAgICB9ZWxzZSB7CiAgICAgICAgICBpZihlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuVFJBTlNQT1JUX1NUQVRFKSB7CiAgICAgICAgICAgIHZhciBtc2cgPSBlLmdldFBhcnNlZE1zZygpLCBjYWxsID0gdGhpcy5maW5kQ2FsbChtc2dbMV0pOwogICAgICAgICAgICBpZihjYWxsICYmIGNhbGwuc2Vzc2lvbklkID09IG1zZ1syXSkgewogICAgICAgICAgICAgIHZhciBpc1dyaXRhYmxlID0gbXNnWzNdLmFsbFdyaXRhYmxlOwogICAgICAgICAgICAgIGNhbGwuc2V0V3JpdGFiaWxpdHkoaXNXcml0YWJsZSk7CiAgICAgICAgICAgICAgaXNXcml0YWJsZSAmJiB0aGlzLnNlbmRQZW5kaW5nRHRtZnNfKGNhbGwpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlRyU3RhdGVFdmVudChtc2cpKQogICAgICAgICAgfWVsc2UgewogICAgICAgICAgICB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlBsdWdpblNlcnZlck1lc3NhZ2VfW2UubXNnVHlwZV0gPyAoKCJqbWlkYXRhIiAhPSBlLm1zZ1R5cGUgfHwgdGhpcy5wYXNzVGhyb3VnaEptaWRhdGFfKSAmJiB0aGlzLnNlbmRKaW5nbGVNc2coZS5qc29uKSwgImptaWRhdGEiID09IGUubXNnVHlwZSAmJiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSm1pZGF0YUV2ZW50KGUuZ2V0UGFyc2VkTXNnKCkpKSkgOiBlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuU0hBUkVfV0lORE9XUyA/IHRoaXMuaGFuZGxlVGFsa1BsdWdpblNoYXJlV2luZG93c01zZ18oZSkgOiBlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuU0hBUkVfTk9USUZZID8gdGhpcy5oYW5kbGVUYWxrUGx1Z2luU2hhcmVOb3RpZnlNc2dfKGUpIDogZS5tc2dUeXBlID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LlNIQVJFX1JFU1VMVCA/IAogICAgICAgICAgICB0aGlzLmhhbmRsZVRhbGtQbHVnaW5TaGFyZVJlc3VsdE1zZ18oZSkgOiBlLm1zZ1R5cGUgPT0gdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuQ0hFQ0tfQ09OTkVDVElWSVRZID8gdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNvbm5lY3Rpdml0eUNoZWNrUmVzdWx0RXZlbnQoZS5nZXRQYXJzZWRNc2coKSkpIDogZS5tc2dUeXBlID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50LlBJTkcgJiYgKG1zZyA9IGUuZ2V0UGFyc2VkTXNnKCksIDMgPD0gbXNnLmxlbmd0aCAmJiB0aGlzLnNlbmRGbHV0ZU1zZyhnb29nLmpzb24uc2VyaWFsaXplKFsicG9uZyIsIG1zZ1sxXSwgbXNnWzJdXSkpKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuZGlzcGF0Y2hVcGxvYWRMb2dDb21wbGV0ZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGRpc3BhdGNoVXBsb2FkTG9nQ29tcGxldGVkXyQoZSkgewogIHZhciBkYXRhID0gZS5nZXRQYXJzZWRNc2coKSwgamlkID0gZGF0YVsxXSwgaWQgPSBkYXRhWzJdLCBzdGF0dXMgPSBkYXRhWzNdOwogIHRoaXMubGFzdEluY2lkZW50SWRfID0gZGF0YVs0XTsKICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuVXBsb2FkTG9nQ29tcGxldGVFdmVudChqaWQsIGlkLCBzdGF0dXMsIHRoaXMubGFzdEluY2lkZW50SWRfKSkKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuaGFuZGxlVGFsa1BsdWdpbkF1ZGlvSW5mb01zZ18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkaGFuZGxlVGFsa1BsdWdpbkF1ZGlvSW5mb01zZ18kKGUpIHsKICBpZihnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmFjdGl2ZUNhbGxfKSAmJiB0aGlzLmFjdGl2ZUNhbGxfLmlzTXVsdGl3YXkoKSkgewogICAgdmFyIHVzZXJWb2x1bWVzID0gZS5nZXRQYXJzZWRNc2coKVt0YWxrLm1lZGlhLkFVRElPX0lORk9fU1BFQUtFUlNfUEFSQU1dW3RhbGsubWVkaWEuQVVESU9fSU5GT19TUEVBS0VSU19WT0xVTUVTXSB8fCBbXSwgbG9jYWxWb2x1bWUgPSB0aGlzLmdldE1pY3JvcGhvbmVNdXRlKCkgPyAwIDogZS5nZXRQYXJzZWRNc2coKVt0YWxrLm1lZGlhLkFVRElPX0lORk9fSU5QVVRfTEVWRUxfUEFSQU1dOwogICAgdGhpcy5hY3RpdmVDYWxsXy5sb2NhbFZvbHVtZSA9IGxvY2FsVm9sdW1lOwogICAgdGhpcy5hY3RpdmVDYWxsXy51c2VyVm9sdW1lcyA9IHVzZXJWb2x1bWVzOwogICAgdXNlclZvbHVtZXMubGVuZ3RoICYmIHRoaXMuZG9WYWRTd2l0Y2hpbmdfKCk7CiAgICB0aGlzLmRpc3BhdGNoRXZlbnQodGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5QQVJUSUNJUEFOVFNfVk9MVU1FX0xFVkVMX1VQREFURUQpCiAgfQogIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5BdWRpb0lucHV0RXZlbnQoZS5nZXRQYXJzZWRNc2coKVt0YWxrLm1lZGlhLkFVRElPX0lORk9fSU5QVVRfTEVWRUxfUEFSQU1dLCBlLmdldFBhcnNlZE1zZygpW3RhbGsubWVkaWEuQVVESU9fSU5GT19TRVNTSU9OX0lEX1BBUkFNXSkpOwogIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5BdWRpb091dHB1dEV2ZW50KGUuZ2V0UGFyc2VkTXNnKClbdGFsay5tZWRpYS5BVURJT19JTkZPX1NQRUFLRVJTX1BBUkFNXVt0YWxrLm1lZGlhLkFVRElPX0lORk9fU1BFQUtFUlNfU0VMRl0sIGUuZ2V0UGFyc2VkTXNnKClbdGFsay5tZWRpYS5BVURJT19JTkZPX1NFU1NJT05fSURfUEFSQU1dKSkKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuaGFuZGxlVGFsa1BsdWdpblNoYXJlTm90aWZ5TXNnXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRoYW5kbGVUYWxrUGx1Z2luU2hhcmVOb3RpZnlNc2dfJChlKSB7CiAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5hY3RpdmVDYWxsXykgJiYgdGhpcy5hY3RpdmVDYWxsXy5pc011bHRpd2F5KCkpIHsKICAgIHZhciBtc2cgPSBlLmdldFBhcnNlZE1zZygpOwogICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlNoYXJlTm90aWZ5RXZlbnQobXNnWzRdLmV2ZW50KSkKICB9Cn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmhhbmRsZVRhbGtQbHVnaW5TaGFyZVdpbmRvd3NNc2dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGhhbmRsZVRhbGtQbHVnaW5TaGFyZVdpbmRvd3NNc2dfJChlKSB7CiAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5hY3RpdmVDYWxsXykgJiYgdGhpcy5hY3RpdmVDYWxsXy5pc011bHRpd2F5KCkpIHsKICAgIHZhciBtc2cgPSBlLmdldFBhcnNlZE1zZygpOwogICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlNoYXJlV2luZG93c0V2ZW50KG1zZ1sxXSkpCiAgfQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5oYW5kbGVUYWxrUGx1Z2luU2hhcmVSZXN1bHRNc2dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGhhbmRsZVRhbGtQbHVnaW5TaGFyZVJlc3VsdE1zZ18kKGUpIHsKICBpZihnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmFjdGl2ZUNhbGxfKSAmJiB0aGlzLmFjdGl2ZUNhbGxfLmlzTXVsdGl3YXkoKSkgewogICAgdmFyIG1zZyA9IGUuZ2V0UGFyc2VkTXNnKCk7CiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU2hhcmVSZXN1bHRFdmVudChtc2dbNF0pKQogIH0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuZG9WYWRTd2l0Y2hpbmdfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGRvVmFkU3dpdGNoaW5nXyQoKSB7CiAgaWYodGhpcy5hY3RpdmVDYWxsXy52YWRTd2l0Y2hpbmdBbGxvd2VkKSB7CiAgICB2YXIgbG91ZGVzdFBhcnRpY2lwYW50ID0gdGhpcy5hY3RpdmVDYWxsXy5nZXRMb3VkZXN0U3BlYWtlcigpOwogICAgbG91ZGVzdFBhcnRpY2lwYW50ICYmIGxvdWRlc3RQYXJ0aWNpcGFudCAhPSB0aGlzLmFjdGl2ZUNhbGxfLmN1cnJlbnRTcGVha2VyICYmICh0aGlzLmFjdGl2ZUNhbGxfLmN1cnJlbnRTcGVha2VyID0gbG91ZGVzdFBhcnRpY2lwYW50LCB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU3BlYWtlckNoYW5nZWRFdmVudChsb3VkZXN0UGFydGljaXBhbnQpKSwgdGhpcy5zaG93SmlkXyhsb3VkZXN0UGFydGljaXBhbnQuZ2V0SmlkKCkpLCB0aGlzLmFjdGl2ZUNhbGxfLnZhZFN3aXRjaGluZ0FsbG93ZWQgPSAhMSwgdGhpcy52YWRTd2l0Y2hpbmdUaW1lb3V0Rm5fID0gZ29vZy5UaW1lci5jYWxsT25jZSh0aGlzLnZhZFN3aXRjaGluZ1RpbWVvdXRfLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlZBRF9TV0lUQ0hfVElNRU9VVF8sIHRoaXMpKQogIH0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuc2V0TWljcm9waG9uZU11dGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkc2V0TWljcm9waG9uZU11dGUkKG11dGUsIG9wdF9ldmVudFNvdXJjZSkgewogIHZhciBjYWxsID0gdGhpcy5hY3RpdmVDYWxsXzsKICBjYWxsICYmIG11dGUgIT0gY2FsbC5taWNNdXRlZCAmJiAoY2FsbC5taWNNdXRlZCA9IG11dGUsIHRoaXMuc2VuZEZsdXRlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUoWyJtdXRlIiwgY2FsbC5yZW1vdGVKaWRzWzBdLCBjYWxsLnNlc3Npb25JZCwgY2FsbC5taWNNdXRlZF0pKSwgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLk1pY011dGVFdmVudChjYWxsLnJlbW90ZUppZHNbMF0sIGNhbGwubWljTXV0ZWQsIGdvb2cuaXNEZWYob3B0X2V2ZW50U291cmNlKSA/IG9wdF9ldmVudFNvdXJjZSA6IHRhbGsubWVkaWEuRXZlbnRTb3VyY2UuVVNFUikpKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5nZXRNaWNyb3Bob25lTXV0ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRnZXRNaWNyb3Bob25lTXV0ZSQoKSB7CiAgcmV0dXJuIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMuYWN0aXZlQ2FsbF8pICYmIHRoaXMuYWN0aXZlQ2FsbF8ubWljTXV0ZWQKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuZ2V0Q2FtZXJhTXV0ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRnZXRDYW1lcmFNdXRlJCgpIHsKICByZXR1cm4gZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5hY3RpdmVDYWxsXykgJiYgdGhpcy5hY3RpdmVDYWxsXy5jYW1lcmFNdXRlZAp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5vblNoYXJlUmVzdWx0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRvblNoYXJlUmVzdWx0XyQocmVzdWx0KSB7CiAgdGhpcy5hY3RpdmVDYWxsXy5pc1NjcmVlbmNhc3RpbmcgPSByZXN1bHQuaXNTdWNjZXNzKCkgPyAhMCA6ICExCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLnN0b3BTY3JlZW5jYXN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJHN0b3BTY3JlZW5jYXN0JChvcHRfY2FsbCkgewogIGlmKCFvcHRfY2FsbCAmJiAhdGhpcy5oYXNBY3RpdmVDYWxsKCkpIHsKICAgIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy5zZXZlcmUoIkF0dGVtcHQgdG8gc3RvcCBzY3JlZW5jYXN0IHdpdGhvdXQgYW4gYWN0aXZlIGNhbGwuIikKICB9ZWxzZSB7CiAgICB2YXIgY2FsbCA9IG9wdF9jYWxsIHx8IHRoaXMuYWN0aXZlQ2FsbF87CiAgICBjYWxsLmlzU2NyZWVuY2FzdGluZyA/ICh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmxvZ2dlcl8uaW5mbygiU3RvcHBpbmcgc2NyZWVuY2FzdCBmb3IgY2FsbCB3aXRoIEpJRCAiICsgY2FsbC5yZW1vdGVKaWRzWzBdICsgIi4iKSwgdGhpcy5zdG9wU2NyZWVuY2FzdEluUGx1Z2luXyhjYWxsKSwgY2FsbC5pc1NjcmVlbmNhc3RpbmcgPSAhMSkgOiB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmxvZ2dlcl8uc2V2ZXJlKCJBdHRlbXB0IHRvIHN0b3Agc2NyZWVuY2FzdCB3aGlsZSBub3Qgc2NyZWVuY2FzdGluZy4iKQogIH0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuc3RvcFNjcmVlbmNhc3RJblBsdWdpbl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkc3RvcFNjcmVlbmNhc3RJblBsdWdpbl8kKGNhbGwpIHsKICB0aGlzLnNlbmRGbHV0ZU1zZyhnb29nLmpzb24uc2VyaWFsaXplKFsic2hhcmUtcmVtb3ZlIiwgY2FsbC5yZW1vdGVKaWRzWzBdLCBjYWxsLnNlc3Npb25JZCwgMF0pKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5kaXNwYXRjaFNjZW5lU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkZGlzcGF0Y2hTY2VuZVNlbGVjdGlvbkNoYW5nZUV2ZW50JChqaWQpIHsKICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuU2NlbmVTZWxlY3RDaGFuZ2VFdmVudChqaWQpKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5pc1NjcmVlbmNhc3RpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkaXNTY3JlZW5jYXN0aW5nJCgpIHsKICByZXR1cm4gdGhpcy5oYXNBY3RpdmVDYWxsKCkgJiYgdGhpcy5hY3RpdmVDYWxsXy5pc1NjcmVlbmNhc3RpbmcKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUudmFkU3dpdGNoaW5nVGltZW91dF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkdmFkU3dpdGNoaW5nVGltZW91dF8kKCkgewogIHRoaXMuYWN0aXZlQ2FsbF8udmFkU3dpdGNoaW5nQWxsb3dlZCA9ICEwOwogIHRoaXMudmFkU3dpdGNoaW5nVGltZW91dEZuXyA9IG51bGwKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuY2xlYXJWYWRTd2l0Y2hpbmdUaW1lb3V0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRjbGVhclZhZFN3aXRjaGluZ1RpbWVvdXRfJCgpIHsKICB0aGlzLnZhZFN3aXRjaGluZ1RpbWVvdXRGbl8gJiYgKGdvb2cuVGltZXIuY2xlYXIodGhpcy52YWRTd2l0Y2hpbmdUaW1lb3V0Rm5fKSwgdGhpcy52YWRTd2l0Y2hpbmdUaW1lb3V0Rm5fID0gbnVsbCkKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuc2hvd0ppZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkc2hvd0ppZF8kKGppZCkgewogIHZhciBtYXBFbnRyeSA9IHRoaXMuYWN0aXZlQ2FsbF8uc3NyY01hcC5nZXQoamlkKTsKICBtYXBFbnRyeSAmJiAobWFwRW50cnkudmlkZW9Tc3JjID8gdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLlNob3dWaWRlb0V2ZW50KG1hcEVudHJ5LnZpZGVvU3NyYywgdGhpcy5hY3RpdmVDYWxsXy5zZXNzaW9uSWQpKSA6IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5TaG93QXZhdGFyRXZlbnQodGhpcy5hY3RpdmVDYWxsXy5yZW1vdGVKaWRzWzBdLCBhcHBzLmNoYXQuY29yZS5KaWQuYmFyZVBhcnQoamlkKSkpLCB0aGlzLmFjdGl2ZUNhbGxfLmN1cnJlbnRTaG93bkppZCA9IGppZCkKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuc3dpdGNoRGlzcGxheWVkU3RyZWFtXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRzd2l0Y2hEaXNwbGF5ZWRTdHJlYW1fJChqaWQpIHsKICB2YXIgamlkcyA9IHRoaXMuYWN0aXZlQ2FsbF8uc3NyY01hcC5nZXRLZXlzKCk7CiAgamlkcy5zb3J0KCk7CiAgZm9yKHZhciBpID0gMDtpIDwgamlkcy5sZW5ndGg7aSsrKSB7CiAgICBpZihqaWQgIT0gamlkc1tpXSkgewogICAgICB2YXIgbWFwRW50cnkgPSB0aGlzLmFjdGl2ZUNhbGxfLnNzcmNNYXAuZ2V0KGppZHNbaV0pOwogICAgICBpZihtYXBFbnRyeS52aWRlb1NzcmMpIHsKICAgICAgICB0aGlzLnNob3dKaWRfKGppZHNbaV0pOwogICAgICAgIHJldHVybgogICAgICB9CiAgICB9CiAgfQogIHRoaXMuYWN0aXZlQ2FsbF8uY3VycmVudFNob3duSmlkID0gbnVsbAp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5mbHV0ZUFkZFN0cmVhbXNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGZsdXRlQWRkU3RyZWFtc18kKGppZCwgc3NyY01hcCkgewogIGlmKCFnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLnRhbGtQbHVnaW5fKSB8fCAhdGhpcy50YWxrUGx1Z2luXy5zdXBwb3J0TXVsdGlTdHJlYW1zKCkpIHsKICAgIHZhciBtYXBFbnRyeSA9IHNzcmNNYXAuZ2V0KGppZCk7CiAgICB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmxvZ2dlcl8uaW5mbygiU1NSQyBhZGQgeyIgKyBtYXBFbnRyeS5hdWRpb1NzcmMgKyAiLCAiICsgbWFwRW50cnkudmlkZW9Tc3JjICsgIn0gZm9yICIgKyBqaWQpOwogICAgdGhpcy5zZW5kRmx1dGVNc2coZ29vZy5qc29uLnNlcmlhbGl6ZShbImpzYSIsIHRoaXMuYWN0aXZlQ2FsbF8ucmVtb3RlSmlkc1swXSwgdGhpcy5hY3RpdmVDYWxsXy5zZXNzaW9uSWQsIG1hcEVudHJ5LmF1ZGlvU3NyYyA/IG1hcEVudHJ5LmF1ZGlvU3NyYyA6ICIwIiwgbWFwRW50cnkudmlkZW9Tc3JjID8gbWFwRW50cnkudmlkZW9Tc3JjIDogIjAiLCBqaWRdKSkKICB9Cn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmZsdXRlUmVtb3ZlU3RyZWFtc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkZmx1dGVSZW1vdmVTdHJlYW1zXyQoamlkLCBzc3JjTWFwKSB7CiAgaWYoIWdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMudGFsa1BsdWdpbl8pIHx8ICF0aGlzLnRhbGtQbHVnaW5fLnN1cHBvcnRNdWx0aVN0cmVhbXMoKSkgewogICAgdmFyIG1hcEVudHJ5ID0gc3NyY01hcC5nZXQoamlkKTsKICAgIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy5pbmZvKCJTU1JDIHJlbW92ZSB7IiArIG1hcEVudHJ5LmF1ZGlvU3NyYyArICIsICIgKyBtYXBFbnRyeS52aWRlb1NzcmMgKyAifSBmb3IgIiArIGppZCk7CiAgICB0aGlzLnNlbmRGbHV0ZU1zZyhnb29nLmpzb24uc2VyaWFsaXplKFsianNyIiwgdGhpcy5hY3RpdmVDYWxsXy5yZW1vdGVKaWRzWzBdLCB0aGlzLmFjdGl2ZUNhbGxfLnNlc3Npb25JZCwgbWFwRW50cnkuYXVkaW9Tc3JjID8gbWFwRW50cnkuYXVkaW9Tc3JjIDogIjAiLCBtYXBFbnRyeS52aWRlb1NzcmMgPyBtYXBFbnRyeS52aWRlb1NzcmMgOiAiMCIsIGppZF0pKQogIH0KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuc3NyY01hcFVwZGF0ZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkc3NyY01hcFVwZGF0ZWQkKG9wdF9qaWQpIHsKICBpZih0aGlzLmFjdGl2ZUNhbGxfICYmIHRoaXMuYWN0aXZlQ2FsbF8uc3NyY01hcCkgewogICAgdmFyIGppZHM7CiAgICBqaWRzID0gb3B0X2ppZCA/IFtvcHRfamlkXSA6IHRoaXMuYWN0aXZlQ2FsbF8uc3NyY01hcC5nZXRLZXlzKCk7CiAgICBmb3IodmFyIG51bVNlbmRlcnMgPSB0aGlzLmFjdGl2ZUNhbGxfLmdldE51bWJlck9mVmlkZW9TZW5kZXJzKCksIGkgPSAwO2kgPCBqaWRzLmxlbmd0aDtpKyspIHsKICAgICAgdmFyIGppZCA9IGppZHNbaV0sIG1hcEVudHJ5ID0gdGhpcy5hY3RpdmVDYWxsXy5zc3JjTWFwLmdldChqaWQpOwogICAgICB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmxvZ2dlcl8uaW5mbygiU1NSQyBtYXAgdXBkYXRlIGZvciAiICsgamlkKTsKICAgICAgaWYobWFwRW50cnkgJiYgbWFwRW50cnkudXBkYXRlKSB7CiAgICAgICAgaWYobWFwRW50cnkuYXVkaW9Tc3JjICYmIG1hcEVudHJ5LmF1ZGlvU3NyYyAhPSBtYXBFbnRyeS5uZXdBdWRpb1NzcmMgfHwgbWFwRW50cnkudmlkZW9Tc3JjICYmIG1hcEVudHJ5LnZpZGVvU3NyYyAhPSBtYXBFbnRyeS5uZXdWaWRlb1NzcmMpIHsKICAgICAgICAgIHRoaXMuZmx1dGVSZW1vdmVTdHJlYW1zXyhqaWQsIHRoaXMuYWN0aXZlQ2FsbF8uc3NyY01hcCk7CiAgICAgICAgICB2YXIgYXVkaW9Tc3JjID0gbWFwRW50cnkuYXVkaW9Tc3JjLCB2aWRlb1NzcmMgPSBtYXBFbnRyeS52aWRlb1NzcmM7CiAgICAgICAgICBtYXBFbnRyeS5hdWRpb1NzcmMgPSBudWxsOwogICAgICAgICAgbWFwRW50cnkudmlkZW9Tc3JjID0gbnVsbDsKICAgICAgICAgIHZpZGVvU3NyYyA/IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5SZW1vdmVQYXJ0aWNpcGFudEV2ZW50KHZpZGVvU3NyYywgdGhpcy5hY3RpdmVDYWxsXy5zZXNzaW9uSWQsIG1hcEVudHJ5LnBhcnRpY2lwYW50KSkgOiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuUmVtb3ZlUGFydGljaXBhbnRFdmVudChhdWRpb1NzcmMsIHRoaXMuYWN0aXZlQ2FsbF8uc2Vzc2lvbklkLCBtYXBFbnRyeS5wYXJ0aWNpcGFudCkpOwogICAgICAgICAgamlkID09IHRoaXMuYWN0aXZlQ2FsbF8uY3VycmVudFNob3duSmlkICYmIHRoaXMuc3dpdGNoRGlzcGxheWVkU3RyZWFtXyhqaWQpOwogICAgICAgICAgbWFwRW50cnkucGFydGljaXBhbnQgPT0gdGhpcy5hY3RpdmVDYWxsXy5jdXJyZW50U3BlYWtlciAmJiAodGhpcy5hY3RpdmVDYWxsXy5jdXJyZW50U3BlYWtlciA9IG51bGwpCiAgICAgICAgfQogICAgICAgIGlmKG1hcEVudHJ5Lm5ld0F1ZGlvU3NyYyB8fCBtYXBFbnRyeS5uZXdWaWRlb1NzcmMpIHsKICAgICAgICAgIGlmKG1hcEVudHJ5Lm5ld0F1ZGlvU3NyYyAhPSBtYXBFbnRyeS5hdWRpb1NzcmMgfHwgbWFwRW50cnkubmV3VmlkZW9Tc3JjICE9IG1hcEVudHJ5LnZpZGVvU3NyYykgewogICAgICAgICAgICBtYXBFbnRyeS5hdWRpb1NzcmMgPSBtYXBFbnRyeS5uZXdBdWRpb1NzcmMsIG1hcEVudHJ5LnZpZGVvU3NyYyA9IG1hcEVudHJ5Lm5ld1ZpZGVvU3NyYywgIXRoaXMuc3RyYW5nZXJNYW5hZ2VyXyB8fCB0aGlzLnN0cmFuZ2VyTWFuYWdlcl8uc2hvdWxkU2hvd1N0cmFuZ2VyKGppZCkgPyAodGhpcy5mbHV0ZUFkZFN0cmVhbXNfKGppZCwgdGhpcy5hY3RpdmVDYWxsXy5zc3JjTWFwKSwgdGhpcy5ub3RpZnlVaV8oamlkLCBtYXBFbnRyeSkpIDogKHRoaXMuYWRkVG9Mb2coIlN1cHByZXNzIGpzYSwgamlkOiAiICsgamlkKSwgdGhpcy5zdHJhbmdlck1hbmFnZXJfICYmIHRoaXMuYWRkVG9Mb2coInNob3VsZFNob3dTdHJhbmdlcjogIiArIHRoaXMuc3RyYW5nZXJNYW5hZ2VyXy5zaG91bGRTaG93U3RyYW5nZXIoamlkKSkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICFtYXBFbnRyeS5hdWRpb1NzcmMgJiYgIW1hcEVudHJ5LnZpZGVvU3NyYyA/IHRoaXMuYWN0aXZlQ2FsbF8uc3NyY01hcC5yZW1vdmUoamlkKSA6IG1hcEVudHJ5LnVwZGF0ZSA9ICExCiAgICAgIH0KICAgIH0KICAgIGlmKHRoaXMuYWN0aXZlQ2FsbF8udXNlVmlkZW9CYW5kd2lkdGhMaW1pdGF0aW9uKCkpIHsKICAgICAgdmFyIG51bVNlbmRlcnNOb3cgPSB0aGlzLmFjdGl2ZUNhbGxfLmdldE51bWJlck9mVmlkZW9TZW5kZXJzKCk7CiAgICAgIGlmKG51bVNlbmRlcnNOb3cgIT0gbnVtU2VuZGVycykgewogICAgICAgIHZhciBidyA9IHRoaXMuYWN0aXZlQ2FsbF8uY2FsY3VsYXRlVmlkZW9TZW5kQmFuZHdpZHRoKCk7CiAgICAgICAgYncgJiYgdGhpcy5zZXRWaWRlb1NlbmRCYW5kd2lkdGhfKGJ3KQogICAgICB9CiAgICB9CiAgICB0aGlzLmFjdGl2ZUNhbGxfLnVwZGF0ZU1heENvbmN1cnJlbnRQYXJ0aWNpcGFudHNfKCkKICB9Cn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLm5vdGlmeVVpXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRub3RpZnlVaV8kKGppZCwgbWFwRW50cnkpIHsKICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQWRkUGFydGljaXBhbnRFdmVudCh0aGlzLmFjdGl2ZUNhbGxfLnNlc3Npb25JZCwgbWFwRW50cnkucGFydGljaXBhbnQpKTsKICBtYXBFbnRyeS52aWRlb1NzcmMgJiYgdGhpcy5zaG93SmlkXyhqaWQpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmlzRmxhc2hSZXF1aXJlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRpc0ZsYXNoUmVxdWlyZWQkKCkgewogIHJldHVybiF0aGlzLnVzZUNsaWVudDNEKCkgJiYgIWdvb2cudXNlckFnZW50LkxJTlVYCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLnVzZUNsaWVudDNEID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJHVzZUNsaWVudDNEJCgpIHsKICByZXR1cm4gdGhpcy5jYW5Vc2VDbGllbnQzRCgpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmNhblVzZUNsaWVudDNEID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGNhblVzZUNsaWVudDNEJCgpIHsKICByZXR1cm4gdGhpcy5pc1RhbGtQbHVnaW5FbmFibGVkKCkgJiYgdGhpcy50YWxrUGx1Z2luXy5jYW5Vc2VDbGllbnQzRCgpICYmIHRoaXMuZ2V0Q2FsbGluZ1JlcXVpcmVtZW50cygpLmNhblVzZUNsaWVudDNEKCkKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuY2FuVXNlRmxhc2ggPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkY2FuVXNlRmxhc2gkKCkgewogIHJldHVybiB0aGlzLmlzVGFsa1BsdWdpbkVuYWJsZWQoKSAmJiB0aGlzLnRhbGtQbHVnaW5fLmNhblVzZUZsYXNoKCkgJiYgdGhpcy5nZXRDYWxsaW5nUmVxdWlyZW1lbnRzKCkuY2FuVXNlRmxhc2goKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5zZXRWaWRlb1NlbmRCYW5kd2lkdGhfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJHNldFZpZGVvU2VuZEJhbmR3aWR0aF8kKGJhbmR3aWR0aEticHMpIHsKICB0aGlzLmFjdGl2ZUNhbGxfICYmIGJhbmR3aWR0aEticHMgJiYgKHRoaXMuc2VuZEZsdXRlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUoWyJqc2hvdyIsIHRoaXMuYWN0aXZlQ2FsbF8ucmVtb3RlSmlkc1swXSwgdGhpcy5hY3RpdmVDYWxsXy5zZXNzaW9uSWQsIHttYXhCYW5kd2lkdGg6MTAyNCAqIGJhbmR3aWR0aEticHN9XSkpLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLmxvZ2dlcl8uaW5mbygiVmlkZW8gc2VuZGluZyBiYW5kd2lkdGggc2V0IHRvICIgKyBiYW5kd2lkdGhLYnBzICsgIiBrYnBzLiIpKQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5kb1VwbG9hZExvZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRkb1VwbG9hZExvZyQoc2Vzc2lvbklkLCBvcHRfY2hhdEppZCkgewogIHZhciBqaWQgPSBvcHRfY2hhdEppZCB8fCAidW5rbm93biI7CiAgdGhpcy5zZW5kRmx1dGVNc2coZ29vZy5qc29uLnNlcmlhbGl6ZShbInVwbG9hZGxvZyIsIGppZCwgc2Vzc2lvbklkXSkpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLnRvZ2dsZURldGFpbGVkTG9nZ2luZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCR0b2dnbGVEZXRhaWxlZExvZ2dpbmckKHR5cGUpIHsKICB2YXIgbG9nTGV2ZWwgPSBudWxsOwogIHRoaXMuYWN0aXZlQ2FsbF8gJiYgKGxvZ0xldmVsID0gdHlwZSA9PSB0YWxrLm1lZGlhLk1lZGlhVHlwZS5BVURJTyA/IHRoaXMuYWN0aXZlQ2FsbF8udG9nZ2xlRGV0YWlsZWRBdWRpb0xvZ2dpbmcoKSA6IHRoaXMuYWN0aXZlQ2FsbF8udG9nZ2xlRGV0YWlsZWRWaWRlb0xvZ2dpbmcoKSwgdGhpcy5zZW5kRmx1dGVNc2coZ29vZy5qc29uLnNlcmlhbGl6ZShbImRlYnVnIiwgdGhpcy5hY3RpdmVDYWxsXy5yZW1vdGVKaWRzWzBdLCB0aGlzLmFjdGl2ZUNhbGxfLnNlc3Npb25JZCwgImxvZyIsIHt0eXBlOnR5cGUsIGxldmVsOmxvZ0xldmVsfV0pKSk7CiAgcmV0dXJuIGxvZ0xldmVsCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMuYWN0aXZlQ2FsbF8gJiYgdGhpcy5kb0VuZENhbGxfKHRoaXMuYWN0aXZlQ2FsbF8sIHRoaXMuZGV0ZXJtaW5lRW5kQ2F1c2VfKHRoaXMuYWN0aXZlQ2FsbF8pLCAiQ2FsbE1hbmFnZXIuZGlzcG9zZUludGVybmFsIik7CiAgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICBnb29nLmRpc3Bvc2UodGhpcy5kZXZpY2VTdGF0dXNfKTsKICB0aGlzLmNhbGxTdGFydFRpbWVyXy5kaXNwb3NlKCk7CiAgdGhpcy5jYWxsU3RhcnRUaW1lcl8gPSBudWxsOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5kaXNwb3NlKCk7CiAgZ29vZy5UaW1lci5jbGVhcih0aGlzLnJlY29yZFRpbWVyXyk7CiAgdGhpcy50YWxrUGx1Z2luXyA9IHRoaXMuZXZlbnRIYW5kbGVyXyA9IG51bGwKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5wcm90b3R5cGUuZ2V0TG9jYWxOaWNrID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkJGdldExvY2FsTmljayQoKSB7CiAgcmV0dXJuIHRoaXMubG9jYWxOaWNrXwp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLnByb3RvdHlwZS5nZXRMb2NhbFByZXZpZXcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciQkZ2V0TG9jYWxQcmV2aWV3JCgpIHsKICByZXR1cm4gdGhpcy5sb2NhbFByZXZpZXdfCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIucHJvdG90eXBlLmdldFBhc3NUaHJvdWdoSm1pZGF0YSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJCRnZXRQYXNzVGhyb3VnaEptaWRhdGEkKCkgewogIHJldHVybiB0aGlzLnBhc3NUaHJvdWdoSm1pZGF0YV8KfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkQ2FsbCQocmVtb3RlSmlkcywgdHlwZSwgb3B0X3Nlc3Npb25JZCkgewogIGZvcih2YXIgaSA9IDA7aSA8IHJlbW90ZUppZHMubGVuZ3RoO2krKykgewogICAgaWYoIWFwcHMuY2hhdC5jb3JlLkppZC5pc1ZhbGlkKHJlbW90ZUppZHNbaV0pKSB7CiAgICAgIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIubG9nZ2VyXy53YXJuaW5nKCJJbnZhbGlkIEpJRCwgIiArIHJlbW90ZUppZHNbaV0gKyAiLCBpbiB0aGUgYXJyYXkgb2YgcmVtb3RlSmlkcyIpOwogICAgICByZXR1cm4KICAgIH0KICB9CiAgdGhpcy5yZW1vdGVKaWRzID0gcmVtb3RlSmlkczsKICB0aGlzLnNlc3Npb25JZCA9IG9wdF9zZXNzaW9uSWQgfHwgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLmdlbmVyYXRlSWRfKCk7CiAgdGhpcy5zdGF0ZSA9IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5TdGF0ZS5VTklOSVRJQUxJWkVEOwogIHRoaXMudHlwZSA9IHR5cGU7CiAgdGhpcy5taWNNdXRlZCA9ICExOwogIHRoaXMub3V0cHV0TGV2ZWwgPSBudWxsOwogIHRoaXMuY2FtZXJhTXV0ZWQgPSB0aGlzLnJlY29yZGluZyA9ICExOwogIHRoaXMucXVldWVkSmluZ2xlTWVzc2FnZXMgPSBuZXcgZ29vZy5zdHJ1Y3RzLlF1ZXVlOwogIHRoaXMudXNlclZvbHVtZXMgPSBbXTsKICB0aGlzLnBlbmRpbmdEdG1mTWVzc2FnZXNzID0gW107CiAgdGhpcy52YWRTd2l0Y2hpbmdBbGxvd2VkID0gITA7CiAgdGhpcy5zdGFydFRpbWUgPSBnb29nLm5vdygpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5TdGF0ZSA9IHtVTklOSVRJQUxJWkVEOjAsIElOQ09NSU5HX1JJTkc6MSwgT1VUR09JTkdfUklORzoyLCBBQ1RJVkVfQ0FMTDozLCBDQUxMX09OX0hPTEQ6NH07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5wcm90b3R5cGUud3JpdGFibGVfID0gITA7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5wcm90b3R5cGUubGFzdFdyaXRhYmxlVGltZV8gPSAtMTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLnByb3RvdHlwZS51c2VWaWRlb0JhbmR3aWR0aExpbWl0YXRpb25fID0gITE7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5wcm90b3R5cGUuaGFzU3J0cF8gPSAhMTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLnByb3RvdHlwZS5hdWRpb0xvZ0xldmVsXyA9IHRhbGsubWVkaWEuUGx1Z2luTG9nTGV2ZWwuV0FSTklORzsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLnByb3RvdHlwZS52aWRlb0xvZ0xldmVsXyA9IHRhbGsubWVkaWEuUGx1Z2luTG9nTGV2ZWwuV0FSTklORzsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLnByb3RvdHlwZS5tYXhDb25jdXJyZW50UGFydGljaXBhbnRzXyA9IDA7CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5nZW5lcmF0ZUlkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJENhbGwkZ2VuZXJhdGVJZF8kKCkgewogIHJldHVybiJjIiArIE1hdGgucm91bmQoMjE0NzQ4MzY0OCAqIE1hdGgucmFuZG9tKCkpCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJENhbGwkJGNvcHkkKCkgewogIHZhciB0aGVDYWxsID0gbmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbCh0aGlzLnJlbW90ZUppZHMsIHRoaXMudHlwZSwgdGhpcy5zZXNzaW9uSWQpOwogIHRoZUNhbGwuc3RhdGUgPSB0aGlzLnN0YXRlOwogIHRoZUNhbGwubWljTXV0ZWQgPSB0aGlzLm1pY011dGVkOwogIHRoZUNhbGwub3V0cHV0TGV2ZWwgPSB0aGlzLm91dHB1dExldmVsOwogIHRoZUNhbGwuY2FtZXJhTXV0ZWQgPSB0aGlzLmNhbWVyYU11dGVkOwogIHRoZUNhbGwuc2V0V3JpdGFiaWxpdHkodGhpcy5pc1dyaXRhYmxlKCkpOwogIHRoZUNhbGwubGFzdFdyaXRhYmxlVGltZV8gPSB0aGlzLmxhc3RXcml0YWJsZVRpbWVfOwogIHRoZUNhbGwuaGFzU3J0cF8gPSB0aGlzLmhhc1NydHBfOwogIHRoZUNhbGwuZW5kQ2F1c2VfID0gdGhpcy5lbmRDYXVzZV87CiAgdGhlQ2FsbC5xdWV1ZWRKaW5nbGVNZXNzYWdlcyA9IHRoaXMucXVldWVkSmluZ2xlTWVzc2FnZXM7CiAgdGhlQ2FsbC5zc3JjTWFwID0gdGhpcy5zc3JjTWFwOwogIHRoZUNhbGwudXNlclZvbHVtZXMgPSB0aGlzLnVzZXJWb2x1bWVzOwogIHRoZUNhbGwubG9jYWxWb2x1bWUgPSB0aGlzLmxvY2FsVm9sdW1lOwogIHRoZUNhbGwuY3VycmVudFNwZWFrZXIgPSB0aGlzLmN1cnJlbnRTcGVha2VyOwogIHRoZUNhbGwuY3VycmVudFNob3duSmlkID0gdGhpcy5jdXJyZW50U2hvd25KaWQ7CiAgdGhlQ2FsbC52YWRTd2l0Y2hpbmdBbGxvd2VkID0gdGhpcy52YWRTd2l0Y2hpbmdBbGxvd2VkOwogIHRoZUNhbGwuaXNPdXRib3VuZCA9IHRoaXMuaXNPdXRib3VuZDsKICB0aGVDYWxsLmlzU2NyZWVuY2FzdGluZyA9IHRoaXMuaXNTY3JlZW5jYXN0aW5nOwogIHRoZUNhbGwucmVjb3JkaW5nID0gdGhpcy5yZWNvcmRpbmc7CiAgdGhlQ2FsbC5sb2dMZXZlbF8gPSB0aGlzLmxvZ0xldmVsXzsKICB0aGVDYWxsLnN0YXJ0VGltZSA9IHRoaXMuc3RhcnRUaW1lOwogIHRoZUNhbGwubWF4Q29uY3VycmVudFBhcnRpY2lwYW50c18gPSB0aGlzLm1heENvbmN1cnJlbnRQYXJ0aWNpcGFudHNfOwogIHJldHVybiB0aGVDYWxsCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5wcm90b3R5cGUudXBkYXRlSmlkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJENhbGwkJHVwZGF0ZUppZF8kKG9sZEppZCwgbmV3SmlkKSB7CiAgdmFyIG9sZEppZEJhcmUgPSBhcHBzLmNoYXQuY29yZS5KaWQuYmFyZVBhcnQob2xkSmlkKTsKICBpZihvbGRKaWRCYXJlID09IGFwcHMuY2hhdC5jb3JlLkppZC5iYXJlUGFydChuZXdKaWQpKSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLnJlbW90ZUppZHMubGVuZ3RoO2krKykgewogICAgICBpZihhcHBzLmNoYXQuY29yZS5KaWQuYmFyZVBhcnQodGhpcy5yZW1vdGVKaWRzW2ldKSA9PSBvbGRKaWRCYXJlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3RlSmlkc1tpXSA9IG5ld0ppZCwgITAKICAgICAgfQogICAgfQogIH0KICByZXR1cm4hMQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNhbGwucHJvdG90eXBlLmlzV2l0aCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJENhbGwkJGlzV2l0aCQoamlkKSB7CiAgaWYoYXBwcy5jaGF0LmNvcmUuSmlkLmlzVmFsaWQoamlkKSkgewogICAgZm9yKHZhciBqaWQgPSBhcHBzLmNoYXQuY29yZS5KaWQuYmFyZVBhcnQoamlkKSwgaSA9IDA7aSA8IHRoaXMucmVtb3RlSmlkcy5sZW5ndGg7aSsrKSB7CiAgICAgIGlmKGFwcHMuY2hhdC5jb3JlLkppZC5iYXJlUGFydCh0aGlzLnJlbW90ZUppZHNbaV0pID09IGppZCkgewogICAgICAgIHJldHVybiEwCiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuITEKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLnByb3RvdHlwZS50b2dnbGVEZXRhaWxlZEF1ZGlvTG9nZ2luZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJENhbGwkJHRvZ2dsZURldGFpbGVkQXVkaW9Mb2dnaW5nJCgpIHsKICByZXR1cm4gdGhpcy5hdWRpb0xvZ0xldmVsXyA9IHRoaXMuYXVkaW9Mb2dMZXZlbF8gPT0gdGFsay5tZWRpYS5QbHVnaW5Mb2dMZXZlbC5XQVJOSU5HID8gdGFsay5tZWRpYS5QbHVnaW5Mb2dMZXZlbC5JTkZPIDogdGFsay5tZWRpYS5QbHVnaW5Mb2dMZXZlbC5XQVJOSU5HCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5wcm90b3R5cGUudG9nZ2xlRGV0YWlsZWRWaWRlb0xvZ2dpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRDYWxsJCR0b2dnbGVEZXRhaWxlZFZpZGVvTG9nZ2luZyQoKSB7CiAgcmV0dXJuIHRoaXMudmlkZW9Mb2dMZXZlbF8gPSB0aGlzLnZpZGVvTG9nTGV2ZWxfID09IHRhbGsubWVkaWEuUGx1Z2luTG9nTGV2ZWwuV0FSTklORyA/IHRhbGsubWVkaWEuUGx1Z2luTG9nTGV2ZWwuSU5GTyA6IHRhbGsubWVkaWEuUGx1Z2luTG9nTGV2ZWwuV0FSTklORwp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNhbGwucHJvdG90eXBlLnNldFdyaXRhYmlsaXR5ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkQ2FsbCQkc2V0V3JpdGFiaWxpdHkkKHdyaXRhYmxlKSB7CiAgIXdyaXRhYmxlICYmIHRoaXMud3JpdGFibGVfICYmICh0aGlzLmxhc3RXcml0YWJsZVRpbWVfID0gZ29vZy5ub3coKSk7CiAgdGhpcy53cml0YWJsZV8gPSB3cml0YWJsZQp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNhbGwucHJvdG90eXBlLnNldEhhc1NydHAgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRDYWxsJCRzZXRIYXNTcnRwJChoYXNTcnRwKSB7CiAgdGhpcy5oYXNTcnRwXyA9IGhhc1NydHAKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLnByb3RvdHlwZS5zZXRFbmRDYXVzZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJENhbGwkJHNldEVuZENhdXNlJChlbmRDYXVzZSkgewogIHRoaXMuZW5kQ2F1c2VfID0gZW5kQ2F1c2UKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLnByb3RvdHlwZS5pc1dyaXRhYmxlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkQ2FsbCQkaXNXcml0YWJsZSQoKSB7CiAgcmV0dXJuIHRoaXMud3JpdGFibGVfCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5wcm90b3R5cGUubGFzdFdyaXRhYmxlVGltZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJENhbGwkJGxhc3RXcml0YWJsZVRpbWUkKCkgewogIHJldHVybiB0aGlzLndyaXRhYmxlXyA/IGdvb2cubm93KCkgOiB0aGlzLmxhc3RXcml0YWJsZVRpbWVfCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5wcm90b3R5cGUuZ2V0TG91ZGVzdFNwZWFrZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRDYWxsJCRnZXRMb3VkZXN0U3BlYWtlciQoKSB7CiAgZm9yKHZhciBsb3VkZXN0Vm9sdW1lID0gMSwgbG91ZGVzdFBhcnRpY2lwYW50ID0gbnVsbCwgaSA9IDA7aSA8IHRoaXMudXNlclZvbHVtZXMubGVuZ3RoO2krKykgewogICAgdmFyIGlkID0gdGhpcy5nZXRJZEZvckF1ZGlvU3NyYyh0aGlzLnVzZXJWb2x1bWVzW2ldWzBdKTsKICAgIGlmKGlkKSB7CiAgICAgIHZhciBtYXBFbnRyeSA9IHRoaXMuc3NyY01hcC5nZXQoaWQpOwogICAgICB0aGlzLnVzZXJWb2x1bWVzW2ldWzFdID4gbG91ZGVzdFZvbHVtZSAmJiAobG91ZGVzdFZvbHVtZSA9IHRoaXMudXNlclZvbHVtZXNbaV1bMV0sIGxvdWRlc3RQYXJ0aWNpcGFudCA9IG1hcEVudHJ5LnBhcnRpY2lwYW50KQogICAgfQogIH0KICByZXR1cm4gbG91ZGVzdFBhcnRpY2lwYW50Cn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5wcm90b3R5cGUuZ2V0SWRGb3JBdWRpb1NzcmMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRDYWxsJCRnZXRJZEZvckF1ZGlvU3NyYyQoYXVkaW9Tc3JjKSB7CiAgZm9yKHZhciBpZHMgPSB0aGlzLnNzcmNNYXAuZ2V0S2V5cygpLCBpID0gMDtpIDwgaWRzLmxlbmd0aDtpKyspIHsKICAgIGlmKHRoaXMuc3NyY01hcC5nZXQoaWRzW2ldKS5hdWRpb1NzcmMgPT0gYXVkaW9Tc3JjKSB7CiAgICAgIHJldHVybiBpZHNbaV0KICAgIH0KICB9CiAgcmV0dXJuIG51bGwKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLnByb3RvdHlwZS5nZXRKaWRGb3JTc3JjID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkQ2FsbCQkZ2V0SmlkRm9yU3NyYyQoc3NyYywgdHlwZSkgewogIGZvcih2YXIgamlkcyA9IHRoaXMuc3NyY01hcC5nZXRLZXlzKCksIGkgPSAwO2kgPCBqaWRzLmxlbmd0aDtpKyspIHsKICAgIHZhciBtYXBFbnRyeSA9IHRoaXMuc3NyY01hcC5nZXQoamlkc1tpXSk7CiAgICBpZih0eXBlID09IHRhbGsubWVkaWEuTWVkaWFUeXBlLkFVRElPICYmIG1hcEVudHJ5LmF1ZGlvU3NyYyA9PSBzc3JjIHx8IHR5cGUgPT0gdGFsay5tZWRpYS5NZWRpYVR5cGUuVklERU8gJiYgbWFwRW50cnkudmlkZW9Tc3JjID09IHNzcmMpIHsKICAgICAgcmV0dXJuIGdvb2cuaXNEZWZBbmROb3ROdWxsKG1hcEVudHJ5LnVzZXJKaWQpID8gbWFwRW50cnkudXNlckppZCA6IGppZHNbaV0KICAgIH0KICB9CiAgcmV0dXJuIG51bGwKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLnByb3RvdHlwZS5nZXROdW1iZXJPZkF1ZGlvU2VuZGVycyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJENhbGwkJGdldE51bWJlck9mQXVkaW9TZW5kZXJzJCgpIHsKICBpZighdGhpcy5pc011bHRpd2F5KCkpIHsKICAgIHJldHVybiBudWxsCiAgfQogIGZvcih2YXIgamlkcyA9IHRoaXMuc3NyY01hcC5nZXRLZXlzKCksIG51bVNlbmRlcnMgPSAwLCBpID0gMDtpIDwgamlkcy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgbWFwRW50cnkgPSB0aGlzLnNzcmNNYXAuZ2V0KGppZHNbaV0pOwogICAgbWFwRW50cnkuYXVkaW9Tc3JjICYmIG51bVNlbmRlcnMrKwogIH0KICByZXR1cm4gbnVtU2VuZGVycwp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNhbGwucHJvdG90eXBlLmdldE51bWJlck9mVmlkZW9TZW5kZXJzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkQ2FsbCQkZ2V0TnVtYmVyT2ZWaWRlb1NlbmRlcnMkKCkgewogIGlmKCF0aGlzLmlzTXVsdGl3YXkoKSkgewogICAgcmV0dXJuIG51bGwKICB9CiAgZm9yKHZhciBqaWRzID0gdGhpcy5zc3JjTWFwLmdldEtleXMoKSwgbnVtU2VuZGVycyA9IDAsIGkgPSAwO2kgPCBqaWRzLmxlbmd0aDtpKyspIHsKICAgIHZhciBtYXBFbnRyeSA9IHRoaXMuc3NyY01hcC5nZXQoamlkc1tpXSk7CiAgICBtYXBFbnRyeS52aWRlb1NzcmMgJiYgbnVtU2VuZGVycysrCiAgfQogIHJldHVybiBudW1TZW5kZXJzCn07CnRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5wcm90b3R5cGUuY2FsY3VsYXRlVmlkZW9TZW5kQmFuZHdpZHRoID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkQ2FsbCQkY2FsY3VsYXRlVmlkZW9TZW5kQmFuZHdpZHRoJCgpIHsKICB2YXIgbnVtU2VuZGVycyA9IHRoaXMuZ2V0TnVtYmVyT2ZWaWRlb1NlbmRlcnMoKTsKICBpZighbnVtU2VuZGVycykgewogICAgcmV0dXJuIHRoaXMubWF4VmlkZW9TZW5kQmFuZHdpZHRoS2Jwc18KICB9CiAgdmFyIGJ3UGVyU2VuZGVyS2JwcyA9IE1hdGgucm91bmQodGhpcy50b3RhbFZpZGVvQmFuZHdpZHRoS2Jwc18gLyBudW1TZW5kZXJzKTsKICByZXR1cm4gYndQZXJTZW5kZXJLYnBzID4gdGhpcy5tYXhWaWRlb1NlbmRCYW5kd2lkdGhLYnBzXyA/IHRoaXMubWF4VmlkZW9TZW5kQmFuZHdpZHRoS2Jwc18gOiBid1BlclNlbmRlckticHMgPCB0aGlzLm1pblZpZGVvU2VuZEJhbmR3aWR0aEticHNfID8gdGhpcy5taW5WaWRlb1NlbmRCYW5kd2lkdGhLYnBzXyA6IGJ3UGVyU2VuZGVyS2Jwcwp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNhbGwucHJvdG90eXBlLnVzZVZpZGVvQmFuZHdpZHRoTGltaXRhdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJENhbGwkJHVzZVZpZGVvQmFuZHdpZHRoTGltaXRhdGlvbiQoKSB7CiAgcmV0dXJuIHRoaXMudXNlVmlkZW9CYW5kd2lkdGhMaW1pdGF0aW9uXwp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNhbGwucHJvdG90eXBlLmlzTXVsdGl3YXkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsTWFuYWdlciRDYWxsJCRpc011bHRpd2F5JCgpIHsKICByZXR1cm4hIXRoaXMuc3NyY01hcAp9Owp0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkNhbGwucHJvdG90eXBlLmlzT25Ib2xkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbE1hbmFnZXIkQ2FsbCQkaXNPbkhvbGQkKCkgewogIHJldHVybiB0aGlzLnN0YXRlID09IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuQ2FsbC5TdGF0ZS5DQUxMX09OX0hPTEQKfTsKdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLnByb3RvdHlwZS51cGRhdGVNYXhDb25jdXJyZW50UGFydGljaXBhbnRzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxNYW5hZ2VyJENhbGwkJHVwZGF0ZU1heENvbmN1cnJlbnRQYXJ0aWNpcGFudHNfJCgpIHsKICB0aGlzLm1heENvbmN1cnJlbnRQYXJ0aWNpcGFudHNfID0gTWF0aC5tYXgodGhpcy5zc3JjTWFwLmdldENvdW50KCksIHRoaXMubWF4Q29uY3VycmVudFBhcnRpY2lwYW50c18pCn07CmFwcHMuY2hhdC5tb2RlbCA9IHt9OwphcHBzLmNoYXQubW9kZWwuTXVjUGFydGljaXBhbnQgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JG1vZGVsJE11Y1BhcnRpY2lwYW50JChpbmZvLCBiYXJlUm9vbUppZCwgbG9jYWwsIHBhcmVudEV2ZW50VGFyZ2V0KSB7CiAgdGhpcy5yb2xlXyA9IGluZm8ucm9sZTsKICB0aGlzLmF2YXRhclVybF8gPSBpbmZvLmF2YXRhclVybDsKICB0aGlzLnNob3dfID0gaW5mby5zaG93OwogIHRoaXMuaXNJbnRlcm5hbFBhcnRpY2lwYW50XyA9IGluZm8uaXNJbnRlcm5hbFBhcnRpY2lwYW50IHx8ICExOwogIHRoaXMubG9jYWxfID0gbG9jYWw7CiAgdGhpcy5zZXRQYXJlbnRFdmVudFRhcmdldChwYXJlbnRFdmVudFRhcmdldCkKfTsKZ29vZy5pbmhlcml0cyhhcHBzLmNoYXQubW9kZWwuTXVjUGFydGljaXBhbnQsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKYXBwcy5jaGF0Lm1vZGVsLk11Y1BhcnRpY2lwYW50LlJvbGUgPSB7Tk9ORToibm9uZSIsIE1PREVSQVRPUjoibW9kZXJhdG9yIiwgUEFSVElDSVBBTlQ6InBhcnRpY2lwYW50IiwgVklTSVRPUjoidmlzaXRvciJ9OwphcHBzLmNoYXQubW9kZWwuTXVjUGFydGljaXBhbnQuRXZlbnRUeXBlcyA9IHtQQVJUSUNJUEFOVF9ERVRBSUxTX0NIQU5HRUQ6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInBkYyIpfTsKYXBwcy5jaGF0Lm1vZGVsLk11Y1BhcnRpY2lwYW50LnByb3RvdHlwZS5nZXRSb2xlID0gZnVuY3Rpb24gJGFwcHMkY2hhdCRtb2RlbCRNdWNQYXJ0aWNpcGFudCQkZ2V0Um9sZSQoKSB7CiAgcmV0dXJuIHRoaXMucm9sZV8KfTsKYXBwcy5jaGF0Lm1vZGVsLk11Y1BhcnRpY2lwYW50LnByb3RvdHlwZS5nZXRBdmF0YXJVcmwgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JG1vZGVsJE11Y1BhcnRpY2lwYW50JCRnZXRBdmF0YXJVcmwkKCkgewogIHJldHVybiB0aGlzLmF2YXRhclVybF8KfTsKYXBwcy5jaGF0Lm1vZGVsLk11Y1BhcnRpY2lwYW50LnByb3RvdHlwZS5nZXRTaG93ID0gZnVuY3Rpb24gJGFwcHMkY2hhdCRtb2RlbCRNdWNQYXJ0aWNpcGFudCQkZ2V0U2hvdyQoKSB7CiAgcmV0dXJuIHRoaXMuc2hvd18KfTsKYXBwcy5jaGF0Lm1vZGVsLk11Y1BhcnRpY2lwYW50LnByb3RvdHlwZS5pc0ludGVybmFsUGFydGljaXBhbnQgPSBmdW5jdGlvbiAkYXBwcyRjaGF0JG1vZGVsJE11Y1BhcnRpY2lwYW50JCRpc0ludGVybmFsUGFydGljaXBhbnQkKCkgewogIHJldHVybiB0aGlzLmlzSW50ZXJuYWxQYXJ0aWNpcGFudF8KfTsKYXBwcy5jaGF0Lm1vZGVsLk11Y1BhcnRpY2lwYW50LnByb3RvdHlwZS5pc0xvY2FsID0gZnVuY3Rpb24gJGFwcHMkY2hhdCRtb2RlbCRNdWNQYXJ0aWNpcGFudCQkaXNMb2NhbCQoKSB7CiAgcmV0dXJuIHRoaXMubG9jYWxfCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudCQoYmFyZUppZCwgb3B0X2xvY2FsLCBvcHRfdW5pcXVlUmVzb3VyY2VJZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5iYXJlSmlkXyA9IGJhcmVKaWQ7CiAgdGhpcy5pc0xvY2FsXyA9ICEhb3B0X2xvY2FsOwogIHRoaXMucmVzb3VyY2VJZF8gPSBvcHRfdW5pcXVlUmVzb3VyY2VJZCB8fCBiYXJlSmlkCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5QYXJ0aWNpcGFudCwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwp0YWxrLm1lZGlhLlBhcnRpY2lwYW50LkV2ZW50cyA9IHtBVkFUQVJfQ0hBTkdFRDoiYWMiLCBDT05UQUNUX0NIQU5HRUQ6ImNjIiwgTUVESUFfU1RBVEVfQ0hBTkdFRDoibXNjIn07CnRhbGsubWVkaWEuUGFydGljaXBhbnQucHJvdG90eXBlLm5hbWVfID0gIiI7CnRhbGsubWVkaWEuUGFydGljaXBhbnQucHJvdG90eXBlLmVtYWlsXyA9ICIiOwp0YWxrLm1lZGlhLlBhcnRpY2lwYW50LnByb3RvdHlwZS5hdmF0YXJfID0gIiI7CnRhbGsubWVkaWEuUGFydGljaXBhbnQucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGFydGljaXBhbnQkJG1lcmdlJChvdGhlcikgewogIGlmKHRoaXMucmVzb3VyY2VJZF8gIT0gb3RoZXIucmVzb3VyY2VJZF8gfHwgdGhpcy5iYXJlSmlkXyAhPSBvdGhlci5iYXJlSmlkXyB8fCB0aGlzLmlzTG9jYWxfICE9IG90aGVyLmlzTG9jYWxfKSB7CiAgICB0aHJvdyBFcnJvcigiQ2Fubm90IG1lcmdlIHBhcnRpY2lwYW50cyB3aXRoIHVuZXF1YWwgaW1tdXRhYmxlIGZpZWxkcy4iKTsKICB9CiAgdGhpcy5uYW1lXyA9IG90aGVyLm5hbWVfIHx8IHRoaXMubmFtZV87CiAgdGhpcy5lbWFpbF8gPSBvdGhlci5lbWFpbF8gfHwgdGhpcy5lbWFpbF87CiAgdGhpcy5hdmF0YXJfID0gb3RoZXIuYXZhdGFyXyB8fCB0aGlzLmF2YXRhcl87CiAgdGhpcy5hdWRpb1NzcmNfID0gb3RoZXIuYXVkaW9Tc3JjXyB8fCB0aGlzLmF1ZGlvU3NyY187CiAgdGhpcy52aWRlb1NzcmNfID0gb3RoZXIudmlkZW9Tc3JjXyB8fCB0aGlzLnZpZGVvU3NyY187CiAgcmV0dXJuIHRoaXMKfTsKdGFsay5tZWRpYS5QYXJ0aWNpcGFudC5wcm90b3R5cGUuZ2V0UmVzb3VyY2VJZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBhcnRpY2lwYW50JCRnZXRSZXNvdXJjZUlkJCgpIHsKICByZXR1cm4gdGhpcy5yZXNvdXJjZUlkXwp9Owp0YWxrLm1lZGlhLlBhcnRpY2lwYW50LnByb3RvdHlwZS5nZXRKaWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudCQkZ2V0SmlkJCgpIHsKICByZXR1cm4gdGhpcy5iYXJlSmlkXwp9Owp0YWxrLm1lZGlhLlBhcnRpY2lwYW50LnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGFydGljaXBhbnQkJGdldE5hbWUkKCkgewogIHJldHVybiB0aGlzLm5hbWVfCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnQucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudCQkc2V0TmFtZSQobmFtZSkgewogIHRoaXMubmFtZV8gPSBuYW1lOwogIHJldHVybiB0aGlzCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnQucHJvdG90eXBlLmdldEVtYWlsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGFydGljaXBhbnQkJGdldEVtYWlsJCgpIHsKICByZXR1cm4gdGhpcy5lbWFpbF8KfTsKdGFsay5tZWRpYS5QYXJ0aWNpcGFudC5wcm90b3R5cGUuc2V0RW1haWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudCQkc2V0RW1haWwkKGVtYWlsKSB7CiAgdGhpcy5lbWFpbF8gPSBlbWFpbDsKICByZXR1cm4gdGhpcwp9Owp0YWxrLm1lZGlhLlBhcnRpY2lwYW50LnByb3RvdHlwZS5nZXRBdmF0YXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudCQkZ2V0QXZhdGFyJCgpIHsKICByZXR1cm4gdGhpcy5hdmF0YXJfCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnQucHJvdG90eXBlLnNldEF2YXRhciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBhcnRpY2lwYW50JCRzZXRBdmF0YXIkKGF2YXRhcikgewogIGF2YXRhciAhPSB0aGlzLmF2YXRhcl8gJiYgKHRoaXMuYXZhdGFyXyA9IGF2YXRhciwgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLlBhcnRpY2lwYW50LkF2YXRhckNoYW5nZWRFdmVudCh0aGlzKSkpOwogIHJldHVybiB0aGlzCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnQucHJvdG90eXBlLmdldENvbnRhY3QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudCQkZ2V0Q29udGFjdCQoKSB7CiAgcmV0dXJuIHRoaXMuY29udGFjdF8KfTsKdGFsay5tZWRpYS5QYXJ0aWNpcGFudC5wcm90b3R5cGUuaXNMb2NhbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBhcnRpY2lwYW50JCRpc0xvY2FsJCgpIHsKICByZXR1cm4gdGhpcy5pc0xvY2FsXwp9Owp0YWxrLm1lZGlhLlBhcnRpY2lwYW50LnByb3RvdHlwZS5nZXRBdWRpb1NTUkMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudCQkZ2V0QXVkaW9TU1JDJCgpIHsKICByZXR1cm4gdGhpcy5hdWRpb1NzcmNfCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnQucHJvdG90eXBlLmdldFZpZGVvU1NSQyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBhcnRpY2lwYW50JCRnZXRWaWRlb1NTUkMkKCkgewogIHJldHVybiB0aGlzLnZpZGVvU3NyY18KfTsKdGFsay5tZWRpYS5QYXJ0aWNpcGFudC5wcm90b3R5cGUuc2V0VmlkZW9TU1JDID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGFydGljaXBhbnQkJHNldFZpZGVvU1NSQyQoc3NyYykgewogIHRoaXMudmlkZW9Tc3JjXyA9IHNzcmM7CiAgcmV0dXJuIHRoaXMKfTsKdGFsay5tZWRpYS5QYXJ0aWNpcGFudC5wcm90b3R5cGUuZ2V0U2Vzc2lvbklkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGFydGljaXBhbnQkJGdldFNlc3Npb25JZCQoKSB7CiAgcmV0dXJuIHRoaXMuc2Vzc2lvbklkXwp9Owp0YWxrLm1lZGlhLlBhcnRpY2lwYW50LnByb3RvdHlwZS5zZXRTZXNzaW9uSWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudCQkc2V0U2Vzc2lvbklkJChzZXNzaW9uSWQpIHsKICB0aGlzLnNlc3Npb25JZF8gPSBzZXNzaW9uSWQ7CiAgcmV0dXJuIHRoaXMKfTsKdGFsay5tZWRpYS5QYXJ0aWNpcGFudC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudCQkdG9TdHJpbmckKCkgewogIHJldHVybiI8IiArIHRoaXMuYmFyZUppZF8gKyAiLCByZXNvdXJjZUlkOiAiICsgdGhpcy5yZXNvdXJjZUlkXyArICIsIGF1ZGlvU3NyYzogIiArIHRoaXMuYXVkaW9Tc3JjXyArICIsIHZpZGVvU3NyYzogIiArIHRoaXMudmlkZW9Tc3JjXyArICIsICIgKyAodGhpcy5pc0xvY2FsXyA/ICJsb2NhbCIgOiAicmVtb3RlIikgKyAiPiIKfTsKdGFsay5tZWRpYS5QYXJ0aWNpcGFudC5NZWRpYVN0YXRlQ2hhbmdlZEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGFydGljaXBhbnQkTWVkaWFTdGF0ZUNoYW5nZWRFdmVudCQocGFydGljaXBhbnQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuUGFydGljaXBhbnQuRXZlbnRzLk1FRElBX1NUQVRFX0NIQU5HRUQpOwogIHRoaXMucGFydGljaXBhbnQgPSBwYXJ0aWNpcGFudAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuUGFydGljaXBhbnQuTWVkaWFTdGF0ZUNoYW5nZWRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLlBhcnRpY2lwYW50LkF2YXRhckNoYW5nZWRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBhcnRpY2lwYW50JEF2YXRhckNoYW5nZWRFdmVudCQocGFydGljaXBhbnQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuUGFydGljaXBhbnQuRXZlbnRzLkFWQVRBUl9DSEFOR0VEKTsKICB0aGlzLnBhcnRpY2lwYW50ID0gcGFydGljaXBhbnQKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLlBhcnRpY2lwYW50LkF2YXRhckNoYW5nZWRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLlBhcnRpY2lwYW50LkNvbnRhY3RDaGFuZ2VkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudCRDb250YWN0Q2hhbmdlZEV2ZW50JChjb250YWN0KSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLlBhcnRpY2lwYW50LkV2ZW50cy5DT05UQUNUX0NIQU5HRUQpOwogIHRoaXMuY29udGFjdCA9IGNvbnRhY3QKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLlBhcnRpY2lwYW50LkNvbnRhY3RDaGFuZ2VkRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRDaXJjdWxhckJ1ZmZlciQob3B0X21heFNpemUpIHsKICB0aGlzLm1heFNpemVfID0gb3B0X21heFNpemUgfHwgMTAwOwogIHRoaXMuYnVmZl8gPSBbXQp9Owpnb29nLnN0cnVjdHMuQ2lyY3VsYXJCdWZmZXIucHJvdG90eXBlLm5leHRQdHJfID0gMDsKZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJENpcmN1bGFyQnVmZmVyJCRhZGQkKGl0ZW0pIHsKICB0aGlzLmJ1ZmZfW3RoaXMubmV4dFB0cl9dID0gaXRlbTsKICB0aGlzLm5leHRQdHJfID0gKHRoaXMubmV4dFB0cl8gKyAxKSAlIHRoaXMubWF4U2l6ZV8KfTsKZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJENpcmN1bGFyQnVmZmVyJCRnZXQkKGluZGV4KSB7CiAgaW5kZXggPSB0aGlzLm5vcm1hbGl6ZUluZGV4XyhpbmRleCk7CiAgcmV0dXJuIHRoaXMuYnVmZl9baW5kZXhdCn07Cmdvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRDaXJjdWxhckJ1ZmZlciQkc2V0JChpbmRleCwgaXRlbSkgewogIGluZGV4ID0gdGhpcy5ub3JtYWxpemVJbmRleF8oaW5kZXgpOwogIHRoaXMuYnVmZl9baW5kZXhdID0gaXRlbQp9Owpnb29nLnN0cnVjdHMuQ2lyY3VsYXJCdWZmZXIucHJvdG90eXBlLmdldENvdW50ID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRDaXJjdWxhckJ1ZmZlciQkZ2V0Q291bnQkKCkgewogIHJldHVybiB0aGlzLmJ1ZmZfLmxlbmd0aAp9Owpnb29nLnN0cnVjdHMuQ2lyY3VsYXJCdWZmZXIucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJENpcmN1bGFyQnVmZmVyJCRpc0VtcHR5JCgpIHsKICByZXR1cm4gMCA9PSB0aGlzLmJ1ZmZfLmxlbmd0aAp9Owpnb29nLnN0cnVjdHMuQ2lyY3VsYXJCdWZmZXIucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRDaXJjdWxhckJ1ZmZlciQkY2xlYXIkKCkgewogIHRoaXMubmV4dFB0cl8gPSB0aGlzLmJ1ZmZfLmxlbmd0aCA9IDAKfTsKZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyLnByb3RvdHlwZS5nZXRWYWx1ZXMgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJENpcmN1bGFyQnVmZmVyJCRnZXRWYWx1ZXMkKCkgewogIHJldHVybiB0aGlzLmdldE5ld2VzdFZhbHVlcyh0aGlzLmdldENvdW50KCkpCn07Cmdvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlci5wcm90b3R5cGUuZ2V0TmV3ZXN0VmFsdWVzID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRDaXJjdWxhckJ1ZmZlciQkZ2V0TmV3ZXN0VmFsdWVzJChtYXhDb3VudCkgewogIGZvcih2YXIgbCA9IHRoaXMuZ2V0Q291bnQoKSwgc3RhcnQgPSB0aGlzLmdldENvdW50KCkgLSBtYXhDb3VudCwgcnYgPSBbXSwgaSA9IHN0YXJ0O2kgPCBsO2krKykgewogICAgcnZbaV0gPSB0aGlzLmdldChpKQogIH0KICByZXR1cm4gcnYKfTsKZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyLnByb3RvdHlwZS5nZXRLZXlzID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRDaXJjdWxhckJ1ZmZlciQkZ2V0S2V5cyQoKSB7CiAgZm9yKHZhciBydiA9IFtdLCBsID0gdGhpcy5nZXRDb3VudCgpLCBpID0gMDtpIDwgbDtpKyspIHsKICAgIHJ2W2ldID0gaQogIH0KICByZXR1cm4gcnYKfTsKZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyLnByb3RvdHlwZS5jb250YWluc0tleSA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkQ2lyY3VsYXJCdWZmZXIkJGNvbnRhaW5zS2V5JChrZXkpIHsKICByZXR1cm4ga2V5IDwgdGhpcy5nZXRDb3VudCgpCn07Cmdvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlci5wcm90b3R5cGUuY29udGFpbnNWYWx1ZSA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkQ2lyY3VsYXJCdWZmZXIkJGNvbnRhaW5zVmFsdWUkKHZhbHVlKSB7CiAgZm9yKHZhciBsID0gdGhpcy5nZXRDb3VudCgpLCBpID0gMDtpIDwgbDtpKyspIHsKICAgIGlmKHRoaXMuZ2V0KGkpID09IHZhbHVlKSB7CiAgICAgIHJldHVybiEwCiAgICB9CiAgfQogIHJldHVybiExCn07Cmdvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlci5wcm90b3R5cGUubm9ybWFsaXplSW5kZXhfID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRDaXJjdWxhckJ1ZmZlciQkbm9ybWFsaXplSW5kZXhfJChpbmRleCkgewogIGlmKGluZGV4ID49IHRoaXMuYnVmZl8ubGVuZ3RoKSB7CiAgICB0aHJvdyBFcnJvcigiT3V0IG9mIGJvdW5kcyBleGNlcHRpb24iKTsKICB9CiAgcmV0dXJuIHRoaXMuYnVmZl8ubGVuZ3RoIDwgdGhpcy5tYXhTaXplXyA/IGluZGV4IDogKHRoaXMubmV4dFB0cl8gKyBOdW1iZXIoaW5kZXgpKSAlIHRoaXMubWF4U2l6ZV8KfTsKdGFsay5tZWRpYS5jM2QuT1hkTGVha0RldGVjdG9yID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE9YZExlYWtEZXRlY3RvciQocGFjaykgewogIGdvb2cuRGlzcG9zYWJsZS5jYWxsKHRoaXMpOwogIHRoaXMuc3RhY2tUcmFjZXNfID0ge307CiAgdmFyIHBhY2tJZCA9IG51bGw7CiAgdHJ5IHsKICAgIHBhY2tJZCA9IHBhY2suY2xpZW50SWQKICB9Y2F0Y2goZSkgewogIH0KICB0aGlzLnBhY2tJZF8gPSBwYWNrSWQ7CiAgdGFsay5tZWRpYS5jM2QuT1hkTGVha0RldGVjdG9yLmxlYWtEZXRlY3RvcnNfW2dvb2cuZ2V0VWlkKHRoaXMpXSA9IHRoaXMKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5PWGRMZWFrRGV0ZWN0b3IsIGdvb2cuRGlzcG9zYWJsZSk7CnRhbGsubWVkaWEuYzNkLk9YZExlYWtEZXRlY3Rvci5sZWFrRGV0ZWN0b3JzXyA9IHt9Owp0YWxrLm1lZGlhLmMzZC5PWGRMZWFrRGV0ZWN0b3IubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5jM2QuT1hkTGVha0RldGVjdG9yIik7CnRhbGsubWVkaWEuYzNkLk9YZExlYWtEZXRlY3Rvci5wcm90b3R5cGUucmVnaXN0ZXJfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE9YZExlYWtEZXRlY3RvciQkcmVnaXN0ZXJfJChwYWNrSWQsIG9iamVjdCkgewogIHRoaXMucGFja0lkXyA9PSBwYWNrSWQgJiYgKHRoaXMuc3RhY2tUcmFjZXNfW2dvb2cuZ2V0VWlkKG9iamVjdCldID0gZ29vZy5kZWJ1Zy5nZXRTdGFja3RyYWNlKCkpCn07CnRhbGsubWVkaWEuYzNkLk9YZExlYWtEZXRlY3Rvci5wcm90b3R5cGUudW5yZWdpc3Rlcl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkT1hkTGVha0RldGVjdG9yJCR1bnJlZ2lzdGVyXyQocGFja0lkLCBvYmplY3QpIHsKICB0aGlzLnBhY2tJZF8gPT0gcGFja0lkICYmIGRlbGV0ZSB0aGlzLnN0YWNrVHJhY2VzX1tnb29nLmdldFVpZChvYmplY3QpXQp9Owp0YWxrLm1lZGlhLmMzZC5PWGRMZWFrRGV0ZWN0b3IucHJvdG90eXBlLnJlcG9ydExlYWtzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE9YZExlYWtEZXRlY3RvciQkcmVwb3J0TGVha3MkKCkgewogIGZvcih2YXIgdWlkIGluIHRoaXMuc3RhY2tUcmFjZXNfKSB7CiAgICB0YWxrLm1lZGlhLmMzZC5PWGRMZWFrRGV0ZWN0b3IubG9nZ2VyXy53YXJuaW5nKCdPWEQgImxlYWsiIGRldGVjdGVkIGZyb20gJyArIHRoaXMuc3RhY2tUcmFjZXNfW3VpZF0pCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5PWGRMZWFrRGV0ZWN0b3IucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPWGRMZWFrRGV0ZWN0b3IkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgZGVsZXRlIHRhbGsubWVkaWEuYzNkLk9YZExlYWtEZXRlY3Rvci5sZWFrRGV0ZWN0b3JzX1tnb29nLmdldFVpZCh0aGlzKV07CiAgdGFsay5tZWRpYS5jM2QuT1hkTGVha0RldGVjdG9yLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpCn07Cmdvb2cuREVCVUcgPyAodGFsay5tZWRpYS5jM2QuT1hkTGVha0RldGVjdG9yLnJlZ2lzdGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE9YZExlYWtEZXRlY3RvciRyZWdpc3RlciQocGFja0lkLCBvYmplY3QpIHsKICBmb3IodmFyIHVpZCBpbiB0YWxrLm1lZGlhLmMzZC5PWGRMZWFrRGV0ZWN0b3IubGVha0RldGVjdG9yc18pIHsKICAgIHRhbGsubWVkaWEuYzNkLk9YZExlYWtEZXRlY3Rvci5sZWFrRGV0ZWN0b3JzX1t1aWRdLnJlZ2lzdGVyXyhwYWNrSWQsIG9iamVjdCkKICB9Cn0sIHRhbGsubWVkaWEuYzNkLk9YZExlYWtEZXRlY3Rvci51bnJlZ2lzdGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE9YZExlYWtEZXRlY3RvciR1bnJlZ2lzdGVyJChwYWNrSWQsIG9iamVjdCkgewogIGZvcih2YXIgdWlkIGluIHRhbGsubWVkaWEuYzNkLk9YZExlYWtEZXRlY3Rvci5sZWFrRGV0ZWN0b3JzXykgewogICAgdGFsay5tZWRpYS5jM2QuT1hkTGVha0RldGVjdG9yLmxlYWtEZXRlY3RvcnNfW3VpZF0udW5yZWdpc3Rlcl8ocGFja0lkLCBvYmplY3QpCiAgfQp9KSA6ICh0YWxrLm1lZGlhLmMzZC5PWGRMZWFrRGV0ZWN0b3IucmVnaXN0ZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkT1hkTGVha0RldGVjdG9yJHJlZ2lzdGVyJCgpIHsKfSwgdGFsay5tZWRpYS5jM2QuT1hkTGVha0RldGVjdG9yLnVucmVnaXN0ZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkT1hkTGVha0RldGVjdG9yJHVucmVnaXN0ZXIkKCkgewp9KTsKdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZEhhbmRsZSQocGFjaywgb2JqZWN0KSB7CiAgZ29vZy5EaXNwb3NhYmxlLmNhbGwodGhpcyk7CiAgdGhpcy5wYWNrXyA9IHBhY2s7CiAgdmFyIHBhY2tJZCA9IG51bGw7CiAgaWYocGFjaykgewogICAgdHJ5IHsKICAgICAgcGFja0lkID0gcGFjay5jbGllbnRJZAogICAgfWNhdGNoKGUpIHsKICAgIH0KICB9CiAgdGhpcy5wYWNrSWRfID0gcGFja0lkOwogIHRoaXMub2JqZWN0XyA9IG9iamVjdDsKICBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLnBhY2tJZF8pICYmIHRhbGsubWVkaWEuYzNkLk9YZExlYWtEZXRlY3Rvci5yZWdpc3Rlcih0aGlzLnBhY2tJZF8sIHRoaXMpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLCBnb29nLkRpc3Bvc2FibGUpOwp0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZEhhbmRsZSRjcmVhdGVPYmplY3QkKHBhY2ssIGNsYXNzTmFtZSkgewogIHZhciBvYmplY3QgPSBwYWNrLmNyZWF0ZU9iamVjdChjbGFzc05hbWUpOwogIHJldHVybiB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUud3JhcE9iamVjdChwYWNrLCBvYmplY3QpCn07CnRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS53cmFwT2JqZWN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZEhhbmRsZSR3cmFwT2JqZWN0JChwYWNrLCBvYmplY3QpIHsKICByZXR1cm4hZ29vZy5pc0RlZkFuZE5vdE51bGwob2JqZWN0KSA/IG51bGwgOiBuZXcgdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlKHBhY2ssIG9iamVjdCkKfTsKdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLndyYXBVbm93bmVkT2JqZWN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZEhhbmRsZSR3cmFwVW5vd25lZE9iamVjdCQob2JqZWN0KSB7CiAgcmV0dXJuIWdvb2cuaXNEZWZBbmROb3ROdWxsKG9iamVjdCkgPyBudWxsIDogbmV3IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZShudWxsLCBvYmplY3QpCn07CnRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZEhhbmRsZSQkZ2V0JChwcm9wZXJ0eU5hbWUpIHsKICB0cnkgewogICAgcmV0dXJuIHRoaXMub2JqZWN0X1twcm9wZXJ0eU5hbWVdCiAgfWNhdGNoKGUpIHsKICB9Cn07CnRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZEhhbmRsZSQkc2V0JChwcm9wZXJ0eU5hbWUsIHZhbHVlKSB7CiAgdHJ5IHsKICAgIHRoaXMub2JqZWN0X1twcm9wZXJ0eU5hbWVdID0gdmFsdWUKICB9Y2F0Y2goZSkgewogIH0KfTsKdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLnZhckFyZ3NUaHVua0Z1bmN0aW9uc0NhY2hlXyA9IFtdOwp0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuZ2V0VmFyQXJnc1RodW5rRnVuY3Rpb25fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZEhhbmRsZSRnZXRWYXJBcmdzVGh1bmtGdW5jdGlvbl8kKGFycmF5TGVuZ3RoKSB7CiAgdmFyIGZuID0gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLnZhckFyZ3NUaHVua0Z1bmN0aW9uc0NhY2hlX1thcnJheUxlbmd0aF07CiAgaWYoIWZuKSB7CiAgICBmb3IodmFyIGZ1bmN0aW9uQ29kZSA9ICJyZXR1cm4gb1thWzBdXSgiLCBpID0gMTtpIDwgYXJyYXlMZW5ndGg7KytpKSB7CiAgICAgIDEgIT0gaSAmJiAoZnVuY3Rpb25Db2RlICs9ICIsIiksIGZ1bmN0aW9uQ29kZSArPSAiYVsiICsgaSArICJdIgogICAgfQogICAgZnVuY3Rpb25Db2RlICs9ICIpIjsKICAgIGZuID0gbmV3IEZ1bmN0aW9uKCJvIiwgImEiLCBmdW5jdGlvbkNvZGUpOwogICAgdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLnZhckFyZ3NUaHVua0Z1bmN0aW9uc0NhY2hlX1thcnJheUxlbmd0aF0gPSBmbgogIH0KICByZXR1cm4gZm4KfTsKdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLnByb3RvdHlwZS5pbnZva2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkSGFuZGxlJCRpbnZva2UkKG1ldGhvZE5hbWUsIHZhcl9hcmdzKSB7CiAgdmFyIGZuID0gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLmdldFZhckFyZ3NUaHVua0Z1bmN0aW9uXyhhcmd1bWVudHMubGVuZ3RoKTsKICB0cnkgewogICAgcmV0dXJuIGZuKHRoaXMub2JqZWN0XywgYXJndW1lbnRzKQogIH1jYXRjaChlKSB7CiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUucHJvdG90eXBlLmdldE9iamVjdCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPM2RIYW5kbGUkJGdldE9iamVjdCQoKSB7CiAgcmV0dXJuIHRoaXMub2JqZWN0Xwp9Owp0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUucHJvdG90eXBlLmNyZWF0ZVVub3duZWRIYW5kbGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkSGFuZGxlJCRjcmVhdGVVbm93bmVkSGFuZGxlJCgpIHsKICByZXR1cm4gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLndyYXBVbm93bmVkT2JqZWN0KHRoaXMub2JqZWN0XykKfTsKdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkSGFuZGxlJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMucGFja0lkXykgJiYgdGFsay5tZWRpYS5jM2QuT1hkTGVha0RldGVjdG9yLnVucmVnaXN0ZXIodGhpcy5wYWNrSWRfLCB0aGlzKTsKICBpZihnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLnBhY2tfKSAmJiBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLm9iamVjdF8pKSB7CiAgICB0cnkgewogICAgICB0aGlzLnBhY2tfLnJlbW92ZU9iamVjdCh0aGlzLm9iamVjdF8pCiAgICB9Y2F0Y2goZSkgewogICAgfQogIH0KICB0aGlzLm9iamVjdF8gPSB0aGlzLnBhY2tJZF8gPSB0aGlzLnBhY2tfID0gbnVsbDsKICB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkKG1hdGVyaWFsLCBzc3JjLCBwYXJ0aWNpcGFudCwgcGFjaywgb1hkR2xvYmFscywgb3B0X2NhbGxNYW5hZ2VyKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7CiAgdGhpcy5zc3JjXyA9IHNzcmM7CiAgdGhpcy5wYXJ0aWNpcGFudF8gPSBwYXJ0aWNpcGFudDsKICB0aGlzLm1pcnJvcl8gPSBwYXJ0aWNpcGFudC5pc0xvY2FsKCk7CiAgdGhpcy5wYWNrXyA9IHBhY2s7CiAgdGhpcy5vWGRHbG9iYWxzXyA9IG9YZEdsb2JhbHM7CiAgdGhpcy5jYWxsTWFuYWdlcl8gPSBvcHRfY2FsbE1hbmFnZXIgfHwgbnVsbDsKICB0aGlzLm1hcHBpbmdzXyA9IFtdOwogIHRoaXMuZnBzVGltZXJfID0gbmV3IGdvb2cuVGltZXIodGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRlBTX0NPTExFQ1RfUEVSSU9EXyk7CiAgdGhpcy5mcHNUaW1lcl8uc3RhcnQoKTsKICB0aGlzLnJlbmRlcklucHV0RnJhbWVyYXRlc18gPSBuZXcgZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyKHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkZQU19MT0dfUEVSSU9EU18pOwogIHRoaXMucmVuZGVyT3V0cHV0RnJhbWVyYXRlc18gPSBuZXcgZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyKHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkZQU19MT0dfUEVSSU9EU18pOwogIHRoaXMuZXZlbnRIYW5kbGVyXyA9IG5ldyBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIodGhpcyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLnBhcnRpY2lwYW50XywgdGFsay5tZWRpYS5QYXJ0aWNpcGFudC5FdmVudHMuQVZBVEFSX0NIQU5HRUQsIHRoaXMuaGFuZGxlQXZhdGFyQ2hhbmdlZF8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5mcHNUaW1lcl8sIGdvb2cuVGltZXIuVElDSywgdGhpcy5oYW5kbGVGcmFtZXJhdGVDaGFuZ2VkXyk7CiAgZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5jYWxsTWFuYWdlcl8pICYmIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5jYWxsTWFuYWdlcl8sIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuQ0FNRVJBX01VVEUsIHRoaXMuaGFuZGxlQ2FtZXJhTXV0ZUNoYW5nZWRfKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkRFRkFVTFRfVEVYVFVSRV9XSURUSF8gPSAxMDI0Owp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5ERUZBVUxUX1RFWFRVUkVfSEVJR0hUXyA9IDUxMjsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuREVGQVVMVF9NVUxUSVdBWV9NQUlOX1RFWFRVUkVfV0lEVEggPSA2NDA7CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkRFRkFVTFRfTVVMVElXQVlfTUFJTl9URVhUVVJFX0hFSUdIVCA9IDM2MDsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuREVGQVVMVF9NVUxUSVdBWV9GSUxNU1RSSVBfVEVYVFVSRV9XSURUSCA9IDE2MDsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuREVGQVVMVF9NVUxUSVdBWV9GSUxNU1RSSVBfVEVYVFVSRV9IRUlHSFQgPSAxMDA7CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LlJFU0laRV9USU1FT1VUXyA9IDVFMzsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRlBTX0NPTExFQ1RfUEVSSU9EXyA9IDFFMzsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRlBTX0xPR19QRVJJT0RTXyA9IDFFNCAvIHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkZQU19DT0xMRUNUX1BFUklPRF87CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkV2ZW50cyA9IHtTRU5EX1NUUkVBTV9PTjoib24iLCBTRU5EX1NUUkVBTV9PRkY6Im9mZiIsIEFTUEVDVF9DSEFOR0VEOiJhc3BlY3QiLCBBVkFUQVI6ImF2YXRhciIsIENBTUVSQV9NVVRFOiJjbSIsIEZSQU1FUkFURV9DSEFOR0VEOiJmcmMiLCBURVhUVVJFX0FDVElWQVRFRDoidGEifTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuU2VuZFN0cmVhbU9uRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkU2VuZFN0cmVhbU9uRXZlbnQkKGVuZHBvaW50LCB0ZXh0dXJlSWQsIHN0cmVhbSwgdGV4dHVyZVdpZHRoLCB0ZXh0dXJlSGVpZ2h0KSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5FdmVudHMuU0VORF9TVFJFQU1fT04pOwogIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKICB0aGlzLnRleHR1cmVJZCA9IHRleHR1cmVJZDsKICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICB0aGlzLnRleHR1cmVXaWR0aCA9IHRleHR1cmVXaWR0aDsKICB0aGlzLnRleHR1cmVIZWlnaHQgPSB0ZXh0dXJlSGVpZ2h0Cn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuU2VuZFN0cmVhbU9uRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuU2VuZFN0cmVhbU9mZkV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFN0cmVhbUVuZHBvaW50JFNlbmRTdHJlYW1PZmZFdmVudCQoZW5kcG9pbnQsIHRleHR1cmVJZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRXZlbnRzLlNFTkRfU1RSRUFNX09GRik7CiAgdGhpcy5lbmRwb2ludCA9IGVuZHBvaW50OwogIHRoaXMudGV4dHVyZUlkID0gdGV4dHVyZUlkCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuU2VuZFN0cmVhbU9mZkV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkFzcGVjdENoYW5nZWRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCRBc3BlY3RDaGFuZ2VkRXZlbnQkKGVuZHBvaW50KSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5FdmVudHMuQVNQRUNUX0NIQU5HRUQpOwogIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkFzcGVjdENoYW5nZWRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5BdmF0YXJFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCRBdmF0YXJFdmVudCQoZW5kcG9pbnQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkV2ZW50cy5BVkFUQVIpOwogIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkF2YXRhckV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkNhbWVyYU11dGVFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCRDYW1lcmFNdXRlRXZlbnQkKG11dGVkKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5FdmVudHMuQ0FNRVJBX01VVEUpOwogIHRoaXMubXV0ZWQgPSBtdXRlZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkNhbWVyYU11dGVFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5GcmFtZXJhdGVDaGFuZ2VkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkRnJhbWVyYXRlQ2hhbmdlZEV2ZW50JChlbmRwb2ludCwgdXBkYXRlQ291bnQsIHJlbmRlckNvdW50KSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5FdmVudHMuRlJBTUVSQVRFX0NIQU5HRUQpOwogIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKICB0aGlzLnVwZGF0ZUNvdW50ID0gdXBkYXRlQ291bnQ7CiAgdGhpcy5yZW5kZXJDb3VudCA9IHJlbmRlckNvdW50Cn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRnJhbWVyYXRlQ2hhbmdlZEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkVuZHBvaW50QWN0aXZhdGVkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkRW5kcG9pbnRBY3RpdmF0ZWRFdmVudCQoZW5kcG9pbnQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkV2ZW50cy5URVhUVVJFX0FDVElWQVRFRCk7CiAgdGhpcy5lbmRwb2ludCA9IGVuZHBvaW50Cn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRW5kcG9pbnRBY3RpdmF0ZWRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5NYXBwaW5nXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCRNYXBwaW5nXyQodGV4dHVyZSkgewogIGdvb2cuRGlzcG9zYWJsZS5jYWxsKHRoaXMpOwogIHRoaXMudGV4dHVyZSA9IHRleHR1cmU7CiAgdGhpcy50ZXh0dXJlSWQgPSB0ZXh0dXJlLmdldCgiY2xpZW50SWQiKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50Lk1hcHBpbmdfLCBnb29nLkRpc3Bvc2FibGUpOwp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5NYXBwaW5nXy5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFN0cmVhbUVuZHBvaW50JE1hcHBpbmdfJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMudGV4dHVyZSAmJiAodGhpcy50ZXh0dXJlLmRpc3Bvc2UoKSwgdGhpcy50ZXh0dXJlID0gbnVsbCk7CiAgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuTWFwcGluZ18uc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoInRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50Iik7CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5pc09uXyA9ICExOwp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5wcm90b3R5cGUuaXNTdHJlYW1TdXNwZW5kZWRfID0gITE7CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5pc0F2YXRhcl8gPSAhMTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLmZwc1VwZGF0ZUNvdW50XyA9IDA7CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5mcHNSZW5kZXJDb3VudF8gPSAwOwp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5wcm90b3R5cGUuZnBzQ29sbGVjdENvdW50XyA9IDA7CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5pc09uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFN0cmVhbUVuZHBvaW50JCRpc09uJCgpIHsKICByZXR1cm4gdGhpcy5pc09uXwp9Owp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5wcm90b3R5cGUuaXNBdmF0YXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkJGlzQXZhdGFyJCgpIHsKICByZXR1cm4gdGhpcy5pc0F2YXRhcl8KfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLmlzUmVxdWVzdGVkT24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkJGlzUmVxdWVzdGVkT24kKCkgewogIHJldHVybiAwIDwgdGhpcy5tYXBwaW5nc18ubGVuZ3RoCn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5nZXRTdHJlYW1JZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkZ2V0U3RyZWFtSWQkKCkgewogIHJldHVybiB0aGlzLnNzcmNfCn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5nZXRQYXJ0aWNpcGFudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkZ2V0UGFydGljaXBhbnQkKCkgewogIHJldHVybiB0aGlzLnBhcnRpY2lwYW50Xwp9Owp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5wcm90b3R5cGUucmVxdWVzdEF2YXRhciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkcmVxdWVzdEF2YXRhciQob3B0X3JlbG9hZCkgewogIHRoaXMubmVlZEF2YXRhcl8gPSAhMDsKICB2YXIgdXJsID0gdGhpcy5wYXJ0aWNpcGFudF8uZ2V0QXZhdGFyKCk7CiAgdGhpcy5sb2dnZXJfLmluZm8oJ1RleHR1cmUgcmVxdWVzdGVkIGZvciB1cmw9IicgKyB1cmwgKyAnIicpOwogIHRoaXMuYXZhdGFyVGV4dHVyZV8gJiYgIW9wdF9yZWxvYWQgPyAodGhpcy5sb2dnZXJfLmluZm8oIlJldXNpbmcgZXhpc3RpbmcgdGV4dHVyZS4iKSwgdGhpcy5vbkF2YXRhclJlYWR5Xyh0aGlzLmF2YXRhclRleHR1cmVfKSkgOiB0aGlzLmZpbGVSZXF1ZXN0XyA/IHRoaXMubG9nZ2VyXy53YXJuaW5nKCJFYXJsaWVyIHRleHR1cmUgcmVxdWVzdCBub3QgeWV0IGRvbmUuIikgOiAodGhpcy5maWxlUmVxdWVzdF8gPSB0aGlzLnBhY2tfLmNyZWF0ZUZpbGVSZXF1ZXN0KCJURVhUVVJFIiksIHRoaXMuZmlsZVJlcXVlc3RfLm9wZW4oIkdFVCIsIHVybCwgITApLCB0aGlzLmZpbGVSZXF1ZXN0Xy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBnb29nLmJpbmQoZnVuY3Rpb24oKSB7CiAgICBpZih0aGlzLmZpbGVSZXF1ZXN0Xy5kb25lKSB7CiAgICAgIGlmKHRoaXMuZmlsZVJlcXVlc3RfLnN1Y2Nlc3MpIHsKICAgICAgICB0aGlzLm9uQXZhdGFyUmVhZHlfKHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS53cmFwT2JqZWN0KHRoaXMucGFja18sIHRoaXMuZmlsZVJlcXVlc3RfLnRleHR1cmUpKQogICAgICB9ZWxzZSB7CiAgICAgICAgdmFyIG1zZyA9IHRoaXMuZmlsZVJlcXVlc3RfLmVycm9yOwogICAgICAgIG1zZyB8fCAobXNnID0gIlVua25vd24gZXJyb3IiKTsKICAgICAgICB0aGlzLmxvZ2dlcl8uc2V2ZXJlKCdUZXh0dXJlIGZhaWxlZCB0byBsb2FkLCB1cmw9IicgKyB1cmwgKyAnIiwgbXNnPSInICsgbXNnICsgJyInKQogICAgICB9CiAgICAgIHRoaXMucGFja18ucmVtb3ZlT2JqZWN0KHRoaXMuZmlsZVJlcXVlc3RfKTsKICAgICAgdGhpcy5maWxlUmVxdWVzdF8gPSBudWxsCiAgICB9CiAgfSwgdGhpcyksIHRoaXMuZmlsZVJlcXVlc3RfLnNlbmQoKSkKfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLm9uQXZhdGFyUmVhZHlfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFN0cmVhbUVuZHBvaW50JCRvbkF2YXRhclJlYWR5XyQodGV4dHVyZSkgewogIHRoaXMuYXZhdGFyVGV4dHVyZV8gIT0gdGV4dHVyZSAmJiAodGhpcy5kaXNwb3NlQXZhdGFyVGV4dHVyZV8oKSwgdGhpcy5hdmF0YXJUZXh0dXJlXyA9IHRleHR1cmUpOwogIGlmKHRoaXMubmVlZEF2YXRhcl8pIHsKICAgIHRoaXMubmVlZEF2YXRhcl8gPSAhMTsKICAgIHZhciB3aWR0aCA9IHRleHR1cmUuZ2V0KCJ3aWR0aCIpLCBoZWlnaHQgPSB0ZXh0dXJlLmdldCgiaGVpZ2h0Iik7CiAgICB0aGlzLmFjdGl2YXRlVGV4dHVyZSh0ZXh0dXJlLmdldE9iamVjdCgpLCB3aWR0aCwgaGVpZ2h0LCAhMSwgITAsIHdpZHRoIC8gaGVpZ2h0KTsKICAgIHRoaXMuaXNBdmF0YXJfIHx8ICh0aGlzLmlzQXZhdGFyXyA9ICEwLCB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkF2YXRhckV2ZW50KHRoaXMpKSkKICB9ZWxzZSB7CiAgICB0aGlzLmxvZ2dlcl8uaW5mbygiQXZhdGFyIHRleHR1cmUgcmVhZHkgYnV0IG5vdCBuZWVkZWQgYW55bW9yZS4iKQogIH0KfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLnJlcXVlc3RTdHJlYW0gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkJHJlcXVlc3RTdHJlYW0kKG9wdF93aWR0aCwgb3B0X2hlaWdodCkgewogIGlmKCF0aGlzLmlzUmVxdWVzdGVkT24oKSAmJiAhdGhpcy5pc1N0cmVhbVN1c3BlbmRlZF8pIHsKICAgIHZhciB3aWR0aCA9IG9wdF93aWR0aCB8fCB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5ERUZBVUxUX1RFWFRVUkVfV0lEVEhfLCBoZWlnaHQgPSBvcHRfaGVpZ2h0IHx8IHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkRFRkFVTFRfVEVYVFVSRV9IRUlHSFRfOwogICAgdGhpcy5vWGRHbG9iYWxzXy5ub25Qb3dlck9mVHdvVGV4dHVyZXMgfHwgKHdpZHRoID0gdGFsay5tZWRpYS5jM2QucG93ZXJPZlR3b0NlaWxpbmcod2lkdGgpLCBoZWlnaHQgPSB0YWxrLm1lZGlhLmMzZC5wb3dlck9mVHdvQ2VpbGluZyhoZWlnaHQpKTsKICAgIHRoaXMucXVldWVTdHJlYW1fKHdpZHRoLCBoZWlnaHQpOwogICAgdGhpcy5jYW5jZWxSZXNpemVfKCkKICB9Cn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5pc1Byb2JhYmx5U2NyZWVuY2FzdCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkaXNQcm9iYWJseVNjcmVlbmNhc3QkKCkgewogIHJldHVybiB0aGlzLmFzcGVjdF8gJiYgIXRoaXMuaXNBdmF0YXIoKSA/IDEuNiAhPSB0aGlzLmFzcGVjdF8gOiAhMQp9Owp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5wcm90b3R5cGUucXVldWVTdHJlYW1fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFN0cmVhbUVuZHBvaW50JCRxdWV1ZVN0cmVhbV8kKHdpZHRoLCBoZWlnaHQpIHsKICB2YXIgZm9ybWF0ID0gdGhpcy5vWGRHbG9iYWxzXy5yZW5kZXIyZCA/IHRoaXMub1hkR2xvYmFsc18uWFJHQjggOiB0aGlzLm9YZEdsb2JhbHNfLkFSR0I4LCB0ZXh0dXJlID0gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLndyYXBPYmplY3QodGhpcy5wYWNrXywgdGhpcy5wYWNrXy5jcmVhdGVUZXh0dXJlMkQod2lkdGgsIGhlaWdodCwgZm9ybWF0LCAxLCAhMSkpLCBtYXBwaW5nID0gbmV3IHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50Lk1hcHBpbmdfKHRleHR1cmUpOwogIHRoaXMubWFwcGluZ3NfLnB1c2gobWFwcGluZyk7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5TZW5kU3RyZWFtT25FdmVudCh0aGlzLCBtYXBwaW5nLnRleHR1cmVJZCwgdGhpcy5zc3JjXywgd2lkdGgsIGhlaWdodCkpCn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5jbGVhclN0cmVhbSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkY2xlYXJTdHJlYW0kKCkgewogIHRoaXMuZGVxdWV1ZVN0cmVhbXNfKHRoaXMubWFwcGluZ3NfLmxlbmd0aCk7CiAgdGhpcy5pc09uXyA9ICExOwogIGRlbGV0ZSB0aGlzLmFzcGVjdF87CiAgdGhpcy5jYW5jZWxSZXNpemVfKCkKfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLmRlcXVldWVTdHJlYW1zXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkZGVxdWV1ZVN0cmVhbXNfJChjb3VudCkgewogIGZvcig7MCA8IGNvdW50OykgewogICAgdmFyIG1hcHBpbmcgPSB0aGlzLm1hcHBpbmdzXy5zaGlmdCgpOwogICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5TZW5kU3RyZWFtT2ZmRXZlbnQodGhpcywgbWFwcGluZy50ZXh0dXJlSWQpKTsKICAgIG1hcHBpbmcuZGlzcG9zZSgpOwogICAgY291bnQtLQogIH0KfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLmhhbmRsZVN0cmVhbVJlYWR5ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFN0cmVhbUVuZHBvaW50JCRoYW5kbGVTdHJlYW1SZWFkeSQodGV4dHVyZUlkLCBzdHJlYW0sIHdpZHRoLCBoZWlnaHQsIG9wdF9yZW5kZXJlZFdpZHRoLCBvcHRfcmVuZGVyZWRIZWlnaHQsIG9wdF9waXhlbFdpZHRoLCBvcHRfcGl4ZWxIZWlnaHQsIG9wdF9zY3JlZW5jYXN0KSB7CiAgaWYoIXRoaXMuaXNTdHJlYW1TdXNwZW5kZWRfKSB7CiAgICBpZihzdHJlYW0gIT0gdGhpcy5zc3JjXykgewogICAgICB0aGlzLmxvZ2dlcl8uc2V2ZXJlKCJXcm9uZyBzc3JjIGluIHN0cmVhbXJlYWR5IGZvciB0aGlzIGVuZHBvaW50LiIpCiAgICB9ZWxzZSB7CiAgICAgIGZvcih2YXIgcmVuZGVyZWRXaWR0aCA9IG9wdF9yZW5kZXJlZFdpZHRoIHx8IHdpZHRoLCByZW5kZXJlZEhlaWdodCA9IG9wdF9yZW5kZXJlZEhlaWdodCB8fCBoZWlnaHQsIHBpeGVsV2lkdGggPSBvcHRfcGl4ZWxXaWR0aCB8fCAxLCBwaXhlbEhlaWdodCA9IG9wdF9waXhlbEhlaWdodCB8fCAxLCBpID0gMDtpIDwgdGhpcy5tYXBwaW5nc18ubGVuZ3RoOysraSkgewogICAgICAgIGlmKHRoaXMubWFwcGluZ3NfW2ldLnRleHR1cmVJZCA9PSB0ZXh0dXJlSWQpIHsKICAgICAgICAgIHZhciBpc0FjdGl2ZSA9IDAgPT0gaSAmJiB0aGlzLmlzT25fICYmICF0aGlzLmlzQXZhdGFyKCk7CiAgICAgICAgICBpZighaXNBY3RpdmUpIHsKICAgICAgICAgICAgdGhpcy5uZWVkQXZhdGFyXyA9ICExOwogICAgICAgICAgICB2YXIgdGV4dHVyZSA9IHRoaXMubWFwcGluZ3NfW2ldLnRleHR1cmUuZ2V0T2JqZWN0KCksIGFzcGVjdCA9IHJlbmRlcmVkV2lkdGggKiBwaXhlbFdpZHRoIC8gKHJlbmRlcmVkSGVpZ2h0ICogcGl4ZWxIZWlnaHQpOwogICAgICAgICAgICB0aGlzLmFjdGl2YXRlVGV4dHVyZSh0ZXh0dXJlLCByZW5kZXJlZFdpZHRoLCByZW5kZXJlZEhlaWdodCwgdGhpcy5taXJyb3JfICYmICFvcHRfc2NyZWVuY2FzdCwgITEsIGFzcGVjdCk7CiAgICAgICAgICAgIHRoaXMubWFwcGluZ3NfW2ldLndpZHRoID0gcmVuZGVyZWRXaWR0aDsKICAgICAgICAgICAgdGhpcy5tYXBwaW5nc19baV0uaGVpZ2h0ID0gcmVuZGVyZWRIZWlnaHQ7CiAgICAgICAgICAgIHRoaXMuaXNBdmF0YXJfICYmICh0aGlzLmlzQXZhdGFyXyA9ICExLCB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkF2YXRhckV2ZW50KHRoaXMpKSkKICAgICAgICAgIH0KICAgICAgICAgIGlmKGkgPT0gdGhpcy5tYXBwaW5nc18ubGVuZ3RoIC0gMSkgewogICAgICAgICAgICB0aGlzLmNhbmNlbFJlc2l6ZV8oKTsKICAgICAgICAgICAgdmFyIHRleFdpZHRoLCB0ZXhIZWlnaHQ7CiAgICAgICAgICAgIHRoaXMub1hkR2xvYmFsc18ubm9uUG93ZXJPZlR3b1RleHR1cmVzID8gKHRleFdpZHRoID0gd2lkdGgsIHRleEhlaWdodCA9IGhlaWdodCkgOiAodGV4V2lkdGggPSB0YWxrLm1lZGlhLmMzZC5wb3dlck9mVHdvQ2VpbGluZyh3aWR0aCksIHRleEhlaWdodCA9IHRhbGsubWVkaWEuYzNkLnBvd2VyT2ZUd29DZWlsaW5nKGhlaWdodCkpOwogICAgICAgICAgICBpZihpc0FjdGl2ZSkgewogICAgICAgICAgICAgIGlmKHdpZHRoID4gdGhpcy5tYXBwaW5nc19baV0ud2lkdGggJiYgaGVpZ2h0ID4gdGhpcy5tYXBwaW5nc19baV0uaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlU3RyZWFtXyh0ZXhXaWR0aCwgdGV4SGVpZ2h0KQogICAgICAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgICAgIGlmKHdpZHRoIC8gaGVpZ2h0ICE9IHRoaXMubWFwcGluZ3NfW2ldLndpZHRoIC8gdGhpcy5tYXBwaW5nc19baV0uaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgIHRoaXMucXVldWVTdHJlYW1fKHRleFdpZHRoLCB0ZXhIZWlnaHQpCiAgICAgICAgICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmKHdpZHRoICE9IHRoaXMubWFwcGluZ3NfW2ldLndpZHRoIHx8IGhlaWdodCAhPSB0aGlzLm1hcHBpbmdzX1tpXS5oZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVdpZHRoXyA9IHRleFdpZHRoLCB0aGlzLnJlc2l6ZUhlaWdodF8gPSB0ZXhIZWlnaHQsIHRoaXMucmVzaXplVGltZXJfID0gZ29vZy5UaW1lci5jYWxsT25jZSh0aGlzLm9uUmVzaXplVGltZXJFbGFwc2VkXywgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuUkVTSVpFX1RJTUVPVVRfLCB0aGlzKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgICAgKHRleFdpZHRoICE9IHRoaXMubWFwcGluZ3NfW2ldLnRleHR1cmUuZ2V0KCJ3aWR0aCIpIHx8IHRleEhlaWdodCAhPSB0aGlzLm1hcHBpbmdzX1tpXS50ZXh0dXJlLmdldCgiaGVpZ2h0IikpICYmIHRoaXMucXVldWVTdHJlYW1fKHRleFdpZHRoLCB0ZXhIZWlnaHQpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZGVxdWV1ZVN0cmVhbXNfKGkpOwogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5oYW5kbGVTdHJlYW1GYWlsZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkJGhhbmRsZVN0cmVhbUZhaWxlZCQoKSB7CiAgdGhpcy5pc09uXyB8fCB0aGlzLnJlcXVlc3RBdmF0YXIoKQp9Owp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5wcm90b3R5cGUuYWN0aXZhdGVUZXh0dXJlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFN0cmVhbUVuZHBvaW50JCRhY3RpdmF0ZVRleHR1cmUkKHRleHR1cmUsIGVtYldpZHRoLCBlbWJIZWlnaHQsIG1pcnJvclgsIG1pcnJvclksIGFzcGVjdCkgewogIHZhciB3YXNPbiA9IHRoaXMuaXNPbl87CiAgdGhpcy5pc09uXyA9ICEwOwogIHRoaXMuYXNwZWN0XyAhPSBhc3BlY3QgJiYgKHRoaXMuYXNwZWN0XyA9IGFzcGVjdCwgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5Bc3BlY3RDaGFuZ2VkRXZlbnQodGhpcykpKTsKICB0aGlzLm1hdGVyaWFsLnNldFRleHR1cmUodGV4dHVyZSwgZW1iV2lkdGgsIGVtYkhlaWdodCwgbWlycm9yWCwgbWlycm9yWSk7CiAgdGhpcy5kaXNwb3NlVGV4dHVyZV8oKTsKICB0aGlzLnRleHR1cmVfID0gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLndyYXBVbm93bmVkT2JqZWN0KHRleHR1cmUpOwogIHRoaXMuZnBzUmVuZGVyQ291bnRfID0gdGhpcy5mcHNVcGRhdGVDb3VudF8gPSAwOwogIHdhc09uIHx8IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRW5kcG9pbnRBY3RpdmF0ZWRFdmVudCh0aGlzKSkKfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLm9uUmVzaXplVGltZXJFbGFwc2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkb25SZXNpemVUaW1lckVsYXBzZWRfJCgpIHsKICB0aGlzLnF1ZXVlU3RyZWFtXyh0aGlzLnJlc2l6ZVdpZHRoXywgdGhpcy5yZXNpemVIZWlnaHRfKTsKICB0aGlzLnJlc2l6ZUhlaWdodF8gPSB0aGlzLnJlc2l6ZVdpZHRoXyA9IHRoaXMucmVzaXplVGltZXJfID0gbnVsbAp9Owp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5wcm90b3R5cGUuY2FuY2VsUmVzaXplXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkY2FuY2VsUmVzaXplXyQoKSB7CiAgZ29vZy5UaW1lci5jbGVhcih0aGlzLnJlc2l6ZVRpbWVyXyk7CiAgdGhpcy5yZXNpemVIZWlnaHRfID0gdGhpcy5yZXNpemVXaWR0aF8gPSB0aGlzLnJlc2l6ZVRpbWVyXyA9IG51bGwKfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLmdldEFzcGVjdCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkZ2V0QXNwZWN0JCgpIHsKICByZXR1cm4gdGhpcy5hc3BlY3RfCn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5oYW5kbGVBdmF0YXJDaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkaGFuZGxlQXZhdGFyQ2hhbmdlZF8kKCkgewogIHRoaXMuaXNBdmF0YXIoKSA/IHRoaXMucmVxdWVzdEF2YXRhcighMCkgOiB0aGlzLmRpc3Bvc2VBdmF0YXJUZXh0dXJlXygpCn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5oYW5kbGVGcmFtZXJhdGVDaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkaGFuZGxlRnJhbWVyYXRlQ2hhbmdlZF8kKCkgewogIGlmKHRoaXMudGV4dHVyZV8pIHsKICAgIHZhciB1cGRhdGVDb3VudCA9IHRoaXMudGV4dHVyZV8uZ2V0KCJ1cGRhdGVDb3VudCIpLCByZW5kZXJDb3VudCA9IHRoaXMudGV4dHVyZV8uZ2V0KCJyZW5kZXJDb3VudCIpOwogICAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwodXBkYXRlQ291bnQpICYmIGdvb2cuaXNEZWZBbmROb3ROdWxsKHJlbmRlckNvdW50KSkgewogICAgICB2YXIgaW5wdXRGcHMgPSAxRTMgKiAodXBkYXRlQ291bnQgLSB0aGlzLmZwc1VwZGF0ZUNvdW50XykgLyB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5GUFNfQ09MTEVDVF9QRVJJT0RfLCBvdXRwdXRGcHMgPSAxRTMgKiAocmVuZGVyQ291bnQgLSB0aGlzLmZwc1JlbmRlckNvdW50XykgLyB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5GUFNfQ09MTEVDVF9QRVJJT0RfOwogICAgICB0aGlzLmZwc1VwZGF0ZUNvdW50XyA9IHVwZGF0ZUNvdW50OwogICAgICB0aGlzLmZwc1JlbmRlckNvdW50XyA9IHJlbmRlckNvdW50OwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkZyYW1lcmF0ZUNoYW5nZWRFdmVudCh0aGlzLCBpbnB1dEZwcywgb3V0cHV0RnBzKSk7CiAgICAgIHRoaXMubG9nZ2VyXy5pbmZvKCJPM0Qgc3RyZWFtICIgKyB0aGlzLnNzcmNfICsgIiBpbnB1dCBmcHM6ICIgKyBpbnB1dEZwcyArICIgcmVuZGVyZWQgZnBzOiAiICsgb3V0cHV0RnBzKTsKICAgICAgdGhpcy5mcHNDb2xsZWN0Q291bnRfKys7CiAgICAgIHRoaXMucmVuZGVySW5wdXRGcmFtZXJhdGVzXy5hZGQoaW5wdXRGcHMpOwogICAgICB0aGlzLnJlbmRlck91dHB1dEZyYW1lcmF0ZXNfLmFkZChvdXRwdXRGcHMpOwogICAgICBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmNhbGxNYW5hZ2VyXykgJiYgMCA9PSB0aGlzLmZwc0NvbGxlY3RDb3VudF8gJSB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5GUFNfTE9HX1BFUklPRFNfICYmIHRoaXMuY2FsbE1hbmFnZXJfLmFkZFRvTG9nKCJTU1JDICIgKyB0aGlzLnNzcmNfICsgIiByZW5kZXIgaW5wdXQgZnBzOiAiICsgdGhpcy5yZW5kZXJJbnB1dEZyYW1lcmF0ZXNfLmdldFZhbHVlcygpLnRvU3RyaW5nKCkgKyAiIG91dHB1dCBmcHM6ICIgKyB0aGlzLnJlbmRlck91dHB1dEZyYW1lcmF0ZXNfLmdldFZhbHVlcygpLnRvU3RyaW5nKCkpCiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5wcm90b3R5cGUuZ2V0TWVhbklucHV0RnJhbWVyYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFN0cmVhbUVuZHBvaW50JCRnZXRNZWFuSW5wdXRGcmFtZXJhdGUkKCkgewogIHJldHVybiB0aGlzLmJ1ZmZlck1lYW5fKHRoaXMucmVuZGVySW5wdXRGcmFtZXJhdGVzXykKfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLmdldE1lYW5PdXRwdXRGcmFtZXJhdGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkJGdldE1lYW5PdXRwdXRGcmFtZXJhdGUkKCkgewogIHJldHVybiB0aGlzLmJ1ZmZlck1lYW5fKHRoaXMucmVuZGVyT3V0cHV0RnJhbWVyYXRlc18pCn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5idWZmZXJNZWFuXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkYnVmZmVyTWVhbl8kKGJ1ZmZlcikgewogIGlmKGJ1ZmZlci5pc0VtcHR5KCkpIHsKICAgIHJldHVybiAwCiAgfQogIGZvcih2YXIgc3VtID0gMCwgaSA9IDA7aSA8IGJ1ZmZlci5nZXRDb3VudCgpO2krKykgewogICAgc3VtICs9IGJ1ZmZlci5nZXQoaSkKICB9CiAgcmV0dXJuIE1hdGgucm91bmQoMTAwICogc3VtIC8gYnVmZmVyLmdldENvdW50KCkpIC8gMTAwCn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS50cnlTdXNwZW5kU3RyZWFtID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFN0cmVhbUVuZHBvaW50JCR0cnlTdXNwZW5kU3RyZWFtJCgpIHsKICBpZih0aGlzLmlzU3RyZWFtU3VzcGVuZGVkXykgewogICAgcmV0dXJuITEKICB9CiAgdGhpcy5jYW5jZWxSZXNpemVfKCk7CiAgdGhpcy5pc1N0cmVhbVN1c3BlbmRlZF8gPSAhMDsKICBmb3IodmFyIGNvdW50ID0gdGhpcy5tYXBwaW5nc18ubGVuZ3RoOzEgPCBjb3VudDspIHsKICAgIHZhciBtYXBwaW5nID0gdGhpcy5tYXBwaW5nc18ucG9wKCk7CiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LlNlbmRTdHJlYW1PZmZFdmVudCh0aGlzLCBtYXBwaW5nLnRleHR1cmVJZCkpOwogICAgbWFwcGluZy5kaXNwb3NlKCk7CiAgICBjb3VudC0tCiAgfQogIDEgPT0gY291bnQgJiYgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5TZW5kU3RyZWFtT2ZmRXZlbnQodGhpcywgdGhpcy5tYXBwaW5nc19bMF0udGV4dHVyZUlkKSk7CiAgcmV0dXJuITAKfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLnRyeVJlc3VtZVN0cmVhbSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkdHJ5UmVzdW1lU3RyZWFtJCgpIHsKICBpZighdGhpcy5pc1N0cmVhbVN1c3BlbmRlZF8pIHsKICAgIHJldHVybiExCiAgfQogIHRoaXMuaXNTdHJlYW1TdXNwZW5kZWRfID0gITE7CiAgdGhpcy5xdWV1ZVN0cmVhbV8odGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuREVGQVVMVF9URVhUVVJFX1dJRFRIXywgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuREVGQVVMVF9URVhUVVJFX0hFSUdIVF8pOwogIHJldHVybiEwCn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5kaXNwb3NlQXZhdGFyVGV4dHVyZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkJGRpc3Bvc2VBdmF0YXJUZXh0dXJlXyQoKSB7CiAgdGhpcy5hdmF0YXJUZXh0dXJlXyAmJiAodGhpcy5hdmF0YXJUZXh0dXJlXy5kaXNwb3NlKCksIHRoaXMuYXZhdGFyVGV4dHVyZV8gPSBudWxsKQp9Owp0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5wcm90b3R5cGUuZGlzcG9zZVRleHR1cmVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFN0cmVhbUVuZHBvaW50JCRkaXNwb3NlVGV4dHVyZV8kKCkgewogIHRoaXMudGV4dHVyZV8gJiYgKHRoaXMudGV4dHVyZV8uZGlzcG9zZSgpLCB0aGlzLnRleHR1cmVfID0gbnVsbCkKfTsKdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJlYW1FbmRwb2ludCQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0aGlzLmNsZWFyU3RyZWFtKCk7CiAgdGhpcy5kaXNwb3NlVGV4dHVyZV8oKTsKICB0aGlzLmRpc3Bvc2VBdmF0YXJUZXh0dXJlXygpOwogIHRoaXMuZXZlbnRIYW5kbGVyXyAmJiAodGhpcy5ldmVudEhhbmRsZXJfLmRpc3Bvc2UoKSwgdGhpcy5ldmVudEhhbmRsZXJfID0gbnVsbCk7CiAgdGhpcy5mcHNUaW1lcl8gJiYgKHRoaXMuZnBzVGltZXJfLmRpc3Bvc2UoKSwgdGhpcy5mcHNUaW1lcl8gPSBudWxsKTsKICB0aGlzLnBhY2tfID0gbnVsbDsKICB0aGlzLm1hdGVyaWFsICYmICh0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKSwgdGhpcy5tYXRlcmlhbCA9IG51bGwpOwogIHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpCn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5oYW5kbGVDYW1lcmFNdXRlQ2hhbmdlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkJGhhbmRsZUNhbWVyYU11dGVDaGFuZ2VkXyQoZSkgewogIHRoaXMucGFydGljaXBhbnRfLmlzTG9jYWwoKSAmJiBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmNhbGxNYW5hZ2VyXykgJiYgdGhpcy5jYWxsTWFuYWdlcl8uZ2V0TG9jYWxQcmV2aWV3KCkgJiYgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5DYW1lcmFNdXRlRXZlbnQoZS5tdXRlZCkpCn07CnRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LnByb3RvdHlwZS5nZXRMb2NhbENhbWVyYU11dGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyZWFtRW5kcG9pbnQkJGdldExvY2FsQ2FtZXJhTXV0ZSQoKSB7CiAgcmV0dXJuIHRoaXMucGFydGljaXBhbnRfLmlzTG9jYWwoKSAmJiBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmNhbGxNYW5hZ2VyXykgJiYgdGhpcy5jYWxsTWFuYWdlcl8uZ2V0TG9jYWxQcmV2aWV3KCkgJiYgdGhpcy5jYWxsTWFuYWdlcl8uZ2V0Q2FtZXJhTXV0ZSgpCn07CnRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGbHV0ZVN0cmVhbXMkKGNhbGxNYW5hZ2VyLCBvM2RCdW5kbGUpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMubzNkQnVuZGxlXyA9IG8zZEJ1bmRsZTsKICB0aGlzLmNhbGxNYW5hZ2VyXyA9IGNhbGxNYW5hZ2VyOwogIHRoaXMuZXZlbnRIYW5kbGVyXyA9IG5ldyBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIodGhpcyk7CiAgdGhpcy5zdHJlYW1FbmRwb2ludHNfID0gW107CiAgdGhpcy5xdWV1ZWRQYXJ0aWNpcGFudHNfID0gW10KfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLlF1ZXVlZFBhcnRpY2lwYW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGbHV0ZVN0cmVhbXMkUXVldWVkUGFydGljaXBhbnRfJChwYXJ0aWNpcGFudCwgb3B0X3NzcmMsIG9wdF9yZW1vdmUpIHsKICB0aGlzLnBhcnRpY2lwYW50ID0gcGFydGljaXBhbnQ7CiAgdGhpcy5zc3JjID0gb3B0X3NzcmM7CiAgdGhpcy5yZW1vdmUgPSBvcHRfcmVtb3ZlIHx8ICExCn07CnRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5FdmVudCA9IHtORVdfRU5EUE9JTlQ6Im5lcCIsIFJFTU9WRURfRU5EUE9JTlQ6InJlcCJ9Owp0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMuTmV3RW5kcG9pbnRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGbHV0ZVN0cmVhbXMkTmV3RW5kcG9pbnRFdmVudCQoZW5kcG9pbnQpIHsKICB0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnQ7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMuRXZlbnQuTkVXX0VORFBPSU5UKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5OZXdFbmRwb2ludEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5SZW1vdmVkRW5kcG9pbnRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGbHV0ZVN0cmVhbXMkUmVtb3ZlZEVuZHBvaW50RXZlbnQkKGVuZHBvaW50KSB7CiAgdGhpcy5lbmRwb2ludCA9IGVuZHBvaW50OwogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLkV2ZW50LlJFTU9WRURfRU5EUE9JTlQpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLlJlbW92ZWRFbmRwb2ludEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5wcm90b3R5cGUubG9nZ2VyID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMiKTsKdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLnByb3RvdHlwZS52aWRlb0Rpc3BsYXllZF8gPSAhMTsKdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLnByb3RvdHlwZS5jcmVhdGVTdHJlYW1FbmRwb2ludCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGbHV0ZVN0cmVhbXMkJGNyZWF0ZVN0cmVhbUVuZHBvaW50JChzdHJlYW1JZCwgcGFydGljaXBhbnQpIHsKICB2YXIgbWF0ZXJpYWwgPSB0aGlzLm8zZEJ1bmRsZV8ucmVuZGVyaW5nQXBpLmNyZWF0ZU1hdGVyaWFsKHRoaXMubzNkQnVuZGxlXy52aWV3KSwgZW5kcG9pbnQgPSBuZXcgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQobWF0ZXJpYWwsIHN0cmVhbUlkLCBwYXJ0aWNpcGFudCwgdGhpcy5vM2RCdW5kbGVfLnBhY2ssIHRoaXMubzNkQnVuZGxlXy5vWGRHbG9iYWxzLCB0aGlzLmNhbGxNYW5hZ2VyXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3RlbihlbmRwb2ludCwgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRXZlbnRzLlNFTkRfU1RSRUFNX09OLCB0aGlzLnNlbmRTdHJlYW1Pbl8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oZW5kcG9pbnQsIHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkV2ZW50cy5TRU5EX1NUUkVBTV9PRkYsIHRoaXMuc2VuZFN0cmVhbU9mZl8pOwogIHRoaXMuc3RyZWFtRW5kcG9pbnRzXy5wdXNoKGVuZHBvaW50KTsKICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5OZXdFbmRwb2ludEV2ZW50KGVuZHBvaW50KSk7CiAgcmV0dXJuIGVuZHBvaW50Cn07CnRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5wcm90b3R5cGUuZ2V0RW5kcG9pbnRGb3JTdHJlYW1JZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmx1dGVTdHJlYW1zJCRnZXRFbmRwb2ludEZvclN0cmVhbUlkXyQoaWQpIHsKICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLnN0cmVhbUVuZHBvaW50c18ubGVuZ3RoOysraSkgewogICAgdmFyIGVuZHBvaW50ID0gdGhpcy5zdHJlYW1FbmRwb2ludHNfW2ldOwogICAgaWYoZW5kcG9pbnQuZ2V0U3RyZWFtSWQoKSA9PSBpZCkgewogICAgICByZXR1cm4gZW5kcG9pbnQKICAgIH0KICB9CiAgcmV0dXJuIG51bGwKfTsKdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLnByb3RvdHlwZS5pbml0U2Vzc2lvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGbHV0ZVN0cmVhbXMkJGluaXRTZXNzaW9uJChzZXNzaW9uSWQsIHNlbmRlckppZCkgewogIHRoaXMuc2Vzc2lvbklkXyA9IHNlc3Npb25JZDsKICB0aGlzLnNlbmRlckppZF8gPSBzZW5kZXJKaWQ7CiAgdmFyIGMzZCA9IHRoaXMubzNkQnVuZGxlXy5jM2RPYmplY3QuZ2V0UGx1Z2luKCk7CiAgdGhpcy5jM2RBZGRyZXNzXyA9IGMzZC5jbGllbnQuZ2V0TWVzc2FnZVF1ZXVlQWRkcmVzcygpOwogIHRoaXMucHJvY2Vzc1F1ZXVlZFBhcnRpY2lwYW50c18oKQp9Owp0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMucHJvdG90eXBlLmRpc3Bvc2VTZXNzaW9uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZsdXRlU3RyZWFtcyQkZGlzcG9zZVNlc3Npb24kKCkgewogIHRoaXMuZGlzcG9zZVN0cmVhbXNfKCk7CiAgdGhpcy5zZW5kZXJKaWRfID0gdGhpcy5zZXNzaW9uSWRfID0gbnVsbDsKICBkZWxldGUgdGhpcy5jM2RBZGRyZXNzXwp9Owp0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMucHJvdG90eXBlLmhhbmRsZVRhbGtQbHVnaW5NZXNzYWdlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZsdXRlU3RyZWFtcyQkaGFuZGxlVGFsa1BsdWdpbk1lc3NhZ2UkKG1zZykgewogIHN3aXRjaChtc2dbMF0pIHsKICAgIGNhc2UgInN0cmVhbXJlYWR5IjoKICAgICAgdGhpcy5sb2dnZXIuaW5mbygic3RyZWFtcmVhZHkgbWVzc2FnZSBmcm9tIHBsdWdpbiIpOwogICAgICB2YXIgc3RyZWFtID0gbXNnWzVdLCBlbmRwb2ludCA9IHRoaXMuZ2V0RW5kcG9pbnRGb3JTdHJlYW1JZF8oc3RyZWFtKTsKICAgICAgaWYoZW5kcG9pbnQpIHsKICAgICAgICB2YXIgdGV4dHVyZUlkID0gbXNnWzRdLCB3aWR0aCA9IG1zZ1s2XSwgaGVpZ2h0ID0gbXNnWzddLCBvcHRfcmVuZGVyZWRXaWR0aCA9IG1zZ1s4XSwgb3B0X3JlbmRlcmVkSGVpZ2h0ID0gbXNnWzldLCBvcHRfcGl4ZWxXaWR0aCA9IG1zZ1sxMF0sIG9wdF9waXhlbEhlaWdodCA9IG1zZ1sxMV07CiAgICAgICAgZW5kcG9pbnQuaGFuZGxlU3RyZWFtUmVhZHkodGV4dHVyZUlkLCBzdHJlYW0sIHdpZHRoLCBoZWlnaHQsIG9wdF9yZW5kZXJlZFdpZHRoLCBvcHRfcmVuZGVyZWRIZWlnaHQsIG9wdF9waXhlbFdpZHRoLCBvcHRfcGl4ZWxIZWlnaHQsIGVuZHBvaW50LmdldFBhcnRpY2lwYW50KCkuaXNMb2NhbCgpICYmIHRoaXMuY2FsbE1hbmFnZXJfLmlzU2NyZWVuY2FzdGluZygpKTsKICAgICAgICBpZighdGhpcy52aWRlb0Rpc3BsYXllZF8gJiYgKHRoaXMudmlkZW9EaXNwbGF5ZWRfID0gITAsIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMubzNkQnVuZGxlXy5zdGFydFRpbWUpKSkgewogICAgICAgICAgdmFyIHZpZGVvU3RhcnR1cFRpbWVTZWNvbmRzID0gKGdvb2cubm93KCkgLSB0aGlzLm8zZEJ1bmRsZV8uc3RhcnRUaW1lKSAvIDFFMzsKICAgICAgICAgIHRoaXMuY2FsbE1hbmFnZXJfLmFkZFRvTG9nKCJEaXNwbGF5ZWQgZmlyc3QgdmlkZW8gZmVlZCBmb3IgIiArIHRoaXMuc2Vzc2lvbklkXyArICIgYWZ0ZXIgIiArIHZpZGVvU3RhcnR1cFRpbWVTZWNvbmRzICsgIiBzZWNvbmRzIikKICAgICAgICB9CiAgICAgIH1lbHNlIHsKICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCJObyBlbmRwb2ludCBmb3VuZCBmb3Igc3RyZWFtOiAiICsgc3RyZWFtKQogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAic3RyZWFtZmFpbGVkIjoKICAgICAgdGhpcy5sb2dnZXIuaW5mbygic3RyZWFtZmFpbGVkIG1lc3NhZ2UgZnJvbSBwbHVnaW4iKSwgc3RyZWFtID0gbXNnWzVdLCAoZW5kcG9pbnQgPSB0aGlzLmdldEVuZHBvaW50Rm9yU3RyZWFtSWRfKHN0cmVhbSkpID8gKHRleHR1cmVJZCA9IG1zZ1s0XSwgZW5kcG9pbnQuaGFuZGxlU3RyZWFtRmFpbGVkKHRleHR1cmVJZCkpIDogdGhpcy5sb2dnZXIuaW5mbygiTm8gZW5kcG9pbnQgZm91bmQgZm9yIHN0cmVhbTogIiArIHN0cmVhbSkKICB9Cn07CnRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5wcm90b3R5cGUucXVldWVQYXJ0aWNpcGFudF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmx1dGVTdHJlYW1zJCRxdWV1ZVBhcnRpY2lwYW50XyQocXVldWVkUGFydGljaXBhbnQpIHsKICB0aGlzLmxvZ2dlci5pbmZvKCJRdWV1ZSBwYXJ0aWNpcGFudCBmb3IgIiArIHF1ZXVlZFBhcnRpY2lwYW50LnJlbW92ZSA/ICJyZW1vdmUiIDogImFkZCIpOwogIHRoaXMucXVldWVkUGFydGljaXBhbnRzXy5wdXNoKHF1ZXVlZFBhcnRpY2lwYW50KQp9Owp0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMucHJvdG90eXBlLnByb2Nlc3NRdWV1ZWRQYXJ0aWNpcGFudHNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZsdXRlU3RyZWFtcyQkcHJvY2Vzc1F1ZXVlZFBhcnRpY2lwYW50c18kKCkgewogIGlmKHRoaXMuc2Vzc2lvbklkXykgewogICAgZm9yKDswIDwgdGhpcy5xdWV1ZWRQYXJ0aWNpcGFudHNfLmxlbmd0aDspIHsKICAgICAgdmFyIHAgPSB0aGlzLnF1ZXVlZFBhcnRpY2lwYW50c18uc2hpZnQoKTsKICAgICAgdGhpcy5sb2dnZXIuaW5mbygiUHJvY2Vzc2luZyBxdWV1ZWQgcGFydGljaXBhbnQgZm9yICIgKyAocC5yZW1vdmUgPyAicmVtb3ZlIiA6ICJhZGQiKSk7CiAgICAgIHAucmVtb3ZlID8gdGhpcy5yZW1vdmVQYXJ0aWNpcGFudChwLnBhcnRpY2lwYW50LCBwLnNzcmMpIDogdGhpcy5hZGRQYXJ0aWNpcGFudChwLnBhcnRpY2lwYW50KQogICAgfQogIH1lbHNlIHsKICAgIHRoaXMubG9nZ2VyLndhcm5pbmcoIlByb2Nlc3MgcXVldWVkIHBhcnRpY2lwYW50cyBjYWxsZWQsIGJ1dCBubyBzZXNzaW9uSWQuIikKICB9Cn07CnRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5wcm90b3R5cGUuYWRkUGFydGljaXBhbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmx1dGVTdHJlYW1zJCRhZGRQYXJ0aWNpcGFudCQocGFydGljaXBhbnQpIHsKICBpZih0aGlzLnNlc3Npb25JZF8pIHsKICAgIGlmKHRoaXMuc2Vzc2lvbklkXyA9PSBwYXJ0aWNpcGFudC5nZXRTZXNzaW9uSWQoKSkgewogICAgICB2YXIgc3RyZWFtSWQgPSB0aGlzLmdldFN0cmVhbUlkT2ZQYXJ0aWNpcGFudF8ocGFydGljaXBhbnQpOwogICAgICBpZigoc3RyZWFtSWQgfHwgdGhpcy5jYWxsTWFuYWdlcl8uZ2V0TG9jYWxQcmV2aWV3KCkpICYmICF0aGlzLmdldEVuZHBvaW50Rm9yU3RyZWFtSWRfKHN0cmVhbUlkKSkgewogICAgICAgIHZhciBlbmRwb2ludCA9IHRoaXMuY3JlYXRlU3RyZWFtRW5kcG9pbnQoc3RyZWFtSWQsIHBhcnRpY2lwYW50KTsKICAgICAgICBwYXJ0aWNpcGFudC5nZXRWaWRlb1NTUkMoKSA/IHRoaXMuY2FsbE1hbmFnZXJfLmFjdGl2ZUNhbGxfLmlzTXVsdGl3YXkoKSA/IHRoaXMuY2FsbE1hbmFnZXJfLmFjdGl2ZUNhbGxfLmN1cnJlbnRTcGVha2VyID09IHBhcnRpY2lwYW50ID8gZW5kcG9pbnQucmVxdWVzdFN0cmVhbSh0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5ERUZBVUxUX01VTFRJV0FZX01BSU5fVEVYVFVSRV9XSURUSCwgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuREVGQVVMVF9NVUxUSVdBWV9NQUlOX1RFWFRVUkVfSEVJR0hUKSA6IGVuZHBvaW50LnJlcXVlc3RTdHJlYW0odGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuREVGQVVMVF9NVUxUSVdBWV9GSUxNU1RSSVBfVEVYVFVSRV9XSURUSCwgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuREVGQVVMVF9NVUxUSVdBWV9GSUxNU1RSSVBfVEVYVFVSRV9IRUlHSFQpIDogZW5kcG9pbnQucmVxdWVzdFN0cmVhbSgpIDogCiAgICAgICAgZW5kcG9pbnQucmVxdWVzdEF2YXRhcigpCiAgICAgIH1lbHNlIHsKICAgICAgICBudWxsID09IHN0cmVhbUlkICYmIHBhcnRpY2lwYW50LmlzTG9jYWwoKSAmJiAoZW5kcG9pbnQgPSB0aGlzLmNyZWF0ZVN0cmVhbUVuZHBvaW50KG51bGwsIHBhcnRpY2lwYW50KSwgZW5kcG9pbnQucmVxdWVzdFN0cmVhbSgpKQogICAgICB9CiAgICB9CiAgfWVsc2UgewogICAgdGhpcy5xdWV1ZVBhcnRpY2lwYW50XyhuZXcgdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLlF1ZXVlZFBhcnRpY2lwYW50XyhwYXJ0aWNpcGFudCkpCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMucHJvdG90eXBlLnJlbW92ZVBhcnRpY2lwYW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZsdXRlU3RyZWFtcyQkcmVtb3ZlUGFydGljaXBhbnQkKHBhcnRpY2lwYW50LCBzc3JjKSB7CiAgaWYodGhpcy5zZXNzaW9uSWRfKSB7CiAgICBpZih0aGlzLnNlc3Npb25JZF8gPT0gcGFydGljaXBhbnQuZ2V0U2Vzc2lvbklkKCkgJiYgc3NyYykgewogICAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLnN0cmVhbUVuZHBvaW50c18ubGVuZ3RoOysraSkgewogICAgICAgIHZhciBlbmRwb2ludCA9IHRoaXMuc3RyZWFtRW5kcG9pbnRzX1tpXTsKICAgICAgICBpZihlbmRwb2ludC5nZXRTdHJlYW1JZCgpID09IHNzcmMpIHsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLlJlbW92ZWRFbmRwb2ludEV2ZW50KGVuZHBvaW50KSk7CiAgICAgICAgICBlbmRwb2ludC5kaXNwb3NlKCk7CiAgICAgICAgICB0aGlzLnN0cmVhbUVuZHBvaW50c18uc3BsaWNlKGksIDEpOwogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9ZWxzZSB7CiAgICB0aGlzLnF1ZXVlUGFydGljaXBhbnRfKG5ldyB0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMuUXVldWVkUGFydGljaXBhbnRfKHBhcnRpY2lwYW50LCBzc3JjLCAhMCkpCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMucHJvdG90eXBlLmdldFN0cmVhbUlkT2ZQYXJ0aWNpcGFudF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmx1dGVTdHJlYW1zJCRnZXRTdHJlYW1JZE9mUGFydGljaXBhbnRfJChwYXJ0aWNpcGFudCkgewogIGlmKHRoaXMuY2FsbE1hbmFnZXJfLmdldExvY2FsUHJldmlldygpICYmIHBhcnRpY2lwYW50LmlzTG9jYWwoKSkgewogICAgcmV0dXJuIG51bGwKICB9CiAgdmFyIHN0cmVhbUlkID0gcGFydGljaXBhbnQuZ2V0VmlkZW9TU1JDKCk7CiAgc3RyZWFtSWQgfHwgKHN0cmVhbUlkID0gcGFydGljaXBhbnQuZ2V0QXVkaW9TU1JDKCkpOwogIHJldHVybiBzdHJlYW1JZAp9Owp0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMucHJvdG90eXBlLnNlbmRTdHJlYW1Pbl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmx1dGVTdHJlYW1zJCRzZW5kU3RyZWFtT25fJChlKSB7CiAgdGhpcy5jYWxsTWFuYWdlcl8uc2VuZEZsdXRlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUoWyJzdHJlYW1vbiIsIHRoaXMuc2VuZGVySmlkXywgdGhpcy5zZXNzaW9uSWRfLCB0aGlzLmMzZEFkZHJlc3NfLCBlLnRleHR1cmVJZCwgZS5zdHJlYW0sIGUudGV4dHVyZVdpZHRoLCBlLnRleHR1cmVIZWlnaHRdKSkKfTsKdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLnByb3RvdHlwZS5zZW5kU3RyZWFtT2ZmXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGbHV0ZVN0cmVhbXMkJHNlbmRTdHJlYW1PZmZfJChlKSB7CiAgdGhpcy5jYWxsTWFuYWdlcl8uc2VuZEZsdXRlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUoWyJzdHJlYW1vZmYiLCB0aGlzLnNlbmRlckppZF8sIHRoaXMuc2Vzc2lvbklkXywgdGhpcy5jM2RBZGRyZXNzXywgZS50ZXh0dXJlSWRdKSkKfTsKdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLnByb3RvdHlwZS5kaXNwb3NlU3RyZWFtc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmx1dGVTdHJlYW1zJCRkaXNwb3NlU3RyZWFtc18kKCkgewogIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuc3RyZWFtRW5kcG9pbnRzXy5sZW5ndGg7KytpKSB7CiAgICB0aGlzLnN0cmVhbUVuZHBvaW50c19baV0uZGlzcG9zZSgpCiAgfQogIHRoaXMuc3RyZWFtRW5kcG9pbnRzXy5zcGxpY2UoMCwgdGhpcy5zdHJlYW1FbmRwb2ludHNfLmxlbmd0aCk7CiAgdGhpcy5xdWV1ZWRQYXJ0aWNpcGFudHNfID0gW10KfTsKdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLnByb3RvdHlwZS5yZXF1ZXN0QWxsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZsdXRlU3RyZWFtcyQkcmVxdWVzdEFsbCQoKSB7CiAgZm9yKHZhciBpID0gMDtpIDwgdGhpcy5zdHJlYW1FbmRwb2ludHNfLmxlbmd0aDsrK2kpIHsKICAgIHZhciBlbmRwb2ludCA9IHRoaXMuc3RyZWFtRW5kcG9pbnRzX1tpXTsKICAgIGVuZHBvaW50LmlzUmVxdWVzdGVkT24oKSB8fCBlbmRwb2ludC5yZXF1ZXN0U3RyZWFtKCkKICB9Cn07CnRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZsdXRlU3RyZWFtcyQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5kaXNwb3NlU3RyZWFtc18oKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8uZGlzcG9zZSgpOwogIHRoaXMuY2FsbE1hbmFnZXJfID0gdGhpcy5ldmVudEhhbmRsZXJfID0gbnVsbAp9Owp0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMxb24xID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZsdXRlU3RyZWFtczFvbjEkKGNhbGxNYW5hZ2VyLCBvM2RCdW5kbGUpIHsKICB0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMuY2FsbCh0aGlzLCBjYWxsTWFuYWdlciwgbzNkQnVuZGxlKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtczFvbjEsIHRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcyk7CnRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtczFvbjEucHJvdG90eXBlLmluaXRTZXNzaW9uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZsdXRlU3RyZWFtczFvbjEkJGluaXRTZXNzaW9uJChzZXNzaW9uSWQsIHNlbmRlckppZCwgY2FsbFR5cGUsIG9wdF9wYXJ0aWNpcGFudHMpIHsKICB0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMxb24xLnN1cGVyQ2xhc3NfLmluaXRTZXNzaW9uLmNhbGwodGhpcywgc2Vzc2lvbklkLCBzZW5kZXJKaWQsIGNhbGxUeXBlLCBvcHRfcGFydGljaXBhbnRzKTsKICBnb29nLmlzRGVmQW5kTm90TnVsbChvcHRfcGFydGljaXBhbnRzKSAmJiAodGhpcy5hZGRMb2NhbFBhcnRpY2lwYW50XyhjYWxsVHlwZSwgb3B0X3BhcnRpY2lwYW50cyksIHRoaXMuYWRkUmVtb3RlUGFydGljaXBhbnRfKG9wdF9wYXJ0aWNpcGFudHMpKQp9Owp0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMxb24xLnByb3RvdHlwZS5hZGRMb2NhbFBhcnRpY2lwYW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGbHV0ZVN0cmVhbXMxb24xJCRhZGRMb2NhbFBhcnRpY2lwYW50XyQoY2FsbFR5cGUsIHBhcnRpY2lwYW50cykgewogIHZhciBzaG93VmlkZW8gPSBjYWxsVHlwZSA9PSB0YWxrLm1lZGlhLkNhbGxUeXBlLlZJREVPIHx8IGNhbGxUeXBlID09IHRhbGsubWVkaWEuQ2FsbFR5cGUuVEVTVDsKICBpZihnb29nLmlzRGVmQW5kTm90TnVsbChwYXJ0aWNpcGFudHMpKSB7CiAgICB2YXIgbG9jYWxQYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50cy5maW5kTG9jYWwoKTsKICAgIGlmKGxvY2FsUGFydGljaXBhbnQpIHsKICAgICAgdmFyIGxvY2FsID0gdGhpcy5jcmVhdGVTdHJlYW1FbmRwb2ludChudWxsLCBsb2NhbFBhcnRpY2lwYW50KTsKICAgICAgc2hvd1ZpZGVvID8gbG9jYWwucmVxdWVzdFN0cmVhbSgpIDogbG9jYWwucmVxdWVzdEF2YXRhcigpCiAgICB9ZWxzZSB7CiAgICAgIHRoaXMubG9nZ2VyLmluZm8oIk5vIGxvY2FsIHBhcnRpY2lwYW50IGZvdW5kISIpCiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMxb24xLnByb3RvdHlwZS5hZGRSZW1vdGVQYXJ0aWNpcGFudF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmx1dGVTdHJlYW1zMW9uMSQkYWRkUmVtb3RlUGFydGljaXBhbnRfJChwYXJ0aWNpcGFudHMpIHsKICBmb3IodmFyIGlkcyA9IHBhcnRpY2lwYW50cy5nZXRLZXlzKCksIGkgPSAwO2kgPCBpZHMubGVuZ3RoOysraSkgewogICAgdmFyIHBhcnRpY2lwYW50ID0gcGFydGljaXBhbnRzLmdldChpZHNbaV0pOwogICAgaWYoIXBhcnRpY2lwYW50LmlzTG9jYWwoKSkgewogICAgICB0aGlzLmNyZWF0ZVN0cmVhbUVuZHBvaW50KCIwIiwgcGFydGljaXBhbnQpOwogICAgICBicmVhawogICAgfQogIH0KfTsKdGFsay5tZWRpYS5jM2QuQzNkRW5naW5lID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEMzZEVuZ2luZSQob3B0X3JlbmRlckZwcykgewogIHRoaXMucmVuZGVyQ2FsbGJhY2tzXyA9IFtdOwogIHRoaXMuYm91bmRSZW5kZXJDYWxsYmFja18gPSBnb29nLmJpbmQodGhpcy5yZW5kZXJDYWxsYmFja18sIHRoaXMpOwogIHRoaXMucmVuZGVyRnBzXyA9IGdvb2cuaXNEZWZBbmROb3ROdWxsKG9wdF9yZW5kZXJGcHMpID8gb3B0X3JlbmRlckZwcyA6IHRhbGsubWVkaWEuYzNkLkMzZEVuZ2luZS5ERUZBVUxUX1JFTkRFUl9GUFM7CiAgdGhpcy5yZW5kZXJDbG9ja18gPSBuZXcgZ29vZy5UaW1lcigwIDwgdGhpcy5yZW5kZXJGcHNfID8gMUUzIC8gdGhpcy5yZW5kZXJGcHNfIDogdm9pZCAwKTsKICB0aGlzLnJlbmRlckNsb2NrXy5hZGRFdmVudExpc3RlbmVyKGdvb2cuVGltZXIuVElDSywgdGhpcy5yZW5kZXJfLCAhMSwgdGhpcykKfTsKdGFsay5tZWRpYS5jM2QuQzNkRW5naW5lLkRFRkFVTFRfUkVOREVSX0ZQUyA9IDMwOwp0YWxrLm1lZGlhLmMzZC5DM2RFbmdpbmUucHJvdG90eXBlLnNldEMzZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRDM2RFbmdpbmUkJHNldEMzZCQoYzNkT2JqZWN0LCBvWGRHbG9iYWxzKSB7CiAgaWYodGhpcy5jM2RPYmplY3RfICE9IGMzZE9iamVjdCkgewogICAgaWYodGhpcy5jM2RPYmplY3RfICYmIDAgPCB0aGlzLnJlbmRlckNhbGxiYWNrc18ubGVuZ3RoICYmIHRoaXMuZGlzYWJsZVJlbmRlckNhbGxiYWNrXygpLCAodGhpcy5jM2RPYmplY3RfID0gYzNkT2JqZWN0KSAmJiAwIDwgdGhpcy5yZW5kZXJDYWxsYmFja3NfLmxlbmd0aCAmJiB0aGlzLmVuYWJsZVJlbmRlckNhbGxiYWNrXygpLCB0aGlzLmMzZE9iamVjdF8pIHsKICAgICAgdmFyIGMzZCA9IHRoaXMuYzNkT2JqZWN0Xy5nZXRQbHVnaW4oKTsKICAgICAgYzNkLmNsaWVudC5yZW5kZXJNb2RlID0gYzNkLm8zZC5DbGllbnQuUkVOREVSTU9ERV9PTl9ERU1BTkQ7CiAgICAgIHRoaXMucmVuZGVyQ2xvY2tfLnN0YXJ0KCkKICAgIH1lbHNlIHsKICAgICAgdGhpcy5yZW5kZXJDbG9ja18uc3RvcCgpCiAgICB9CiAgfQogIHRoaXMub1hkR2xvYmFsc18gPSBvWGRHbG9iYWxzCn07CnRhbGsubWVkaWEuYzNkLkMzZEVuZ2luZS5SZW5kZXJDYWxsYmFjayA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRDM2RFbmdpbmUkUmVuZGVyQ2FsbGJhY2skKCkgewp9Owp0YWxrLm1lZGlhLmMzZC5DM2RFbmdpbmUucHJvdG90eXBlLmVuYWJsZVJlbmRlckNhbGxiYWNrXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRDM2RFbmdpbmUkJGVuYWJsZVJlbmRlckNhbGxiYWNrXyQoKSB7CiAgdmFyIGMzZCA9IHRoaXMuYzNkT2JqZWN0Xy5nZXRQbHVnaW4oKTsKICBjM2QuY2xpZW50LnNldFJlbmRlckNhbGxiYWNrKHRoaXMuYm91bmRSZW5kZXJDYWxsYmFja18pCn07CnRhbGsubWVkaWEuYzNkLkMzZEVuZ2luZS5wcm90b3R5cGUuZGlzYWJsZVJlbmRlckNhbGxiYWNrXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRDM2RFbmdpbmUkJGRpc2FibGVSZW5kZXJDYWxsYmFja18kKCkgewogIGlmKHRoaXMuYzNkT2JqZWN0Xy5pc1NjcmlwdGFibGUoKSkgewogICAgdmFyIGMzZCA9IHRoaXMuYzNkT2JqZWN0Xy5nZXRQbHVnaW4oKTsKICAgIGMzZC5jbGllbnQuY2xlYXJSZW5kZXJDYWxsYmFjaygpCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5DM2RFbmdpbmUucHJvdG90eXBlLnJlbmRlckNhbGxiYWNrXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRDM2RFbmdpbmUkJHJlbmRlckNhbGxiYWNrXyQocmVuZGVyRXZlbnQpIHsKICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLnJlbmRlckNhbGxiYWNrc18ubGVuZ3RoOykgewogICAgdmFyIGNhbGxiYWNrID0gdGhpcy5yZW5kZXJDYWxsYmFja3NfW2ldOwogICAgY2FsbGJhY2sub25SZW5kZXIocmVuZGVyRXZlbnQuZWxhcHNlZFRpbWUpID8gaSsrIDogdGhpcy51bnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2soY2FsbGJhY2spCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5DM2RFbmdpbmUucHJvdG90eXBlLnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQzNkRW5naW5lJCRyZWdpc3RlclJlbmRlckNhbGxiYWNrJChjYWxsYmFjaykgewogIHZhciBlbXB0eSA9IDAgPT0gdGhpcy5yZW5kZXJDYWxsYmFja3NfLmxlbmd0aDsKICB0aGlzLnJlbmRlckNhbGxiYWNrc18ucHVzaChjYWxsYmFjayk7CiAgdGhpcy5jM2RPYmplY3RfICYmIGVtcHR5ICYmIHRoaXMuZW5hYmxlUmVuZGVyQ2FsbGJhY2tfKCkKfTsKdGFsay5tZWRpYS5jM2QuQzNkRW5naW5lLnByb3RvdHlwZS51bnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQzNkRW5naW5lJCR1bnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2skKGNhbGxiYWNrKSB7CiAgZm9yKHZhciBpIGluIHRoaXMucmVuZGVyQ2FsbGJhY2tzXykgewogICAgaWYodGhpcy5yZW5kZXJDYWxsYmFja3NfW2ldID09IGNhbGxiYWNrKSB7CiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNhbGxiYWNrc18uc3BsaWNlKGksIDEpLCB0aGlzLmMzZE9iamVjdF8gJiYgMCA9PSB0aGlzLnJlbmRlckNhbGxiYWNrc18ubGVuZ3RoICYmIHRoaXMuZGlzYWJsZVJlbmRlckNhbGxiYWNrXygpLCAhMAogICAgfQogIH0KICByZXR1cm4hMQp9Owp0YWxrLm1lZGlhLmMzZC5DM2RFbmdpbmUucHJvdG90eXBlLnVucmVnaXN0ZXJBbGxSZW5kZXJDYWxsYmFja3MgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQzNkRW5naW5lJCR1bnJlZ2lzdGVyQWxsUmVuZGVyQ2FsbGJhY2tzJCgpIHsKICB2YXIgZW1wdHkgPSAwIDwgdGhpcy5yZW5kZXJDYWxsYmFja3NfLmxlbmd0aDsKICB0aGlzLnJlbmRlckNhbGxiYWNrc18gPSBbXTsKICB0aGlzLmMzZE9iamVjdF8gJiYgIWVtcHR5ICYmIHRoaXMuZGlzYWJsZVJlbmRlckNhbGxiYWNrXygpCn07CnRhbGsubWVkaWEuYzNkLkMzZEVuZ2luZS5wcm90b3R5cGUucmVuZGVyXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRDM2RFbmdpbmUkJHJlbmRlcl8kKCkgewogIHRoaXMub1hkR2xvYmFsc18gJiYgdGhpcy5vWGRHbG9iYWxzXy5jbGllbnQucmVuZGVyKCkKfTsKdGFsay5tZWRpYS5jM2QuQ3Vyc29yTWFuYWdlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRDdXJzb3JNYW5hZ2VyJChvM2RCdW5kbGUpIHsKICB0aGlzLm8zZEJ1bmRsZV8gPSBvM2RCdW5kbGU7CiAgdGhpcy5yZWdpc3RyYXRpb25zXyA9IFtdCn07CnRhbGsubWVkaWEuYzNkLkN1cnNvck1hbmFnZXIuUmVnaXN0cmF0aW9uXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRDdXJzb3JNYW5hZ2VyJFJlZ2lzdHJhdGlvbl8kKHN0eWxlLCBwcmlvcml0eSkgewogIHRoaXMuc3R5bGUgPSBzdHlsZTsKICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHkKfTsKdGFsay5tZWRpYS5jM2QuQ3Vyc29yTWFuYWdlci5wcm90b3R5cGUuc2V0Q3Vyc29yID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEN1cnNvck1hbmFnZXIkJHNldEN1cnNvciQoc3R5bGVOYW1lLCBwcmlvcml0eSkgewogIHZhciBjM2QgPSB0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LmdldFBsdWdpbigpLCByZWdpc3RyYXRpb24gPSBuZXcgdGFsay5tZWRpYS5jM2QuQ3Vyc29yTWFuYWdlci5SZWdpc3RyYXRpb25fKGMzZC5vM2QuQ3Vyc29yW3N0eWxlTmFtZV0sIHByaW9yaXR5KTsKICB0aGlzLnJlZ2lzdHJhdGlvbnNfLnB1c2gocmVnaXN0cmF0aW9uKTsKICB0aGlzLmNob29zZUN1cnNvcl8oKTsKICByZXR1cm4gcmVnaXN0cmF0aW9uCn07CnRhbGsubWVkaWEuYzNkLkN1cnNvck1hbmFnZXIucHJvdG90eXBlLnVuc2V0Q3Vyc29yID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEN1cnNvck1hbmFnZXIkJHVuc2V0Q3Vyc29yJChyZWYpIHsKICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLnJlZ2lzdHJhdGlvbnNfLmxlbmd0aDtpKyspIHsKICAgIGlmKHRoaXMucmVnaXN0cmF0aW9uc19baV0gPT0gcmVmKSB7CiAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJhdGlvbnNfLnNwbGljZShpLCAxKSwgdGhpcy5jaG9vc2VDdXJzb3JfKCksICEwCiAgICB9CiAgfQogIHJldHVybiExCn07CnRhbGsubWVkaWEuYzNkLkN1cnNvck1hbmFnZXIucHJvdG90eXBlLmNob29zZUN1cnNvcl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQ3Vyc29yTWFuYWdlciQkY2hvb3NlQ3Vyc29yXyQoKSB7CiAgdmFyIGMzZCA9IHRoaXMubzNkQnVuZGxlXy5jM2RPYmplY3QuZ2V0UGx1Z2luKCk7CiAgaWYoMCA9PSB0aGlzLnJlZ2lzdHJhdGlvbnNfLmxlbmd0aCkgewogICAgYzNkLmNsaWVudC5jdXJzb3IgPSBjM2QubzNkLkN1cnNvci5ERUZBVUxUCiAgfWVsc2UgewogICAgZm9yKHZhciBoaWdoZXN0ID0gdGhpcy5yZWdpc3RyYXRpb25zX1swXSwgaSA9IDE7aSA8IHRoaXMucmVnaXN0cmF0aW9uc18ubGVuZ3RoO2krKykgewogICAgICB0aGlzLnJlZ2lzdHJhdGlvbnNfW2ldLnByaW9yaXR5ID4gaGlnaGVzdC5wcmlvcml0eSAmJiAoaGlnaGVzdCA9IHRoaXMucmVnaXN0cmF0aW9uc19baV0pCiAgICB9CiAgICBjM2QuY2xpZW50LmN1cnNvciA9IGhpZ2hlc3Quc3R5bGUKICB9Cn07CnRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5Ob3RpY2UgPSB7fTsKdGFsay5tZWRpYS5jM2QuRnVsbHNjcmVlbk5vdGljZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuTm90aWNlIik7CnRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5Ob3RpY2UuQXZhaWxhYmxlTG9jYWxlc18gPSB7YXI6MSwgYmc6MSwgYm46MSwgY2E6MSwgY3M6MSwgZGE6MSwgZGU6MSwgZWw6MSwgZW46MSwgImVuLUdCIjoxLCBlczoxLCAiZXMtNDE5IjoxLCBldDoxLCBmYToxLCBmaToxLCBmaWw6MSwgZnI6MSwgZ3U6MSwgaGk6MSwgaHI6MSwgaHU6MSwgaWQ6MSwgaXM6MSwgaXQ6MSwgaXc6MSwgamE6MSwga246MSwga286MSwgbHQ6MSwgbHY6MSwgbWw6MSwgbXI6MSwgbXM6MSwgbmw6MSwgbm86MSwgcGw6MSwgInB0LUJSIjoxLCAicHQtUFQiOjEsIHJvOjEsIHJ1OjEsIHNrOjEsIHNsOjEsIHNyOjEsIHN2OjEsIHRhOjEsIHRlOjEsIHRoOjEsIHRyOjEsIHVrOjEsIHVyOjEsIHZpOjEsICJ6aC1DTiI6MSwgInpoLVRXIjoxfTsKdGFsay5tZWRpYS5jM2QuRnVsbHNjcmVlbk5vdGljZS5WRVJUSUNBTF9NQVJHSU5fID0gMzA7CnRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5Ob3RpY2UucmVuZGVyTm90aWNlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGdWxsc2NyZWVuTm90aWNlJHJlbmRlck5vdGljZV8kKG8zZEJ1bmRsZSwgaW1hZ2UsIHNvdXJjZVRleHR1cmUpIHsKICB2YXIgaGVpZ2h0ID0gc291cmNlVGV4dHVyZS5oZWlnaHQgKyB0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuTm90aWNlLlZFUlRJQ0FMX01BUkdJTl87CiAgMSA9PSBoZWlnaHQgJSAyICYmIGhlaWdodCsrOwogIHZhciB3aWR0aCA9IHNvdXJjZVRleHR1cmUud2lkdGggKyBoZWlnaHQsIGNpcmNsZVJhZGl1cyA9IGhlaWdodCAvIDI7CiAgMSA9PSB3aWR0aCAlIDIgJiYgd2lkdGgrKzsKICB2YXIgY2FudmFzID0gbzNkQnVuZGxlLnBhY2suY3JlYXRlT2JqZWN0KCJDYW52YXMiKTsKICBjYW52YXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICBjYW52YXMuY2xlYXIoWzAsIDAsIDAsIDBdKTsKICB2YXIgYmFja2dyb3VuZFBhaW50ID0gbzNkQnVuZGxlLnBhY2suY3JlYXRlT2JqZWN0KCJDYW52YXNQYWludCIpOwogIGJhY2tncm91bmRQYWludC5jb2xvciA9IFswLCAwLCAwLCAwLjVdOwogIGNhbnZhcy5kcmF3UmVjdChjaXJjbGVSYWRpdXMsIDAsIHdpZHRoIC0gY2lyY2xlUmFkaXVzLCBoZWlnaHQsIGJhY2tncm91bmRQYWludCk7CiAgdGFsay5tZWRpYS5jM2QucmFzdGVyaXplU29saWRRdWFydGVyQ2lyY2xlKGNhbnZhcywgYmFja2dyb3VuZFBhaW50LCB3aWR0aCAtIGNpcmNsZVJhZGl1cywgY2lyY2xlUmFkaXVzLCBjaXJjbGVSYWRpdXMsIDEpOwogIHRhbGsubWVkaWEuYzNkLnJhc3Rlcml6ZVNvbGlkUXVhcnRlckNpcmNsZShjYW52YXMsIGJhY2tncm91bmRQYWludCwgd2lkdGggLSBjaXJjbGVSYWRpdXMsIGNpcmNsZVJhZGl1cywgY2lyY2xlUmFkaXVzLCAyKTsKICB0YWxrLm1lZGlhLmMzZC5yYXN0ZXJpemVTb2xpZFF1YXJ0ZXJDaXJjbGUoY2FudmFzLCBiYWNrZ3JvdW5kUGFpbnQsIGNpcmNsZVJhZGl1cywgY2lyY2xlUmFkaXVzLCBjaXJjbGVSYWRpdXMsIDMpOwogIHRhbGsubWVkaWEuYzNkLnJhc3Rlcml6ZVNvbGlkUXVhcnRlckNpcmNsZShjYW52YXMsIGJhY2tncm91bmRQYWludCwgY2lyY2xlUmFkaXVzLCBjaXJjbGVSYWRpdXMsIGNpcmNsZVJhZGl1cywgNCk7CiAgY2FudmFzLmRyYXdCaXRtYXAoc291cmNlVGV4dHVyZSwgY2lyY2xlUmFkaXVzLCBoZWlnaHQgLSB0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuTm90aWNlLlZFUlRJQ0FMX01BUkdJTl8gLyAyKTsKICB2YXIgYzNkID0gbzNkQnVuZGxlLmMzZE9iamVjdC5nZXRQbHVnaW4oKSwgdGFyZ2V0VGV4dHVyZSA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS53cmFwT2JqZWN0KG8zZEJ1bmRsZS5wYWNrLCBvM2RCdW5kbGUucGFjay5jcmVhdGVUZXh0dXJlMkQod2lkdGgsIGhlaWdodCwgYzNkLm8zZC5UZXh0dXJlLkFSR0I4LCAxLCAhMSkpOwogIG51bGwgIT0gdGFyZ2V0VGV4dHVyZSA/IChjYW52YXMuY29weVRvVGV4dHVyZSh0YXJnZXRUZXh0dXJlLmdldE9iamVjdCgpKSwgaW1hZ2Uuc2V0VGV4dHVyZSh0YXJnZXRUZXh0dXJlKSkgOiB0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuTm90aWNlLmxvZ2dlcl8uc2V2ZXJlKCJGYWlsZWQgdG8gY3JlYXRlIEFSR0I4IFRleHR1cmUyRCB3aXRoIHNpemUgIiArIHdpZHRoICsgIngiICsgaGVpZ2h0KTsKICBvM2RCdW5kbGUucGFjay5yZW1vdmVPYmplY3QoYmFja2dyb3VuZFBhaW50KTsKICBvM2RCdW5kbGUucGFjay5yZW1vdmVPYmplY3QoY2FudmFzKQp9Owp0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuTm90aWNlLmNyZWF0ZUZ1bGxzY3JlZW5Ob3RpY2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRnVsbHNjcmVlbk5vdGljZSRjcmVhdGVGdWxsc2NyZWVuTm90aWNlJChvM2RCdW5kbGUsIGltYWdlT3ZlcmxheSwgbG9jYWxlKSB7CiAgdmFyIGltYWdlID0gaW1hZ2VPdmVybGF5LmNyZWF0ZVVuaW5pdGlhbGl6ZWRJbWFnZSgwLCAwKSwgbG9jYWxlID0gbG9jYWxlLnJlcGxhY2UoL18vZywgIi0iKTsKICB0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuTm90aWNlLkF2YWlsYWJsZUxvY2FsZXNfW2xvY2FsZV0gfHwgKGxvY2FsZSA9ICJlbiIpOwogIHZhciB1cmwgPSAiaW1hZ2VzL2Z1bGxzY3JlZW5fbm90aWNlXyIgKyBsb2NhbGUgKyAiLnBuZyIsIHJlcXVlc3QgPSBvM2RCdW5kbGUucGFjay5jcmVhdGVGaWxlUmVxdWVzdCgiVEVYVFVSRSIpOwogIHJlcXVlc3Qub3BlbigiR0VUIiwgdXJsLCAhMCk7CiAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAkcmVxdWVzdCRvbnJlYWR5c3RhdGVjaGFuZ2UkKCkgewogICAgaWYocmVxdWVzdC5kb25lKSB7CiAgICAgIGlmKHJlcXVlc3Quc3VjY2VzcykgewogICAgICAgIHRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5Ob3RpY2UucmVuZGVyTm90aWNlXyhvM2RCdW5kbGUsIGltYWdlLCByZXF1ZXN0LnRleHR1cmUpCiAgICAgIH1lbHNlIHsKICAgICAgICB2YXIgbXNnID0gcmVxdWVzdC5lcnJvcjsKICAgICAgICBtc2cgfHwgKG1zZyA9ICJVbmtub3duIGVycm9yIik7CiAgICAgICAgdGFsay5tZWRpYS5jM2QuRnVsbHNjcmVlbk5vdGljZS5sb2dnZXJfLnNldmVyZSgnVGV4dHVyZSBmYWlsZWQgdG8gbG9hZCwgdXJsPSInICsgdXJsICsgJyIsIG1zZz0iJyArIG1zZyArICciJykKICAgICAgfQogICAgICBvM2RCdW5kbGUucGFjay5yZW1vdmVPYmplY3QocmVxdWVzdCkKICAgIH0KICB9OwogIHJlcXVlc3Quc2VuZCgpOwogIHJldHVybiBpbWFnZQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RCdW5kbGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQnVuZGxlJCgpIHsKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkKG8zZEJ1bmRsZSwgbWF0ZXJpYWwsIHNjZW5lT2JqZWN0LCB6Q29vcmQpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKTsKICB0aGlzLm8zZEJ1bmRsZV8gPSBvM2RCdW5kbGU7CiAgdGhpcy5tYXRlcmlhbF8gPSBtYXRlcmlhbDsKICB0aGlzLnNjZW5lT2JqZWN0XyA9IHNjZW5lT2JqZWN0OwogIHRoaXMuekNvb3JkXyA9IHpDb29yZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLkltYWdlLCBnb29nLkRpc3Bvc2FibGUpOwp0YWxrLm1lZGlhLmMzZC5JbWFnZS5wcm90b3R5cGUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5jM2QuSW1hZ2UiKTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLnhfID0gMDsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLnlfID0gMDsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLndpZHRoXyA9IDA7CnRhbGsubWVkaWEuYzNkLkltYWdlLnByb3RvdHlwZS5oZWlnaHRfID0gMDsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLnRleHR1cmVXaWR0aF8gPSAwOwp0YWxrLm1lZGlhLmMzZC5JbWFnZS5wcm90b3R5cGUudGV4dHVyZUhlaWdodF8gPSAwOwp0YWxrLm1lZGlhLmMzZC5JbWFnZS5wcm90b3R5cGUuc2V0VGV4dHVyZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJHNldFRleHR1cmVfJCh0ZXh0dXJlLCBvcHRfZmFzdFJlc2NhbGUpIHsKICB0aGlzLmRpc3Bvc2VUZXh0dXJlXygpOwogIHRoaXMudGV4dHVyZV8gPSB0ZXh0dXJlOwogIHRoaXMudGV4dHVyZVdpZHRoXyA9IHRoaXMudGV4dHVyZV8uZ2V0KCJ3aWR0aCIpOwogIHRoaXMudGV4dHVyZUhlaWdodF8gPSB0aGlzLnRleHR1cmVfLmdldCgiaGVpZ2h0Iik7CiAgdGhpcy5tYXRlcmlhbF8uc2V0VGV4dHVyZSh0aGlzLnRleHR1cmVfLmdldE9iamVjdCgpLCB0aGlzLnRleHR1cmVXaWR0aF8sIHRoaXMudGV4dHVyZUhlaWdodF8sICExLCAhMCwgb3B0X2Zhc3RSZXNjYWxlKTsKICB0aGlzLnJlc2l6ZSh0aGlzLnRleHR1cmVXaWR0aF8sIHRoaXMudGV4dHVyZUhlaWdodF8pCn07CnRhbGsubWVkaWEuYzNkLkltYWdlLnByb3RvdHlwZS5sb2FkVGV4dHVyZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRJbWFnZSQkbG9hZFRleHR1cmUkKHVybCwgb3B0X29uU3VjY2VzcykgewogIHZhciByZXF1ZXN0ID0gdGhpcy5vM2RCdW5kbGVfLnBhY2suY3JlYXRlRmlsZVJlcXVlc3QoIlRFWFRVUkUiKTsKICByZXF1ZXN0Lm9wZW4oIkdFVCIsIHVybCwgITApOwogIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZ29vZy5iaW5kKGZ1bmN0aW9uKCkgewogICAgaWYocmVxdWVzdC5kb25lKSB7CiAgICAgIGlmKHJlcXVlc3Quc3VjY2VzcykgewogICAgICAgIHRoaXMuc2V0VGV4dHVyZV8odGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLndyYXBPYmplY3QodGhpcy5vM2RCdW5kbGVfLnBhY2ssIHJlcXVlc3QudGV4dHVyZSkpLCBvcHRfb25TdWNjZXNzICYmIG9wdF9vblN1Y2Nlc3MoKQogICAgICB9ZWxzZSB7CiAgICAgICAgdmFyIG1zZyA9IHJlcXVlc3QuZXJyb3I7CiAgICAgICAgbXNnIHx8IChtc2cgPSAiVW5rbm93biBlcnJvciIpOwogICAgICAgIHRoaXMubG9nZ2VyXy5zZXZlcmUoJ1RleHR1cmUgZmFpbGVkIHRvIGxvYWQsIHVybD0iJyArIHVybCArICciLCBtc2c9IicgKyBtc2cgKyAnIicpCiAgICAgIH0KICAgICAgdGhpcy5vM2RCdW5kbGVfLnBhY2sucmVtb3ZlT2JqZWN0KHJlcXVlc3QpCiAgICB9CiAgfSwgdGhpcyk7CiAgcmVxdWVzdC5zZW5kKCkKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLnNldFRleHR1cmUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJHNldFRleHR1cmUkKHRleHR1cmUsIG9wdF9vblN1Y2Nlc3MsIG9wdF9mYXN0UmVzY2FsZSkgewogIHRoaXMuc2V0VGV4dHVyZV8odGV4dHVyZSwgb3B0X2Zhc3RSZXNjYWxlKTsKICBvcHRfb25TdWNjZXNzICYmIG9wdF9vblN1Y2Nlc3MoKQp9Owp0YWxrLm1lZGlhLmMzZC5JbWFnZS5wcm90b3R5cGUuc2V0QWxwaGEgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJHNldEFscGhhJChhKSB7CiAgdGhpcy5zY2VuZU9iamVjdF8uc2V0QWxwaGEoYSkKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLmdldEFscGhhID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEltYWdlJCRnZXRBbHBoYSQoKSB7CiAgcmV0dXJuIHRoaXMuc2NlbmVPYmplY3RfLmdldEFscGhhKCkKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLnNldFZpc2libGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJHNldFZpc2libGUkKHZpc2libGUpIHsKICB0aGlzLnNjZW5lT2JqZWN0Xy5zZXRWaXNpYmxlKHZpc2libGUpCn07CnRhbGsubWVkaWEuYzNkLkltYWdlLnByb3RvdHlwZS5pc1Zpc2libGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJGlzVmlzaWJsZSQoKSB7CiAgcmV0dXJuIHRoaXMuc2NlbmVPYmplY3RfLmlzVmlzaWJsZSgpCn07CnRhbGsubWVkaWEuYzNkLkltYWdlLnByb3RvdHlwZS54ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEltYWdlJCR4JCgpIHsKICByZXR1cm4gdGhpcy54Xwp9Owp0YWxrLm1lZGlhLmMzZC5JbWFnZS5wcm90b3R5cGUueSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRJbWFnZSQkeSQoKSB7CiAgcmV0dXJuIHRoaXMueV8KfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLndpZHRoID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEltYWdlJCR3aWR0aCQoKSB7CiAgcmV0dXJuIHRoaXMud2lkdGhfCn07CnRhbGsubWVkaWEuYzNkLkltYWdlLnByb3RvdHlwZS5oZWlnaHQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJGhlaWdodCQoKSB7CiAgcmV0dXJuIHRoaXMuaGVpZ2h0Xwp9Owp0YWxrLm1lZGlhLmMzZC5JbWFnZS5wcm90b3R5cGUudGV4dHVyZVdpZHRoID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEltYWdlJCR0ZXh0dXJlV2lkdGgkKCkgewogIHJldHVybiB0aGlzLnRleHR1cmVXaWR0aF8KfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLnRleHR1cmVIZWlnaHQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJHRleHR1cmVIZWlnaHQkKCkgewogIHJldHVybiB0aGlzLnRleHR1cmVIZWlnaHRfCn07CnRhbGsubWVkaWEuYzNkLkltYWdlLnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJG1vdmVUbyQoeCwgeSkgewogIHRoaXMueF8gPSB4OwogIHRoaXMueV8gPSB5OwogIHRoaXMudXBkYXRlQXR0cnNfKCkKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLnVwZGF0ZUF0dHJzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRJbWFnZSQkdXBkYXRlQXR0cnNfJCgpIHsKICB0aGlzLnNjZW5lT2JqZWN0Xy5zZXRBdHRycyhuZXcgdGFsay5tZWRpYS5jM2QuQXR0cnModGhpcy54XywgdGhpcy55XywgdGhpcy56Q29vcmRfLCB0aGlzLndpZHRoXywgdGhpcy5oZWlnaHRfLCAxKSkKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLm1vdmVJbWFnZVdpdGhFZGdlV3JhcHBpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJG1vdmVJbWFnZVdpdGhFZGdlV3JhcHBpbmckKHgsIHksIHcsIGgpIHsKICAwID4geCAmJiAoeCA9IHcgLSB0aGlzLndpZHRoKCkgKyB4KTsKICAwID4geSAmJiAoeSA9IGggLSB0aGlzLmhlaWdodCgpICsgeSk7CiAgdGhpcy5tb3ZlVG8oeCwgeSkKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRJbWFnZSQkcmVzaXplJCh3aWR0aCwgaGVpZ2h0KSB7CiAgdGhpcy53aWR0aF8gPSB3aWR0aDsKICB0aGlzLmhlaWdodF8gPSBoZWlnaHQ7CiAgdGhpcy51cGRhdGVBdHRyc18oKQp9Owp0YWxrLm1lZGlhLmMzZC5JbWFnZS5wcm90b3R5cGUuaGl0VGVzdCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRJbWFnZSQkaGl0VGVzdCQoeCwgeSkgewogIHJldHVybiB4ID49IHRoaXMueCgpICYmIHggPD0gdGhpcy54KCkgKyB0aGlzLndpZHRoKCkgJiYgeSA+PSB0aGlzLnkoKSAmJiB5IDw9IHRoaXMueSgpICsgdGhpcy5oZWlnaHQoKQp9Owp0YWxrLm1lZGlhLmMzZC5JbWFnZS5wcm90b3R5cGUuZ2V0U2NlbmVPYmplY3QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJGdldFNjZW5lT2JqZWN0JCgpIHsKICByZXR1cm4gdGhpcy5zY2VuZU9iamVjdF8KfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2UucHJvdG90eXBlLmRpc3Bvc2VUZXh0dXJlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRJbWFnZSQkZGlzcG9zZVRleHR1cmVfJCgpIHsKICB0aGlzLnRleHR1cmVfICYmICh0aGlzLnRleHR1cmVfLmRpc3Bvc2UoKSwgdGhpcy50ZXh0dXJlXyA9IG51bGwpCn07CnRhbGsubWVkaWEuYzNkLkltYWdlLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2UkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGhpcy5kaXNwb3NlVGV4dHVyZV8oKTsKICB0aGlzLnNjZW5lT2JqZWN0XyAmJiAodGhpcy5zY2VuZU9iamVjdF8uZGlzcG9zZSgpLCB0aGlzLnNjZW5lT2JqZWN0XyA9IG51bGwpOwogIHRoaXMubWF0ZXJpYWxfICYmICh0aGlzLm1hdGVyaWFsXy5kaXNwb3NlKCksIHRoaXMubWF0ZXJpYWxfID0gbnVsbCk7CiAgdGFsay5tZWRpYS5jM2QuSW1hZ2Uuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKdGFsay5tZWRpYS5jM2QuZWFzaW5nID0ge307CnRhbGsubWVkaWEuYzNkLkVhc2luZ01ldGhvZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRFYXNpbmdNZXRob2QkKCkgewp9Owp0YWxrLm1lZGlhLmMzZC5SYWlzZWRFYXNlSW5PdXQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUmFpc2VkRWFzZUluT3V0JChwb3dlcikgewogIHRoaXMucG93ZXJfID0gcG93ZXIKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5SYWlzZWRFYXNlSW5PdXQsIHRhbGsubWVkaWEuYzNkLkVhc2luZ01ldGhvZCk7CnRhbGsubWVkaWEuYzNkLlJhaXNlZEVhc2VJbk91dC5wcm90b3R5cGUuZG9FYXNlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFJhaXNlZEVhc2VJbk91dCQkZG9FYXNlJChzdGFydCwgZW5kLCBmcmFjdGlvbikgewogIHZhciBmcmFjdGlvbiA9IDIgKiBmcmFjdGlvbiwgY2hhbmdlID0gZW5kIC0gc3RhcnQ7CiAgaWYoMSA+IGZyYWN0aW9uKSB7CiAgICByZXR1cm4gY2hhbmdlIC8gMiAqIE1hdGgucG93KGZyYWN0aW9uLCB0aGlzLnBvd2VyXykgKyBzdGFydAogIH0KICBmcmFjdGlvbiA9IDIgLSBmcmFjdGlvbjsKICByZXR1cm4gY2hhbmdlIC8gMiAqICgyIC0gTWF0aC5wb3coZnJhY3Rpb24sIHRoaXMucG93ZXJfKSkgKyBzdGFydAp9Owp0YWxrLm1lZGlhLmMzZC5SYWlzZWRFYXNlSW4gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUmFpc2VkRWFzZUluJChwb3dlcikgewogIHRoaXMucG93ZXJfID0gcG93ZXIKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5SYWlzZWRFYXNlSW4sIHRhbGsubWVkaWEuYzNkLkVhc2luZ01ldGhvZCk7CnRhbGsubWVkaWEuYzNkLlJhaXNlZEVhc2VJbi5wcm90b3R5cGUuZG9FYXNlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFJhaXNlZEVhc2VJbiQkZG9FYXNlJChzdGFydCwgZW5kLCBmcmFjdGlvbikgewogIHZhciBjaGFuZ2UgPSBlbmQgLSBzdGFydDsKICByZXR1cm4gY2hhbmdlICogTWF0aC5wb3coZnJhY3Rpb24sIHRoaXMucG93ZXJfKSArIHN0YXJ0Cn07CnRhbGsubWVkaWEuYzNkLlJhaXNlZEVhc2VPdXQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUmFpc2VkRWFzZU91dCQocG93ZXIpIHsKICB0aGlzLnBvd2VyXyA9IHBvd2VyCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuUmFpc2VkRWFzZU91dCwgdGFsay5tZWRpYS5jM2QuRWFzaW5nTWV0aG9kKTsKdGFsay5tZWRpYS5jM2QuUmFpc2VkRWFzZU91dC5wcm90b3R5cGUuZG9FYXNlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFJhaXNlZEVhc2VPdXQkJGRvRWFzZSQoc3RhcnQsIGVuZCwgZnJhY3Rpb24pIHsKICB2YXIgY2hhbmdlID0gZW5kIC0gc3RhcnQsIGZyYWN0aW9uID0gMSAtIGZyYWN0aW9uOwogIHJldHVybiBjaGFuZ2UgKiAoMSAtIE1hdGgucG93KGZyYWN0aW9uLCB0aGlzLnBvd2VyXykpICsgc3RhcnQKfTsKdGFsay5tZWRpYS5jM2QuZWFzaW5nLlNUUk9OR19FQVNFX0lOX09VVCA9IG5ldyB0YWxrLm1lZGlhLmMzZC5SYWlzZWRFYXNlSW5PdXQoNSk7CnRhbGsubWVkaWEuYzNkLmVhc2luZy5SRUdVTEFSX0VBU0VfSU4gPSBuZXcgdGFsay5tZWRpYS5jM2QuUmFpc2VkRWFzZUluKDIpOwp0YWxrLm1lZGlhLmMzZC5lYXNpbmcuU1RST05HX0VBU0VfT1VUID0gbmV3IHRhbGsubWVkaWEuYzNkLlJhaXNlZEVhc2VPdXQoNSk7CnRhbGsubWVkaWEuYzNkLkF0dHJzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEF0dHJzJCh4LCB5LCB6LCB3LCBoLCBkKSB7CiAgdGhpcy54ID0geDsKICB0aGlzLnkgPSB5OwogIHRoaXMueiA9IHo7CiAgdGhpcy53ID0gdzsKICB0aGlzLmggPSBoOwogIHRoaXMuZCA9IGQKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVPYmplY3QkKCkgewogIGdvb2cuRGlzcG9zYWJsZS5jYWxsKHRoaXMpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QsIGdvb2cuRGlzcG9zYWJsZSk7CnRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0LkFMTU9TVF9aRVJPX09WRVJSSURFX0FMUEhBID0gMS4wRS03Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdC5wcm90b3R5cGUuYWxwaGFfID0gMDsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QucHJvdG90eXBlLm92ZXJyaWRlQWxwaGFUb1plcm9fID0gITE7CnRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0LnByb3RvdHlwZS52aXNpYmxlXyA9ICEwOwp0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdC5wcm90b3R5cGUuZ2V0QXR0cnMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVPYmplY3QkJGdldEF0dHJzJCgpIHsKICByZXR1cm4gdGhpcy5hdHRyc18KfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QucHJvdG90eXBlLnNldEF0dHJzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lT2JqZWN0JCRzZXRBdHRycyQoYXR0cnMpIHsKICB0aGlzLmF0dHJzXyA9IGF0dHJzOwogIHRoaXMudXBkYXRlQXR0cnMoYXR0cnMpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0LnByb3RvdHlwZS5nZXRBbHBoYSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU9iamVjdCQkZ2V0QWxwaGEkKCkgewogIHJldHVybiB0aGlzLmFscGhhXwp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdC5wcm90b3R5cGUuc2V0QWxwaGEgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVPYmplY3QkJHNldEFscGhhJChhbHBoYSkgewogIHRoaXMuYWxwaGFfID0gYWxwaGE7CiAgdGhpcy5vdmVycmlkZUFscGhhVG9aZXJvXyB8fCB0aGlzLnVwZGF0ZUFscGhhKGFscGhhKQp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdC5wcm90b3R5cGUub3ZlcnJpZGVBbHBoYVRvWmVybyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU9iamVjdCQkb3ZlcnJpZGVBbHBoYVRvWmVybyQob3ZlcnJpZGUpIHsKICB0aGlzLm92ZXJyaWRlQWxwaGFUb1plcm9fID0gb3ZlcnJpZGU7CiAgdGhpcy51cGRhdGVBbHBoYSh0aGlzLm92ZXJyaWRlQWxwaGFUb1plcm9fID8gdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QuQUxNT1NUX1pFUk9fT1ZFUlJJREVfQUxQSEEgOiB0aGlzLmFscGhhXykKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QucHJvdG90eXBlLmlzVmlzaWJsZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU9iamVjdCQkaXNWaXNpYmxlJCgpIHsKICByZXR1cm4gdGhpcy52aXNpYmxlXwp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdC5wcm90b3R5cGUuc2V0VmlzaWJsZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU9iamVjdCQkc2V0VmlzaWJsZSQodmlzaWJsZSkgewogIHRoaXMudmlzaWJsZV8gPSB2aXNpYmxlOwogIHRoaXMudXBkYXRlVmlzaWJsZSh2aXNpYmxlKQp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lT2JqZWN0JCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMuYXR0cnNfID0gbnVsbDsKICB0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLmMzZC50d2VlbnMgPSB7fTsKdGFsay5tZWRpYS5jM2QuVHdlZW4gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkVHdlZW4kKGVhc2VNZXRob2QsIGR1cmF0aW9uLCBvcHRfZG9uZUZuKSB7CiAgdGhpcy5lYXNlTWV0aG9kID0gZWFzZU1ldGhvZDsKICB0aGlzLmR1cmF0aW9uXyA9IGR1cmF0aW9uOwogIHRoaXMuZG9uZUZuXyA9IG9wdF9kb25lRm4gfHwgbnVsbAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlR3ZWVuLCB0YWxrLm1lZGlhLmMzZC5DM2RFbmdpbmUuUmVuZGVyQ2FsbGJhY2spOwp0YWxrLm1lZGlhLmMzZC5Ud2Vlbi5wcm90b3R5cGUuZWxhcHNlZF8gPSAwOwp0YWxrLm1lZGlhLmMzZC5Ud2Vlbi5wcm90b3R5cGUuZ2V0UmVtYWluaW5nID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFR3ZWVuJCRnZXRSZW1haW5pbmckKCkgewogIHJldHVybiB0aGlzLmR1cmF0aW9uXyAtIHRoaXMuZWxhcHNlZF8KfTsKdGFsay5tZWRpYS5jM2QuVHdlZW4ucHJvdG90eXBlLmdldEVhc2VNZXRob2QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkVHdlZW4kJGdldEVhc2VNZXRob2QkKCkgewogIHJldHVybiB0aGlzLmVhc2VNZXRob2QKfTsKdGFsay5tZWRpYS5jM2QuVHdlZW4ucHJvdG90eXBlLm9uUmVuZGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFR3ZWVuJCRvblJlbmRlciQodGltZSkgewogIHRoaXMuZWxhcHNlZF8gKz0gdGltZTsKICB2YXIgZnJhY3Rpb24gPSB0aGlzLmVsYXBzZWRfIC8gdGhpcy5kdXJhdGlvbl8sIG1vcmVXb3JrID0gMSA+IGZyYWN0aW9uOwogIDEgPCBmcmFjdGlvbiAmJiAoZnJhY3Rpb24gPSAxKTsKICB0aGlzLmRvVHdlZW5fKGZyYWN0aW9uKTsKICAhbW9yZVdvcmsgJiYgdGhpcy5kb25lRm5fICYmIHRoaXMuZG9uZUZuXygpOwogIHJldHVybiBtb3JlV29yawp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdFR3ZWVuID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lT2JqZWN0VHdlZW4kKHNjZW5lT2JqLCBlYXNlTWV0aG9kLCBkdXJhdGlvbiwgb3B0X2RvbmVGbikgewogIHRhbGsubWVkaWEuYzNkLlR3ZWVuLmNhbGwodGhpcywgZWFzZU1ldGhvZCwgZHVyYXRpb24sIG9wdF9kb25lRm4pOwogIHRoaXMuc2NlbmVPYmogPSBzY2VuZU9iagp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0VHdlZW4sIHRhbGsubWVkaWEuYzNkLlR3ZWVuKTsKdGFsay5tZWRpYS5jM2QuQXR0cnNUd2VlbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdHRyc1R3ZWVuJChzY2VuZU9iaiwgc3RhcnQsIGVuZCwgZHVyYXRpb24sIGVhc2VNZXRob2QsIG9wdF9kb25lRm4pIHsKICB0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdFR3ZWVuLmNhbGwodGhpcywgc2NlbmVPYmosIGVhc2VNZXRob2QsIGR1cmF0aW9uLCBvcHRfZG9uZUZuKTsKICB0aGlzLnN0YXJ0XyA9IHN0YXJ0OwogIHRoaXMuZW5kXyA9IGVuZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLkF0dHJzVHdlZW4sIHRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0VHdlZW4pOwp0YWxrLm1lZGlhLmMzZC5BdHRyc1R3ZWVuLnByb3RvdHlwZS5kb1R3ZWVuXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdHRyc1R3ZWVuJCRkb1R3ZWVuXyQoZnJhY3Rpb24pIHsKICB0aGlzLnNjZW5lT2JqLnNldEF0dHJzKG5ldyB0YWxrLm1lZGlhLmMzZC5BdHRycyh0aGlzLmVhc2VNZXRob2QuZG9FYXNlKHRoaXMuc3RhcnRfLngsIHRoaXMuZW5kXy54LCBmcmFjdGlvbiksIHRoaXMuZWFzZU1ldGhvZC5kb0Vhc2UodGhpcy5zdGFydF8ueSwgdGhpcy5lbmRfLnksIGZyYWN0aW9uKSwgdGhpcy5lYXNlTWV0aG9kLmRvRWFzZSh0aGlzLnN0YXJ0Xy56LCB0aGlzLmVuZF8ueiwgZnJhY3Rpb24pLCB0aGlzLmVhc2VNZXRob2QuZG9FYXNlKHRoaXMuc3RhcnRfLncsIHRoaXMuZW5kXy53LCBmcmFjdGlvbiksIHRoaXMuZWFzZU1ldGhvZC5kb0Vhc2UodGhpcy5zdGFydF8uaCwgdGhpcy5lbmRfLmgsIGZyYWN0aW9uKSwgdGhpcy5lYXNlTWV0aG9kLmRvRWFzZSh0aGlzLnN0YXJ0Xy5kLCB0aGlzLmVuZF8uZCwgZnJhY3Rpb24pKSkKfTsKdGFsay5tZWRpYS5jM2QuQWxwaGFUd2VlbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBbHBoYVR3ZWVuJChzY2VuZU9iaiwgc3RhcnQsIGVuZCwgZHVyYXRpb24sIGVhc2VNZXRob2QsIG9wdF9kb25lRm4pIHsKICB0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdFR3ZWVuLmNhbGwodGhpcywgc2NlbmVPYmosIGVhc2VNZXRob2QsIGR1cmF0aW9uLCBvcHRfZG9uZUZuKTsKICB0aGlzLnN0YXJ0XyA9IHN0YXJ0OwogIHRoaXMuZW5kXyA9IGVuZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLkFscGhhVHdlZW4sIHRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0VHdlZW4pOwp0YWxrLm1lZGlhLmMzZC5BbHBoYVR3ZWVuLnByb3RvdHlwZS5kb1R3ZWVuXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBbHBoYVR3ZWVuJCRkb1R3ZWVuXyQoZnJhY3Rpb24pIHsKICB0aGlzLnNjZW5lT2JqLnNldEFscGhhKHRoaXMuZWFzZU1ldGhvZC5kb0Vhc2UodGhpcy5zdGFydF8sIHRoaXMuZW5kXywgZnJhY3Rpb24pKQp9Owp0YWxrLm1lZGlhLmMzZC5JbWFnZUZhZGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEltYWdlRmFkZXIkKG8zZEJ1bmRsZSwgaW1hZ2UpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKTsKICB0aGlzLm8zZEJ1bmRsZV8gPSBvM2RCdW5kbGU7CiAgdGhpcy5pbWFnZV8gPSBpbWFnZQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLkltYWdlRmFkZXIsIGdvb2cuRGlzcG9zYWJsZSk7CnRhbGsubWVkaWEuYzNkLkltYWdlRmFkZXIucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2VGYWRlciQkc2hvdyQoc2hvd0R1cmF0aW9uTXMsIGZhZGVEdXJhdGlvblNlYykgewogIHRoaXMuY2FuY2VsQW5pbWF0aW9uc18oKTsKICB0aGlzLmltYWdlXy5zZXRBbHBoYSgxKTsKICB0aGlzLmltYWdlXy5zZXRWaXNpYmxlKCEwKTsKICB0aGlzLnNob3dUaW1lcklkXyA9IGdvb2cuVGltZXIuY2FsbE9uY2UodGhpcy5vblNob3dUaW1lckVsYXBzZWRfLCBzaG93RHVyYXRpb25NcywgdGhpcyk7CiAgdGhpcy5mYWRlRHVyYXRpb25TZWNfID0gZmFkZUR1cmF0aW9uU2VjCn07CnRhbGsubWVkaWEuYzNkLkltYWdlRmFkZXIucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2VGYWRlciQkaGlkZSQoKSB7CiAgdGhpcy5jYW5jZWxBbmltYXRpb25zXygpOwogIHRoaXMuaW1hZ2VfLnNldFZpc2libGUoITEpCn07CnRhbGsubWVkaWEuYzNkLkltYWdlRmFkZXIucHJvdG90eXBlLm9uU2hvd1RpbWVyRWxhcHNlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2VGYWRlciQkb25TaG93VGltZXJFbGFwc2VkXyQoKSB7CiAgZGVsZXRlIHRoaXMuc2hvd1RpbWVySWRfOwogIHRoaXMuaW1hZ2VGYWRlcl8gPSBuZXcgdGFsay5tZWRpYS5jM2QuQWxwaGFUd2Vlbih0aGlzLmltYWdlXy5nZXRTY2VuZU9iamVjdCgpLCB0aGlzLmltYWdlXy5nZXRBbHBoYSgpLCAwLCB0aGlzLmZhZGVEdXJhdGlvblNlY18sIHRhbGsubWVkaWEuYzNkLmVhc2luZy5SRUdVTEFSX0VBU0VfSU4sIGdvb2cuYmluZCh0aGlzLm9uSW1hZ2VGYWRlckRvbmVfLCB0aGlzKSk7CiAgdGhpcy5vM2RCdW5kbGVfLmMzZEVuZ2luZS5yZWdpc3RlclJlbmRlckNhbGxiYWNrKHRoaXMuaW1hZ2VGYWRlcl8pCn07CnRhbGsubWVkaWEuYzNkLkltYWdlRmFkZXIucHJvdG90eXBlLm9uSW1hZ2VGYWRlckRvbmVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEltYWdlRmFkZXIkJG9uSW1hZ2VGYWRlckRvbmVfJCgpIHsKICBkZWxldGUgdGhpcy5pbWFnZUZhZGVyXzsKICB0aGlzLmltYWdlXy5zZXRWaXNpYmxlKCExKQp9Owp0YWxrLm1lZGlhLmMzZC5JbWFnZUZhZGVyLnByb3RvdHlwZS5jYW5jZWxBbmltYXRpb25zXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRJbWFnZUZhZGVyJCRjYW5jZWxBbmltYXRpb25zXyQoKSB7CiAgdGhpcy5zaG93VGltZXJJZF8gJiYgKGdvb2cuVGltZXIuY2xlYXIodGhpcy5zaG93VGltZXJJZF8pLCBkZWxldGUgdGhpcy5zaG93VGltZXJJZF8pOwogIHRoaXMuaW1hZ2VGYWRlcl8gJiYgKHRoaXMubzNkQnVuZGxlXy5jM2RFbmdpbmUudW5yZWdpc3RlclJlbmRlckNhbGxiYWNrKHRoaXMuaW1hZ2VGYWRlcl8pLCBkZWxldGUgdGhpcy5pbWFnZUZhZGVyXykKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2VGYWRlci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEltYWdlRmFkZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGhpcy5jYW5jZWxBbmltYXRpb25zXygpOwogIHRhbGsubWVkaWEuYzNkLkltYWdlRmFkZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKdGFsay5tZWRpYS5jM2QuVGV4dHVyZUNhY2hlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFRleHR1cmVDYWNoZSQobzNkQnVuZGxlKSB7CiAgZ29vZy5EaXNwb3NhYmxlLmNhbGwodGhpcyk7CiAgdGhpcy5vM2RCdW5kbGVfID0gbzNkQnVuZGxlOwogIHRoaXMucmVzb3VyY2VzXyA9IHt9Cn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuVGV4dHVyZUNhY2hlLCBnb29nLkRpc3Bvc2FibGUpOwp0YWxrLm1lZGlhLmMzZC5UZXh0dXJlQ2FjaGUucHJvdG90eXBlLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoInRhbGsubWVkaWEuYzNkLlRleHR1cmVDYWNoZSIpOwp0YWxrLm1lZGlhLmMzZC5UZXh0dXJlQ2FjaGUucHJvdG90eXBlLmxvYWRUZXh0dXJlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFRleHR1cmVDYWNoZSQkbG9hZFRleHR1cmUkKHVybCwgb3B0X29uU3VjY2Vzc0NhbGxiYWNrKSB7CiAgaWYodGhpcy5yZXNvdXJjZXNfW3VybF0pIHsKICAgIHRoaXMucmVzb3VyY2VzX1t1cmxdLnRleHR1cmUgPyBvcHRfb25TdWNjZXNzQ2FsbGJhY2sgJiYgb3B0X29uU3VjY2Vzc0NhbGxiYWNrKHRoaXMucmVzb3VyY2VzX1t1cmxdLnRleHR1cmUuY3JlYXRlVW5vd25lZEhhbmRsZSgpKSA6IG9wdF9vblN1Y2Nlc3NDYWxsYmFjayAmJiB0aGlzLnJlc291cmNlc19bdXJsXS5wZW5kaW5nQ2FsbGJhY2tzLnB1c2gob3B0X29uU3VjY2Vzc0NhbGxiYWNrKQogIH1lbHNlIHsKICAgIHRoaXMucmVzb3VyY2VzX1t1cmxdID0gbmV3IHRhbGsubWVkaWEuYzNkLlRleHR1cmVDYWNoZS5TaGFyZWRSZXNvdXJjZV87CiAgICBvcHRfb25TdWNjZXNzQ2FsbGJhY2sgJiYgdGhpcy5yZXNvdXJjZXNfW3VybF0ucGVuZGluZ0NhbGxiYWNrcy5wdXNoKG9wdF9vblN1Y2Nlc3NDYWxsYmFjayk7CiAgICB2YXIgcmVxdWVzdCA9IHRoaXMubzNkQnVuZGxlXy5wYWNrLmNyZWF0ZUZpbGVSZXF1ZXN0KCJURVhUVVJFIik7CiAgICByZXF1ZXN0Lm9wZW4oIkdFVCIsIHVybCwgITApOwogICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBnb29nLmJpbmQodGhpcy5vblRleHR1cmVMb2FkZWRfLCB0aGlzLCByZXF1ZXN0LCB1cmwpOwogICAgcmVxdWVzdC5zZW5kKCkKICB9Cn07CnRhbGsubWVkaWEuYzNkLlRleHR1cmVDYWNoZS5wcm90b3R5cGUub25UZXh0dXJlTG9hZGVkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRUZXh0dXJlQ2FjaGUkJG9uVGV4dHVyZUxvYWRlZF8kKHJlcXVlc3QsIHVybCkgewogIGlmKHJlcXVlc3QuZG9uZSkgewogICAgaWYocmVxdWVzdC5zdWNjZXNzKSB7CiAgICAgIHZhciB0ZXh0dXJlID0gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLndyYXBPYmplY3QodGhpcy5vM2RCdW5kbGVfLnBhY2ssIHJlcXVlc3QudGV4dHVyZSksIHNoYXJlZFJlc291cmNlID0gdGhpcy5yZXNvdXJjZXNfW3VybF07CiAgICAgIGZvcihzaGFyZWRSZXNvdXJjZS50ZXh0dXJlID0gdGV4dHVyZTswIDwgc2hhcmVkUmVzb3VyY2UucGVuZGluZ0NhbGxiYWNrcy5sZW5ndGg7KSB7CiAgICAgICAgdmFyIGNhbGxiYWNrID0gc2hhcmVkUmVzb3VyY2UucGVuZGluZ0NhbGxiYWNrcy5wb3AoKTsKICAgICAgICBjYWxsYmFjayh0ZXh0dXJlLmNyZWF0ZVVub3duZWRIYW5kbGUoKSkKICAgICAgfQogICAgfWVsc2UgewogICAgICB2YXIgbXNnID0gcmVxdWVzdC5lcnJvcjsKICAgICAgbXNnIHx8IChtc2cgPSAiVW5rbm93biBlcnJvciIpOwogICAgICB0aGlzLmxvZ2dlcl8uc2V2ZXJlKCdUZXh0dXJlIGZhaWxlZCB0byBsb2FkLCB1cmw9IicgKyB1cmwgKyAnIiwgbXNnPSInICsgbXNnICsgJyInKQogICAgfQogICAgdGhpcy5vM2RCdW5kbGVfLnBhY2sucmVtb3ZlT2JqZWN0KHJlcXVlc3QpCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5UZXh0dXJlQ2FjaGUucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRUZXh0dXJlQ2FjaGUkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgZm9yKHZhciBwcm9wTmFtZSBpbiB0aGlzLnJlc291cmNlc18pIHsKICAgIHRoaXMucmVzb3VyY2VzX1twcm9wTmFtZV0udGV4dHVyZSAmJiAodGhpcy5yZXNvdXJjZXNfW3Byb3BOYW1lXS50ZXh0dXJlLmRpc3Bvc2UoKSwgdGhpcy5yZXNvdXJjZXNfW3Byb3BOYW1lXS50ZXh0dXJlID0gbnVsbCksIHRoaXMucmVzb3VyY2VzX1twcm9wTmFtZV0ucGVuZGluZ0NhbGxiYWNrcyA9IG51bGwKICB9CiAgdGhpcy5yZXNvdXJjZXNfID0gbnVsbDsKICB0YWxrLm1lZGlhLmMzZC5UZXh0dXJlQ2FjaGUuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKdGFsay5tZWRpYS5jM2QuVGV4dHVyZUNhY2hlLlNoYXJlZFJlc291cmNlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRUZXh0dXJlQ2FjaGUkU2hhcmVkUmVzb3VyY2VfJCgpIHsKICB0aGlzLnBlbmRpbmdDYWxsYmFja3MgPSBbXQp9Owp0YWxrLm1lZGlhLmMzZC5UZXh0dXJlQ2FjaGUuU2hhcmVkUmVzb3VyY2VfLnByb3RvdHlwZS50ZXh0dXJlID0gbnVsbDsKdGFsay5tZWRpYS5jM2QuVmlldyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRWaWV3JCgpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlZpZXcsIGdvb2cuRGlzcG9zYWJsZSk7CnRhbGsubWVkaWEuYzNkLkltYWdlT3ZlcmxheSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRJbWFnZU92ZXJsYXkkKG8zZEJ1bmRsZSwgdmlldywgb3B0X3pDb29yZCkgewogIHRoaXMubzNkQnVuZGxlXyA9IG8zZEJ1bmRsZTsKICB0aGlzLnZpZXdfID0gdmlldzsKICB0aGlzLnpDb29yZF8gPSBnb29nLmlzRGVmQW5kTm90TnVsbChvcHRfekNvb3JkKSA/IG9wdF96Q29vcmQgOiAwLjEKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2VPdmVybGF5LnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLmMzZC5JbWFnZU92ZXJsYXkiKTsKdGFsay5tZWRpYS5jM2QuSW1hZ2VPdmVybGF5LnByb3RvdHlwZS5jcmVhdGVVbmluaXRpYWxpemVkSW1hZ2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2VPdmVybGF5JCRjcmVhdGVVbmluaXRpYWxpemVkSW1hZ2UkKHgsIHkpIHsKICB2YXIgbWF0ZXJpYWwgPSB0aGlzLm8zZEJ1bmRsZV8ucmVuZGVyaW5nQXBpLmNyZWF0ZU1hdGVyaWFsKHRoaXMudmlld18pLCBzY2VuZU9iamVjdCA9IHRoaXMubzNkQnVuZGxlXy5yZW5kZXJpbmdBcGkuY3JlYXRlU2NlbmVPYmplY3QodGhpcy52aWV3XywgbWF0ZXJpYWwpLCBpbWFnZSA9IG5ldyB0YWxrLm1lZGlhLmMzZC5JbWFnZSh0aGlzLm8zZEJ1bmRsZV8sIG1hdGVyaWFsLCBzY2VuZU9iamVjdCwgdGhpcy56Q29vcmRfKTsKICBpbWFnZS5tb3ZlVG8oeCwgeSk7CiAgaW1hZ2Uuc2V0QWxwaGEoMSk7CiAgcmV0dXJuIGltYWdlCn07CnRhbGsubWVkaWEuYzNkLkltYWdlT3ZlcmxheS5wcm90b3R5cGUuY3JlYXRlSW1hZ2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkSW1hZ2VPdmVybGF5JCRjcmVhdGVJbWFnZSQoeCwgeSwgdXJsLCBvcHRfb25TdWNjZXNzKSB7CiAgdmFyIGltYWdlID0gdGhpcy5jcmVhdGVVbmluaXRpYWxpemVkSW1hZ2UoeCwgeSk7CiAgaW1hZ2UubG9hZFRleHR1cmUodXJsLCBmdW5jdGlvbigpIHsKICAgIG9wdF9vblN1Y2Nlc3MgJiYgb3B0X29uU3VjY2VzcyhpbWFnZSkKICB9KTsKICByZXR1cm4gaW1hZ2UKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2VPdmVybGF5LnByb3RvdHlwZS5jcmVhdGVDYWNoZWRJbWFnZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRJbWFnZU92ZXJsYXkkJGNyZWF0ZUNhY2hlZEltYWdlJCh4LCB5LCB1cmwsIG9wdF9vblN1Y2Nlc3MpIHsKICB2YXIgaW1hZ2UgPSB0aGlzLmNyZWF0ZVVuaW5pdGlhbGl6ZWRJbWFnZSh4LCB5KTsKICB0aGlzLm8zZEJ1bmRsZV8udGV4dHVyZUNhY2hlLmxvYWRUZXh0dXJlKHVybCwgZnVuY3Rpb24odGV4dHVyZSkgewogICAgaW1hZ2Uuc2V0VGV4dHVyZSh0ZXh0dXJlKTsKICAgIG9wdF9vblN1Y2Nlc3MgJiYgb3B0X29uU3VjY2VzcyhpbWFnZSkKICB9KTsKICByZXR1cm4gaW1hZ2UKfTsKdGFsay5tZWRpYS5jM2QuSW1hZ2VPdmVybGF5LnByb3RvdHlwZS5jcmVhdGVJbWFnZUZyb21UZXh0dXJlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEltYWdlT3ZlcmxheSQkY3JlYXRlSW1hZ2VGcm9tVGV4dHVyZSQoeCwgeSwgdGV4dHVyZSwgb3B0X29uU3VjY2Vzcywgb3B0X2Zhc3RSZXNjYWxlKSB7CiAgdmFyIGltYWdlID0gdGhpcy5jcmVhdGVVbmluaXRpYWxpemVkSW1hZ2UoeCwgeSk7CiAgaW1hZ2Uuc2V0VGV4dHVyZSh0ZXh0dXJlLCBvcHRfb25TdWNjZXNzLCBvcHRfZmFzdFJlc2NhbGUpOwogIHJldHVybiBpbWFnZQp9Owp0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuSGFuZGxlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGdWxsc2NyZWVuSGFuZGxlciQobzNkQnVuZGxlLCBpbWFnZU92ZXJsYXksIGxvY2FsZSkgewogIGdvb2cuRGlzcG9zYWJsZS5jYWxsKHRoaXMpOwogIHRoaXMubzNkQnVuZGxlXyA9IG8zZEJ1bmRsZTsKICB0aGlzLmltYWdlT3ZlcmxheV8gPSBpbWFnZU92ZXJsYXk7CiAgdGhpcy5sb2NhbGVfID0gbG9jYWxlOwogIHRoaXMuYm91bmRPblJlc2l6ZV8gPSBnb29nLmJpbmQodGhpcy5vblJlc2l6ZV8sIHRoaXMpOwogIHRoaXMuYm91bmRPbk1vdXNlTW92ZV8gPSBnb29nLmJpbmQodGhpcy5vbk1vdXNlTW92ZV8sIHRoaXMpOwogIHRoaXMuYm91bmRPbkNsaWNrXyA9IGdvb2cuYmluZCh0aGlzLm9uQ2xpY2tfLCB0aGlzKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5IYW5kbGVyLCBnb29nLkRpc3Bvc2FibGUpOwp0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuSGFuZGxlci5DTElDS19MSVNURU5FUl9ERUxBWV9NU18gPSAxRTM7CnRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5IYW5kbGVyLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuSGFuZGxlciIpOwp0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuSGFuZGxlci5wcm90b3R5cGUuZnVsbHNjcmVlbl8gPSAhMTsKdGFsay5tZWRpYS5jM2QuRnVsbHNjcmVlbkhhbmRsZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRnVsbHNjcmVlbkhhbmRsZXIkJGluaXQkKCkgewogIHZhciBjM2QgPSB0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LmdldFBsdWdpbigpOwogIHRhbGsubWVkaWEuYzNkLmFkZEV2ZW50Q2FsbGJhY2soYzNkLCAicmVzaXplIiwgdGhpcy5ib3VuZE9uUmVzaXplXyk7CiAgdGhpcy5mdWxsc2NyZWVuTXNnXyA9IHRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5Ob3RpY2UuY3JlYXRlRnVsbHNjcmVlbk5vdGljZSh0aGlzLm8zZEJ1bmRsZV8sIHRoaXMuaW1hZ2VPdmVybGF5XywgdGhpcy5sb2NhbGVfKTsKICB0aGlzLmZ1bGxzY3JlZW5Nc2dGYWRlcl8gPSBuZXcgdGFsay5tZWRpYS5jM2QuSW1hZ2VGYWRlcih0aGlzLm8zZEJ1bmRsZV8sIHRoaXMuZnVsbHNjcmVlbk1zZ18pOwogIHRoaXMuZnVsbHNjcmVlbk1zZ0ZhZGVyXy5oaWRlKCk7CiAgdHJ5IHsKICAgIHRoaXMuZW50ZXJGdWxsc2NyZWVuSW1nXyA9IHRoaXMuaW1hZ2VPdmVybGF5Xy5jcmVhdGVJbWFnZSgzLCAzLCAiaW1hZ2VzL2VudGVyX2Z1bGxzY3JlZW4ucG5nIiwgZ29vZy5iaW5kKGZ1bmN0aW9uKCkgewogICAgICBjM2QuY2xpZW50LnNldEZ1bGxzY3JlZW5DbGlja1JlZ2lvbih0aGlzLmVudGVyRnVsbHNjcmVlbkltZ18ueCgpLCB0aGlzLmVudGVyRnVsbHNjcmVlbkltZ18ueSgpLCB0aGlzLmVudGVyRnVsbHNjcmVlbkltZ18ud2lkdGgoKSwgdGhpcy5lbnRlckZ1bGxzY3JlZW5JbWdfLmhlaWdodCgpLCBjM2QubzNkLlJlbmRlcmVyLkRJU1BMQVlfTU9ERV9ERUZBVUxUKTsKICAgICAgdGFsay5tZWRpYS5jM2QuYWRkRXZlbnRDYWxsYmFjayhjM2QsICJtb3VzZW1vdmUiLCB0aGlzLmJvdW5kT25Nb3VzZU1vdmVfKTsKICAgICAgdGhpcy5zaG93Q29udHJvbCgpCiAgICB9LCB0aGlzLCBjM2QpKQogIH1jYXRjaChlKSB7CiAgICB0aGlzLmxvZ2dlcl8ud2FybmluZygnRnVsbCBzY3JlZW4gbm90IGF2YWlsYWJsZSAoIicgKyBlLm5hbWUgKyAnIiwgIicgKyBlLm1lc3NhZ2UgKyAnIiknKQogIH0KICB0aGlzLmZ1bGxzY3JlZW5JbWdfID0gdGhpcy5lbnRlckZ1bGxzY3JlZW5JbWdfOwogIHRoaXMuZXhpdEZ1bGxzY3JlZW5JbWdfID0gdGhpcy5pbWFnZU92ZXJsYXlfLmNyZWF0ZUltYWdlKDMsIDMsICJpbWFnZXMvZXhpdF9mdWxsc2NyZWVuLnBuZyIsIGdvb2cuYmluZChmdW5jdGlvbigpIHsKICAgIHRoaXMuZXhpdEZ1bGxzY3JlZW5JbWdfLnJlc2l6ZSgyICogdGhpcy5leGl0RnVsbHNjcmVlbkltZ18udGV4dHVyZVdpZHRoKCksIDIgKiB0aGlzLmV4aXRGdWxsc2NyZWVuSW1nXy50ZXh0dXJlSGVpZ2h0KCkpCiAgfSwgdGhpcykpOwogIHRoaXMuZXhpdEZ1bGxzY3JlZW5JbWdfLnNldFZpc2libGUoITEpOwogIHRoaXMucm9sbG92ZXJGdWxsc2NyZWVuSW1nXyA9IHRoaXMuaW1hZ2VPdmVybGF5Xy5jcmVhdGVJbWFnZSgzLCAzLCAiaW1hZ2VzL2Z1bGxzY3JlZW5fcm9sbG92ZXIucG5nIik7CiAgdGhpcy5yb2xsb3ZlckZ1bGxzY3JlZW5JbWdfLnNldFZpc2libGUoITEpCn07CnRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5IYW5kbGVyLnByb3RvdHlwZS5zZXRJbWFnZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRnVsbHNjcmVlbkhhbmRsZXIkJHNldEltYWdlXyQoaW1hZ2UpIHsKICBpZih0aGlzLmZ1bGxzY3JlZW5JbWdfICE9IGltYWdlKSB7CiAgICB2YXIgcHJldmlvdXMgPSB0aGlzLmZ1bGxzY3JlZW5JbWdfOwogICAgdGhpcy5mdWxsc2NyZWVuSW1nXyA9IGltYWdlOwogICAgcHJldmlvdXMuaXNWaXNpYmxlKCkgJiYgKHRoaXMuZnVsbHNjcmVlbkltZ18uc2V0VmlzaWJsZSghMCksIHByZXZpb3VzLnNldFZpc2libGUoITEpKQogIH0KfTsKdGFsay5tZWRpYS5jM2QuRnVsbHNjcmVlbkhhbmRsZXIucHJvdG90eXBlLm9uUmVzaXplXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGdWxsc2NyZWVuSGFuZGxlciQkb25SZXNpemVfJChlKSB7CiAgdGhpcy5mdWxsc2NyZWVuXyA9IGUuZnVsbHNjcmVlbjsKICBpZih0aGlzLmVudGVyRnVsbHNjcmVlbkltZ18pIHsKICAgIGlmKHRoaXMuZnVsbHNjcmVlbl8pIHsKICAgICAgZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5mdWxsc2NyZWVuTXNnXy53aWR0aCgpKSAmJiAodGhpcy5mdWxsc2NyZWVuTXNnXy5tb3ZlVG8oKHRoaXMubzNkQnVuZGxlXy53aWR0aCAtIHRoaXMuZnVsbHNjcmVlbk1zZ18ud2lkdGgoKSkgLyAyLCB0aGlzLmZ1bGxzY3JlZW5Nc2dfLmhlaWdodCgpIC8gMiksIHRoaXMuZnVsbHNjcmVlbk1zZ0ZhZGVyXy5zaG93KDRFMywgMSkpLCB0aGlzLnNldEltYWdlXyh0aGlzLmV4aXRGdWxsc2NyZWVuSW1nXyksIHRoaXMuY2xpY2tMaXN0ZW5lclRpbWVySWRfIHx8ICh0aGlzLmNsaWNrTGlzdGVuZXJUaW1lcklkXyA9IGdvb2cuVGltZXIuY2FsbE9uY2UodGhpcy5vbkNsaWNrTGlzdGVuZXJUaW1lckVsYXBzZWRfLCB0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuSGFuZGxlci5DTElDS19MSVNURU5FUl9ERUxBWV9NU18sIHRoaXMpKQogICAgfWVsc2UgewogICAgICB0aGlzLmZ1bGxzY3JlZW5Nc2dGYWRlcl8uaGlkZSgpOwogICAgICB0aGlzLnNldEltYWdlXyh0aGlzLmVudGVyRnVsbHNjcmVlbkltZ18pOwogICAgICB0aGlzLmNsaWNrTGlzdGVuZXJUaW1lcklkXyAmJiAoZ29vZy5UaW1lci5jbGVhcih0aGlzLmNsaWNrTGlzdGVuZXJUaW1lcklkXyksIHRoaXMuY2xpY2tMaXN0ZW5lclRpbWVySWRfID0gbnVsbCk7CiAgICAgIHZhciBjM2QgPSB0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LmdldFBsdWdpbigpOwogICAgICB0YWxrLm1lZGlhLmMzZC5yZW1vdmVFdmVudENhbGxiYWNrKGMzZCwgImNsaWNrIiwgdGhpcy5ib3VuZE9uQ2xpY2tfKQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5jM2QuRnVsbHNjcmVlbkhhbmRsZXIucHJvdG90eXBlLm9uQ2xpY2tMaXN0ZW5lclRpbWVyRWxhcHNlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRnVsbHNjcmVlbkhhbmRsZXIkJG9uQ2xpY2tMaXN0ZW5lclRpbWVyRWxhcHNlZF8kKCkgewogIHZhciBjM2QgPSB0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LmdldFBsdWdpbigpOwogIHRoaXMuY2xpY2tMaXN0ZW5lclRpbWVySWRfID0gbnVsbDsKICB0YWxrLm1lZGlhLmMzZC5hZGRFdmVudENhbGxiYWNrKGMzZCwgImNsaWNrIiwgdGhpcy5ib3VuZE9uQ2xpY2tfKQp9Owp0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuSGFuZGxlci5wcm90b3R5cGUub25Nb3VzZU1vdmVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZ1bGxzY3JlZW5IYW5kbGVyJCRvbk1vdXNlTW92ZV8kKGUpIHsKICB0aGlzLmlzT3ZlckNvbnRyb2woZS54LCBlLnkpID8gKHRoaXMuZnVsbHNjcmVlbkltZ18gPT0gdGhpcy5lbnRlckZ1bGxzY3JlZW5JbWdfICYmIHRoaXMuc2V0SW1hZ2VfKHRoaXMucm9sbG92ZXJGdWxsc2NyZWVuSW1nXyksIHRoaXMuY3Vyc29yUmVmXyB8fCAodGhpcy5jdXJzb3JSZWZfID0gdGhpcy5vM2RCdW5kbGVfLmN1cnNvck1hbmFnZXIuc2V0Q3Vyc29yKCJQT0lOVEVSIiwgMCkpKSA6ICh0aGlzLmZ1bGxzY3JlZW5JbWdfID09IHRoaXMucm9sbG92ZXJGdWxsc2NyZWVuSW1nXyAmJiB0aGlzLnNldEltYWdlXyh0aGlzLmVudGVyRnVsbHNjcmVlbkltZ18pLCB0aGlzLmN1cnNvclJlZl8gJiYgKHRoaXMubzNkQnVuZGxlXy5jdXJzb3JNYW5hZ2VyLnVuc2V0Q3Vyc29yKHRoaXMuY3Vyc29yUmVmXyksIHRoaXMuY3Vyc29yUmVmXyA9IG51bGwpKQp9Owp0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuSGFuZGxlci5wcm90b3R5cGUub25DbGlja18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRnVsbHNjcmVlbkhhbmRsZXIkJG9uQ2xpY2tfJChlKSB7CiAgaWYodGhpcy5mdWxsc2NyZWVuXyAmJiB0aGlzLmlzT3ZlckNvbnRyb2woZS54LCBlLnkpKSB7CiAgICB2YXIgYzNkID0gdGhpcy5vM2RCdW5kbGVfLmMzZE9iamVjdC5nZXRQbHVnaW4oKTsKICAgIGMzZC5jbGllbnQuY2FuY2VsRnVsbHNjcmVlbkRpc3BsYXkoKQogIH0KfTsKdGFsay5tZWRpYS5jM2QuRnVsbHNjcmVlbkhhbmRsZXIucHJvdG90eXBlLnNob3dDb250cm9sID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZ1bGxzY3JlZW5IYW5kbGVyJCRzaG93Q29udHJvbCQoKSB7CiAgdGhpcy5jYW5jZWxIaWRlVHdlZW5fKCk7CiAgdGhpcy5mdWxsc2NyZWVuSW1nXyAmJiAodGhpcy5mdWxsc2NyZWVuSW1nXy5zZXRWaXNpYmxlKCEwKSwgdGhpcy5mdWxsc2NyZWVuSW1nXy5zZXRBbHBoYSgxKSk7CiAgdGhpcy5ub0N1cnNvclJlZl8gJiYgKHRoaXMubzNkQnVuZGxlXy5jdXJzb3JNYW5hZ2VyLnVuc2V0Q3Vyc29yKHRoaXMubm9DdXJzb3JSZWZfKSwgdGhpcy5ub0N1cnNvclJlZl8gPSBudWxsKQp9Owp0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuSGFuZGxlci5wcm90b3R5cGUuaGlkZUNvbnRyb2wgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRnVsbHNjcmVlbkhhbmRsZXIkJGhpZGVDb250cm9sJCgpIHsKICB0aGlzLmZ1bGxzY3JlZW5JbWdfICYmIHRoaXMuZnVsbHNjcmVlbkltZ18uaXNWaXNpYmxlKCkgJiYgKHRoaXMuaW1nSGlkZXJfID0gbmV3IHRhbGsubWVkaWEuYzNkLkFscGhhVHdlZW4odGhpcy5mdWxsc2NyZWVuSW1nXy5nZXRTY2VuZU9iamVjdCgpLCB0aGlzLmZ1bGxzY3JlZW5JbWdfLmdldEFscGhhKCksIDAsIDAuNCwgdGFsay5tZWRpYS5jM2QuZWFzaW5nLlJFR1VMQVJfRUFTRV9JTiwgZ29vZy5iaW5kKHRoaXMuZmluaXNoSGlkZUNvbnRyb2xfLCB0aGlzKSksIHRoaXMubzNkQnVuZGxlXy5jM2RFbmdpbmUucmVnaXN0ZXJSZW5kZXJDYWxsYmFjayh0aGlzLmltZ0hpZGVyXykpCn07CnRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5IYW5kbGVyLnByb3RvdHlwZS5jYW5jZWxIaWRlVHdlZW5fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZ1bGxzY3JlZW5IYW5kbGVyJCRjYW5jZWxIaWRlVHdlZW5fJCgpIHsKICB0aGlzLmltZ0hpZGVyXyAmJiAodGhpcy5vM2RCdW5kbGVfLmMzZEVuZ2luZS51bnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sodGhpcy5pbWdIaWRlcl8pLCB0aGlzLmltZ0hpZGVyXyA9IG51bGwpCn07CnRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5IYW5kbGVyLnByb3RvdHlwZS5maW5pc2hIaWRlQ29udHJvbF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRnVsbHNjcmVlbkhhbmRsZXIkJGZpbmlzaEhpZGVDb250cm9sXyQoKSB7CiAgdGhpcy5jYW5jZWxIaWRlVHdlZW5fKCk7CiAgdGhpcy5mdWxsc2NyZWVuSW1nXy5zZXRWaXNpYmxlKCExKTsKICB0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LmlzU2NyaXB0YWJsZSgpICYmIHRoaXMuZnVsbHNjcmVlbl8gJiYgIXRoaXMubm9DdXJzb3JSZWZfICYmICh0aGlzLm5vQ3Vyc29yUmVmXyA9IHRoaXMubzNkQnVuZGxlXy5jdXJzb3JNYW5hZ2VyLnNldEN1cnNvcigiTk9ORSIsIC0xKSkKfTsKdGFsay5tZWRpYS5jM2QuRnVsbHNjcmVlbkhhbmRsZXIucHJvdG90eXBlLmlzT3ZlckNvbnRyb2wgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRnVsbHNjcmVlbkhhbmRsZXIkJGlzT3ZlckNvbnRyb2wkKHgsIHkpIHsKICByZXR1cm4gbnVsbCAhPSB0aGlzLmZ1bGxzY3JlZW5JbWdfICYmIHRoaXMuZnVsbHNjcmVlbkltZ18uaXNWaXNpYmxlKCkgJiYgdGhpcy5mdWxsc2NyZWVuSW1nXy5oaXRUZXN0KHgsIHkpCn07CnRhbGsubWVkaWEuYzNkLkZ1bGxzY3JlZW5IYW5kbGVyLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRnVsbHNjcmVlbkhhbmRsZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgaWYodGhpcy5vM2RCdW5kbGVfLmMzZE9iamVjdC5pc1NjcmlwdGFibGUoKSkgewogICAgdmFyIGMzZCA9IHRoaXMubzNkQnVuZGxlXy5jM2RPYmplY3QuZ2V0UGx1Z2luKCk7CiAgICB0YWxrLm1lZGlhLmMzZC5yZW1vdmVFdmVudENhbGxiYWNrKGMzZCwgInJlc2l6ZSIsIHRoaXMuYm91bmRPblJlc2l6ZV8pOwogICAgdGFsay5tZWRpYS5jM2QucmVtb3ZlRXZlbnRDYWxsYmFjayhjM2QsICJtb3VzZW1vdmUiLCB0aGlzLmJvdW5kT25Nb3VzZU1vdmVfKTsKICAgIHRhbGsubWVkaWEuYzNkLnJlbW92ZUV2ZW50Q2FsbGJhY2soYzNkLCAiY2xpY2siLCB0aGlzLmJvdW5kT25DbGlja18pOwogICAgYzNkLmNsaWVudCAmJiB0aGlzLmZ1bGxzY3JlZW5fICYmIGMzZC5jbGllbnQuY2FuY2VsRnVsbHNjcmVlbkRpc3BsYXkoKTsKICAgIGMzZC5jbGllbnQgJiYgYzNkLmNsaWVudC5jbGVhckZ1bGxzY3JlZW5DbGlja1JlZ2lvbigpCiAgfQogIHRoaXMuY2xpY2tMaXN0ZW5lclRpbWVySWRfICYmIChnb29nLlRpbWVyLmNsZWFyKHRoaXMuY2xpY2tMaXN0ZW5lclRpbWVySWRfKSwgdGhpcy5jbGlja0xpc3RlbmVyVGltZXJJZF8gPSBudWxsKTsKICB0aGlzLmVudGVyRnVsbHNjcmVlbkltZ18uZGlzcG9zZSgpOwogIHRoaXMuZW50ZXJGdWxsc2NyZWVuSW1nXyA9IG51bGw7CiAgdGhpcy5leGl0RnVsbHNjcmVlbkltZ18uZGlzcG9zZSgpOwogIHRoaXMuZXhpdEZ1bGxzY3JlZW5JbWdfID0gbnVsbDsKICB0aGlzLnJvbGxvdmVyRnVsbHNjcmVlbkltZ18uZGlzcG9zZSgpOwogIHRoaXMuZnVsbHNjcmVlbkltZ18gPSB0aGlzLnJvbGxvdmVyRnVsbHNjcmVlbkltZ18gPSBudWxsOwogIHRoaXMuZnVsbHNjcmVlbk1zZ18uZGlzcG9zZSgpOwogIHRoaXMuZnVsbHNjcmVlbk1zZ18gPSBudWxsOwogIHRoaXMuZnVsbHNjcmVlbk1zZ0ZhZGVyXyAmJiAodGhpcy5mdWxsc2NyZWVuTXNnRmFkZXJfLmRpc3Bvc2UoKSwgdGhpcy5mdWxsc2NyZWVuTXNnRmFkZXJfID0gbnVsbCk7CiAgdGhpcy5vM2RCdW5kbGVfID0gdGhpcy5pbWFnZU92ZXJsYXlfID0gbnVsbDsKICB0YWxrLm1lZGlhLmMzZC5GdWxsc2NyZWVuSGFuZGxlci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLmMzZC5Ob3RpZmljYXRpb25SZW5kZXJlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCROb3RpZmljYXRpb25SZW5kZXJlciQocGFjaywgYzNkLCB3aWR0aCwgaGVpZ2h0KSB7CiAgZ29vZy5EaXNwb3NhYmxlLmNhbGwodGhpcyk7CiAgdGhpcy5wYWNrXyA9IHBhY2s7CiAgdGhpcy53aWR0aF8gPSB3aWR0aDsKICB0aGlzLmhlaWdodF8gPSBoZWlnaHQ7CiAgdGhpcy5jM2RfID0gYzNkOwogIHRoaXMuY2FudmFzXyA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS5jcmVhdGVPYmplY3QodGhpcy5wYWNrXywgIkNhbnZhcyIpOwogIHRoaXMuY2FudmFzXy5pbnZva2UoInNldFNpemUiLCB3aWR0aCwgaGVpZ2h0KTsKICB0aGlzLmNhbnZhc1BhaW50XyA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS5jcmVhdGVPYmplY3QodGhpcy5wYWNrXywgIkNhbnZhc1BhaW50Iik7CiAgdGhpcy5jYW52YXNQYWludF8uaW52b2tlKCJzZXRPdXRsaW5lIiwgMSwgWzAsIDAsIDAsIDFdKTsKICB0aGlzLmNhbnZhc1BhaW50Xy5zZXQoInRleHRBbGlnbiIsIGMzZC5vM2QuQ2FudmFzUGFpbnQuTEVGVCk7CiAgdGhpcy5jYW52YXNQYWludF8uc2V0KCJ0ZXh0U2l6ZSIsIDEyKTsKICB0aGlzLmNhbnZhc1BhaW50Xy5zZXQoInRleHRUeXBlZmFjZSIsICJBcmlhbCIpOwogIHRoaXMuY2FudmFzUGFpbnRfLnNldCgiY29sb3IiLCBbMSwgMSwgMSwgMV0pCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuTm90aWZpY2F0aW9uUmVuZGVyZXIsIGdvb2cuRGlzcG9zYWJsZSk7CnRhbGsubWVkaWEuYzNkLk5vdGlmaWNhdGlvblJlbmRlcmVyLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLmMzZC5Ob3RpZmljYXRpb25SZW5kZXJlciIpOwp0YWxrLm1lZGlhLmMzZC5Ob3RpZmljYXRpb25SZW5kZXJlci5wcm90b3R5cGUucmVuZGVyVGV4dHVyZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCROb3RpZmljYXRpb25SZW5kZXJlciQkcmVuZGVyVGV4dHVyZSQoaW1nVXJsLCB0ZXh0LCBvblJlc3VsdCkgewogIHZhciByZXF1ZXN0ID0gdGhpcy5wYWNrXy5jcmVhdGVGaWxlUmVxdWVzdCgiVEVYVFVSRSIpOwogIHJlcXVlc3Qub3BlbigiR0VUIiwgaW1nVXJsLCAhMCk7CiAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBnb29nLmJpbmQoZnVuY3Rpb24oKSB7CiAgICBpZihyZXF1ZXN0LmRvbmUpIHsKICAgICAgaWYocmVxdWVzdC5zdWNjZXNzKSB7CiAgICAgICAgdGhpcy5jYW52YXNfLmludm9rZSgic2F2ZU1hdHJpeCIpOwogICAgICAgIHRoaXMuY2xlYXJDYW52YXNfKCk7CiAgICAgICAgdmFyIGhlaWdodENhbGMgPSAodGhpcy5oZWlnaHRfIC0gcmVxdWVzdC50ZXh0dXJlLmhlaWdodCkgLyAyLCBoZWlnaHRDYWxjID0gaGVpZ2h0Q2FsYyArIHJlcXVlc3QudGV4dHVyZS5oZWlnaHQ7CiAgICAgICAgdGhpcy5jYW52YXNfLmludm9rZSgiZHJhd0JpdG1hcCIsIHJlcXVlc3QudGV4dHVyZSwgMTAsIGhlaWdodENhbGMpOwogICAgICAgIHRoaXMuY2FudmFzXy5pbnZva2UoImRyYXdUZXh0IiwgdGV4dCwgcmVxdWVzdC50ZXh0dXJlLndpZHRoICsgMzAsIHRoaXMuaGVpZ2h0XyAvIDIsIHRoaXMuY2FudmFzUGFpbnRfLmdldE9iamVjdCgpKTsKICAgICAgICB0aGlzLmNhbnZhc18uaW52b2tlKCJyZXN0b3JlTWF0cml4Iik7CiAgICAgICAgdmFyIHRleHR1cmUgPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUud3JhcE9iamVjdCh0aGlzLnBhY2tfLCB0aGlzLnBhY2tfLmNyZWF0ZVRleHR1cmUyRCh0aGlzLndpZHRoXywgdGhpcy5oZWlnaHRfLCB0aGlzLmMzZF8ubzNkLlRleHR1cmUuQVJHQjgsIDEsICExKSk7CiAgICAgICAgdGhpcy5jYW52YXNfLmludm9rZSgiY29weVRvVGV4dHVyZSIsIHRleHR1cmUuZ2V0T2JqZWN0KCkpOwogICAgICAgIG9uUmVzdWx0KHRleHR1cmUpCiAgICAgIH1lbHNlIHsKICAgICAgICB2YXIgbXNnID0gcmVxdWVzdC5lcnJvciB8fCAiVW5rbm93biBlcnJvciI7CiAgICAgICAgdGhpcy5sb2dnZXJfLnNldmVyZSgnVGV4dHVyZSBmYWlsZWQgdG8gbG9hZCwgdXJsPSInICsgaW1nVXJsICsgJyIsIG1zZz0iJyArIG1zZyArICciJyk7CiAgICAgICAgb25SZXN1bHQobnVsbCkKICAgICAgfQogICAgICB0aGlzLnBhY2tfLnJlbW92ZU9iamVjdChyZXF1ZXN0KQogICAgfQogIH0sIHRoaXMpOwogIHJlcXVlc3Quc2VuZCgpCn07CnRhbGsubWVkaWEuYzNkLk5vdGlmaWNhdGlvblJlbmRlcmVyLnByb3RvdHlwZS5jbGVhckNhbnZhc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTm90aWZpY2F0aW9uUmVuZGVyZXIkJGNsZWFyQ2FudmFzXyQoKSB7CiAgdGhpcy5jYW52YXNfLmludm9rZSgiY2xlYXIiLCBbMCwgMCwgMCwgMC41XSkKfTsKdGFsay5tZWRpYS5jM2QuTm90aWZpY2F0aW9uUmVuZGVyZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCROb3RpZmljYXRpb25SZW5kZXJlciQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0aGlzLmNhbnZhc1BhaW50XyAmJiAodGhpcy5jYW52YXNQYWludF8uZGlzcG9zZSgpLCB0aGlzLmNhbnZhc1BhaW50XyA9IG51bGwpOwogIHRoaXMuY2FudmFzXyAmJiAodGhpcy5jYW52YXNfLmRpc3Bvc2UoKSwgdGhpcy5jYW52YXNfID0gbnVsbCk7CiAgdGFsay5tZWRpYS5jM2QuTm90aWZpY2F0aW9uUmVuZGVyZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJFNpbXBsZVBvb2wkKGluaXRpYWxDb3VudCwgbWF4Q291bnQpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKTsKICB0aGlzLm1heENvdW50XyA9IG1heENvdW50OwogIHRoaXMuZnJlZVF1ZXVlXyA9IFtdOwogIHRoaXMuY3JlYXRlSW5pdGlhbF8oaW5pdGlhbENvdW50KQp9Owpnb29nLmluaGVyaXRzKGdvb2cuc3RydWN0cy5TaW1wbGVQb29sLCBnb29nLkRpc3Bvc2FibGUpOwpnb29nLnN0cnVjdHMuU2ltcGxlUG9vbC5wcm90b3R5cGUuY3JlYXRlT2JqZWN0Rm5fID0gbnVsbDsKZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wucHJvdG90eXBlLmRpc3Bvc2VPYmplY3RGbl8gPSBudWxsOwpnb29nLnN0cnVjdHMuU2ltcGxlUG9vbC5wcm90b3R5cGUuZ2V0T2JqZWN0ID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRTaW1wbGVQb29sJCRnZXRPYmplY3QkKCkgewogIHJldHVybiB0aGlzLmZyZWVRdWV1ZV8ubGVuZ3RoID8gdGhpcy5mcmVlUXVldWVfLnBvcCgpIDogdGhpcy5jcmVhdGVPYmplY3QoKQp9Owpnb29nLnN0cnVjdHMuU2ltcGxlUG9vbC5wcm90b3R5cGUucmVsZWFzZU9iamVjdCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2ltcGxlUG9vbCQkcmVsZWFzZU9iamVjdCQob2JqKSB7CiAgdGhpcy5mcmVlUXVldWVfLmxlbmd0aCA8IHRoaXMubWF4Q291bnRfID8gdGhpcy5mcmVlUXVldWVfLnB1c2gob2JqKSA6IHRoaXMuZGlzcG9zZU9iamVjdChvYmopCn07Cmdvb2cuc3RydWN0cy5TaW1wbGVQb29sLnByb3RvdHlwZS5jcmVhdGVJbml0aWFsXyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2ltcGxlUG9vbCQkY3JlYXRlSW5pdGlhbF8kKGluaXRpYWxDb3VudCkgewogIGlmKGluaXRpYWxDb3VudCA+IHRoaXMubWF4Q291bnRfKSB7CiAgICB0aHJvdyBFcnJvcigiW2dvb2cuc3RydWN0cy5TaW1wbGVQb29sXSBJbml0aWFsIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbWF4Iik7CiAgfQogIGZvcih2YXIgaSA9IDA7aSA8IGluaXRpYWxDb3VudDtpKyspIHsKICAgIHRoaXMuZnJlZVF1ZXVlXy5wdXNoKHRoaXMuY3JlYXRlT2JqZWN0KCkpCiAgfQp9Owpnb29nLnN0cnVjdHMuU2ltcGxlUG9vbC5wcm90b3R5cGUuY3JlYXRlT2JqZWN0ID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRTaW1wbGVQb29sJCRjcmVhdGVPYmplY3QkKCkgewogIHJldHVybiB0aGlzLmNyZWF0ZU9iamVjdEZuXyA/IHRoaXMuY3JlYXRlT2JqZWN0Rm5fKCkgOiB7fQp9Owpnb29nLnN0cnVjdHMuU2ltcGxlUG9vbC5wcm90b3R5cGUuZGlzcG9zZU9iamVjdCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2ltcGxlUG9vbCQkZGlzcG9zZU9iamVjdCQob2JqKSB7CiAgaWYodGhpcy5kaXNwb3NlT2JqZWN0Rm5fKSB7CiAgICB0aGlzLmRpc3Bvc2VPYmplY3RGbl8ob2JqKQogIH1lbHNlIHsKICAgIGlmKGdvb2cuaXNPYmplY3Qob2JqKSkgewogICAgICBpZihnb29nLmlzRnVuY3Rpb24ob2JqLmRpc3Bvc2UpKSB7CiAgICAgICAgb2JqLmRpc3Bvc2UoKQogICAgICB9ZWxzZSB7CiAgICAgICAgZm9yKHZhciBpIGluIG9iaikgewogICAgICAgICAgZGVsZXRlIG9ialtpXQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkU2ltcGxlUG9vbCQkZGlzcG9zZUludGVybmFsJCgpIHsKICBnb29nLnN0cnVjdHMuU2ltcGxlUG9vbC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICBmb3IodmFyIGZyZWVRdWV1ZSA9IHRoaXMuZnJlZVF1ZXVlXztmcmVlUXVldWUubGVuZ3RoOykgewogICAgdGhpcy5kaXNwb3NlT2JqZWN0KGZyZWVRdWV1ZS5wb3AoKSkKICB9CiAgZGVsZXRlIHRoaXMuZnJlZVF1ZXVlXwp9Owpnb29nLmRlYnVnLlRyYWNlXyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFRyYWNlXyQoKSB7CiAgdGhpcy5ldmVudHNfID0gW107CiAgdGhpcy5vdXRzdGFuZGluZ0V2ZW50c18gPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcDsKICB0aGlzLnRyYWNlck92ZXJoZWFkQ29tbWVudF8gPSB0aGlzLnRyYWNlck92ZXJoZWFkRW5kXyA9IHRoaXMudHJhY2VyT3ZlcmhlYWRTdGFydF8gPSB0aGlzLnN0YXJ0VGltZV8gPSAwOwogIHRoaXMuc3RhdHNfID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdGhpcy5jb21tZW50Q291bnRfID0gdGhpcy50cmFjZXJDb3VudF8gPSAwOwogIHRoaXMubmV4dElkXyA9IDE7CiAgdGhpcy5ldmVudFBvb2xfID0gbmV3IGdvb2cuc3RydWN0cy5TaW1wbGVQb29sKDAsIDRFMyk7CiAgdGhpcy5ldmVudFBvb2xfLmNyZWF0ZU9iamVjdCA9IGZ1bmN0aW9uICR0aGlzJGV2ZW50UG9vbF8kY3JlYXRlT2JqZWN0JCgpIHsKICAgIHJldHVybiBuZXcgZ29vZy5kZWJ1Zy5UcmFjZV8uRXZlbnRfCiAgfTsKICB0aGlzLnN0YXRQb29sXyA9IG5ldyBnb29nLnN0cnVjdHMuU2ltcGxlUG9vbCgwLCA1MCk7CiAgdGhpcy5zdGF0UG9vbF8uY3JlYXRlT2JqZWN0ID0gZnVuY3Rpb24gJHRoaXMkc3RhdFBvb2xfJGNyZWF0ZU9iamVjdCQoKSB7CiAgICByZXR1cm4gbmV3IGdvb2cuZGVidWcuVHJhY2VfLlN0YXRfCiAgfTsKICB2YXIgdGhhdCA9IHRoaXM7CiAgdGhpcy5pZFBvb2xfID0gbmV3IGdvb2cuc3RydWN0cy5TaW1wbGVQb29sKDAsIDJFMyk7CiAgdGhpcy5pZFBvb2xfLmNyZWF0ZU9iamVjdCA9IGZ1bmN0aW9uICR0aGlzJGlkUG9vbF8kY3JlYXRlT2JqZWN0JCgpIHsKICAgIHJldHVybiIiICsgdGhhdC5uZXh0SWRfKysKICB9OwogIHRoaXMuaWRQb29sXy5kaXNwb3NlT2JqZWN0ID0gZnVuY3Rpb24gJHRoaXMkaWRQb29sXyRkaXNwb3NlT2JqZWN0JCgpIHsKICB9OwogIHRoaXMuZGVmYXVsdFRocmVzaG9sZF8gPSAzCn07Cmdvb2cuZGVidWcuVHJhY2VfLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJnb29nLmRlYnVnLlRyYWNlIik7Cmdvb2cuZGVidWcuVHJhY2VfLnByb3RvdHlwZS5NQVhfVFJBQ0VfU0laRSA9IDFFMzsKZ29vZy5kZWJ1Zy5UcmFjZV8uRXZlbnRUeXBlID0ge1NUQVJUOjAsIFNUT1A6MSwgQ09NTUVOVDoyfTsKZ29vZy5kZWJ1Zy5UcmFjZV8uU3RhdF8gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRUcmFjZV8kU3RhdF8kKCkgewogIHRoaXMudmFyQWxsb2MgPSB0aGlzLnRpbWUgPSB0aGlzLmNvdW50ID0gMAp9Owpnb29nLmRlYnVnLlRyYWNlXy5TdGF0Xy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRUcmFjZV8kU3RhdF8kJHRvU3RyaW5nJCgpIHsKICB2YXIgc2IgPSBbXTsKICBzYi5wdXNoKHRoaXMudHlwZSwgIiAiLCB0aGlzLmNvdW50LCAiICgiLCBNYXRoLnJvdW5kKDEwICogdGhpcy50aW1lKSAvIDEwLCAiIG1zKSIpOwogIHRoaXMudmFyQWxsb2MgJiYgc2IucHVzaCgiIFtWYXJBbGxvYyA9ICIsIHRoaXMudmFyQWxsb2MsICJdIik7CiAgcmV0dXJuIHNiLmpvaW4oIiIpCn07Cmdvb2cuZGVidWcuVHJhY2VfLkV2ZW50XyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFRyYWNlXyRFdmVudF8kKCkgewp9Owpnb29nLmRlYnVnLlRyYWNlXy5FdmVudF8ucHJvdG90eXBlLnRvVHJhY2VTdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRUcmFjZV8kRXZlbnRfJCR0b1RyYWNlU3RyaW5nJChzdGFydFRpbWUsIHByZXZUaW1lLCBpbmRlbnQpIHsKICB2YXIgc2IgPSBbXTsKICAtMSA9PSBwcmV2VGltZSA/IHNiLnB1c2goIiAgICAiKSA6IHNiLnB1c2goZ29vZy5kZWJ1Zy5UcmFjZV8ubG9uZ1RvUGFkZGVkU3RyaW5nXyh0aGlzLmV2ZW50VGltZSAtIHByZXZUaW1lKSk7CiAgc2IucHVzaCgiICIsIGdvb2cuZGVidWcuVHJhY2VfLmZvcm1hdFRpbWVfKHRoaXMuZXZlbnRUaW1lIC0gc3RhcnRUaW1lKSk7CiAgaWYodGhpcy5ldmVudFR5cGUgPT0gZ29vZy5kZWJ1Zy5UcmFjZV8uRXZlbnRUeXBlLlNUQVJUKSB7CiAgICBzYi5wdXNoKCIgU3RhcnQgICAgICAgICIpCiAgfWVsc2UgewogICAgaWYodGhpcy5ldmVudFR5cGUgPT0gZ29vZy5kZWJ1Zy5UcmFjZV8uRXZlbnRUeXBlLlNUT1ApIHsKICAgICAgc2IucHVzaCgiIERvbmUgIik7CiAgICAgIHZhciBkZWx0YSA9IHRoaXMuc3RvcFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKICAgICAgc2IucHVzaChnb29nLmRlYnVnLlRyYWNlXy5sb25nVG9QYWRkZWRTdHJpbmdfKGRlbHRhKSwgIiBtcyAiKQogICAgfWVsc2UgewogICAgICBzYi5wdXNoKCIgQ29tbWVudCAgICAgICIpCiAgICB9CiAgfQogIHNiLnB1c2goaW5kZW50LCB0aGlzKTsKICAwIDwgdGhpcy50b3RhbFZhckFsbG9jICYmIHNiLnB1c2goIltWYXJBbGxvYyAiLCB0aGlzLnRvdGFsVmFyQWxsb2MsICJdICIpOwogIHJldHVybiBzYi5qb2luKCIiKQp9Owpnb29nLmRlYnVnLlRyYWNlXy5FdmVudF8ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckZGVidWckVHJhY2VfJEV2ZW50XyQkdG9TdHJpbmckKCkgewogIHJldHVybiBudWxsID09IHRoaXMudHlwZSA/IHRoaXMuY29tbWVudCA6ICJbIiArIHRoaXMudHlwZSArICJdICIgKyB0aGlzLmNvbW1lbnQKfTsKZ29vZy5kZWJ1Zy5UcmFjZV8ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gJGdvb2ckZGVidWckVHJhY2VfJCRyZXNldCQoZGVmYXVsdFRocmVzaG9sZCkgewogIHRoaXMuZGVmYXVsdFRocmVzaG9sZF8gPSBkZWZhdWx0VGhyZXNob2xkOwogIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuZXZlbnRzXy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgaWQgPSB0aGlzLmV2ZW50UG9vbF8uaWQ7CiAgICBpZCAmJiB0aGlzLmlkUG9vbF8ucmVsZWFzZU9iamVjdChpZCk7CiAgICB0aGlzLmV2ZW50UG9vbF8ucmVsZWFzZU9iamVjdCh0aGlzLmV2ZW50c19baV0pCiAgfQogIHRoaXMuZXZlbnRzXy5sZW5ndGggPSAwOwogIHRoaXMub3V0c3RhbmRpbmdFdmVudHNfLmNsZWFyKCk7CiAgdGhpcy5zdGFydFRpbWVfID0gZ29vZy5kZWJ1Zy5UcmFjZV8ubm93KCk7CiAgdGhpcy5jb21tZW50Q291bnRfID0gdGhpcy50cmFjZXJDb3VudF8gPSB0aGlzLnRyYWNlck92ZXJoZWFkQ29tbWVudF8gPSB0aGlzLnRyYWNlck92ZXJoZWFkRW5kXyA9IHRoaXMudHJhY2VyT3ZlcmhlYWRTdGFydF8gPSAwOwogIGZvcih2YXIga2V5cyA9IHRoaXMuc3RhdHNfLmdldEtleXMoKSwgaSA9IDA7aSA8IGtleXMubGVuZ3RoO2krKykgewogICAgdmFyIGtleSA9IGtleXNbaV0sIHN0YXQgPSB0aGlzLnN0YXRzXy5nZXQoa2V5KTsKICAgIHN0YXQuY291bnQgPSAwOwogICAgc3RhdC50aW1lID0gMDsKICAgIHN0YXQudmFyQWxsb2MgPSAwOwogICAgdGhpcy5zdGF0UG9vbF8ucmVsZWFzZU9iamVjdChzdGF0KQogIH0KICB0aGlzLnN0YXRzXy5jbGVhcigpCn07Cmdvb2cuZGVidWcuVHJhY2VfLnByb3RvdHlwZS5zdGFydFRyYWNlciA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFRyYWNlXyQkc3RhcnRUcmFjZXIkKGNvbW1lbnQsIG9wdF90eXBlKSB7CiAgdmFyIHRyYWNlclN0YXJ0VGltZSA9IGdvb2cuZGVidWcuVHJhY2VfLm5vdygpLCB2YXJBbGxvYyA9IHRoaXMuZ2V0VG90YWxWYXJBbGxvYygpLCBvdXRzdGFuZGluZ0V2ZW50Q291bnQgPSB0aGlzLm91dHN0YW5kaW5nRXZlbnRzXy5nZXRDb3VudCgpOwogIGlmKHRoaXMuZXZlbnRzXy5sZW5ndGggKyBvdXRzdGFuZGluZ0V2ZW50Q291bnQgPiB0aGlzLk1BWF9UUkFDRV9TSVpFKSB7CiAgICB0aGlzLmxvZ2dlcl8ud2FybmluZygiR2lhbnQgdGhyZWFkIHRyYWNlLiBDbGVhcmluZyB0byBhdm9pZCBtZW1vcnkgbGVhay4iKTsKICAgIGlmKHRoaXMuZXZlbnRzXy5sZW5ndGggPiB0aGlzLk1BWF9UUkFDRV9TSVpFIC8gMikgewogICAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLmV2ZW50c18ubGVuZ3RoO2krKykgewogICAgICAgIHZhciBldmVudCA9IHRoaXMuZXZlbnRzX1tpXTsKICAgICAgICBldmVudC5pZCAmJiB0aGlzLmlkUG9vbF8ucmVsZWFzZU9iamVjdChldmVudC5pZCk7CiAgICAgICAgdGhpcy5ldmVudFBvb2xfLnJlbGVhc2VPYmplY3QoZXZlbnQpCiAgICAgIH0KICAgICAgdGhpcy5ldmVudHNfLmxlbmd0aCA9IDAKICAgIH0KICAgIG91dHN0YW5kaW5nRXZlbnRDb3VudCA+IHRoaXMuTUFYX1RSQUNFX1NJWkUgLyAyICYmIHRoaXMub3V0c3RhbmRpbmdFdmVudHNfLmNsZWFyKCkKICB9CiAgZ29vZy5kZWJ1Zy5Mb2dnZXIubG9nVG9Qcm9maWxlcnMoIlN0YXJ0IDogIiArIGNvbW1lbnQpOwogIGV2ZW50ID0gdGhpcy5ldmVudFBvb2xfLmdldE9iamVjdCgpOwogIGV2ZW50LnRvdGFsVmFyQWxsb2MgPSB2YXJBbGxvYzsKICBldmVudC5ldmVudFR5cGUgPSBnb29nLmRlYnVnLlRyYWNlXy5FdmVudFR5cGUuU1RBUlQ7CiAgZXZlbnQuaWQgPSBOdW1iZXIodGhpcy5pZFBvb2xfLmdldE9iamVjdCgpKTsKICBldmVudC5jb21tZW50ID0gY29tbWVudDsKICBldmVudC50eXBlID0gb3B0X3R5cGU7CiAgdGhpcy5ldmVudHNfLnB1c2goZXZlbnQpOwogIHRoaXMub3V0c3RhbmRpbmdFdmVudHNfLnNldCgiIiArIGV2ZW50LmlkLCBldmVudCk7CiAgdGhpcy50cmFjZXJDb3VudF8rKzsKICB2YXIgbm93ID0gZ29vZy5kZWJ1Zy5UcmFjZV8ubm93KCk7CiAgZXZlbnQuc3RhcnRUaW1lID0gZXZlbnQuZXZlbnRUaW1lID0gbm93OwogIHRoaXMudHJhY2VyT3ZlcmhlYWRTdGFydF8gKz0gbm93IC0gdHJhY2VyU3RhcnRUaW1lOwogIHJldHVybiBldmVudC5pZAp9Owpnb29nLmRlYnVnLlRyYWNlXy5wcm90b3R5cGUuc3RvcFRyYWNlciA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFRyYWNlXyQkc3RvcFRyYWNlciQoaWQsIG9wdF9zaWxlbmNlVGhyZXNob2xkKSB7CiAgdmFyIG5vdyA9IGdvb2cuZGVidWcuVHJhY2VfLm5vdygpLCBzaWxlbmNlVGhyZXNob2xkOwogIHNpbGVuY2VUaHJlc2hvbGQgPSAwID09PSBvcHRfc2lsZW5jZVRocmVzaG9sZCA/IDAgOiBvcHRfc2lsZW5jZVRocmVzaG9sZCA/IG9wdF9zaWxlbmNlVGhyZXNob2xkIDogdGhpcy5kZWZhdWx0VGhyZXNob2xkXzsKICB2YXIgc3RhcnRFdmVudCA9IHRoaXMub3V0c3RhbmRpbmdFdmVudHNfLmdldCgiIiArIGlkKTsKICBpZihudWxsID09IHN0YXJ0RXZlbnQpIHsKICAgIHJldHVybiBudWxsCiAgfQogIHRoaXMub3V0c3RhbmRpbmdFdmVudHNfLnJlbW92ZSgiIiArIGlkKTsKICB2YXIgc3RvcEV2ZW50LCBlbGFwc2VkID0gbm93IC0gc3RhcnRFdmVudC5zdGFydFRpbWU7CiAgaWYoZWxhcHNlZCA8IHNpbGVuY2VUaHJlc2hvbGQpIHsKICAgIGZvcih2YXIgY291bnQgPSB0aGlzLmV2ZW50c18ubGVuZ3RoLCBpID0gY291bnQgLSAxOzAgPD0gaTtpLS0pIHsKICAgICAgdmFyIG5leHRFdmVudCA9IHRoaXMuZXZlbnRzX1tpXTsKICAgICAgaWYobmV4dEV2ZW50ID09IHN0YXJ0RXZlbnQpIHsKICAgICAgICB0aGlzLmV2ZW50c18uc3BsaWNlKGksIDEpOwogICAgICAgIHRoaXMuaWRQb29sXy5yZWxlYXNlT2JqZWN0KHN0YXJ0RXZlbnQuaWQpOwogICAgICAgIHRoaXMuZXZlbnRQb29sXy5yZWxlYXNlT2JqZWN0KHN0YXJ0RXZlbnQpOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICB9ZWxzZSB7CiAgICBzdG9wRXZlbnQgPSB0aGlzLmV2ZW50UG9vbF8uZ2V0T2JqZWN0KCksIHN0b3BFdmVudC5ldmVudFR5cGUgPSBnb29nLmRlYnVnLlRyYWNlXy5FdmVudFR5cGUuU1RPUCwgc3RvcEV2ZW50LnN0YXJ0VGltZSA9IHN0YXJ0RXZlbnQuc3RhcnRUaW1lLCBzdG9wRXZlbnQuY29tbWVudCA9IHN0YXJ0RXZlbnQuY29tbWVudCwgc3RvcEV2ZW50LnR5cGUgPSBzdGFydEV2ZW50LnR5cGUsIHN0b3BFdmVudC5zdG9wVGltZSA9IHN0b3BFdmVudC5ldmVudFRpbWUgPSBub3csIHRoaXMuZXZlbnRzXy5wdXNoKHN0b3BFdmVudCkKICB9CiAgdmFyIHR5cGUgPSBzdGFydEV2ZW50LnR5cGUsIHN0YXQgPSBudWxsOwogIHR5cGUgJiYgKHN0YXQgPSB0aGlzLmdldFN0YXRfKHR5cGUpLCBzdGF0LmNvdW50KyssIHN0YXQudGltZSArPSBlbGFwc2VkKTsKICBzdG9wRXZlbnQgJiYgKGdvb2cuZGVidWcuTG9nZ2VyLmxvZ1RvUHJvZmlsZXJzKCJTdG9wIDogIiArIHN0b3BFdmVudC5jb21tZW50KSwgc3RvcEV2ZW50LnRvdGFsVmFyQWxsb2MgPSB0aGlzLmdldFRvdGFsVmFyQWxsb2MoKSwgc3RhdCAmJiAoc3RhdC52YXJBbGxvYyArPSBzdG9wRXZlbnQudG90YWxWYXJBbGxvYyAtIHN0YXJ0RXZlbnQudG90YWxWYXJBbGxvYykpOwogIHZhciB0cmFjZXJGaW5pc2hUaW1lID0gZ29vZy5kZWJ1Zy5UcmFjZV8ubm93KCk7CiAgdGhpcy50cmFjZXJPdmVyaGVhZEVuZF8gKz0gdHJhY2VyRmluaXNoVGltZSAtIG5vdzsKICByZXR1cm4gZWxhcHNlZAp9Owpnb29nLmRlYnVnLlRyYWNlXy5wcm90b3R5cGUuZ2V0VG90YWxWYXJBbGxvYyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFRyYWNlXyQkZ2V0VG90YWxWYXJBbGxvYyQoKSB7CiAgdmFyIGdjVHJhY2VyID0gdGhpcy5nY1RyYWNlcl87CiAgcmV0dXJuIGdjVHJhY2VyICYmIGdjVHJhY2VyLmlzVHJhY2luZygpID8gZ2NUcmFjZXIudG90YWxWYXJBbGxvYyA6IC0xCn07Cmdvb2cuZGVidWcuVHJhY2VfLnByb3RvdHlwZS5nZXRTdGF0XyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFRyYWNlXyQkZ2V0U3RhdF8kKHR5cGUpIHsKICB2YXIgc3RhdCA9IHRoaXMuc3RhdHNfLmdldCh0eXBlKTsKICBzdGF0IHx8IChzdGF0ID0gdGhpcy5zdGF0UG9vbF8uZ2V0T2JqZWN0KCksIHN0YXQudHlwZSA9IHR5cGUsIHRoaXMuc3RhdHNfLnNldCh0eXBlLCBzdGF0KSk7CiAgcmV0dXJuIHN0YXQKfTsKZ29vZy5kZWJ1Zy5UcmFjZV8ucHJvdG90eXBlLmdldEZvcm1hdHRlZFRyYWNlID0gZnVuY3Rpb24gJGdvb2ckZGVidWckVHJhY2VfJCRnZXRGb3JtYXR0ZWRUcmFjZSQoKSB7CiAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKQp9Owpnb29nLmRlYnVnLlRyYWNlXy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRUcmFjZV8kJHRvU3RyaW5nJCgpIHsKICBmb3IodmFyIHNiID0gW10sIGV0aW1lID0gLTEsIGluZGVudCA9IFtdLCBpID0gMDtpIDwgdGhpcy5ldmVudHNfLmxlbmd0aDtpKyspIHsKICAgIHZhciBlID0gdGhpcy5ldmVudHNfW2ldOwogICAgZS5ldmVudFR5cGUgPT0gZ29vZy5kZWJ1Zy5UcmFjZV8uRXZlbnRUeXBlLlNUT1AgJiYgaW5kZW50LnBvcCgpOwogICAgc2IucHVzaCgiICIsIGUudG9UcmFjZVN0cmluZyh0aGlzLnN0YXJ0VGltZV8sIGV0aW1lLCBpbmRlbnQuam9pbigiIikpKTsKICAgIGV0aW1lID0gZS5ldmVudFRpbWU7CiAgICBzYi5wdXNoKCJcbiIpOwogICAgZS5ldmVudFR5cGUgPT0gZ29vZy5kZWJ1Zy5UcmFjZV8uRXZlbnRUeXBlLlNUQVJUICYmIGluZGVudC5wdXNoKCJ8ICAiKQogIH0KICBpZigwICE9IHRoaXMub3V0c3RhbmRpbmdFdmVudHNfLmdldENvdW50KCkpIHsKICAgIHZhciBub3cgPSBnb29nLmRlYnVnLlRyYWNlXy5ub3coKTsKICAgIHNiLnB1c2goIiBVbnN0b3BwZWQgdGltZXJzOlxuIik7CiAgICBnb29nLml0ZXIuZm9yRWFjaCh0aGlzLm91dHN0YW5kaW5nRXZlbnRzXywgZnVuY3Rpb24oc3RhcnRFdmVudCkgewogICAgICBzYi5wdXNoKCIgICIsIHN0YXJ0RXZlbnQsICIgKCIsIG5vdyAtIHN0YXJ0RXZlbnQuc3RhcnRUaW1lLCAiIG1zLCBzdGFydGVkIGF0ICIsIGdvb2cuZGVidWcuVHJhY2VfLmZvcm1hdFRpbWVfKHN0YXJ0RXZlbnQuc3RhcnRUaW1lKSwgIilcbiIpCiAgICB9KQogIH0KICBmb3IodmFyIHN0YXRLZXlzID0gdGhpcy5zdGF0c18uZ2V0S2V5cygpLCBpID0gMDtpIDwgc3RhdEtleXMubGVuZ3RoO2krKykgewogICAgdmFyIHN0YXQgPSB0aGlzLnN0YXRzXy5nZXQoc3RhdEtleXNbaV0pOwogICAgMSA8IHN0YXQuY291bnQgJiYgc2IucHVzaCgiIFRPVEFMICIsIHN0YXQsICJcbiIpCiAgfQogIHNiLnB1c2goIlRvdGFsIHRyYWNlcnMgY3JlYXRlZCAiLCB0aGlzLnRyYWNlckNvdW50XywgIlxuIiwgIlRvdGFsIGNvbW1lbnRzIGNyZWF0ZWQgIiwgdGhpcy5jb21tZW50Q291bnRfLCAiXG4iLCAiT3ZlcmhlYWQgc3RhcnQ6ICIsIHRoaXMudHJhY2VyT3ZlcmhlYWRTdGFydF8sICIgbXNcbiIsICJPdmVyaGVhZCBlbmQ6ICIsIHRoaXMudHJhY2VyT3ZlcmhlYWRFbmRfLCAiIG1zXG4iLCAiT3ZlcmhlYWQgY29tbWVudDogIiwgdGhpcy50cmFjZXJPdmVyaGVhZENvbW1lbnRfLCAiIG1zXG4iKTsKICByZXR1cm4gc2Iuam9pbigiIikKfTsKZ29vZy5kZWJ1Zy5UcmFjZV8ubG9uZ1RvUGFkZGVkU3RyaW5nXyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFRyYWNlXyRsb25nVG9QYWRkZWRTdHJpbmdfJCh2KSB7CiAgdmFyIHYgPSBNYXRoLnJvdW5kKHYpLCBzcGFjZSA9ICIiOwogIDFFMyA+IHYgJiYgKHNwYWNlID0gIiAiKTsKICAxMDAgPiB2ICYmIChzcGFjZSA9ICIgICIpOwogIDEwID4gdiAmJiAoc3BhY2UgPSAiICAgIik7CiAgcmV0dXJuIHNwYWNlICsgdgp9Owpnb29nLmRlYnVnLlRyYWNlXy5mb3JtYXRUaW1lXyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFRyYWNlXyRmb3JtYXRUaW1lXyQodGltZSkgewogIHZhciB0aW1lID0gTWF0aC5yb3VuZCh0aW1lKSwgc2VjID0gdGltZSAvIDFFMyAlIDYwLCBtcyA9IHRpbWUgJSAxRTM7CiAgcmV0dXJuKCIiICsgKDEwMCArIHNlYykpLnN1YnN0cmluZygxLCAzKSArICIuIiArICgiIiArICgxRTMgKyBtcykpLnN1YnN0cmluZygxLCA0KQp9Owpnb29nLmRlYnVnLlRyYWNlXy5ub3cgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRUcmFjZV8kbm93JCgpIHsKICByZXR1cm4gZ29vZy5ub3coKQp9Owpnb29nLmRlYnVnLlRyYWNlID0gbmV3IGdvb2cuZGVidWcuVHJhY2VfOwp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hPYmplY3QkKG5hbWUsIGFkZHJQcmVmaXgpIHsKICB0aGlzLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoInRhbGsubWVkaWEuRmxhc2hPYmplY3QiKTsKICB0aGlzLm5hbWVfID0gbmFtZSArIHRhbGsubWVkaWEuRmxhc2hPYmplY3QuZmxJRF8rKzsKICB0aGlzLmFkZHJQcmVmaXhfID0gYWRkclByZWZpeDsKICB0aGlzLmFjdGlvbnNfID0gW107CiAgdGhpcy5vc1R5cGVfID0gZ29vZy51c2VyQWdlbnQuV0lORE9XUyA/ICJ3aW5kb3dzIiA6IGdvb2cudXNlckFnZW50Lk1BQyA/ICJtYWNpbnRvc2giIDogZ29vZy51c2VyQWdlbnQuTElOVVggPyAibGludXgiIDogIiIKfTsKdGFsay5tZWRpYS5GbGFzaE9iamVjdC5mbElEXyA9IDA7CnRhbGsubWVkaWEuRmxhc2hPYmplY3QuU3RhdGVzID0ge0ZMQVNIX1NUQVRFX0lOSVQ6MCwgRkxBU0hfU1RBVEVfTE9BREVEOjEsIEZMQVNIX1NUQVRFX1JFQURZOjIsIEZMQVNIX1NUQVRFX1JFU0VUOjMsIEZMQVNIX05PVF9GT1VORDo0fTsKdGFsay5tZWRpYS5GbGFzaE9iamVjdC5XbW9kZXMgPSB7T1BBUVVFOiJvcGFxdWUiLCBUUkFOU1BBUkVOVDoidHJhbnNwYXJlbnQiLCBXSU5ET1c6IndpbmRvdyJ9Owp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5zdGF0ZV8gPSB0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LlN0YXRlcy5GTEFTSF9TVEFURV9JTklUOwp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5nZXRBZGRyZXNzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hPYmplY3QkJGdldEFkZHJlc3MkKCkgewogIHJldHVybiB0aGlzLmFkZHJQcmVmaXhfICsgdGhpcy5uYW1lXwp9Owp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoT2JqZWN0JCRnZXRTdGF0ZSQoKSB7CiAgcmV0dXJuIHRoaXMuc3RhdGVfCn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QuSUVfSFRNTF8gPSAnPG9iamVjdCBjbGFzc2lkPSJjbHNpZDpkMjdjZGI2ZS1hZTZkLTExY2YtOTZiOC00NDQ1NTM1NDAwMDAiIGlkPSIlcyIgbmFtZT0iJXMiIHdpZHRoPSIlcyIgaGVpZ2h0PSIlcyIgc3R5bGU9IiVzIj48cGFyYW0gbmFtZT0iU0NBTEUiIHZhbHVlPSJleGFjdGZpdCI+PHBhcmFtIG5hbWU9Im1vdmllIiB2YWx1ZT0iJXMiLz48cGFyYW0gbmFtZT0icXVhbGl0eSIgdmFsdWU9ImhpZ2giLz48cGFyYW0gbmFtZT0iRmxhc2hWYXJzIiB2YWx1ZT0iJXMiLz48cGFyYW0gbmFtZT0iYmdjb2xvciIgdmFsdWU9IiVzIi8+PHBhcmFtIG5hbWU9IkFsbG93U2NyaXB0QWNjZXNzIiB2YWx1ZT0ic2FtZURvbWFpbiIvPjxwYXJhbSBuYW1lPSJhbGxvd0Z1bGxTY3JlZW4iIHZhbHVlPSJ0cnVlIi8+PHBhcmFtIG5hbWU9IlNlYW1sZXNzVGFiYmluZyIgdmFsdWU9ImZhbHNlIi8+JXM8L29iamVjdD4nOwp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LklFX1dNT0RFX1BBUkFNU18gPSAnPHBhcmFtIG5hbWU9Indtb2RlIiB2YWx1ZT0iJXMiLz4nOwp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LkZGX0hUTUxfID0gJzxlbWJlZCBxdWFsaXR5PSJoaWdoIiBpZD0iJXMiIG5hbWU9IiVzIiBzdHlsZT0id2lkdGg6ICVzOyBoZWlnaHQ6ICVzOyAlcyIgc3JjPSIlcyIgRmxhc2hWYXJzPSIlcyIgYmdjb2xvcj0iJXMiIEFsbG93U2NyaXB0QWNjZXNzPSJzYW1lRG9tYWluIiBhbGxvd0Z1bGxTY3JlZW49InRydWUiIFNlYW1sZXNzVGFiYmluZz0iZmFsc2UiIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiBwbHVnaW5zcGFnZT0iaHR0cDovL3d3dy5tYWNyb21lZGlhLmNvbS9nby9nZXRmbGFzaHBsYXllciIgJXM+PC9lbWJlZD4nOwp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LkZGX1dNT0RFX1BBUkFNU18gPSAid21vZGU9JXMiOwp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LkZMQVNIX1ZBUlNfID0gImRiZz0lcyZhcD0lcyZubT0lcyZjYj0lcyZvcz0lcyYlcyI7CnRhbGsubWVkaWEuRmxhc2hPYmplY3QucHJvdG90eXBlLndyaXRlSFRNTCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoT2JqZWN0JCR3cml0ZUhUTUwkKHN3ZkNvbnRhaW5lciwgc3dmLCBvcHRfZmxhc2hWYXJzLCBvcHRfZGVidWcsIG9wdF93bW9kZSwgb3B0X2RvbUhlbHBlciwgb3B0X2lubmVySHRtbFdyaXRlckZuLCBvcHRfYmdjb2xvcikgewogIHRoaXMubW92YWJsZV8gPSAhMTsKICB0aGlzLnZpc2libGVfID0gITA7CiAgdGhpcy5jb250YWluZXJfID0gb3B0X2RvbUhlbHBlciA/IG9wdF9kb21IZWxwZXIuZ2V0RWxlbWVudChzd2ZDb250YWluZXIpIDogZ29vZy5kb20uZ2V0RWxlbWVudChzd2ZDb250YWluZXIpOwogIHRoaXMud2lkdGhfID0gcGFyc2VJbnQoZ29vZy5zdHlsZS5nZXRTdHlsZSh0aGlzLmNvbnRhaW5lcl8sICJ3aWR0aCIpLCAxMCk7CiAgdGhpcy5oZWlnaHRfID0gcGFyc2VJbnQoZ29vZy5zdHlsZS5nZXRTdHlsZSh0aGlzLmNvbnRhaW5lcl8sICJoZWlnaHQiKSwgMTApOwogIHRoaXMuZG9tXyA9IG9wdF9kb21IZWxwZXIgfHwgZ29vZy5kb20uZ2V0RG9tSGVscGVyKHRoaXMuY29udGFpbmVyXyk7CiAgdGhpcy5kb1dyaXRlSFRNTF8oITAsIHN3Ziwgb3B0X2ZsYXNoVmFycywgb3B0X2RlYnVnLCBvcHRfd21vZGUsIG9wdF9pbm5lckh0bWxXcml0ZXJGbiwgb3B0X2JnY29sb3IpCn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QucHJvdG90eXBlLmdldFJlcXVpcmVkVmVyc2lvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoT2JqZWN0JCRnZXRSZXF1aXJlZFZlcnNpb24kKCkgewogIHJldHVybiBnb29nLnVzZXJBZ2VudC5MSU5VWCA/ICI5LjAuMCIgOiAiOC4wLjAiCn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QucHJvdG90eXBlLmRvV3JpdGVIVE1MXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoT2JqZWN0JCRkb1dyaXRlSFRNTF8kKGluUGxhY2UsIHN3Ziwgb3B0X2ZsYXNoVmFycywgb3B0X2RlYnVnLCBvcHRfd21vZGUsIG9wdF9pbm5lckh0bWxXcml0ZXJGbiwgb3B0X2JnY29sb3IpIHsKICB2YXIgZmxhc2hWYXJzID0gb3B0X2ZsYXNoVmFycyA/IG9wdF9mbGFzaFZhcnMgOiAiIiwgd21vZGUgPSBvcHRfd21vZGUgPyBvcHRfd21vZGUgOiB0YWxrLm1lZGlhLkZsYXNoT2JqZWN0Lldtb2Rlcy5XSU5ET1csIGJnY29sb3IgPSBvcHRfYmdjb2xvciA/IG9wdF9iZ2NvbG9yIDogIiMwMDAwMDAiLCBtaW5GbGFzaFZlciA9IHRoaXMuZ2V0UmVxdWlyZWRWZXJzaW9uKCk7CiAgaWYoZ29vZy51c2VyQWdlbnQuZmxhc2guaXNWZXJzaW9uKG1pbkZsYXNoVmVyKSkgewogICAgdGhpcy53cml0ZUNvbW11bmljYXRpb25IYW5kbGVyc18oKTsKICAgIHZhciBodG1sID0gdGhpcy5nZW5lcmF0ZVN3ZlRhZ18oc3dmLCAiMTAwJSIsICIxMDAlIiwgZmxhc2hWYXJzLCB3bW9kZSwgYmdjb2xvciwgb3B0X2RlYnVnKTsKICAgIG9wdF9pbm5lckh0bWxXcml0ZXJGbiA/IG9wdF9pbm5lckh0bWxXcml0ZXJGbih0aGlzLmNvbnRhaW5lcl8sIGh0bWwpIDogdGhpcy5jb250YWluZXJfLmlubmVySFRNTCA9IGh0bWwKICB9ZWxzZSB7CiAgICB0aGlzLnNldFN0YXRlKHRhbGsubWVkaWEuRmxhc2hPYmplY3QuU3RhdGVzLkZMQVNIX05PVF9GT1VORCksIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJGbGFzaCBub3QgZm91bmQuIikKICB9CiAgaW5QbGFjZSB8fCB0aGlzLmRvbV8uYXBwZW5kQ2hpbGQodGhpcy5kb21fLmdldERvY3VtZW50KCkuYm9keSwgdGhpcy5jb250YWluZXJfKTsKICB0aGlzLmZsYXNoXyA9IHRoaXMuZG9tXy5nZXRFbGVtZW50KCJmbGFzaF8iICsgdGhpcy5uYW1lXykKfTsKdGFsay5tZWRpYS5GbGFzaE9iamVjdC5wcm90b3R5cGUud3JpdGVDb21tdW5pY2F0aW9uSGFuZGxlcnNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hPYmplY3QkJHdyaXRlQ29tbXVuaWNhdGlvbkhhbmRsZXJzXyQoKSB7CiAgdmFyIHJlY3ZGdW5jdGlvbiA9IGdvb2cuYmluZCh0aGlzLm9uUmVjdl8sIHRoaXMpLCBkb0ZTQ29tbWFuZEZ1bmN0aW9uID0gZ29vZy5iaW5kKHRoaXMub25GU0NvbW1hbmRfLCB0aGlzKSwgZGl2V2luZG93ID0gZ29vZy5kb20uZ2V0V2luZG93KHRoaXMuZG9tXy5nZXREb2N1bWVudCgpKTsKICBkaXZXaW5kb3dbIlJlY3ZfIiArIHRoaXMubmFtZV9dID0gcmVjdkZ1bmN0aW9uOwogIGRpdldpbmRvd1t0aGlzLm5hbWVfICsgIl9Eb0ZTQ29tbWFuZCJdID0gZG9GU0NvbW1hbmRGdW5jdGlvbjsKICBpZihnb29nLnVzZXJBZ2VudC5JRSkgewogICAgdmFyIHNjcmlwdCA9IHRoaXMuZG9tXy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgIHNjcmlwdC5ldmVudCA9ICJGU0NvbW1hbmQoY29tbWFuZCxhcmdzKSI7CiAgICBzY3JpcHQuaHRtbEZvciA9ICJmbGFzaF8iICsgdGhpcy5uYW1lXzsKICAgIHNjcmlwdC50ZXh0ID0gdGhpcy5uYW1lXyArICJfRG9GU0NvbW1hbmQoY29tbWFuZCwgYXJncykiOwogICAgdGhpcy5kb21fLmFwcGVuZENoaWxkKHRoaXMuZG9tXy5nZXREb2N1bWVudCgpLmJvZHksIHNjcmlwdCkKICB9Cn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QucHJvdG90eXBlLmdlbmVyYXRlU3dmVGFnXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoT2JqZWN0JCRnZW5lcmF0ZVN3ZlRhZ18kKHN3Ziwgd2lkdGgsIGhlaWdodCwgZmxhc2hWYXJzLCB3bW9kZSwgYmdjb2xvciwgb3B0X2RlYnVnKSB7CiAgdmFyIGRlYnVnU3RyID0gb3B0X2RlYnVnID8gInRydWUiIDogImZhbHNlIiwgdGVtcGxhdGUgPSBnb29nLnVzZXJBZ2VudC5JRSA/IHRhbGsubWVkaWEuRmxhc2hPYmplY3QuSUVfSFRNTF8gOiB0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LkZGX0hUTUxfLCBmdmFycyA9IGdvb2cuc3RyaW5nLnN1YnModGFsay5tZWRpYS5GbGFzaE9iamVjdC5GTEFTSF9WQVJTXywgZW5jb2RlVVJJQ29tcG9uZW50KGRlYnVnU3RyKSwgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYWRkclByZWZpeF8pLCBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lXyksIGVuY29kZVVSSUNvbXBvbmVudCgiUmVjdl8iICsgdGhpcy5uYW1lXyksIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm9zVHlwZV8pLCBmbGFzaFZhcnMgKyAiJiIpLCBzdHlsZSA9ICIiLCBwYXJhbXMgPSBnb29nLnVzZXJBZ2VudC5JRSA/IHRhbGsubWVkaWEuRmxhc2hPYmplY3QuSUVfV01PREVfUEFSQU1TXyA6IHRhbGsubWVkaWEuRmxhc2hPYmplY3QuRkZfV01PREVfUEFSQU1TXywgCiAgcGFyYW1zID0gZ29vZy5zdHJpbmcuc3VicyhwYXJhbXMsIHdtb2RlKTsKICByZXR1cm4gZ29vZy5zdHJpbmcuc3Vicyh0ZW1wbGF0ZSwgImZsYXNoXyIgKyB0aGlzLm5hbWVfLCB0aGlzLm5hbWVfLCB3aWR0aCwgaGVpZ2h0LCBzdHlsZSwgc3dmLCBmdmFycywgYmdjb2xvciwgcGFyYW1zKQp9Owp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5yZW1vdmVIVE1MID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hPYmplY3QkJHJlbW92ZUhUTUwkKCkgewogIHRoaXMuY29udGFpbmVyXy5pbm5lckhUTUwgPSAiIjsKICB0aGlzLmZsYXNoXyA9IHRoaXMuY29udGFpbmVyXyA9IG51bGwKfTsKdGFsay5tZWRpYS5GbGFzaE9iamVjdC5wcm90b3R5cGUuZml4TGF5b3V0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoT2JqZWN0JCRmaXhMYXlvdXRfJCgpIHsKICB0aGlzLm1vdmFibGVfICYmICF0aGlzLmZpeExheW91dERvbmVfICYmICh0aGlzLmZpeExheW91dERvbmVfID0gITAsIGdvb2cuc3R5bGUuc2V0U3R5bGUodGhpcy5jb250YWluZXJfLCAibGVmdCIsICItMTAwMDBweCIpLCBnb29nLnN0eWxlLnNldFN0eWxlKHRoaXMuY29udGFpbmVyXywgInRvcCIsICIwcHgiKSwgZ29vZy5zdHlsZS5zZXRTdHlsZSh0aGlzLmNvbnRhaW5lcl8sICJ3aWR0aCIsIHRoaXMud2lkdGhfICsgInB4IiksIGdvb2cuc3R5bGUuc2V0U3R5bGUodGhpcy5jb250YWluZXJfLCAiaGVpZ2h0IiwgdGhpcy5oZWlnaHRfICsgInB4IikpCn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QucHJvdG90eXBlLmlzVmlzaWJsZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoT2JqZWN0JCRpc1Zpc2libGUkKCkgewogIHJldHVybiB0aGlzLnZpc2libGVfCn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QucHJvdG90eXBlLnNldFZpc2libGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaE9iamVjdCQkc2V0VmlzaWJsZSQodmlzaWJsZSkgewogIHRoaXMuYWN0aW9uc18gPyB0aGlzLmFjdGlvbnNfLnB1c2goZ29vZy5iaW5kKHRoaXMuc2V0VmlzaWJsZSwgdGhpcywgdmlzaWJsZSkpIDogKHRoaXMudmlzaWJsZV8gPSB2aXNpYmxlLCB2aXNpYmxlIHx8ICh0aGlzLm1vdmVUbygtMUU0LCAwKSwgZ29vZy5zdHlsZS5zZXRTdHlsZSh0aGlzLmNvbnRhaW5lcl8sICJ3aWR0aCIsIHRoaXMud2lkdGhfICsgInB4IiksIGdvb2cuc3R5bGUuc2V0U3R5bGUodGhpcy5jb250YWluZXJfLCAiaGVpZ2h0IiwgdGhpcy5oZWlnaHRfICsgInB4IikpKQp9Owp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoT2JqZWN0JCRmb2N1cyQoKSB7CiAgaWYodGhpcy5hY3Rpb25zXykgewogICAgdGhpcy5hY3Rpb25zXy5wdXNoKGdvb2cuYmluZCh0aGlzLmZvY3VzLCB0aGlzKSkKICB9ZWxzZSB7CiAgICBpZighdGhpcy52aXNpYmxlXykgewogICAgICB0aHJvdyBFcnJvcigiQ2Fubm90IGZvY3VzIGFuIGludmlzaWJsZSBmbGFzaCBvYmplY3QiKTsKICAgIH0KICAgIHRoaXMuZmxhc2hfLmZvY3VzKCk7CiAgICBnb29nLlRpbWVyLmNhbGxPbmNlKGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmZsYXNoXy5mb2N1cygpCiAgICB9LCAwLCB0aGlzKQogIH0KfTsKdGFsay5tZWRpYS5GbGFzaE9iamVjdC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaE9iamVjdCQkZ2V0V2lkdGgkKCkgewogIHJldHVybiB0aGlzLmFjdGlvbnNfID8gdGhpcy53aWR0aF8gOiBwYXJzZUludChnb29nLnN0eWxlLmdldFN0eWxlKHRoaXMuY29udGFpbmVyXywgIndpZHRoIiksIDEwKQp9Owp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaE9iamVjdCQkZ2V0SGVpZ2h0JCgpIHsKICByZXR1cm4gdGhpcy5hY3Rpb25zXyA/IHRoaXMuaGVpZ2h0XyA6IHBhcnNlSW50KGdvb2cuc3R5bGUuZ2V0U3R5bGUodGhpcy5jb250YWluZXJfLCAiaGVpZ2h0IiksIDEwKQp9Owp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaE9iamVjdCQkbW92ZVRvJCh4LCB5KSB7CiAgdGhpcy5hY3Rpb25zXyA/IHRoaXMuYWN0aW9uc18ucHVzaChnb29nLmJpbmQodGhpcy5tb3ZlVG8sIHRoaXMsIHgsIHkpKSA6IChudWxsICE9IHggJiYgZ29vZy5zdHlsZS5zZXRTdHlsZSh0aGlzLmNvbnRhaW5lcl8sICJsZWZ0IiwgeCArICJweCIpLCBudWxsICE9IHkgJiYgZ29vZy5zdHlsZS5zZXRTdHlsZSh0aGlzLmNvbnRhaW5lcl8sICJ0b3AiLCB5ICsgInB4IikpCn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaE9iamVjdCQkc2VuZCQoc3JjLCBhcnJheSkgewogIHRoaXMuYWN0aW9uc18gPyB0aGlzLmFjdGlvbnNfLnB1c2goZ29vZy5iaW5kKHRoaXMuc2VuZCwgdGhpcywgc3JjLCBhcnJheSkpIDogdGhpcy5zZW5kSW50ZXJuYWxfKHNyYywgYXJyYXkpCn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QucHJvdG90eXBlLnNlbmRJbnRlcm5hbF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaE9iamVjdCQkc2VuZEludGVybmFsXyQoc3JjLCBhcnJheSkgewogIHRyeSB7CiAgICB0aGlzLmZsYXNoXy5TZXRWYXJpYWJsZSgibXNnIiwgZ29vZy5qc29uLnNlcmlhbGl6ZShbc3JjLCB0aGlzLmdldEFkZHJlc3MoKSwgYXJyYXldKSkKICB9Y2F0Y2goZSkgewogICAgdGhpcy5sb2dnZXJfLndhcm5pbmcoIlNldFZhcmlhYmxlIGZhaWxlZDogIiArIGUpCiAgfQp9Owp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5vbkZTQ29tbWFuZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaE9iamVjdCQkb25GU0NvbW1hbmRfJChjbWQsIGFyZykgewogIGlmKCJtc2ciID09IGNtZCB8fCAiRlNDb21tYW5kOm1zZyIgPT0gY21kKSB7CiAgICB0aGlzLm9uUmVjdl8oYXJnKQogIH0KfTsKdGFsay5tZWRpYS5GbGFzaE9iamVjdC5wcm90b3R5cGUuc2V0UmVjdiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoT2JqZWN0JCRzZXRSZWN2JChyZWN2KSB7CiAgdGhpcy5yZWN2Rm5fID0gcmVjdgp9Owp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5vblJlY3ZfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hPYmplY3QkJG9uUmVjdl8kKHN0cikgewogIHZhciBtc2cgPSBnb29nLmpzb24ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHN0cikpLCBzcmMgPSBtc2dbMF0sIGRlc3QgPSBtc2dbMV0sIGFycmF5ID0gbXNnWzJdOwogIGlmKGRlc3QgPT0gdGhpcy5hZGRyUHJlZml4XyArICIuIikgewogICAgaWYoImYiID09IGFycmF5WzBdKSB7CiAgICAgIHRoaXMuZm9jdXMoKQogICAgfWVsc2UgewogICAgICBpZigiYiIgPT0gYXJyYXlbMF0pIHsKICAgICAgICB0aGlzLmZsYXNoXy5ibHVyKCkKICAgICAgfWVsc2UgewogICAgICAgIGlmKCJsb2FkZWQiID09IGFycmF5WzBdKSB7CiAgICAgICAgICB0aGlzLm9uUmVjdkxvYWRlZF8oKQogICAgICAgIH1lbHNlIHsKICAgICAgICAgICJwb25nIiA9PSBhcnJheVswXSAmJiAodGhpcy5zZXRTdGF0ZSh0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LlN0YXRlcy5GTEFTSF9TVEFURV9SRUFEWSksIHRoaXMuZml4TGF5b3V0XygpLCB0aGlzLm9uUmVhZHlfKCkpCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHRoaXMucmVjdkZuXyAmJiB0aGlzLnJlY3ZGbl8oc3JjLCBkZXN0LCBhcnJheSkKfTsKdGFsay5tZWRpYS5GbGFzaE9iamVjdC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaE9iamVjdCQkc2V0U3RhdGUkKHN0YXRlKSB7CiAgdGhpcy5zdGF0ZV8gPSBzdGF0ZTsKICB0aGlzLnN0YXRlQ2hhbmdlXyAmJiB0aGlzLnN0YXRlQ2hhbmdlXyh0aGlzKQp9Owp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5yZXNldFN0YXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hPYmplY3QkJHJlc2V0U3RhdGUkKCkgewogIHRoaXMuc2V0U3RhdGUodGFsay5tZWRpYS5GbGFzaE9iamVjdC5TdGF0ZXMuRkxBU0hfU1RBVEVfSU5JVCk7CiAgdGhpcy5sb2FkZWRfID0gITE7CiAgdGhpcy5hY3Rpb25zXyA9IFtdCn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QuTE9BREVEX1JFQ0hFQ0tfSU5URVJWQUxfID0gMkUzOwp0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LnByb3RvdHlwZS5vblJlY3ZMb2FkZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hPYmplY3QkJG9uUmVjdkxvYWRlZF8kKCkgewogIGlmKHRoaXMuaXNMb2FkZWQoKSkgewogICAgdGhpcy5vbkxvYWRlZF8oKQogIH1lbHNlIHsKICAgIGdvb2cuVGltZXIuY2FsbE9uY2UodGhpcy5vblJlY3ZMb2FkZWRfLCB0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LkxPQURFRF9SRUNIRUNLX0lOVEVSVkFMXywgdGhpcykKICB9Cn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QuU3dmUmVhZHlTdGF0ZXNfID0ge0xPQURJTkc6MCwgVU5JTklUSUFMSVpFRDoxLCBMT0FERUQ6MiwgSU5URVJBQ1RJVkU6MywgQ09NUExFVEU6NH07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QucHJvdG90eXBlLmlzTG9hZGVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hPYmplY3QkJGlzTG9hZGVkJCgpIHsKICBpZih0aGlzLmxvYWRlZF8pIHsKICAgIHJldHVybiEwCiAgfQogIHZhciBmT2JqID0gdGhpcy5mbGFzaF87CiAgcmV0dXJuIWZPYmogPyAhMSA6IHRoaXMubG9hZGVkXyA9ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBmT2JqLnJlYWR5U3RhdGUgJiYgZk9iai5yZWFkeVN0YXRlID09IHRhbGsubWVkaWEuRmxhc2hPYmplY3QuU3dmUmVhZHlTdGF0ZXNfLkNPTVBMRVRFIHx8ICJ1bmRlZmluZWQiICE9IHR5cGVvZiBmT2JqLlBlcmNlbnRMb2FkZWQgJiYgMTAwID09IGZPYmouUGVyY2VudExvYWRlZCgpCn07CnRhbGsubWVkaWEuRmxhc2hPYmplY3QucHJvdG90eXBlLm9uTG9hZGVkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoT2JqZWN0JCRvbkxvYWRlZF8kKCkgewogIGlmKHRoaXMuZ2V0U3RhdGUoKSA9PSB0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LlN0YXRlcy5GTEFTSF9TVEFURV9SRUFEWSkgewogICAgdGhpcy5zZXRTdGF0ZSh0YWxrLm1lZGlhLkZsYXNoT2JqZWN0LlN0YXRlcy5GTEFTSF9TVEFURV9SRVNFVCkKICB9ZWxzZSB7CiAgICB0aGlzLnNldFN0YXRlKHRhbGsubWVkaWEuRmxhc2hPYmplY3QuU3RhdGVzLkZMQVNIX1NUQVRFX0xPQURFRCk7CiAgICB2YXIgYWRkciA9IHRoaXMuZ2V0QWRkcmVzcygpOwogICAgdGhpcy5zZW5kSW50ZXJuYWxfKGFkZHIsIFsicGluZyJdKQogIH0KfTsKdGFsay5tZWRpYS5GbGFzaE9iamVjdC5wcm90b3R5cGUub25SZWFkeV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaE9iamVjdCQkb25SZWFkeV8kKCkgewogIGlmKHRoaXMuYWN0aW9uc18pIHsKICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zXzsKICAgIHRoaXMuYWN0aW9uc18gPSBudWxsOwogICAgZm9yKHZhciBpID0gMDtpIDwgYWN0aW9ucy5sZW5ndGg7KytpKSB7CiAgICAgIGFjdGlvbnNbaV0oKQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5GbGFzaFBsYXllciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoUGxheWVyJChuYW1lLCB1cmwsIG9wdF9mbGFzaFZhcnMpIHsKICB0aGlzLnBsYXllclN3Zl8gPSBuZXcgdGFsay5tZWRpYS5GbGFzaE9iamVjdChuYW1lLCB0YWxrLm1lZGlhLkZsYXNoUGxheWVyLlBSRUZJWCk7CiAgdGhpcy5wbGF5ZXJTd2ZfLnNldFJlY3YoZ29vZy5iaW5kKHRoaXMub25SZWN2RnJvbVBsYXllcl8sIHRoaXMpKTsKICB0aGlzLnVybF8gPSB1cmw7CiAgdGhpcy5mbGFzaFZhcnNfID0gb3B0X2ZsYXNoVmFycwp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuRmxhc2hQbGF5ZXIsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKdGFsay5tZWRpYS5GbGFzaFBsYXllci5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLkZsYXNoUGxheWVyIik7CnRhbGsubWVkaWEuRmxhc2hQbGF5ZXIuTUVTU0FHRV9UWVBFX0lOREVYID0gMDsKdGFsay5tZWRpYS5GbGFzaFBsYXllci5FdmVudHMgPSB7Q0xPU0U6InBsYXllcl9jbG9zZSIsIENMSUNLRUQ6IkNMSUNLRUQifTsKdGFsay5tZWRpYS5GbGFzaFBsYXllci5SZWN2TXNnID0ge0NMT1NFX01TRzoiQ0xPU0UiLCBUUkFDRV9NU0c6InRyYWNlIiwgQ0xJQ0tfTVNHOiJDTElDSyJ9Owp0YWxrLm1lZGlhLkZsYXNoUGxheWVyLlBSRUZJWCA9ICJwbGF5ZXIiOwp0YWxrLm1lZGlhLkZsYXNoUGxheWVyLnByb3RvdHlwZS5nZXRXbW9kZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoUGxheWVyJCRnZXRXbW9kZSQoKSB7CiAgcmV0dXJuIHRhbGsubWVkaWEuRmxhc2hPYmplY3QuV21vZGVzLldJTkRPVwp9Owp0YWxrLm1lZGlhLkZsYXNoUGxheWVyLnByb3RvdHlwZS5zZW5kVG9QbGF5ZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaFBsYXllciQkc2VuZFRvUGxheWVyJChtc2csIGFyZ3MpIHsKICB2YXIgYXJnc0FycmF5OwogIGFyZ3NBcnJheSA9ICJzdHJpbmciID09IHR5cGVvZiBhcmdzID8gZ29vZy5qc29uLnBhcnNlKGFyZ3MpIDogYXJnczsKICB0aGlzLnBsYXllclN3Zl8uc2VuZCh0YWxrLm1lZGlhLkZsYXNoUGxheWVyLlBSRUZJWCArIG1zZywgYXJnc0FycmF5KQp9Owp0YWxrLm1lZGlhLkZsYXNoUGxheWVyLnByb3RvdHlwZS5vblJlY3ZGcm9tUGxheWVyXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoUGxheWVyJCRvblJlY3ZGcm9tUGxheWVyXyQoc3JjLCBkZXN0LCBtc2cpIHsKICB2YXIgdHlwZSA9IG1zZ1t0YWxrLm1lZGlhLkZsYXNoUGxheWVyLk1FU1NBR0VfVFlQRV9JTkRFWF07CiAgc3dpdGNoKHR5cGUpIHsKICAgIGNhc2UgdGFsay5tZWRpYS5GbGFzaFBsYXllci5SZWN2TXNnLkNMT1NFX01TRzoKICAgICAgdGhpcy5vbkNsb3NlKCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSB0YWxrLm1lZGlhLkZsYXNoUGxheWVyLlJlY3ZNc2cuVFJBQ0VfTVNHOgogICAgICB0YWxrLm1lZGlhLkZsYXNoUGxheWVyLmxvZ2dlcl8uaW5mbygiRmxhc2ggVHJhY2U6IiArIG1zZ1sxXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSB0YWxrLm1lZGlhLkZsYXNoUGxheWVyLlJlY3ZNc2cuQ0xJQ0tfTVNHOgogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQodGFsay5tZWRpYS5GbGFzaFBsYXllci5FdmVudHMuQ0xJQ0tFRCk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhpcy5oYW5kbGVNZXNzYWdlKHR5cGUsIG1zZykgfHwgdGhpcy5oYW5kbGVVbmtub3duTWVzc2FnZV8obXNnKQogIH0KfTsKdGFsay5tZWRpYS5GbGFzaFBsYXllci5wcm90b3R5cGUub25DbG9zZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEZsYXNoUGxheWVyJCRvbkNsb3NlJCgpIHsKICB0aGlzLmRpc3BhdGNoRXZlbnQodGFsay5tZWRpYS5GbGFzaFBsYXllci5FdmVudHMuQ0xPU0UpCn07CnRhbGsubWVkaWEuRmxhc2hQbGF5ZXIucHJvdG90eXBlLmhhbmRsZU1lc3NhZ2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRGbGFzaFBsYXllciQkaGFuZGxlTWVzc2FnZSQoKSB7CiAgcmV0dXJuITEKfTsKdGFsay5tZWRpYS5GbGFzaFBsYXllci5wcm90b3R5cGUuaGFuZGxlVW5rbm93bk1lc3NhZ2VfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hQbGF5ZXIkJGhhbmRsZVVua25vd25NZXNzYWdlXyQobXNnKSB7CiAgdGFsay5tZWRpYS5GbGFzaFBsYXllci5sb2dnZXJfLmluZm8oIlJlY2VpdmVkIHVua25vd24gZmxhc2ggbWVzc2FnZTogIiArIG1zZykKfTsKdGFsay5tZWRpYS5GbGFzaFBsYXllci5wcm90b3R5cGUucmVtb3ZlUGxheWVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hQbGF5ZXIkJHJlbW92ZVBsYXllciQoKSB7CiAgdGhpcy5wbGF5ZXJTd2ZfICYmICh0aGlzLnBsYXllclN3Zl8ucmVtb3ZlSFRNTCgpLCB0aGlzLnBsYXllclN3Zl8gPSBudWxsKQp9Owp0YWxrLm1lZGlhLkZsYXNoUGxheWVyLnByb3RvdHlwZS5yZXNldFN0YXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hQbGF5ZXIkJHJlc2V0U3RhdGUkKCkgewogIHRoaXMucGxheWVyU3dmXy5yZXNldFN0YXRlKCkKfTsKdGFsay5tZWRpYS5GbGFzaFBsYXllci5wcm90b3R5cGUuc2V0Q29udGFpbmVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkRmxhc2hQbGF5ZXIkJHNldENvbnRhaW5lciQoc3dmQ29udGFpbmVyKSB7CiAgdGhpcy5wbGF5ZXJTd2ZfLndyaXRlSFRNTChzd2ZDb250YWluZXIsIHRoaXMudXJsXywgdGhpcy5mbGFzaFZhcnNfLCAhMCwgdGhpcy5nZXRXbW9kZSgpLCB2b2lkIDAsIHRhbGsubWVkaWEuRmxhc2hQbGF5ZXIud3JpdGVJbm5lckh0bWxGbikKfTsKdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ29tbXVuaWNhdGlvblBsYXllciQoY2FsbE1hbmFnZXIsIG9wdF9mbGFzaFZhcnMsIG9wdF9zd2ZVcmwpIHsKICB0aGlzLnN3ZlVybF8gPSAob3B0X3N3ZlVybCA/IG9wdF9zd2ZVcmwgOiAiaW0vbWVkaWEtcGxheWVyLnN3ZiIpICsgIj92ZXI9IiArIHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5DQUxMX1BMQVlFUl9WRVJTSU9OXzsKICB0aGlzLnZpZGVvU3RhcnRUcmFjZV8gPSBnb29nLmRlYnVnLlRyYWNlLnN0YXJ0VHJhY2VyKCJjb21tdW5pY2F0aW9uUGxheWVyLnN0YXJ0Iik7CiAgdGFsay5tZWRpYS5GbGFzaFBsYXllci5jYWxsKHRoaXMsIHRoaXMuZ2V0TmFtZSgpLCB0aGlzLmdldFN3ZlVybCgpLCAicGx1Z2luPXRydWUiICsgKG9wdF9mbGFzaFZhcnMgPyAiJiIgKyBvcHRfZmxhc2hWYXJzIDogIiIpKTsKICB0aGlzLmNhbGxNYW5hZ2VyXyA9IGNhbGxNYW5hZ2VyOwogIHRoaXMuZXZlbnRIYW5kbGVyXyA9IG5ldyBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIodGhpcyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLmNhbGxNYW5hZ2VyXywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5TSE9XX1ZJREVPLCB0aGlzLmhhbmRsZVNob3dWaWRlb18pOwogIHRoaXMuc2VuZFRvUGxheWVyKHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5TZW5kTXNnLlBMVUdJTl9EQVRBLCB0aGlzLmNhbGxNYW5hZ2VyXy5nZXRGbHV0ZVZlcnNpb25JbmZvKCkpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLCB0YWxrLm1lZGlhLkZsYXNoUGxheWVyKTsKdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLkNBTExfUExBWUVSX1ZFUlNJT05fID0gIjIuMC41IjsKdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLkNvbW11bmljYXRpb25QbGF5ZXIiKTsKdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLlNlbmRNc2cgPSB7U1RBUlRfQ0FMTDoiU0MiLCBVSV9DT01NQU5EOiJVQyIsIFNIT1dfQVZBVEFSOiJTQSIsIFVQREFURV9QQVJUSUNJUEFOVFM6IlVQIiwgSklOR0xFOiJjb25uZWN0LWRhdGEiLCBQTFVHSU5fREFUQToicGx1Z2luLWRhdGEiLCBNVVRFX1NUQVRFOiJNVVRFX1NUQVRFIn07CnRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5SZWN2TXNnID0ge0pJTkdMRToiY29ubmVjdC1kYXRhIiwgUExVR0lOX0RBVEE6InBsdWdpbi1kYXRhIiwgU0VTU0lPTl9EQVRBOiJzZXNzaW9uLWRhdGEiLCBGRUVEX0RJU1BMQVlFRDoiRkVFRCIsIE1VVEVfU1RBVEU6Ik1VVEVfU1RBVEUifTsKdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLkV2ZW50cyA9IHtESVNQT1NFRDoiRFAifTsKdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLlNlc3Npb25NZXNzYWdlXyA9IHtGVUxMU0NSRUVOX1VQR1JBREU6ImZzIn07CnRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci53bW9kZV8gPSB0YWxrLm1lZGlhLkZsYXNoT2JqZWN0Lldtb2Rlcy5XSU5ET1c7CnRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5zZXRXbW9kZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENvbW11bmljYXRpb25QbGF5ZXIkc2V0V21vZGUkKHdtb2RlKSB7CiAgdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLndtb2RlXyA9IHdtb2RlCn07CnRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuZ2V0U3dmVXJsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ29tbXVuaWNhdGlvblBsYXllciQkZ2V0U3dmVXJsJCgpIHsKICByZXR1cm4gdGhpcy5zd2ZVcmxfCn07CnRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENvbW11bmljYXRpb25QbGF5ZXIkJGdldE5hbWUkKCkgewogIHJldHVybiJ5al9jX3BsYXllciIKfTsKdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5nZXRXbW9kZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENvbW11bmljYXRpb25QbGF5ZXIkJGdldFdtb2RlJCgpIHsKICByZXR1cm4gdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLndtb2RlXwp9Owp0YWxrLm1lZGlhLkNvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLm9uTmV3Q2FsbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENvbW11bmljYXRpb25QbGF5ZXIkJG9uTmV3Q2FsbCQoaXNPdXRnb2luZywgc2Vzc2lvbklkLCBzZW5kZXJKaWQsIHBhcnRpY2lwYW50cywgY2FsbFR5cGUsIGlzTXVsdGlVc2VyKSB7CiAgdGhpcy5zZXNzaW9uSWRfID0gc2Vzc2lvbklkOwogIHRoaXMuc2VuZGVySmlkXyA9IHNlbmRlckppZDsKICB0aGlzLmlzVGVzdENhbGxfID0gY2FsbFR5cGUgPT0gdGFsay5tZWRpYS5DYWxsVHlwZS5URVNUOwogIHZhciBwYXJ0aWNpcGFudEFycmF5ID0gdGhpcy5nZXRQYXJ0aWNpcGFudEFycmF5XyhwYXJ0aWNpcGFudHMpOwogIHRoaXMuc2VuZFRvUGxheWVyKHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5TZW5kTXNnLlNUQVJUX0NBTEwsIFtpc091dGdvaW5nLCBzZXNzaW9uSWQsIHBhcnRpY2lwYW50QXJyYXksIHRoaXMuaXNUZXN0Q2FsbF8gPyB0YWxrLm1lZGlhLkNhbGxUeXBlLlZJREVPIDogY2FsbFR5cGUsIGlzTXVsdGlVc2VyXSk7CiAgdGhpcy5pc1Rlc3RDYWxsXyAmJiB0aGlzLmNhbGxNYW5hZ2VyXy5zZW5kRmx1dGVNc2coZ29vZy5qc29uLnNlcmlhbGl6ZShbImpuIiwgdGhpcy5zZW5kZXJKaWRfLCB0aGlzLnNlc3Npb25JZF8sICJ0IiwgInMiXSkpOwogIGNhbGxUeXBlICE9IHRhbGsubWVkaWEuQ2FsbFR5cGUuVklERU8gJiYgY2FsbFR5cGUgIT0gdGFsay5tZWRpYS5DYWxsVHlwZS5URVNUICYmIHRoaXMuc3RvcFRyYWNlcl8oKQp9Owp0YWxrLm1lZGlhLkNvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLmRpc3BsYXlDYWxsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ29tbXVuaWNhdGlvblBsYXllciQkZGlzcGxheUNhbGwkKGppZCwgcGFydGljaXBhbnRzLCBpc011bHRpVXNlcikgewogIHZhciBjYWxsID0gdGhpcy5jYWxsTWFuYWdlcl8uZmluZENhbGwoamlkKTsKICBpZihjYWxsKSB7CiAgICB0aGlzLnJlc2V0U3RhdGUoKTsKICAgIHRoaXMuc2VuZFRvUGxheWVyKHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5TZW5kTXNnLlBMVUdJTl9EQVRBLCB0aGlzLmNhbGxNYW5hZ2VyXy5nZXRGbHV0ZVZlcnNpb25JbmZvKCkpOwogICAgdGhpcy5zZXNzaW9uSWRfID0gY2FsbC5zZXNzaW9uSWQ7CiAgICB0aGlzLnNlbmRlckppZF8gPSBjYWxsLnJlbW90ZUppZHNbMF07CiAgICB0aGlzLmlzVGVzdENhbGxfID0gY2FsbC50eXBlID09IHRhbGsubWVkaWEuQ2FsbFR5cGUuVEVTVDsKICAgIHZhciBwYXJ0aWNpcGFudEFycmF5ID0gdGhpcy5nZXRQYXJ0aWNpcGFudEFycmF5XyhwYXJ0aWNpcGFudHMpOwogICAgdGhpcy5zZW5kVG9QbGF5ZXIodGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLlNlbmRNc2cuU1RBUlRfQ0FMTCwgWyExLCBjYWxsLnNlc3Npb25JZCwgcGFydGljaXBhbnRBcnJheSwgdGhpcy5pc1Rlc3RDYWxsXyA/IHRhbGsubWVkaWEuQ2FsbFR5cGUuVklERU8gOiBjYWxsLnR5cGUsIGlzTXVsdGlVc2VyLCBjYWxsLnN0YXRlXSk7CiAgICBjYWxsLnR5cGUgIT0gdGFsay5tZWRpYS5DYWxsVHlwZS5WSURFTyAmJiBjYWxsLnR5cGUgIT0gdGFsay5tZWRpYS5DYWxsVHlwZS5URVNUICYmIHRoaXMuc3RvcFRyYWNlcl8oKQogIH1lbHNlIHsKICAgIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJkaXNwbGF5Q2FsbCBjYWxsZWQgd2l0aCBpbnZhbGlkIGNhbGwgZm9yIEpJRCAiICsgamlkKQogIH0KfTsKdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5mbHV0ZVZpZGVvU3RyZWFtT25fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ29tbXVuaWNhdGlvblBsYXllciQkZmx1dGVWaWRlb1N0cmVhbU9uXyQoc3NyYykgewogIHRoaXMuY2FsbE1hbmFnZXJfLnNlbmRGbHV0ZU1zZyhnb29nLmpzb24uc2VyaWFsaXplKFsic3RyZWFtb24iLCB0aGlzLnNlbmRlckppZF8sIHRoaXMuc2Vzc2lvbklkXywgMSwgc3NyY10pKQp9Owp0YWxrLm1lZGlhLkNvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLmhhbmRsZVNob3dWaWRlb18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDb21tdW5pY2F0aW9uUGxheWVyJCRoYW5kbGVTaG93VmlkZW9fJChlKSB7CiAgZS5zZXNzaW9uSWQgPT0gdGhpcy5zZXNzaW9uSWRfICYmIHRoaXMuZmx1dGVWaWRlb1N0cmVhbU9uXyhlLnNzcmMpCn07CnRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUucmVsYXlDYWxsTWVzc2FnZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENvbW11bmljYXRpb25QbGF5ZXIkJHJlbGF5Q2FsbE1lc3NhZ2UkKHR5cGUsIG1lc3NhZ2UpIHsKICB0aGlzLnNlbmRUb1BsYXllcih0eXBlLCBnb29nLmpzb24ucGFyc2UobWVzc2FnZSkpCn07CnRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuaGFuZGxlTWVzc2FnZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENvbW11bmljYXRpb25QbGF5ZXIkJGhhbmRsZU1lc3NhZ2UkKHR5cGUsIG1zZykgewogIHN3aXRjaCh0eXBlKSB7CiAgICBjYXNlIHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5SZWN2TXNnLkpJTkdMRToKICAgICAgIXRoaXMuaXNUZXN0Q2FsbF8gJiYgImpuIiAhPSBtc2dbMV1bMF0gJiYgImphIiAhPSBtc2dbMV1bMF0gJiYgdGhpcy5jYWxsTWFuYWdlcl8uc2VuZEppbmdsZU1zZyhnb29nLmpzb24uc2VyaWFsaXplKG1zZ1sxXSkpOwogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLlJlY3ZNc2cuUExVR0lOX0RBVEE6CiAgICAgICghdGhpcy5pc1Rlc3RDYWxsXyB8fCAic3RyZWFtb24iID09IG1zZ1sxXVswXSAmJiAwID09IG1zZ1sxXVszXSkgJiYgImpuIiAhPSBtc2dbMV1bMF0gJiYgImphIiAhPSBtc2dbMV1bMF0gJiYgdGhpcy5jYWxsTWFuYWdlcl8uc2VuZEZsdXRlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUobXNnWzFdKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSB0YWxrLm1lZGlhLkNvbW11bmljYXRpb25QbGF5ZXIuUmVjdk1zZy5TRVNTSU9OX0RBVEE6CiAgICAgIGlmKCF0aGlzLmlzVGVzdENhbGxfICYmIG1zZ1sxXSA9PSB0YWxrLm1lZGlhLkNvbW11bmljYXRpb25QbGF5ZXIuU2Vzc2lvbk1lc3NhZ2VfLkZVTExTQ1JFRU5fVVBHUkFERSkgewogICAgICAgIHZhciBjYWxsID0gdGhpcy5jYWxsTWFuYWdlcl8uZ2V0QWN0aXZlQ2FsbCgpLCBlID0gbmV3IHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSW5zdGFsbE5lZWRlZEV2ZW50KHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSW5zdGFsbE5lZWRlZFR5cGUuRlVMTFNDUkVFTl9VUEdSQURFX05FRURFRCwgITEsIGNhbGwucmVtb3RlSmlkc1swXSwgY2FsbC50eXBlID09IHRhbGsubWVkaWEuQ2FsbFR5cGUuVklERU8pOwogICAgICAgIHRoaXMuY2FsbE1hbmFnZXJfLmRpc3BhdGNoRXZlbnQoZSkKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLlJlY3ZNc2cuRkVFRF9ESVNQTEFZRUQ6CiAgICAgIHRoaXMubG9nZ2VyXy5pbmZvKCJmZWVkIGRpc3BsYXllZCBtZXNzYWdlIGZyb20gRmxhc2giKTsKICAgICAgdGhpcy5zdG9wVHJhY2VyXygpOwogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLlJlY3ZNc2cuTVVURV9TVEFURToKICAgICAgaWYoInMiID09IG1zZ1sxXSkgewogICAgICAgIHRoaXMubG9nZ2VyXy5pbmZvKCJzZXQgbXV0ZSBzdGF0ZSBmcm9tIEZsYXNoIChtdXRlZCA9ICIgKyBtc2dbMl0gKyAiKSIpLCB0aGlzLmNhbGxNYW5hZ2VyXy5zZXRNaWNyb3Bob25lTXV0ZSghIW1zZ1syXSkKICAgICAgfWVsc2UgewogICAgICAgIHZhciBtdXRlZCA9IHRoaXMuY2FsbE1hbmFnZXJfLmdldE1pY3JvcGhvbmVNdXRlKCk7CiAgICAgICAgdGhpcy5sb2dnZXJfLmluZm8oInJlcXVlc3QgZm9yIG11dGUgc3RhdGUgZnJvbSBGbGFzaCAobXV0ZWQgPSAiICsgbXV0ZWQgKyAiKSIpOwogICAgICAgIHRoaXMuc2VuZFRvUGxheWVyKHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5TZW5kTXNnLk1VVEVfU1RBVEUsIFsicyIsIG11dGVkXSkKICAgICAgfQogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiExCiAgfQogIHJldHVybiEwCn07CnRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuc3RvcFRyYWNlcl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDb21tdW5pY2F0aW9uUGxheWVyJCRzdG9wVHJhY2VyXyQoKSB7CiAgbnVsbCAhPSB0aGlzLnZpZGVvU3RhcnRUcmFjZV8gJiYgKGdvb2cuZGVidWcuVHJhY2Uuc3RvcFRyYWNlcih0aGlzLnZpZGVvU3RhcnRUcmFjZV8sIDApLCBkZWxldGUgdGhpcy52aWRlb1N0YXJ0VHJhY2VfLCB0aGlzLmxvZ2dlcl8uaW5mbyhnb29nLmRlYnVnLlRyYWNlLmdldEZvcm1hdHRlZFRyYWNlKCkpKQp9Owp0YWxrLm1lZGlhLkNvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLmdldFBhcnRpY2lwYW50QXJyYXlfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ29tbXVuaWNhdGlvblBsYXllciQkZ2V0UGFydGljaXBhbnRBcnJheV8kKHBhcnRpY2lwYW50cykgewogIGZvcih2YXIgaWRzID0gcGFydGljaXBhbnRzLmdldEtleXMoKSwgcGFydGljaXBhbnRBcnJheSA9IFtdLCBpID0gMDtpIDwgaWRzLmxlbmd0aDsrK2kpIHsKICAgIHZhciBwYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50cy5nZXQoaWRzW2ldKTsKICAgIGlmKHBhcnRpY2lwYW50LmlzTG9jYWwoKSkgewogICAgICBwYXJ0aWNpcGFudEFycmF5LnB1c2goW3BhcnRpY2lwYW50LmdldEppZCgpLCAhMCwgcGFydGljaXBhbnQuZ2V0QXZhdGFyKCldKTsKICAgICAgYnJlYWsKICAgIH0KICB9CiAgZm9yKGkgPSAwO2kgPCBpZHMubGVuZ3RoOysraSkgewogICAgaWYocGFydGljaXBhbnQgPSBwYXJ0aWNpcGFudHMuZ2V0KGlkc1tpXSksICFwYXJ0aWNpcGFudC5pc0xvY2FsKCkpIHsKICAgICAgcGFydGljaXBhbnRBcnJheS5wdXNoKFtwYXJ0aWNpcGFudC5nZXRKaWQoKSwgITEsIHBhcnRpY2lwYW50LmdldEF2YXRhcigpXSk7CiAgICAgIGJyZWFrCiAgICB9CiAgfQogIHJldHVybiBwYXJ0aWNpcGFudEFycmF5Cn07CnRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuZW5kQ2FsbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENvbW11bmljYXRpb25QbGF5ZXIkJGVuZENhbGwkKG9wdF9jYXVzZSwgb3B0X2RlYnVnSW5mbykgewogIHRoaXMuY2FsbE1hbmFnZXJfLmVuZENhbGwob3B0X2NhdXNlLCB0aGlzLnNlbmRlckppZF8sIHRoaXMuc2Vzc2lvbklkXywgb3B0X2RlYnVnSW5mbykKfTsKdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDb21tdW5pY2F0aW9uUGxheWVyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMuZXZlbnRIYW5kbGVyXy5kaXNwb3NlKCk7CiAgdGhpcy5jYWxsTWFuYWdlcl8gPSB0aGlzLmV2ZW50SGFuZGxlcl8gPSBudWxsOwogIHRoaXMucmVtb3ZlUGxheWVyKCk7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5FdmVudHMuRElTUE9TRUQpOwogIHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRNYXRlcmlhbCQoKSB7CiAgZ29vZy5EaXNwb3NhYmxlLmNhbGwodGhpcykKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbCwgZ29vZy5EaXNwb3NhYmxlKTsKdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwzRCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRNYXRlcmlhbDNEJChtYXRlcmlhbCwgdGV4U2FtcGxlciwgdGV4QnVmZmVyLCB0ZXhDb29yZEZpZWxkKSB7CiAgdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwuY2FsbCh0aGlzKTsKICB0aGlzLm1hdGVyaWFsXyA9IG1hdGVyaWFsOwogIHRoaXMudGV4U2FtcGxlcl8gPSB0ZXhTYW1wbGVyOwogIHRoaXMudGV4QnVmZmVyXyA9IHRleEJ1ZmZlcjsKICB0aGlzLnRleENvb3JkRmllbGRfID0gdGV4Q29vcmRGaWVsZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLk1hdGVyaWFsM0QsIHRhbGsubWVkaWEuYzNkLk1hdGVyaWFsKTsKdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwzRC5wcm90b3R5cGUuZ2V0TWF0ZXJpYWxPYmplY3QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTWF0ZXJpYWwzRCQkZ2V0TWF0ZXJpYWxPYmplY3QkKCkgewogIHJldHVybiB0aGlzLm1hdGVyaWFsXy5nZXRPYmplY3QoKQp9Owp0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbDNELnByb3RvdHlwZS5nZXRUZXhDb29yZEZpZWxkT2JqZWN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE1hdGVyaWFsM0QkJGdldFRleENvb3JkRmllbGRPYmplY3QkKCkgewogIHJldHVybiB0aGlzLnRleENvb3JkRmllbGRfLmdldE9iamVjdCgpCn07CnRhbGsubWVkaWEuYzNkLk1hdGVyaWFsM0QucHJvdG90eXBlLnNldFRleHR1cmUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTWF0ZXJpYWwzRCQkc2V0VGV4dHVyZSQodGV4dHVyZSwgZW1iV2lkdGgsIGVtYkhlaWdodCwgbWlycm9yWCwgbWlycm9yWSkgewogIHZhciB0ZXhDb29yZHMgPSB0YWxrLm1lZGlhLmMzZC5jb21wdXRlVGV4dHVyZUNvb3JkcyhlbWJXaWR0aCwgZW1iSGVpZ2h0LCB0ZXh0dXJlLndpZHRoLCB0ZXh0dXJlLmhlaWdodCwgbWlycm9yWCwgbWlycm9yWSk7CiAgdGhpcy50ZXhTYW1wbGVyXy5zZXQoInRleHR1cmUiLCB0ZXh0dXJlKTsKICB0aGlzLnRleEJ1ZmZlcl8uaW52b2tlKCJzZXQiLCB0ZXhDb29yZHMpCn07CnRhbGsubWVkaWEuYzNkLk1hdGVyaWFsM0QucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRNYXRlcmlhbDNEJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMudGV4Q29vcmRGaWVsZF8gJiYgKHRoaXMudGV4Q29vcmRGaWVsZF8uZGlzcG9zZSgpLCB0aGlzLnRleENvb3JkRmllbGRfID0gbnVsbCk7CiAgdGhpcy50ZXhCdWZmZXJfICYmICh0aGlzLnRleEJ1ZmZlcl8uZGlzcG9zZSgpLCB0aGlzLnRleEJ1ZmZlcl8gPSBudWxsKTsKICB0aGlzLnRleFNhbXBsZXJfICYmICh0aGlzLnRleFNhbXBsZXJfLmRpc3Bvc2UoKSwgdGhpcy50ZXhTYW1wbGVyXyA9IG51bGwpOwogIHRoaXMubWF0ZXJpYWxfICYmICh0aGlzLm1hdGVyaWFsXy5zZXQoImRyYXdMaXN0IiwgbnVsbCksIHRoaXMubWF0ZXJpYWxfLmRpc3Bvc2UoKSwgdGhpcy5tYXRlcmlhbF8gPSBudWxsKTsKICB0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbDNELnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpCn07CnRhbGsubWVkaWEuUmVuZGVyaW5nQXBpID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUmVuZGVyaW5nQXBpJCgpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuUmVuZGVyaW5nQXBpLCBnb29nLkRpc3Bvc2FibGUpOwp0YWxrLm1lZGlhLmMzZC5PWGRSZW5kZXJpbmdBcGkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkT1hkUmVuZGVyaW5nQXBpJChvM2RCdW5kbGUpIHsKICB0YWxrLm1lZGlhLlJlbmRlcmluZ0FwaS5jYWxsKHRoaXMpOwogIHRoaXMubzNkQnVuZGxlID0gbzNkQnVuZGxlCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuT1hkUmVuZGVyaW5nQXBpLCB0YWxrLm1lZGlhLlJlbmRlcmluZ0FwaSk7CnRhbGsubWVkaWEuYzNkLk9YZFJlbmRlcmluZ0FwaS5wcm90b3R5cGUuZ2V0QmFja2VuZE5hbWUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkT1hkUmVuZGVyaW5nQXBpJCRnZXRCYWNrZW5kTmFtZSQoKSB7CiAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5vM2RCdW5kbGUub1hkR2xvYmFscy5iYWNrZW5kKSkgewogICAgc3dpdGNoKHRoaXMubzNkQnVuZGxlLm9YZEdsb2JhbHMuYmFja2VuZCkgewogICAgICBjYXNlIHRoaXMubzNkQnVuZGxlLm9YZEdsb2JhbHMuQ0dfR0wyOgogICAgICAgIHJldHVybiJDZy9HTDIiOwogICAgICBjYXNlIHRoaXMubzNkQnVuZGxlLm9YZEdsb2JhbHMuRDNEOToKICAgICAgICByZXR1cm4iRGlyZWN0M0Q5IjsKICAgICAgY2FzZSB0aGlzLm8zZEJ1bmRsZS5vWGRHbG9iYWxzLkdMMjoKICAgICAgICByZXR1cm4iR0wyIjsKICAgICAgY2FzZSB0aGlzLm8zZEJ1bmRsZS5vWGRHbG9iYWxzLkdMRVMyOgogICAgICAgIHJldHVybiJHTEVTMiI7CiAgICAgIGNhc2UgdGhpcy5vM2RCdW5kbGUub1hkR2xvYmFscy5DQUlST19QSVhNQU46CiAgICAgICAgcmV0dXJuIkNhaXJvL1BpeG1hbiI7CiAgICAgIGNhc2UgdGhpcy5vM2RCdW5kbGUub1hkR2xvYmFscy5DQUlST19XSU4zMjoKICAgICAgICByZXR1cm4iQ2Fpcm8vV2luMzIiOwogICAgICBjYXNlIHRoaXMubzNkQnVuZGxlLm9YZEdsb2JhbHMuQ0FJUk9fUVVBUlRaOgogICAgICAgIHJldHVybiJDYWlyby9RdWFydHoiOwogICAgICBjYXNlIHRoaXMubzNkQnVuZGxlLm9YZEdsb2JhbHMuQ0FJUk9fWExJQjoKICAgICAgICByZXR1cm4iQ2Fpcm8vWGxpYiIKICAgIH0KICB9CiAgcmV0dXJuIlVua25vd24iCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0M0QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVPYmplY3QzRCQodHJhbnNmb3JtLCBzY2FsZVRyYW5zZm9ybSwgYWxwaGEsIHZlcnRleEJ1ZmZlciwgc3RyZWFtQmFuaykgewogIHRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0LmNhbGwodGhpcyk7CiAgdGhpcy50cmFuc2Zvcm1fID0gdHJhbnNmb3JtOwogIHRoaXMuc2NhbGVUcmFuc2Zvcm1fID0gc2NhbGVUcmFuc2Zvcm07CiAgdGhpcy5hbHBoYVBhcmFtXyA9IGFscGhhOwogIHRoaXMudmVydGV4QnVmZmVyXyA9IHZlcnRleEJ1ZmZlcjsKICB0aGlzLnN0cmVhbUJhbmtfID0gc3RyZWFtQmFuawp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0M0QsIHRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0KTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlQXR0cnMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVPYmplY3QzRCQkdXBkYXRlQXR0cnMkKGF0dHJzKSB7CiAgdmFyIHggPSBNYXRoLnJvdW5kKGF0dHJzLngpLCB5ID0gTWF0aC5yb3VuZChhdHRycy55KSwgdyA9IE1hdGgucm91bmQoYXR0cnMudyArIGF0dHJzLnggLSB4KSwgaCA9IE1hdGgucm91bmQoYXR0cnMuaCArIGF0dHJzLnkgLSB5KTsKICB0aGlzLnNjYWxlVHJhbnNmb3JtXy5pbnZva2UoImlkZW50aXR5Iik7CiAgdGhpcy5zY2FsZVRyYW5zZm9ybV8uaW52b2tlKCJzY2FsZSIsIHcsIGgsIDApOwogIHRoaXMudHJhbnNmb3JtXy5pbnZva2UoImlkZW50aXR5Iik7CiAgdGhpcy50cmFuc2Zvcm1fLmludm9rZSgidHJhbnNsYXRlIiwgeCwgeSwgYXR0cnMueikKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlQWxwaGEgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVPYmplY3QzRCQkdXBkYXRlQWxwaGEkKHZhbHVlKSB7CiAgdGhpcy5hbHBoYVBhcmFtXy5zZXQoInZhbHVlIiwgdmFsdWUpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZVZpc2libGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVPYmplY3QzRCQkdXBkYXRlVmlzaWJsZSQodmlzaWJsZSkgewogIHRoaXMudHJhbnNmb3JtXy5zZXQoInZpc2libGUiLCB2aXNpYmxlKQp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdDNELnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1PYmplY3QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVPYmplY3QzRCQkZ2V0VHJhbnNmb3JtT2JqZWN0JCgpIHsKICByZXR1cm4gdGhpcy50cmFuc2Zvcm1fLmdldE9iamVjdCgpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0M0QucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU9iamVjdDNEJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMuc3RyZWFtQmFua18gJiYgKHRoaXMuc3RyZWFtQmFua18uZGlzcG9zZSgpLCB0aGlzLnN0cmVhbUJhbmtfID0gbnVsbCk7CiAgdGhpcy52ZXJ0ZXhCdWZmZXJfICYmICh0aGlzLnZlcnRleEJ1ZmZlcl8uZGlzcG9zZSgpLCB0aGlzLnZlcnRleEJ1ZmZlcl8gPSBudWxsKTsKICB0aGlzLmFscGhhUGFyYW1fICYmICh0aGlzLmFscGhhUGFyYW1fLmRpc3Bvc2UoKSwgdGhpcy5hbHBoYVBhcmFtXyA9IG51bGwpOwogIHRoaXMuc2NhbGVUcmFuc2Zvcm1fICYmICh0aGlzLnNjYWxlVHJhbnNmb3JtXy5zZXQoInBhcmVudCIsIG51bGwpLCB0aGlzLnNjYWxlVHJhbnNmb3JtXy5kaXNwb3NlKCksIHRoaXMuc2NhbGVUcmFuc2Zvcm1fID0gbnVsbCk7CiAgdGhpcy50cmFuc2Zvcm1fICYmICh0aGlzLnRyYW5zZm9ybV8uc2V0KCJwYXJlbnQiLCBudWxsKSwgdGhpcy50cmFuc2Zvcm1fLmRpc3Bvc2UoKSwgdGhpcy50cmFuc2Zvcm1fID0gbnVsbCk7CiAgdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QzRC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLmMzZC5WaWV3M0QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkVmlldzNEJChlZmZlY3QsIHRyYW5zZm9ybSwgdmlld3BvcnQsIGNsZWFyQnVmZmVyLCBkcmF3TGlzdCwgdHJlZVRyYXZlcnNhbCwgc3RhdGVTZXQsIHN0YXRlLCBkcmF3UGFzcykgewogIHRhbGsubWVkaWEuYzNkLlZpZXcuY2FsbCh0aGlzKTsKICB0aGlzLmVmZmVjdF8gPSBlZmZlY3Q7CiAgdGhpcy50cmFuc2Zvcm1fID0gdHJhbnNmb3JtOwogIHRoaXMudmlld3BvcnRfID0gdmlld3BvcnQ7CiAgdGhpcy5jbGVhckJ1ZmZlcl8gPSBjbGVhckJ1ZmZlcjsKICB0aGlzLmRyYXdMaXN0XyA9IGRyYXdMaXN0OwogIHRoaXMudHJlZVRyYXZlcnNhbF8gPSB0cmVlVHJhdmVyc2FsOwogIHRoaXMuc3RhdGVTZXRfID0gc3RhdGVTZXQ7CiAgdGhpcy5zdGF0ZV8gPSBzdGF0ZTsKICB0aGlzLmRyYXdQYXNzXyA9IGRyYXdQYXNzCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuVmlldzNELCB0YWxrLm1lZGlhLmMzZC5WaWV3KTsKdGFsay5tZWRpYS5jM2QuVmlldzNELnByb3RvdHlwZS5nZXRFZmZlY3RPYmplY3QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkVmlldzNEJCRnZXRFZmZlY3RPYmplY3QkKCkgewogIHJldHVybiB0aGlzLmVmZmVjdF8uZ2V0T2JqZWN0KCkKfTsKdGFsay5tZWRpYS5jM2QuVmlldzNELnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1PYmplY3QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkVmlldzNEJCRnZXRUcmFuc2Zvcm1PYmplY3QkKCkgewogIHJldHVybiB0aGlzLnRyYW5zZm9ybV8uZ2V0T2JqZWN0KCkKfTsKdGFsay5tZWRpYS5jM2QuVmlldzNELnByb3RvdHlwZS5nZXREcmF3TGlzdE9iamVjdCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRWaWV3M0QkJGdldERyYXdMaXN0T2JqZWN0JCgpIHsKICByZXR1cm4gdGhpcy5kcmF3TGlzdF8uZ2V0T2JqZWN0KCkKfTsKdGFsay5tZWRpYS5jM2QuVmlldzNELnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkVmlldzNEJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMuZHJhd1Bhc3NfICYmICh0aGlzLmRyYXdQYXNzXy5zZXQoImRyYXdMaXN0IiwgbnVsbCksIHRoaXMuZHJhd1Bhc3NfLnNldCgicGFyZW50IiwgbnVsbCksIHRoaXMuZHJhd1Bhc3NfLmRpc3Bvc2UoKSwgdGhpcy5kcmF3UGFzc18gPSBudWxsKTsKICB0aGlzLnN0YXRlXyAmJiAodGhpcy5zdGF0ZV8uZGlzcG9zZSgpLCB0aGlzLnN0YXRlXyA9IG51bGwpOwogIHRoaXMuc3RhdGVTZXRfICYmICh0aGlzLnN0YXRlU2V0Xy5zZXQoInN0YXRlIiwgbnVsbCksIHRoaXMuc3RhdGVTZXRfLmRpc3Bvc2UoKSwgdGhpcy5zdGF0ZVNldF8gPSBudWxsKTsKICB0aGlzLnRyZWVUcmF2ZXJzYWxfICYmICh0aGlzLnRyZWVUcmF2ZXJzYWxfLnNldCgicGFyZW50IiwgbnVsbCksIHRoaXMudHJlZVRyYXZlcnNhbF8uZGlzcG9zZSgpLCB0aGlzLnRyZWVUcmF2ZXJzYWxfID0gbnVsbCk7CiAgdGhpcy5kcmF3TGlzdF8gJiYgKHRoaXMuZHJhd0xpc3RfLmRpc3Bvc2UoKSwgdGhpcy5kcmF3TGlzdF8gPSBudWxsKTsKICB0aGlzLmNsZWFyQnVmZmVyXyAmJiAodGhpcy5jbGVhckJ1ZmZlcl8uc2V0KCJwYXJlbnQiLCBudWxsKSwgdGhpcy5jbGVhckJ1ZmZlcl8uZGlzcG9zZSgpLCB0aGlzLmNsZWFyQnVmZmVyXyA9IG51bGwpOwogIHRoaXMudmlld3BvcnRfICYmICh0aGlzLnZpZXdwb3J0Xy5zZXQoInBhcmVudCIsIG51bGwpLCB0aGlzLnZpZXdwb3J0Xy5kaXNwb3NlKCksIHRoaXMudmlld3BvcnRfID0gbnVsbCk7CiAgdGhpcy50cmFuc2Zvcm1fICYmICh0aGlzLnRyYW5zZm9ybV8uc2V0KCJwYXJlbnQiLCBudWxsKSwgdGhpcy50cmFuc2Zvcm1fLmRpc3Bvc2UoKSwgdGhpcy50cmFuc2Zvcm1fID0gbnVsbCk7CiAgdGhpcy5lZmZlY3RfICYmICh0aGlzLmVmZmVjdF8uZGlzcG9zZSgpLCB0aGlzLmVmZmVjdF8gPSBudWxsKTsKICB0YWxrLm1lZGlhLmMzZC5WaWV3M0Quc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKZ29vZy5zdHJpbmcuZm9ybWF0ID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGZvcm1hdCQoZm9ybWF0U3RyaW5nLCB2YXJfYXJncykgewogIGZ1bmN0aW9uIHJlcGxhY2VyRGVtdXhlcihtYXRjaCwgZmxhZ3MsIHdpZHRoLCBkb3RwLCBwcmVjaXNpb24sIHR5cGUsIG9mZnNldCwgd2hvbGVTdHJpbmcpIHsKICAgIGlmKCIlIiA9PSB0eXBlKSB7CiAgICAgIHJldHVybiIlIgogICAgfQogICAgdmFyIHZhbHVlID0gYXJncy5zaGlmdCgpOwogICAgaWYoInVuZGVmaW5lZCIgPT0gdHlwZW9mIHZhbHVlKSB7CiAgICAgIHRocm93IEVycm9yKCJbZ29vZy5zdHJpbmcuZm9ybWF0XSBOb3QgZW5vdWdoIGFyZ3VtZW50cyIpOwogICAgfQogICAgYXJndW1lbnRzWzBdID0gdmFsdWU7CiAgICByZXR1cm4gZ29vZy5zdHJpbmcuZm9ybWF0LmRlbXV4ZXNfW3R5cGVdLmFwcGx5KG51bGwsIGFyZ3VtZW50cykKICB9CiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLCB0ZW1wbGF0ZSA9IGFyZ3Muc2hpZnQoKTsKICBpZigidW5kZWZpbmVkIiA9PSB0eXBlb2YgdGVtcGxhdGUpIHsKICAgIHRocm93IEVycm9yKCJbZ29vZy5zdHJpbmcuZm9ybWF0XSBUZW1wbGF0ZSByZXF1aXJlZCIpOwogIH0KICB2YXIgZm9ybWF0UmUgPSAvJShbMFwtXCBcK10qKShcZCspPyhcLihcZCspKT8oWyVzZmRpdV0pL2c7CiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoZm9ybWF0UmUsIHJlcGxhY2VyRGVtdXhlcikKfTsKZ29vZy5zdHJpbmcuZm9ybWF0LmRlbXV4ZXNfID0ge307Cmdvb2cuc3RyaW5nLmZvcm1hdC5kZW11eGVzXy5zID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGZvcm1hdCRkZW11eGVzXyRzJCh2YWx1ZSwgZmxhZ3MsIHdpZHRoKSB7CiAgdmFyIHJlcGxhY2VtZW50ID0gdmFsdWU7CiAgcmV0dXJuIGlzTmFOKHdpZHRoKSB8fCAiIiA9PSB3aWR0aCB8fCByZXBsYWNlbWVudC5sZW5ndGggPj0gd2lkdGggPyByZXBsYWNlbWVudCA6IHJlcGxhY2VtZW50ID0gLTEgPCBmbGFncy5pbmRleE9mKCItIiwgMCkgPyByZXBsYWNlbWVudCArIGdvb2cuc3RyaW5nLnJlcGVhdCgiICIsIHdpZHRoIC0gcmVwbGFjZW1lbnQubGVuZ3RoKSA6IGdvb2cuc3RyaW5nLnJlcGVhdCgiICIsIHdpZHRoIC0gcmVwbGFjZW1lbnQubGVuZ3RoKSArIHJlcGxhY2VtZW50Cn07Cmdvb2cuc3RyaW5nLmZvcm1hdC5kZW11eGVzXy5mID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJGZvcm1hdCRkZW11eGVzXyRmJCh2YWx1ZSwgZmxhZ3MsIHdpZHRoLCBkb3RwLCBwcmVjaXNpb24pIHsKICB2YXIgcmVwbGFjZW1lbnQgPSB2YWx1ZS50b1N0cmluZygpOwogIGlzTmFOKHByZWNpc2lvbikgfHwgIiIgPT0gcHJlY2lzaW9uIHx8IChyZXBsYWNlbWVudCA9IHZhbHVlLnRvRml4ZWQocHJlY2lzaW9uKSk7CiAgdmFyIHNpZ247CiAgc2lnbiA9IDAgPiB2YWx1ZSA/ICItIiA6IDAgPD0gZmxhZ3MuaW5kZXhPZigiKyIpID8gIisiIDogMCA8PSBmbGFncy5pbmRleE9mKCIgIikgPyAiICIgOiAiIjsKICAwIDw9IHZhbHVlICYmIChyZXBsYWNlbWVudCA9IHNpZ24gKyByZXBsYWNlbWVudCk7CiAgaWYoaXNOYU4od2lkdGgpIHx8IHJlcGxhY2VtZW50Lmxlbmd0aCA+PSB3aWR0aCkgewogICAgcmV0dXJuIHJlcGxhY2VtZW50CiAgfQogIHZhciByZXBsYWNlbWVudCA9IGlzTmFOKHByZWNpc2lvbikgPyBNYXRoLmFicyh2YWx1ZSkudG9TdHJpbmcoKSA6IE1hdGguYWJzKHZhbHVlKS50b0ZpeGVkKHByZWNpc2lvbiksIHBhZENvdW50ID0gd2lkdGggLSByZXBsYWNlbWVudC5sZW5ndGggLSBzaWduLmxlbmd0aDsKICBpZigwIDw9IGZsYWdzLmluZGV4T2YoIi0iLCAwKSkgewogICAgcmVwbGFjZW1lbnQgPSBzaWduICsgcmVwbGFjZW1lbnQgKyBnb29nLnN0cmluZy5yZXBlYXQoIiAiLCBwYWRDb3VudCkKICB9ZWxzZSB7CiAgICB2YXIgcGFkZGluZ0NoYXIgPSAwIDw9IGZsYWdzLmluZGV4T2YoIjAiLCAwKSA/ICIwIiA6ICIgIiwgcmVwbGFjZW1lbnQgPSBzaWduICsgZ29vZy5zdHJpbmcucmVwZWF0KHBhZGRpbmdDaGFyLCBwYWRDb3VudCkgKyByZXBsYWNlbWVudAogIH0KICByZXR1cm4gcmVwbGFjZW1lbnQKfTsKZ29vZy5zdHJpbmcuZm9ybWF0LmRlbXV4ZXNfLmQgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckZm9ybWF0JGRlbXV4ZXNfJGQkKHZhbHVlLCBmbGFncywgd2lkdGgsIGRvdHAsIHByZWNpc2lvbiwgdHlwZSwgb2Zmc2V0LCB3aG9sZVN0cmluZykgewogIHJldHVybiBnb29nLnN0cmluZy5mb3JtYXQuZGVtdXhlc18uZihwYXJzZUludCh2YWx1ZSwgMTApLCBmbGFncywgd2lkdGgsIGRvdHAsIDAsIHR5cGUsIG9mZnNldCwgd2hvbGVTdHJpbmcpCn07Cmdvb2cuc3RyaW5nLmZvcm1hdC5kZW11eGVzXy5pID0gZ29vZy5zdHJpbmcuZm9ybWF0LmRlbXV4ZXNfLmQ7Cmdvb2cuc3RyaW5nLmZvcm1hdC5kZW11eGVzXy51ID0gZ29vZy5zdHJpbmcuZm9ybWF0LmRlbXV4ZXNfLmQ7CnRhbGsubWVkaWEuTzNkSGFyZHdhcmVSZW5kZXJpbmdBcGkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRPM2RIYXJkd2FyZVJlbmRlcmluZ0FwaSQobzNkQnVuZGxlLCBkcmF3Q29udGV4dCwgb3BhcXVlRWZmZWN0LCB0cmFuc3BhcmVudEVmZmVjdCkgewogIHRhbGsubWVkaWEuYzNkLk9YZFJlbmRlcmluZ0FwaS5jYWxsKHRoaXMsIG8zZEJ1bmRsZSk7CiAgdGhpcy5kcmF3Q29udGV4dF8gPSBkcmF3Q29udGV4dDsKICB0aGlzLm9wYXF1ZUVmZmVjdF8gPSBvcGFxdWVFZmZlY3Q7CiAgdGhpcy50cmFuc3BhcmVudEVmZmVjdF8gPSB0cmFuc3BhcmVudEVmZmVjdDsKICB0aGlzLmJvdW5kT25SZXNpemVfID0gZ29vZy5iaW5kKHRoaXMub25SZXNpemVfLCB0aGlzKTsKICB0YWxrLm1lZGlhLmMzZC5hZGRFdmVudENhbGxiYWNrKHRoaXMubzNkQnVuZGxlLmMzZE9iamVjdC5nZXRQbHVnaW4oKSwgInJlc2l6ZSIsIHRoaXMuYm91bmRPblJlc2l6ZV8pOwogIHRoaXMub25SZXNpemVfKG51bGwpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5PM2RIYXJkd2FyZVJlbmRlcmluZ0FwaSwgdGFsay5tZWRpYS5jM2QuT1hkUmVuZGVyaW5nQXBpKTsKdGFsay5tZWRpYS5PM2RIYXJkd2FyZVJlbmRlcmluZ0FwaS5FRkZFQ1RfU1RSSU5HX1RFTVBMQVRFX0NHXyA9ICJzYW1wbGVyIHRleFNhbXBsZXIwO2Zsb2F0NHg0IHdvcmxkVmlld1Byb2ogOiBXT1JMRFZJRVdQUk9KRUNUSU9OO2Zsb2F0IGFscGhhO3N0cnVjdCBhMnYge2Zsb2F0NCBwb3MgOiBQT1NJVElPTjtmbG9hdDIgdGV4IDogVEVYQ09PUkQwO307c3RydWN0IHYyZiB7ZmxvYXQ0IHBvcyA6IFBPU0lUSU9OO2Zsb2F0MiB0ZXggOiBURVhDT09SRDA7fTt2MmYgdnNNYWluKGEydiBJTikge3YyZiBPVVQ7T1VULnBvcyA9IG11bChJTi5wb3MsIHdvcmxkVmlld1Byb2opO09VVC50ZXggPSBJTi50ZXg7cmV0dXJuIE9VVDt9ZmxvYXQ0IHBzTWFpbih2MmYgSU4pIDogQ09MT1IgeyVzfVxuLy8gI28zZCBWZXJ0ZXhTaGFkZXJFbnRyeVBvaW50IHZzTWFpblxuLy8gI28zZCBQaXhlbFNoYWRlckVudHJ5UG9pbnQgcHNNYWluXG4vLyAjbzNkIE1hdHJpeExvYWRPcmRlciBSb3dNYWpvclxuIjsKdGFsay5tZWRpYS5PM2RIYXJkd2FyZVJlbmRlcmluZ0FwaS5QSVhFTF9TSEFERVJfT1BBUVVFX0NHXyA9ICJyZXR1cm4gdGV4MkQodGV4U2FtcGxlcjAsIElOLnRleCkgKiBhbHBoYTsiOwp0YWxrLm1lZGlhLk8zZEhhcmR3YXJlUmVuZGVyaW5nQXBpLlBJWEVMX1NIQURFUl9UUkFOU1BBUkVOVF9DR18gPSAiZmxvYXQ0IHBpeGVsID0gdGV4MkQodGV4U2FtcGxlcjAsIElOLnRleCk7cmV0dXJuIGZsb2F0NChwaXhlbC5yZ2IsIHBpeGVsLmEgKiBhbHBoYSk7IjsKdGFsay5tZWRpYS5PM2RIYXJkd2FyZVJlbmRlcmluZ0FwaS5FRkZFQ1RfU1RSSU5HX1RFTVBMQVRFX0dMU0xfID0gInVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uO1xuYXR0cmlidXRlIHZlYzQgcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjMiB0ZXhjb29yZHMwO1xudmFyeWluZyB2ZWMyIHV2cztcbnZvaWQgbWFpbigpIHtcbiAgZ2xfUG9zaXRpb24gPSB3b3JsZFZpZXdQcm9qZWN0aW9uICogcG9zaXRpb247XG4gIHV2cyA9IHRleGNvb3JkczA7XG59XG4vLyAjbzNkIFNwbGl0TWFya2VyXG4vLyAjbzNkIE1hdHJpeExvYWRPcmRlciBSb3dNYWpvclxudW5pZm9ybSBzYW1wbGVyMkQgdGV4U2FtcGxlcjA7XG51bmlmb3JtIGZsb2F0IGFscGhhO1xudmFyeWluZyB2ZWMyIHV2cztcbnZvaWQgbWFpbigpIHtcbiVzfVxuIjsKdGFsay5tZWRpYS5PM2RIYXJkd2FyZVJlbmRlcmluZ0FwaS5QSVhFTF9TSEFERVJfT1BBUVVFX0dMU0xfID0gIiAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleFNhbXBsZXIwLCB1dnMpICogYWxwaGE7XG4iOwp0YWxrLm1lZGlhLk8zZEhhcmR3YXJlUmVuZGVyaW5nQXBpLlBJWEVMX1NIQURFUl9UUkFOU1BBUkVOVF9HTFNMXyA9ICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyMCwgdXZzKSAqIGFscGhhO1xuIjsKdGFsay5tZWRpYS5PM2RIYXJkd2FyZVJlbmRlcmluZ0FwaS5jcmVhdGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRPM2RIYXJkd2FyZVJlbmRlcmluZ0FwaSRjcmVhdGUkKG8zZEJ1bmRsZSkgewogIHZhciBkcmF3Q29udGV4dCA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS5jcmVhdGVPYmplY3QobzNkQnVuZGxlLnBhY2ssICJEcmF3Q29udGV4dCIpOwogIGRyYXdDb250ZXh0LnNldCgidmlldyIsIHRhbGsubWVkaWEuYzNkLmNyZWF0ZUxvb2tBdE1hdHJpeChbMCwgMCwgNTBdLCBbMCwgMCwgMF0sIFswLCAxLCAwXSkpOwogIHZhciBlZmZlY3RTdHJpbmdUZW1wbGF0ZSwgcGl4ZWxTaGFkZXJPcGFxdWUsIHBpeGVsU2hhZGVyVHJhbnNwYXJlbnQ7CiAgbzNkQnVuZGxlLmMzZE9iamVjdC5nZXRQbHVnaW4oKS5jbGllbnQuY2xpZW50SW5mby5nbHNsID8gKGVmZmVjdFN0cmluZ1RlbXBsYXRlID0gdGFsay5tZWRpYS5PM2RIYXJkd2FyZVJlbmRlcmluZ0FwaS5FRkZFQ1RfU1RSSU5HX1RFTVBMQVRFX0dMU0xfLCBwaXhlbFNoYWRlck9wYXF1ZSA9IHRhbGsubWVkaWEuTzNkSGFyZHdhcmVSZW5kZXJpbmdBcGkuUElYRUxfU0hBREVSX09QQVFVRV9HTFNMXywgcGl4ZWxTaGFkZXJUcmFuc3BhcmVudCA9IHRhbGsubWVkaWEuTzNkSGFyZHdhcmVSZW5kZXJpbmdBcGkuUElYRUxfU0hBREVSX1RSQU5TUEFSRU5UX0dMU0xfKSA6IChlZmZlY3RTdHJpbmdUZW1wbGF0ZSA9IHRhbGsubWVkaWEuTzNkSGFyZHdhcmVSZW5kZXJpbmdBcGkuRUZGRUNUX1NUUklOR19URU1QTEFURV9DR18sIHBpeGVsU2hhZGVyT3BhcXVlID0gdGFsay5tZWRpYS5PM2RIYXJkd2FyZVJlbmRlcmluZ0FwaS5QSVhFTF9TSEFERVJfT1BBUVVFX0NHXywgcGl4ZWxTaGFkZXJUcmFuc3BhcmVudCA9IAogIHRhbGsubWVkaWEuTzNkSGFyZHdhcmVSZW5kZXJpbmdBcGkuUElYRUxfU0hBREVSX1RSQU5TUEFSRU5UX0NHXyk7CiAgdmFyIGVmZmVjdFN0cmluZ09wYXF1ZSA9IGdvb2cuc3RyaW5nLmZvcm1hdChlZmZlY3RTdHJpbmdUZW1wbGF0ZSwgcGl4ZWxTaGFkZXJPcGFxdWUpLCBlZmZlY3RTdHJpbmdUcmFuc3BhcmVudCA9IGdvb2cuc3RyaW5nLmZvcm1hdChlZmZlY3RTdHJpbmdUZW1wbGF0ZSwgcGl4ZWxTaGFkZXJUcmFuc3BhcmVudCksIG9wYXF1ZUVmZmVjdCA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS5jcmVhdGVPYmplY3QobzNkQnVuZGxlLnBhY2ssICJFZmZlY3QiKTsKICBvcGFxdWVFZmZlY3QuaW52b2tlKCJsb2FkRnJvbUZYU3RyaW5nIiwgZWZmZWN0U3RyaW5nT3BhcXVlKTsKICB2YXIgdHJhbnNwYXJlbnRFZmZlY3QgPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0KG8zZEJ1bmRsZS5wYWNrLCAiRWZmZWN0Iik7CiAgdHJhbnNwYXJlbnRFZmZlY3QuaW52b2tlKCJsb2FkRnJvbUZYU3RyaW5nIiwgZWZmZWN0U3RyaW5nVHJhbnNwYXJlbnQpOwogIHJldHVybiBuZXcgdGFsay5tZWRpYS5PM2RIYXJkd2FyZVJlbmRlcmluZ0FwaShvM2RCdW5kbGUsIGRyYXdDb250ZXh0LCBvcGFxdWVFZmZlY3QsIHRyYW5zcGFyZW50RWZmZWN0KQp9Owp0YWxrLm1lZGlhLk8zZEhhcmR3YXJlUmVuZGVyaW5nQXBpLnByb3RvdHlwZS5nZXRJbXBsZW1lbnRhdGlvbk5hbWUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRPM2RIYXJkd2FyZVJlbmRlcmluZ0FwaSQkZ2V0SW1wbGVtZW50YXRpb25OYW1lJCgpIHsKICByZXR1cm4iTzNEIgp9Owp0YWxrLm1lZGlhLk8zZEhhcmR3YXJlUmVuZGVyaW5nQXBpLnByb3RvdHlwZS5jcmVhdGVWaWV3ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTzNkSGFyZHdhcmVSZW5kZXJpbmdBcGkkJGNyZWF0ZVZpZXckKHByaW9yaXR5LCB0cmFuc3BhcmVudCwgb3B0X3NjZW5lT2JqZWN0LCBvcHRfYmFja2dyb3VuZENvbG9yKSB7CiAgdmFyIGVmZmVjdDsKICBlZmZlY3QgPSB0cmFuc3BhcmVudCA/IHRoaXMudHJhbnNwYXJlbnRFZmZlY3RfIDogdGhpcy5vcGFxdWVFZmZlY3RfOwogIHZhciBwYXJlbnRUcmFuc2Zvcm1PYmplY3Q7CiAgaWYob3B0X3NjZW5lT2JqZWN0KSB7CiAgICBpZighKG9wdF9zY2VuZU9iamVjdCBpbnN0YW5jZW9mIHRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0M0QpKSB7CiAgICAgIHJldHVybiBudWxsCiAgICB9CiAgICBwYXJlbnRUcmFuc2Zvcm1PYmplY3QgPSBvcHRfc2NlbmVPYmplY3QuZ2V0VHJhbnNmb3JtT2JqZWN0KCkKICB9CiAgdmFyIGJhY2tncm91bmRDb2xvciA9IG9wdF9iYWNrZ3JvdW5kQ29sb3IgfHwgWzAsIDAsIDAsIDFdLCBjM2QgPSB0aGlzLm8zZEJ1bmRsZS5jM2RPYmplY3QuZ2V0UGx1Z2luKCksIHBhY2sgPSB0aGlzLm8zZEJ1bmRsZS5wYWNrLCB0cmFuc2Zvcm0gPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0KHBhY2ssICJUcmFuc2Zvcm0iKTsKICBwYXJlbnRUcmFuc2Zvcm1PYmplY3QgJiYgdHJhbnNmb3JtLnNldCgicGFyZW50IiwgcGFyZW50VHJhbnNmb3JtT2JqZWN0KTsKICB2YXIgdmlld3BvcnQgPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0KHBhY2ssICJWaWV3cG9ydCIpOwogIHZpZXdwb3J0LnNldCgicHJpb3JpdHkiLCBwcmlvcml0eSk7CiAgdmlld3BvcnQuc2V0KCJwYXJlbnQiLCBjM2QuY2xpZW50LnJlbmRlckdyYXBoUm9vdCk7CiAgdmFyIGNoaWxkUHJpb3JpdHkgPSAwLCBjbGVhckJ1ZmZlciA9IG51bGw7CiAgdHJhbnNwYXJlbnQgfHwgKGNsZWFyQnVmZmVyID0gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLmNyZWF0ZU9iamVjdChwYWNrLCAiQ2xlYXJCdWZmZXIiKSwgY2xlYXJCdWZmZXIuc2V0KCJjbGVhckNvbG9yIiwgYmFja2dyb3VuZENvbG9yKSwgY2xlYXJCdWZmZXIuc2V0KCJwcmlvcml0eSIsIGNoaWxkUHJpb3JpdHkrKyksIGNsZWFyQnVmZmVyLnNldCgicGFyZW50Iiwgdmlld3BvcnQuZ2V0T2JqZWN0KCkpKTsKICB2YXIgZHJhd0xpc3QgPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0KHBhY2ssICJEcmF3TGlzdCIpLCB0cmVlVHJhdmVyc2FsID0gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLmNyZWF0ZU9iamVjdChwYWNrLCAiVHJlZVRyYXZlcnNhbCIpOwogIHRyZWVUcmF2ZXJzYWwuc2V0KCJwcmlvcml0eSIsIGNoaWxkUHJpb3JpdHkrKyk7CiAgdHJlZVRyYXZlcnNhbC5zZXQoInBhcmVudCIsIHZpZXdwb3J0LmdldE9iamVjdCgpKTsKICB2YXIgc3RhdGVTZXQgPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0KHBhY2ssICJTdGF0ZVNldCIpOwogIHN0YXRlU2V0LnNldCgicHJpb3JpdHkiLCBjaGlsZFByaW9yaXR5KyspOwogIHN0YXRlU2V0LnNldCgicGFyZW50Iiwgdmlld3BvcnQuZ2V0T2JqZWN0KCkpOwogIHZhciBzdGF0ZSA9IG51bGw7CiAgdHJhbnNwYXJlbnQgJiYgKHN0YXRlID0gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLmNyZWF0ZU9iamVjdChwYWNrLCAiU3RhdGUiKSwgc3RhdGUuaW52b2tlKCJnZXRTdGF0ZVBhcmFtIiwgIkFscGhhQmxlbmRFbmFibGUiKS52YWx1ZSA9ICEwLCBzdGF0ZS5pbnZva2UoImdldFN0YXRlUGFyYW0iLCAiU291cmNlQmxlbmRGdW5jdGlvbiIpLnZhbHVlID0gYzNkLm8zZC5TdGF0ZS5CTEVOREZVTkNfU09VUkNFX0FMUEhBLCBzdGF0ZS5pbnZva2UoImdldFN0YXRlUGFyYW0iLCAiRGVzdGluYXRpb25CbGVuZEZ1bmN0aW9uIikudmFsdWUgPSBjM2QubzNkLlN0YXRlLkJMRU5ERlVOQ19JTlZFUlNFX1NPVVJDRV9BTFBIQSwgc3RhdGUuaW52b2tlKCJnZXRTdGF0ZVBhcmFtIiwgIkFscGhhVGVzdEVuYWJsZSIpLnZhbHVlID0gITAsIHN0YXRlLmludm9rZSgiZ2V0U3RhdGVQYXJhbSIsICJDb2xvcldyaXRlRW5hYmxlIikudmFsdWUgPSA3LCBzdGF0ZS5pbnZva2UoImdldFN0YXRlUGFyYW0iLCAKICAiWldyaXRlRW5hYmxlIikudmFsdWUgPSAhMSwgc3RhdGVTZXQuc2V0KCJzdGF0ZSIsIHN0YXRlLmdldE9iamVjdCgpKSk7CiAgdmFyIGRyYXdQYXNzID0gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLmNyZWF0ZU9iamVjdChwYWNrLCAiRHJhd1Bhc3MiKTsKICBkcmF3UGFzcy5zZXQoImRyYXdMaXN0IiwgZHJhd0xpc3QuZ2V0T2JqZWN0KCkpOwogIGRyYXdQYXNzLnNldCgicGFyZW50Iiwgc3RhdGVTZXQuZ2V0T2JqZWN0KCkpOwogIHRyZWVUcmF2ZXJzYWwuaW52b2tlKCJyZWdpc3RlckRyYXdMaXN0IiwgZHJhd0xpc3QuZ2V0T2JqZWN0KCksIHRoaXMuZHJhd0NvbnRleHRfLmdldE9iamVjdCgpLCAhMCk7CiAgdHJlZVRyYXZlcnNhbC5zZXQoInRyYW5zZm9ybSIsIHRyYW5zZm9ybS5nZXRPYmplY3QoKSk7CiAgcmV0dXJuIG5ldyB0YWxrLm1lZGlhLmMzZC5WaWV3M0QoZWZmZWN0LmNyZWF0ZVVub3duZWRIYW5kbGUoKSwgdHJhbnNmb3JtLCB2aWV3cG9ydCwgY2xlYXJCdWZmZXIsIGRyYXdMaXN0LCB0cmVlVHJhdmVyc2FsLCBzdGF0ZVNldCwgc3RhdGUsIGRyYXdQYXNzKQp9Owp0YWxrLm1lZGlhLk8zZEhhcmR3YXJlUmVuZGVyaW5nQXBpLnByb3RvdHlwZS5jcmVhdGVTY2VuZU9iamVjdCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE8zZEhhcmR3YXJlUmVuZGVyaW5nQXBpJCRjcmVhdGVTY2VuZU9iamVjdCQodmlldywgbWF0ZXJpYWwpIHsKICBpZighKHZpZXcgaW5zdGFuY2VvZiB0YWxrLm1lZGlhLmMzZC5WaWV3M0QpIHx8ICEobWF0ZXJpYWwgaW5zdGFuY2VvZiB0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbDNEKSkgewogICAgcmV0dXJuIG51bGwKICB9CiAgdmFyIHZpZXczZCA9IHZpZXcsIG1hdGVyaWFsM2QgPSBtYXRlcmlhbCwgYzNkID0gdGhpcy5vM2RCdW5kbGUuYzNkT2JqZWN0LmdldFBsdWdpbigpLCBwYWNrID0gdGhpcy5vM2RCdW5kbGUucGFjaywgc2hhcGUgPSBwYWNrLmNyZWF0ZU9iamVjdCgiU2hhcGUiKSwgcHJpbWl0aXZlID0gcGFjay5jcmVhdGVPYmplY3QoIlByaW1pdGl2ZSIpOwogIHByaW1pdGl2ZS5vd25lciA9IHNoYXBlOwogIHByaW1pdGl2ZS5tYXRlcmlhbCA9IG1hdGVyaWFsM2QuZ2V0TWF0ZXJpYWxPYmplY3QoKTsKICBwcmltaXRpdmUubnVtYmVyUHJpbWl0aXZlcyA9IDI7CiAgcHJpbWl0aXZlLnByaW1pdGl2ZVR5cGUgPSBjM2QubzNkLlByaW1pdGl2ZS5UUklBTkdMRUxJU1Q7CiAgcHJpbWl0aXZlLm51bWJlclZlcnRpY2VzID0gNDsKICBwYWNrLnJlbW92ZU9iamVjdChwcmltaXRpdmUuY3JlYXRlRHJhd0VsZW1lbnQocGFjaywgbnVsbCkpOwogIHZhciB2ZXJ0ZXhCdWZmZXIgPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0KHBhY2ssICJWZXJ0ZXhCdWZmZXIiKSwgcG9zaXRpb25GaWVsZCA9IHZlcnRleEJ1ZmZlci5pbnZva2UoImNyZWF0ZUZpZWxkIiwgIkZsb2F0RmllbGQiLCAzKTsKICB2ZXJ0ZXhCdWZmZXIuaW52b2tlKCJzZXQiLCBbMCwgMCwgMCwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMCwgMF0pOwogIHZhciBpbmRleEJ1ZmZlciA9IHBhY2suY3JlYXRlT2JqZWN0KCJJbmRleEJ1ZmZlciIpOwogIGluZGV4QnVmZmVyLnNldChbMCwgMSwgMiwgMCwgMiwgM10pOwogIHZhciBzdHJlYW1CYW5rID0gdGFsay5tZWRpYS5jM2QuTzNkSGFuZGxlLmNyZWF0ZU9iamVjdChwYWNrLCAiU3RyZWFtQmFuayIpOwogIHByaW1pdGl2ZS5zdHJlYW1CYW5rID0gc3RyZWFtQmFuay5nZXRPYmplY3QoKTsKICBzdHJlYW1CYW5rLmludm9rZSgic2V0VmVydGV4U3RyZWFtIiwgYzNkLm8zZC5TdHJlYW0uUE9TSVRJT04sIDAsIHBvc2l0aW9uRmllbGQsIDApOwogIHN0cmVhbUJhbmsuaW52b2tlKCJzZXRWZXJ0ZXhTdHJlYW0iLCBjM2QubzNkLlN0cmVhbS5URVhDT09SRCwgMCwgbWF0ZXJpYWwzZC5nZXRUZXhDb29yZEZpZWxkT2JqZWN0KCksIDApOwogIHByaW1pdGl2ZS5pbmRleEJ1ZmZlciA9IGluZGV4QnVmZmVyOwogIHBhY2sucmVtb3ZlT2JqZWN0KGluZGV4QnVmZmVyKTsKICBwYWNrLnJlbW92ZU9iamVjdChwcmltaXRpdmUpOwogIHZhciB0cmFuc2Zvcm0gPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0KHBhY2ssICJUcmFuc2Zvcm0iKTsKICB0cmFuc2Zvcm0uc2V0KCJwYXJlbnQiLCB2aWV3M2QuZ2V0VHJhbnNmb3JtT2JqZWN0KCkpOwogIHZhciBzY2FsZVRyYW5zZm9ybSA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS5jcmVhdGVPYmplY3QocGFjaywgIlRyYW5zZm9ybSIpOwogIHNjYWxlVHJhbnNmb3JtLnNldCgicGFyZW50IiwgdHJhbnNmb3JtLmdldE9iamVjdCgpKTsKICBzY2FsZVRyYW5zZm9ybS5pbnZva2UoImFkZFNoYXBlIiwgc2hhcGUpOwogIHBhY2sucmVtb3ZlT2JqZWN0KHNoYXBlKTsKICB2YXIgYWxwaGEgPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUud3JhcFVub3duZWRPYmplY3Qoc2NhbGVUcmFuc2Zvcm0uaW52b2tlKCJjcmVhdGVQYXJhbSIsICJhbHBoYSIsICJvM2QuUGFyYW1GbG9hdCIpKSwgc2NlbmVPYmplY3QgPSBuZXcgdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QzRCh0cmFuc2Zvcm0sIHNjYWxlVHJhbnNmb3JtLCBhbHBoYSwgdmVydGV4QnVmZmVyLCBzdHJlYW1CYW5rKTsKICBzY2VuZU9iamVjdC5zZXRBbHBoYSgwKTsKICByZXR1cm4gc2NlbmVPYmplY3QKfTsKdGFsay5tZWRpYS5PM2RIYXJkd2FyZVJlbmRlcmluZ0FwaS5wcm90b3R5cGUuY3JlYXRlTWF0ZXJpYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRPM2RIYXJkd2FyZVJlbmRlcmluZ0FwaSQkY3JlYXRlTWF0ZXJpYWwkKHZpZXcpIHsKICBpZighKHZpZXcgaW5zdGFuY2VvZiB0YWxrLm1lZGlhLmMzZC5WaWV3M0QpKSB7CiAgICByZXR1cm4gbnVsbAogIH0KICB2YXIgdmlldzNkID0gdmlldywgbWF0ZXJpYWwgPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0KHRoaXMubzNkQnVuZGxlLnBhY2ssICJNYXRlcmlhbCIpOwogIG1hdGVyaWFsLnNldCgiZHJhd0xpc3QiLCB2aWV3M2QuZ2V0RHJhd0xpc3RPYmplY3QoKSk7CiAgbWF0ZXJpYWwuc2V0KCJlZmZlY3QiLCB2aWV3M2QuZ2V0RWZmZWN0T2JqZWN0KCkpOwogIHZpZXczZC5nZXRFZmZlY3RPYmplY3QoKS5jcmVhdGVVbmlmb3JtUGFyYW1ldGVycyhtYXRlcmlhbC5nZXRPYmplY3QoKSk7CiAgdmFyIGMzZCA9IHRoaXMubzNkQnVuZGxlLmMzZE9iamVjdC5nZXRQbHVnaW4oKSwgdGV4U2FtcGxlciA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS5jcmVhdGVPYmplY3QodGhpcy5vM2RCdW5kbGUucGFjaywgIlNhbXBsZXIiKTsKICB0ZXhTYW1wbGVyLnNldCgiYWRkcmVzc01vZGVVIiwgYzNkLm8zZC5TYW1wbGVyLkNMQU1QKTsKICB0ZXhTYW1wbGVyLnNldCgiYWRkcmVzc01vZGVWIiwgYzNkLm8zZC5TYW1wbGVyLkNMQU1QKTsKICBtYXRlcmlhbC5pbnZva2UoImdldFBhcmFtIiwgInRleFNhbXBsZXIwIikudmFsdWUgPSB0ZXhTYW1wbGVyLmdldE9iamVjdCgpOwogIHZhciB0ZXhCdWZmZXIgPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0KHRoaXMubzNkQnVuZGxlLnBhY2ssICJWZXJ0ZXhCdWZmZXIiKSwgdGV4Q29vcmRGaWVsZCA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS53cmFwVW5vd25lZE9iamVjdCh0ZXhCdWZmZXIuaW52b2tlKCJjcmVhdGVGaWVsZCIsICJGbG9hdEZpZWxkIiwgMikpOwogIHRleEJ1ZmZlci5pbnZva2UoInNldCIsIHRhbGsubWVkaWEuYzNkLmNvbXB1dGVUZXh0dXJlQ29vcmRzKDEsIDEsIDEsIDEsICExLCAhMSkpOwogIHJldHVybiBuZXcgdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwzRChtYXRlcmlhbCwgdGV4U2FtcGxlciwgdGV4QnVmZmVyLCB0ZXhDb29yZEZpZWxkKQp9Owp0YWxrLm1lZGlhLk8zZEhhcmR3YXJlUmVuZGVyaW5nQXBpLnByb3RvdHlwZS5vblJlc2l6ZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRPM2RIYXJkd2FyZVJlbmRlcmluZ0FwaSQkb25SZXNpemVfJChlKSB7CiAgdmFyIHdpZHRoID0gZSA/IGUud2lkdGggOiB0aGlzLm8zZEJ1bmRsZS53aWR0aCwgaGVpZ2h0ID0gZSA/IGUuaGVpZ2h0IDogdGhpcy5vM2RCdW5kbGUuaGVpZ2h0OwogIHRoaXMuZHJhd0NvbnRleHRfLnNldCgicHJvamVjdGlvbiIsIHRhbGsubWVkaWEuYzNkLmNyZWF0ZU9ydGhvZ3JhcGhpY01hdHJpeCgwLjUsIHdpZHRoICsgMC41LCBoZWlnaHQgKyAwLjUsIDAuNSwgMC4wMDEsIDFFMykpCn07CnRhbGsubWVkaWEuTzNkSGFyZHdhcmVSZW5kZXJpbmdBcGkucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE8zZEhhcmR3YXJlUmVuZGVyaW5nQXBpJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMubzNkQnVuZGxlLmMzZE9iamVjdC5pc1NjcmlwdGFibGUoKSAmJiB0YWxrLm1lZGlhLmMzZC5yZW1vdmVFdmVudENhbGxiYWNrKHRoaXMubzNkQnVuZGxlLmMzZE9iamVjdC5nZXRQbHVnaW4oKSwgInJlc2l6ZSIsIHRoaXMuYm91bmRPblJlc2l6ZV8pOwogIHRoaXMub3BhcXVlRWZmZWN0XyAmJiAodGhpcy5vcGFxdWVFZmZlY3RfLmRpc3Bvc2UoKSwgdGhpcy5vcGFxdWVFZmZlY3RfID0gbnVsbCk7CiAgdGhpcy50cmFuc3BhcmVudEVmZmVjdF8gJiYgKHRoaXMudHJhbnNwYXJlbnRFZmZlY3RfLmRpc3Bvc2UoKSwgdGhpcy50cmFuc3BhcmVudEVmZmVjdF8gPSBudWxsKTsKICB0aGlzLmRyYXdDb250ZXh0XyAmJiAodGhpcy5kcmF3Q29udGV4dF8uZGlzcG9zZSgpLCB0aGlzLmRyYXdDb250ZXh0XyA9IG51bGwpOwogIHRhbGsubWVkaWEuTzNkSGFyZHdhcmVSZW5kZXJpbmdBcGkuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwyRCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRNYXRlcmlhbDJEJChvM2RCdW5kbGUpIHsKICB0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbC5jYWxsKHRoaXMpOwogIHRoaXMubzNkQnVuZGxlXyA9IG8zZEJ1bmRsZTsKICB0aGlzLmV2ZW50VGFyZ2V0XyA9IG5ldyBnb29nLmV2ZW50cy5FdmVudFRhcmdldAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLk1hdGVyaWFsMkQsIHRhbGsubWVkaWEuYzNkLk1hdGVyaWFsKTsKdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwyRC5FdmVudHMgPSB7TUFURVJJQUxfQ0hBTkdFRDpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgibWF0ZXJpYWxfY2hhbmdlZCIpfTsKdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwyRC5NYXRlcmlhbENoYW5nZWRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRNYXRlcmlhbDJEJE1hdGVyaWFsQ2hhbmdlZEV2ZW50JChtYXRlcmlhbCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwyRC5FdmVudHMuTUFURVJJQUxfQ0hBTkdFRCk7CiAgdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwyRC5NYXRlcmlhbENoYW5nZWRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbDJELnByb3RvdHlwZS53aWR0aF8gPSAxOwp0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbDJELnByb3RvdHlwZS5oZWlnaHRfID0gMTsKdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwyRC5wcm90b3R5cGUuc2V0VGV4dHVyZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRNYXRlcmlhbDJEJCRzZXRUZXh0dXJlJCh0ZXh0dXJlLCBlbWJXaWR0aCwgZW1iSGVpZ2h0LCBtaXJyb3JYLCBtaXJyb3JZLCBvcHRfZmFzdFJlc2NhbGUpIHsKICB2YXIgbzJkR2xvYmFscyA9IHRoaXMubzNkQnVuZGxlXy5vWGRHbG9iYWxzOwogIHRoaXMuZGlzcG9zZVBhdHRlcm5fKCk7CiAgdGhpcy5wYXR0ZXJuXyA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS53cmFwT2JqZWN0KHRoaXMubzNkQnVuZGxlXy5wYWNrLCBvMmRHbG9iYWxzLlBhdHRlcm4uY3JlYXRlVGV4dHVyZVBhdHRlcm4odGhpcy5vM2RCdW5kbGVfLnBhY2ssIHRleHR1cmUpKTsKICB0aGlzLnBhdHRlcm5fLnNldCgiZXh0ZW5kIiwgbzJkR2xvYmFscy5OT05FKTsKICB2YXIgZmlsdGVyOwogIGZpbHRlciA9IGdvb2cuaXNEZWZBbmROb3ROdWxsKG8yZEdsb2JhbHMuYmFja2VuZCkgJiYgbzJkR2xvYmFscy5iYWNrZW5kID09IG8yZEdsb2JhbHMuQ0FJUk9fWExJQiAmJiAhb3B0X2Zhc3RSZXNjYWxlID8gbzJkR2xvYmFscy5CSUxJTkVBUiA6IG8yZEdsb2JhbHMuTkVBUkVTVDsKICB0aGlzLnBhdHRlcm5fLnNldCgiZmlsdGVyIiwgZmlsdGVyKTsKICBpZihtaXJyb3JYIHx8IG1pcnJvclkpIHsKICAgIHRoaXMucGF0dGVybl8uaW52b2tlKCJzZXRBZmZpbmVUcmFuc2Zvcm0iLCBtaXJyb3JYID8gLTEgOiAxLCAwLCAwLCBtaXJyb3JZID8gLTEgOiAxLCBtaXJyb3JYID8gZW1iV2lkdGggOiAwLCBtaXJyb3JZID8gZW1iSGVpZ2h0IDogMCkKICB9CiAgdGhpcy53aWR0aF8gPSBlbWJXaWR0aDsKICB0aGlzLmhlaWdodF8gPSBlbWJIZWlnaHQ7CiAgdGhpcy5ldmVudFRhcmdldF8uZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwyRC5NYXRlcmlhbENoYW5nZWRFdmVudCh0aGlzKSkKfTsKdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwyRC5wcm90b3R5cGUuZ2V0UGF0dGVybk9iamVjdCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRNYXRlcmlhbDJEJCRnZXRQYXR0ZXJuT2JqZWN0JCgpIHsKICByZXR1cm4gdGhpcy5wYXR0ZXJuXyA/IHRoaXMucGF0dGVybl8uZ2V0T2JqZWN0KCkgOiBudWxsCn07CnRhbGsubWVkaWEuYzNkLk1hdGVyaWFsMkQucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE1hdGVyaWFsMkQkJGdldFdpZHRoJCgpIHsKICByZXR1cm4gdGhpcy53aWR0aF8KfTsKdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwyRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE1hdGVyaWFsMkQkJGdldEhlaWdodCQoKSB7CiAgcmV0dXJuIHRoaXMuaGVpZ2h0Xwp9Owp0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbDJELnByb3RvdHlwZS5nZXRFdmVudFRhcmdldCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRNYXRlcmlhbDJEJCRnZXRFdmVudFRhcmdldCQoKSB7CiAgcmV0dXJuIHRoaXMuZXZlbnRUYXJnZXRfCn07CnRhbGsubWVkaWEuYzNkLk1hdGVyaWFsMkQucHJvdG90eXBlLmRpc3Bvc2VQYXR0ZXJuXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRNYXRlcmlhbDJEJCRkaXNwb3NlUGF0dGVybl8kKCkgewogIHRoaXMucGF0dGVybl8gJiYgKHRoaXMucGF0dGVybl8uZGlzcG9zZSgpLCB0aGlzLnBhdHRlcm5fID0gbnVsbCkKfTsKdGFsay5tZWRpYS5jM2QuTWF0ZXJpYWwyRC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE1hdGVyaWFsMkQkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGhpcy5kaXNwb3NlUGF0dGVybl8oKTsKICB0aGlzLmV2ZW50VGFyZ2V0XyAmJiAodGhpcy5ldmVudFRhcmdldF8uZGlzcG9zZSgpLCB0aGlzLmV2ZW50VGFyZ2V0XyA9IG51bGwpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0MkQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVPYmplY3QyRCQoYzNkLCBsYXllciwgdmlldywgbWF0ZXJpYWwpIHsKICB0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdC5jYWxsKHRoaXMpOwogIHRoaXMuYzNkXyA9IGMzZDsKICB0aGlzLmxheWVyXyA9IGxheWVyOwogIHRoaXMudmlld18gPSB2aWV3OwogIHRoaXMubWF0ZXJpYWxfID0gbWF0ZXJpYWw7CiAgdGhpcy5hYnNQb3NfID0gbmV3IHRhbGsubWVkaWEuYzNkLkF0dHJzKDAsIDAsIDAsIDAsIDAsIDApOwogIHRoaXMuZXZlbnRIYW5kbGVyXyA9IG5ldyBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIodGhpcyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLm1hdGVyaWFsXy5nZXRFdmVudFRhcmdldCgpLCB0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbDJELkV2ZW50cy5NQVRFUklBTF9DSEFOR0VELCB0aGlzLm9uTWF0ZXJpYWxDaGFuZ2VkXyk7CiAgdGhpcy52aWV3Xy5zY2VuZU9iamVjdCAmJiB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMudmlld18uc2NlbmVPYmplY3QuZ2V0RXZlbnRUYXJnZXQoKSwgdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5FdmVudHMuU0NFTkVfT0JKRUNUX0NIQU5HRUQsIHRoaXMub25QYXJlbnRPYmplY3RDaGFuZ2VkXyk7CiAgdGhpcy5ldmVudFRhcmdldF8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdDJELCB0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdCk7CnRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0MkQuRXZlbnRzID0ge1NDRU5FX09CSkVDVF9DSEFOR0VEOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJzY2VuZV9vYmplY3RfY2hhbmdlZCIpfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5TY2VuZU9iamVjdENoYW5nZWRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU9iamVjdDJEJFNjZW5lT2JqZWN0Q2hhbmdlZEV2ZW50JChzY2VuZU9iamVjdCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5FdmVudHMuU0NFTkVfT0JKRUNUX0NIQU5HRUQpOwogIHRoaXMuc2NlbmVPYmplY3QgPSBzY2VuZU9iamVjdAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0MkQuU2NlbmVPYmplY3RDaGFuZ2VkRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5wcm90b3R5cGUud2lkdGhfID0gMDsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5wcm90b3R5cGUuaGVpZ2h0XyA9IDA7CnRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0MkQucHJvdG90eXBlLnVwZGF0ZUF0dHJzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lT2JqZWN0MkQkJHVwZGF0ZUF0dHJzJChhdHRycykgewogIHZhciB4ID0gTWF0aC5yb3VuZChhdHRycy54KSwgeSA9IE1hdGgucm91bmQoYXR0cnMueSksIHcgPSBNYXRoLnJvdW5kKGF0dHJzLncgKyBhdHRycy54IC0geCksIGggPSBNYXRoLnJvdW5kKGF0dHJzLmggKyBhdHRycy55IC0geSk7CiAgdGhpcy5hYnNQb3NfLnggPSB4OwogIHRoaXMuYWJzUG9zXy55ID0geTsKICB0aGlzLmFic1Bvc18ueiA9IGF0dHJzLno7CiAgdGhpcy52aWV3Xy5zY2VuZU9iamVjdCAmJiAodGhpcy5hYnNQb3NfLnggKz0gdGhpcy52aWV3Xy5zY2VuZU9iamVjdC5hYnNQb3NfLngsIHRoaXMuYWJzUG9zXy55ICs9IHRoaXMudmlld18uc2NlbmVPYmplY3QuYWJzUG9zXy55LCB0aGlzLmFic1Bvc18ueiArPSB0aGlzLnZpZXdfLnNjZW5lT2JqZWN0LmFic1Bvc18ueik7CiAgdGhpcy5sYXllcl8uc2V0KCJ4IiwgdGhpcy5hYnNQb3NfLngpOwogIHRoaXMubGF5ZXJfLnNldCgieSIsIHRoaXMuYWJzUG9zXy55KTsKICB0aGlzLmxheWVyXy5zZXQoInoiLCB0aGlzLmFic1Bvc18ueik7CiAgdGhpcy5sYXllcl8uc2V0KCJ3aWR0aCIsIHcpOwogIHRoaXMud2lkdGhfID0gdzsKICB0aGlzLmxheWVyXy5zZXQoImhlaWdodCIsIGgpOwogIHRoaXMuaGVpZ2h0XyA9IGg7CiAgdGhpcy51cGRhdGVTY2FsZUZhY3Rvcl8oKTsKICB0aGlzLmV2ZW50VGFyZ2V0Xy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdDJELlNjZW5lT2JqZWN0Q2hhbmdlZEV2ZW50KHRoaXMpKQp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdDJELnByb3RvdHlwZS51cGRhdGVBbHBoYSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU9iamVjdDJEJCR1cGRhdGVBbHBoYSQoYWxwaGEpIHsKICB0aGlzLmxheWVyXy5zZXQoImFscGhhIiwgYWxwaGEpOwogIHZhciBwYWludE9wZXJhdG9yOwogIHRyeSB7CiAgICB2YXIgbGF5ZXJDbGFzcyA9IHRoaXMuYzNkXy5vM2QubzJkLkxheWVyOwogICAgcGFpbnRPcGVyYXRvciA9IDEgPT0gYWxwaGEgPyB0aGlzLnZpZXdfLnRyYW5zcGFyZW50ID8gbGF5ZXJDbGFzcy5CTEVORCA6IGxheWVyQ2xhc3MuQ09QWSA6IHRoaXMudmlld18udHJhbnNwYXJlbnQgPyBsYXllckNsYXNzLkJMRU5EX1dJVEhfVFJBTlNQQVJFTkNZIDogbGF5ZXJDbGFzcy5DT1BZX1dJVEhfRkFESU5HCiAgfWNhdGNoKGUpIHsKICB9CiAgZ29vZy5pc0RlZkFuZE5vdE51bGwocGFpbnRPcGVyYXRvcikgJiYgdGhpcy5sYXllcl8uc2V0KCJwYWludE9wZXJhdG9yIiwgcGFpbnRPcGVyYXRvcikKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5wcm90b3R5cGUudXBkYXRlVmlzaWJsZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU9iamVjdDJEJCR1cGRhdGVWaXNpYmxlJCh2aXNpYmxlKSB7CiAgdGhpcy5sYXllcl8uc2V0KCJ2aXNpYmxlIiwgdmlzaWJsZSkKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5wcm90b3R5cGUub25NYXRlcmlhbENoYW5nZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lT2JqZWN0MkQkJG9uTWF0ZXJpYWxDaGFuZ2VkXyQoKSB7CiAgdGhpcy51cGRhdGVGcm9tTWF0ZXJpYWwoKQp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU9iamVjdDJELnByb3RvdHlwZS51cGRhdGVGcm9tTWF0ZXJpYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVPYmplY3QyRCQkdXBkYXRlRnJvbU1hdGVyaWFsJCgpIHsKICB0aGlzLmxheWVyXy5zZXQoInBhdHRlcm4iLCB0aGlzLm1hdGVyaWFsXy5nZXRQYXR0ZXJuT2JqZWN0KCkpOwogIHRoaXMudXBkYXRlU2NhbGVGYWN0b3JfKCkKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5wcm90b3R5cGUub25QYXJlbnRPYmplY3RDaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU9iamVjdDJEJCRvblBhcmVudE9iamVjdENoYW5nZWRfJCgpIHsKICB0aGlzLnNldEF0dHJzKHRoaXMuZ2V0QXR0cnMoKSkKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5wcm90b3R5cGUudXBkYXRlU2NhbGVGYWN0b3JfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lT2JqZWN0MkQkJHVwZGF0ZVNjYWxlRmFjdG9yXyQoKSB7CiAgdGhpcy5sYXllcl8uc2V0KCJzY2FsZVgiLCB0aGlzLndpZHRoXyAvIHRoaXMubWF0ZXJpYWxfLmdldFdpZHRoKCkpOwogIHRoaXMubGF5ZXJfLnNldCgic2NhbGVZIiwgdGhpcy5oZWlnaHRfIC8gdGhpcy5tYXRlcmlhbF8uZ2V0SGVpZ2h0KCkpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0MkQucHJvdG90eXBlLmdldEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lT2JqZWN0MkQkJGdldEV2ZW50VGFyZ2V0JCgpIHsKICByZXR1cm4gdGhpcy5ldmVudFRhcmdldF8KfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lT2JqZWN0MkQkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGhpcy5sYXllcl8gJiYgKHRoaXMubGF5ZXJfLmRpc3Bvc2UoKSwgdGhpcy5sYXllcl8gPSBudWxsKTsKICB0aGlzLmV2ZW50VGFyZ2V0XyAmJiAodGhpcy5ldmVudFRhcmdldF8uZGlzcG9zZSgpLCB0aGlzLmV2ZW50VGFyZ2V0XyA9IG51bGwpOwogIHRoaXMuZXZlbnRIYW5kbGVyXyAmJiAodGhpcy5ldmVudEhhbmRsZXJfLmRpc3Bvc2UoKSwgdGhpcy5ldmVudEhhbmRsZXJfID0gbnVsbCk7CiAgdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLmMzZC5WaWV3MkQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkVmlldzJEJCh0cmFuc3BhcmVudCwgb3B0X3NjZW5lT2JqZWN0LCBvcHRfYmFja2dyb3VuZExheWVyKSB7CiAgdGFsay5tZWRpYS5jM2QuVmlldy5jYWxsKHRoaXMpOwogIHRoaXMudHJhbnNwYXJlbnQgPSB0cmFuc3BhcmVudDsKICB0aGlzLnNjZW5lT2JqZWN0ID0gb3B0X3NjZW5lT2JqZWN0IHx8IG51bGw7CiAgdGhpcy5iYWNrZ3JvdW5kTGF5ZXJfID0gb3B0X2JhY2tncm91bmRMYXllciB8fCBudWxsCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuVmlldzJELCB0YWxrLm1lZGlhLmMzZC5WaWV3KTsKdGFsay5tZWRpYS5jM2QuVmlldzJELnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkVmlldzJEJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMuYmFja2dyb3VuZExheWVyXyAmJiAodGhpcy5iYWNrZ3JvdW5kTGF5ZXJfLmRpc3Bvc2UoKSwgdGhpcy5iYWNrZ3JvdW5kTGF5ZXJfID0gbnVsbCk7CiAgdGFsay5tZWRpYS5jM2QuVmlldzJELnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpCn07CnRhbGsubWVkaWEuTzNkU29mdHdhcmVSZW5kZXJpbmdBcGkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRPM2RTb2Z0d2FyZVJlbmRlcmluZ0FwaSQobzNkQnVuZGxlKSB7CiAgdGFsay5tZWRpYS5jM2QuT1hkUmVuZGVyaW5nQXBpLmNhbGwodGhpcywgbzNkQnVuZGxlKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuTzNkU29mdHdhcmVSZW5kZXJpbmdBcGksIHRhbGsubWVkaWEuYzNkLk9YZFJlbmRlcmluZ0FwaSk7CnRhbGsubWVkaWEuTzNkU29mdHdhcmVSZW5kZXJpbmdBcGkuY3JlYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTzNkU29mdHdhcmVSZW5kZXJpbmdBcGkkY3JlYXRlJChvM2RCdW5kbGUpIHsKICByZXR1cm4gbmV3IHRhbGsubWVkaWEuTzNkU29mdHdhcmVSZW5kZXJpbmdBcGkobzNkQnVuZGxlKQp9Owp0YWxrLm1lZGlhLk8zZFNvZnR3YXJlUmVuZGVyaW5nQXBpLnByb3RvdHlwZS5nZXRJbXBsZW1lbnRhdGlvbk5hbWUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRPM2RTb2Z0d2FyZVJlbmRlcmluZ0FwaSQkZ2V0SW1wbGVtZW50YXRpb25OYW1lJCgpIHsKICByZXR1cm4iTzJEIgp9Owp0YWxrLm1lZGlhLk8zZFNvZnR3YXJlUmVuZGVyaW5nQXBpLnByb3RvdHlwZS5jcmVhdGVWaWV3ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTzNkU29mdHdhcmVSZW5kZXJpbmdBcGkkJGNyZWF0ZVZpZXckKHByaW9yaXR5LCB0cmFuc3BhcmVudCwgb3B0X3NjZW5lT2JqZWN0LCBvcHRfYmFja2dyb3VuZENvbG9yKSB7CiAgdmFyIHNjZW5lT2JqZWN0MmQ7CiAgaWYob3B0X3NjZW5lT2JqZWN0KSB7CiAgICBpZighKG9wdF9zY2VuZU9iamVjdCBpbnN0YW5jZW9mIHRhbGsubWVkaWEuYzNkLlNjZW5lT2JqZWN0MkQpKSB7CiAgICAgIHJldHVybiBudWxsCiAgICB9CiAgICBzY2VuZU9iamVjdDJkID0gb3B0X3NjZW5lT2JqZWN0CiAgfQogIHZhciBiYWNrZ3JvdW5kTGF5ZXI7CiAgaWYoIXRyYW5zcGFyZW50KSB7CiAgICBiYWNrZ3JvdW5kTGF5ZXIgPSB0YWxrLm1lZGlhLmMzZC5PM2RIYW5kbGUuY3JlYXRlT2JqZWN0KHRoaXMubzNkQnVuZGxlLnBhY2ssICJMYXllciIpOwogICAgYmFja2dyb3VuZExheWVyLnNldCgiZXZlcnl3aGVyZSIsICEwKTsKICAgIGJhY2tncm91bmRMYXllci5zZXQoInoiLCAtSW5maW5pdHkpOwogICAgdmFyIGMzZCA9IHRoaXMubzNkQnVuZGxlLmMzZE9iamVjdC5nZXRQbHVnaW4oKTsKICAgIGJhY2tncm91bmRMYXllci5zZXQoInBhaW50T3BlcmF0b3IiLCBjM2QubzNkLm8yZC5MYXllci5DT1BZKTsKICAgIHZhciBiYWNrZ3JvdW5kQ29sb3IgPSBvcHRfYmFja2dyb3VuZENvbG9yIHx8IFswLCAwLCAwXSwgYmFja2dyb3VuZFBhdHRlcm4gPSBjM2QubzNkLm8yZC5QYXR0ZXJuLmNyZWF0ZVJnYlBhdHRlcm4odGhpcy5vM2RCdW5kbGUucGFjaywgYmFja2dyb3VuZENvbG9yWzBdLCBiYWNrZ3JvdW5kQ29sb3JbMV0sIGJhY2tncm91bmRDb2xvclsyXSk7CiAgICBiYWNrZ3JvdW5kTGF5ZXIuc2V0KCJwYXR0ZXJuIiwgYmFja2dyb3VuZFBhdHRlcm4pOwogICAgdGhpcy5vM2RCdW5kbGUucGFjay5yZW1vdmVPYmplY3QoYmFja2dyb3VuZFBhdHRlcm4pCiAgfQogIHJldHVybiBuZXcgdGFsay5tZWRpYS5jM2QuVmlldzJEKHRyYW5zcGFyZW50LCBzY2VuZU9iamVjdDJkLCBiYWNrZ3JvdW5kTGF5ZXIpCn07CnRhbGsubWVkaWEuTzNkU29mdHdhcmVSZW5kZXJpbmdBcGkucHJvdG90eXBlLmNyZWF0ZVNjZW5lT2JqZWN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTzNkU29mdHdhcmVSZW5kZXJpbmdBcGkkJGNyZWF0ZVNjZW5lT2JqZWN0JCh2aWV3LCBtYXRlcmlhbCkgewogIGlmKCEodmlldyBpbnN0YW5jZW9mIHRhbGsubWVkaWEuYzNkLlZpZXcyRCkgfHwgIShtYXRlcmlhbCBpbnN0YW5jZW9mIHRhbGsubWVkaWEuYzNkLk1hdGVyaWFsMkQpKSB7CiAgICByZXR1cm4gbnVsbAogIH0KICB2YXIgdmlldzJkID0gdmlldywgbWF0ZXJpYWwyZCA9IG1hdGVyaWFsLCBsYXllciA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS5jcmVhdGVPYmplY3QodGhpcy5vM2RCdW5kbGUucGFjaywgIkxheWVyIiksIGMzZCA9IHRoaXMubzNkQnVuZGxlLmMzZE9iamVjdC5nZXRQbHVnaW4oKSwgc2NlbmVPYmplY3QgPSBuZXcgdGFsay5tZWRpYS5jM2QuU2NlbmVPYmplY3QyRChjM2QsIGxheWVyLCB2aWV3MmQsIG1hdGVyaWFsMmQpOwogIHNjZW5lT2JqZWN0LnNldEFscGhhKDApOwogIHNjZW5lT2JqZWN0LnVwZGF0ZUZyb21NYXRlcmlhbCgpOwogIHJldHVybiBzY2VuZU9iamVjdAp9Owp0YWxrLm1lZGlhLk8zZFNvZnR3YXJlUmVuZGVyaW5nQXBpLnByb3RvdHlwZS5jcmVhdGVNYXRlcmlhbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE8zZFNvZnR3YXJlUmVuZGVyaW5nQXBpJCRjcmVhdGVNYXRlcmlhbCQoKSB7CiAgcmV0dXJuIG5ldyB0YWxrLm1lZGlhLmMzZC5NYXRlcmlhbDJEKHRoaXMubzNkQnVuZGxlKQp9Owpnb29nLnVzZXJBZ2VudC5wbGF0Zm9ybSA9IHt9Owpnb29nLnVzZXJBZ2VudC5wbGF0Zm9ybS5kZXRlcm1pbmVWZXJzaW9uXyA9IGZ1bmN0aW9uICRnb29nJHVzZXJBZ2VudCRwbGF0Zm9ybSRkZXRlcm1pbmVWZXJzaW9uXyQoKSB7CiAgdmFyIHJlOwogIGlmKGdvb2cudXNlckFnZW50LldJTkRPV1MpIHsKICAgIHJlID0gL1dpbmRvd3MgTlQgKFswLTkuXSspLzsKICAgIHZhciBtYXRjaCA9IHJlLmV4ZWMoZ29vZy51c2VyQWdlbnQuZ2V0VXNlckFnZW50U3RyaW5nKCkpOwogICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAiMCIKICB9CiAgcmV0dXJuIGdvb2cudXNlckFnZW50Lk1BQyA/IChyZSA9IC8xMFtfLl1bMC05Xy5dKy8sIChtYXRjaCA9IHJlLmV4ZWMoZ29vZy51c2VyQWdlbnQuZ2V0VXNlckFnZW50U3RyaW5nKCkpKSA/IG1hdGNoWzBdLnJlcGxhY2UoL18vZywgIi4iKSA6ICIxMCIpIDogIiIKfTsKZ29vZy51c2VyQWdlbnQucGxhdGZvcm0uVkVSU0lPTiA9IGdvb2cudXNlckFnZW50LnBsYXRmb3JtLmRldGVybWluZVZlcnNpb25fKCk7Cmdvb2cudXNlckFnZW50LnBsYXRmb3JtLmlzVmVyc2lvbiA9IGZ1bmN0aW9uICRnb29nJHVzZXJBZ2VudCRwbGF0Zm9ybSRpc1ZlcnNpb24kKHZlcnNpb24pIHsKICByZXR1cm4gMCA8PSBnb29nLnN0cmluZy5jb21wYXJlVmVyc2lvbnMoZ29vZy51c2VyQWdlbnQucGxhdGZvcm0uVkVSU0lPTiwgdmVyc2lvbikKfTsKdGFsay5tZWRpYS5jM2QuT1hkR2xvYmFscyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPWGRHbG9iYWxzJChwbHVnaW4pIHsKICB0aGlzLmNsaWVudCA9IHBsdWdpbi5jbGllbnQ7CiAgdmFyIGNsaWVudEluZm8gPSB0aGlzLmNsaWVudC5jbGllbnRJbmZvOwogIHRoaXMubm9uUG93ZXJPZlR3b1RleHR1cmVzID0gY2xpZW50SW5mby5ub25Qb3dlck9mVHdvVGV4dHVyZXM7CiAgdGhpcy5yZW5kZXIyZCA9IGNsaWVudEluZm8ucmVuZGVyMmQ7CiAgdGhpcy5iYWNrZW5kID0gY2xpZW50SW5mby5iYWNrZW5kOwogIHRoaXMubzNkID0gcGx1Z2luLm8zZDsKICB2YXIgVGV4dHVyZSA9IHRoaXMubzNkLlRleHR1cmU7CiAgdGhpcy5YUkdCOCA9IFRleHR1cmUuWFJHQjg7CiAgdGhpcy5BUkdCOCA9IFRleHR1cmUuQVJHQjg7CiAgdmFyIENsaWVudEluZm8gPSB0aGlzLm8zZC5DbGllbnRJbmZvOwogIHRoaXMuQ0dfR0wyID0gQ2xpZW50SW5mby5DR19HTDI7CiAgdGhpcy5EM0Q5ID0gQ2xpZW50SW5mby5EM0Q5OwogIHRoaXMuR0wyID0gQ2xpZW50SW5mby5HTDI7CiAgdGhpcy5HTEVTMiA9IENsaWVudEluZm8uR0xFUzI7CiAgdGhpcy5DQUlST19QSVhNQU4gPSBDbGllbnRJbmZvLkNBSVJPX1BJWE1BTjsKICB0aGlzLkNBSVJPX1dJTjMyID0gQ2xpZW50SW5mby5DQUlST19XSU4zMjsKICB0aGlzLkNBSVJPX1FVQVJUWiA9IENsaWVudEluZm8uQ0FJUk9fUVVBUlRaOwogIHRoaXMuQ0FJUk9fWExJQiA9IENsaWVudEluZm8uQ0FJUk9fWExJQgp9Owp0YWxrLm1lZGlhLmMzZC5PMmRHbG9iYWxzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8yZEdsb2JhbHMkKHBsdWdpbikgewogIHRhbGsubWVkaWEuYzNkLk9YZEdsb2JhbHMuY2FsbCh0aGlzLCBwbHVnaW4pOwogIHZhciBvMmQgPSB0aGlzLm8zZC5vMmQ7CiAgdGhpcy5QYXR0ZXJuID0gbzJkLlBhdHRlcm47CiAgdGhpcy5OT05FID0gdGhpcy5QYXR0ZXJuLk5PTkU7CiAgdGhpcy5ORUFSRVNUID0gdGhpcy5QYXR0ZXJuLk5FQVJFU1Q7CiAgdGhpcy5CSUxJTkVBUiA9IHRoaXMuUGF0dGVybi5CSUxJTkVBUgp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLk8yZEdsb2JhbHMsIHRhbGsubWVkaWEuYzNkLk9YZEdsb2JhbHMpOwp0YWxrLm1lZGlhLmMzZC5PM2RHbG9iYWxzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZEdsb2JhbHMkKHBsdWdpbikgewogIHRhbGsubWVkaWEuYzNkLk9YZEdsb2JhbHMuY2FsbCh0aGlzLCBwbHVnaW4pCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuTzNkR2xvYmFscywgdGFsay5tZWRpYS5jM2QuT1hkR2xvYmFscyk7CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZUJhc2UkKCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5oZWlnaHRfID0gdGhpcy53aWR0aF8gPSB0aGlzLnlfID0gdGhpcy54XyA9IDA7CiAgdGhpcy5mZWVkc18gPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcDsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5FdmVudCA9IHtTQ0VORV9DSEFOR0VEOiJzYyJ9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZUJhc2UuU2NlbmVDaGFuZ2VkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVCYXNlJFNjZW5lQ2hhbmdlZEV2ZW50JCh2aWV3cywgc2NlbmUpIHsKICB0aGlzLnZpZXdzID0gdmlld3M7CiAgdGhpcy5zY2VuZSA9IHNjZW5lOwogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLkV2ZW50LlNDRU5FX0NIQU5HRUQpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLlNjZW5lQ2hhbmdlZEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLmMzZC5TY2VuZUJhc2UiKTsKdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLnByb3RvdHlwZS5yZXF1ZXN0Tm9uTG9jYWxGZWVkc18gPSAhMDsKdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLnByb3RvdHlwZS5zZXRPM2RCdW5kbGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVCYXNlJCRzZXRPM2RCdW5kbGUkKG8zZEJ1bmRsZSkgewogIHRoaXMubzNkQnVuZGxlID0gbzNkQnVuZGxlCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5wcm90b3R5cGUuc2V0QXJlYSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZUJhc2UkJHNldEFyZWEkKHgsIHksIHdpZHRoLCBoZWlnaHQpIHsKICB0aGlzLnhfID0geDsKICB0aGlzLnlfID0geTsKICB0aGlzLndpZHRoXyA9IHdpZHRoOwogIHRoaXMuaGVpZ2h0XyA9IGhlaWdodDsKICB0aGlzLnVwZGF0ZVBvc2l0aW9ucygpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5wcm90b3R5cGUuYWRkRmVlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZUJhc2UkJGFkZEZlZWQkKGVuZHBvaW50KSB7CiAgdmFyIHN0cmVhbUlkID0gZW5kcG9pbnQuZ2V0U3RyZWFtSWQoKTsKICBpZih0aGlzLmZlZWRzXy5jb250YWluc0tleShzdHJlYW1JZCkpIHsKICAgIHRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5sb2dnZXJfLndhcm5pbmcoIkF0dGVtcHQgdG8gYWRkIGZlZWQgZm9yIGV4aXN0aW5nIHN0cmVhbSAiICsgc3RyZWFtSWQpCiAgfWVsc2UgewogICAgdmFyIGZlZWQgPSB0aGlzLmNyZWF0ZUZlZWQoZW5kcG9pbnQpOwogICAgZmVlZCA/ICh0aGlzLmZlZWRzXy5zZXQoc3RyZWFtSWQsIGZlZWQpLCB0aGlzLnVwZGF0ZVBvc2l0aW9ucyghMCksIHRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5sb2dnZXJfLmluZm8oIkFkZGVkIGZlZWQgZm9yIHN0cmVhbSAiICsgc3RyZWFtSWQgKyAiLCBub3cgZGlzcGxheWluZyAiICsgdGhpcy5mZWVkc18uZ2V0Q291bnQoKSArICIgZmVlZHMuIikpIDogdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLmxvZ2dlcl8uaW5mbygiTm8gZmVlZCBjcmVhdGVkIGZvciBzdHJlYW0gIiArIHN0cmVhbUlkICsgIi4iKQogIH0KfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLnByb3RvdHlwZS5yZW1vdmVGZWVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lQmFzZSQkcmVtb3ZlRmVlZCQoc3RyZWFtSWQpIHsKICB0aGlzLmZlZWRzXy5jb250YWluc0tleShzdHJlYW1JZCkgPyAodGhpcy5yZW1vdmVGZWVkSW50ZXJuYWxfKHN0cmVhbUlkKSwgdGhpcy51cGRhdGVQb3NpdGlvbnMoITApLCB0YWxrLm1lZGlhLmMzZC5TY2VuZUJhc2UubG9nZ2VyXy5pbmZvKCJSZW1vdmVkIGZlZWQgZm9yIHN0cmVhbSAiICsgc3RyZWFtSWQgKyAiLCBub3cgZGlzcGxheWluZyAiICsgdGhpcy5mZWVkc18uZ2V0Q291bnQoKSArICIgZmVlZHMuIikpIDogdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLmxvZ2dlcl8ud2FybmluZygiQXR0ZW1wdCB0byByZW1vdmUgZmVlZCBmb3Igbm9uLWV4aXN0aW5nIHN0cmVhbSAiICsgc3RyZWFtSWQpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5wcm90b3R5cGUuZ2V0RmVlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZUJhc2UkJGdldEZlZWQkKHN0cmVhbUlkKSB7CiAgcmV0dXJuIHRoaXMuZmVlZHNfLmdldChzdHJlYW1JZCkKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLnByb3RvdHlwZS5oYXNGZWVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lQmFzZSQkaGFzRmVlZCQoc3RyZWFtSWQpIHsKICByZXR1cm4gdGhpcy5mZWVkc18uY29udGFpbnNLZXkoc3RyZWFtSWQpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5wcm90b3R5cGUucmVtb3ZlRmVlZEludGVybmFsXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZUJhc2UkJHJlbW92ZUZlZWRJbnRlcm5hbF8kKHN0cmVhbUlkKSB7CiAgdmFyIGZlZWQgPSB0aGlzLmZlZWRzXy5nZXQoc3RyZWFtSWQpOwogIHRoaXMuZmVlZHNfLnJlbW92ZShzdHJlYW1JZCk7CiAgZmVlZC5kaXNwb3NlKCkKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLnByb3RvdHlwZS5nZXRGZWVkQ291bnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVCYXNlJCRnZXRGZWVkQ291bnQkKCkgewogIHJldHVybiB0aGlzLmZlZWRzXy5nZXRDb3VudCgpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5wcm90b3R5cGUuZ2V0U3RyZWFtSWRzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lQmFzZSQkZ2V0U3RyZWFtSWRzJCgpIHsKICByZXR1cm4gdGhpcy5mZWVkc18uZ2V0S2V5cygpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5wcm90b3R5cGUuc2V0Q3VycmVudFNwZWFrZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVCYXNlJCRzZXRDdXJyZW50U3BlYWtlciQoKSB7Cn07CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5wcm90b3R5cGUub25GcmFtZXJhdGVDaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZUJhc2UkJG9uRnJhbWVyYXRlQ2hhbmdlZF8kKGUpIHsKICBpZih0aGlzLnNob3dEZWJ1Z092ZXJsYXlzXykgewogICAgdmFyIGZlZWQgPSB0aGlzLmdldEZlZWQoZS5lbmRwb2ludC5nZXRTdHJlYW1JZCgpKTsKICAgIGZlZWQgJiYgKGZlZWQuc2V0QXV0b0hpZGVMYWJlbCghMSksIGZlZWQuc2V0TGFiZWxUZXh0KGUucmVuZGVyQ291bnQgKyAiIGZwcyIpLCBmZWVkLnNob3dMYWJlbCgpKQogIH0KfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLnByb3RvdHlwZS5nZXRNYXhWaWV3U2l6ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZUJhc2UkJGdldE1heFZpZXdTaXplJCgpIHsKICByZXR1cm4gdGhpcy5tYXhWaWV3U2l6ZV8KfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLnByb3RvdHlwZS5nZXRNYXhGcHMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVCYXNlJCRnZXRNYXhGcHMkKCkgewogIHJldHVybiB0aGlzLm1heEZwc18KfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLnByb3RvdHlwZS5zdHJlYW1WaWV3Q2hhbmdlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZUJhc2UkJHN0cmVhbVZpZXdDaGFuZ2VkJCgpIHsKICBmb3IodmFyIHZpZXdzID0gW10sIHN0cmVhbUlkcyA9IHRoaXMuZ2V0U3RyZWFtSWRzKCksIGkgPSAwO2kgPCBzdHJlYW1JZHMubGVuZ3RoOysraSkgewogICAgdmFyIGZlZWQgPSB0aGlzLmdldEZlZWQoc3RyZWFtSWRzW2ldKSwgaXNMb2NhbCA9IGZlZWQuZ2V0RW5kcG9pbnQoKS5nZXRQYXJ0aWNpcGFudCgpLmlzTG9jYWwoKSwgZW5kcG9pbnQgPSBmZWVkLmdldEVuZHBvaW50KCk7CiAgICAhaXNMb2NhbCAmJiAhdGhpcy5yZXF1ZXN0Tm9uTG9jYWxGZWVkc18gPyBlbmRwb2ludC50cnlTdXNwZW5kU3RyZWFtKCkgJiYgZW5kcG9pbnQucmVxdWVzdEF2YXRhcigpIDogKHZpZXdzLnB1c2goW3N0cmVhbUlkc1tpXSwgZmVlZC5nZXRXaWR0aCgpLCBmZWVkLmdldEhlaWdodCgpXSksIGVuZHBvaW50LnRyeVJlc3VtZVN0cmVhbSgpKQogIH0KICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5TY2VuZUNoYW5nZWRFdmVudCh2aWV3cywgdGhpcykpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5wcm90b3R5cGUuZGlzcG9zZUFsbEZlZWRzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lQmFzZSQkZGlzcG9zZUFsbEZlZWRzJCgpIHsKICBpZihnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmZlZWRzXykpIHsKICAgIGZvcih2YXIgc3RyZWFtcyA9IHRoaXMuZmVlZHNfLmdldEtleXMoKSwgaSA9IDA7aSA8IHN0cmVhbXMubGVuZ3RoOysraSkgewogICAgICB0aGlzLnJlbW92ZUZlZWRJbnRlcm5hbF8oc3RyZWFtc1tpXSkKICAgIH0KICB9Cn07CnRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lQmFzZSQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0YWxrLm1lZGlhLmMzZC5TY2VuZUJhc2Uuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5kaXNwb3NlQWxsRmVlZHMoKTsKICB0aGlzLmZlZWRzXyA9IG51bGwKfTsKdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPM2RDb250ZXh0JChjYWxsTWFuYWdlciwgbzNkQnVuZGxlLCBzY2VuZSwgc3RyZWFtLCB2aWV3UXVhbGl0eUNvbnRyb2wsIG9wdF9yZW5kZXJNb2RlLCBvcHRfc21vb3RoTW9kZSkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5vM2RCdW5kbGVfID0gbzNkQnVuZGxlOwogIHRoaXMuYzNkRXZlbnRUYXJnZXRfID0gbmV3IHRhbGsubWVkaWEuYzNkLkMzZEV2ZW50VGFyZ2V0OwogIHRoaXMuYzNkRXZlbnRUYXJnZXRfLnNldFBhcmVudEV2ZW50VGFyZ2V0KHRoaXMpOwogIHRoaXMuYm91bmRPblJlc2l6ZV8gPSBnb29nLmJpbmQodGhpcy5vblJlc2l6ZV8sIHRoaXMpOwogIHRoaXMuY2FsbE1hbmFnZXJfID0gY2FsbE1hbmFnZXI7CiAgdGhpcy52aWV3UXVhbGl0eUNvbnRyb2xfID0gdmlld1F1YWxpdHlDb250cm9sOwogIHRoaXMuZXZlbnRIYW5kbGVyXyA9IG5ldyBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIodGhpcyk7CiAgdGhpcy5zY2VuZV8gPSBzY2VuZTsKICB0aGlzLnNjZW5lXy5zZXRQYXJlbnRFdmVudFRhcmdldCh0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuc2NlbmVfLCB0YWxrLm1lZGlhLmMzZC5TY2VuZUJhc2UuRXZlbnQuU0NFTkVfQ0hBTkdFRCwgdGhpcy5oYW5kbGVTY2VuZUNoYW5nZWRfKTsKICB0aGlzLnN0cmVhbXNfID0gc3RyZWFtOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5zdHJlYW1zXywgdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLkV2ZW50Lk5FV19FTkRQT0lOVCwgdGhpcy5oYW5kbGVOZXdFbmRwb2ludF8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5zdHJlYW1zXywgdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLkV2ZW50LlJFTU9WRURfRU5EUE9JTlQsIHRoaXMuaGFuZGxlUmVtb3ZlZEVuZHBvaW50Xyk7CiAgdGhpcy5yZW5kZXJNb2RlXyA9IG9wdF9yZW5kZXJNb2RlIHx8ICJBdXRvIjsKICB0aGlzLnNtb290aE1vZGVfID0gb3B0X3Ntb290aE1vZGUgfHwgITEKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CnRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQuRXZlbnRzID0ge0NBTExfQUNDRVBURUQ6Im8zZC1jYWxsLWFjY2VwdGVkIiwgSU5JVF9GSU5JU0hFRDoibzNkLWluaXQtZmluaXNoZWQiLCBSRVNJWkU6Im8zZC1yZXNpemUifTsKdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5Jbml0RmluaXNoZWRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPM2RDb250ZXh0JEluaXRGaW5pc2hlZEV2ZW50JChyZXN1bHQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQuRXZlbnRzLklOSVRfRklOSVNIRUQpOwogIHRoaXMucmVzdWx0ID0gcmVzdWx0Cn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5Jbml0RmluaXNoZWRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LlJlc2l6ZUV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZENvbnRleHQkUmVzaXplRXZlbnQkKHdpZHRoLCBoZWlnaHQpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQuRXZlbnRzLlJFU0laRSk7CiAgdGhpcy53aWR0aCA9IHdpZHRoOwogIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0Cn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5SZXNpemVFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LlJFVFJZX0lOSVRJQUxJWkVfV0FJVF8gPSAyNTA7CnRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQuTUFYX0lOSVRJQUxJWkVfV0FJVF8gPSAyRTQ7CnRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQuU0hBUkVEX1ZJRVdfRFJBV19QUklPUklUWV8gPSAwOwp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0Iik7CnRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQucHJvdG90eXBlLmluaXRpYWxpemVkXyA9ICExOwp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5lcnJvckNvdW50XyA9IDA7CnRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQucHJvdG90eXBlLmluaXRpYWxpemVXYWl0XyA9IDA7CnRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQucHJvdG90eXBlLnNldENvbnRhaW5lciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPM2RDb250ZXh0JCRzZXRDb250YWluZXIkKGNvbnRhaW5lcikgewogIHRoaXMuY29udGFpbmVyXyA9IGNvbnRhaW5lcgp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5zZXRTZXNzaW9uSWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkc2V0U2Vzc2lvbklkJChzZXNzaW9uSWQpIHsKICB0aGlzLnNlc3Npb25JZF8gPSBzZXNzaW9uSWQKfTsKdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5wcm90b3R5cGUuZ2V0U2Vzc2lvbklkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZENvbnRleHQkJGdldFNlc3Npb25JZCQoKSB7CiAgcmV0dXJuIHRoaXMuc2Vzc2lvbklkXwp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5zZXRTZW5kZXJKaWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkc2V0U2VuZGVySmlkJChzZW5kZXJKaWQpIHsKICB0aGlzLnNlbmRlckppZF8gPSBzZW5kZXJKaWQKfTsKdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5wcm90b3R5cGUuZ2V0U2VuZGVySmlkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZENvbnRleHQkJGdldFNlbmRlckppZCQoKSB7CiAgcmV0dXJuIHRoaXMuc2VuZGVySmlkXwp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5zZXRDYWxsVHlwZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPM2RDb250ZXh0JCRzZXRDYWxsVHlwZSQoY2FsbFR5cGUpIHsKICB0aGlzLmNhbGxUeXBlXyA9IGNhbGxUeXBlCn07CnRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQucHJvdG90eXBlLmdldENhbGxUeXBlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZENvbnRleHQkJGdldENhbGxUeXBlJCgpIHsKICByZXR1cm4gdGhpcy5jYWxsVHlwZV8KfTsKdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5wcm90b3R5cGUuaW5pdFBsdWdpbk9iamVjdF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkaW5pdFBsdWdpbk9iamVjdF8kKGMzZE9iamVjdCkgewogIHRyeSB7CiAgICB2YXIgYzNkID0gYzNkT2JqZWN0LmdldFBsdWdpbigpOwogICAgaWYoIWMzZCkgewogICAgICB0aGlzLmxvZ2dlcl8ud2FybmluZygiTzNEIG1pc3NpbmcgZnJvbSBET00gZHVyaW5nIGluaXRQbHVnaW5PYmplY3RfIik7CiAgICAgIHJldHVybgogICAgfQogICAgaWYoYzNkT2JqZWN0LmlzUmVuZGVyZXJVbmluaXRpYWxpemVkKCkpIHsKICAgICAgaWYodGhpcy5pbml0aWFsaXplV2FpdF8gPCB0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0Lk1BWF9JTklUSUFMSVpFX1dBSVRfKSB7CiAgICAgICAgZ29vZy5UaW1lci5jYWxsT25jZShnb29nLmJpbmQodGhpcy5pbml0UGx1Z2luT2JqZWN0XywgdGhpcywgYzNkT2JqZWN0KSwgdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5SRVRSWV9JTklUSUFMSVpFX1dBSVRfKTsKICAgICAgICB0aGlzLmluaXRpYWxpemVXYWl0XyArPSB0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LlJFVFJZX0lOSVRJQUxJWkVfV0FJVF87CiAgICAgICAgdGhpcy5sb2dnZXJfLmluZm8oIk8zRCBub3QgbG9hZGVkIHlldCwgcmV0cnlpbmcgaW4gIiArIHRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQuUkVUUllfSU5JVElBTElaRV9XQUlUXyArICIgbXMiKTsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB0aHJvdyBFcnJvcigiSGl0IG1heCByZXRyaWVzIGZvciBpbml0aWFsaXppbmcgTzNELCBxdWl0dGluZy4iKTsKICAgIH0KICAgIHRoaXMuaW5pdGlhbGl6ZWRfID0gdGhpcy5pbml0TzNkQnVuZGxlXyhjM2RPYmplY3QpCiAgfWNhdGNoKGUpIHsKICAgIHRoaXMuY2FsbE1hbmFnZXJfLmFkZFRvTG9nKCJFeGNlcHRpb24gZHVyaW5nIE8zRCBpbml0aWFsaXphdGlvbiIsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuTG9nQ29tbWVudFNldmVyaXR5LkVSUk9SLCBlKQogIH0KICB2YXIgcGx1Z2luTG9hZFRpbWVTZWNvbmRzID0gKGdvb2cubm93KCkgLSB0aGlzLm8zZEJ1bmRsZV8uc3RhcnRUaW1lKSAvIDFFMzsKICBpZih0aGlzLmluaXRpYWxpemVkXykgewogICAgdGhpcy5jYWxsTWFuYWdlcl8uYWRkVG9Mb2coIk8zRCBwbHVnaW4gd2l0aCByZW5kZXIgbW9kZSAiICsgdGhpcy5yZW5kZXJNb2RlXyArICIgc21vb3RoIG1vZGUgIiArIHRoaXMuc21vb3RoTW9kZV8gKyAiIGxvYWRlZCBmb3IgIiArIHRoaXMuc2Vzc2lvbklkXyArICIgYWZ0ZXIgIiArIHBsdWdpbkxvYWRUaW1lU2Vjb25kcyArICIgc2Vjb25kcyIpCiAgfWVsc2UgewogICAgaWYodGhpcy5jYWxsTWFuYWdlcl8uYWRkVG9Mb2coIk8zRCBwbHVnaW4gd2l0aCByZW5kZXIgbW9kZSAiICsgdGhpcy5yZW5kZXJNb2RlXyArICIgc21vb3RoIG1vZGUgIiArIHRoaXMuc21vb3RoTW9kZV8gKyAiIGZhaWxlZCB0byBsb2FkIGZvciAiICsgdGhpcy5zZXNzaW9uSWRfICsgIiBhZnRlciAiICsgcGx1Z2luTG9hZFRpbWVTZWNvbmRzICsgIiBzZWNvbmRzIiksIHRoaXMucmVtb3ZlUGx1Z2luT2JqZWN0KCksIGMzZE9iamVjdC5yZW1vdmVIVE1MKCksIGdvb2cudXNlckFnZW50Lk1BQyAmJiAiQXV0byIgPT0gdGhpcy5yZW5kZXJNb2RlXykgewogICAgICB0aGlzLmNhbGxNYW5hZ2VyXy5hZGRUb0xvZygiUmV0cnlpbmcgTzNEIHRvIGVtdWxhdGUgUmVuZGVyTW9kZT1BdXRvIik7CiAgICAgIHRoaXMucmVuZGVyTW9kZV8gPSAiMkQiOwogICAgICB0aGlzLmNyZWF0ZVBsYXllcigpOwogICAgICByZXR1cm4KICAgIH0KICB9CiAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LkluaXRGaW5pc2hlZEV2ZW50KHRoaXMuaW5pdGlhbGl6ZWRfKSkKfTsKdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5wcm90b3R5cGUuaW5pdE8zZEJ1bmRsZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkaW5pdE8zZEJ1bmRsZV8kKGMzZE9iamVjdCkgewogIHZhciBpbml0aWFsRXJyb3JDb3VudCA9IHRoaXMuZXJyb3JDb3VudF87CiAgdGhpcy5vM2RCdW5kbGVfLmMzZE9iamVjdCA9IGMzZE9iamVjdDsKICB2YXIgYzNkID0gYzNkT2JqZWN0LmdldFBsdWdpbigpLCByZW5kZXIyZCA9IGMzZC5jbGllbnQuY2xpZW50SW5mby5yZW5kZXIyZDsKICB0aGlzLm8zZEJ1bmRsZV8ub1hkR2xvYmFscyA9IHJlbmRlcjJkID8gbmV3IHRhbGsubWVkaWEuYzNkLk8yZEdsb2JhbHMoYzNkKSA6IG5ldyB0YWxrLm1lZGlhLmMzZC5PM2RHbG9iYWxzKGMzZCk7CiAgdGhpcy5vM2RCdW5kbGVfLndpZHRoID0gdGhpcy5vM2RCdW5kbGVfLm9YZEdsb2JhbHMuY2xpZW50LndpZHRoOwogIHRoaXMubzNkQnVuZGxlXy5oZWlnaHQgPSB0aGlzLm8zZEJ1bmRsZV8ub1hkR2xvYmFscy5jbGllbnQuaGVpZ2h0OwogIGMzZC5jbGllbnQuc2V0RXJyb3JDYWxsYmFjayhnb29nLmJpbmQodGhpcy5oYW5kbGVPM2RFcnJvcl8sIHRoaXMpKTsKICB0aGlzLm8zZEJ1bmRsZV8uYzNkRW5naW5lID0gbmV3IHRhbGsubWVkaWEuYzNkLkMzZEVuZ2luZTsKICB0aGlzLm8zZEJ1bmRsZV8uY3Vyc29yTWFuYWdlciA9IG5ldyB0YWxrLm1lZGlhLmMzZC5DdXJzb3JNYW5hZ2VyKHRoaXMubzNkQnVuZGxlXyk7CiAgdGhpcy5vM2RCdW5kbGVfLmMzZEVuZ2luZS5zZXRDM2QoYzNkT2JqZWN0LCB0aGlzLm8zZEJ1bmRsZV8ub1hkR2xvYmFscyk7CiAgdGhpcy5jM2RFdmVudFRhcmdldF8uc2V0QzNkKGMzZE9iamVjdCk7CiAgdGFsay5tZWRpYS5jM2QuYWRkRXZlbnRDYWxsYmFjayhjM2QsICJyZXNpemUiLCB0aGlzLmJvdW5kT25SZXNpemVfKTsKICB0aGlzLm8zZEJ1bmRsZV8ucGFjayA9IGMzZC5jbGllbnQuY3JlYXRlUGFjaygpOwogIHRoaXMubGVha0RldGVjdG9yXyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5PWGRMZWFrRGV0ZWN0b3IodGhpcy5vM2RCdW5kbGVfLnBhY2spOwogIHJlbmRlcjJkID8gKHRoaXMuY2FsbE1hbmFnZXJfLmFkZFRvTG9nKCJPM0QgcGx1Z2luIHVzZXMgc29mdHdhcmUgcmVuZGVyZXIiKSwgdGhpcy5vM2RCdW5kbGVfLnJlbmRlcmluZ0FwaSA9IHRhbGsubWVkaWEuTzNkU29mdHdhcmVSZW5kZXJpbmdBcGkuY3JlYXRlKHRoaXMubzNkQnVuZGxlXykpIDogKHRoaXMuY2FsbE1hbmFnZXJfLmFkZFRvTG9nKCJPM0QgcGx1Z2luIHVzZXMgaGFyZHdhcmUgcmVuZGVyZXIiKSwgdGhpcy5vM2RCdW5kbGVfLnJlbmRlcmluZ0FwaSA9IHRhbGsubWVkaWEuTzNkSGFyZHdhcmVSZW5kZXJpbmdBcGkuY3JlYXRlKHRoaXMubzNkQnVuZGxlXykpOwogIHRoaXMuY2FsbE1hbmFnZXJfLmFkZFRvTG9nKCJSZW5kZXJpbmcgdXNpbmcgIiArIHRoaXMubzNkQnVuZGxlXy5yZW5kZXJpbmdBcGkuZ2V0SW1wbGVtZW50YXRpb25OYW1lKCkgKyAiIGltcGxlbWVudGF0aW9uIHdpdGggIiArIHRoaXMubzNkQnVuZGxlXy5yZW5kZXJpbmdBcGkuZ2V0QmFja2VuZE5hbWUoKSArICIgYmFja2VuZCIpOwogIHRoaXMubzNkQnVuZGxlXy52aWV3ID0gdGhpcy5vM2RCdW5kbGVfLnJlbmRlcmluZ0FwaS5jcmVhdGVWaWV3KHRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQuU0hBUkVEX1ZJRVdfRFJBV19QUklPUklUWV8sICExLCB2b2lkIDAsIHRoaXMuY2xlYXJDb2xvcl8pOwogIHRoaXMubzNkQnVuZGxlXy50ZXh0dXJlQ2FjaGUgPSBuZXcgdGFsay5tZWRpYS5jM2QuVGV4dHVyZUNhY2hlKHRoaXMubzNkQnVuZGxlXyk7CiAgdGhpcy51cGRhdGVQZXJzcGVjdGl2ZV8oKTsKICByZXR1cm4gdGhpcy5lcnJvckNvdW50XyA9PSBpbml0aWFsRXJyb3JDb3VudAp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5pc1JlYWR5ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZENvbnRleHQkJGlzUmVhZHkkKCkgewogIHJldHVybiB0aGlzLmluaXRpYWxpemVkXwp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5vblJlc2l6ZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkb25SZXNpemVfJChlKSB7CiAgdGhpcy5vM2RCdW5kbGVfLndpZHRoID0gZS53aWR0aDsKICB0aGlzLm8zZEJ1bmRsZV8uaGVpZ2h0ID0gZS5oZWlnaHQ7CiAgdGhpcy51cGRhdGVQZXJzcGVjdGl2ZV8oKQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS51cGRhdGVQZXJzcGVjdGl2ZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkdXBkYXRlUGVyc3BlY3RpdmVfJCgpIHsKICB0aGlzLnNjZW5lXy5zZXRBcmVhKDAsIDAsIHRoaXMubzNkQnVuZGxlXy53aWR0aCwgdGhpcy5vM2RCdW5kbGVfLmhlaWdodCk7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LlJlc2l6ZUV2ZW50KHRoaXMubzNkQnVuZGxlXy53aWR0aCwgdGhpcy5vM2RCdW5kbGVfLmhlaWdodCkpCn07CnRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQucHJvdG90eXBlLmhhbmRsZU8zZEVycm9yXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPM2RDb250ZXh0JCRoYW5kbGVPM2RFcnJvcl8kKG1zZykgewogICJUZXh0dXJlIHdpdGggaWQgIiA9PSBtc2cuc3Vic3RyaW5nKDAsIDE2KSAmJiAiIG5vdCBmb3VuZCIgPT0gbXNnLnN1YnN0cmluZyhtc2cubGVuZ3RoIC0gMTApIHx8ICgrK3RoaXMuZXJyb3JDb3VudF8sIHRoaXMuY2FsbE1hbmFnZXJfLmFkZFRvTG9nKCJFcnJvciBmcm9tIE8zRCBwbHVnaW46ICIgKyBtc2csIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuTG9nQ29tbWVudFNldmVyaXR5LldBUk5JTkcpKQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5zZXRCYWNrZ3JvdW5kQ29sb3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkc2V0QmFja2dyb3VuZENvbG9yJChjb2xvcikgewogIHRoaXMuY2xlYXJDb2xvcl8gPSBbXTsKICBmb3IodmFyIGkgPSAwOzMgPiBpOysraSkgewogICAgdGhpcy5jbGVhckNvbG9yX1tpXSA9IGNvbG9yW2ldIC8gMjU1CiAgfQogIHRoaXMuY2xlYXJDb2xvcl8ucHVzaCgxKQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5yZW1vdmVQbHVnaW5PYmplY3QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkcmVtb3ZlUGx1Z2luT2JqZWN0JCgpIHsKICB0aGlzLm8zZEJ1bmRsZV8udmlldyAmJiAodGhpcy5vM2RCdW5kbGVfLnZpZXcuZGlzcG9zZSgpLCB0aGlzLm8zZEJ1bmRsZV8udmlldyA9IG51bGwpOwogIHRoaXMubzNkQnVuZGxlXy5yZW5kZXJpbmdBcGkgJiYgKHRoaXMubzNkQnVuZGxlXy5yZW5kZXJpbmdBcGkuZGlzcG9zZSgpLCB0aGlzLm8zZEJ1bmRsZV8ucmVuZGVyaW5nQXBpID0gbnVsbCk7CiAgdGhpcy5vM2RCdW5kbGVfLnBhY2sgPSBudWxsOwogIHRoaXMuYzNkRXZlbnRUYXJnZXRfLnNldEMzZChudWxsKTsKICB0aGlzLm8zZEJ1bmRsZV8uYzNkRW5naW5lICYmICh0aGlzLm8zZEJ1bmRsZV8uYzNkRW5naW5lLnVucmVnaXN0ZXJBbGxSZW5kZXJDYWxsYmFja3MoKSwgdGhpcy5vM2RCdW5kbGVfLmMzZEVuZ2luZS5zZXRDM2QobnVsbCwgbnVsbCksIHRoaXMubzNkQnVuZGxlXy5jM2RFbmdpbmUgPSBudWxsKTsKICB0aGlzLm8zZEJ1bmRsZV8udGV4dHVyZUNhY2hlICYmICh0aGlzLm8zZEJ1bmRsZV8udGV4dHVyZUNhY2hlLmRpc3Bvc2UoKSwgdGhpcy5vM2RCdW5kbGVfLnRleHR1cmVDYWNoZSA9IG51bGwpOwogIHRoaXMubzNkQnVuZGxlXy5vWGRHbG9iYWxzID0gbnVsbDsKICB0aGlzLmxlYWtEZXRlY3Rvcl8gJiYgKHRoaXMubGVha0RldGVjdG9yXy5yZXBvcnRMZWFrcygpLCB0aGlzLmxlYWtEZXRlY3Rvcl8uZGlzcG9zZSgpLCB0aGlzLmxlYWtEZXRlY3Rvcl8gPSBudWxsKTsKICBpZih0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0KSB7CiAgICBpZih0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LmlzU2NyaXB0YWJsZSgpKSB7CiAgICAgIHZhciBjM2QgPSB0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LmdldFBsdWdpbigpOwogICAgICB0YWxrLm1lZGlhLmMzZC5yZW1vdmVFdmVudENhbGxiYWNrKGMzZCwgInJlc2l6ZSIsIHRoaXMuYm91bmRPblJlc2l6ZV8pOwogICAgICBjM2QuY2xpZW50LmNsZWFyRXJyb3JDYWxsYmFjaygpCiAgICB9CiAgICB2YXIgdW5sb2FkU3RhcnRUaW1lID0gZ29vZy5ub3coKTsKICAgIHRoaXMubzNkQnVuZGxlXy5jM2RPYmplY3QucmVtb3ZlSFRNTCgpOwogICAgdGhpcy5vM2RCdW5kbGVfLmMzZE9iamVjdCA9IG51bGw7CiAgICB2YXIgcGx1Z2luVW5sb2FkVGltZVNlY29uZHMgPSAoZ29vZy5ub3coKSAtIHVubG9hZFN0YXJ0VGltZSkgLyAxRTM7CiAgICB0aGlzLmNhbGxNYW5hZ2VyXy5hZGRUb0xvZygiTzNEIHBsdWdpbiB1bmxvYWQgZm9yICIgKyB0aGlzLnNlc3Npb25JZF8gKyAiIHRvb2sgIiArIHBsdWdpblVubG9hZFRpbWVTZWNvbmRzICsgIiBzZWNvbmRzIikKICB9CiAgdGhpcy5pbml0aWFsaXplZF8gPSAhMQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5oYW5kbGVOZXdFbmRwb2ludF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkaGFuZGxlTmV3RW5kcG9pbnRfJChlKSB7CiAgdGhpcy5zY2VuZV8uaGFzRmVlZChlLmVuZHBvaW50LmdldFN0cmVhbUlkKCkpIHx8IHRoaXMuc2NlbmVfLmFkZEZlZWQoZS5lbmRwb2ludCkKfTsKdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5wcm90b3R5cGUuaGFuZGxlUmVtb3ZlZEVuZHBvaW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPM2RDb250ZXh0JCRoYW5kbGVSZW1vdmVkRW5kcG9pbnRfJChlKSB7CiAgdGhpcy5zY2VuZV8uaGFzRmVlZChlLmVuZHBvaW50LmdldFN0cmVhbUlkKCkpICYmIHRoaXMuc2NlbmVfLnJlbW92ZUZlZWQoZS5lbmRwb2ludC5nZXRTdHJlYW1JZCgpKQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5hZGRQYXJ0aWNpcGFudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPM2RDb250ZXh0JCRhZGRQYXJ0aWNpcGFudCQocGFydGljaXBhbnQpIHsKICB0aGlzLnN0cmVhbXNfLmFkZFBhcnRpY2lwYW50KHBhcnRpY2lwYW50KQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5yZW1vdmVQYXJ0aWNpcGFudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPM2RDb250ZXh0JCRyZW1vdmVQYXJ0aWNpcGFudCQocGFydGljaXBhbnQsIHNzcmMpIHsKICB0aGlzLnN0cmVhbXNfLnJlbW92ZVBhcnRpY2lwYW50KHBhcnRpY2lwYW50LCBzc3JjKQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5yZWxheUNhbGxNZXNzYWdlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZENvbnRleHQkJHJlbGF5Q2FsbE1lc3NhZ2UkKHR5cGUsIG1lc3NhZ2UpIHsKICB0aGlzLnNlbmRUb1BsYXllcih0eXBlLCBtZXNzYWdlKQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5zZW5kVG9QbGF5ZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkc2VuZFRvUGxheWVyJChtc2csIGFyZ3MpIHsKICBpZih0aGlzLmlzUmVhZHkoKSkgewogICAgdmFyIGFyZ3NBcnJheSA9IGFyZ3M7CiAgICAic3RyaW5nIiA9PSB0eXBlb2YgYXJncyAmJiAoYXJnc0FycmF5ID0gZ29vZy5qc29uLnBhcnNlKGFyZ3MpKTsKICAgIHN3aXRjaChtc2cpIHsKICAgICAgY2FzZSB0YWxrLm1lZGlhLkNvbW11bmljYXRpb25QbGF5ZXIuU2VuZE1zZy5VSV9DT01NQU5EOgogICAgICAgICJhIiA9PSBhcmdzQXJyYXlbMF0gJiYgdGhpcy5jYWxsVHlwZV8gIT0gdGFsay5tZWRpYS5DYWxsVHlwZS5URVNUICYmIHRoaXMuc2V0Q2FsbEFjY2VwdGVkKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyLlNlbmRNc2cuSklOR0xFOgogICAgICAgICJqYSIgPT0gYXJnc0FycmF5WzBdICYmIHRoaXMuY2FsbFR5cGVfICE9IHRhbGsubWVkaWEuQ2FsbFR5cGUuVEVTVCAmJiB0aGlzLnNldENhbGxBY2NlcHRlZCgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5TZW5kTXNnLlBMVUdJTl9EQVRBOgogICAgICAgIHRoaXMuc3RyZWFtc18uaGFuZGxlVGFsa1BsdWdpbk1lc3NhZ2UoYXJnc0FycmF5KTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aGlzLmxvZ2dlcl8ud2FybmluZygic2VuZFRvUGxheWVyKCk6IHVuaGFuZGxlZCBtZXNzYWdlIHR5cGU6ICIgKyBtc2cpCiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5yZW1vdmVQbGF5ZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkcmVtb3ZlUGxheWVyJCgpIHsKICB0aGlzLnNjZW5lXy5kaXNwb3NlQWxsRmVlZHMoKTsKICB0aGlzLnN0cmVhbXNfLmRpc3Bvc2VTZXNzaW9uKCk7CiAgdGhpcy5yZW1vdmVQbHVnaW5PYmplY3QoKTsKICB0aGlzLnZpZXdRdWFsaXR5Q29udHJvbF8uZGlzcG9zZVZpZXdzKHRoaXMuc2NlbmVfKQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5jcmVhdGVQbGF5ZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkY3JlYXRlUGxheWVyJCgpIHsKICAiQXV0byIgPT0gdGhpcy5yZW5kZXJNb2RlXyAmJiBnb29nLnVzZXJBZ2VudC5NQUMgJiYgZ29vZy51c2VyQWdlbnQucHJvZHVjdC5DSFJPTUUgJiYgIWdvb2cudXNlckFnZW50LnBsYXRmb3JtLmlzVmVyc2lvbigiMTAuNiIpICYmICh0aGlzLmxvZ2dlcl8uaW5mbygiRm9yY2luZyBSZW5kZXJNb2RlPTJEIGZvciBPUyBYIDEwLjUgQ2hyb21lIiksIHRoaXMucmVuZGVyTW9kZV8gPSAiMkQiKTsKICB0aGlzLm8zZEJ1bmRsZV8uc3RhcnRUaW1lID0gZ29vZy5ub3coKTsKICB2YXIgYzNkT2JqZWN0ID0gbmV3IHRhbGsubWVkaWEuYzNkLkMzZE9iamVjdCh0aGlzLnJlbmRlck1vZGVfLCB0aGlzLnNtb290aE1vZGVfLCB0aGlzLmNsZWFyQ29sb3JfKTsKICBjM2RPYmplY3Qud3JpdGVIVE1MKHRoaXMuY29udGFpbmVyXywgdm9pZCAwKTsKICBnb29nLlRpbWVyLmNhbGxPbmNlKGdvb2cuYmluZCh0aGlzLmluaXRQbHVnaW5PYmplY3RfLCB0aGlzLCBjM2RPYmplY3QpLCAwKQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5pc0FjY2VwdGVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJE8zZENvbnRleHQkJGlzQWNjZXB0ZWQkKCkgewogIGlmKCFnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmNhbGxNYW5hZ2VyXykpIHsKICAgIHJldHVybiExCiAgfQogIHZhciBjYWxsID0gdGhpcy5jYWxsTWFuYWdlcl8uZmluZENhbGwodGhpcy5zZW5kZXJKaWRfKTsKICByZXR1cm4gZ29vZy5pc0RlZkFuZE5vdE51bGwoY2FsbCkgJiYgKGNhbGwuc3RhdGUgPT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLlN0YXRlLkFDVElWRV9DQUxMIHx8IGNhbGwuc3RhdGUgPT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5DYWxsLlN0YXRlLkNBTExfT05fSE9MRCkKfTsKdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5wcm90b3R5cGUuaGFuZGxlU2NlbmVDaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRPM2RDb250ZXh0JCRoYW5kbGVTY2VuZUNoYW5nZWRfJChlKSB7CiAgdGhpcy52aWV3UXVhbGl0eUNvbnRyb2xfLmFkanVzdFF1YWxpdHlGb3JWaWV3cyhlLnZpZXdzLCBlLnNjZW5lKQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5zZXRDYWxsQWNjZXB0ZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkc2V0Q2FsbEFjY2VwdGVkJCgpIHsKICB0aGlzLnN0cmVhbXNfLnJlcXVlc3RBbGwoKTsKICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGdvb2cuZXZlbnRzLkV2ZW50KHRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQuRXZlbnRzLkNBTExfQUNDRVBURUQpKQp9Owp0YWxrLm1lZGlhLmMzZC5PM2RDb250ZXh0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTzNkQ29udGV4dCQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0aGlzLnJlbW92ZVBsYXllcigpOwogIGdvb2cuZGlzcG9zZSh0aGlzLmMzZEV2ZW50VGFyZ2V0Xyk7CiAgZ29vZy5kaXNwb3NlKHRoaXMuZXZlbnRIYW5kbGVyXyk7CiAgdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLmMzZC5CYXNlRmVlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRCYXNlRmVlZCQobzNkQnVuZGxlLCBlbmRwb2ludCwgZGVwdGgsIG9wdF9zZWxlY3RhYmxlKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLm8zZEJ1bmRsZSA9IG8zZEJ1bmRsZTsKICB0aGlzLmVuZHBvaW50XyA9IGVuZHBvaW50OwogIHRoaXMuYXR0cnNfID0gbmV3IHRhbGsubWVkaWEuYzNkLkF0dHJzKDAsIDAsIGRlcHRoLCAwLCAwLCAxKTsKICB0aGlzLnNlbGVjdGFibGVfID0gb3B0X3NlbGVjdGFibGUgfHwgITE7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuZW5kcG9pbnRfLCB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5FdmVudHMuQVNQRUNUX0NIQU5HRUQsIHRoaXMub25FbmRwb2ludENoYW5nZV8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5lbmRwb2ludF8sIHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkV2ZW50cy5BVkFUQVIsIHRoaXMub25FbmRwb2ludENoYW5nZV8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5lbmRwb2ludF8sIHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkV2ZW50cy5URVhUVVJFX0FDVElWQVRFRCwgdGhpcy5vblRleHR1cmVBY3RpdmF0ZWQpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5lbmRwb2ludF8sIHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkV2ZW50cy5DQU1FUkFfTVVURSwgdGhpcy5vbkNhbWVyYU11dGVDaGFuZ2VkXykKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5CYXNlRmVlZCwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwp0YWxrLm1lZGlhLmMzZC5CYXNlRmVlZC5wcm90b3R5cGUuZ2V0QXR0cnMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQmFzZUZlZWQkJGdldEF0dHJzJCgpIHsKICByZXR1cm4gbmV3IHRhbGsubWVkaWEuYzNkLkF0dHJzKHRoaXMuYXR0cnNfLngsIHRoaXMuYXR0cnNfLnksIHRoaXMuYXR0cnNfLnosIHRoaXMuYXR0cnNfLncsIHRoaXMuYXR0cnNfLmgsIHRoaXMuYXR0cnNfLmQpCn07CnRhbGsubWVkaWEuYzNkLkJhc2VGZWVkLnByb3RvdHlwZS5pc1NlbGVjdGFibGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQmFzZUZlZWQkJGlzU2VsZWN0YWJsZSQoKSB7CiAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZV8KfTsKdGFsay5tZWRpYS5jM2QuQmFzZUZlZWQucHJvdG90eXBlLmdldEZlZWRBdHRycyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRCYXNlRmVlZCQkZ2V0RmVlZEF0dHJzJCgpIHsKICByZXR1cm4gdGhpcy5mZWVkT2JqZWN0ID8gdGhpcy5mZWVkT2JqZWN0LmdldEF0dHJzKCkgOiBudWxsCn07CnRhbGsubWVkaWEuYzNkLkJhc2VGZWVkLnByb3RvdHlwZS5nZXRFbmRwb2ludCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRCYXNlRmVlZCQkZ2V0RW5kcG9pbnQkKCkgewogIHJldHVybiB0aGlzLmVuZHBvaW50Xwp9Owp0YWxrLm1lZGlhLmMzZC5CYXNlRmVlZC5wcm90b3R5cGUub25FbmRwb2ludENoYW5nZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQmFzZUZlZWQkJG9uRW5kcG9pbnRDaGFuZ2VfJCgpIHsKICB0aGlzLnJlcG9zaXRpb24oKQp9Owp0YWxrLm1lZGlhLmMzZC5CYXNlRmVlZC5wcm90b3R5cGUub25UZXh0dXJlQWN0aXZhdGVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEJhc2VGZWVkJCRvblRleHR1cmVBY3RpdmF0ZWQkKCkgewp9Owp0YWxrLm1lZGlhLmMzZC5CYXNlRmVlZC5wcm90b3R5cGUub25DYW1lcmFNdXRlQ2hhbmdlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQmFzZUZlZWQkJG9uQ2FtZXJhTXV0ZUNoYW5nZWRfJChlKSB7CiAgdGhpcy5mZWVkT2JqZWN0ICYmIHRoaXMuZmVlZE9iamVjdC5vdmVycmlkZUFscGhhVG9aZXJvKGUubXV0ZWQpCn07CnRhbGsubWVkaWEuYzNkLkJhc2VGZWVkLnByb3RvdHlwZS5tb3VzZU92ZXIgPSBnb29nLm51bGxGdW5jdGlvbjsKdGFsay5tZWRpYS5jM2QuQmFzZUZlZWQucHJvdG90eXBlLm1vdXNlT3V0ID0gZ29vZy5udWxsRnVuY3Rpb247CnRhbGsubWVkaWEuYzNkLkJhc2VGZWVkLnByb3RvdHlwZS5tb3VzZVVwID0gZ29vZy5udWxsRnVuY3Rpb247CnRhbGsubWVkaWEuYzNkLkJhc2VGZWVkLnByb3RvdHlwZS5tb3VzZURvd24gPSBnb29nLm51bGxGdW5jdGlvbjsKdGFsay5tZWRpYS5jM2QuQmFzZUZlZWQucHJvdG90eXBlLnJlcG9zaXRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQmFzZUZlZWQkJHJlcG9zaXRpb24kKCkgewogIGlmKCF0aGlzLmZlZWRPYmplY3QpIHsKICAgIGlmKCF0aGlzLmVuZHBvaW50Xy5pc09uKCkpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICB0aGlzLmZlZWRPYmplY3QgPSB0aGlzLmNyZWF0ZUZlZWRPYmplY3QoKTsKICAgIHRoaXMuZW5kcG9pbnRfLmdldExvY2FsQ2FtZXJhTXV0ZSgpICYmIHRoaXMuZmVlZE9iamVjdC5vdmVycmlkZUFscGhhVG9aZXJvKCEwKQogIH0KICB0aGlzLmZpbGxBdHRyaWJ1dGVzKHRoaXMuYXR0cnNfLCB0aGlzLmVuZHBvaW50Xy5nZXRBc3BlY3QoKSk7CiAgdGhpcy51cGRhdGVQb3NpdGlvbih0aGlzLmF0dHJzXykKfTsKdGFsay5tZWRpYS5jM2QuQmFzZUZlZWQucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEJhc2VGZWVkJCR1cGRhdGVQb3NpdGlvbiQoYXR0cnMpIHsKICB0aGlzLmZlZWRPYmplY3Quc2V0QXR0cnMoYXR0cnMpCn07CnRhbGsubWVkaWEuYzNkLkJhc2VGZWVkLnByb3RvdHlwZS5jcmVhdGVGZWVkT2JqZWN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEJhc2VGZWVkJCRjcmVhdGVGZWVkT2JqZWN0JCgpIHsKICB2YXIgcmVuZGVyaW5nQXBpID0gdGhpcy5vM2RCdW5kbGUucmVuZGVyaW5nQXBpOwogIHJldHVybiByZW5kZXJpbmdBcGkuY3JlYXRlU2NlbmVPYmplY3QodGhpcy5vM2RCdW5kbGUudmlldywgdGhpcy5lbmRwb2ludF8ubWF0ZXJpYWwpCn07CnRhbGsubWVkaWEuYzNkLkJhc2VGZWVkLnByb3RvdHlwZS5pc0luaXRpYWxpemVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEJhc2VGZWVkJCRpc0luaXRpYWxpemVkJCgpIHsKICByZXR1cm4gZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5mZWVkT2JqZWN0KQp9Owp0YWxrLm1lZGlhLmMzZC5CYXNlRmVlZC5wcm90b3R5cGUuc2V0VmlzaWJsZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRCYXNlRmVlZCQkc2V0VmlzaWJsZSQodmlzaWJsZSkgewogIHRoaXMuZW5kcG9pbnRfLmlzT24oKSAmJiAodGhpcy5yZXBvc2l0aW9uKCksIHZpc2libGUgPyB0aGlzLmZlZWRPYmplY3Quc2V0QWxwaGEoMSkgOiB0aGlzLmZlZWRPYmplY3Quc2V0QWxwaGEoMCkpCn07CnRhbGsubWVkaWEuYzNkLkJhc2VGZWVkLnByb3RvdHlwZS5nZXRIYW5kbGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEJhc2VGZWVkJCRnZXRIYW5kbGVyJCgpIHsKICByZXR1cm4gdGhpcy5ldmVudEhhbmRsZXJfCn07CnRhbGsubWVkaWEuYzNkLkJhc2VGZWVkLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQmFzZUZlZWQkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGFsay5tZWRpYS5jM2QuQmFzZUZlZWQuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5mZWVkT2JqZWN0ICYmICh0aGlzLmZlZWRPYmplY3Quc2V0QWxwaGEoMCksIHRoaXMuZmVlZE9iamVjdC5kaXNwb3NlKCksIHRoaXMuZmVlZE9iamVjdCA9IG51bGwpOwogIHRoaXMuZXZlbnRIYW5kbGVyXyAmJiAodGhpcy5ldmVudEhhbmRsZXJfLmRpc3Bvc2UoKSwgdGhpcy5ldmVudEhhbmRsZXJfID0gbnVsbCkKfTsKdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGaXhlZEFyZWFGZWVkJChvM2RCdW5kbGUsIGVuZHBvaW50LCBkZXB0aCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmFkZUluLCBvcHRfc2VsZWN0YWJsZSwgb3B0X3ZlcnRpY2FsQWxpZ24sIG9wdF9ob3Jpem9udGFsQWxpZ24pIHsKICB0YWxrLm1lZGlhLmMzZC5CYXNlRmVlZC5jYWxsKHRoaXMsIG8zZEJ1bmRsZSwgZW5kcG9pbnQsIGRlcHRoLCBvcHRfc2VsZWN0YWJsZSk7CiAgdGhpcy5mYWRlSW5fID0gZmFkZUluOwogIHRoaXMudmVydGljYWxBbGlnbl8gPSBvcHRfdmVydGljYWxBbGlnbiB8fCB0YWxrLm1lZGlhLmMzZC5GaXhlZEFyZWFGZWVkLlZlcnRpY2FsQWxpZ24uQ0VOVEVSOwogIHRoaXMuaG9yaXpvbnRhbEFsaWduXyA9IG9wdF9ob3Jpem9udGFsQWxpZ24gfHwgdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5Ib3Jpem9udGFsQWxpZ24uQ0VOVEVSOwogIHRoaXMuc2V0QXJlYSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKICBlbmRwb2ludC5pc09uKCkgJiYgKHRoaXMuZmFkZUluXyA/IHRoaXMuZmFkZUluKCkgOiB0aGlzLnNldFZpc2libGUoITApKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLkZpeGVkQXJlYUZlZWQsIHRhbGsubWVkaWEuYzNkLkJhc2VGZWVkKTsKdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5Ib3Jpem9udGFsQWxpZ24gPSB7TEVGVDoibCIsIENFTlRFUjoiYyIsIFJJR0hUOiJyIn07CnRhbGsubWVkaWEuYzNkLkZpeGVkQXJlYUZlZWQuVmVydGljYWxBbGlnbiA9IHtUT1A6InQiLCBDRU5URVI6ImMiLCBCT1RUT006ImIifTsKdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5ERUZBVUxUX0FWQVRBUl9TSVpFX0ZSQUNUSU9OXyA9IDAuODsKdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5GQURFX0lOX0RVUkFUSU9OXyA9IDE7CnRhbGsubWVkaWEuYzNkLkZpeGVkQXJlYUZlZWQucHJvdG90eXBlLmF2YXRhclNpemVGcmFjdGlvbl8gPSB0YWxrLm1lZGlhLmMzZC5GaXhlZEFyZWFGZWVkLkRFRkFVTFRfQVZBVEFSX1NJWkVfRlJBQ1RJT05fOwp0YWxrLm1lZGlhLmMzZC5GaXhlZEFyZWFGZWVkLnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZpeGVkQXJlYUZlZWQkJGdldFgkKCkgewogIHJldHVybiB0aGlzLngKfTsKdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGaXhlZEFyZWFGZWVkJCRnZXRZJCgpIHsKICByZXR1cm4gdGhpcy55Cn07CnRhbGsubWVkaWEuYzNkLkZpeGVkQXJlYUZlZWQucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZpeGVkQXJlYUZlZWQkJGdldFdpZHRoJCgpIHsKICByZXR1cm4gdGhpcy53aWR0aAp9Owp0YWxrLm1lZGlhLmMzZC5GaXhlZEFyZWFGZWVkLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRml4ZWRBcmVhRmVlZCQkZ2V0SGVpZ2h0JCgpIHsKICByZXR1cm4gdGhpcy5oZWlnaHQKfTsKdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5wcm90b3R5cGUuc2V0QXJlYSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGaXhlZEFyZWFGZWVkJCRzZXRBcmVhJCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7CiAgdGhpcy54ID0geDsKICB0aGlzLnkgPSB5OwogIHRoaXMud2lkdGggPSB3aWR0aDsKICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICB0aGlzLnJlcG9zaXRpb24oKQp9Owp0YWxrLm1lZGlhLmMzZC5GaXhlZEFyZWFGZWVkLnByb3RvdHlwZS5oaXRUZXN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZpeGVkQXJlYUZlZWQkJGhpdFRlc3QkKHgsIHkpIHsKICByZXR1cm4geCA+PSB0aGlzLnggJiYgeCA8PSB0aGlzLnggKyB0aGlzLndpZHRoICYmIHkgPj0gdGhpcy55ICYmIHkgPD0gdGhpcy55ICsgdGhpcy5oZWlnaHQKfTsKdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5wcm90b3R5cGUuZmFkZUluID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZpeGVkQXJlYUZlZWQkJGZhZGVJbiQoKSB7CiAgdGhpcy5yZXBvc2l0aW9uKCk7CiAgdGhpcy5maXhlZEFyZWFGZWVkVHdlZW5fICYmIHRoaXMubzNkQnVuZGxlLmMzZEVuZ2luZS51bnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sodGhpcy5maXhlZEFyZWFGZWVkVHdlZW5fKTsKICB0aGlzLmZpeGVkQXJlYUZlZWRUd2Vlbl8gPSBuZXcgdGFsay5tZWRpYS5jM2QuQWxwaGFUd2Vlbih0aGlzLmZlZWRPYmplY3QsIDAsIDEsIHRhbGsubWVkaWEuYzNkLkZpeGVkQXJlYUZlZWQuRkFERV9JTl9EVVJBVElPTl8sIHRhbGsubWVkaWEuYzNkLmVhc2luZy5SRUdVTEFSX0VBU0VfSU4pOwogIHRoaXMubzNkQnVuZGxlLmMzZEVuZ2luZS5yZWdpc3RlclJlbmRlckNhbGxiYWNrKHRoaXMuZml4ZWRBcmVhRmVlZFR3ZWVuXykKfTsKdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5wcm90b3R5cGUuZmlsbEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRml4ZWRBcmVhRmVlZCQkZmlsbEF0dHJpYnV0ZXMkKGF0dHJzLCBhc3BlY3QpIHsKICB2YXIgZncgPSB0aGlzLndpZHRoLCBmaCA9IHRoaXMuaGVpZ2h0OwogIHRoaXMuZ2V0RW5kcG9pbnQoKS5pc0F2YXRhcigpICYmIChmdyAqPSB0aGlzLmF2YXRhclNpemVGcmFjdGlvbl8sIGZoICo9IHRoaXMuYXZhdGFyU2l6ZUZyYWN0aW9uXyk7CiAgMCAhPSBmaCAmJiBmdyAvIGZoIDwgYXNwZWN0ID8gZmggPSBmdyAvIGFzcGVjdCA6IGZ3ID0gZmggKiBhc3BlY3Q7CiAgc3dpdGNoKHRoaXMuaG9yaXpvbnRhbEFsaWduXykgewogICAgY2FzZSB0YWxrLm1lZGlhLmMzZC5GaXhlZEFyZWFGZWVkLkhvcml6b250YWxBbGlnbi5MRUZUOgogICAgICBhdHRycy54ID0gdGhpcy54OwogICAgICBicmVhazsKICAgIGNhc2UgdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5Ib3Jpem9udGFsQWxpZ24uUklHSFQ6CiAgICAgIGF0dHJzLnggPSB0aGlzLnggKyAodGhpcy53aWR0aCAtIGZ3KTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBhdHRycy54ID0gdGhpcy54ICsgKHRoaXMud2lkdGggLSBmdykgLyAyCiAgfQogIHN3aXRjaCh0aGlzLnZlcnRpY2FsQWxpZ25fKSB7CiAgICBjYXNlIHRhbGsubWVkaWEuYzNkLkZpeGVkQXJlYUZlZWQuVmVydGljYWxBbGlnbi5UT1A6CiAgICAgIGF0dHJzLnkgPSB0aGlzLnk7CiAgICAgIGJyZWFrOwogICAgY2FzZSB0YWxrLm1lZGlhLmMzZC5GaXhlZEFyZWFGZWVkLlZlcnRpY2FsQWxpZ24uQk9UVE9NOgogICAgICBhdHRycy55ID0gdGhpcy55ICsgKHRoaXMuaGVpZ2h0IC0gZmgpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGF0dHJzLnkgPSB0aGlzLnkgKyAodGhpcy5oZWlnaHQgLSBmaCkgLyAyCiAgfQogIGF0dHJzLnggPSBNYXRoLnJvdW5kKGF0dHJzLngpOwogIGF0dHJzLnkgPSBNYXRoLnJvdW5kKGF0dHJzLnkpOwogIGF0dHJzLncgPSBNYXRoLnJvdW5kKGZ3KTsKICBhdHRycy5oID0gTWF0aC5yb3VuZChmaCkKfTsKdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5wcm90b3R5cGUub25UZXh0dXJlQWN0aXZhdGVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZpeGVkQXJlYUZlZWQkJG9uVGV4dHVyZUFjdGl2YXRlZCQoKSB7CiAgdGhpcy5mYWRlSW5fID8gdGhpcy5mYWRlSW4oKSA6IHRoaXMuc2V0VmlzaWJsZSghMCkKfTsKdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZpeGVkQXJlYUZlZWQkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGhpcy5maXhlZEFyZWFGZWVkVHdlZW5fICYmIHRoaXMubzNkQnVuZGxlLmMzZEVuZ2luZS51bnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sodGhpcy5maXhlZEFyZWFGZWVkVHdlZW5fKTsKICB0aGlzLmZpeGVkQXJlYUZlZWRUd2Vlbl8gPSBudWxsOwogIHRhbGsubWVkaWEuYzNkLkZpeGVkQXJlYUZlZWQuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKdGFsay5tZWRpYS5jM2QuUGlwT3B0aW9ucyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBPcHRpb25zJCgpIHsKICB0aGlzLmNvcm5lcl8gPSB0YWxrLm1lZGlhLmMzZC5QaXBPcHRpb25zLkRFRkFVTFRfQ09STkVSXzsKICB0aGlzLnNpemVfID0gdGFsay5tZWRpYS5jM2QuUGlwT3B0aW9ucy5ERUZBVUxUX1NJWkVfOwogIHRoaXMudmlzaWJsZV8gPSAhMAp9Owp0YWxrLm1lZGlhLmMzZC5QaXBPcHRpb25zLkNvcm5lciA9IHtCT1RUT01fTEVGVDowLCBCT1RUT01fUklHSFQ6MSwgVE9QX1JJR0hUOjIsIFRPUF9MRUZUOjN9Owp0YWxrLm1lZGlhLmMzZC5QaXBPcHRpb25zLkRFRkFVTFRfQ09STkVSXyA9IHRhbGsubWVkaWEuYzNkLlBpcE9wdGlvbnMuQ29ybmVyLkJPVFRPTV9SSUdIVDsKdGFsay5tZWRpYS5jM2QuUGlwT3B0aW9ucy5ERUZBVUxUX1NJWkVfID0gMSAvIDM7CnRhbGsubWVkaWEuYzNkLlBpcE9wdGlvbnMucHJvdG90eXBlLmdldENvcm5lciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBPcHRpb25zJCRnZXRDb3JuZXIkKCkgewogIHJldHVybiB0aGlzLmNvcm5lcl8KfTsKdGFsay5tZWRpYS5jM2QuUGlwT3B0aW9ucy5wcm90b3R5cGUuZ2V0U2l6ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBPcHRpb25zJCRnZXRTaXplJCgpIHsKICByZXR1cm4gdGhpcy5zaXplXwp9Owp0YWxrLm1lZGlhLmMzZC5QaXBPcHRpb25zLnByb3RvdHlwZS5zZXRTaXplID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcE9wdGlvbnMkJHNldFNpemUkKHNpemUpIHsKICB0aGlzLnNpemVfID0gc2l6ZQp9Owp0YWxrLm1lZGlhLmMzZC5QaXBPcHRpb25zLnByb3RvdHlwZS5zZXRWaXNpYmxlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcE9wdGlvbnMkJHNldFZpc2libGUkKHZpc2libGUpIHsKICB0aGlzLnZpc2libGVfID0gdmlzaWJsZQp9Owp0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGZWVkSGFuZGxlciQobzNkQnVuZGxlLCBmZWVkLCBvcHRfYWRkTW91c2VMaXN0ZW5lcnMpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKTsKICB0aGlzLm8zZEJ1bmRsZSA9IG8zZEJ1bmRsZTsKICB0aGlzLmZlZWQgPSBmZWVkOwogIHRoaXMuYXV0b0FkZE1vdXNlTGlzdGVuZXJzXyA9IG9wdF9hZGRNb3VzZUxpc3RlbmVycyB8fCAhMTsKICB0aGlzLmJvdW5kT25Nb3VzZU1vdmVfID0gZ29vZy5iaW5kKHRoaXMub25Nb3VzZU1vdmUsIHRoaXMpOwogIHRoaXMuYm91bmRPbk1vdXNlVXBfID0gZ29vZy5iaW5kKHRoaXMub25Nb3VzZVVwLCB0aGlzKTsKICB0aGlzLmJvdW5kT25Nb3VzZURvd25fID0gZ29vZy5iaW5kKHRoaXMub25Nb3VzZURvd24sIHRoaXMpOwogIHRoaXMuaW5pdGlhbGl6ZWRfID0gITEKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlciwgZ29vZy5EaXNwb3NhYmxlKTsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIuREVGQVVMVF9CT1JERVJfQ09MT1JfID0gWzEsIDEsIDEsIDAuNV07CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLkRFRkFVTFRfQk9SREVSX0hJR0hMSUdIVF9DT0xPUl8gPSBbMSwgMSwgMSwgMC45XTsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIuREVGQVVMVF9CT1JERVJfV0lEVEhfID0gMjsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIuREVGQVVMVF9GRUVEX1dJRFRIXyA9IDE2MDsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIuREVGQVVMVF9GRUVEX0hFSUdIVF8gPSAxMDA7CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLklNQUdFX1ZJRVdfRFJBV19QUklPUklUWV8gPSAxOwp0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5wcm90b3R5cGUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIiKTsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIucHJvdG90eXBlLmJvcmRlckltZ18gPSBudWxsOwp0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5wcm90b3R5cGUuYm9yZGVySGlnaGxpZ2h0SW1nXyA9IG51bGw7CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS5pc0JvcmRlclZpc2libGVfID0gITE7CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS5pc0JvcmRlckhpZ2hsaWdodGVkXyA9ICExOwp0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5wcm90b3R5cGUubGVmdE1hcmdpbiA9IDA7CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS5yaWdodE1hcmdpbiA9IDA7CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS50b3BNYXJnaW4gPSAwOwp0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5wcm90b3R5cGUuYm90dG9tTWFyZ2luID0gMDsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmVlZEhhbmRsZXIkJGluaXQkKG9wdF9pbWFnZU92ZXJsYXksIG9wdF9pbml0Qm9yZGVycykgewogIHRoaXMuZmVlZE9iamVjdCA9IHRoaXMuZmVlZC5mZWVkT2JqZWN0OwogIHRoaXMuZmVlZEF0dHJzID0gdGhpcy5mZWVkLmdldEZlZWRBdHRycygpOwogIG9wdF9pbWFnZU92ZXJsYXkgPyB0aGlzLmltYWdlT3ZlcmxheV8gPSBvcHRfaW1hZ2VPdmVybGF5IDogKHRoaXMuaW1hZ2VWaWV3XyA9IHRoaXMubzNkQnVuZGxlLnJlbmRlcmluZ0FwaS5jcmVhdGVWaWV3KHRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLklNQUdFX1ZJRVdfRFJBV19QUklPUklUWV8sICEwLCB0aGlzLmZlZWRPYmplY3QpLCB0aGlzLmltYWdlT3ZlcmxheV8gPSBuZXcgdGFsay5tZWRpYS5jM2QuSW1hZ2VPdmVybGF5KHRoaXMubzNkQnVuZGxlLCB0aGlzLmltYWdlVmlld18pKTsKICBvcHRfaW5pdEJvcmRlcnMgJiYgKHRoaXMuY3JlYXRlQm9yZGVySW1hZ2VzXyh0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5ERUZBVUxUX0ZFRURfV0lEVEhfLCB0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5ERUZBVUxUX0ZFRURfSEVJR0hUXywgdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIuREVGQVVMVF9CT1JERVJfV0lEVEhfLCB0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5ERUZBVUxUX0JPUkRFUl9DT0xPUl8sIHRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLkRFRkFVTFRfQk9SREVSX0hJR0hMSUdIVF9DT0xPUl8pLCB0aGlzLmJvcmRlckltZ18uc2V0VmlzaWJsZSghMSksIHRoaXMuYm9yZGVySGlnaGxpZ2h0SW1nXy5zZXRWaXNpYmxlKCExKSk7CiAgdGhpcy5hdXRvQWRkTW91c2VMaXN0ZW5lcnNfICYmIHRoaXMuYWRkTW91c2VFdmVudENhbGxiYWNrc18oKTsKICB0aGlzLmluaXRpYWxpemVkXyA9ICEwCn07CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS5pc0luaXRpYWxpemVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZlZWRIYW5kbGVyJCRpc0luaXRpYWxpemVkJCgpIHsKICByZXR1cm4gdGhpcy5pbml0aWFsaXplZF8KfTsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIucHJvdG90eXBlLmFkZE1vdXNlRXZlbnRDYWxsYmFja3NfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZlZWRIYW5kbGVyJCRhZGRNb3VzZUV2ZW50Q2FsbGJhY2tzXyQoKSB7CiAgdmFyIGMzZCA9IHRoaXMubzNkQnVuZGxlLmMzZE9iamVjdC5nZXRQbHVnaW4oKTsKICB0YWxrLm1lZGlhLmMzZC5hZGRFdmVudENhbGxiYWNrKGMzZCwgIm1vdXNlbW92ZSIsIHRoaXMuYm91bmRPbk1vdXNlTW92ZV8pOwogIHRhbGsubWVkaWEuYzNkLmFkZEV2ZW50Q2FsbGJhY2soYzNkLCAibW91c2V1cCIsIHRoaXMuYm91bmRPbk1vdXNlVXBfKTsKICB0YWxrLm1lZGlhLmMzZC5hZGRFdmVudENhbGxiYWNrKGMzZCwgIm1vdXNlZG93biIsIHRoaXMuYm91bmRPbk1vdXNlRG93bl8pCn07CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS5vbk1vdXNlTW92ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGZWVkSGFuZGxlciQkb25Nb3VzZU1vdmUkKCkgewp9Owp0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5wcm90b3R5cGUub25Nb3VzZVVwID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZlZWRIYW5kbGVyJCRvbk1vdXNlVXAkKCkgewp9Owp0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5wcm90b3R5cGUub25Nb3VzZURvd24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmVlZEhhbmRsZXIkJG9uTW91c2VEb3duJCgpIHsKfTsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZlZWRIYW5kbGVyJCRnZXRXaWR0aCQoKSB7CiAgcmV0dXJuIHRoaXMuZmVlZEF0dHJzLncgKyB0aGlzLmxlZnRNYXJnaW4gKyB0aGlzLnJpZ2h0TWFyZ2luCn07CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmVlZEhhbmRsZXIkJGdldEhlaWdodCQoKSB7CiAgcmV0dXJuIHRoaXMuZmVlZEF0dHJzLmggKyB0aGlzLnRvcE1hcmdpbiArIHRoaXMuYm90dG9tTWFyZ2luCn07CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS5zZXRCb3JkZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZlZWRIYW5kbGVyJCRzZXRCb3JkZXJQcm9wZXJ0aWVzJChib3JkZXJXaWR0aCwgYm9yZGVyQ29sb3IsIGJvcmRlckhpZ2hsaWdodENvbG9yLCBvcHRfZmVlZFdpZHRoLCBvcHRfZmVlZEhlaWdodCkgewogIHRoaXMuY3JlYXRlQm9yZGVySW1hZ2VzXyhvcHRfZmVlZFdpZHRoIHx8IHRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLkRFRkFVTFRfRkVFRF9XSURUSF8sIG9wdF9mZWVkSGVpZ2h0IHx8IHRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLkRFRkFVTFRfRkVFRF9IRUlHSFRfLCBib3JkZXJXaWR0aCwgYm9yZGVyQ29sb3IsIGJvcmRlckhpZ2hsaWdodENvbG9yKTsKICB0aGlzLmZlZWRBdHRycyB8fCAodGhpcy5mZWVkT2JqZWN0ID0gdGhpcy5mZWVkLmZlZWRPYmplY3QsIHRoaXMuZmVlZEF0dHJzID0gdGhpcy5mZWVkLmdldEZlZWRBdHRycygpKTsKICB0aGlzLmJvcmRlckltZ18ucmVzaXplKHRoaXMuZ2V0V2lkdGgoKSwgdGhpcy5nZXRIZWlnaHQoKSk7CiAgdGhpcy5ib3JkZXJIaWdobGlnaHRJbWdfLnJlc2l6ZSh0aGlzLmdldFdpZHRoKCksIHRoaXMuZ2V0SGVpZ2h0KCkpOwogIHRoaXMuYm9yZGVySW1nXy5zZXRWaXNpYmxlKHRoaXMuaXNCb3JkZXJWaXNpYmxlXyAmJiAhdGhpcy5pc0JvcmRlckhpZ2hsaWdodGVkXyk7CiAgdGhpcy5ib3JkZXJIaWdobGlnaHRJbWdfLnNldFZpc2libGUodGhpcy5pc0JvcmRlckhpZ2hsaWdodGVkXykKfTsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIucHJvdG90eXBlLnNldEJvcmRlclZpc2libGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmVlZEhhbmRsZXIkJHNldEJvcmRlclZpc2libGUkKHZpc2libGUpIHsKICB0aGlzLmJvcmRlckltZ18gJiYgdGhpcy5ib3JkZXJJbWdfLnNldFZpc2libGUodmlzaWJsZSk7CiAgdGhpcy5pc0JvcmRlclZpc2libGVfID0gdmlzaWJsZTsKICB0aGlzLmlzQm9yZGVySGlnaGxpZ2h0ZWRfICYmIHRoaXMuc2V0Qm9yZGVySGlnaGxpZ2h0ZWQoITEpCn07CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS5zZXRCb3JkZXJIaWdobGlnaHRlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGZWVkSGFuZGxlciQkc2V0Qm9yZGVySGlnaGxpZ2h0ZWQkKGhpZ2hsaWdodGVkKSB7CiAgdGhpcy5ib3JkZXJIaWdobGlnaHRJbWdfICYmIHRoaXMuYm9yZGVySGlnaGxpZ2h0SW1nXy5zZXRWaXNpYmxlKGhpZ2hsaWdodGVkKTsKICB0aGlzLmJvcmRlckltZ18gJiYgdGhpcy5pc0JvcmRlclZpc2libGVfICYmIHRoaXMuYm9yZGVySW1nXy5zZXRWaXNpYmxlKCFoaWdobGlnaHRlZCk7CiAgdGhpcy5pc0JvcmRlckhpZ2hsaWdodGVkXyA9IGhpZ2hsaWdodGVkCn07CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGZWVkSGFuZGxlciQkdXBkYXRlUG9zaXRpb24kKCkgewogIHRoaXMuZmVlZE9iamVjdCAmJiAodGhpcy5mZWVkQXR0cnMgPSB0aGlzLmZlZWQuZ2V0RmVlZEF0dHJzKCksIHRoaXMuYm9yZGVySW1nXyAmJiB0aGlzLmJvcmRlckltZ18ucmVzaXplKHRoaXMuZ2V0V2lkdGgoKSwgdGhpcy5nZXRIZWlnaHQoKSksIHRoaXMuYm9yZGVySGlnaGxpZ2h0SW1nXyAmJiB0aGlzLmJvcmRlckhpZ2hsaWdodEltZ18ucmVzaXplKHRoaXMuZ2V0V2lkdGgoKSwgdGhpcy5nZXRIZWlnaHQoKSkpCn07CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVCb3JkZXJJbWFnZXNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZlZWRIYW5kbGVyJCRjcmVhdGVCb3JkZXJJbWFnZXNfJCh3aWR0aCwgaGVpZ2h0LCBib3JkZXJXaWR0aCwgYm9yZGVyQ29sb3IsIGJvcmRlckhpZ2hsaWdodENvbG9yKSB7CiAgaWYod2lkdGggIT0gdGhpcy5sYXN0V2lkdGhfIHx8IGhlaWdodCAhPSB0aGlzLmxhc3RIZWlnaHRfIHx8IGJvcmRlcldpZHRoICE9IHRoaXMubGFzdEJvcmRlcldpZHRoXyB8fCAhZ29vZy5hcnJheS5lcXVhbHMoYm9yZGVyQ29sb3IsIHRoaXMubGFzdEJvcmRlckNvbG9yXykgfHwgIWdvb2cuYXJyYXkuZXF1YWxzKGJvcmRlckhpZ2hsaWdodENvbG9yLCB0aGlzLmxhc3RCb3JkZXJIaWdobGlnaHRDb2xvcl8pKSB7CiAgICB0aGlzLmRpc3Bvc2VCb3JkZXJJbWFnZXNfKCk7CiAgICB2YXIgdGV4dHVyZSA9IHRoaXMuY3JlYXRlQm9yZGVyVGV4dHVyZSh3aWR0aCwgaGVpZ2h0LCBib3JkZXJXaWR0aCwgYm9yZGVyQ29sb3IpLCB0ZXh0dXJlSGlnaGxpZ2h0ID0gdGhpcy5jcmVhdGVCb3JkZXJUZXh0dXJlKHdpZHRoLCBoZWlnaHQsIGJvcmRlcldpZHRoLCBib3JkZXJIaWdobGlnaHRDb2xvcik7CiAgICB0aGlzLmJvcmRlckltZ18gPSB0aGlzLmltYWdlT3ZlcmxheV8uY3JlYXRlSW1hZ2VGcm9tVGV4dHVyZSgtdGhpcy5sZWZ0TWFyZ2luLCAtdGhpcy50b3BNYXJnaW4sIHRleHR1cmUpOwogICAgdGhpcy5ib3JkZXJIaWdobGlnaHRJbWdfID0gdGhpcy5pbWFnZU92ZXJsYXlfLmNyZWF0ZUltYWdlRnJvbVRleHR1cmUoLXRoaXMubGVmdE1hcmdpbiwgLXRoaXMudG9wTWFyZ2luLCB0ZXh0dXJlSGlnaGxpZ2h0KTsKICAgIHRoaXMubGFzdFdpZHRoXyA9IHdpZHRoOwogICAgdGhpcy5sYXN0SGVpZ2h0XyA9IGhlaWdodDsKICAgIHRoaXMubGFzdEJvcmRlcldpZHRoXyA9IGJvcmRlcldpZHRoOwogICAgdGhpcy5sYXN0Qm9yZGVyQ29sb3JfID0gYm9yZGVyQ29sb3I7CiAgICB0aGlzLmxhc3RCb3JkZXJIaWdobGlnaHRDb2xvcl8gPSBib3JkZXJIaWdobGlnaHRDb2xvcgogIH0KfTsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZUJvcmRlclRleHR1cmUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkRmVlZEhhbmRsZXIkJGNyZWF0ZUJvcmRlclRleHR1cmUkKHdpZHRoLCBoZWlnaHQsIGJvcmRlcldpZHRoLCBib3JkZXJDb2xvcikgewogIHZhciBjM2QgPSB0aGlzLm8zZEJ1bmRsZS5jM2RPYmplY3QuZ2V0UGx1Z2luKCksIGNhbnZhc1BhaW50ID0gdGhpcy5vM2RCdW5kbGUucGFjay5jcmVhdGVPYmplY3QoIkNhbnZhc1BhaW50Iik7CiAgY2FudmFzUGFpbnQuY29sb3IgPSBib3JkZXJDb2xvcjsKICB2YXIgY2FudmFzID0gdGhpcy5vM2RCdW5kbGUucGFjay5jcmVhdGVPYmplY3QoIkNhbnZhcyIpOwogIGNhbnZhcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwogIGNhbnZhcy5jbGVhcihbMCwgMCwgMCwgMF0pOwogIGNhbnZhcy5kcmF3UmVjdCgwLCAwLCB3aWR0aCwgYm9yZGVyV2lkdGgsIGNhbnZhc1BhaW50KTsKICBjYW52YXMuZHJhd1JlY3Qod2lkdGggLSBib3JkZXJXaWR0aCwgYm9yZGVyV2lkdGgsIHdpZHRoLCBoZWlnaHQsIGNhbnZhc1BhaW50KTsKICBjYW52YXMuZHJhd1JlY3QoMCwgYm9yZGVyV2lkdGgsIGJvcmRlcldpZHRoLCBoZWlnaHQsIGNhbnZhc1BhaW50KTsKICBjYW52YXMuZHJhd1JlY3QoYm9yZGVyV2lkdGgsIGhlaWdodCAtIGJvcmRlcldpZHRoLCB3aWR0aCAtIGJvcmRlcldpZHRoLCBoZWlnaHQsIGNhbnZhc1BhaW50KTsKICB2YXIgdGV4dHVyZSA9IHRhbGsubWVkaWEuYzNkLk8zZEhhbmRsZS53cmFwT2JqZWN0KHRoaXMubzNkQnVuZGxlLnBhY2ssIHRoaXMubzNkQnVuZGxlLnBhY2suY3JlYXRlVGV4dHVyZTJEKHdpZHRoLCBoZWlnaHQsIGMzZC5vM2QuVGV4dHVyZS5BUkdCOCwgMSwgITEpKTsKICBudWxsICE9IHRleHR1cmUgPyBjYW52YXMuY29weVRvVGV4dHVyZSh0ZXh0dXJlLmdldE9iamVjdCgpKSA6IHRoaXMubG9nZ2VyXy5zZXZlcmUoIkZhaWxlZCB0byBjcmVhdGUgQVJHQjggVGV4dHVyZTJEIHdpdGggc2l6ZSAiICsgd2lkdGggKyAieCIgKyBoZWlnaHQpOwogIHRoaXMubzNkQnVuZGxlLnBhY2sucmVtb3ZlT2JqZWN0KGNhbnZhcyk7CiAgdGhpcy5vM2RCdW5kbGUucGFjay5yZW1vdmVPYmplY3QoY2FudmFzUGFpbnQpOwogIHJldHVybiB0ZXh0dXJlCn07CnRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLnByb3RvdHlwZS5kaXNwb3NlQm9yZGVySW1hZ2VzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGZWVkSGFuZGxlciQkZGlzcG9zZUJvcmRlckltYWdlc18kKCkgewogIHRoaXMuYm9yZGVySW1nXyAmJiAodGhpcy5ib3JkZXJJbWdfLmRpc3Bvc2UoKSwgdGhpcy5ib3JkZXJJbWdfID0gbnVsbCk7CiAgdGhpcy5ib3JkZXJIaWdobGlnaHRJbWdfICYmICh0aGlzLmJvcmRlckhpZ2hsaWdodEltZ18uZGlzcG9zZSgpLCB0aGlzLmJvcmRlckhpZ2hsaWdodEltZ18gPSBudWxsKQp9Owp0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5wcm90b3R5cGUuZGlzcG9zZUMzZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGZWVkSGFuZGxlciQkZGlzcG9zZUMzZCQoKSB7CiAgaWYodGhpcy5vM2RCdW5kbGUuYzNkT2JqZWN0LmlzU2NyaXB0YWJsZSgpKSB7CiAgICB2YXIgYzNkID0gdGhpcy5vM2RCdW5kbGUuYzNkT2JqZWN0LmdldFBsdWdpbigpOwogICAgdGFsay5tZWRpYS5jM2QucmVtb3ZlRXZlbnRDYWxsYmFjayhjM2QsICJtb3VzZW1vdmUiLCB0aGlzLmJvdW5kT25Nb3VzZU1vdmVfKTsKICAgIHRhbGsubWVkaWEuYzNkLnJlbW92ZUV2ZW50Q2FsbGJhY2soYzNkLCAibW91c2V1cCIsIHRoaXMuYm91bmRPbk1vdXNlVXBfKTsKICAgIHRhbGsubWVkaWEuYzNkLnJlbW92ZUV2ZW50Q2FsbGJhY2soYzNkLCAibW91c2Vkb3duIiwgdGhpcy5ib3VuZE9uTW91c2VEb3duXykKICB9CiAgdGhpcy5kaXNwb3NlQm9yZGVySW1hZ2VzXygpOwogIHRoaXMuaW1hZ2VWaWV3XyAmJiAodGhpcy5pbWFnZVZpZXdfLmRpc3Bvc2UoKSwgdGhpcy5pbWFnZVZpZXdfID0gbnVsbCkKfTsKdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRGZWVkSGFuZGxlciQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICB0aGlzLmRpc3Bvc2VDM2QoKQp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcEhhbmRsZXIkKG8zZEJ1bmRsZSwgZmVlZCkgewogIHRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyLmNhbGwodGhpcywgbzNkQnVuZGxlLCBmZWVkLCAhMCkKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLCB0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlcik7CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIuUElQX0JPUkRFUl9XSURUSF8gPSAyOwp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLlJFU0laRV9USFJFU0hPTERfV0lEVEhfID0gMzIwOwp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLlJFU0laRV9USFJFU0hPTERfSEVJR0hUXyA9IDIwMDsKdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5NSU5NQVhfRFVSQVRJT05fID0gMC42Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLlNOQVBfRFVSQVRJT05fID0gMC4zOwp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyIik7CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIucHJvdG90eXBlLmlzTWluaW1pemVkXyA9ICExOwp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5pc0RyYWdnaW5nXyA9ICExOwp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5pc0hpZ2hsaWdodGVkXyA9ICExOwp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5pc0hpZ2hsaWdodEVuYWJsZWRfID0gITE7CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIucHJvdG90eXBlLm1vdXNlWF8gPSAwOwp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5tb3VzZVlfID0gMDsKdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBIYW5kbGVyJCRpbml0JChvcHRfaW1hZ2VPdmVybGF5KSB7CiAgdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5zdXBlckNsYXNzXy5pbml0LmNhbGwodGhpcywgb3B0X2ltYWdlT3ZlcmxheSwgITApOwogIHRoaXMuY3JlYXRlSW1hZ2VzXyh0aGlzLmltYWdlT3ZlcmxheV8pOwogIHRoaXMuc2V0Qm9yZGVyVmlzaWJsZSghMCk7CiAgdGhpcy5zZXRIaWdobGlnaHRFbmFibGVkXyghMCk7CiAgdGhpcy5mZWVkQXR0cnMgPSB0aGlzLmZlZWQuZ2V0RmVlZEF0dHJzKCkKfTsKdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5wcm90b3R5cGUudXBkYXRlUG9zaXRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwSGFuZGxlciQkdXBkYXRlUG9zaXRpb24kKGF0dHJzLCBzYXZlUG9zaXRpb24pIHsKICB0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnN1cGVyQ2xhc3NfLnVwZGF0ZVBvc2l0aW9uLmNhbGwodGhpcywgYXR0cnMsIHNhdmVQb3NpdGlvbik7CiAgaWYodGhpcy5mZWVkT2JqZWN0KSB7CiAgICBzYXZlUG9zaXRpb24gJiYgdGhpcy5yZXNpemVJbWFnZXNfKGF0dHJzLncsIGF0dHJzLmgpOwogICAgaWYodGhpcy5pc01pbmltaXplZF8gJiYgc2F2ZVBvc2l0aW9uKSB7CiAgICAgIHZhciBuZXdBdHRycyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5BdHRycyh0aGlzLmZlZWQuZ2V0WCgpICsgdGhpcy5mZWVkLmdldFdpZHRoKCkgLSAodGhpcy5tYXhpbWl6ZUltZ18ud2lkdGgoKSArIHRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIuUElQX0JPUkRFUl9XSURUSF8pLCB0aGlzLmZlZWQuZ2V0WSgpICsgdGhpcy5mZWVkLmdldEhlaWdodCgpIC0gKHRoaXMubWF4aW1pemVJbWdfLmhlaWdodCgpICsgdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5QSVBfQk9SREVSX1dJRFRIXyksIDAsIHRoaXMubWF4aW1pemVJbWdfLndpZHRoKCksIHRoaXMubWF4aW1pemVJbWdfLmhlaWdodCgpLCAxKTsKICAgICAgdGhpcy5zYXZlZEF0dHJzXy54ID0gdGhpcy5zYXZlZEF0dHJzXy54ICsgYXR0cnMueCAtIHRoaXMuc2F2ZWRBdHRyc18udzsKICAgICAgdGhpcy5zYXZlZEF0dHJzXy55ID0gdGhpcy5zYXZlZEF0dHJzXy55ICsgYXR0cnMueSAtIHRoaXMuc2F2ZWRBdHRyc18uaDsKICAgICAgdGhpcy5zYXZlZEF0dHJzXy53ID0gYXR0cnMudzsKICAgICAgdGhpcy5zYXZlZEF0dHJzXy5oID0gYXR0cnMuaDsKICAgICAgdGhpcy5mZWVkT2JqZWN0LnNldEF0dHJzKG5ld0F0dHJzKTsKICAgICAgdGhpcy5mZWVkQXR0cnMgPSB0aGlzLmZlZWQuZ2V0RmVlZEF0dHJzKCkKICAgIH0KICAgIHRoaXMuaXNNaW5pbWl6ZWRfID8gKHRoaXMubWF4aW1pemVJbWdfLm1vdmVJbWFnZVdpdGhFZGdlV3JhcHBpbmcoMCwgMCwgdGhpcy5mZWVkQXR0cnMudywgdGhpcy5mZWVkQXR0cnMuaCksIHRoaXMubWF4aW1pemVSb2xsb3ZlckltZ18ubW92ZUltYWdlV2l0aEVkZ2VXcmFwcGluZygwLCAwLCB0aGlzLmZlZWRBdHRycy53LCB0aGlzLmZlZWRBdHRycy5oKSkgOiAodGhpcy5taW5pbWl6ZUltZ18ubW92ZUltYWdlV2l0aEVkZ2VXcmFwcGluZygtMiwgMiwgdGhpcy5mZWVkQXR0cnMudywgdGhpcy5mZWVkQXR0cnMuaCksIHRoaXMubWluaW1pemVSb2xsb3ZlckltZ18ubW92ZUltYWdlV2l0aEVkZ2VXcmFwcGluZygtMiwgMiwgdGhpcy5mZWVkQXR0cnMudywgdGhpcy5mZWVkQXR0cnMuaCksIHRoaXMuZm91cndheUFycm93SW1nXy5tb3ZlSW1hZ2VXaXRoRWRnZVdyYXBwaW5nKHRoaXMuZmVlZEF0dHJzLncgLyAyIC0gdGhpcy5mb3Vyd2F5QXJyb3dJbWdfLndpZHRoKCkgLyAyLCB0aGlzLmZlZWRBdHRycy5oIC8gCiAgICAyIC0gdGhpcy5mb3Vyd2F5QXJyb3dJbWdfLmhlaWdodCgpIC8gMiwgdGhpcy5mZWVkQXR0cnMudywgdGhpcy5mZWVkQXR0cnMuaCkpOwogICAgdGhpcy51cGRhdGVVSV8oKQogIH0KfTsKdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5wcm90b3R5cGUudXBkYXRlVUlfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcEhhbmRsZXIkJHVwZGF0ZVVJXyQoKSB7CiAgdmFyIGluc2lkZVBpcCA9IHRoaXMuaXNJbnNpZGVQaXBfKHRoaXMubW91c2VYXywgdGhpcy5tb3VzZVlfKSwgc2hvd01pbiA9IGluc2lkZVBpcCAmJiAhdGhpcy5pc01pbmltaXplZF8sIHNob3dNYXggPSB0aGlzLmlzTWluaW1pemVkXywgaG92ZXJNaW4gPSAhMSwgaG92ZXJNYXggPSAhMTsKICBpZihpbnNpZGVQaXApIHsKICAgIHZhciBwb3MgPSB0aGlzLnRyYW5zbGF0ZVRvUGlwUG9pbnRfKFt0aGlzLm1vdXNlWF8sIHRoaXMubW91c2VZX10pLCBob3Zlck1pbiA9IHRoaXMubWluaW1pemVJbWdfLmhpdFRlc3QocG9zWzBdLCBwb3NbMV0pLCBob3Zlck1heCA9IHRoaXMubWF4aW1pemVJbWdfLmhpdFRlc3QocG9zWzBdLCBwb3NbMV0pCiAgfQogIHRoaXMuc2V0SGlnaGxpZ2h0ZWRfKGluc2lkZVBpcCk7CiAgdGhpcy5taW5pbWl6ZUltZ18uc2V0VmlzaWJsZShzaG93TWluICYmICFob3Zlck1pbik7CiAgdGhpcy5taW5pbWl6ZVJvbGxvdmVySW1nXy5zZXRWaXNpYmxlKHNob3dNaW4gJiYgaG92ZXJNaW4pOwogIHRoaXMubWF4aW1pemVJbWdfLnNldFZpc2libGUoc2hvd01heCAmJiAhaG92ZXJNYXgpOwogIHRoaXMubWF4aW1pemVSb2xsb3ZlckltZ18uc2V0VmlzaWJsZShzaG93TWF4ICYmIGhvdmVyTWF4KQp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5yZXNpemVJbWFnZXNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcEhhbmRsZXIkJHJlc2l6ZUltYWdlc18kKCkgewogIHRoaXMucmVzaXplSW1hZ2VfKHRoaXMubWluaW1pemVJbWdfKTsKICB0aGlzLnJlc2l6ZUltYWdlXyh0aGlzLm1pbmltaXplUm9sbG92ZXJJbWdfKTsKICB0aGlzLnJlc2l6ZUltYWdlXyh0aGlzLm1heGltaXplSW1nXyk7CiAgdGhpcy5yZXNpemVJbWFnZV8odGhpcy5tYXhpbWl6ZVJvbGxvdmVySW1nXyk7CiAgdGhpcy5yZXNpemVJbWFnZV8odGhpcy5mb3Vyd2F5QXJyb3dJbWdfKQp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5yZXNpemVJbWFnZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwSGFuZGxlciQkcmVzaXplSW1hZ2VfJChpbWFnZSkgewogIHZhciBzY2FsZSA9IHRoaXMuZmVlZEF0dHJzLncgPCB0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLlJFU0laRV9USFJFU0hPTERfV0lEVEhfIHx8IHRoaXMuZmVlZEF0dHJzLmggPCB0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLlJFU0laRV9USFJFU0hPTERfSEVJR0hUXyA/IDEgOiAyOwogIGltYWdlLnJlc2l6ZShpbWFnZS50ZXh0dXJlV2lkdGgoKSAqIHNjYWxlLCBpbWFnZS50ZXh0dXJlSGVpZ2h0KCkgKiBzY2FsZSkKfTsKdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5wcm90b3R5cGUuY3JlYXRlSW1hZ2VzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBIYW5kbGVyJCRjcmVhdGVJbWFnZXNfJChpbWFnZU92ZXJsYXkpIHsKICB0aGlzLm1pbmltaXplSW1nXyA9IHRoaXMuY3JlYXRlSW1hZ2VfKGltYWdlT3ZlcmxheSwgImltYWdlcy9taW5pbWl6ZS5wbmciLCAtdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5QSVBfQk9SREVSX1dJRFRIXywgdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5QSVBfQk9SREVSX1dJRFRIXyk7CiAgdGhpcy5taW5pbWl6ZVJvbGxvdmVySW1nXyA9IHRoaXMuY3JlYXRlSW1hZ2VfKGltYWdlT3ZlcmxheSwgImltYWdlcy9taW5pbWl6ZV9yb2xsb3Zlci5wbmciLCAtdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5QSVBfQk9SREVSX1dJRFRIXywgdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5QSVBfQk9SREVSX1dJRFRIXyk7CiAgdGhpcy5tYXhpbWl6ZUltZ18gPSB0aGlzLmNyZWF0ZUltYWdlXyhpbWFnZU92ZXJsYXksICJpbWFnZXMvbWF4aW1pemUucG5nIiwgLXRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIuUElQX0JPUkRFUl9XSURUSF8sIC10YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLlBJUF9CT1JERVJfV0lEVEhfKTsKICB0aGlzLm1heGltaXplUm9sbG92ZXJJbWdfID0gdGhpcy5jcmVhdGVJbWFnZV8oaW1hZ2VPdmVybGF5LCAiaW1hZ2VzL21heGltaXplX3JvbGxvdmVyLnBuZyIsIC10YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLlBJUF9CT1JERVJfV0lEVEhfLCAtdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5QSVBfQk9SREVSX1dJRFRIXyk7CiAgdGhpcy5mb3Vyd2F5QXJyb3dJbWdfID0gdGhpcy5jcmVhdGVDZW50ZXJJbWFnZV8oaW1hZ2VPdmVybGF5LCAiaW1hZ2VzL2ZvdXJ3YXlfYXJyb3cucG5nIik7CiAgdGhpcy5mb3Vyd2F5QXJyb3dJbWdfLnNldEFscGhhKDAuOSkKfTsKdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5wcm90b3R5cGUuY3JlYXRlSW1hZ2VfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcEhhbmRsZXIkJGNyZWF0ZUltYWdlXyQoaW1hZ2VPdmVybGF5LCB1cmwsIHgsIHkpIHsKICB2YXIgaW1hZ2UgPSBpbWFnZU92ZXJsYXkuY3JlYXRlSW1hZ2UoMCwgMCwgdXJsLCBnb29nLmJpbmQoZnVuY3Rpb24oKSB7CiAgICB0aGlzLmltYWdlTG9hZGVkXyhpbWFnZSwgeCwgeSkKICB9LCB0aGlzKSk7CiAgcmV0dXJuIGltYWdlCn07CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIucHJvdG90eXBlLmltYWdlTG9hZGVkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBIYW5kbGVyJCRpbWFnZUxvYWRlZF8kKGltYWdlLCB4LCB5KSB7CiAgdGhpcy5yZXNpemVJbWFnZV8oaW1hZ2UpOwogIGltYWdlLm1vdmVJbWFnZVdpdGhFZGdlV3JhcHBpbmcoeCwgeSwgdGhpcy5mZWVkQXR0cnMudywgdGhpcy5mZWVkQXR0cnMuaCk7CiAgaW1hZ2Uuc2V0VmlzaWJsZSghMSkKfTsKdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5wcm90b3R5cGUuY3JlYXRlQ2VudGVySW1hZ2VfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcEhhbmRsZXIkJGNyZWF0ZUNlbnRlckltYWdlXyQoaW1hZ2VPdmVybGF5LCB1cmwpIHsKICB2YXIgaW1hZ2UgPSBpbWFnZU92ZXJsYXkuY3JlYXRlSW1hZ2UoMCwgMCwgdXJsLCBnb29nLmJpbmQoZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNlbnRlckltYWdlXyhpbWFnZSkKICB9LCB0aGlzKSk7CiAgcmV0dXJuIGltYWdlCn07CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIucHJvdG90eXBlLmNlbnRlckltYWdlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBIYW5kbGVyJCRjZW50ZXJJbWFnZV8kKGltYWdlKSB7CiAgdGhpcy5yZXNpemVJbWFnZV8oaW1hZ2UpOwogIGltYWdlLm1vdmVJbWFnZVdpdGhFZGdlV3JhcHBpbmcodGhpcy5mZWVkQXR0cnMudyAvIDIgLSBpbWFnZS53aWR0aCgpIC8gMiwgdGhpcy5mZWVkQXR0cnMuaCAvIDIgLSBpbWFnZS5oZWlnaHQoKSAvIDIsIHRoaXMuZmVlZEF0dHJzLncsIHRoaXMuZmVlZEF0dHJzLmgpOwogIGltYWdlLnNldFZpc2libGUoITEpCn07CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIucHJvdG90eXBlLnNldE1pbmltaXplZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwSGFuZGxlciQkc2V0TWluaW1pemVkXyQobWluaW1pemVkKSB7CiAgdGhpcy5pc01pbmltaXplZF8gPSBtaW5pbWl6ZWQ7CiAgdGhpcy5zZXRCb3JkZXJWaXNpYmxlKCFtaW5pbWl6ZWQpOwogIHZhciBuZXdBdHRyczsKICBtaW5pbWl6ZWQgPyAodGhpcy5taW5pbWl6ZUltZ18uc2V0VmlzaWJsZSghMSksIHRoaXMubWluaW1pemVSb2xsb3ZlckltZ18uc2V0VmlzaWJsZSghMSksIHRoaXMuZm91cndheUFycm93SW1nXy5zZXRWaXNpYmxlKCExKSwgdGhpcy5zYXZlZEF0dHJzXyA9IHRoaXMuZmVlZEF0dHJzLCBuZXdBdHRycyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5BdHRycyh0aGlzLmZlZWQuZ2V0WCgpICsgdGhpcy5mZWVkLmdldFdpZHRoKCkgLSAodGhpcy5tYXhpbWl6ZUltZ18ud2lkdGgoKSArIHRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIuUElQX0JPUkRFUl9XSURUSF8pLCB0aGlzLmZlZWQuZ2V0WSgpICsgdGhpcy5mZWVkLmdldEhlaWdodCgpIC0gKHRoaXMubWF4aW1pemVJbWdfLmhlaWdodCgpICsgdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5QSVBfQk9SREVSX1dJRFRIXyksIDAsIHRoaXMubWF4aW1pemVJbWdfLndpZHRoKCksIHRoaXMubWF4aW1pemVJbWdfLmhlaWdodCgpLCAxKSkgOiAodGhpcy5tYXhpbWl6ZUltZ18uc2V0VmlzaWJsZSghMSksIAogIHRoaXMubWF4aW1pemVSb2xsb3ZlckltZ18uc2V0VmlzaWJsZSghMSksIG5ld0F0dHJzID0gdGhpcy5zYXZlZEF0dHJzXywgdGhpcy5jaGVja0JvdW5kYXJpZXNfKG5ld0F0dHJzKSk7CiAgdGhpcy50d2Vlbl8gPSBuZXcgdGFsay5tZWRpYS5jM2QuQXR0cnNUd2Vlbih0aGlzLmZlZWRPYmplY3QsIHRoaXMuZmVlZEF0dHJzLCBuZXdBdHRycywgdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5NSU5NQVhfRFVSQVRJT05fLCB0YWxrLm1lZGlhLmMzZC5lYXNpbmcuU1RST05HX0VBU0VfSU5fT1VULCBnb29nLmJpbmQodGhpcy5vblR3ZWVuQ29tcGxldGVkLCB0aGlzKSk7CiAgdGhpcy5vM2RCdW5kbGUuYzNkRW5naW5lLnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sodGhpcy50d2Vlbl8pCn07CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIucHJvdG90eXBlLmlzSW5zaWRlUGlwXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBIYW5kbGVyJCRpc0luc2lkZVBpcF8kKHgsIHkpIHsKICByZXR1cm4geCA+PSB0aGlzLmZlZWRBdHRycy54ICYmIHggPD0gdGhpcy5mZWVkQXR0cnMueCArIHRoaXMuZmVlZEF0dHJzLncgJiYgeSA+PSB0aGlzLmZlZWRBdHRycy55ICYmIHkgPD0gdGhpcy5mZWVkQXR0cnMueSArIHRoaXMuZmVlZEF0dHJzLmgKfTsKdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5wcm90b3R5cGUuY2xpZW50SGl0VGVzdFhfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcEhhbmRsZXIkJGNsaWVudEhpdFRlc3RYXyQoeCkgewogIHJldHVybiAwIDw9IHggJiYgeCA8PSB0aGlzLm8zZEJ1bmRsZS53aWR0aAp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5jbGllbnRIaXRUZXN0WV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwSGFuZGxlciQkY2xpZW50SGl0VGVzdFlfJCh5KSB7CiAgcmV0dXJuIDAgPD0geSAmJiB5IDw9IHRoaXMubzNkQnVuZGxlLmhlaWdodAp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS50cmFuc2xhdGVUb1BpcFBvaW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBIYW5kbGVyJCR0cmFuc2xhdGVUb1BpcFBvaW50XyQodmVjdG9yKSB7CiAgdmVjdG9yWzBdIC09IHRoaXMuZmVlZEF0dHJzLng7CiAgdmVjdG9yWzFdIC09IHRoaXMuZmVlZEF0dHJzLnk7CiAgcmV0dXJuIHZlY3Rvcgp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5jaGVja0JvdW5kYXJpZXNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcEhhbmRsZXIkJGNoZWNrQm91bmRhcmllc18kKGF0dHJzKSB7CiAgdmFyIHJlc3VsdCA9ICEwOwogIDAgPiBhdHRycy54ID8gKGF0dHJzLnggPSAwLCByZXN1bHQgPSAhMSkgOiBhdHRycy54ICsgYXR0cnMudyA+IHRoaXMuZmVlZC5nZXRYKCkgKyB0aGlzLmZlZWQuZ2V0V2lkdGgoKSAmJiAoYXR0cnMueCA9IHRoaXMuZmVlZC5nZXRXaWR0aCgpIC0gYXR0cnMudywgcmVzdWx0ID0gITEpOwogIDAgPiBhdHRycy55ID8gKGF0dHJzLnkgPSAwLCByZXN1bHQgPSAhMSkgOiBhdHRycy55ICsgYXR0cnMuaCA+IHRoaXMuZmVlZC5nZXRZKCkgKyB0aGlzLmZlZWQuZ2V0SGVpZ2h0KCkgJiYgKGF0dHJzLnkgPSB0aGlzLmZlZWQuZ2V0SGVpZ2h0KCkgLSBhdHRycy5oLCByZXN1bHQgPSAhMSk7CiAgcmV0dXJuIHJlc3VsdAp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5vblR3ZWVuQ29tcGxldGVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcEhhbmRsZXIkJG9uVHdlZW5Db21wbGV0ZWQkKCkgewogIHRoaXMudHdlZW5fID0gbnVsbDsKICB0aGlzLnVwZGF0ZVBvc2l0aW9uKHRoaXMuZmVlZC5nZXRGZWVkQXR0cnMoKSwgITEpCn07CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIucHJvdG90eXBlLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcEhhbmRsZXIkJG9uTW91c2VNb3ZlJChlKSB7CiAgaWYoIXRoaXMudHdlZW5fKSB7CiAgICBpZih0aGlzLmlzRHJhZ2dpbmdfKSB7CiAgICAgIHZhciB4ID0gZS54LCB5ID0gZS55LCBkeCA9IHggLSB0aGlzLm1vdXNlWF8sIGR5ID0geSAtIHRoaXMubW91c2VZXywgYXR0cnMgPSB0aGlzLmZlZWRBdHRyczsKICAgICAgdGhpcy5jbGllbnRIaXRUZXN0WF8oeCkgJiYgKGF0dHJzLnggKz0gZHgpOwogICAgICB0aGlzLmNsaWVudEhpdFRlc3RZXyh5KSAmJiAoYXR0cnMueSArPSBkeSk7CiAgICAgIHRoaXMubW91c2VYXyA9IHg7CiAgICAgIHRoaXMubW91c2VZXyA9IHk7CiAgICAgIHRoaXMuY2hlY2tCb3VuZGFyaWVzXyhhdHRycyk7CiAgICAgIHRoaXMuZmVlZE9iamVjdC5zZXRBdHRycyhhdHRycykKICAgIH1lbHNlIHsKICAgICAgdGhpcy5tb3VzZVhfID0gZS54LCB0aGlzLm1vdXNlWV8gPSBlLnksIHRoaXMudXBkYXRlVUlfKCkKICAgIH0KICB9Cn07CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIucHJvdG90eXBlLm9uTW91c2VVcCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBIYW5kbGVyJCRvbk1vdXNlVXAkKGUpIHsKICB0aGlzLm1vdXNlWF8gPSBlLng7CiAgdGhpcy5tb3VzZVlfID0gZS55OwogIHRoaXMuaXNEcmFnZ2luZ18gJiYgKHRoaXMuaXNEcmFnZ2luZ18gPSAhMSwgdGhpcy5mZWVkLm1vdmVUb0Nvcm5lcih0aGlzLmdldE5lYXJlc3RDb3JuZXJfKCksIHRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIuU05BUF9EVVJBVElPTl8sIHRhbGsubWVkaWEuYzNkLmVhc2luZy5TVFJPTkdfRUFTRV9PVVQpKTsKICBpZih0aGlzLmlzSW5zaWRlUGlwXyhlLngsIGUueSkpIHsKICAgIHZhciB2ZWMgPSBbZS54LCBlLnldLCB2ZWMgPSB0aGlzLnRyYW5zbGF0ZVRvUGlwUG9pbnRfKHZlYyk7CiAgICB0aGlzLmlzTWluaW1pemVkXyA/IHRoaXMubWF4aW1pemVJbWdfLmhpdFRlc3QodmVjWzBdLCB2ZWNbMV0pICYmIHRoaXMuc2V0TWluaW1pemVkXyghMSkgOiB0aGlzLm1pbmltaXplSW1nXy5oaXRUZXN0KHZlY1swXSwgdmVjWzFdKSAmJiB0aGlzLnNldE1pbmltaXplZF8oITApOwogICAgdGhpcy5jaGFuZ2VDdXJzb3JfKCJQT0lOVEVSIiwgMCkKICB9ZWxzZSB7CiAgICB0aGlzLnVuc2V0Q3Vyc29yXygpCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5vbk1vdXNlRG93biA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBIYW5kbGVyJCRvbk1vdXNlRG93biQoZSkgewogICF0aGlzLmlzTWluaW1pemVkXyAmJiB0aGlzLmlzSW5zaWRlUGlwXyhlLngsIGUueSkgJiYgKHRoaXMuaXNEcmFnZ2luZ18gPSAhMCwgdGhpcy5tb3VzZVhfID0gZS54LCB0aGlzLm1vdXNlWV8gPSBlLnksIHRoaXMuY2hhbmdlQ3Vyc29yXygiTU9WRSIsIDEpKQp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5zZXRIaWdobGlnaHRFbmFibGVkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBIYW5kbGVyJCRzZXRIaWdobGlnaHRFbmFibGVkXyQoZW5hYmxlZCkgewogIHRoaXMuaXNIaWdobGlnaHRlZF8gJiYgdGhpcy5zZXRIaWdobGlnaHRlZF8oZW5hYmxlZCk7CiAgdGhpcy5pc0hpZ2hsaWdodEVuYWJsZWRfID0gZW5hYmxlZAp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5zZXRIaWdobGlnaHRlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwSGFuZGxlciQkc2V0SGlnaGxpZ2h0ZWRfJChoaWdobGlnaHRlZCkgewogIHRoaXMuaXNIaWdobGlnaHRFbmFibGVkXyAmJiBoaWdobGlnaHRlZCAhPSB0aGlzLmlzSGlnaGxpZ2h0ZWRfICYmIChoaWdobGlnaHRlZCA/IHRoaXMuY2hhbmdlQ3Vyc29yXygiUE9JTlRFUiIsIDApIDogdGhpcy51bnNldEN1cnNvcl8oKSwgdGhpcy5pc01pbmltaXplZF8gfHwgKHRoaXMuZm91cndheUFycm93SW1nXy5zZXRWaXNpYmxlKGhpZ2hsaWdodGVkKSwgdGhpcy5zZXRCb3JkZXJIaWdobGlnaHRlZChoaWdobGlnaHRlZCkpLCB0aGlzLmlzSGlnaGxpZ2h0ZWRfID0gaGlnaGxpZ2h0ZWQpCn07CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIucHJvdG90eXBlLmNoYW5nZUN1cnNvcl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwSGFuZGxlciQkY2hhbmdlQ3Vyc29yXyQoc3R5bGVOYW1lLCBwcmlvcml0eSkgewogIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMuY3Vyc29yUmVmXykgJiYgdGhpcy5vM2RCdW5kbGUuY3Vyc29yTWFuYWdlci51bnNldEN1cnNvcih0aGlzLmN1cnNvclJlZl8pOwogIHRoaXMuY3Vyc29yUmVmXyA9IHRoaXMubzNkQnVuZGxlLmN1cnNvck1hbmFnZXIuc2V0Q3Vyc29yKHN0eWxlTmFtZSwgcHJpb3JpdHkpCn07CnRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIucHJvdG90eXBlLnVuc2V0Q3Vyc29yXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBIYW5kbGVyJCR1bnNldEN1cnNvcl8kKCkgewogIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMuY3Vyc29yUmVmXykgJiYgKHRoaXMubzNkQnVuZGxlLmN1cnNvck1hbmFnZXIudW5zZXRDdXJzb3IodGhpcy5jdXJzb3JSZWZfKSwgdGhpcy5jdXJzb3JSZWZfID0gbnVsbCkKfTsKdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlci5wcm90b3R5cGUuZ2V0TmVhcmVzdENvcm5lcl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwSGFuZGxlciQkZ2V0TmVhcmVzdENvcm5lcl8kKCkgewogIHZhciBsZWZ0ID0gdGhpcy5mZWVkQXR0cnMueCArIHRoaXMuZmVlZEF0dHJzLncgLyAyIDwgdGhpcy5vM2RCdW5kbGUud2lkdGggLyAyLCB0b3AgPSB0aGlzLmZlZWRBdHRycy55ICsgdGhpcy5mZWVkQXR0cnMuaCAvIDIgPCB0aGlzLm8zZEJ1bmRsZS5oZWlnaHQgLyAyOwogIHJldHVybiBsZWZ0ID8gdG9wID8gdGFsay5tZWRpYS5jM2QuUGlwT3B0aW9ucy5Db3JuZXIuVE9QX0xFRlQgOiB0YWxrLm1lZGlhLmMzZC5QaXBPcHRpb25zLkNvcm5lci5CT1RUT01fTEVGVCA6IHRvcCA/IHRhbGsubWVkaWEuYzNkLlBpcE9wdGlvbnMuQ29ybmVyLlRPUF9SSUdIVCA6IHRhbGsubWVkaWEuYzNkLlBpcE9wdGlvbnMuQ29ybmVyLkJPVFRPTV9SSUdIVAp9Owp0YWxrLm1lZGlhLmMzZC5QaXBIYW5kbGVyLnByb3RvdHlwZS5kaXNwb3NlQzNkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcEhhbmRsZXIkJGRpc3Bvc2VDM2QkKCkgewogIHRhbGsubWVkaWEuYzNkLlBpcEhhbmRsZXIuc3VwZXJDbGFzc18uZGlzcG9zZUMzZC5jYWxsKHRoaXMpOwogIHRoaXMubWluaW1pemVJbWdfICYmICh0aGlzLm1pbmltaXplSW1nXy5kaXNwb3NlKCksIHRoaXMubWluaW1pemVJbWdfID0gbnVsbCk7CiAgdGhpcy5taW5pbWl6ZVJvbGxvdmVySW1nXyAmJiAodGhpcy5taW5pbWl6ZVJvbGxvdmVySW1nXy5kaXNwb3NlKCksIHRoaXMubWluaW1pemVSb2xsb3ZlckltZ18gPSBudWxsKTsKICB0aGlzLm1heGltaXplSW1nXyAmJiAodGhpcy5tYXhpbWl6ZUltZ18uZGlzcG9zZSgpLCB0aGlzLm1heGltaXplSW1nXyA9IG51bGwpOwogIHRoaXMubWF4aW1pemVSb2xsb3ZlckltZ18gJiYgKHRoaXMubWF4aW1pemVSb2xsb3ZlckltZ18uZGlzcG9zZSgpLCB0aGlzLm1heGltaXplUm9sbG92ZXJJbWdfID0gbnVsbCk7CiAgdGhpcy5mb3Vyd2F5QXJyb3dJbWdfICYmICh0aGlzLmZvdXJ3YXlBcnJvd0ltZ18uZGlzcG9zZSgpLCB0aGlzLmZvdXJ3YXlBcnJvd0ltZ18gPSBudWxsKQp9Owp0YWxrLm1lZGlhLmMzZC5TaHJpbmthYmxlRmVlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTaHJpbmthYmxlRmVlZCQobzNkQnVuZGxlLCBlbmRwb2ludCwgZGVwdGgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBpcE9wdGlvbnMpIHsKICB0YWxrLm1lZGlhLmMzZC5GaXhlZEFyZWFGZWVkLmNhbGwodGhpcywgbzNkQnVuZGxlLCBlbmRwb2ludCwgZGVwdGgsIHgsIHksIHdpZHRoLCBoZWlnaHQsICEwKTsKICB0aGlzLnNpemVSYXRpb18gPSBwaXBPcHRpb25zLmdldFNpemUoKTsKICB0aGlzLmNvcm5lcl8gPSBwaXBPcHRpb25zLmdldENvcm5lcigpOwogIHRoaXMucGlwSGFuZGxlcl8gPSBuZXcgdGFsay5tZWRpYS5jM2QuUGlwSGFuZGxlcihvM2RCdW5kbGUsIHRoaXMpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuU2hyaW5rYWJsZUZlZWQsIHRhbGsubWVkaWEuYzNkLkZpeGVkQXJlYUZlZWQpOwp0YWxrLm1lZGlhLmMzZC5TaHJpbmthYmxlRmVlZC5PRkZTRVRfID0gMzsKdGFsay5tZWRpYS5jM2QuU2hyaW5rYWJsZUZlZWQuU0hSSU5LX0RVUkFUSU9OXyA9IDAuODsKdGFsay5tZWRpYS5jM2QuU2hyaW5rYWJsZUZlZWQucHJvdG90eXBlLmhhc1NocnVua18gPSAhMTsKdGFsay5tZWRpYS5jM2QuU2hyaW5rYWJsZUZlZWQucHJvdG90eXBlLnBpcEhhbmRsZXJJbml0aWFsaXplZF8gPSAhMTsKdGFsay5tZWRpYS5jM2QuU2hyaW5rYWJsZUZlZWQucHJvdG90eXBlLnNocmlua1RvQ29ybmVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNocmlua2FibGVGZWVkJCRzaHJpbmtUb0Nvcm5lciQoKSB7CiAgdGhpcy5oYXNTaHJ1bmtfIHx8ICh0aGlzLnJlcG9zaXRpb24oKSwgdGhpcy5oYXNTaHJ1bmtfID0gITAsIHRoaXMuZmVlZE9iamVjdCAmJiB0aGlzLm1vdmVUb0Nvcm5lcih0aGlzLmNvcm5lcl8sIHRhbGsubWVkaWEuYzNkLlNocmlua2FibGVGZWVkLlNIUklOS19EVVJBVElPTl8sIHRhbGsubWVkaWEuYzNkLmVhc2luZy5TVFJPTkdfRUFTRV9JTl9PVVQpKQp9Owp0YWxrLm1lZGlhLmMzZC5TaHJpbmthYmxlRmVlZC5wcm90b3R5cGUubW92ZVRvQ29ybmVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNocmlua2FibGVGZWVkJCRtb3ZlVG9Db3JuZXIkKGNvcm5lciwgZHVyYXRpb24sIGVhc2VNZXRob2QpIHsKICB0aGlzLmNvcm5lcl8gPSBjb3JuZXI7CiAgdmFyIGN1cnJlbnRBdHRycyA9IHRoaXMuZmVlZE9iamVjdC5nZXRBdHRycygpLCBwaXBBdHRycyA9IHRoaXMuZ2V0QXR0cnMoKTsKICB0aGlzLmZpbGxBdHRyaWJ1dGVzKHBpcEF0dHJzLCB0aGlzLmdldEVuZHBvaW50KCkuZ2V0QXNwZWN0KCkpOwogIHRoaXMuc2hyaW5rYWJsZUZlZWRUd2Vlbl8gPSBuZXcgdGFsay5tZWRpYS5jM2QuQXR0cnNUd2Vlbih0aGlzLmZlZWRPYmplY3QsIGN1cnJlbnRBdHRycywgcGlwQXR0cnMsIGR1cmF0aW9uLCBlYXNlTWV0aG9kLCBnb29nLmJpbmQodGhpcy5vblR3ZWVuRG9uZV8sIHRoaXMpKTsKICB0aGlzLm8zZEJ1bmRsZS5jM2RFbmdpbmUucmVnaXN0ZXJSZW5kZXJDYWxsYmFjayh0aGlzLnNocmlua2FibGVGZWVkVHdlZW5fKQp9Owp0YWxrLm1lZGlhLmMzZC5TaHJpbmthYmxlRmVlZC5wcm90b3R5cGUub25Ud2VlbkRvbmVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNocmlua2FibGVGZWVkJCRvblR3ZWVuRG9uZV8kKCkgewogIHRoaXMuc2hyaW5rYWJsZUZlZWRUd2Vlbl8gPSBudWxsOwogIHRoaXMuaW5pdFBpcEhhbmRsZXJfKCk7CiAgdGhpcy5waXBIYW5kbGVyXy51cGRhdGVQb3NpdGlvbih0aGlzLmdldEZlZWRBdHRycygpLCAhMCkKfTsKdGFsay5tZWRpYS5jM2QuU2hyaW5rYWJsZUZlZWQucHJvdG90eXBlLmluaXRQaXBIYW5kbGVyXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTaHJpbmthYmxlRmVlZCQkaW5pdFBpcEhhbmRsZXJfJCgpIHsKICB0aGlzLmZlZWRPYmplY3QgJiYgdGhpcy5oYXNTaHJ1bmtfICYmICF0aGlzLnBpcEhhbmRsZXJJbml0aWFsaXplZF8gJiYgKHRoaXMucGlwSGFuZGxlcl8uaW5pdCgpLCB0aGlzLnBpcEhhbmRsZXJJbml0aWFsaXplZF8gPSAhMCkKfTsKdGFsay5tZWRpYS5jM2QuU2hyaW5rYWJsZUZlZWQucHJvdG90eXBlLmZpbGxBdHRyaWJ1dGVzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNocmlua2FibGVGZWVkJCRmaWxsQXR0cmlidXRlcyQoYXR0cnMsIGFzcGVjdCkgewogIHRhbGsubWVkaWEuYzNkLlNocmlua2FibGVGZWVkLnN1cGVyQ2xhc3NfLmZpbGxBdHRyaWJ1dGVzLmNhbGwodGhpcywgYXR0cnMsIGFzcGVjdCk7CiAgaWYodGhpcy5oYXNTaHJ1bmtfKSB7CiAgICB2YXIgdyA9IGF0dHJzLncgKiB0aGlzLnNpemVSYXRpb18sIGggPSBhdHRycy5oICogdGhpcy5zaXplUmF0aW9fOwogICAgYXR0cnMueCA9IHRoaXMuY29ybmVyXyA9PSB0YWxrLm1lZGlhLmMzZC5QaXBPcHRpb25zLkNvcm5lci5CT1RUT01fUklHSFQgfHwgdGhpcy5jb3JuZXJfID09IHRhbGsubWVkaWEuYzNkLlBpcE9wdGlvbnMuQ29ybmVyLlRPUF9SSUdIVCA/IHRoaXMueCArIHRoaXMud2lkdGggLSB3IC0gdGFsay5tZWRpYS5jM2QuU2hyaW5rYWJsZUZlZWQuT0ZGU0VUXyA6IHRoaXMueCArIHRhbGsubWVkaWEuYzNkLlNocmlua2FibGVGZWVkLk9GRlNFVF87CiAgICBhdHRycy55ID0gdGhpcy5jb3JuZXJfID09IHRhbGsubWVkaWEuYzNkLlBpcE9wdGlvbnMuQ29ybmVyLkJPVFRPTV9MRUZUIHx8IHRoaXMuY29ybmVyXyA9PSB0YWxrLm1lZGlhLmMzZC5QaXBPcHRpb25zLkNvcm5lci5CT1RUT01fUklHSFQgPyB0aGlzLnkgKyB0aGlzLmhlaWdodCAtIGggLSB0YWxrLm1lZGlhLmMzZC5TaHJpbmthYmxlRmVlZC5PRkZTRVRfIDogdGhpcy55ICsgdGFsay5tZWRpYS5jM2QuU2hyaW5rYWJsZUZlZWQuT0ZGU0VUXzsKICAgIGF0dHJzLncgPSB3OwogICAgYXR0cnMuaCA9IGgKICB9Cn07CnRhbGsubWVkaWEuYzNkLlNocmlua2FibGVGZWVkLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTaHJpbmthYmxlRmVlZCQkdXBkYXRlUG9zaXRpb24kKGF0dHJzKSB7CiAgaWYodGhpcy5zaHJpbmthYmxlRmVlZFR3ZWVuXykgewogICAgdmFyIHJlbWFpbmluZyA9IHRoaXMuc2hyaW5rYWJsZUZlZWRUd2Vlbl8uZ2V0UmVtYWluaW5nKCksIGVhc2VNZXRob2QgPSB0aGlzLnNocmlua2FibGVGZWVkVHdlZW5fLmdldEVhc2VNZXRob2QoKTsKICAgIHRoaXMubzNkQnVuZGxlLmMzZEVuZ2luZS51bnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sodGhpcy5zaHJpbmthYmxlRmVlZFR3ZWVuXyk7CiAgICB0aGlzLnNocmlua2FibGVGZWVkVHdlZW5fID0gbmV3IHRhbGsubWVkaWEuYzNkLkF0dHJzVHdlZW4odGhpcy5mZWVkT2JqZWN0LCB0aGlzLmZlZWRPYmplY3QuZ2V0QXR0cnMoKSwgYXR0cnMsIHJlbWFpbmluZywgZWFzZU1ldGhvZCwgZ29vZy5iaW5kKHRoaXMub25Ud2VlbkRvbmVfLCB0aGlzKSk7CiAgICB0aGlzLm8zZEJ1bmRsZS5jM2RFbmdpbmUucmVnaXN0ZXJSZW5kZXJDYWxsYmFjayh0aGlzLnNocmlua2FibGVGZWVkVHdlZW5fKQogIH1lbHNlIHsKICAgIHRhbGsubWVkaWEuYzNkLlNocmlua2FibGVGZWVkLnN1cGVyQ2xhc3NfLnVwZGF0ZVBvc2l0aW9uLmNhbGwodGhpcywgYXR0cnMpLCB0aGlzLmluaXRQaXBIYW5kbGVyXygpLCB0aGlzLnBpcEhhbmRsZXJfLnVwZGF0ZVBvc2l0aW9uKGF0dHJzLCAhMCkKICB9Cn07CnRhbGsubWVkaWEuYzNkLlNocmlua2FibGVGZWVkLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2hyaW5rYWJsZUZlZWQkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGFsay5tZWRpYS5jM2QuU2hyaW5rYWJsZUZlZWQuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5waXBIYW5kbGVyXyAmJiB0aGlzLnBpcEhhbmRsZXJfLmRpc3Bvc2UoKQp9Owp0YWxrLm1lZGlhLmMzZC5QaXBTY2VuZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRQaXBTY2VuZSQobzNkQnVuZGxlLCBwaXBPcHRpb25zKSB7CiAgdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLmNhbGwodGhpcyk7CiAgdGhpcy5zZXRPM2RCdW5kbGUobzNkQnVuZGxlKTsKICB0aGlzLnBpcE9wdGlvbnNfID0gcGlwT3B0aW9uczsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuUGlwU2NlbmUsIHRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZSk7CnRhbGsubWVkaWEuYzNkLlBpcFNjZW5lLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbnMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwU2NlbmUkJHVwZGF0ZVBvc2l0aW9ucyQoKSB7CiAgdGhpcy5oYXNGZWVkKG51bGwpICYmIHRoaXMuZ2V0RmVlZChudWxsKS5zZXRBcmVhKHRoaXMueF8sIHRoaXMueV8sIHRoaXMud2lkdGhfLCB0aGlzLmhlaWdodF8pOwogIHRoaXMuaGFzRmVlZCgiMCIpICYmIHRoaXMuZ2V0RmVlZCgiMCIpLnNldEFyZWEodGhpcy54XywgdGhpcy55XywgdGhpcy53aWR0aF8sIHRoaXMuaGVpZ2h0XykKfTsKdGFsay5tZWRpYS5jM2QuUGlwU2NlbmUucHJvdG90eXBlLmNyZWF0ZUZlZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwU2NlbmUkJGNyZWF0ZUZlZWQkKGVuZHBvaW50KSB7CiAgaWYobnVsbCA9PSBlbmRwb2ludC5nZXRTdHJlYW1JZCgpKSB7CiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2NhbEZlZWRfKGVuZHBvaW50KQogIH0KICByZXR1cm4iMCIgPT0gZW5kcG9pbnQuZ2V0U3RyZWFtSWQoKSA/ICh0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKGVuZHBvaW50LCB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5FdmVudHMuVEVYVFVSRV9BQ1RJVkFURUQsIHRoaXMuc2hyaW5rTG9jYWxGZWVkXyksIHRoaXMuY3JlYXRlUmVtb3RlRmVlZF8oZW5kcG9pbnQpKSA6IG51bGwKfTsKdGFsay5tZWRpYS5jM2QuUGlwU2NlbmUucHJvdG90eXBlLmNyZWF0ZUxvY2FsRmVlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwU2NlbmUkJGNyZWF0ZUxvY2FsRmVlZF8kKGVuZHBvaW50KSB7CiAgcmV0dXJuIG5ldyB0YWxrLm1lZGlhLmMzZC5TaHJpbmthYmxlRmVlZCh0aGlzLm8zZEJ1bmRsZSwgZW5kcG9pbnQsIDAuMSwgMCwgMCwgMCwgMCwgdGhpcy5waXBPcHRpb25zXykKfTsKdGFsay5tZWRpYS5jM2QuUGlwU2NlbmUucHJvdG90eXBlLmNyZWF0ZVJlbW90ZUZlZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcFNjZW5lJCRjcmVhdGVSZW1vdGVGZWVkXyQoZW5kcG9pbnQpIHsKICByZXR1cm4gbmV3IHRhbGsubWVkaWEuYzNkLkZpeGVkQXJlYUZlZWQodGhpcy5vM2RCdW5kbGUsIGVuZHBvaW50LCAwLCAwLCAwLCAwLCAwLCAhMCkKfTsKdGFsay5tZWRpYS5jM2QuUGlwU2NlbmUucHJvdG90eXBlLnNocmlua0xvY2FsRmVlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkUGlwU2NlbmUkJHNocmlua0xvY2FsRmVlZF8kKCkgewogIHRoaXMuaGFzRmVlZChudWxsKSAmJiB0aGlzLmdldEZlZWQobnVsbCkuc2hyaW5rVG9Db3JuZXIoKQp9Owp0YWxrLm1lZGlhLmMzZC5QaXBTY2VuZS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFBpcFNjZW5lJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRhbGsubWVkaWEuYzNkLlBpcFNjZW5lLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5kaXNwb3NlKCk7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbnVsbAp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU1vdXNlSGFuZGxlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU1vdXNlSGFuZGxlciQobzNkQnVuZGxlLCBzY2VuZSkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5vM2RCdW5kbGVfID0gbzNkQnVuZGxlOwogIHRoaXMuc2NlbmVfID0gc2NlbmU7CiAgdGhpcy5ob3ZlcmVkRmVlZF8gPSBudWxsOwogIHRoaXMuYm91bmRPbk1vdXNlTW92ZV8gPSBnb29nLmJpbmQodGhpcy5vbk1vdXNlTW92ZV8sIHRoaXMpOwogIHRoaXMuYm91bmRPbk1vdXNlRG93bl8gPSBnb29nLmJpbmQodGhpcy5vbk1vdXNlRG93bl8sIHRoaXMpOwogIHRoaXMuYm91bmRPbk1vdXNlVXBfID0gZ29vZy5iaW5kKHRoaXMub25Nb3VzZVVwXywgdGhpcyk7CiAgdmFyIGMzZCA9IG8zZEJ1bmRsZS5jM2RPYmplY3QuZ2V0UGx1Z2luKCk7CiAgdGFsay5tZWRpYS5jM2QuYWRkRXZlbnRDYWxsYmFjayhjM2QsICJtb3VzZW1vdmUiLCB0aGlzLmJvdW5kT25Nb3VzZU1vdmVfKTsKICB0YWxrLm1lZGlhLmMzZC5hZGRFdmVudENhbGxiYWNrKGMzZCwgIm1vdXNlZG93biIsIHRoaXMuYm91bmRPbk1vdXNlRG93bl8pOwogIHRhbGsubWVkaWEuYzNkLmFkZEV2ZW50Q2FsbGJhY2soYzNkLCAibW91c2V1cCIsIHRoaXMuYm91bmRPbk1vdXNlVXBfKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlNjZW5lTW91c2VIYW5kbGVyLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CnRhbGsubWVkaWEuYzNkLlNjZW5lTW91c2VIYW5kbGVyLkV2ZW50ID0ge01PVVNFX09WRVI6Im1vZiIsIE1PVVNFX0RPV046Im1kZiIsIE1PVVNFX1VQOiJtdWYifTsKdGFsay5tZWRpYS5jM2QuU2NlbmVNb3VzZUhhbmRsZXIuTW91c2VPdmVyRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVNb3VzZUhhbmRsZXIkTW91c2VPdmVyRXZlbnQkKGZlZWQpIHsKICB0aGlzLmZlZWQgPSBmZWVkOwogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5jM2QuU2NlbmVNb3VzZUhhbmRsZXIuRXZlbnQuTU9VU0VfT1ZFUikKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5TY2VuZU1vdXNlSGFuZGxlci5Nb3VzZU92ZXJFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLmMzZC5TY2VuZU1vdXNlSGFuZGxlci5Nb3VzZURvd25FdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU1vdXNlSGFuZGxlciRNb3VzZURvd25FdmVudCQoZmVlZCkgewogIHRoaXMuZmVlZCA9IGZlZWQ7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLmMzZC5TY2VuZU1vdXNlSGFuZGxlci5FdmVudC5NT1VTRV9ET1dOKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlNjZW5lTW91c2VIYW5kbGVyLk1vdXNlRG93bkV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuYzNkLlNjZW5lTW91c2VIYW5kbGVyLk1vdXNlVXBFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU1vdXNlSGFuZGxlciRNb3VzZVVwRXZlbnQkKGZlZWQpIHsKICB0aGlzLmZlZWQgPSBmZWVkOwogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5jM2QuU2NlbmVNb3VzZUhhbmRsZXIuRXZlbnQuTU9VU0VfVVApCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuU2NlbmVNb3VzZUhhbmRsZXIuTW91c2VVcEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuYzNkLlNjZW5lTW91c2VIYW5kbGVyLnByb3RvdHlwZS5nZXRGZWVkQXRQb3NfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lTW91c2VIYW5kbGVyJCRnZXRGZWVkQXRQb3NfJCh4LCB5KSB7CiAgZm9yKHZhciBzdHJlYW1JZHMgPSB0aGlzLnNjZW5lXy5nZXRTdHJlYW1JZHMoKSwgaSA9IDA7aSA8IHN0cmVhbUlkcy5sZW5ndGg7KytpKSB7CiAgICB2YXIgZmVlZCA9IHRoaXMuc2NlbmVfLmdldEZlZWQoc3RyZWFtSWRzW2ldKTsKICAgIGlmKGZlZWQuaGl0VGVzdCh4LCB5KSkgewogICAgICByZXR1cm4gZmVlZAogICAgfQogIH0KICByZXR1cm4gbnVsbAp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZU1vdXNlSGFuZGxlci5wcm90b3R5cGUub25Nb3VzZU1vdmVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lTW91c2VIYW5kbGVyJCRvbk1vdXNlTW92ZV8kKGUpIHsKICB2YXIgZmVlZCA9IHRoaXMuZ2V0RmVlZEF0UG9zXyhlLngsIGUueSk7CiAgZmVlZCAhPSB0aGlzLmhvdmVyZWRGZWVkXyAmJiAodGhpcy5ob3ZlcmVkRmVlZF8gJiYgdGhpcy5ob3ZlcmVkRmVlZF8ubW91c2VPdXQoZSksICh0aGlzLmhvdmVyZWRGZWVkXyA9IGZlZWQpICYmIHRoaXMuaG92ZXJlZEZlZWRfLm1vdXNlT3ZlcihlKSk7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5TY2VuZU1vdXNlSGFuZGxlci5Nb3VzZU92ZXJFdmVudChmZWVkKSkKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVNb3VzZUhhbmRsZXIucHJvdG90eXBlLm9uTW91c2VEb3duXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZU1vdXNlSGFuZGxlciQkb25Nb3VzZURvd25fJChlKSB7CiAgdmFyIGZlZWQgPSB0aGlzLmdldEZlZWRBdFBvc18oZS54LCBlLnkpOwogICghZmVlZCB8fCAhZmVlZC5tb3VzZURvd24oZSkpICYmIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5jM2QuU2NlbmVNb3VzZUhhbmRsZXIuTW91c2VEb3duRXZlbnQoZmVlZCkpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lTW91c2VIYW5kbGVyLnByb3RvdHlwZS5vbk1vdXNlVXBfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lTW91c2VIYW5kbGVyJCRvbk1vdXNlVXBfJChlKSB7CiAgdmFyIGZlZWQgPSB0aGlzLmdldEZlZWRBdFBvc18oZS54LCBlLnkpOwogICghZmVlZCB8fCAhZmVlZC5tb3VzZVVwKGUpKSAmJiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuYzNkLlNjZW5lTW91c2VIYW5kbGVyLk1vdXNlVXBFdmVudChmZWVkKSkKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVNb3VzZUhhbmRsZXIucHJvdG90eXBlLnJlbW92ZUZlZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVNb3VzZUhhbmRsZXIkJHJlbW92ZUZlZWQkKHN0cmVhbUlkKSB7CiAgdGhpcy5ob3ZlcmVkRmVlZF8gJiYgdGhpcy5ob3ZlcmVkRmVlZF8uZ2V0RW5kcG9pbnQoKS5nZXRTdHJlYW1JZCgpID09IHN0cmVhbUlkICYmICh0aGlzLmhvdmVyZWRGZWVkXyA9IG51bGwpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lTW91c2VIYW5kbGVyLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVNb3VzZUhhbmRsZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGFsay5tZWRpYS5jM2QuU2NlbmVNb3VzZUhhbmRsZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgaWYodGhpcy5vM2RCdW5kbGVfLmMzZE9iamVjdCAmJiB0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LmlzU2NyaXB0YWJsZSgpKSB7CiAgICB2YXIgYzNkID0gdGhpcy5vM2RCdW5kbGVfLmMzZE9iamVjdC5nZXRQbHVnaW4oKTsKICAgIHRhbGsubWVkaWEuYzNkLnJlbW92ZUV2ZW50Q2FsbGJhY2soYzNkLCAibW91c2Vtb3ZlIiwgdGhpcy5ib3VuZE9uTW91c2VNb3ZlXyk7CiAgICB0YWxrLm1lZGlhLmMzZC5yZW1vdmVFdmVudENhbGxiYWNrKGMzZCwgIm1vdXNlZG93biIsIHRoaXMuYm91bmRPbk1vdXNlRG93bl8pOwogICAgdGFsay5tZWRpYS5jM2QucmVtb3ZlRXZlbnRDYWxsYmFjayhjM2QsICJtb3VzZXVwIiwgdGhpcy5ib3VuZE9uTW91c2VVcF8pCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZVNlbGVjdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZVNlbGVjdGlvbiQobzNkQnVuZGxlLCBzY2VuZSkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5vM2RCdW5kbGVfID0gbzNkQnVuZGxlOwogIHRoaXMubW91c2VIYW5kbGVyXyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5TY2VuZU1vdXNlSGFuZGxlcihvM2RCdW5kbGUsIHNjZW5lKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5tb3VzZUhhbmRsZXJfLCB0YWxrLm1lZGlhLmMzZC5TY2VuZU1vdXNlSGFuZGxlci5FdmVudC5NT1VTRV9PVkVSLCB0aGlzLm9uTW91c2VPdmVyXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLm1vdXNlSGFuZGxlcl8sIHRhbGsubWVkaWEuYzNkLlNjZW5lTW91c2VIYW5kbGVyLkV2ZW50Lk1PVVNFX0RPV04sIHRoaXMub25Nb3VzZURvd25fKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMubW91c2VIYW5kbGVyXywgdGFsay5tZWRpYS5jM2QuU2NlbmVNb3VzZUhhbmRsZXIuRXZlbnQuTU9VU0VfVVAsIHRoaXMub25Nb3VzZVVwXykKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5TY2VuZVNlbGVjdGlvbiwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwp0YWxrLm1lZGlhLmMzZC5TY2VuZVNlbGVjdGlvbi5CT1JERVJfQ09MT1JfID0gWzEsIDEsIDAsIDAuOV07CnRhbGsubWVkaWEuYzNkLlNjZW5lU2VsZWN0aW9uLkJPUkRFUl9XSURUSF8gPSA0Owp0YWxrLm1lZGlhLmMzZC5TY2VuZVNlbGVjdGlvbi5FdmVudCA9IHtDSEFOR0VEOiJzc2MifTsKdGFsay5tZWRpYS5jM2QuU2NlbmVTZWxlY3Rpb24uQ2hhbmdlZEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNjZW5lU2VsZWN0aW9uJENoYW5nZWRFdmVudCQoZmVlZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5jM2QuU2NlbmVTZWxlY3Rpb24uRXZlbnQuQ0hBTkdFRCk7CiAgdGhpcy5mZWVkID0gZmVlZAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLlNjZW5lU2VsZWN0aW9uLkNoYW5nZWRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLmMzZC5TY2VuZVNlbGVjdGlvbi5wcm90b3R5cGUuc2hvd1BvaW50ZXJDdXJzb3IgPSAhMTsKdGFsay5tZWRpYS5jM2QuU2NlbmVTZWxlY3Rpb24ucHJvdG90eXBlLmZvbGxvd01vdXNlXyA9ICExOwp0YWxrLm1lZGlhLmMzZC5TY2VuZVNlbGVjdGlvbi5wcm90b3R5cGUudW5zZWxlY3RPbk1vdXNlVXBfID0gITE7CnRhbGsubWVkaWEuYzNkLlNjZW5lU2VsZWN0aW9uLnByb3RvdHlwZS5vbk1vdXNlT3Zlcl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVTZWxlY3Rpb24kJG9uTW91c2VPdmVyXyQoZSkgewogIGUuZmVlZCA/ICh0aGlzLnNob3dQb2ludGVyQ3Vyc29yICYmICF0aGlzLnBvaW50ZXJDdXJzb3JfICYmICh0aGlzLnBvaW50ZXJDdXJzb3JfID0gdGhpcy5vM2RCdW5kbGVfLmN1cnNvck1hbmFnZXIuc2V0Q3Vyc29yKCJQT0lOVEVSIiwgMCkpLCB0aGlzLmZvbGxvd01vdXNlXyAmJiB0aGlzLnNlbGVjdEZlZWQoZS5mZWVkKSkgOiB0aGlzLnBvaW50ZXJDdXJzb3JfICYmICh0aGlzLm8zZEJ1bmRsZV8uY3Vyc29yTWFuYWdlci51bnNldEN1cnNvcih0aGlzLnBvaW50ZXJDdXJzb3JfKSwgdGhpcy5wb2ludGVyQ3Vyc29yXyA9IG51bGwpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lU2VsZWN0aW9uLnByb3RvdHlwZS5vbk1vdXNlRG93bl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVTZWxlY3Rpb24kJG9uTW91c2VEb3duXyQoZSkgewogIGUuZmVlZCAmJiAodGhpcy5mb2xsb3dNb3VzZV8gPSAhMCwgdGhpcy51bnNlbGVjdE9uTW91c2VVcF8gPSB0aGlzLnNlbGVjdGVkRmVlZF8gPT0gZS5mZWVkLCB0aGlzLnNlbGVjdEZlZWQoZS5mZWVkKSkKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVTZWxlY3Rpb24ucHJvdG90eXBlLm9uTW91c2VVcF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVTZWxlY3Rpb24kJG9uTW91c2VVcF8kKGUpIHsKICB0aGlzLmZvbGxvd01vdXNlXyAmJiAodGhpcy51bnNlbGVjdE9uTW91c2VVcF8gJiYgZS5mZWVkID8gdGhpcy5zZWxlY3RGZWVkKG51bGwpIDogdGhpcy5zZWxlY3RGZWVkKGUuZmVlZCkpOwogIHRoaXMudW5zZWxlY3RPbk1vdXNlVXBfID0gdGhpcy5mb2xsb3dNb3VzZV8gPSAhMQp9Owp0YWxrLm1lZGlhLmMzZC5TY2VuZVNlbGVjdGlvbi5wcm90b3R5cGUuc2VsZWN0RmVlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZVNlbGVjdGlvbiQkc2VsZWN0RmVlZCQoZmVlZCkgewogIHRoaXMuc2VsZWN0ZWRGZWVkXyA9PSBmZWVkIHx8IGZlZWQgJiYgIWZlZWQuaXNTZWxlY3RhYmxlKCkgfHwgKHRoaXMuc2VsZWN0ZWRGZWVkXyA9IGZlZWQsIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5jM2QuU2NlbmVTZWxlY3Rpb24uQ2hhbmdlZEV2ZW50KGZlZWQpKSkKfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVTZWxlY3Rpb24ucHJvdG90eXBlLnJlbW92ZUZlZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVTZWxlY3Rpb24kJHJlbW92ZUZlZWQkKHN0cmVhbUlkKSB7CiAgdGhpcy5tb3VzZUhhbmRsZXJfLnJlbW92ZUZlZWQoc3RyZWFtSWQpOwogIHRoaXMuc2VsZWN0ZWRGZWVkXyAmJiB0aGlzLnNlbGVjdGVkRmVlZF8uZ2V0RW5kcG9pbnQoKS5nZXRTdHJlYW1JZCgpID09IHN0cmVhbUlkICYmICh0aGlzLnNlbGVjdGVkRmVlZF8gPSBudWxsLCB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuYzNkLlNjZW5lU2VsZWN0aW9uLkNoYW5nZWRFdmVudChudWxsKSkpCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lU2VsZWN0aW9uLnByb3RvdHlwZS5oYXNTZWxlY3Rpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVTZWxlY3Rpb24kJGhhc1NlbGVjdGlvbiQoKSB7CiAgcmV0dXJuISF0aGlzLnNlbGVjdGVkRmVlZF8KfTsKdGFsay5tZWRpYS5jM2QuU2NlbmVTZWxlY3Rpb24ucHJvdG90eXBlLmdldFNlbGVjdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTY2VuZVNlbGVjdGlvbiQkZ2V0U2VsZWN0aW9uJCgpIHsKICByZXR1cm4gdGhpcy5zZWxlY3RlZEZlZWRfCn07CnRhbGsubWVkaWEuYzNkLlNjZW5lU2VsZWN0aW9uLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU2NlbmVTZWxlY3Rpb24kJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGFsay5tZWRpYS5jM2QuU2NlbmVTZWxlY3Rpb24uc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5zZWxlY3RlZEZlZWRfID0gbnVsbDsKICB0aGlzLmV2ZW50SGFuZGxlcl8gJiYgKHRoaXMuZXZlbnRIYW5kbGVyXy5kaXNwb3NlKCksIHRoaXMuZXZlbnRIYW5kbGVyXyA9IG51bGwpOwogIHRoaXMubW91c2VIYW5kbGVyXyAmJiAodGhpcy5tb3VzZUhhbmRsZXJfLmRpc3Bvc2UoKSwgdGhpcy5tb3VzZUhhbmRsZXJfID0gbnVsbCkKfTsKdGFsay5tZWRpYS5QbGF5ZXJPcHRpb25zID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGxheWVyT3B0aW9ucyQobG9jYWxlKSB7CiAgdGhpcy5waXBPcHRpb25zXyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5QaXBPcHRpb25zOwogIHRoaXMuaW5jbHVkZUZ1bGxzY3JlZW5fID0gdGhpcy5hdXRvSGlkZUNvbnRyb2xzXyA9ICEwOwogIHRoaXMubG9jYWxlXyA9IGxvY2FsZTsKICB0aGlzLm9yZGVyRmVlZHNfID0gITA7CiAgdGhpcy5zY2VuZUxheW91dFR5cGVfID0gdGFsay5tZWRpYS5QbGF5ZXJPcHRpb25zLlNjZW5lTGF5b3V0VHlwZS5GTEVYCn07CnRhbGsubWVkaWEuUGxheWVyT3B0aW9ucy5TY2VuZUxheW91dFR5cGUgPSB7RkxFWDoiZmxleCIsIExFVFRFUjoibGV0dGVyIiwgUElMTEFSOiJwaWxsYXIifTsKdGFsay5tZWRpYS5QbGF5ZXJPcHRpb25zLnByb3RvdHlwZS5nZXRQaXAgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQbGF5ZXJPcHRpb25zJCRnZXRQaXAkKCkgewogIHJldHVybiB0aGlzLnBpcE9wdGlvbnNfCn07CnRhbGsubWVkaWEuUGxheWVyT3B0aW9ucy5wcm90b3R5cGUuZ2V0QXV0b0hpZGVDb250cm9scyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBsYXllck9wdGlvbnMkJGdldEF1dG9IaWRlQ29udHJvbHMkKCkgewogIHJldHVybiB0aGlzLmF1dG9IaWRlQ29udHJvbHNfCn07CnRhbGsubWVkaWEuUGxheWVyT3B0aW9ucy5wcm90b3R5cGUuZ2V0SW5jbHVkZUZ1bGxzY3JlZW4gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQbGF5ZXJPcHRpb25zJCRnZXRJbmNsdWRlRnVsbHNjcmVlbiQoKSB7CiAgcmV0dXJuIHRoaXMuaW5jbHVkZUZ1bGxzY3JlZW5fCn07CnRhbGsubWVkaWEuUGxheWVyT3B0aW9ucy5wcm90b3R5cGUuZ2V0TG9jYWxlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGxheWVyT3B0aW9ucyQkZ2V0TG9jYWxlJCgpIHsKICByZXR1cm4gdGhpcy5sb2NhbGVfCn07CnRhbGsubWVkaWEuUGxheWVyT3B0aW9ucy5wcm90b3R5cGUuc2V0TG9jYWxlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGxheWVyT3B0aW9ucyQkc2V0TG9jYWxlJChsb2NhbGUpIHsKICB0aGlzLmxvY2FsZV8gPSBsb2NhbGUKfTsKdGFsay5tZWRpYS5QbGF5ZXJPcHRpb25zLnByb3RvdHlwZS5nZXRPcmRlckZlZWRzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGxheWVyT3B0aW9ucyQkZ2V0T3JkZXJGZWVkcyQoKSB7CiAgcmV0dXJuIHRoaXMub3JkZXJGZWVkc18KfTsKdGFsay5tZWRpYS5QbGF5ZXJPcHRpb25zLnByb3RvdHlwZS5nZXRTdGlja3lTY3JlZW5jYXN0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGxheWVyT3B0aW9ucyQkZ2V0U3RpY2t5U2NyZWVuY2FzdCQoKSB7CiAgcmV0dXJuIHRoaXMuc3RpY2t5U2NyZWVuY2FzdF8KfTsKdGFsay5tZWRpYS5QbGF5ZXJPcHRpb25zLnByb3RvdHlwZS5nZXRCYWNrZ3JvdW5kQ29sb3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQbGF5ZXJPcHRpb25zJCRnZXRCYWNrZ3JvdW5kQ29sb3IkKCkgewogIHJldHVybiB0aGlzLmJhY2tncm91bmRDb2xvcl8KfTsKdGFsay5tZWRpYS5QbGF5ZXJPcHRpb25zLnByb3RvdHlwZS5zZXRCYWNrZ3JvdW5kQ29sb3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQbGF5ZXJPcHRpb25zJCRzZXRCYWNrZ3JvdW5kQ29sb3IkKGJhY2tncm91bmRDb2xvcikgewogIHRoaXMuYmFja2dyb3VuZENvbG9yXyA9IGJhY2tncm91bmRDb2xvcgp9Owp0YWxrLm1lZGlhLlBsYXllck9wdGlvbnMucHJvdG90eXBlLmdldFNjZW5lTGF5b3V0VHlwZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBsYXllck9wdGlvbnMkJGdldFNjZW5lTGF5b3V0VHlwZSQoKSB7CiAgcmV0dXJuIHRoaXMuc2NlbmVMYXlvdXRUeXBlXwp9Owp0YWxrLm1lZGlhLlBsYXllck9wdGlvbnMucHJvdG90eXBlLmdldEZpbG1TdHJpcFdpZHRoID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGxheWVyT3B0aW9ucyQkZ2V0RmlsbVN0cmlwV2lkdGgkKCkgewogIHJldHVybiB0aGlzLmZpbG1TdHJpcFdpZHRoXwp9Owp0YWxrLm1lZGlhLmMzZC5GZWVkQXJlYVR3ZWVuID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZlZWRBcmVhVHdlZW4kKGZlZWQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGR1cmF0aW9uLCBlYXNlTWV0aG9kLCBvcHRfZG9uZUZuKSB7CiAgdGFsay5tZWRpYS5jM2QuVHdlZW4uY2FsbCh0aGlzLCBlYXNlTWV0aG9kLCBkdXJhdGlvbiwgb3B0X2RvbmVGbik7CiAgdGhpcy5mZWVkXyA9IGZlZWQ7CiAgdGhpcy5zdGFydFhfID0gZmVlZC5nZXRYKCk7CiAgdGhpcy5zdGFydFlfID0gZmVlZC5nZXRZKCk7CiAgdGhpcy5zdGFydFdpZHRoXyA9IGZlZWQuZ2V0V2lkdGgoKTsKICB0aGlzLnN0YXJ0SGVpZ2h0XyA9IGZlZWQuZ2V0SGVpZ2h0KCk7CiAgdGhpcy5lbmRYXyA9IHg7CiAgdGhpcy5lbmRZXyA9IHk7CiAgdGhpcy5lbmRXaWR0aF8gPSB3aWR0aDsKICB0aGlzLmVuZEhlaWdodF8gPSBoZWlnaHQKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5GZWVkQXJlYVR3ZWVuLCB0YWxrLm1lZGlhLmMzZC5Ud2Vlbik7CnRhbGsubWVkaWEuYzNkLkZlZWRBcmVhVHdlZW4ucHJvdG90eXBlLmRvVHdlZW5fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEZlZWRBcmVhVHdlZW4kJGRvVHdlZW5fJChmcmFjdGlvbikgewogIHRoaXMuZmVlZF8uc2V0QXJlYSh0aGlzLmVhc2VNZXRob2QuZG9FYXNlKHRoaXMuc3RhcnRYXywgdGhpcy5lbmRYXywgZnJhY3Rpb24pLCB0aGlzLmVhc2VNZXRob2QuZG9FYXNlKHRoaXMuc3RhcnRZXywgdGhpcy5lbmRZXywgZnJhY3Rpb24pLCB0aGlzLmVhc2VNZXRob2QuZG9FYXNlKHRoaXMuc3RhcnRXaWR0aF8sIHRoaXMuZW5kV2lkdGhfLCBmcmFjdGlvbiksIHRoaXMuZWFzZU1ldGhvZC5kb0Vhc2UodGhpcy5zdGFydEhlaWdodF8sIHRoaXMuZW5kSGVpZ2h0XywgZnJhY3Rpb24pKQp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEF1ZGlvRGlzcGxheUhhbmRsZXIkKG8zZEJ1bmRsZSwgZmVlZCwgZXZlbnRUYXJnZXQpIHsKICB0YWxrLm1lZGlhLmMzZC5GZWVkSGFuZGxlci5jYWxsKHRoaXMsIG8zZEJ1bmRsZSwgZmVlZCk7CiAgdGhpcy5pbWFnZXNMb2FkZWRfID0gdGhpcy5pbWFnZXNJbml0aWFsaXplZF8gPSB0aGlzLm5vd1RyYWNraW5nQWN0aW9uXyA9ICExOwogIHRoaXMuaWNvbnNfID0gW107CiAgdGhpcy5udW1Mb2FkZWRJY29uc18gPSB0aGlzLnBvc2l0aW9uSW1hZ2VzVGhyZXNob2xkXyA9IDA7CiAgdGhpcy5ldmVudFRhcmdldF8gPSBldmVudFRhcmdldDsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlciwgdGFsay5tZWRpYS5jM2QuRmVlZEhhbmRsZXIpOwp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkNIQVJUX1NFUlZFUl9VUkxfID0gImh0dHA6Ly9jaGFydC5hcGlzLmdvb2dsZS5jb20vY2hhcnQ/Y2h0PWJocyI7CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuTVVURV9JQ09OX1BBVEhfID0gIi90YWxrZ2FkZ2V0L2ltYWdlcy9nY29tbS9maWxtc3RyaXBfYWN0aW9uX211dGUucG5nIjsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5DSEFUX0lDT05fUEFUSF8gPSAiL3RhbGtnYWRnZXQvaW1hZ2VzL2djb21tL2ZpbG1zdHJpcF9hY3Rpb25fY2hhdC5wbmciOwp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkJMT0NLX0lDT05fUEFUSF8gPSAiL3RhbGtnYWRnZXQvaW1hZ2VzL2djb21tL2ZpbG1zdHJpcF9hY3Rpb25fYmxvY2tlZC5wbmciOwp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkxBQkVMX0JBQ0tHUk9VTkRfQ09MT1JfID0gIjAwMDAwMCI7CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuTEFCRUxfU0laRV8gPSAiOTB4MjAiOwp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkxBQkVMX0NPTE9SXyA9ICJGRkZGRkYiOwp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkxBQkVMX0ZPTlRfU0laRV8gPSAxMjsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5MQUJFTF9URVhUX0FMSUdOTUVOVF8gPSAtMTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5yZW1vdGVNdXRlRW5hYmxlZCA9ICExOwp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLmhpZGVDaGF0SWNvbiA9ICExOwp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLmJsb2NraW5nRW5hYmxlZCA9ICExOwp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyIik7CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIucHJvdG90eXBlLnZvbHVtZURpc3BsYXlfID0gbnVsbDsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRpbml0JChvcHRfaW1hZ2VPdmVybGF5KSB7CiAgdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5zdXBlckNsYXNzXy5pbml0LmNhbGwodGhpcywgb3B0X2ltYWdlT3ZlcmxheSk7CiAgdGhpcy52b2x1bWVEaXNwbGF5XyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLlZvbHVtZURpc3BsYXkodGhpcy5pbWFnZU92ZXJsYXlfKTsKICB0aGlzLmV2ZW50VGFyZ2V0Xy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkV2ZW50KHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuRXZlbnRUeXBlLlZPTFVNRV9ESVNQTEFZX0FEREVELCB0aGlzLmZlZWQuZ2V0RW5kcG9pbnQoKS5nZXRQYXJ0aWNpcGFudCgpLmdldFJlc291cmNlSWQoKSwgdGhpcy5mZWVkLCB0aGlzLnZvbHVtZURpc3BsYXlfKSk7CiAgdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5oaWRlQ2hhdEljb24gfHwgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLmZlZWQuZ2V0RW5kcG9pbnQoKS5nZXRQYXJ0aWNpcGFudCgpLCB0YWxrLm1lZGlhLlBhcnRpY2lwYW50LkV2ZW50cy5DT05UQUNUX0NIQU5HRUQsIHRoaXMub25Db250YWN0Q2hhbmdlZF8sICExLCB0aGlzKQp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5pbml0aWFsaXplSW1hZ2VzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRpbml0aWFsaXplSW1hZ2VzXyQoKSB7CiAgdGhpcy5wb3NpdGlvbkltYWdlc1RocmVzaG9sZF8gPSB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLmhpZGVDaGF0SWNvbiA/IDIgOiA0OwogIHRoaXMubnVtTG9hZGVkSWNvbnNfID0gMDsKICB0aGlzLm11dGVJY29uXyA9IHRoaXMuY3JlYXRlSW1hZ2VfKHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuTVVURV9JQ09OX1BBVEhfLCAhMCk7CiAgdGhpcy5tdXRlTGFiZWxfID0gdGhpcy5nZXRMYWJlbF8oIk11dGUiKTsKICB0aGlzLmljb25zXy5wdXNoKHRoaXMubXV0ZUxhYmVsXyk7CiAgdGhpcy5pY29uc18ucHVzaCh0aGlzLm11dGVJY29uXyk7CiAgdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5oaWRlQ2hhdEljb24gfHwgKHRoaXMuY2hhdEljb25fID0gdGhpcy5jcmVhdGVJbWFnZV8odGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5DSEFUX0lDT05fUEFUSF8sICEwKSwgdGhpcy5jaGF0TGFiZWxfID0gdGhpcy5nZXRMYWJlbF8odGhpcy51cGRhdGVDaGF0TGFiZWxUZXh0XygpKSwgdGhpcy5pY29uc18ucHVzaCh0aGlzLmNoYXRMYWJlbF8pLCB0aGlzLmljb25zXy5wdXNoKHRoaXMuY2hhdEljb25fKSk7CiAgdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5ibG9ja2luZ0VuYWJsZWQgJiYgKHRoaXMuYmxvY2tJY29uXyA9IHRoaXMuY3JlYXRlSW1hZ2VfKHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuQkxPQ0tfSUNPTl9QQVRIXywgITApLCB0aGlzLmJsb2NrTGFiZWxfID0gdGhpcy5nZXRMYWJlbF8oIkJsb2NrIiksIHRoaXMuaWNvbnNfLnB1c2godGhpcy5ibG9ja0xhYmVsXyksIHRoaXMuaWNvbnNfLnB1c2godGhpcy5ibG9ja0ljb25fKSk7CiAgdGhpcy5pbWFnZXNJbml0aWFsaXplZF8gPSAhMAp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS51cGRhdGVDaGF0TGFiZWxUZXh0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCR1cGRhdGVDaGF0TGFiZWxUZXh0XyQoKSB7CiAgcmV0dXJuKHRoaXMuY2hhdExhYmVsSXNTdWJzY3JpYmVkXyA9ICEhdGhpcy5pc1N1YnNjcmliZWRDb250YWN0XygpKSA/ICJDaGF0IiA6ICJDaGF0Li4uIgp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5pc1N1YnNjcmliZWRDb250YWN0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRpc1N1YnNjcmliZWRDb250YWN0XyQoKSB7CiAgdmFyIGNvbnRhY3QgPSB0aGlzLmZlZWQuZ2V0RW5kcG9pbnQoKS5nZXRQYXJ0aWNpcGFudCgpLmdldENvbnRhY3QoKTsKICByZXR1cm4gY29udGFjdCAmJiBjb250YWN0LmlzU3Vic2NyaWJlZFRvKCkKfTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5wcm90b3R5cGUuZ2V0TGFiZWxfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEF1ZGlvRGlzcGxheUhhbmRsZXIkJGdldExhYmVsXyQodGV4dCkgewogIHJldHVybiB0aGlzLmNyZWF0ZUltYWdlXyh0aGlzLmdldExhYmVsVXJsXygiICIgKyB0ZXh0ICsgIiAiKSwgITApCn07CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIucHJvdG90eXBlLmdldExhYmVsVXJsXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRnZXRMYWJlbFVybF8kKHRleHQpIHsKICByZXR1cm5bdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5DSEFSVF9TRVJWRVJfVVJMXywgIiZjaGY9YmcscywiLCB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkxBQkVMX0JBQ0tHUk9VTkRfQ09MT1JfLCAiJmNocz0iLCB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkxBQkVMX1NJWkVfLCAiJmNoeHQ9eCZjaHhzPTAsIiwgdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5MQUJFTF9DT0xPUl8sICIsIiwgdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5MQUJFTF9GT05UX1NJWkVfLCAiLCIsIHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuTEFCRUxfVEVYVF9BTElHTk1FTlRfLCAiJmNoeGw9MDp8IiwgdGV4dF0uam9pbigiIikKfTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5wcm90b3R5cGUub25Db250YWN0Q2hhbmdlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQXVkaW9EaXNwbGF5SGFuZGxlciQkb25Db250YWN0Q2hhbmdlZF8kKCkgewogIHRoaXMuY2hhdExhYmVsSXNTdWJzY3JpYmVkXyAhPSB0aGlzLmlzU3Vic2NyaWJlZENvbnRhY3RfKCkgJiYgKHRoaXMuY2hhdExhYmVsXyAmJiAodGhpcy5jaGF0TGFiZWxfLnNldFZpc2libGUoITEpLCB0aGlzLmNoYXRMYWJlbF8uZGlzcG9zZSgpLCBnb29nLmFycmF5LnJlbW92ZSh0aGlzLmljb25zXywgdGhpcy5jaGF0TGFiZWxfKSksIHRoaXMuY2hhdExhYmVsXyA9IHRoaXMuZ2V0TGFiZWxfKHRoaXMudXBkYXRlQ2hhdExhYmVsVGV4dF8oKSksIHRoaXMuaWNvbnNfLnB1c2godGhpcy5jaGF0TGFiZWxfKSkKfTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5wcm90b3R5cGUudXBkYXRlUG9zaXRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQXVkaW9EaXNwbGF5SGFuZGxlciQkdXBkYXRlUG9zaXRpb24kKGF0dHJzLCBzYXZlUG9zaXRpb24pIHsKICB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnN1cGVyQ2xhc3NfLnVwZGF0ZVBvc2l0aW9uLmNhbGwodGhpcywgYXR0cnMsIHNhdmVQb3NpdGlvbik7CiAgdmFyIGZlZWQgPSB0aGlzLmZlZWQsIHBhZGRpbmcgPSA0LCBwYWRkaW5nRnJvbVJpZ2h0RWRnZSA9IDIgKiBwYWRkaW5nLCBwYWRkaW5nQmV0d2Vlbkljb25zID0gMS41ICogcGFkZGluZywgeCA9IGZlZWQueCAtIGF0dHJzLngsIHZvbHVtZVggPSBNYXRoLnJvdW5kKHggKyBwYWRkaW5nKSwgdm9sdW1lWSA9IE1hdGgucm91bmQoMCArIHBhZGRpbmcpLCB2b2x1bWVXaWR0aCA9IDA7CiAgdGhpcy52b2x1bWVEaXNwbGF5XyAmJiAodm9sdW1lV2lkdGggPSB0aGlzLnZvbHVtZURpc3BsYXlfLndpZHRoKCksIHRoaXMudm9sdW1lRGlzcGxheV8udXBkYXRlUG9zaXRpb24odm9sdW1lWCwgdm9sdW1lWSkpOwogIHZhciBtaW5MZWZ0RWRnZVggPSB2b2x1bWVYICsgdm9sdW1lV2lkdGggKyBwYWRkaW5nLCByaWdodEVkZ2VYID0gYXR0cnMudywgdG9wRWRnZVkgPSAwOwogIGlmKHRoaXMubXV0ZUljb25fKSB7CiAgICB2YXIgbXV0ZVggPSBNYXRoLnJvdW5kKHJpZ2h0RWRnZVggLSBwYWRkaW5nRnJvbVJpZ2h0RWRnZSAtIHRoaXMubXV0ZUljb25fLndpZHRoKCkpOwogICAgbXV0ZVggPCBtaW5MZWZ0RWRnZVggJiYgKG11dGVYID0gbWluTGVmdEVkZ2VYKTsKICAgIHZhciBtdXRlWSA9IE1hdGgucm91bmQodG9wRWRnZVkgKyAyICogcGFkZGluZyk7CiAgICB0aGlzLm11dGVJY29uXy5tb3ZlVG8obXV0ZVgsIG11dGVZKTsKICAgIHZhciBtdXRlTGFiZWxYID0gTWF0aC5yb3VuZChtdXRlWCAtIHRoaXMubXV0ZUxhYmVsXy53aWR0aCgpKTsKICAgIG11dGVMYWJlbFggPCBtaW5MZWZ0RWRnZVggJiYgKG11dGVMYWJlbFggPSBtaW5MZWZ0RWRnZVgpOwogICAgdmFyIG11dGVMYWJlbFkgPSBNYXRoLnJvdW5kKG11dGVZKTsKICAgIHRoaXMubXV0ZUxhYmVsXy5tb3ZlVG8obXV0ZUxhYmVsWCwgbXV0ZUxhYmVsWSkKICB9CiAgdmFyIHNob3dDaGF0SWNvbiA9ICF0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLmhpZGVDaGF0SWNvbiAmJiB0aGlzLmNoYXRJY29uXzsKICBpZihzaG93Q2hhdEljb24pIHsKICAgIHZhciBjaGF0WCA9IE1hdGgucm91bmQocmlnaHRFZGdlWCAtIHBhZGRpbmdGcm9tUmlnaHRFZGdlIC0gdGhpcy5jaGF0SWNvbl8ud2lkdGgoKSk7CiAgICBjaGF0WCA8IG1pbkxlZnRFZGdlWCAmJiAoY2hhdFggPSBtaW5MZWZ0RWRnZVgpOwogICAgdmFyIGNoYXRZID0gTWF0aC5yb3VuZCh0b3BFZGdlWSArIHBhZGRpbmcpOwogICAgdGhpcy5tdXRlSWNvbl8gJiYgKGNoYXRZICs9IHRoaXMubXV0ZUljb25fLmhlaWdodCgpICsgcGFkZGluZ0JldHdlZW5JY29ucyk7CiAgICB0aGlzLmNoYXRJY29uXy5tb3ZlVG8oY2hhdFgsIGNoYXRZKTsKICAgIHZhciBjaGF0TGFiZWxYID0gTWF0aC5yb3VuZChjaGF0WCAtIHRoaXMuY2hhdExhYmVsXy53aWR0aCgpKTsKICAgIGNoYXRMYWJlbFggPCBtaW5MZWZ0RWRnZVggJiYgKGNoYXRMYWJlbFggPSBtaW5MZWZ0RWRnZVgpOwogICAgdmFyIGNoYXRMYWJlbFkgPSBNYXRoLnJvdW5kKGNoYXRZKTsKICAgIHRoaXMuY2hhdExhYmVsXy5tb3ZlVG8oY2hhdExhYmVsWCwgY2hhdExhYmVsWSkKICB9CiAgaWYodGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5ibG9ja2luZ0VuYWJsZWQgJiYgdGhpcy5ibG9ja0ljb25fKSB7CiAgICB2YXIgYmxvY2tYID0gTWF0aC5yb3VuZChyaWdodEVkZ2VYIC0gcGFkZGluZ0Zyb21SaWdodEVkZ2UgLSB0aGlzLmJsb2NrSWNvbl8ud2lkdGgoKSk7CiAgICBibG9ja1ggPCBtaW5MZWZ0RWRnZVggJiYgKGJsb2NrWCA9IG1pbkxlZnRFZGdlWCk7CiAgICB2YXIgYmxvY2tZID0gTWF0aC5yb3VuZCh0b3BFZGdlWSArIHBhZGRpbmcpLCBwcmVjZWRpbmdJY29uID0gc2hvd0NoYXRJY29uID8gdGhpcy5jaGF0SWNvbl8gOiB0aGlzLm11dGVJY29uXzsKICAgIHByZWNlZGluZ0ljb24gJiYgKGJsb2NrWSArPSBwcmVjZWRpbmdJY29uLmhlaWdodCgpICsgcGFkZGluZ0JldHdlZW5JY29ucyk7CiAgICB0aGlzLmJsb2NrSWNvbl8ubW92ZVRvKGJsb2NrWCwgYmxvY2tZKTsKICAgIHZhciBibG9ja0xhYmVsWCA9IE1hdGgucm91bmQoYmxvY2tYIC0gdGhpcy5ibG9ja0xhYmVsXy53aWR0aCgpKTsKICAgIGJsb2NrTGFiZWxYIDwgbWluTGVmdEVkZ2VYICYmIChibG9ja0xhYmVsWCA9IG1pbkxlZnRFZGdlWCk7CiAgICB2YXIgYmxvY2tMYWJlbFkgPSBNYXRoLnJvdW5kKGJsb2NrWSk7CiAgICB0aGlzLmJsb2NrTGFiZWxfLm1vdmVUbyhibG9ja0xhYmVsWCwgYmxvY2tMYWJlbFkpCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5zaG93SWNvbnMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQXVkaW9EaXNwbGF5SGFuZGxlciQkc2hvd0ljb25zJCh2aXNpYmxlKSB7CiAgdGhpcy5zaG93SWNvbnNfID0gdmlzaWJsZTsKICB0aGlzLmltYWdlc0luaXRpYWxpemVkXyB8fCB0aGlzLmluaXRpYWxpemVJbWFnZXNfKCk7CiAgaWYodGhpcy5pbWFnZXNMb2FkZWRfKSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLmljb25zXy5sZW5ndGg7aSsrKSB7CiAgICAgIHZhciBpbWFnZSA9IHRoaXMuaWNvbnNfW2ldOwogICAgICBpbWFnZSAmJiBpbWFnZS5zZXRWaXNpYmxlKHZpc2libGUpCiAgICB9CiAgfQogIHRoaXMudm9sdW1lRGlzcGxheV8gJiYgKHZpc2libGUgPyB0aGlzLnZvbHVtZURpc3BsYXlfLnNldFZpc2libGUodGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5Wb2x1bWVEaXNwbGF5LlZpc2libGUuVklTSUJMRSkgOiB0aGlzLnZvbHVtZURpc3BsYXlfLnNldFZpc2libGUodGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5Wb2x1bWVEaXNwbGF5LlZpc2libGUuVklTSUJMRV9XSEVOX05PVF9aRVJPKSkKfTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5wcm90b3R5cGUuc2hvd0FtYmllbnRWb2x1bWUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQXVkaW9EaXNwbGF5SGFuZGxlciQkc2hvd0FtYmllbnRWb2x1bWUkKHZpc2libGUpIHsKICB0aGlzLnZvbHVtZURpc3BsYXlfICYmICh2aXNpYmxlID8gdGhpcy52b2x1bWVEaXNwbGF5Xy5zZXRWaXNpYmxlKHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuVm9sdW1lRGlzcGxheS5WaXNpYmxlLlZJU0lCTEVfV0hFTl9OT1RfWkVSTykgOiB0aGlzLnZvbHVtZURpc3BsYXlfLnNldFZpc2libGUodGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5Wb2x1bWVEaXNwbGF5LlZpc2libGUuTk9UX1ZJU0lCTEUpKQp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5tb3VzZURvd24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQXVkaW9EaXNwbGF5SGFuZGxlciQkbW91c2VEb3duJChlKSB7CiAgcmV0dXJuIHRoaXMubm93VHJhY2tpbmdBY3Rpb25fID0gdGhpcy5pc0FueUFjdGlvbkV2ZW50XyhlKQp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5pc0FjdGlvbkV2ZW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRpc0FjdGlvbkV2ZW50XyQoZSwgaWNvbiwgbGFiZWwpIHsKICByZXR1cm4hIShpY29uICYmIHRoaXMuaGl0VGVzdEltYWdlXyhlLngsIGUueSwgaWNvbikgfHwgbGFiZWwgJiYgdGhpcy5oaXRUZXN0SW1hZ2VfKGUueCwgZS55LCBsYWJlbCkpCn07CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIucHJvdG90eXBlLmlzTXV0ZUV2ZW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRpc011dGVFdmVudF8kKGUpIHsKICByZXR1cm4gdGhpcy5pc0FjdGlvbkV2ZW50XyhlLCB0aGlzLm11dGVJY29uXywgdGhpcy5tdXRlTGFiZWxfKQp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5pc0NoYXRFdmVudF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQXVkaW9EaXNwbGF5SGFuZGxlciQkaXNDaGF0RXZlbnRfJChlKSB7CiAgcmV0dXJuIHRoaXMuaXNBY3Rpb25FdmVudF8oZSwgdGhpcy5jaGF0SWNvbl8sIHRoaXMuY2hhdExhYmVsXykKfTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5wcm90b3R5cGUuaXNCbG9ja0V2ZW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRpc0Jsb2NrRXZlbnRfJChlKSB7CiAgcmV0dXJuIHRoaXMuaXNBY3Rpb25FdmVudF8oZSwgdGhpcy5ibG9ja0ljb25fLCB0aGlzLmJsb2NrTGFiZWxfKQp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5pc0FueUFjdGlvbkV2ZW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRpc0FueUFjdGlvbkV2ZW50XyQoZSkgewogIHJldHVybiB0aGlzLmlzTXV0ZUV2ZW50XyhlKSB8fCB0aGlzLmlzQ2hhdEV2ZW50XyhlKSB8fCB0aGlzLmlzQmxvY2tFdmVudF8oZSkKfTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5wcm90b3R5cGUubW91c2VVcCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRtb3VzZVVwJChlKSB7CiAgaWYodGhpcy5ub3dUcmFja2luZ0FjdGlvbl8pIHsKICAgIGlmKHRoaXMuaXNNdXRlRXZlbnRfKGUpKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50VGFyZ2V0Xy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkV2ZW50KHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuRXZlbnRUeXBlLk1VVEVfQVVESU8sIHRoaXMuZmVlZC5nZXRFbmRwb2ludCgpLmdldFBhcnRpY2lwYW50KCkuZ2V0UmVzb3VyY2VJZCgpLCB0aGlzLmZlZWQpKSwgITAKICAgIH0KICAgIGlmKHRoaXMuaXNDaGF0RXZlbnRfKGUpKSB7CiAgICAgIHZhciBldmVudFR5cGUgPSB0aGlzLmNoYXRMYWJlbElzU3Vic2NyaWJlZF8gPyB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkV2ZW50VHlwZS5DSEFUIDogdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5FdmVudFR5cGUuSU5WSVRFX1RPX0NIQVQ7CiAgICAgIHRoaXMuZXZlbnRUYXJnZXRfLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuRXZlbnQoZXZlbnRUeXBlLCB0aGlzLmZlZWQuZ2V0RW5kcG9pbnQoKS5nZXRQYXJ0aWNpcGFudCgpLmdldFJlc291cmNlSWQoKSwgdGhpcy5mZWVkKSk7CiAgICAgIHJldHVybiEwCiAgICB9CiAgICBpZih0aGlzLmlzQmxvY2tFdmVudF8oZSkpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUYXJnZXRfLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuRXZlbnQodGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5FdmVudFR5cGUuUkVQT1JUX0FCVVNFLCB0aGlzLmZlZWQuZ2V0RW5kcG9pbnQoKS5nZXRQYXJ0aWNpcGFudCgpLmdldFJlc291cmNlSWQoKSwgdGhpcy5mZWVkKSksICEwCiAgICB9CiAgfQogIHJldHVybiB0aGlzLm5vd1RyYWNraW5nQWN0aW9uXyA9ICExCn07CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIucHJvdG90eXBlLm1vdXNlTW92ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRtb3VzZU1vdmUkKGUpIHsKICB0aGlzLmlzQW55QWN0aW9uRXZlbnRfKGUpID8gdGhpcy5wb2ludGVyQ3Vyc29yXyB8fCAodGhpcy5wb2ludGVyQ3Vyc29yXyA9IHRoaXMubzNkQnVuZGxlLmN1cnNvck1hbmFnZXIuc2V0Q3Vyc29yKCJQT0lOVEVSIiwgMTApKSA6IHRoaXMucG9pbnRlckN1cnNvcl8gJiYgKHRoaXMubzNkQnVuZGxlLmN1cnNvck1hbmFnZXIudW5zZXRDdXJzb3IodGhpcy5wb2ludGVyQ3Vyc29yXyksIHRoaXMucG9pbnRlckN1cnNvcl8gPSBudWxsKQp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5oaXRUZXN0SW1hZ2VfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEF1ZGlvRGlzcGxheUhhbmRsZXIkJGhpdFRlc3RJbWFnZV8kKHgsIHksIGltYWdlKSB7CiAgaWYoaW1hZ2UpIHsKICAgIHZhciBhdHRycyA9IHRoaXMuZmVlZC5nZXRBdHRycygpLCB4ID0geCAtIGF0dHJzLngsIHkgPSB5IC0gYXR0cnMueSwgbG93ZXJYID0gaW1hZ2UueCgpLCBsb3dlclkgPSBpbWFnZS55KCksIHVwcGVyWCA9IGltYWdlLngoKSArIGltYWdlLndpZHRoKCksIHVwcGVyWSA9IGltYWdlLnkoKSArIGltYWdlLmhlaWdodCgpOwogICAgcmV0dXJuIGxvd2VyWCA8PSB4ICYmIHggPD0gdXBwZXJYICYmIGxvd2VyWSA8PSB5ICYmIHkgPD0gdXBwZXJZCiAgfQogIHJldHVybiExCn07CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZUltYWdlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRjcmVhdGVJbWFnZV8kKHVybCwgb3B0X2NhY2hlKSB7CiAgdmFyIGltYWdlOwogIHJldHVybiBpbWFnZSA9IG9wdF9jYWNoZSA/IHRoaXMuaW1hZ2VPdmVybGF5Xy5jcmVhdGVDYWNoZWRJbWFnZSgwLCAwLCB1cmwsIGdvb2cuYmluZCh0aGlzLm9uSW1hZ2VMb2FkZWRfLCB0aGlzKSkgOiB0aGlzLmltYWdlT3ZlcmxheV8uY3JlYXRlSW1hZ2UoMCwgMCwgdXJsLCBnb29nLmJpbmQoZnVuY3Rpb24oKSB7CiAgICB0aGlzLm9uSW1hZ2VMb2FkZWRfKGltYWdlKQogIH0sIHRoaXMpKQp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5vbkltYWdlTG9hZGVkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRvbkltYWdlTG9hZGVkXyQoaW1hZ2UpIHsKICBpbWFnZS5yZXNpemUoaW1hZ2UudGV4dHVyZVdpZHRoKCksIGltYWdlLnRleHR1cmVIZWlnaHQoKSk7CiAgdGhpcy5udW1Mb2FkZWRJY29uc18rKzsKICBpZih0aGlzLm51bUxvYWRlZEljb25zXyA+PSB0aGlzLnBvc2l0aW9uSW1hZ2VzVGhyZXNob2xkXykgewogICAgdGhpcy5vbkljb25zTG9hZGVkXygpCiAgfQogIGltYWdlLnNldFZpc2libGUodGhpcy5zaG93SWNvbnNfKQp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5vbkljb25zTG9hZGVkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRvbkljb25zTG9hZGVkXyQoKSB7CiAgZ29vZy5UaW1lci5jYWxsT25jZShmdW5jdGlvbigpIHsKICAgIHRoaXMudXBkYXRlUG9zaXRpb24odGhpcy5mZWVkLmdldEZlZWRBdHRycygpLCAhMSkKICB9LCAwLCB0aGlzKTsKICB0aGlzLmltYWdlc0xvYWRlZF8gPSAhMAp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnByb3RvdHlwZS5kaXNwb3NlQzNkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEF1ZGlvRGlzcGxheUhhbmRsZXIkJGRpc3Bvc2VDM2QkKCkgewogIHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuc3VwZXJDbGFzc18uZGlzcG9zZUMzZC5jYWxsKHRoaXMpOwogIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuaWNvbnNfLmxlbmd0aDtpKyspIHsKICAgIHRoaXMuaWNvbnNfW2ldLmRpc3Bvc2UoKQogIH0KICB0aGlzLmljb25zXyA9IFtdCn07CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5kaXNwb3NlQzNkKCk7CiAgdGhpcy52b2x1bWVEaXNwbGF5XyAmJiAodGhpcy52b2x1bWVEaXNwbGF5Xy5kaXNwb3NlKCksIGRlbGV0ZSB0aGlzLnZvbHVtZURpc3BsYXlfKTsKICB0aGlzLmV2ZW50VGFyZ2V0Xy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkV2ZW50KHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuRXZlbnRUeXBlLlZPTFVNRV9ESVNQTEFZX1JFTU9WRUQsIHRoaXMuZmVlZC5nZXRFbmRwb2ludCgpLmdldFBhcnRpY2lwYW50KCkuZ2V0UmVzb3VyY2VJZCgpLCB0aGlzLmZlZWQpKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8uZGlzcG9zZSgpOwogIGRlbGV0ZSB0aGlzLmV2ZW50SGFuZGxlcl8KfTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5FdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJEV2ZW50JCh0eXBlLCBpZCwgZmVlZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdHlwZSk7CiAgdGhpcy5pZCA9IGlkOwogIHRoaXMuZmVlZCA9IGZlZWQKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLkV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuRXZlbnRUeXBlID0ge1ZPTFVNRV9ESVNQTEFZX0FEREVEOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJ2b2x1bWVEaXNwbGF5QWRkZWQiKSwgVk9MVU1FX0RJU1BMQVlfUkVNT1ZFRDpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgidm9sdW1lRGlzcGxheVJlbW92ZWQiKSwgTVVURV9BVURJTzpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgibXV0ZUF1ZGlvIiksIENIQVQ6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImNoYXQiKSwgSU5WSVRFX1RPX0NIQVQ6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImludml0ZVRvQ2hhdCIpLCBSRVBPUlRfQUJVU0U6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInJlcG9ydEFidXNlIil9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLlZvbHVtZURpc3BsYXkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQXVkaW9EaXNwbGF5SGFuZGxlciRWb2x1bWVEaXNwbGF5JChpbWFnZU92ZXJsYXkpIHsKICB0aGlzLmltYWdlT3ZlcmxheV8gPSBpbWFnZU92ZXJsYXk7CiAgdGhpcy5udW1Mb2FkZWRWb2x1bWVJY29uc18gPSB0aGlzLm51bVJlcXVlc3RlZFZvbHVtZUljb25zXyA9IDA7CiAgdGhpcy52b2x1bWVJY29uc18gPSBbXTsKICB0aGlzLmN1cnJlbnRWb2x1bWVfID0gbnVsbDsKICB0aGlzLnlfID0gdGhpcy54XyA9IDA7CiAgdGhpcy52aXNpYmxlXyA9IHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuVm9sdW1lRGlzcGxheS5WaXNpYmxlLlZJU0lCTEVfV0hFTl9OT1RfWkVSTzsKICB0aGlzLmltYWdlc0xvYWRlZF8gPSB0aGlzLmluaXRpYWxpemVkXyA9ICExCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5Wb2x1bWVEaXNwbGF5LCBnb29nLkRpc3Bvc2FibGUpOwp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLlZvbHVtZURpc3BsYXkuVmlzaWJsZSA9IHtWSVNJQkxFOjAsIE5PVF9WSVNJQkxFOjEsIFZJU0lCTEVfV0hFTl9OT1RfWkVSTzoyfTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5Wb2x1bWVEaXNwbGF5LnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLlZvbHVtZURpc3BsYXkiKTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5Wb2x1bWVEaXNwbGF5LnByb3RvdHlwZS5pbml0aWFsaXplXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJFZvbHVtZURpc3BsYXkkJGluaXRpYWxpemVfJCgpIHsKICB0aGlzLm51bVJlcXVlc3RlZFZvbHVtZUljb25zXyA9IDY7CiAgZm9yKHZhciBpID0gdGhpcy5udW1Mb2FkZWRWb2x1bWVJY29uc18gPSAwO2kgPCB0aGlzLm51bVJlcXVlc3RlZFZvbHVtZUljb25zXztpKyspIHsKICAgIHZhciB1cmwgPSAiL3RhbGtnYWRnZXQvaW1hZ2VzL2djb21tL3ZvbHVtZV8iICsgaSArICIucG5nIiwgaW1hZ2UgPSB0aGlzLmltYWdlT3ZlcmxheV8uY3JlYXRlQ2FjaGVkSW1hZ2UoMCwgMCwgdXJsLCBnb29nLmJpbmQodGhpcy5vbkltYWdlTG9hZGVkXywgdGhpcykpOwogICAgdGhpcy52b2x1bWVJY29uc18ucHVzaChpbWFnZSkKICB9CiAgdGhpcy5pbml0aWFsaXplZF8gPSAhMAp9Owp0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLlZvbHVtZURpc3BsYXkucHJvdG90eXBlLm9uSW1hZ2VMb2FkZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEF1ZGlvRGlzcGxheUhhbmRsZXIkVm9sdW1lRGlzcGxheSQkb25JbWFnZUxvYWRlZF8kKGltYWdlKSB7CiAgaW1hZ2UucmVzaXplKGltYWdlLnRleHR1cmVXaWR0aCgpLCBpbWFnZS50ZXh0dXJlSGVpZ2h0KCkpOwogIGltYWdlLm1vdmVUbyh0aGlzLnhfLCB0aGlzLnlfKTsKICBpbWFnZS5zZXRWaXNpYmxlKCExKTsKICBpZigrK3RoaXMubnVtTG9hZGVkVm9sdW1lSWNvbnNfID09IHRoaXMubnVtUmVxdWVzdGVkVm9sdW1lSWNvbnNfKSB7CiAgICB0aGlzLm9uSWNvbnNMb2FkZWRfKCkKICB9Cn07CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuVm9sdW1lRGlzcGxheS5wcm90b3R5cGUub25JY29uc0xvYWRlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQXVkaW9EaXNwbGF5SGFuZGxlciRWb2x1bWVEaXNwbGF5JCRvbkljb25zTG9hZGVkXyQoKSB7CiAgdGhpcy5jdXJyZW50Vm9sdW1lXyA9IHRoaXMudm9sdW1lSWNvbnNfWzBdOwogIHRoaXMudXBkYXRlUG9zaXRpb24odGhpcy54XywgdGhpcy55Xyk7CiAgdGhpcy5pbWFnZXNMb2FkZWRfID0gITAKfTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5Wb2x1bWVEaXNwbGF5LnByb3RvdHlwZS53aWR0aCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRBdWRpb0Rpc3BsYXlIYW5kbGVyJFZvbHVtZURpc3BsYXkkJHdpZHRoJCgpIHsKICByZXR1cm4gdGhpcy5pbWFnZXNMb2FkZWRfID8gdGhpcy52b2x1bWVJY29uc19bMF0udGV4dHVyZVdpZHRoKCkgOiAwCn07CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuVm9sdW1lRGlzcGxheS5wcm90b3R5cGUudXBkYXRlUG9zaXRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQXVkaW9EaXNwbGF5SGFuZGxlciRWb2x1bWVEaXNwbGF5JCR1cGRhdGVQb3NpdGlvbiQoeCwgeSkgewogIHRoaXMueF8gPSB4OwogIHRoaXMueV8gPSB5OwogIGlmKHRoaXMuaW1hZ2VzTG9hZGVkXykgewogICAgZm9yKHZhciBpID0gMDtpIDwgdGhpcy52b2x1bWVJY29uc18ubGVuZ3RoO2krKykgewogICAgICB0aGlzLnZvbHVtZUljb25zX1tpXS5tb3ZlVG8oeCwgeSkKICAgIH0KICB9Cn07CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuVm9sdW1lRGlzcGxheS5wcm90b3R5cGUudXBkYXRlVm9sdW1lID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEF1ZGlvRGlzcGxheUhhbmRsZXIkVm9sdW1lRGlzcGxheSQkdXBkYXRlVm9sdW1lJCgpIHsKICB0aGlzLmluaXRpYWxpemVkXyB8fCB0aGlzLmluaXRpYWxpemVfKCk7CiAgaWYodGhpcy5pbWFnZXNMb2FkZWRfKSB7CiAgICBzd2l0Y2godGhpcy52aXNpYmxlXykgewogICAgICBjYXNlIHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuVm9sdW1lRGlzcGxheS5WaXNpYmxlLk5PVF9WSVNJQkxFOgogICAgICAgIHRoaXMuY3VycmVudFZvbHVtZV8uc2V0VmlzaWJsZSghMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5Wb2x1bWVEaXNwbGF5LlZpc2libGUuVklTSUJMRToKICAgICAgICB0aGlzLmN1cnJlbnRWb2x1bWVfLnNldFZpc2libGUoITApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuVm9sdW1lRGlzcGxheS5WaXNpYmxlLlZJU0lCTEVfV0hFTl9OT1RfWkVSTzoKICAgICAgICB0aGlzLmN1cnJlbnRWb2x1bWVfLnNldFZpc2libGUodGhpcy5jdXJyZW50Vm9sdW1lXyAhPSB0aGlzLnZvbHVtZUljb25zX1swXSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhpcy5jdXJyZW50Vm9sdW1lXy5zZXRWaXNpYmxlKCEwKQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5jM2QuQXVkaW9EaXNwbGF5SGFuZGxlci5Wb2x1bWVEaXNwbGF5LnByb3RvdHlwZS5zZXRWaXNpYmxlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEF1ZGlvRGlzcGxheUhhbmRsZXIkVm9sdW1lRGlzcGxheSQkc2V0VmlzaWJsZSQodmlzaWJsZSkgewogIHZpc2libGUgIT0gdGhpcy52aXNpYmxlXyAmJiAodGhpcy52aXNpYmxlXyA9IHZpc2libGUsIHRoaXMudXBkYXRlVm9sdW1lKCkpCn07CnRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuVm9sdW1lRGlzcGxheS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJEF1ZGlvRGlzcGxheUhhbmRsZXIkVm9sdW1lRGlzcGxheSQkZGlzcG9zZUludGVybmFsJCgpIHsKICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLnZvbHVtZUljb25zXy5sZW5ndGg7aSsrKSB7CiAgICB0aGlzLnZvbHVtZUljb25zX1tpXS5kaXNwb3NlKCkKICB9CiAgZGVsZXRlIHRoaXMudm9sdW1lSWNvbnNfOwogIHRhbGsubWVkaWEuYzNkLkF1ZGlvRGlzcGxheUhhbmRsZXIuVm9sdW1lRGlzcGxheS5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLmMzZC5Cb3JkZXJlZEZlZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQm9yZGVyZWRGZWVkJChvM2RCdW5kbGUsIGVuZHBvaW50LCBkZXB0aCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmFkZUluLCBib3JkZXJDb2xvciwgYm9yZGVyV2lkdGgsIG9wdF9zZWxlY3RhYmxlLCBvcHRfdmVydGljYWxBbGlnbiwgb3B0X2hvcml6b250YWxBbGlnbikgewogIHRhbGsubWVkaWEuYzNkLkZpeGVkQXJlYUZlZWQuY2FsbCh0aGlzLCBvM2RCdW5kbGUsIGVuZHBvaW50LCBkZXB0aCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmFkZUluLCBvcHRfc2VsZWN0YWJsZSwgb3B0X3ZlcnRpY2FsQWxpZ24sIG9wdF9ob3Jpem9udGFsQWxpZ24pOwogIHRoaXMuYm9yZGVyQ29sb3JfID0gYm9yZGVyQ29sb3I7CiAgdGhpcy5ib3JkZXJXaWR0aF8gPSBib3JkZXJXaWR0aAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuYzNkLkJvcmRlcmVkRmVlZCwgdGFsay5tZWRpYS5jM2QuRml4ZWRBcmVhRmVlZCk7CnRhbGsubWVkaWEuYzNkLkJvcmRlcmVkRmVlZC5JTUFHRV9WSUVXX0RSQVdfUFJJT1JJVFlfID0gMTsKdGFsay5tZWRpYS5jM2QuQm9yZGVyZWRGZWVkLnByb3RvdHlwZS5pc0JvcmRlclZpc2libGVfID0gITE7CnRhbGsubWVkaWEuYzNkLkJvcmRlcmVkRmVlZC5wcm90b3R5cGUuY3JlYXRlRmVlZE9iamVjdCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRCb3JkZXJlZEZlZWQkJGNyZWF0ZUZlZWRPYmplY3QkKCkgewogIHZhciBmZWVkT2JqZWN0ID0gdGFsay5tZWRpYS5jM2QuQm9yZGVyZWRGZWVkLnN1cGVyQ2xhc3NfLmNyZWF0ZUZlZWRPYmplY3QuY2FsbCh0aGlzKTsKICB0aGlzLmNyZWF0ZUxvY2FsVmlld18oZmVlZE9iamVjdCk7CiAgcmV0dXJuIGZlZWRPYmplY3QKfTsKdGFsay5tZWRpYS5jM2QuQm9yZGVyZWRGZWVkLnByb3RvdHlwZS5jcmVhdGVGZWVkSGFuZGxlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRCb3JkZXJlZEZlZWQkJGNyZWF0ZUZlZWRIYW5kbGVyJCgpIHsKICByZXR1cm4gbmV3IHRhbGsubWVkaWEuYzNkLkZlZWRIYW5kbGVyKHRoaXMubzNkQnVuZGxlLCB0aGlzKQp9Owp0YWxrLm1lZGlhLmMzZC5Cb3JkZXJlZEZlZWQucHJvdG90eXBlLmNyZWF0ZUxvY2FsVmlld18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQm9yZGVyZWRGZWVkJCRjcmVhdGVMb2NhbFZpZXdfJChmZWVkT2JqZWN0KSB7CiAgdGhpcy5pbWFnZVZpZXdfID0gdGhpcy5vM2RCdW5kbGUucmVuZGVyaW5nQXBpLmNyZWF0ZVZpZXcodGFsay5tZWRpYS5jM2QuQm9yZGVyZWRGZWVkLklNQUdFX1ZJRVdfRFJBV19QUklPUklUWV8sICEwLCBmZWVkT2JqZWN0KTsKICB0aGlzLmJvcmRlckRpc3BsYXlfID0gdGhpcy5jcmVhdGVGZWVkSGFuZGxlcigpOwogIHRoaXMuaW1hZ2VPdmVybGF5ID0gbmV3IHRhbGsubWVkaWEuYzNkLkltYWdlT3ZlcmxheSh0aGlzLm8zZEJ1bmRsZSwgdGhpcy5pbWFnZVZpZXdfKTsKICB0aGlzLmJvcmRlckRpc3BsYXlfLmluaXQodGhpcy5pbWFnZU92ZXJsYXkpCn07CnRhbGsubWVkaWEuYzNkLkJvcmRlcmVkRmVlZC5wcm90b3R5cGUuc2hvd0JvcmRlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRCb3JkZXJlZEZlZWQkJHNob3dCb3JkZXIkKHNob3cpIHsKICBpZih0aGlzLmJvcmRlckRpc3BsYXlfKSB7CiAgICBpZihzaG93KSB7CiAgICAgIHZhciBhdHRycyA9IHRoaXMuZ2V0QXR0cnMoKSwgd2lkdGggPSBhdHRycy53ID8gTWF0aC5mbG9vcihhdHRycy53KSA6IDAsIGhlaWdodCA9IGF0dHJzLmggPyBNYXRoLmZsb29yKGF0dHJzLmgpIDogMDsKICAgICAgdGhpcy5ib3JkZXJEaXNwbGF5Xy5zZXRCb3JkZXJQcm9wZXJ0aWVzKHRoaXMuYm9yZGVyV2lkdGhfLCB0aGlzLmJvcmRlckNvbG9yXywgdGhpcy5ib3JkZXJDb2xvcl8sIHdpZHRoLCBoZWlnaHQpCiAgICB9CiAgICB0aGlzLmJvcmRlckRpc3BsYXlfLnNldEJvcmRlckhpZ2hsaWdodGVkKHNob3cpCiAgfQogIHRoaXMuaXNCb3JkZXJWaXNpYmxlXyA9IHNob3cKfTsKdGFsay5tZWRpYS5jM2QuQm9yZGVyZWRGZWVkLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRCb3JkZXJlZEZlZWQkJHVwZGF0ZVBvc2l0aW9uJChhdHRycykgewogIHRhbGsubWVkaWEuYzNkLkJvcmRlcmVkRmVlZC5zdXBlckNsYXNzXy51cGRhdGVQb3NpdGlvbi5jYWxsKHRoaXMsIGF0dHJzKTsKICB0aGlzLmJvcmRlckRpc3BsYXlfICYmIHRoaXMuaXNCb3JkZXJWaXNpYmxlXyAmJiAodGhpcy5zaG93Qm9yZGVyKHRoaXMuaXNCb3JkZXJWaXNpYmxlXyksIHRoaXMuYm9yZGVyRGlzcGxheV8udXBkYXRlUG9zaXRpb24oYXR0cnMsICExKSkKfTsKdGFsay5tZWRpYS5jM2QuQm9yZGVyZWRGZWVkLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkQm9yZGVyZWRGZWVkJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRhbGsubWVkaWEuYzNkLkJvcmRlcmVkRmVlZC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICB0aGlzLmJvcmRlckRpc3BsYXlfICYmICh0aGlzLmJvcmRlckRpc3BsYXlfLmRpc3Bvc2UoKSwgdGhpcy5ib3JkZXJEaXNwbGF5XyA9IG51bGwpOwogIHRoaXMuaW1hZ2VWaWV3XyAmJiAodGhpcy5pbWFnZVZpZXdfLmRpc3Bvc2UoKSwgdGhpcy5pbWFnZVZpZXdfID0gbnVsbCkKfTsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTGFiZWxlZEZlZWQkKG8zZEJ1bmRsZSwgZW5kcG9pbnQsIGRlcHRoLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzY2VuZSwgb3B0X2RlZmF1bHRMYWJlbCwgb3B0X2JvcmRlcldpZHRoLCBvcHRfYm9yZGVyQ29sb3IpIHsKICB0aGlzLnNjZW5lXyA9IHNjZW5lOwogIHRoaXMuZGVmYXVsdExhYmVsXyA9IG9wdF9kZWZhdWx0TGFiZWwgfHwgbnVsbDsKICB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyLnJlbW90ZU11dGVFbmFibGVkICYmICFlbmRwb2ludC5nZXRQYXJ0aWNpcGFudCgpLmlzTG9jYWwoKSAmJiAodGhpcy5hdWRpb0Rpc3BsYXlIYW5kbGVyXyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5BdWRpb0Rpc3BsYXlIYW5kbGVyKG8zZEJ1bmRsZSwgdGhpcywgc2NlbmUpLCB0aGlzLm1vdXNlT3ZlciA9IGZ1bmN0aW9uICR0aGlzJG1vdXNlT3ZlciQoKSB7CiAgICB0aGlzLmF1ZGlvRGlzcGxheUhhbmRsZXJfICYmIHRoaXMuYXVkaW9EaXNwbGF5SGFuZGxlcl8uaXNJbml0aWFsaXplZCgpICYmIHRoaXMuYXVkaW9EaXNwbGF5SGFuZGxlcl8uc2hvd0ljb25zKCEwKQogIH0sIHRoaXMubW91c2VPdXQgPSBmdW5jdGlvbiAkdGhpcyRtb3VzZU91dCQoKSB7CiAgICB0aGlzLmF1ZGlvRGlzcGxheUhhbmRsZXJfICYmIHRoaXMuYXVkaW9EaXNwbGF5SGFuZGxlcl8uaXNJbml0aWFsaXplZCgpICYmIHRoaXMuYXVkaW9EaXNwbGF5SGFuZGxlcl8uc2hvd0ljb25zKCExKQogIH0sIHRoaXMubW91c2VEb3duID0gZnVuY3Rpb24gJHRoaXMkbW91c2VEb3duJChlKSB7CiAgICBpZih0aGlzLmF1ZGlvRGlzcGxheUhhbmRsZXJfICYmIHRoaXMuYXVkaW9EaXNwbGF5SGFuZGxlcl8uaXNJbml0aWFsaXplZCgpKSB7CiAgICAgIHJldHVybiB0aGlzLmF1ZGlvRGlzcGxheUhhbmRsZXJfLm1vdXNlRG93bihlKQogICAgfQogIH0sIHRoaXMubW91c2VVcCA9IGZ1bmN0aW9uICR0aGlzJG1vdXNlVXAkKGUpIHsKICAgIGlmKHRoaXMuYXVkaW9EaXNwbGF5SGFuZGxlcl8gJiYgdGhpcy5hdWRpb0Rpc3BsYXlIYW5kbGVyXy5pc0luaXRpYWxpemVkKCkpIHsKICAgICAgcmV0dXJuIHRoaXMuYXVkaW9EaXNwbGF5SGFuZGxlcl8ubW91c2VVcChlKQogICAgfQogIH0pOwogIHRoaXMuYm91bmRPbk1vdXNlTW92ZV8gPSBnb29nLmJpbmQodGhpcy5vbk1vdXNlTW92ZV8sIHRoaXMpOwogIHRhbGsubWVkaWEuYzNkLkJvcmRlcmVkRmVlZC5jYWxsKHRoaXMsIG8zZEJ1bmRsZSwgZW5kcG9pbnQsIGRlcHRoLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCAhMCwgb3B0X2JvcmRlckNvbG9yIHx8IHRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkRFRkFVTFRfQk9SREVSX0NPTE9SXywgb3B0X2JvcmRlcldpZHRoIHx8IHRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkRFRkFVTFRfQk9SREVSX1dJRFRIXywgITApCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQsIHRhbGsubWVkaWEuYzNkLkJvcmRlcmVkRmVlZCk7CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkRFRkFVTFRfQk9SREVSX0NPTE9SXyA9IFswLCAwLCAwLCAxXTsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQuREVGQVVMVF9CT1JERVJfV0lEVEhfID0gMjsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQuTEFCRUxfU0lERV9QQURESU5HID0gODsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQuTEFCRUxfQk9UVE9NX1BBRERJTkcgPSA3Owp0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5TSE9XX09OX1NUQVJUX01TXyA9IDdFMzsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQuU0hPV19PTl9NT1VTRV9NU18gPSAzRTM7CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLklNQUdFX1ZJRVdfRFJBV19QUklPUklUWV8gPSAxOwp0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5DSEFSVF9TRVJWRVJfVVJMXyA9ICJodHRwOi8vY2hhcnQuZ29vZ2xlYXBpcy5jb20vY2hhcnQ/Y2hzdD1kX3RleHRfb3V0bGluZSI7CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkxBQkVMX0JBQ0tHUk9VTkRfQ09MT1JfID0gIjAwMDAwMCI7CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkxBQkVMX1NJWkVfID0gIjE0MHgxNCI7CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkxBQkVMX0NPTE9SXyA9ICJGRkZGRkYiOwp0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5MQUJFTF9GT05UX1NJWkVfID0gMTI7CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkxBQkVMX0ZPTlRfV0VJR0hUXyA9ICJfIjsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQuTEFCRUxfVEVYVF9BTElHTk1FTlRfID0gImwiOwp0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5wcm90b3R5cGUuYXV0b2hpZGVMYWJlbF8gPSAhMDsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQucHJvdG90eXBlLm1vdXNlSW5zaWRlU2NlbmVfID0gITE7CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLnByb3RvdHlwZS5sYWJlbF8gPSBudWxsOwp0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5wcm90b3R5cGUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQiKTsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQucHJvdG90eXBlLmNyZWF0ZUZlZWRPYmplY3QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTGFiZWxlZEZlZWQkJGNyZWF0ZUZlZWRPYmplY3QkKCkgewogIHZhciBmZWVkT2JqZWN0ID0gdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQuc3VwZXJDbGFzc18uY3JlYXRlRmVlZE9iamVjdC5jYWxsKHRoaXMpOwogIHRoaXMuYXVkaW9EaXNwbGF5SGFuZGxlcl8gJiYgdGhpcy5hdWRpb0Rpc3BsYXlIYW5kbGVyXy5pbml0KHRoaXMuaW1hZ2VPdmVybGF5KTsKICB0aGlzLnNldExhYmVsVGV4dCgpOwogIHZhciBjM2QgPSB0aGlzLm8zZEJ1bmRsZS5jM2RPYmplY3QuZ2V0UGx1Z2luKCk7CiAgdGFsay5tZWRpYS5jM2QuYWRkRXZlbnRDYWxsYmFjayhjM2QsICJtb3VzZW1vdmUiLCB0aGlzLmJvdW5kT25Nb3VzZU1vdmVfKTsKICB0aGlzLnNob3dMYWJlbCgpOwogIHJldHVybiBmZWVkT2JqZWN0Cn07CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRMYWJlbGVkRmVlZCQkdXBkYXRlUG9zaXRpb24kKGF0dHJzKSB7CiAgdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQuc3VwZXJDbGFzc18udXBkYXRlUG9zaXRpb24uY2FsbCh0aGlzLCBhdHRycyk7CiAgdmFyIHggPSB0aGlzLnggLSBhdHRycy54LCB5ID0gdGhpcy55IC0gYXR0cnMueTsKICB0aGlzLmxhYmVsXy5tb3ZlVG8oeCArIHRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkxBQkVMX1NJREVfUEFERElORywgeSArIHRoaXMuaGVpZ2h0IC0gdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQuTEFCRUxfQk9UVE9NX1BBRERJTkcgLSB0aGlzLmxhYmVsXy5oZWlnaHQoKSk7CiAgdGhpcy5hdWRpb0Rpc3BsYXlIYW5kbGVyXyAmJiB0aGlzLmF1ZGlvRGlzcGxheUhhbmRsZXJfLnVwZGF0ZVBvc2l0aW9uKGF0dHJzLCAhMSk7CiAgdGhpcy5ib3JkZXJEaXNwbGF5XyAmJiB0aGlzLmJvcmRlckRpc3BsYXlfLnVwZGF0ZVBvc2l0aW9uKGF0dHJzLCAhMSkKfTsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQucHJvdG90eXBlLmdldERlZmF1bHRUZXh0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRMYWJlbGVkRmVlZCQkZ2V0RGVmYXVsdFRleHRfJCgpIHsKICByZXR1cm4gdGhpcy5kZWZhdWx0TGFiZWxfIHx8IHRoaXMuZ2V0RW5kcG9pbnQoKS5nZXRQYXJ0aWNpcGFudCgpLmdldE5hbWUoKQp9Owp0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5wcm90b3R5cGUuZ2V0RGVmYXVsdER1cmF0aW9uXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRMYWJlbGVkRmVlZCQkZ2V0RGVmYXVsdER1cmF0aW9uXyQoKSB7CiAgcmV0dXJuIHRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLlNIT1dfT05fU1RBUlRfTVNfCn07CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLnByb3RvdHlwZS5zZXRMYWJlbFRleHQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTGFiZWxlZEZlZWQkJHNldExhYmVsVGV4dCQob3B0X3RleHQpIHsKICB2YXIgdGV4dCA9IG9wdF90ZXh0ID8gb3B0X3RleHQgOiB0aGlzLmdldERlZmF1bHRUZXh0XygpLCBuZXdMYWJlbCA9IHRoaXMuY3JlYXRlTGFiZWxJbWFnZV8odGV4dCk7CiAgdGhpcy5sYWJlbF8gJiYgKHRoaXMubGFiZWxfLmRpc3Bvc2UoKSwgdGhpcy5sYWJlbF8gPSBudWxsKTsKICB0aGlzLmxhYmVsXyA9IG5ld0xhYmVsCn07CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLnByb3RvdHlwZS5zZXRBdXRvSGlkZUxhYmVsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJExhYmVsZWRGZWVkJCRzZXRBdXRvSGlkZUxhYmVsJChhdXRvaGlkZSkgewogIHRoaXMuYXV0b2hpZGVMYWJlbF8gPSBhdXRvaGlkZTsKICB0aGlzLnNob3dMYWJlbCgpCn07CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLnByb3RvdHlwZS5jcmVhdGVMYWJlbEltYWdlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRMYWJlbGVkRmVlZCQkY3JlYXRlTGFiZWxJbWFnZV8kKHRleHQpIHsKICByZXR1cm4gdGhpcy5pbWFnZU92ZXJsYXkuY3JlYXRlSW1hZ2UoMCwgMCwgW3RhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkNIQVJUX1NFUlZFUl9VUkxfLCAiJmNoZj1iZyxzLCIsIHRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkxBQkVMX0JBQ0tHUk9VTkRfQ09MT1JfLCAiJmNocz0iLCB0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5MQUJFTF9TSVpFXywgIiZjaGxkPSIsIHRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkxBQkVMX0NPTE9SXywgIiU3YyIsIHRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkxBQkVMX0ZPTlRfU0laRV8sICIlN2MiLCB0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5MQUJFTF9URVhUX0FMSUdOTUVOVF8sICIlN2MiLCB0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5MQUJFTF9CQUNLR1JPVU5EX0NPTE9SXywgIiU3YyIsIHRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLkxBQkVMX0ZPTlRfV0VJR0hUXywgIiU3YyIsIGdvb2cuc3RyaW5nLnVybEVuY29kZSh0ZXh0KV0uam9pbigiIiksIAogIGdvb2cuYmluZCh0aGlzLnJlcG9zaXRpb24sIHRoaXMpKQp9Owp0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5wcm90b3R5cGUuc2hvd0xhYmVsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJExhYmVsZWRGZWVkJCRzaG93TGFiZWwkKG9wdF9kdXJhdGlvbikgewogIHRoaXMuY2FuY2VsVHdlZW5zXygpOwogIGlmKHRoaXMubGFiZWxfKSB7CiAgICBpZih0aGlzLmxhYmVsXy5zZXRWaXNpYmxlKCEwKSwgdGhpcy5sYWJlbFNob3dlcl8gPSBuZXcgdGFsay5tZWRpYS5jM2QuQWxwaGFUd2Vlbih0aGlzLmxhYmVsXy5nZXRTY2VuZU9iamVjdCgpLCB0aGlzLmxhYmVsXy5nZXRBbHBoYSgpLCAwLjgsIDAuMiwgdGFsay5tZWRpYS5jM2QuZWFzaW5nLlJFR1VMQVJfRUFTRV9JTiwgZ29vZy5iaW5kKHRoaXMuZmluaXNoU2hvd0xhYmVsXywgdGhpcykpLCB0aGlzLm8zZEJ1bmRsZS5jM2RFbmdpbmUucmVnaXN0ZXJSZW5kZXJDYWxsYmFjayh0aGlzLmxhYmVsU2hvd2VyXyksIHRoaXMuY2xlYXJIaWRlVGltZXJfKCksIHRoaXMuYXV0b2hpZGVMYWJlbF8pIHsKICAgICAgdmFyIGR1cmF0aW9uID0gb3B0X2R1cmF0aW9uID8gb3B0X2R1cmF0aW9uIDogdGhpcy5nZXREZWZhdWx0RHVyYXRpb25fKCk7CiAgICAgIHRoaXMuaGlkZVRpbWVySWRfID0gZ29vZy5UaW1lci5jYWxsT25jZSh0aGlzLmhpZGVMYWJlbCwgZHVyYXRpb24sIHRoaXMpCiAgICB9CiAgfWVsc2UgewogICAgdGhpcy5sb2dnZXJfLndhcm5pbmcoIk5vIGxhYmVsIHRvIHNob3cuIikKICB9Cn07CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLnByb3RvdHlwZS5oaWRlTGFiZWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkTGFiZWxlZEZlZWQkJGhpZGVMYWJlbCQoKSB7CiAgdGhpcy5jbGVhckhpZGVUaW1lcl8oKTsKICB0aGlzLmxhYmVsXyAmJiAodGhpcy5sYWJlbEhpZGVyXyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5BbHBoYVR3ZWVuKHRoaXMubGFiZWxfLmdldFNjZW5lT2JqZWN0KCksIHRoaXMubGFiZWxfLmdldEFscGhhKCksIDAsIDEsIHRhbGsubWVkaWEuYzNkLmVhc2luZy5SRUdVTEFSX0VBU0VfSU4sIGdvb2cuYmluZCh0aGlzLmZpbmlzaEhpZGVMYWJlbF8sIHRoaXMpKSwgdGhpcy5vM2RCdW5kbGUuYzNkRW5naW5lLnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sodGhpcy5sYWJlbEhpZGVyXykpCn07CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLnByb3RvdHlwZS5jYW5jZWxUd2VlbnNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJExhYmVsZWRGZWVkJCRjYW5jZWxUd2VlbnNfJCgpIHsKICB0aGlzLmxhYmVsSGlkZXJfICYmICh0aGlzLm8zZEJ1bmRsZS5jM2RFbmdpbmUudW5yZWdpc3RlclJlbmRlckNhbGxiYWNrKHRoaXMubGFiZWxIaWRlcl8pLCB0aGlzLmxhYmVsSGlkZXJfID0gbnVsbCk7CiAgdGhpcy5sYWJlbFNob3dlcl8gJiYgKHRoaXMubzNkQnVuZGxlLmMzZEVuZ2luZS51bnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sodGhpcy5sYWJlbFNob3dlcl8pLCB0aGlzLmxhYmVsU2hvd2VyXyA9IG51bGwpCn07CnRhbGsubWVkaWEuYzNkLkxhYmVsZWRGZWVkLnByb3RvdHlwZS5maW5pc2hIaWRlTGFiZWxfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJExhYmVsZWRGZWVkJCRmaW5pc2hIaWRlTGFiZWxfJCgpIHsKICB0aGlzLmNhbmNlbFR3ZWVuc18oKTsKICB0aGlzLmxhYmVsXy5zZXRWaXNpYmxlKCExKQp9Owp0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5wcm90b3R5cGUuZmluaXNoU2hvd0xhYmVsXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRMYWJlbGVkRmVlZCQkZmluaXNoU2hvd0xhYmVsXyQoKSB7CiAgdGhpcy5jYW5jZWxUd2VlbnNfKCkKfTsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQucHJvdG90eXBlLmNsZWFySGlkZVRpbWVyXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRMYWJlbGVkRmVlZCQkY2xlYXJIaWRlVGltZXJfJCgpIHsKICB0aGlzLmhpZGVUaW1lcklkXyAmJiAoZ29vZy5UaW1lci5jbGVhcih0aGlzLmhpZGVUaW1lcklkXyksIHRoaXMuaGlkZVRpbWVySWRfID0gbnVsbCkKfTsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQucHJvdG90eXBlLm9uTW91c2VNb3ZlXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRMYWJlbGVkRmVlZCQkb25Nb3VzZU1vdmVfJChlKSB7CiAgdGhpcy5oaXRUZXN0KGUueCwgZS55KSAmJiB0aGlzLnNob3dMYWJlbCh0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5TSE9XX09OX01PVVNFX01TXyk7CiAgaWYodGhpcy5hdWRpb0Rpc3BsYXlIYW5kbGVyXykgewogICAgZm9yKHZhciBzdHJlYW1JZHMgPSB0aGlzLnNjZW5lXy5nZXRTdHJlYW1JZHMoKSwgZm91bmQgPSAhMSwgaSA9IDA7aSA8IHN0cmVhbUlkcy5sZW5ndGg7KytpKSB7CiAgICAgIHZhciBmZWVkID0gdGhpcy5zY2VuZV8uZ2V0RmVlZChzdHJlYW1JZHNbaV0pOwogICAgICBpZihmZWVkLmhpdFRlc3QoZS54LCBlLnkpKSB7CiAgICAgICAgZm91bmQgPSAhMDsKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgICBmb3VuZCA/IHRoaXMubW91c2VJbnNpZGVTY2VuZV8gfHwgKHRoaXMuYXVkaW9EaXNwbGF5SGFuZGxlcl8uc2hvd0FtYmllbnRWb2x1bWUoITApLCB0aGlzLm1vdXNlSW5zaWRlU2NlbmVfID0gITApIDogdGhpcy5tb3VzZUluc2lkZVNjZW5lXyAmJiAodGhpcy5hdWRpb0Rpc3BsYXlIYW5kbGVyXy5zaG93QW1iaWVudFZvbHVtZSghMSksIHRoaXMubW91c2VJbnNpZGVTY2VuZV8gPSAhMSk7CiAgICB0aGlzLmF1ZGlvRGlzcGxheUhhbmRsZXJfLm1vdXNlTW92ZShlKQogIH0KfTsKdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRMYWJlbGVkRmVlZCQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0YWxrLm1lZGlhLmMzZC5MYWJlbGVkRmVlZC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICB0aGlzLmNhbmNlbFR3ZWVuc18oKTsKICB0aGlzLmNsZWFySGlkZVRpbWVyXygpOwogIGlmKHRoaXMubzNkQnVuZGxlLmMzZE9iamVjdC5pc1NjcmlwdGFibGUoKSkgewogICAgdmFyIGMzZCA9IHRoaXMubzNkQnVuZGxlLmMzZE9iamVjdC5nZXRQbHVnaW4oKTsKICAgIHRhbGsubWVkaWEuYzNkLnJlbW92ZUV2ZW50Q2FsbGJhY2soYzNkLCAibW91c2Vtb3ZlIiwgdGhpcy5ib3VuZE9uTW91c2VNb3ZlXykKICB9CiAgdGhpcy5sYWJlbF8gJiYgKHRoaXMubGFiZWxfLmRpc3Bvc2UoKSwgdGhpcy5sYWJlbF8gPSBudWxsKTsKICB0aGlzLmF1ZGlvRGlzcGxheUhhbmRsZXJfICYmIChnb29nLmRpc3Bvc2UodGhpcy5hdWRpb0Rpc3BsYXlIYW5kbGVyXyksIHRoaXMuYXVkaW9EaXNwbGF5SGFuZGxlcl8gPSBudWxsKTsKICB0aGlzLmJvcmRlckRpc3BsYXlfICYmICh0aGlzLmJvcmRlckRpc3BsYXlfLmRpc3Bvc2UoKSwgdGhpcy5ib3JkZXJEaXNwbGF5XyA9IG51bGwpOwogIHRoaXMuaW1hZ2VWaWV3XyAmJiAodGhpcy5pbWFnZVZpZXdfLmRpc3Bvc2UoKSwgdGhpcy5pbWFnZVZpZXdfID0gbnVsbCkKfTsKdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJpcFNjZW5lJChvcmRlckZlZWRzKSB7CiAgdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLmNhbGwodGhpcyk7CiAgdGhpcy5vcmRlckZlZWRzXyA9IG9yZGVyRmVlZHM7CiAgdGhpcy50d2VlbnNfID0gW10KfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLmMzZC5TdHJpcFNjZW5lLCB0YWxrLm1lZGlhLmMzZC5TY2VuZUJhc2UpOwp0YWxrLm1lZGlhLmMzZC5TdHJpcFNjZW5lLlVTRVJfRkVFRFNfID0gNTsKdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5GRUVEX0FTUEVDVCA9IDE2IC8gOTsKdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5GRUVEX01PVkVfRFVSQVRJT05fID0gMTsKdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5wcm90b3R5cGUuY3JlYXRlRmVlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJpcFNjZW5lJCRjcmVhdGVGZWVkJChlbmRwb2ludCkgewogIHJldHVybiBuZXcgdGFsay5tZWRpYS5jM2QuTGFiZWxlZEZlZWQodGhpcy5vM2RCdW5kbGUsIGVuZHBvaW50LCAwLjIsIDAsIDAsIDAsIDAsIHRoaXMpCn07CnRhbGsubWVkaWEuYzNkLlN0cmlwU2NlbmUucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJpcFNjZW5lJCR1cGRhdGVQb3NpdGlvbnMkKG9wdF9hbmltYXRlKSB7CiAgdmFyIGNvdW50ID0gdGhpcy5nZXRGZWVkQ291bnQoKSwgc2NhbGUgPSAwLjkyLCBzcGFjaW5nID0gKDEgLSBzY2FsZSkgLyAyOwogIHRoaXMuY2FuY2VsVHdlZW5zKCk7CiAgaWYodGhpcy53aWR0aF8gLyB0aGlzLmhlaWdodF8gPj0gdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5GRUVEX0FTUEVDVCkgewogICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aF8gLyBNYXRoLm1heCh0YWxrLm1lZGlhLmMzZC5TdHJpcFNjZW5lLlVTRVJfRkVFRFNfLCBjb3VudCksIGhlaWdodCA9IHdpZHRoIC8gdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5GRUVEX0FTUEVDVDsKICAgIGhlaWdodCA+IHRoaXMuaGVpZ2h0XyAmJiAoaGVpZ2h0ID0gdGhpcy5oZWlnaHRfLCB3aWR0aCA9IGhlaWdodCAqIHRhbGsubWVkaWEuYzNkLlN0cmlwU2NlbmUuRkVFRF9BU1BFQ1QpOwogICAgZm9yKHZhciBzdHJlYW1zID0gdGhpcy5nZXRTdHJlYW1JZHMoKSwgbWlkZGxlID0gdGhpcy54XyArIHRoaXMud2lkdGhfIC8gMiAtIHN0cmVhbXMubGVuZ3RoICogd2lkdGggLyAyLCBpID0gMDtpIDwgc3RyZWFtcy5sZW5ndGg7KytpKSB7CiAgICAgIHZhciBmZWVkID0gdGhpcy5nZXRGZWVkKHN0cmVhbXNbaV0pOwogICAgICB0aGlzLm1vdmVGZWVkKGZlZWQsIG1pZGRsZSArIGkgKiB3aWR0aCArIHNwYWNpbmcgKiB3aWR0aCwgdGhpcy55XyArIHNwYWNpbmcgKiBoZWlnaHQsIHdpZHRoICogc2NhbGUsIGhlaWdodCAqIHNjYWxlLCBvcHRfYW5pbWF0ZSkKICAgIH0KICB9ZWxzZSB7CiAgICBoZWlnaHQgPSB0aGlzLmhlaWdodF8gLyBNYXRoLm1heCh0YWxrLm1lZGlhLmMzZC5TdHJpcFNjZW5lLlVTRVJfRkVFRFNfLCBjb3VudCk7CiAgICB3aWR0aCA9IGhlaWdodCAqIHRhbGsubWVkaWEuYzNkLlN0cmlwU2NlbmUuRkVFRF9BU1BFQ1Q7CiAgICB3aWR0aCA+IHRoaXMud2lkdGhfICYmICh3aWR0aCA9IHRoaXMud2lkdGhfLCBoZWlnaHQgPSB3aWR0aCAvIHRhbGsubWVkaWEuYzNkLlN0cmlwU2NlbmUuRkVFRF9BU1BFQ1QpOwogICAgc3RyZWFtcyA9IHRoaXMuZ2V0U3RyZWFtSWRzKCk7CiAgICBmb3IoaSA9IDA7aSA8IHN0cmVhbXMubGVuZ3RoOysraSkgewogICAgICBmZWVkID0gdGhpcy5nZXRGZWVkKHN0cmVhbXNbaV0pLCB0aGlzLm1vdmVGZWVkKGZlZWQsIHRoaXMueF8gKyBzcGFjaW5nICogd2lkdGgsIHRoaXMueV8gKyBpICogaGVpZ2h0ICsgc3BhY2luZyAqIGhlaWdodCwgd2lkdGggKiBzY2FsZSwgaGVpZ2h0ICogc2NhbGUsIG9wdF9hbmltYXRlKQogICAgfQogIH0KICB0aGlzLnN0cmVhbVZpZXdDaGFuZ2VkKCkKfTsKdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5wcm90b3R5cGUuZ2V0SGVpZ2h0Rm9yV2lkdGggPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyaXBTY2VuZSQkZ2V0SGVpZ2h0Rm9yV2lkdGgkKHdpZHRoKSB7CiAgdmFyIGZlZWRXaWR0aCA9IHdpZHRoIC8gTWF0aC5tYXgodGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5VU0VSX0ZFRURTXywgdGhpcy5nZXRGZWVkQ291bnQoKSk7CiAgcmV0dXJuIGZlZWRXaWR0aCAvIHRhbGsubWVkaWEuYzNkLlN0cmlwU2NlbmUuRkVFRF9BU1BFQ1QKfTsKdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5wcm90b3R5cGUuZ2V0V2lkdGhGb3JIZWlnaHQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyaXBTY2VuZSQkZ2V0V2lkdGhGb3JIZWlnaHQkKGhlaWdodCkgewogIHZhciBmZWVkSGVpZ2h0ID0gaGVpZ2h0IC8gTWF0aC5tYXgodGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5VU0VSX0ZFRURTXywgdGhpcy5nZXRGZWVkQ291bnQoKSk7CiAgcmV0dXJuIGZlZWRIZWlnaHQgKiB0YWxrLm1lZGlhLmMzZC5TdHJpcFNjZW5lLkZFRURfQVNQRUNUCn07CnRhbGsubWVkaWEuYzNkLlN0cmlwU2NlbmUucHJvdG90eXBlLmdldFN0cmVhbUlkcyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTdHJpcFNjZW5lJCRnZXRTdHJlYW1JZHMkKCkgewogIHZhciBpZHMgPSB0YWxrLm1lZGlhLmMzZC5TdHJpcFNjZW5lLnN1cGVyQ2xhc3NfLmdldFN0cmVhbUlkcy5jYWxsKHRoaXMpOwogIHRoaXMub3JkZXJGZWVkc18gJiYgaWRzLnNvcnQoZ29vZy5iaW5kKGZ1bmN0aW9uKGEsIGIpIHsKICAgIHZhciBwYXJ0aWNpcGFudEEgPSB0aGlzLmdldEZlZWQoYSkuZ2V0RW5kcG9pbnQoKS5nZXRQYXJ0aWNpcGFudCgpLCBwYXJ0aWNpcGFudEIgPSB0aGlzLmdldEZlZWQoYikuZ2V0RW5kcG9pbnQoKS5nZXRQYXJ0aWNpcGFudCgpOwogICAgcmV0dXJuIHRhbGsubWVkaWEuYzNkLlN0cmlwU2NlbmUuY29tcGFyZVBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudEEsIHBhcnRpY2lwYW50QikKICB9LCB0aGlzKSk7CiAgcmV0dXJuIGlkcwp9Owp0YWxrLm1lZGlhLmMzZC5TdHJpcFNjZW5lLmNvbXBhcmVQYXJ0aWNpcGFudHMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyaXBTY2VuZSRjb21wYXJlUGFydGljaXBhbnRzJChwYXJ0aWNpcGFudEEsIHBhcnRpY2lwYW50QikgewogIHZhciBuYW1lQSA9IHBhcnRpY2lwYW50QS5nZXROYW1lKCkgfHwgcGFydGljaXBhbnRBLmdldEppZCgpLCBuYW1lQiA9IHBhcnRpY2lwYW50Qi5nZXROYW1lKCkgfHwgcGFydGljaXBhbnRCLmdldEppZCgpLCBuYW1lQSA9IG5hbWVBLnRvTG93ZXJDYXNlKCksIG5hbWVCID0gbmFtZUIudG9Mb3dlckNhc2UoKTsKICByZXR1cm4gbmFtZUEubG9jYWxlQ29tcGFyZShuYW1lQikKfTsKdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5wcm90b3R5cGUubW92ZUZlZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyaXBTY2VuZSQkbW92ZUZlZWQkKGZlZWQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIG9wdF9hbmltYXRlLCBvcHRfZm4pIHsKICBpZih0aGlzLm9yZGVyRmVlZHNfICYmIGZlZWQuZmVlZE9iamVjdCAmJiBvcHRfYW5pbWF0ZSkgewogICAgdmFyIHR3ZWVuID0gbmV3IHRhbGsubWVkaWEuYzNkLkZlZWRBcmVhVHdlZW4oZmVlZCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZS5GRUVEX01PVkVfRFVSQVRJT05fLCB0YWxrLm1lZGlhLmMzZC5lYXNpbmcuU1RST05HX0VBU0VfSU5fT1VULCBvcHRfZm4pOwogICAgdGhpcy50d2VlbnNfLnB1c2godHdlZW4pOwogICAgdGhpcy5vM2RCdW5kbGUuYzNkRW5naW5lLnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sodHdlZW4pCiAgfWVsc2UgewogICAgZmVlZC5zZXRBcmVhKHgsIHksIHdpZHRoLCBoZWlnaHQpCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5TdHJpcFNjZW5lLnByb3RvdHlwZS5jYW5jZWxUd2VlbnMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3RyaXBTY2VuZSQkY2FuY2VsVHdlZW5zJCgpIHsKICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLnR3ZWVuc18ubGVuZ3RoOysraSkgewogICAgdGhpcy5vM2RCdW5kbGUuYzNkRW5naW5lLnVucmVnaXN0ZXJSZW5kZXJDYWxsYmFjayh0aGlzLnR3ZWVuc19baV0pCiAgfQogIHRoaXMudHdlZW5zXyA9IFtdCn07CnRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNwZWFrZXJTdHJpcFNjZW5lJChvcmRlckZlZWRzLCBvcHRfc2NlbmVMYXlvdXRUeXBlLCBvcHRfZmlsbVN0cmlwV2lkdGgsIG9wdF9zdGlja3lTY3JlZW5jYXN0KSB7CiAgdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLmNhbGwodGhpcyk7CiAgdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLmNhbGwodGhpcyk7CiAgdGhpcy5zdHJpcF8gPSBuZXcgdGFsay5tZWRpYS5jM2QuU3RyaXBTY2VuZShvcmRlckZlZWRzKTsKICB0aGlzLnN0cmlwXy5zZXRQYXJlbnRFdmVudFRhcmdldCh0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHRoaXMuc2hvd0RlYnVnT3ZlcmxheXNfID0gdGhpcy5oaWRlTWFpbl8gPSAhMTsKICB0aGlzLnNjZW5lTGF5b3V0VHlwZV8gPSBvcHRfc2NlbmVMYXlvdXRUeXBlIHx8IHRhbGsubWVkaWEuUGxheWVyT3B0aW9ucy5TY2VuZUxheW91dFR5cGUuRkxFWDsKICB0aGlzLmZpbG1TdHJpcFdpZHRoXyA9IG9wdF9maWxtU3RyaXBXaWR0aDsKICB0aGlzLnN0aWNreVNjcmVlbmNhc3RfID0gb3B0X3N0aWNreVNjcmVlbmNhc3QgfHwgITE7CiAgdGhpcy5wcmVzZW50ZXJMaXN0XyA9IFtdCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5jM2QuU3BlYWtlclN0cmlwU2NlbmUsIHRhbGsubWVkaWEuYzNkLlNjZW5lQmFzZSk7CnRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLkV2ZW50ID0ge01BSU5fQ0hBTkdFRDoibWMifTsKdGFsay5tZWRpYS5jM2QuU3BlYWtlclN0cmlwU2NlbmUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5jM2QuU3BlYWtlclN0cmlwU2NlbmUiKTsKdGFsay5tZWRpYS5jM2QuU3BlYWtlclN0cmlwU2NlbmUucHJvdG90eXBlLnNldE8zZEJ1bmRsZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkc2V0TzNkQnVuZGxlJChvM2RCdW5kbGUpIHsKICB0YWxrLm1lZGlhLmMzZC5TcGVha2VyU3RyaXBTY2VuZS5zdXBlckNsYXNzXy5zZXRPM2RCdW5kbGUuY2FsbCh0aGlzLCBvM2RCdW5kbGUpOwogIHRoaXMuc3RyaXBfLnNldE8zZEJ1bmRsZShvM2RCdW5kbGUpCn07CnRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLnByb3RvdHlwZS5hZGRGZWVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNwZWFrZXJTdHJpcFNjZW5lJCRhZGRGZWVkJChlbmRwb2ludCkgewogIHRoaXMubWF5YmVJbml0U3RyaXBTZWxlY3Rpb25fKCk7CiAgbnVsbCAhPSBlbmRwb2ludC5nZXRTdHJlYW1JZCgpICYmICIwIiAhPSBlbmRwb2ludC5nZXRTdHJlYW1JZCgpICYmICh0aGlzLnN0cmlwXy5hZGRGZWVkKGVuZHBvaW50KSwgIXRoaXMubWFpbl8gfHwgdGhpcy5tYWluXy5nZXRFbmRwb2ludCgpLmdldFBhcnRpY2lwYW50KCkuaXNMb2NhbCgpID8gdGhpcy5zZXRDdXJyZW50U3BlYWtlcihlbmRwb2ludC5nZXRTdHJlYW1JZCgpKSA6IHRoaXMuc3RyZWFtVmlld0NoYW5nZWQoKSk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3RlbihlbmRwb2ludCwgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRXZlbnRzLkZSQU1FUkFURV9DSEFOR0VELCB0aGlzLm9uRnJhbWVyYXRlQ2hhbmdlZF8pOwogIHRoaXMuc3RpY2t5U2NyZWVuY2FzdF8gJiYgKHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oZW5kcG9pbnQsIHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkV2ZW50cy5BU1BFQ1RfQ0hBTkdFRCwgdGhpcy5vbkFzcGVjdENoYW5nZWRfKSwgZW5kcG9pbnQuaXNQcm9iYWJseVNjcmVlbmNhc3QoKSAmJiB0aGlzLm1heWJlU2V0TWFpbkZlZWRfKGVuZHBvaW50LmdldFN0cmVhbUlkKCkpKQp9Owp0YWxrLm1lZGlhLmMzZC5TcGVha2VyU3RyaXBTY2VuZS5wcm90b3R5cGUucmVtb3ZlRmVlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkcmVtb3ZlRmVlZCQoc3RyZWFtSWQpIHsKICBnb29nLmFycmF5LmNvbnRhaW5zKHRoaXMucHJlc2VudGVyTGlzdF8sIHN0cmVhbUlkKSAmJiBnb29nLmFycmF5LnJlbW92ZSh0aGlzLnByZXNlbnRlckxpc3RfLCBzdHJlYW1JZCk7CiAgdGhpcy5wcmVzZW50ZXJJZF8gJiYgdGhpcy5wcmVzZW50ZXJJZF8gPT0gc3RyZWFtSWQgJiYgKHRoaXMucHJlc2VudGVySWRfID0gdGhpcy5nZXRQcmV2aW91c1ByZXNlbnRlcl8oKSk7CiAgaWYodGhpcy5zcGVha2VySWRfICYmIHRoaXMuc3BlYWtlcklkXyA9PSBzdHJlYW1JZCkgewogICAgdGhpcy5zcGVha2VySWRfID0gbnVsbDsKICAgIGZvcih2YXIgc3RyZWFtSWRzID0gdGhpcy5zdHJpcF8uZ2V0U3RyZWFtSWRzKCksIGkgPSAwO2kgPCBzdHJlYW1JZHMubGVuZ3RoOysraSkgewogICAgICBpZihzdHJlYW1JZHNbaV0gIT0gc3RyZWFtSWQpIHsKICAgICAgICB2YXIgc3BlYWtlckZlZWQgPSB0aGlzLnN0cmlwXy5nZXRGZWVkKHN0cmVhbUlkc1tpXSk7CiAgICAgICAgdGhpcy5zcGVha2VySWRfID0gc3RyZWFtSWRzW2ldOwogICAgICAgIGlmKCFzcGVha2VyRmVlZC5nZXRFbmRwb2ludCgpLmdldFBhcnRpY2lwYW50KCkuaXNMb2NhbCgpKSB7CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICB2YXIgZXZlbnRzID0gdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRXZlbnRzLCBlbmRwb2ludCA9IHRoaXMuc3RyaXBfLmdldEZlZWQoc3RyZWFtSWQpLmdldEVuZHBvaW50KCk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLnVubGlzdGVuKGVuZHBvaW50LCBldmVudHMuRlJBTUVSQVRFX0NIQU5HRUQpOwogIHRoaXMuc3RpY2t5U2NyZWVuY2FzdF8gJiYgdGhpcy5ldmVudEhhbmRsZXJfLnVubGlzdGVuKGVuZHBvaW50LCBldmVudHMuQVNQRUNUX0NIQU5HRUQpOwogIHRoaXMuc3RyaXBTZWxlY3Rpb25fLnJlbW92ZUZlZWQoc3RyZWFtSWQpOwogIHRoaXMuc3RyaXBfLnJlbW92ZUZlZWQoc3RyZWFtSWQpOwogIHRoaXMubWFpbl8gJiYgdGhpcy5tYWluXy5nZXRFbmRwb2ludCgpLmdldFN0cmVhbUlkKCkgPT0gc3RyZWFtSWQgJiYgKHRoaXMubWFpbl8uZGlzcG9zZSgpLCB0aGlzLm1haW5fID0gbnVsbCwgdGhpcy5wcmVzZW50ZXJJZF8gPyB0aGlzLnNldE1haW5GZWVkXyh0aGlzLnN0cmlwXy5nZXRGZWVkKHRoaXMucHJlc2VudGVySWRfKSkgOiB0aGlzLnNwZWFrZXJJZF8gJiYgdGhpcy5zZXRNYWluRmVlZF8odGhpcy5zdHJpcF8uZ2V0RmVlZCh0aGlzLnNwZWFrZXJJZF8pKSk7CiAgdGhpcy5zdHJlYW1WaWV3Q2hhbmdlZCgpCn07CnRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLnByb3RvdHlwZS5oYXNGZWVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNwZWFrZXJTdHJpcFNjZW5lJCRoYXNGZWVkJChzdHJlYW1JZCkgewogIHJldHVybiB0aGlzLnN0cmlwXy5oYXNGZWVkKHN0cmVhbUlkKQp9Owp0YWxrLm1lZGlhLmMzZC5TcGVha2VyU3RyaXBTY2VuZS5wcm90b3R5cGUuZ2V0RmVlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkZ2V0RmVlZCQoc3RyZWFtSWQpIHsKICByZXR1cm4gdGhpcy5zdHJpcF8uZ2V0RmVlZChzdHJlYW1JZCkKfTsKdGFsay5tZWRpYS5jM2QuU3BlYWtlclN0cmlwU2NlbmUucHJvdG90eXBlLmNyZWF0ZUZlZWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3BlYWtlclN0cmlwU2NlbmUkJGNyZWF0ZUZlZWQkKCkgewogIHRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLmxvZ2dlcl8uc2V2ZXJlKCJVbmV4cGVjdGVkIGNhbGwgdG8gY3JlYXRlRmVlZC4iKTsKICByZXR1cm4gbnVsbAp9Owp0YWxrLm1lZGlhLmMzZC5TcGVha2VyU3RyaXBTY2VuZS5wcm90b3R5cGUuc2V0QXJlYSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkc2V0QXJlYSQoeCwgeSwgd2lkdGgsIGhlaWdodCkgewogIHRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLnN1cGVyQ2xhc3NfLnNldEFyZWEuY2FsbCh0aGlzLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKICB0aGlzLnN0cmVhbVZpZXdDaGFuZ2VkKCkKfTsKdGFsay5tZWRpYS5jM2QuU3BlYWtlclN0cmlwU2NlbmUucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkdXBkYXRlUG9zaXRpb25zJCgpIHsKICB0aGlzLmhpZGVNYWluXyA/ICh0aGlzLnN0cmlwXy5zZXRBcmVhKHRoaXMueF8sIHRoaXMueV8sIHRoaXMud2lkdGhfLCB0aGlzLmhlaWdodF8pLCB0aGlzLm1haW5XaWR0aF8gPSAwLCB0aGlzLm1haW5IZWlnaHRfID0gdGhpcy5oZWlnaHRfKSA6IHRoaXMuc2NlbmVMYXlvdXRUeXBlXyA9PSB0YWxrLm1lZGlhLlBsYXllck9wdGlvbnMuU2NlbmVMYXlvdXRUeXBlLkxFVFRFUiA/IHRoaXMuc2V0TGV0dGVyTGF5b3V0XygpIDogdGhpcy5zY2VuZUxheW91dFR5cGVfID09IHRhbGsubWVkaWEuUGxheWVyT3B0aW9ucy5TY2VuZUxheW91dFR5cGUuUElMTEFSID8gdGhpcy5zZXRQaWxsYXJMYXlvdXRfKCkgOiB0aGlzLndpZHRoXyAvIHRoaXMuaGVpZ2h0XyA8PSB0YWxrLm1lZGlhLmMzZC5TdHJpcFNjZW5lLkZFRURfQVNQRUNUID8gdGhpcy5zZXRMZXR0ZXJMYXlvdXRfKCkgOiB0aGlzLnNldFBpbGxhckxheW91dF8oKTsKICB0aGlzLm1haW5fICYmIHRoaXMubWFpbl8uc2V0QXJlYSh0aGlzLnhfLCB0aGlzLnlfLCB0aGlzLm1haW5XaWR0aF8sIHRoaXMubWFpbkhlaWdodF8pCn07CnRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLnByb3RvdHlwZS5zZXRMZXR0ZXJMYXlvdXRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNwZWFrZXJTdHJpcFNjZW5lJCRzZXRMZXR0ZXJMYXlvdXRfJCgpIHsKICB2YXIgc3RyaXBIZWlnaHQgPSBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmZpbG1TdHJpcFdpZHRoXykgPyB0aGlzLmZpbG1TdHJpcFdpZHRoXyA6IHRoaXMuc3RyaXBfLmdldEhlaWdodEZvcldpZHRoKHRoaXMud2lkdGhfKTsKICB0aGlzLnN0cmlwXy5zZXRBcmVhKHRoaXMueF8sIHRoaXMueV8gKyB0aGlzLmhlaWdodF8gLSBzdHJpcEhlaWdodCwgdGhpcy53aWR0aF8sIHN0cmlwSGVpZ2h0KTsKICB0aGlzLm1haW5XaWR0aF8gPSB0aGlzLndpZHRoXzsKICB0aGlzLm1haW5IZWlnaHRfID0gdGhpcy5oZWlnaHRfIC0gc3RyaXBIZWlnaHQKfTsKdGFsay5tZWRpYS5jM2QuU3BlYWtlclN0cmlwU2NlbmUucHJvdG90eXBlLnNldFBpbGxhckxheW91dF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3BlYWtlclN0cmlwU2NlbmUkJHNldFBpbGxhckxheW91dF8kKCkgewogIHZhciBzdHJpcFdpZHRoID0gZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5maWxtU3RyaXBXaWR0aF8pID8gdGhpcy5maWxtU3RyaXBXaWR0aF8gOiB0aGlzLnN0cmlwXy5nZXRXaWR0aEZvckhlaWdodCh0aGlzLmhlaWdodF8pOwogIHRoaXMuc3RyaXBfLnNldEFyZWEodGhpcy54XyArIHRoaXMud2lkdGhfIC0gc3RyaXBXaWR0aCwgdGhpcy55Xywgc3RyaXBXaWR0aCwgdGhpcy5oZWlnaHRfKTsKICB0aGlzLm1haW5XaWR0aF8gPSB0aGlzLndpZHRoXyAtIHN0cmlwV2lkdGg7CiAgdGhpcy5tYWluSGVpZ2h0XyA9IHRoaXMuaGVpZ2h0Xwp9Owp0YWxrLm1lZGlhLmMzZC5TcGVha2VyU3RyaXBTY2VuZS5wcm90b3R5cGUuc2V0Q3VycmVudFNwZWFrZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3BlYWtlclN0cmlwU2NlbmUkJHNldEN1cnJlbnRTcGVha2VyJChzdHJlYW1JZCkgewogIHRoaXMuc3BlYWtlcklkXyA9IHN0cmVhbUlkOwogIHRoaXMubWF5YmVTZXRNYWluRmVlZF8oc3RyZWFtSWQpCn07CnRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLnByb3RvdHlwZS5nZXRQcmV2aW91c1ByZXNlbnRlcl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3BlYWtlclN0cmlwU2NlbmUkJGdldFByZXZpb3VzUHJlc2VudGVyXyQoKSB7CiAgdmFyIHByZXZpb3VzUHJlc2VudGVyID0gbnVsbDsKICAwIDwgdGhpcy5wcmVzZW50ZXJMaXN0Xy5sZW5ndGggJiYgKHByZXZpb3VzUHJlc2VudGVyID0gdGhpcy5wcmVzZW50ZXJMaXN0X1t0aGlzLnByZXNlbnRlckxpc3RfLmxlbmd0aCAtIDFdKTsKICByZXR1cm4gcHJldmlvdXNQcmVzZW50ZXIKfTsKdGFsay5tZWRpYS5jM2QuU3BlYWtlclN0cmlwU2NlbmUucHJvdG90eXBlLm1heWJlU2V0TWFpbkZlZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNwZWFrZXJTdHJpcFNjZW5lJCRtYXliZVNldE1haW5GZWVkXyQoc3RyZWFtSWQpIHsKICB2YXIgZmVlZCA9IHRoaXMuc3RyaXBfLmdldEZlZWQoc3RyZWFtSWQpOwogIGZlZWQgJiYgdGhpcy5jaGVja1Nob3dGZWVkXyhmZWVkKSAmJiB0aGlzLnNldE1haW5GZWVkXyhmZWVkKQp9Owp0YWxrLm1lZGlhLmMzZC5TcGVha2VyU3RyaXBTY2VuZS5wcm90b3R5cGUuc2V0TWFpbkZlZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkYzNkJFNwZWFrZXJTdHJpcFNjZW5lJCRzZXRNYWluRmVlZF8kKGZlZWQpIHsKICB2YXIgcHJldmlvdXNGZWVkID0gdGhpcy5tYWluXywgZW5kcG9pbnQgPSBmZWVkLmdldEVuZHBvaW50KCk7CiAgcHJldmlvdXNGZWVkICYmIHByZXZpb3VzRmVlZC5nZXRFbmRwb2ludCgpLmdldFN0cmVhbUlkKCkgPT0gZW5kcG9pbnQuZ2V0U3RyZWFtSWQoKSB8fCAodGhpcy5tYWluXyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5GaXhlZEFyZWFGZWVkKHRoaXMubzNkQnVuZGxlLCBlbmRwb2ludCwgMCwgdGhpcy54XywgdGhpcy55XywgdGhpcy5tYWluV2lkdGhfLCB0aGlzLm1haW5IZWlnaHRfLCAhMSksIHByZXZpb3VzRmVlZCAmJiBwcmV2aW91c0ZlZWQuZGlzcG9zZSgpLCB0aGlzLnN0cmVhbVZpZXdDaGFuZ2VkKCkpCn07CnRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLnByb3RvdHlwZS5zdHJlYW1WaWV3Q2hhbmdlZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkc3RyZWFtVmlld0NoYW5nZWQkKCkgewogIGZvcih2YXIgdmlld3MgPSBbXSwgc3RyZWFtSWRzID0gdGhpcy5zdHJpcF8uZ2V0U3RyZWFtSWRzKCksIGkgPSAwO2kgPCBzdHJlYW1JZHMubGVuZ3RoOysraSkgewogICAgdmFyIGZlZWQgPSB0aGlzLnN0cmlwXy5nZXRGZWVkKHN0cmVhbUlkc1tpXSk7CiAgICB2aWV3cy5wdXNoKFtzdHJlYW1JZHNbaV0sIGZlZWQuZ2V0V2lkdGgoKSwgZmVlZC5nZXRIZWlnaHQoKV0pCiAgfQogIHRoaXMubWFpbl8gJiYgdmlld3MucHVzaChbdGhpcy5tYWluXy5nZXRFbmRwb2ludCgpLmdldFN0cmVhbUlkKCksIHRoaXMubWFpbl8uZ2V0V2lkdGgoKSwgdGhpcy5tYWluXy5nZXRIZWlnaHQoKV0pOwogIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5jM2QuU2NlbmVCYXNlLlNjZW5lQ2hhbmdlZEV2ZW50KHZpZXdzLCB0aGlzKSkKfTsKdGFsay5tZWRpYS5jM2QuU3BlYWtlclN0cmlwU2NlbmUucHJvdG90eXBlLm1heWJlSW5pdFN0cmlwU2VsZWN0aW9uXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkbWF5YmVJbml0U3RyaXBTZWxlY3Rpb25fJCgpIHsKICBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLnN0cmlwU2VsZWN0aW9uXykgfHwgKHRoaXMuc3RyaXBTZWxlY3Rpb25fID0gbmV3IHRhbGsubWVkaWEuYzNkLlNjZW5lU2VsZWN0aW9uKHRoaXMubzNkQnVuZGxlLCB0aGlzLnN0cmlwXyksIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5zdHJpcFNlbGVjdGlvbl8sIHRhbGsubWVkaWEuYzNkLlNjZW5lU2VsZWN0aW9uLkV2ZW50LkNIQU5HRUQsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkXykpCn07CnRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLnByb3RvdHlwZS5jaGVja1Nob3dGZWVkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkY2hlY2tTaG93RmVlZF8kKGZlZWQpIHsKICBpZih0aGlzLnN0cmlwU2VsZWN0aW9uXyAmJiB0aGlzLm1haW5fKSB7CiAgICBpZih0aGlzLnN0cmlwU2VsZWN0aW9uXy5oYXNTZWxlY3Rpb24oKSkgewogICAgICByZXR1cm4hMQogICAgfQogICAgdmFyIGVuZHBvaW50ID0gdGhpcy5tYWluXy5nZXRFbmRwb2ludCgpOwogICAgaWYodGhpcy5zdGlja3lTY3JlZW5jYXN0XykgewogICAgICB2YXIgbmV3RW5kcG9pbnQgPSBmZWVkLmdldEVuZHBvaW50KCk7CiAgICAgIHJldHVybiBuZXdFbmRwb2ludC5pc1Byb2JhYmx5U2NyZWVuY2FzdCgpIHx8ICFlbmRwb2ludC5pc1Byb2JhYmx5U2NyZWVuY2FzdCgpCiAgICB9CiAgICByZXR1cm4gdGhpcy5wcmVzZW50ZXJJZF8gIT0gZW5kcG9pbnQuZ2V0U3RyZWFtSWQoKQogIH0KICByZXR1cm4hMAp9Owp0YWxrLm1lZGlhLmMzZC5TcGVha2VyU3RyaXBTY2VuZS5wcm90b3R5cGUub25TZWxlY3Rpb25DaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkb25TZWxlY3Rpb25DaGFuZ2VkXyQoZSkgewogIGUuZmVlZCA/ICh0aGlzLnNldE1haW5GZWVkXyhlLmZlZWQpLCB0aGlzLmRpc3BhdGNoRXZlbnQoZSkpIDogdGhpcy5wcmVzZW50ZXJJZF8gPyB0aGlzLnNldE1haW5GZWVkXyh0aGlzLnN0cmlwXy5nZXRGZWVkKHRoaXMucHJlc2VudGVySWRfKSkgOiB0aGlzLnNwZWFrZXJJZF8gJiYgdGhpcy5zZXRNYWluRmVlZF8odGhpcy5zdHJpcF8uZ2V0RmVlZCh0aGlzLnNwZWFrZXJJZF8pKQp9Owp0YWxrLm1lZGlhLmMzZC5TcGVha2VyU3RyaXBTY2VuZS5wcm90b3R5cGUub25GcmFtZXJhdGVDaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkb25GcmFtZXJhdGVDaGFuZ2VkXyQoZSkgewogIGlmKHRoaXMuc2hvd0RlYnVnT3ZlcmxheXNfKSB7CiAgICB2YXIgZmVlZCA9IHRoaXMuZ2V0RmVlZChlLmVuZHBvaW50LmdldFN0cmVhbUlkKCkpOwogICAgZmVlZCAmJiAoZmVlZC5zZXRBdXRvSGlkZUxhYmVsKCExKSwgZmVlZC5zZXRMYWJlbFRleHQoZS5yZW5kZXJDb3VudCArICIgZnBzIiksIGZlZWQuc2hvd0xhYmVsKCkpCiAgfQp9Owp0YWxrLm1lZGlhLmMzZC5TcGVha2VyU3RyaXBTY2VuZS5wcm90b3R5cGUub25Bc3BlY3RDaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJGMzZCRTcGVha2VyU3RyaXBTY2VuZSQkb25Bc3BlY3RDaGFuZ2VkXyQoZSkgewogIGUuZW5kcG9pbnQuaXNQcm9iYWJseVNjcmVlbmNhc3QoKSA/IHRoaXMubWF5YmVTZXRNYWluRmVlZF8oZS5lbmRwb2ludC5nZXRTdHJlYW1JZCgpKSA6IHRoaXMubWFpbl8gJiYgdGhpcy5tYWluXy5nZXRFbmRwb2ludCgpID09IGUuZW5kcG9pbnQgJiYgdGhpcy5tYXliZVNldE1haW5GZWVkXyh0aGlzLnNwZWFrZXJJZF8pCn07CnRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLnByb3RvdHlwZS5kaXNwb3NlQWxsRmVlZHMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3BlYWtlclN0cmlwU2NlbmUkJGRpc3Bvc2VBbGxGZWVkcyQoKSB7CiAgdGhpcy5zdHJpcF8gJiYgdGhpcy5zdHJpcF8uZGlzcG9zZUFsbEZlZWRzKCk7CiAgdGhpcy5tYWluXyAmJiAodGhpcy5tYWluXy5kaXNwb3NlKCksIHRoaXMubWFpbl8gPSBudWxsKTsKICB0aGlzLnNwZWFrZXJJZF8gPSBudWxsCn07CnRhbGsubWVkaWEuYzNkLlNwZWFrZXJTdHJpcFNjZW5lLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRjM2QkU3BlYWtlclN0cmlwU2NlbmUkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGFsay5tZWRpYS5jM2QuU3BlYWtlclN0cmlwU2NlbmUuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmRpc3Bvc2UoKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBudWxsOwogIHRoaXMuc3RyaXBNb3VzZUhhbmRsZXJfICYmICh0aGlzLnN0cmlwTW91c2VIYW5kbGVyXy5kaXNwb3NlKCksIHRoaXMuc3RyaXBNb3VzZUhhbmRsZXJfID0gbnVsbCk7CiAgdGhpcy5zdHJpcF8uZGlzcG9zZSgpOwogIHRoaXMuc3RyaXBfID0gbnVsbDsKICB0aGlzLmRpc3Bvc2VBbGxGZWVkcygpCn07CnRhbGsubWVkaWEuQzNkTXV0ZUhhbmRsZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RNdXRlSGFuZGxlciQob3B0X2VuYWJsZWQpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKTsKICB0aGlzLmJvdW5kT25SZXNpemVfID0gZ29vZy5iaW5kKHRoaXMub25SZXNpemUsIHRoaXMpOwogIHRoaXMuZW5hYmxlZF8gPSAhMSAhPT0gb3B0X2VuYWJsZWQKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLCBnb29nLkRpc3Bvc2FibGUpOwp0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLkZBREVfT1VUX0RFTEFZX01TXyA9IDJFMzsKdGFsay5tZWRpYS5DM2RNdXRlSGFuZGxlci5wcm90b3R5cGUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5DM2RNdXRlSGFuZGxlciIpOwp0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLnByb3RvdHlwZS5jM2RBdmFpbGFibGVfID0gITE7CnRhbGsubWVkaWEuQzNkTXV0ZUhhbmRsZXIucHJvdG90eXBlLmNhbGxNYW5hZ2VyXyA9IG51bGw7CnRhbGsubWVkaWEuQzNkTXV0ZUhhbmRsZXIucHJvdG90eXBlLndpZHRoXyA9IDA7CnRhbGsubWVkaWEuQzNkTXV0ZUhhbmRsZXIucHJvdG90eXBlLmhlaWdodF8gPSAwOwp0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTXV0ZUhhbmRsZXIkJGluaXQkKGNhbGxNYW5hZ2VyLCBjM2RFbmdpbmUsIGMzZE9iamVjdCwgaW1hZ2VPdmVybGF5KSB7CiAgdGhpcy5jM2RBdmFpbGFibGVfID8gdGhpcy5sb2dnZXJfLndhcm5pbmcoIkFscmVhZHkgaW5pdGlhbGl6ZWQsIHRoaXMgaXMgcHJvYmFibHkgdW5pbnRlbmRlZC4iKSA6ICh0aGlzLmMzZEF2YWlsYWJsZV8gPSAhMCwgdGhpcy5jYWxsTWFuYWdlcl8gPSBjYWxsTWFuYWdlciwgdGhpcy5jM2RFbmdpbmVfID0gYzNkRW5naW5lLCB0aGlzLmMzZE9iamVjdF8gPSBjM2RPYmplY3QsIHRoaXMud2lkdGhfID0gdGhpcy5jM2RPYmplY3RfLmdldFdpZHRoKCksIHRoaXMuaGVpZ2h0XyA9IHRoaXMuYzNkT2JqZWN0Xy5nZXRIZWlnaHQoKSwgdGhpcy5hZGRNdXRlSW5kaWNhdG9yXyhpbWFnZU92ZXJsYXkpLCB0aGlzLmxvZ2dlcl8uZmluZSgiQWRkaW5nIHJlc2l6ZSBsaXN0ZW5lci4iKSwgdGFsay5tZWRpYS5jM2QuYWRkRXZlbnRDYWxsYmFjayh0aGlzLmMzZE9iamVjdF8uZ2V0UGx1Z2luKCksICJyZXNpemUiLCB0aGlzLmJvdW5kT25SZXNpemVfKSwgdGhpcy5pbml0SW50ZXJuYWwodGhpcy5lbmFibGVkXykpCn07CnRhbGsubWVkaWEuQzNkTXV0ZUhhbmRsZXIucHJvdG90eXBlLmRpc3Bvc2VDM2QgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RNdXRlSGFuZGxlciQkZGlzcG9zZUMzZCQoKSB7CiAgdGhpcy5jM2RBdmFpbGFibGVfICYmICh0aGlzLmMzZE9iamVjdF8uaXNTY3JpcHRhYmxlKCkgJiYgKHRoaXMubG9nZ2VyXy5maW5lKCJSZW1vdmluZyBDM0QgcmVzaXplIGxpc3RlbmVyLiIpLCB0YWxrLm1lZGlhLmMzZC5yZW1vdmVFdmVudENhbGxiYWNrKHRoaXMuYzNkT2JqZWN0Xy5nZXRQbHVnaW4oKSwgInJlc2l6ZSIsIHRoaXMuYm91bmRPblJlc2l6ZV8pKSwgdGhpcy5oaWRlTXV0ZUluZGljYXRpb25fKCksIHRoaXMubXV0ZWRJbWdfICYmICh0aGlzLm11dGVkSW1nXy5kaXNwb3NlKCksIHRoaXMubXV0ZWRJbWdfID0gbnVsbCksIHRoaXMudW5tdXRlZEltZ18gJiYgKHRoaXMudW5tdXRlZEltZ18uZGlzcG9zZSgpLCB0aGlzLnVubXV0ZWRJbWdfID0gbnVsbCksIHRoaXMuYzNkQXZhaWxhYmxlXyA9ICExKQp9Owp0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLnByb3RvdHlwZS5pbml0SW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RNdXRlSGFuZGxlciQkaW5pdEludGVybmFsJChlbmFibGUpIHsKICB0aGlzLmVuYWJsZWRfID0gZW5hYmxlOwogIHRoaXMuc2hvd09ySGlkZU11dGVJbmRpY2F0aW9uXygpCn07CnRhbGsubWVkaWEuQzNkTXV0ZUhhbmRsZXIucHJvdG90eXBlLm9uUmVzaXplID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTXV0ZUhhbmRsZXIkJG9uUmVzaXplJChlKSB7CiAgdGhpcy53aWR0aF8gPSBlLndpZHRoOwogIHRoaXMuaGVpZ2h0XyA9IGUuaGVpZ2h0OwogIHRoaXMubXV0ZWRJbWdfICYmIHRoaXMubXV0ZWRJbWdfLm1vdmVJbWFnZVdpdGhFZGdlV3JhcHBpbmcoLTIsIDIsIHRoaXMud2lkdGhfLCB0aGlzLmhlaWdodF8pOwogIHRoaXMudW5tdXRlZEltZ18gJiYgdGhpcy51bm11dGVkSW1nXy5tb3ZlSW1hZ2VXaXRoRWRnZVdyYXBwaW5nKC0yLCAyLCB0aGlzLndpZHRoXywgdGhpcy5oZWlnaHRfKQp9Owp0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLnByb3RvdHlwZS5nZXRDYWxsTWFuYWdlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZE11dGVIYW5kbGVyJCRnZXRDYWxsTWFuYWdlciQoKSB7CiAgcmV0dXJuIHRoaXMuY2FsbE1hbmFnZXJfCn07CnRhbGsubWVkaWEuQzNkTXV0ZUhhbmRsZXIucHJvdG90eXBlLmFkZE11dGVJbmRpY2F0b3JfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTXV0ZUhhbmRsZXIkJGFkZE11dGVJbmRpY2F0b3JfJChpbWFnZU92ZXJsYXkpIHsKICB0aGlzLm11dGVkSW1nXyA9IGltYWdlT3ZlcmxheS5jcmVhdGVJbWFnZSgwLCAwLCAiaW1hZ2VzL21pY19mdWxsc2NyZWVuX211dGVkLnBuZyIsIGdvb2cuYmluZChmdW5jdGlvbigpIHsKICAgIHRoaXMuaW1hZ2VMb2FkZWRfKHRoaXMubXV0ZWRJbWdfLCAtMiwgMikKICB9LCB0aGlzKSk7CiAgdGhpcy51bm11dGVkSW1nXyA9IGltYWdlT3ZlcmxheS5jcmVhdGVJbWFnZSgwLCAwLCAiaW1hZ2VzL21pY19mdWxsc2NyZWVuLnBuZyIsIGdvb2cuYmluZChmdW5jdGlvbigpIHsKICAgIHRoaXMuaW1hZ2VMb2FkZWRfKHRoaXMudW5tdXRlZEltZ18sIC0yLCAyKQogIH0sIHRoaXMpKTsKICB0aGlzLmhpZGVNdXRlSW5kaWNhdGlvbl8oKQp9Owp0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLnByb3RvdHlwZS5zaG93TXV0ZUluZGljYXRpb25fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTXV0ZUhhbmRsZXIkJHNob3dNdXRlSW5kaWNhdGlvbl8kKG11dGVkKSB7CiAgdGhpcy5jM2RBdmFpbGFibGVfICYmIChtdXRlZCA/ICh0aGlzLmZpbmlzaFVubXV0ZWRJbWdGYWRpbmdfKCksIHRoaXMubXV0ZWRJbWdfLnNldFZpc2libGUoITApKSA6ICh0aGlzLnVubXV0ZWRJbWdGYWRlcklkXyA9IGdvb2cuVGltZXIuY2FsbE9uY2UodGhpcy5mYWRlT3V0VW5tdXRlZEltZ18sIHRhbGsubWVkaWEuQzNkTXV0ZUhhbmRsZXIuRkFERV9PVVRfREVMQVlfTVNfLCB0aGlzKSwgdGhpcy5tdXRlZEltZ18uc2V0VmlzaWJsZSghMSksIHRoaXMudW5tdXRlZEltZ18uc2V0VmlzaWJsZSghMCksIHRoaXMudW5tdXRlZEltZ18uc2V0QWxwaGEoMSkpKQp9Owp0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLnByb3RvdHlwZS5oaWRlTXV0ZUluZGljYXRpb25fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTXV0ZUhhbmRsZXIkJGhpZGVNdXRlSW5kaWNhdGlvbl8kKCkgewogIHRoaXMuYzNkQXZhaWxhYmxlXyAmJiAodGhpcy5maW5pc2hVbm11dGVkSW1nRmFkaW5nXygpLCB0aGlzLm11dGVkSW1nXy5zZXRWaXNpYmxlKCExKSkKfTsKdGFsay5tZWRpYS5DM2RNdXRlSGFuZGxlci5wcm90b3R5cGUuZmFkZU91dFVubXV0ZWRJbWdfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTXV0ZUhhbmRsZXIkJGZhZGVPdXRVbm11dGVkSW1nXyQoKSB7CiAgdGhpcy51bm11dGVkSW1nRmFkZXJJZF8gPSBudWxsOwogIHRoaXMudW5tdXRlZEltZ0ZhZGVyXyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5BbHBoYVR3ZWVuKHRoaXMudW5tdXRlZEltZ18uZ2V0U2NlbmVPYmplY3QoKSwgdGhpcy51bm11dGVkSW1nXy5nZXRBbHBoYSgpLCAwLCAxLCB0YWxrLm1lZGlhLmMzZC5lYXNpbmcuUkVHVUxBUl9FQVNFX0lOLCBnb29nLmJpbmQodGhpcy5maW5pc2hVbm11dGVkSW1nRmFkaW5nXywgdGhpcykpOwogIHRoaXMuYzNkRW5naW5lXy5yZWdpc3RlclJlbmRlckNhbGxiYWNrKHRoaXMudW5tdXRlZEltZ0ZhZGVyXykKfTsKdGFsay5tZWRpYS5DM2RNdXRlSGFuZGxlci5wcm90b3R5cGUuZmluaXNoVW5tdXRlZEltZ0ZhZGluZ18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RNdXRlSGFuZGxlciQkZmluaXNoVW5tdXRlZEltZ0ZhZGluZ18kKCkgewogIHRoaXMudW5tdXRlZEltZ0ZhZGVySWRfICYmIChnb29nLlRpbWVyLmNsZWFyKHRoaXMudW5tdXRlZEltZ0ZhZGVySWRfKSwgdGhpcy51bm11dGVkSW1nRmFkZXJJZF8gPSBudWxsKTsKICB0aGlzLnVubXV0ZWRJbWdGYWRlcl8gJiYgKHRoaXMuYzNkRW5naW5lXy51bnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sodGhpcy51bm11dGVkSW1nRmFkZXJfKSwgdGhpcy51bm11dGVkSW1nRmFkZXJfID0gbnVsbCk7CiAgdGhpcy51bm11dGVkSW1nXy5zZXRWaXNpYmxlKCExKQp9Owp0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLnByb3RvdHlwZS5pbWFnZUxvYWRlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RNdXRlSGFuZGxlciQkaW1hZ2VMb2FkZWRfJChpbWFnZSwgeCwgeSkgewogIGltYWdlLm1vdmVJbWFnZVdpdGhFZGdlV3JhcHBpbmcoeCwgeSwgdGhpcy53aWR0aF8sIHRoaXMuaGVpZ2h0XykKfTsKdGFsay5tZWRpYS5DM2RNdXRlSGFuZGxlci5wcm90b3R5cGUuaGFuZGxlTWljTXV0ZU5vdGlmaWNhdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZE11dGVIYW5kbGVyJCRoYW5kbGVNaWNNdXRlTm90aWZpY2F0aW9uJChlKSB7CiAgdGhpcy5lbmFibGVkXyA/IHRoaXMuc2hvd011dGVJbmRpY2F0aW9uXyhlLm11dGVkKSA6IHRoaXMubG9nZ2VyXy5maW5lKCJJZ25vcmluZyBtaWMgbXV0ZSBub3RpZmljYXRpb24gLSBkaXNhYmxlZC4iKQp9Owp0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLnByb3RvdHlwZS5zZXRFbmFibGVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTXV0ZUhhbmRsZXIkJHNldEVuYWJsZWQkKGVuYWJsZWQpIHsKICB0aGlzLmVuYWJsZWRfICE9IGVuYWJsZWQgJiYgKHRoaXMuZW5hYmxlZF8gPSBlbmFibGVkLCB0aGlzLnNob3dPckhpZGVNdXRlSW5kaWNhdGlvbl8oKSkKfTsKdGFsay5tZWRpYS5DM2RNdXRlSGFuZGxlci5wcm90b3R5cGUuc2hvd09ySGlkZU11dGVJbmRpY2F0aW9uXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZE11dGVIYW5kbGVyJCRzaG93T3JIaWRlTXV0ZUluZGljYXRpb25fJCgpIHsKICB0aGlzLmVuYWJsZWRfID8gdGhpcy5zaG93TXV0ZUluZGljYXRpb25fKHRoaXMuY2FsbE1hbmFnZXJfLmdldE1pY3JvcGhvbmVNdXRlKCkpIDogdGhpcy5oaWRlTXV0ZUluZGljYXRpb25fKCkKfTsKdGFsay5tZWRpYS5DM2RNdXRlSGFuZGxlci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTXV0ZUhhbmRsZXIkJGlzRW5hYmxlZCQoKSB7CiAgcmV0dXJuIHRoaXMuZW5hYmxlZF8KfTsKdGFsay5tZWRpYS5DM2RNdXRlSGFuZGxlci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTXV0ZUhhbmRsZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGhpcy5kaXNwb3NlQzNkKCk7CiAgdGFsay5tZWRpYS5DM2RNdXRlSGFuZGxlci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLkMzZE5vdGlmaWVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTm90aWZpZXIkKGNhbGxNYW5hZ2VyLCBwYWNrLCBjM2RFbmdpbmUsIGMzZE9iamVjdCwgaW1hZ2VPdmVybGF5LCBub3RpZlJlbmRlcmVyKSB7CiAgdGhpcy5wYWNrXyA9IHBhY2s7CiAgdGhpcy5jYWxsTWFuYWdlcl8gPSBjYWxsTWFuYWdlcjsKICB0aGlzLmMzZEVuZ2luZV8gPSBjM2RFbmdpbmU7CiAgdGhpcy5jM2RPYmplY3RfID0gYzNkT2JqZWN0OwogIHRoaXMuaW1hZ2VPdmVybGF5XyA9IGltYWdlT3ZlcmxheTsKICB0aGlzLm5vdGlmUmVuZGVyZXJfID0gbm90aWZSZW5kZXJlcjsKICB0aGlzLndpZHRoXyA9IHRoaXMuYzNkT2JqZWN0Xy5nZXRXaWR0aCgpOwogIHRoaXMuaGVpZ2h0XyA9IHRoaXMuYzNkT2JqZWN0Xy5nZXRIZWlnaHQoKTsKICB0aGlzLmxvZ2dlcl8uZmluZSgiQWRkaW5nIHJlc2l6ZSBsaXN0ZW5lci4iKTsKICB0aGlzLm5vdGlmaWNhdGlvbnNfID0gW107CiAgdGhpcy5ib3VuZE9uUmVzaXplXyA9IGdvb2cuYmluZCh0aGlzLm9uUmVzaXplLCB0aGlzKTsKICB0YWxrLm1lZGlhLmMzZC5hZGRFdmVudENhbGxiYWNrKHRoaXMuYzNkT2JqZWN0Xy5nZXRQbHVnaW4oKSwgInJlc2l6ZSIsIHRoaXMuYm91bmRPblJlc2l6ZV8pCn07CnRhbGsubWVkaWEuQzNkTm90aWZpZXIuTm90aWZpY2F0aW9uXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZE5vdGlmaWVyJE5vdGlmaWNhdGlvbl8kKCkgewp9Owp0YWxrLm1lZGlhLkMzZE5vdGlmaWVyLkZBREVfT1VUX0RFTEFZX01TXyA9IDJFMzsKdGFsay5tZWRpYS5DM2ROb3RpZmllci5wcm90b3R5cGUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5DM2ROb3RpZmllciIpOwp0YWxrLm1lZGlhLkMzZE5vdGlmaWVyLnByb3RvdHlwZS53aWR0aF8gPSAwOwp0YWxrLm1lZGlhLkMzZE5vdGlmaWVyLnByb3RvdHlwZS5oZWlnaHRfID0gMDsKdGFsay5tZWRpYS5DM2ROb3RpZmllci5wcm90b3R5cGUubm90aWZSZW5kZXJlcl8gPSBudWxsOwp0YWxrLm1lZGlhLkMzZE5vdGlmaWVyLnByb3RvdHlwZS5kaXNwb3NlQzNkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTm90aWZpZXIkJGRpc3Bvc2VDM2QkKCkgewogIGlmKHRoaXMuYzNkRW5naW5lXykgewogICAgdGhpcy5jM2RPYmplY3RfLmlzU2NyaXB0YWJsZSgpICYmICh0aGlzLmxvZ2dlcl8uZmluZSgiUmVtb3ZpbmcgQzNEIHJlc2l6ZSBsaXN0ZW5lci4iKSwgdGFsay5tZWRpYS5jM2QucmVtb3ZlRXZlbnRDYWxsYmFjayh0aGlzLmMzZE9iamVjdF8uZ2V0UGx1Z2luKCksICJyZXNpemUiLCB0aGlzLmJvdW5kT25SZXNpemVfKSk7CiAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLm5vdGlmaWNhdGlvbnNfLmxlbmd0aDsrK2kpIHsKICAgICAgdGhpcy5ub3RpZmljYXRpb25zX1tpXS5pbWcgPSBudWxsLCB0aGlzLm5vdGlmaWNhdGlvbnNfW2ldLmltZ0ZhZGVyICYmICh0aGlzLmMzZEVuZ2luZV8udW5yZWdpc3RlclJlbmRlckNhbGxiYWNrKHRoaXMubm90aWZpY2F0aW9uc19baV0uaW1nRmFkZXIpLCB0aGlzLm5vdGlmaWNhdGlvbnNfW2ldLmltZ0ZhZGVyID0gbnVsbCkKICAgIH0KICAgIHRoaXMubm90aWZSZW5kZXJlcl8gJiYgKHRoaXMubm90aWZSZW5kZXJlcl8uZGlzcG9zZSgpLCB0aGlzLm5vdGlmUmVuZGVyZXJfID0gbnVsbCkKICB9Cn07CnRhbGsubWVkaWEuQzNkTm90aWZpZXIucHJvdG90eXBlLm9uUmVzaXplID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTm90aWZpZXIkJG9uUmVzaXplJChlKSB7CiAgdGhpcy53aWR0aF8gPSBlLndpZHRoOwogIHRoaXMuaGVpZ2h0XyA9IGUuaGVpZ2h0OwogIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMubm90aWZpY2F0aW9uc18ubGVuZ3RoOysraSkgewogICAgaWYodGhpcy5ub3RpZmljYXRpb25zX1tpXS5pbWcpIHsKICAgICAgdmFyIHkgPSB0aGlzLmhlaWdodF8gLSB0aGlzLm5vdGlmaWNhdGlvbnNfW2ldLmltZy5oZWlnaHQoKTsKICAgICAgdGhpcy5ub3RpZmljYXRpb25zX1tpXS5pbWcubW92ZVRvKDAsIHkpCiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLkMzZE5vdGlmaWVyLnByb3RvdHlwZS5hZGROb3RpZmljYXRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2ROb3RpZmllciQkYWRkTm90aWZpY2F0aW9uJChpbWdVcmwsIGRpc3BsYXlUZXh0KSB7CiAgdmFyIG5ld05vdGlmaWNhdGlvbiA9IG5ldyB0YWxrLm1lZGlhLkMzZE5vdGlmaWVyLk5vdGlmaWNhdGlvbl87CiAgbmV3Tm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblRleHQgPSBkaXNwbGF5VGV4dDsKICB0aGlzLm5vdGlmaWNhdGlvbnNfLnB1c2gobmV3Tm90aWZpY2F0aW9uKTsKICB0aGlzLm5vdGlmUmVuZGVyZXJfLnJlbmRlclRleHR1cmUoaW1nVXJsLCBkaXNwbGF5VGV4dCwgZ29vZy5iaW5kKHRoaXMub25UZXh0UmVuZGVyZWRfLCB0aGlzLCBuZXdOb3RpZmljYXRpb24pKTsKICByZXR1cm4gbmV3Tm90aWZpY2F0aW9uCn07CnRhbGsubWVkaWEuQzNkTm90aWZpZXIucHJvdG90eXBlLm9uVGV4dFJlbmRlcmVkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZE5vdGlmaWVyJCRvblRleHRSZW5kZXJlZF8kKG5ld05vdGlmaWNhdGlvbiwgdGV4dHVyZSkgewogIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMubm90aWZpY2F0aW9uc18ubGVuZ3RoOysraSkgewogICAgdGhpcy5ub3RpZmljYXRpb25zX1tpXSA9PSBuZXdOb3RpZmljYXRpb24gJiYgbnVsbCAhPSB0ZXh0dXJlICYmICh0aGlzLm5vdGlmaWNhdGlvbnNfW2ldLmltZyA9IHRoaXMuaW1hZ2VPdmVybGF5Xy5jcmVhdGVJbWFnZUZyb21UZXh0dXJlKDAsIDAsIHRleHR1cmUpLCB0aGlzLm5vdGlmaWNhdGlvbnNfW2ldLmltZy5zZXRWaXNpYmxlKCExKSkKICB9Cn07CnRhbGsubWVkaWEuQzNkTm90aWZpZXIucHJvdG90eXBlLnNob3dOb3RpZmljYXRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2ROb3RpZmllciQkc2hvd05vdGlmaWNhdGlvbiQobm90aWZpY2F0aW9uSW5wdXQpIHsKICBpZih0aGlzLmMzZEVuZ2luZV8gJiYgZ29vZy5hcnJheS5jb250YWlucyh0aGlzLm5vdGlmaWNhdGlvbnNfLCBub3RpZmljYXRpb25JbnB1dCkgJiYgbm90aWZpY2F0aW9uSW5wdXQuaW1nKSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLm5vdGlmaWNhdGlvbnNfLmxlbmd0aDsrK2kpIHsKICAgICAgdGhpcy5ub3RpZmljYXRpb25zX1tpXSAhPSBub3RpZmljYXRpb25JbnB1dCAmJiB0aGlzLmZpbmlzaE5vdGlmaWNhdGlvbkZhZGluZ18odGhpcy5ub3RpZmljYXRpb25zX1tpXSkKICAgIH0KICAgIG5vdGlmaWNhdGlvbklucHV0LmZhZGVySWQgPSBnb29nLlRpbWVyLmNhbGxPbmNlKGdvb2cuYmluZCh0aGlzLmZhZGVPdXROb3RpZmljYXRpb25fLCB0aGlzLCBub3RpZmljYXRpb25JbnB1dCksIHRhbGsubWVkaWEuQzNkTm90aWZpZXIuRkFERV9PVVRfREVMQVlfTVNfLCB0aGlzKTsKICAgIG5vdGlmaWNhdGlvbklucHV0LmltZy5zZXRWaXNpYmxlKCEwKTsKICAgIG5vdGlmaWNhdGlvbklucHV0LmltZy5zZXRBbHBoYSgxKTsKICAgIHRoaXMuY2FsbE1hbmFnZXJfLmFkZFRvTG9nKG5vdGlmaWNhdGlvbklucHV0Lm5vdGlmaWNhdGlvblRleHQpCiAgfQp9Owp0YWxrLm1lZGlhLkMzZE5vdGlmaWVyLnByb3RvdHlwZS5maW5pc2hOb3RpZmljYXRpb25GYWRpbmdfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkTm90aWZpZXIkJGZpbmlzaE5vdGlmaWNhdGlvbkZhZGluZ18kKG5vdGlmaWNhdGlvbikgewogIGdvb2cuaXNEZWZBbmROb3ROdWxsKG5vdGlmaWNhdGlvbi5mYWRlcklkKSAmJiAoZ29vZy5UaW1lci5jbGVhcihub3RpZmljYXRpb24uZmFkZXJJZCksIG5vdGlmaWNhdGlvbi5pbWdGYWRlciA9IG51bGwpOwogIG5vdGlmaWNhdGlvbi5pbWdGYWRlciAmJiAodGhpcy5jM2RFbmdpbmVfLnVucmVnaXN0ZXJSZW5kZXJDYWxsYmFjayhub3RpZmljYXRpb24uaW1nRmFkZXIpLCBub3RpZmljYXRpb24uaW1nRmFkZXIgPSBudWxsKTsKICBub3RpZmljYXRpb24uaW1nICYmIG5vdGlmaWNhdGlvbi5pbWcuc2V0VmlzaWJsZSghMSkKfTsKdGFsay5tZWRpYS5DM2ROb3RpZmllci5wcm90b3R5cGUuZmFkZU91dE5vdGlmaWNhdGlvbl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2ROb3RpZmllciQkZmFkZU91dE5vdGlmaWNhdGlvbl8kKG5vdGlmaWNhdGlvbikgewogIGRlbGV0ZSBub3RpZmljYXRpb24uZmFkZXJJZDsKICBub3RpZmljYXRpb24uaW1nRmFkZXIgPSBuZXcgdGFsay5tZWRpYS5jM2QuQWxwaGFUd2Vlbihub3RpZmljYXRpb24uaW1nLmdldFNjZW5lT2JqZWN0KCksIG5vdGlmaWNhdGlvbi5pbWcuZ2V0QWxwaGEoKSwgMCwgMSwgdGFsay5tZWRpYS5jM2QuZWFzaW5nLlJFR1VMQVJfRUFTRV9JTiwgZ29vZy5iaW5kKHRoaXMuZmluaXNoTm90aWZpY2F0aW9uRmFkaW5nXywgdGhpcywgbm90aWZpY2F0aW9uKSk7CiAgdGhpcy5jM2RFbmdpbmVfLnJlZ2lzdGVyUmVuZGVyQ2FsbGJhY2sobm90aWZpY2F0aW9uLmltZ0ZhZGVyKQp9Owpnb29nLnRhbGsgPSB7fTsKZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cyA9IHt9Owpnb29nLnRhbGsuc2hhcmVkY29uc3RhbnRzLlNoYXJlZFN0YXR1cyA9IHt9Owpnb29nLnRhbGsuc2hhcmVkY29uc3RhbnRzLkNvbm5lY3Rpb25TdGF0ZSA9IHtPUEVORUQ6Ik9QRU5FRCIsIENMT1NFRDoiQ0xPU0VEIiwgQ09OTkVDVElORzoiQ09OTkVDVElORyIsIEVSUk9SOiJFUlJPUiJ9Owpnb29nLnRhbGsuc2hhcmVkY29uc3RhbnRzLlVzZXJTdGF0dXMgPSB7QVZBSUxBQkxFOiJhIiwgQlVTWToiYiIsIElETEU6ImkiLCBJTlZJU0lCTEU6InYiLCBTSUdORURPVVQ6IngifTsKZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuU2hvdyA9IHtBVkFJTEFCTEU6ImEiLCBDSEFUOiJjIiwgSURMRToiaSIsIEFXQVk6InciLCBCVVNZOiJiIiwgT0ZGTElORToidSIsIFVOS05PV046Ij8ifTsKZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuQ2FwYWJpbGl0aWVzID0ge05PTkU6MCwgVk9JQ0VfRU5BQkxFRDoxLCBNVUNfRU5BQkxFRDoyLCBWT0lDRU1BSUxfRU5BQkxFRDo0LCBWSURFT19FTkFCTEVEOjgsIEhBU19DQU1FUkE6MTYsIFNIQVJFX0VOQUJMRUQ6MzIsIEFQUExJQ0FUSU9OX0VOQUJMRUQ6NjQsIFBMVUdJTl9JTlZJVEFCTEU6MTI4fTsKZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5FdmVudCA9IHtCQURfQ09PS0lFX0JFSEFWSU9SOiJiYWRDb29raWVCZWhhdmlvciIsIENPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFOiJjb25uZWN0aW9uU3RhdGVDaGFuZ2UiLCBDT05UQUNUX1BSRVNFTkNFOiJjb250YWN0UHJlc2VuY2UiLCBFWFRFTlNJT05fTUVTU0FHRToiZXh0ZW5zaW9uTWVzc2FnZSIsIElOVklUQVRJT05fRElTUExBWUVEOiJpbnZpdGF0aW9uRGlzcGxheWVkIiwgTE9HSU5fUkVRVUlSRUQ6ImxvZ2luUmVxdWlyZWQiLCBNRV9QUkVTRU5DRV9DSEFOR0U6Im1lUHJlc2VuY2VDaGFuZ2UiLCBOT1RJRklDQVRJT05fQUNUSU9OX0NMSUNLOiJub3RpZmljYXRpb25BY3Rpb25DbGljayIsIFVOU1VQUE9SVEVEX0JST1dTRVI6InVuc3VwcG9ydGVkQnJvd3NlciIsIEhPU1RfTk9USUZJQ0FUSU9OOiJob3N0Tm90aWZpY2F0aW9uIiwgQ0FMTF9DT05ORUNURUQ6ImNhbGxDb25uZWN0ZWQifTsKZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5Dc3NDbGFzc2VzID0ge01PTEU6InRhbGtfY2hhdF93aWRnZXQiLCBET0NLRURfTU9MRToidGFsa19jaGF0X2RvY2tlZF93aWRnZXQiLCBST1NURVI6InRhbGtfcm9zdGVyIiwgUk9TVEVSX0lGUkFNRToidGFsa19pZnJhbWUifTsKZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5Nb2xlVXJsUGFyYW1ldGVycyA9IHtJRDoiaWQiLCBDU1M6ImNzcyIsIFBST1A6InByb3AiLCBRUEFORUw6InFwYW5lbCIsIFZFUjoidmVyIiwgVFlQRToidHlwZSJ9Owpnb29nLnRhbGsuc2hhcmVkY29uc3RhbnRzLklkbGVFcnJvciA9IHtVSUE6IlVJQSIsIFVBSToiVUFJIiwgSUFFOiJJQUUiLCBJSUE6IklJQSIsIEFJRToiQUlFIiwgQUFJOiJBQUkifTsKY2hhdC5tb2RlbCA9IHt9OwpjaGF0Lm1vZGVsLlJvc3RlclNpemVTZXR0aW5nID0ge307CmNoYXQubW9kZWwuUm9zdGVyU2l6ZVNldHRpbmcuUXVpY2tsaXN0U2l6ZU9wdGlvbiA9IHtUSU5ZOjAsIFNNQUxMOjEsIE1FRElVTToyLCBMQVJHRTozLCBBTEw6NH07CmNoYXQubW9kZWwuUm9zdGVyU2l6ZVNldHRpbmcuUXVpY2tsaXN0U2l6ZVZhbHVlID0gWzQsIDgsIDE2LCAzMiwgMUUzXTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZyA9IHt9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLkdvb2dsZVBsdXNDb25maWcgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JGNvbmZpZyRHb29nbGVQbHVzQ29uZmlnJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbImNpOmNwYyJdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5Hb29nbGVQbHVzQ29uZmlnLCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuY29uZmlnLkdvb2dsZVBsdXNDb25maWcubWVzc2FnZUlkID0gImNpOmNwYyI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5jb25maWcuR29vZ2xlUGx1c0NvbmZpZy5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5jb25maWcuR29vZ2xlUGx1c0NvbmZpZyk7CnByb3RvLmFwcHMuY2hhdC5jb25maWcuR29vZ2xlUGx1c0NvbmZpZy5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJEdvb2dsZVBsdXNDb25maWckJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuY29uZmlnLkdvb2dsZVBsdXNDb25maWcubWVzc2FnZUlkCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuR29vZ2xlUGx1c0NvbmZpZy5wcm90b3R5cGUuZ2V0T3pCYXNlUGF0aCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJEdvb2dsZVBsdXNDb25maWckJGdldE96QmFzZVBhdGgkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzddCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuR29vZ2xlUGx1c0NvbmZpZy5wcm90b3R5cGUuc2V0T3pCYXNlUGF0aCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJEdvb2dsZVBsdXNDb25maWckJHNldE96QmFzZVBhdGgkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs3XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuU3VwZXJtb2xlQ29uZmlnID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckU3VwZXJtb2xlQ29uZmlnJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbImNpOmNzbSJdOwogIHRoaXMuYXJyYXlbMTVdID0gdGhpcy5hcnJheVsxNV0gfHwgW10KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZywganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5TdXBlcm1vbGVDb25maWcubWVzc2FnZUlkID0gImNpOmNzbSI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5jb25maWcuU3VwZXJtb2xlQ29uZmlnLm1lc3NhZ2VJZCwgcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5TdXBlcm1vbGVDb25maWcpOwpwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZy5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFN1cGVybW9sZUNvbmZpZyQkZ2V0SnNQYk1lc3NhZ2VJZCQoKSB7CiAgcmV0dXJuIHByb3RvLmFwcHMuY2hhdC5jb25maWcuU3VwZXJtb2xlQ29uZmlnLm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZy5wcm90b3R5cGUuZ2V0UXVpY2tsaXN0TWluUmVxdWlyZW1lbnRzID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckU3VwZXJtb2xlQ29uZmlnJCRnZXRRdWlja2xpc3RNaW5SZXF1aXJlbWVudHMkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzExXQp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZy5wcm90b3R5cGUuc2V0UXVpY2tsaXN0TWluUmVxdWlyZW1lbnRzID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckU3VwZXJtb2xlQ29uZmlnJCRzZXRRdWlja2xpc3RNaW5SZXF1aXJlbWVudHMkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxMV0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZy5wcm90b3R5cGUuZ2V0UXVpY2tsaXN0QnVja2V0Q29tcFNwZWMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JGNvbmZpZyRTdXBlcm1vbGVDb25maWckJGdldFF1aWNrbGlzdEJ1Y2tldENvbXBTcGVjJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxMl0KfTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5TdXBlcm1vbGVDb25maWcucHJvdG90eXBlLnNldFF1aWNrbGlzdEJ1Y2tldENvbXBTcGVjID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckU3VwZXJtb2xlQ29uZmlnJCRzZXRRdWlja2xpc3RCdWNrZXRDb21wU3BlYyQodmFsdWUpIHsKICB0aGlzLmFycmF5WzEyXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuU3VwZXJtb2xlQ29uZmlnLnByb3RvdHlwZS5nZXRRdWlja2xpc3RCdWNrZXRTaXplU3BlYyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFN1cGVybW9sZUNvbmZpZyQkZ2V0UXVpY2tsaXN0QnVja2V0U2l6ZVNwZWMkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzEzXQp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZy5wcm90b3R5cGUuc2V0UXVpY2tsaXN0QnVja2V0U2l6ZVNwZWMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JGNvbmZpZyRTdXBlcm1vbGVDb25maWckJHNldFF1aWNrbGlzdEJ1Y2tldFNpemVTcGVjJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMTNdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5TdXBlcm1vbGVDb25maWcucHJvdG90eXBlLmdldFF1aWNrbGlzdFNvcnRTcGVjID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckU3VwZXJtb2xlQ29uZmlnJCRnZXRRdWlja2xpc3RTb3J0U3BlYyQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMTRdCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuU3VwZXJtb2xlQ29uZmlnLnByb3RvdHlwZS5zZXRRdWlja2xpc3RTb3J0U3BlYyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFN1cGVybW9sZUNvbmZpZyQkc2V0UXVpY2tsaXN0U29ydFNwZWMkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxNF0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZy5Nb2xlQ29uZmlnID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckU3VwZXJtb2xlQ29uZmlnJE1vbGVDb25maWckKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFsiY2k6Y3NtbWMiXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5jb25maWcuU3VwZXJtb2xlQ29uZmlnLk1vbGVDb25maWcsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5jb25maWcuU3VwZXJtb2xlQ29uZmlnLk1vbGVDb25maWcubWVzc2FnZUlkID0gImNpOmNzbW1jIjsKanNwYi5NZXNzYWdlLnJlZ2lzdGVyTWVzc2FnZVR5cGUocHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5TdXBlcm1vbGVDb25maWcuTW9sZUNvbmZpZy5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5jb25maWcuU3VwZXJtb2xlQ29uZmlnLk1vbGVDb25maWcpOwpwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZy5Nb2xlQ29uZmlnLnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckU3VwZXJtb2xlQ29uZmlnJE1vbGVDb25maWckJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZy5Nb2xlQ29uZmlnLm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZy5EZWJ1Z0NvbmZpZyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFN1cGVybW9sZUNvbmZpZyREZWJ1Z0NvbmZpZyQob3B0X2RhdGEpIHsKICBqc3BiLk1lc3NhZ2UuY2FsbCh0aGlzKTsKICB0aGlzLmFycmF5ID0gb3B0X2RhdGEgfHwgW10KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuY29uZmlnLlN1cGVybW9sZUNvbmZpZy5EZWJ1Z0NvbmZpZywganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5Vc2VyU2lnbmluU2Vzc2lvbiA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFVzZXJTaWduaW5TZXNzaW9uJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbImNpOmN1aTp1c3MiXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlclNpZ25pblNlc3Npb24sIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlclNpZ25pblNlc3Npb24ubWVzc2FnZUlkID0gImNpOmN1aTp1c3MiOwpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZShwcm90by5hcHBzLmNoYXQuY29uZmlnLlVzZXJTaWduaW5TZXNzaW9uLm1lc3NhZ2VJZCwgcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5Vc2VyU2lnbmluU2Vzc2lvbik7CnByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlclNpZ25pblNlc3Npb24ucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JGNvbmZpZyRVc2VyU2lnbmluU2Vzc2lvbiQkZ2V0SnNQYk1lc3NhZ2VJZCQoKSB7CiAgcmV0dXJuIHByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlclNpZ25pblNlc3Npb24ubWVzc2FnZUlkCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlclNpZ25pblNlc3Npb24ucHJvdG90eXBlLmdldEF1dGhJbmRleCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFVzZXJTaWduaW5TZXNzaW9uJCRnZXRBdXRoSW5kZXgkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzFdCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlclNpZ25pblNlc3Npb24ucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JGNvbmZpZyRVc2VyU2lnbmluU2Vzc2lvbiQkZ2V0TmFtZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMl0KfTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5Vc2VyU2lnbmluU2Vzc2lvbi5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFVzZXJTaWduaW5TZXNzaW9uJCRzZXROYW1lJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMl0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlVzZXJTaWduaW5TZXNzaW9uLnByb3RvdHlwZS5nZXRFbWFpbCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFVzZXJTaWduaW5TZXNzaW9uJCRnZXRFbWFpbCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbM10KfTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5Vc2VyU2lnbmluU2Vzc2lvbi5wcm90b3R5cGUuc2V0RW1haWwgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JGNvbmZpZyRVc2VyU2lnbmluU2Vzc2lvbiQkc2V0RW1haWwkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVszXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlclNpZ25pblNlc3Npb24ucHJvdG90eXBlLmdldEF2YXRhclVybCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFVzZXJTaWduaW5TZXNzaW9uJCRnZXRBdmF0YXJVcmwkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzRdCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlclNpZ25pblNlc3Npb24ucHJvdG90eXBlLnNldEF2YXRhclVybCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFVzZXJTaWduaW5TZXNzaW9uJCRzZXRBdmF0YXJVcmwkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs0XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlckluZm9ybWF0aW9uID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckVXNlckluZm9ybWF0aW9uJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbImNpOmN1aSJdOwogIHRoaXMuYXJyYXlbOV0gPSB0aGlzLmFycmF5WzldIHx8IFtdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5Vc2VySW5mb3JtYXRpb24sIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlckluZm9ybWF0aW9uLm1lc3NhZ2VJZCA9ICJjaTpjdWkiOwpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZShwcm90by5hcHBzLmNoYXQuY29uZmlnLlVzZXJJbmZvcm1hdGlvbi5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlckluZm9ybWF0aW9uKTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5Vc2VySW5mb3JtYXRpb24ucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JGNvbmZpZyRVc2VySW5mb3JtYXRpb24kJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuY29uZmlnLlVzZXJJbmZvcm1hdGlvbi5tZXNzYWdlSWQKfTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5Vc2VySW5mb3JtYXRpb24ucHJvdG90eXBlLmdldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFVzZXJJbmZvcm1hdGlvbiQkZ2V0SmlkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxXQp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlVzZXJJbmZvcm1hdGlvbi5wcm90b3R5cGUuc2V0SmlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckVXNlckluZm9ybWF0aW9uJCRzZXRKaWQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlckluZm9ybWF0aW9uLnByb3RvdHlwZS5nZXRPYmZ1c2NhdGVkR2FpYUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckVXNlckluZm9ybWF0aW9uJCRnZXRPYmZ1c2NhdGVkR2FpYUlkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVszXQp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlVzZXJJbmZvcm1hdGlvbi5wcm90b3R5cGUuc2V0T2JmdXNjYXRlZEdhaWFJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFVzZXJJbmZvcm1hdGlvbiQkc2V0T2JmdXNjYXRlZEdhaWFJZCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzNdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5Vc2VySW5mb3JtYXRpb24ucHJvdG90eXBlLmdldEhvc3RlZERvbWFpbiA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFVzZXJJbmZvcm1hdGlvbiQkZ2V0SG9zdGVkRG9tYWluJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs1XQp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlVzZXJJbmZvcm1hdGlvbi5wcm90b3R5cGUuZ2V0QXV0aEluZGV4ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckVXNlckluZm9ybWF0aW9uJCRnZXRBdXRoSW5kZXgkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzddCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuVXNlckluZm9ybWF0aW9uLnByb3RvdHlwZS5nZXRJc0dwbHVzID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckVXNlckluZm9ybWF0aW9uJCRnZXRJc0dwbHVzJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxMl0KfTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5SZWFkT25seUNvbmZpZyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFJlYWRPbmx5Q29uZmlnJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbImNpOmNybyJdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5SZWFkT25seUNvbmZpZywganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5SZWFkT25seUNvbmZpZy5tZXNzYWdlSWQgPSAiY2k6Y3JvIjsKanNwYi5NZXNzYWdlLnJlZ2lzdGVyTWVzc2FnZVR5cGUocHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5SZWFkT25seUNvbmZpZy5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5jb25maWcuUmVhZE9ubHlDb25maWcpOwpwcm90by5hcHBzLmNoYXQuY29uZmlnLlJlYWRPbmx5Q29uZmlnLnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckUmVhZE9ubHlDb25maWckJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuY29uZmlnLlJlYWRPbmx5Q29uZmlnLm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuY29uZmlnLlJlYWRPbmx5Q29uZmlnLnByb3RvdHlwZS5nZXRVc2VyID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRjb25maWckUmVhZE9ubHlDb25maWckJGdldFVzZXIkKCkgewogIHRoaXMudXNlcl8gfHwgKHRoaXMudXNlcl8gPSBuZXcgcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5Vc2VySW5mb3JtYXRpb24odGhpcy5hcnJheVsxXSkpOwogIHJldHVybiB0aGlzLnVzZXJfCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuUmVhZE9ubHlDb25maWcucHJvdG90eXBlLmdldEdvb2dsZVBsdXMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JGNvbmZpZyRSZWFkT25seUNvbmZpZyQkZ2V0R29vZ2xlUGx1cyQoKSB7CiAgdGhpcy5nb29nbGVfcGx1c18gfHwgKHRoaXMuZ29vZ2xlX3BsdXNfID0gbmV3IHByb3RvLmFwcHMuY2hhdC5jb25maWcuR29vZ2xlUGx1c0NvbmZpZyh0aGlzLmFycmF5WzJdKSk7CiAgcmV0dXJuIHRoaXMuZ29vZ2xlX3BsdXNfCn07CnByb3RvLmFwcHMuY2hhdC5jb25maWcuUmVhZE9ubHlDb25maWcucHJvdG90eXBlLmdldFN1cGVybW9sZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkY29uZmlnJFJlYWRPbmx5Q29uZmlnJCRnZXRTdXBlcm1vbGUkKCkgewogIHRoaXMuc3VwZXJtb2xlXyB8fCAodGhpcy5zdXBlcm1vbGVfID0gbmV3IHByb3RvLmFwcHMuY2hhdC5jb25maWcuU3VwZXJtb2xlQ29uZmlnKHRoaXMuYXJyYXlbM10pKTsKICByZXR1cm4gdGhpcy5zdXBlcm1vbGVfCn07CmNoYXQuY2xpZW50LlJlYWRPbmx5Q29uZmlnID0gZnVuY3Rpb24gJGNoYXQkY2xpZW50JFJlYWRPbmx5Q29uZmlnJChvcHRfZGF0YSkgewogIHByb3RvLmFwcHMuY2hhdC5jb25maWcuUmVhZE9ubHlDb25maWcuY2FsbCh0aGlzLCBvcHRfZGF0YSk7CiAgdGhpcy5pbml0aWFsU2hvdyA9IGdvb2cudGFsay5zaGFyZWRjb25zdGFudHMuU2hhcmVkU3RhdHVzLlNob3cuT0ZGTElORTsKICB0aGlzLmJhc2VVcmwgPSAiIjsKICB0aGlzLnZlcnNpb24gPSAibG9jYWwiOwogIHRoaXMuZmVhdHVyZUNvZGVzID0gW107CiAgdGhpcy5wcm9wZXJ0eSA9IGNoYXQuY2xpZW50LlJlYWRPbmx5Q29uZmlnLk1TR19ERUZBVUxUX1BST1BFUlRZOwogIHRoaXMuc3RhcnRUaW1lID0gMDsKICB0aGlzLm5vdGlmaWNhdGlvbnNPbmx5ID0gdGhpcy5kZWJ1ZyA9ICExOwogIHRoaXMubG9jYWxlID0gZ29vZy5MT0NBTEU7CiAgdGhpcy5oaWRlRW1haWwgPSAhMTsKICB0aGlzLmZpeGVkUXVpY2tsaXN0U2l6ZSA9IC0xOwogIHRoaXMuZGVmYXVsdFF1aWNrbGlzdFNpemVPcHRpb24gPSBjaGF0Lm1vZGVsLlJvc3RlclNpemVTZXR0aW5nLlF1aWNrbGlzdFNpemVPcHRpb24uU01BTEw7CiAgZ29vZy5pc0RlZih0aGlzLmdldFN1cGVybW9sZSgpLmdldFF1aWNrbGlzdE1pblJlcXVpcmVtZW50cygpKSB8fCB0aGlzLmdldFN1cGVybW9sZSgpLnNldFF1aWNrbGlzdE1pblJlcXVpcmVtZW50cygiW2I6LTEsaDotMSxqOi0xLHNuOi0xLHNmOi0xLDE6MV0iKTsKICBnb29nLmlzRGVmKHRoaXMuZ2V0U3VwZXJtb2xlKCkuZ2V0UXVpY2tsaXN0QnVja2V0Q29tcFNwZWMoKSkgfHwgdGhpcy5nZXRTdXBlcm1vbGUoKS5zZXRRdWlja2xpc3RCdWNrZXRDb21wU3BlYygie3A6MX0ge2FjOjUsYWE6NCxhYjozLGFpOjIsYXc6MSxhbzowfSB7d2I6MX0iKTsKICBnb29nLmlzRGVmKHRoaXMuZ2V0U3VwZXJtb2xlKCkuZ2V0UXVpY2tsaXN0QnVja2V0U2l6ZVNwZWMoKSkgfHwgdGhpcy5nZXRTdXBlcm1vbGUoKS5zZXRRdWlja2xpc3RCdWNrZXRTaXplU3BlYygiKiIpOwogIGdvb2cuaXNEZWYodGhpcy5nZXRTdXBlcm1vbGUoKS5nZXRRdWlja2xpc3RTb3J0U3BlYygpKSB8fCB0aGlzLmdldFN1cGVybW9sZSgpLnNldFF1aWNrbGlzdFNvcnRTcGVjKCIiKTsKICBnb29nLmlzRGVmKHRoaXMuZ2V0R29vZ2xlUGx1cygpLmdldE96QmFzZVBhdGgoKSkgfHwgdGhpcy5nZXRHb29nbGVQbHVzKCkuc2V0T3pCYXNlUGF0aCgiIikKfTsKZ29vZy5pbmhlcml0cyhjaGF0LmNsaWVudC5SZWFkT25seUNvbmZpZywgcHJvdG8uYXBwcy5jaGF0LmNvbmZpZy5SZWFkT25seUNvbmZpZyk7CmNoYXQuY2xpZW50LlJlYWRPbmx5Q29uZmlnLlNFUlZJQ0VfSUQgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJjaGF0LmNsaWVudC5SZWFkT25seUNvbmZpZyIpOwpjaGF0LmNsaWVudC5SZWFkT25seUNvbmZpZy5NU0dfREVGQVVMVF9QUk9QRVJUWSA9ICJHb29nbGUgVGFsayI7CmNoYXQuY2xpZW50LlJlYWRPbmx5Q29uZmlnLmZyb21MaXN0ID0gZnVuY3Rpb24gJGNoYXQkY2xpZW50JFJlYWRPbmx5Q29uZmlnJGZyb21MaXN0JChiYXNlVXJsLCBjaGFubmVsUGF0aCwgY2xpZW50SWQsIGluaXRpYWxTaG93LCBnc2Vzc2lvbmlkLCB2ZXJzaW9uLCBjb29raWVOYW1lLCBmb3J3YXJkQ2hhbm5lbFBpbmdJbnRlcnZhbE1zLCBlbGVtZW50SWQsIGxhc3RVcGRhdGUsIGZlYXR1cmVDb2RlcywgaW5pdGlhbE1lc3NhZ2VzLCBjc3NVcmwsIHByb3BlcnR5LCBzaG93Um9zdGVyLCBlbmFibGVSb3N0ZXJBdmF0YXJzLCBlbmFibGVSZXZlcnNlTGF5b3V0Um9zdGVyLCBlbmFibGVTb3J0T3B0aW9ucywgZnJvbVNpZ25Jbiwgc3RhcnRUaW1lLCBkZWJ1ZywgZmVlZGJhY2tVcmwsIHNob3dJbXBvcnRlciwgbm90aWZpY2F0aW9uc09ubHksIGFjdGl2ZU11Y09ubHksIGJ1aWxkVmVyc2lvbiwgcm9zdGVyRXhwYW5kZWQsIGxvY2FsZSwgaXNSZWZyZXNoLCBzaG93SGlkZUNoYXRPcHRpb24sIApoaWRlTWVOYW1lLCBoaWRlUHJvZmlsZUNhcmQsIGhpZGVFbWFpbCwgaGlkZVJvc3RlckZvb3RlciwgaGlkZVN0YXR1c01zZ3MsIGhpZGVSb3N0ZXJPcHRpb25zLCBoaWRlRmluZEZyaWVuZHMsIGhpZGVSZWNlbnRDb252ZXJzYXRpb25zLCBoaWRlT1RSLCBsb2dUb0hvc3RMZXZlbCwgc2VuZFNlcnZlck1lc3NhZ2VzVG9Ib3N0LCBub0Nvb2tpZUNoYW5uZWwsIGlzQ2VudHJhbFJvc3RlciwgZXhwZWN0ZWRXaWRnZXRzLCBmaWxlVHJhbnNmZXJNYXhGaWxlU2l6ZSwgbWF4UXVpY2tsaXN0SGVpZ2h0LCBhbHdheXNTaG93Um9zdGVyQXZhdGFycywgZW5hYmxlRnVsbEhlaWdodFJvc3RlciwgZW5hYmxlUHJlc2VuY2VBdFRvcCwgZW5hYmxlRXhwYW5kZWRQcmVzZW5jZU1lbnUsIHVzZU1vbGVUaXRsZVNwcml0ZXMsIGVuYWJsZUVkaXRhYmxlU3RhdHVzQmFyLCBmaXhlZFF1aWNrbGlzdFNpemUsIGRlZmF1bHRRdWlja2xpc3RTaXplT3B0aW9uLCBhbHdheXNTaG93TW9sZUF2YXRhcnMsIGhhbmdvdXRCYXNlVXJsLCAKam9pbnRseUJhc2VVcmwsIHZlcmlmaWNhdGlvblVybCwgeHBjQ29uZmlnLCBzaG93U2lnbk91dCwgaGlkZVF1aWNrbGlzdE9uU2lnbm91dCwgZm9yY2VIaWdoUmVzVmlkZW8sIGhpZGVTbXNNZW51SXRlbXMsIHNob3dIYW5nb3V0Um9zdGVySXRlbSwgYWxsb3dFYXJseU5vbkJ1ZmZlcmVkQmNEZXRlY3Rpb24sIHB2dFByb3ZpZGVkLCBlbmFibGVDaGlwcywgaW5pdGlhbE11dGVDYW1lcmFNaWMsIGZ1bGxNb2R1bGVVcmwsIGZvcmNlSWVVbmxvYWREZXRlY3Rpb24sIHBhdXNlQXRMaXRlLCBlbmFibGVJbnZpdGVDb25maXJtYXRpb25EaWFsb2csIHVzZVF1YXNhclBhbmVscywgdXNlQXV0b2NvbXBsZXRlV2l0aFBpY3R1cmVzLCByZWFkT25seUNvbmZpZykgewogIHZhciBkYXRhID0gcmVhZE9ubHlDb25maWc7CiAgZGF0YSAmJiAoZGF0YSA9IGdvb2cuanNvbi5wYXJzZShkYXRhKSk7CiAgdmFyIGNoYXRDb25maWcgPSBuZXcgY2hhdC5jbGllbnQuUmVhZE9ubHlDb25maWcoZGF0YSk7CiAgY2hhdENvbmZpZy5pc0lmcmFtZWQgPSAhMDsKICBjaGF0Q29uZmlnLmJhc2VVcmwgPSBiYXNlVXJsOwogIGNoYXRDb25maWcuY2hhbm5lbFBhdGggPSBjaGFubmVsUGF0aDsKICBjaGF0Q29uZmlnLmNsaWVudElkID0gY2xpZW50SWQ7CiAgY2hhdENvbmZpZy5pbml0aWFsU2hvdyA9IGluaXRpYWxTaG93OwogIGNoYXRDb25maWcuZ3Nlc3Npb25pZCA9IGdzZXNzaW9uaWQ7CiAgY2hhdENvbmZpZy52ZXJzaW9uID0gdmVyc2lvbjsKICBjaGF0Q29uZmlnLmNvb2tpZU5hbWUgPSBjb29raWVOYW1lOwogIGNoYXRDb25maWcuZm9yd2FyZENoYW5uZWxQaW5nSW50ZXJ2YWxNcyA9IGZvcndhcmRDaGFubmVsUGluZ0ludGVydmFsTXM7CiAgY2hhdENvbmZpZy5lbGVtZW50SWQgPSBlbGVtZW50SWQ7CiAgY2hhdENvbmZpZy5sYXN0VXBkYXRlID0gbGFzdFVwZGF0ZTsKICBjaGF0Q29uZmlnLmZlYXR1cmVDb2RlcyA9IGZlYXR1cmVDb2RlczsKICBjaGF0Q29uZmlnLmluaXRpYWxNZXNzYWdlcyA9IGluaXRpYWxNZXNzYWdlczsKICBjaGF0Q29uZmlnLmNzc1VybCA9IGNzc1VybDsKICBjaGF0Q29uZmlnLnByb3BlcnR5ID0gcHJvcGVydHk7CiAgY2hhdENvbmZpZy5pc1F1YXNhciA9ICJhcXVhc2FyIiA9PSBwcm9wZXJ0eSB8fCAiR29vZ2xlLVZvaWNlIiA9PSBwcm9wZXJ0eTsKICBjaGF0Q29uZmlnLmlzSGFuZ291dHNPclBybyA9ICJhcXVhc2FyIiA9PSBwcm9wZXJ0eSB8fCAiaGFuZ291dCIgPT0gcHJvcGVydHk7CiAgY2hhdENvbmZpZy5pc0Nocm9tZU9TID0gIkNocm9tZU9TIiA9PSBwcm9wZXJ0eTsKICBjaGF0Q29uZmlnLmlzQ2hyb21lRXh0ZW5zaW9uID0gImFDaHJvbWVFeHRlbnNpb24iID09IHByb3BlcnR5OwogIGNoYXRDb25maWcuc2hvd1Jvc3RlciA9IHNob3dSb3N0ZXI7CiAgY2hhdENvbmZpZy5lbmFibGVSb3N0ZXJBdmF0YXJzID0gZW5hYmxlUm9zdGVyQXZhdGFyczsKICBjaGF0Q29uZmlnLmVuYWJsZVJldmVyc2VMYXlvdXRSb3N0ZXIgPSBlbmFibGVSZXZlcnNlTGF5b3V0Um9zdGVyOwogIGNoYXRDb25maWcuZW5hYmxlU29ydE9wdGlvbnMgPSBlbmFibGVTb3J0T3B0aW9uczsKICBjaGF0Q29uZmlnLmZyb21TaWduSW4gPSBmcm9tU2lnbkluOwogIGNoYXRDb25maWcuc3RhcnRUaW1lID0gc3RhcnRUaW1lOwogIGNoYXRDb25maWcuZGVidWcgPSBkZWJ1ZzsKICBjaGF0Q29uZmlnLmZlZWRiYWNrVXJsID0gZmVlZGJhY2tVcmw7CiAgY2hhdENvbmZpZy5zaG93SW1wb3J0ZXIgPSBzaG93SW1wb3J0ZXI7CiAgY2hhdENvbmZpZy5ub3RpZmljYXRpb25zT25seSA9IG5vdGlmaWNhdGlvbnNPbmx5OwogIGNoYXRDb25maWcuYWN0aXZlTXVjT25seSA9IGFjdGl2ZU11Y09ubHk7CiAgY2hhdENvbmZpZy5idWlsZFZlcnNpb24gPSBidWlsZFZlcnNpb247CiAgY2hhdENvbmZpZy5yb3N0ZXJFeHBhbmRlZCA9IHJvc3RlckV4cGFuZGVkOwogIGNoYXRDb25maWcubG9jYWxlID0gbG9jYWxlOwogIGNoYXRDb25maWcuaXNSZWZyZXNoID0gaXNSZWZyZXNoOwogIGNoYXRDb25maWcuc2hvd0hpZGVDaGF0T3B0aW9uID0gc2hvd0hpZGVDaGF0T3B0aW9uOwogIGNoYXRDb25maWcuaGlkZU1lTmFtZSA9IGhpZGVNZU5hbWU7CiAgY2hhdENvbmZpZy5oaWRlUHJvZmlsZUNhcmQgPSBoaWRlUHJvZmlsZUNhcmQ7CiAgY2hhdENvbmZpZy5oaWRlRW1haWwgPSBoaWRlRW1haWw7CiAgY2hhdENvbmZpZy5oaWRlUm9zdGVyRm9vdGVyID0gaGlkZVJvc3RlckZvb3RlcjsKICBjaGF0Q29uZmlnLmhpZGVTdGF0dXNNc2dzID0gaGlkZVN0YXR1c01zZ3M7CiAgY2hhdENvbmZpZy5oaWRlUm9zdGVyT3B0aW9ucyA9IGhpZGVSb3N0ZXJPcHRpb25zOwogIGNoYXRDb25maWcuaGlkZUZpbmRGcmllbmRzID0gaGlkZUZpbmRGcmllbmRzOwogIGNoYXRDb25maWcuaGlkZVJlY2VudENvbnZlcnNhdGlvbnMgPSBoaWRlUmVjZW50Q29udmVyc2F0aW9uczsKICBjaGF0Q29uZmlnLmhpZGVPVFIgPSBoaWRlT1RSOwogIGNoYXRDb25maWcubG9nVG9Ib3N0TGV2ZWwgPSBsb2dUb0hvc3RMZXZlbDsKICBjaGF0Q29uZmlnLnNlbmRTZXJ2ZXJNZXNzYWdlc1RvSG9zdCA9IHNlbmRTZXJ2ZXJNZXNzYWdlc1RvSG9zdDsKICBjaGF0Q29uZmlnLm5vQ29va2llQ2hhbm5lbCA9IG5vQ29va2llQ2hhbm5lbDsKICBjaGF0Q29uZmlnLmlzQ2VudHJhbFJvc3RlciA9IGlzQ2VudHJhbFJvc3RlcjsKICBjaGF0Q29uZmlnLmV4cGVjdGVkV2lkZ2V0cyA9IGV4cGVjdGVkV2lkZ2V0czsKICBjaGF0Q29uZmlnLmZpbGVUcmFuc2Zlck1heEZpbGVTaXplID0gZmlsZVRyYW5zZmVyTWF4RmlsZVNpemU7CiAgY2hhdENvbmZpZy5tYXhRdWlja2xpc3RIZWlnaHQgPSBtYXhRdWlja2xpc3RIZWlnaHQ7CiAgY2hhdENvbmZpZy5hbHdheXNTaG93Um9zdGVyQXZhdGFycyA9IGFsd2F5c1Nob3dSb3N0ZXJBdmF0YXJzOwogIGNoYXRDb25maWcuZW5hYmxlRnVsbEhlaWdodFJvc3RlciA9IGVuYWJsZUZ1bGxIZWlnaHRSb3N0ZXI7CiAgY2hhdENvbmZpZy5lbmFibGVQcmVzZW5jZUF0VG9wID0gZW5hYmxlUHJlc2VuY2VBdFRvcDsKICBjaGF0Q29uZmlnLmVuYWJsZUV4cGFuZGVkUHJlc2VuY2VNZW51ID0gZW5hYmxlRXhwYW5kZWRQcmVzZW5jZU1lbnU7CiAgY2hhdENvbmZpZy51c2VNb2xlVGl0bGVTcHJpdGVzID0gdXNlTW9sZVRpdGxlU3ByaXRlczsKICBjaGF0Q29uZmlnLmVuYWJsZUVkaXRhYmxlU3RhdHVzQmFyID0gZW5hYmxlRWRpdGFibGVTdGF0dXNCYXI7CiAgY2hhdENvbmZpZy5maXhlZFF1aWNrbGlzdFNpemUgPSBmaXhlZFF1aWNrbGlzdFNpemU7CiAgY2hhdENvbmZpZy5kZWZhdWx0UXVpY2tsaXN0U2l6ZU9wdGlvbiA9IGRlZmF1bHRRdWlja2xpc3RTaXplT3B0aW9uOwogIGNoYXRDb25maWcuYWx3YXlzU2hvd01vbGVBdmF0YXJzID0gYWx3YXlzU2hvd01vbGVBdmF0YXJzOwogIGNoYXRDb25maWcuaGFuZ291dEJhc2VVcmwgPSBoYW5nb3V0QmFzZVVybDsKICBjaGF0Q29uZmlnLmpvaW50bHlCYXNlVXJsID0gam9pbnRseUJhc2VVcmw7CiAgY2hhdENvbmZpZy52ZXJpZmljYXRpb25VcmwgPSB2ZXJpZmljYXRpb25VcmwgfHwgbnVsbDsKICBjaGF0Q29uZmlnLnhwY0NvbmZpZyA9IHhwY0NvbmZpZzsKICBjaGF0Q29uZmlnLnNob3dTaWduT3V0ID0gc2hvd1NpZ25PdXQ7CiAgY2hhdENvbmZpZy5oaWRlUXVpY2tsaXN0T25TaWdub3V0ID0gaGlkZVF1aWNrbGlzdE9uU2lnbm91dDsKICBjaGF0Q29uZmlnLmZvcmNlSGlnaFJlc1ZpZGVvID0gZm9yY2VIaWdoUmVzVmlkZW87CiAgY2hhdENvbmZpZy5oaWRlU21zTWVudUl0ZW1zID0gaGlkZVNtc01lbnVJdGVtczsKICBjaGF0Q29uZmlnLnNob3dIYW5nb3V0Um9zdGVySXRlbSA9IHNob3dIYW5nb3V0Um9zdGVySXRlbTsKICBjaGF0Q29uZmlnLmFsbG93RWFybHlOb25CdWZmZXJlZEJjRGV0ZWN0aW9uID0gYWxsb3dFYXJseU5vbkJ1ZmZlcmVkQmNEZXRlY3Rpb247CiAgY2hhdENvbmZpZy5wdnRQcm92aWRlZCA9IHB2dFByb3ZpZGVkOwogIGNoYXRDb25maWcuZW5hYmxlQ2hpcHMgPSBlbmFibGVDaGlwczsKICBjaGF0Q29uZmlnLmluaXRpYWxNdXRlQ2FtZXJhTWljID0gaW5pdGlhbE11dGVDYW1lcmFNaWM7CiAgY2hhdENvbmZpZy5mdWxsTW9kdWxlVXJsID0gZnVsbE1vZHVsZVVybDsKICBjaGF0Q29uZmlnLmZvcmNlSWVVbmxvYWREZXRlY3Rpb24gPSBmb3JjZUllVW5sb2FkRGV0ZWN0aW9uOwogIGNoYXRDb25maWcucGF1c2VBdExpdGUgPSBwYXVzZUF0TGl0ZTsKICBjaGF0Q29uZmlnLmVuYWJsZUludml0ZUNvbmZpcm1hdGlvbkRpYWxvZyA9IGVuYWJsZUludml0ZUNvbmZpcm1hdGlvbkRpYWxvZzsKICBjaGF0Q29uZmlnLnVzZVF1YXNhclBhbmVscyA9IHVzZVF1YXNhclBhbmVsczsKICBjaGF0Q29uZmlnLnVzZUF1dG9jb21wbGV0ZVdpdGhQaWN0dXJlcyA9IHVzZUF1dG9jb21wbGV0ZVdpdGhQaWN0dXJlczsKICByZXR1cm4gY2hhdENvbmZpZwp9OwpjaGF0LmNsaWVudC5SZWFkT25seUNvbmZpZy5nZXQgPSBmdW5jdGlvbiAkY2hhdCRjbGllbnQkUmVhZE9ubHlDb25maWckZ2V0JChhcHBDb250ZXh0KSB7CiAgcmV0dXJuIGFwcENvbnRleHQuZ2V0KGNoYXQuY2xpZW50LlJlYWRPbmx5Q29uZmlnLlNFUlZJQ0VfSUQpCn07CmNoYXQuY2xpZW50LlJlYWRPbmx5Q29uZmlnLnByb3RvdHlwZS5yZWdpc3RlciA9IGZ1bmN0aW9uICRjaGF0JGNsaWVudCRSZWFkT25seUNvbmZpZyQkcmVnaXN0ZXIkKGFwcENvbnRleHQpIHsKICBnb29nLmlzTnVsbChhcHBDb250ZXh0LmdldE9yTnVsbChjaGF0LmNsaWVudC5SZWFkT25seUNvbmZpZy5TRVJWSUNFX0lEKSkgJiYgYXBwQ29udGV4dC5yZWdpc3RlclNlcnZpY2UoY2hhdC5jbGllbnQuUmVhZE9ubHlDb25maWcuU0VSVklDRV9JRCwgdGhpcykKfTsKZ29vZy5leHBvcnRTeW1ib2woIkdvb2dsZUNoYXRfR2V0Q29uZmlnIiwgY2hhdC5jbGllbnQuUmVhZE9ubHlDb25maWcuZnJvbUxpc3QpOwpjaGF0LmNsaWVudC5FeHBlcmltZW50TWFuYWdlciA9IGZ1bmN0aW9uICRjaGF0JGNsaWVudCRFeHBlcmltZW50TWFuYWdlciQoYXBwQ29udGV4dCkgewogIHRoaXMubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigiY2hhdC5jbGllbnQuRXhwZXJpbWVudE1hbmFnZXIiKTsKICB0aGlzLnJlYWRPbmx5Q29uZmlnXyA9IGNoYXQuY2xpZW50LlJlYWRPbmx5Q29uZmlnLmdldChhcHBDb250ZXh0KTsKICB0aGlzLm5vdGlmaWNhdGlvbkZlYXR1cmVzXyA9IG5ldyBnb29nLnN0cnVjdHMuU2V0KHRoaXMucmVhZE9ubHlDb25maWdfLmZlYXR1cmVDb2RlcykKfTsKY2hhdC5jbGllbnQuRXhwZXJpbWVudE1hbmFnZXIuU0VSVklDRV9JRCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImNoYXQuY2xpZW50LkV4cGVyaW1lbnRNYW5hZ2VyIik7CmNoYXQuY2xpZW50LkV4cGVyaW1lbnRNYW5hZ2VyLnJlZ2lzdGVyID0gZnVuY3Rpb24gJGNoYXQkY2xpZW50JEV4cGVyaW1lbnRNYW5hZ2VyJHJlZ2lzdGVyJChhcHBDb250ZXh0KSB7CiAgdmFyIGV4cGVyaW1lbnRNYW5hZ2VyID0gbmV3IGNoYXQuY2xpZW50LkV4cGVyaW1lbnRNYW5hZ2VyKGFwcENvbnRleHQpOwogIGFwcENvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKGNoYXQuY2xpZW50LkV4cGVyaW1lbnRNYW5hZ2VyLlNFUlZJQ0VfSUQsIGV4cGVyaW1lbnRNYW5hZ2VyKTsKICByZXR1cm4gZXhwZXJpbWVudE1hbmFnZXIKfTsKY2hhdC5jbGllbnQuRXhwZXJpbWVudE1hbmFnZXIuZ2V0ID0gZnVuY3Rpb24gJGNoYXQkY2xpZW50JEV4cGVyaW1lbnRNYW5hZ2VyJGdldCQoYXBwQ29udGV4dCkgewogIHJldHVybiBhcHBDb250ZXh0LmdldChjaGF0LmNsaWVudC5FeHBlcmltZW50TWFuYWdlci5TRVJWSUNFX0lEKQp9OwpjaGF0LmNsaWVudC5FeHBlcmltZW50TWFuYWdlci5wcm90b3R5cGUuaXNJbkV4cGVyaW1lbnQgPSBmdW5jdGlvbiAkY2hhdCRjbGllbnQkRXhwZXJpbWVudE1hbmFnZXIkJGlzSW5FeHBlcmltZW50JChleHBlcmltZW50SWQpIHsKICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25GZWF0dXJlc18uY29udGFpbnMoZXhwZXJpbWVudElkKQp9OwpjaGF0LmNsaWVudC5FeHBlcmltZW50TWFuYWdlci5FeHBlcmltZW50cyA9IGNoYXQuY2xpZW50LkV4cGVyaW1lbnRzOwpjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlU2VuZGVyID0gZnVuY3Rpb24gJGNoYXQkY2xpZW50JFNlcnZlck1lc3NhZ2VTZW5kZXIkKHNlbmRUb1NlcnZlciwgc2VuZE1lc3NhZ2VUb1NlcnZlcikgewogIGdvb2cuRGlzcG9zYWJsZS5jYWxsKHRoaXMpOwogIHRoaXMubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigiY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZVNlbmRlciIpOwogIHRoaXMuc2VuZFRvU2VydmVyXyA9IHNlbmRUb1NlcnZlcjsKICB0aGlzLnNlbmRNZXNzYWdlVG9TZXJ2ZXJfID0gc2VuZE1lc3NhZ2VUb1NlcnZlcgp9Owpnb29nLmluaGVyaXRzKGNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VTZW5kZXIsIGdvb2cuRGlzcG9zYWJsZSk7CmNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VTZW5kZXIuU0VSVklDRV9JRCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VTZW5kZXIiKTsKY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZVNlbmRlci5Ob3RpZmljYXRpb25TdGF0ZVR5cGUgPSB7Tk9STUFMOiJub3JtYWwiLCBNSU5JTUlaRUQ6Im1pbmltaXplZCIsIE1BWElNSVpFRDoibWF4aW1pemVkIiwgQ0xPU0VEOiJjbG9zZWQifTsKY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZVNlbmRlci5nZXQgPSBmdW5jdGlvbiAkY2hhdCRjbGllbnQkU2VydmVyTWVzc2FnZVNlbmRlciRnZXQkKGFwcENvbnRleHQpIHsKICByZXR1cm4gYXBwQ29udGV4dC5nZXQoY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZVNlbmRlci5TRVJWSUNFX0lEKQp9OwpjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlU2VuZGVyLnJlZ2lzdGVyID0gZnVuY3Rpb24gJGNoYXQkY2xpZW50JFNlcnZlck1lc3NhZ2VTZW5kZXIkcmVnaXN0ZXIkKGFwcENvbnRleHQsIHNlbmRUb1NlcnZlciwgc2VuZE1lc3NhZ2VUb1NlcnZlcikgewogIHZhciBzZXJ2ZXJNZXNzYWdlU2VuZGVyID0gbmV3IGNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VTZW5kZXIoc2VuZFRvU2VydmVyLCBzZW5kTWVzc2FnZVRvU2VydmVyKTsKICBhcHBDb250ZXh0LnJlZ2lzdGVyU2VydmljZShjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlU2VuZGVyLlNFUlZJQ0VfSUQsIHNlcnZlck1lc3NhZ2VTZW5kZXIpOwogIHJldHVybiBzZXJ2ZXJNZXNzYWdlU2VuZGVyCn07CmNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VTZW5kZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRjaGF0JGNsaWVudCRTZXJ2ZXJNZXNzYWdlU2VuZGVyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VTZW5kZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5zZW5kTWVzc2FnZVRvU2VydmVyXyA9IHRoaXMuc2VuZFRvU2VydmVyXyA9IG51bGwKfTsKY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZVNlbmRlci5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uICRjaGF0JGNsaWVudCRTZXJ2ZXJNZXNzYWdlU2VuZGVyJCRzZW5kJChtZXNzYWdlKSB7CiAgdGhpcy5sb2dnZXJfLmZpbmVzdCgic2VuZDogIiArIG1lc3NhZ2UudG9TdHJpbmcoKSk7CiAgdGhpcy5zZW5kTWVzc2FnZVRvU2VydmVyXyhtZXNzYWdlKQp9OwpjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlU2VuZGVyLnByb3RvdHlwZS5zZW5kVXNlclNldHRpbmcgPSBmdW5jdGlvbiAkY2hhdCRjbGllbnQkU2VydmVyTWVzc2FnZVNlbmRlciQkc2VuZFVzZXJTZXR0aW5nJChuYW1lLCB2YWx1ZSkgewogIHRoaXMuc2VuZFRvU2VydmVyXyhbInNjIiwgbmFtZSwgdmFsdWVdKQp9OwpjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlU2VuZGVyLnByb3RvdHlwZS5zZW5kUXVpY2tsaXN0U2l6ZSA9IGZ1bmN0aW9uICRjaGF0JGNsaWVudCRTZXJ2ZXJNZXNzYWdlU2VuZGVyJCRzZW5kUXVpY2tsaXN0U2l6ZSQoc2l6ZSkgewogIHRoaXMuc2VuZFRvU2VydmVyXyhbInFzIiwgc2l6ZV0pCn07CmNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VTZW5kZXIucHJvdG90eXBlLnNlbmRVc2VyUHJlc2VuY2UgPSBmdW5jdGlvbiAkY2hhdCRjbGllbnQkU2VydmVyTWVzc2FnZVNlbmRlciQkc2VuZFVzZXJQcmVzZW5jZSQoc2hvdywgc3RhdHVzLCBpc0ludmlzaWJsZSkgewogIHRoaXMuc2VuZFRvU2VydmVyXyhbInB1Iiwgc2hvdywgc3RhdHVzLCBpc0ludmlzaWJsZV0pCn07Cmdvb2cudXJpID0ge307Cmdvb2cudXJpLnV0aWxzID0ge307Cmdvb2cudXJpLnV0aWxzLkNoYXJDb2RlXyA9IHtBTVBFUlNBTkQ6MzgsIEVRVUFMOjYxLCBIQVNIOjM1LCBRVUVTVElPTjo2M307Cmdvb2cudXJpLnV0aWxzLmJ1aWxkRnJvbUVuY29kZWRQYXJ0cyA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRidWlsZEZyb21FbmNvZGVkUGFydHMkKG9wdF9zY2hlbWUsIG9wdF91c2VySW5mbywgb3B0X2RvbWFpbiwgb3B0X3BvcnQsIG9wdF9wYXRoLCBvcHRfcXVlcnlEYXRhLCBvcHRfZnJhZ21lbnQpIHsKICB2YXIgb3V0ID0gW107CiAgb3B0X3NjaGVtZSAmJiBvdXQucHVzaChvcHRfc2NoZW1lLCAiOiIpOwogIG9wdF9kb21haW4gJiYgKG91dC5wdXNoKCIvLyIpLCBvcHRfdXNlckluZm8gJiYgb3V0LnB1c2gob3B0X3VzZXJJbmZvLCAiQCIpLCBvdXQucHVzaChvcHRfZG9tYWluKSwgb3B0X3BvcnQgJiYgb3V0LnB1c2goIjoiLCBvcHRfcG9ydCkpOwogIG9wdF9wYXRoICYmIG91dC5wdXNoKG9wdF9wYXRoKTsKICBvcHRfcXVlcnlEYXRhICYmIG91dC5wdXNoKCI/Iiwgb3B0X3F1ZXJ5RGF0YSk7CiAgb3B0X2ZyYWdtZW50ICYmIG91dC5wdXNoKCIjIiwgb3B0X2ZyYWdtZW50KTsKICByZXR1cm4gb3V0LmpvaW4oIiIpCn07Cmdvb2cudXJpLnV0aWxzLnNwbGl0UmVfID0gUmVnRXhwKCJeKD86KFteOi8/Iy5dKyk6KT8oPzovLyg/OihbXi8/I10qKUApPyhbXFx3XFxkXFwtXFx1MDEwMC1cXHVmZmZmLiVdKikoPzo6KFswLTldKykpPyk/KFtePyNdKyk/KD86XFw/KFteI10qKSk/KD86IyguKikpPyQiKTsKZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXggPSB7U0NIRU1FOjEsIFVTRVJfSU5GTzoyLCBET01BSU46MywgUE9SVDo0LCBQQVRIOjUsIFFVRVJZX0RBVEE6NiwgRlJBR01FTlQ6N307Cmdvb2cudXJpLnV0aWxzLnNwbGl0ID0gZnVuY3Rpb24gJGdvb2ckdXJpJHV0aWxzJHNwbGl0JCh1cmkpIHsKICBnb29nLnVyaS51dGlscy5waGlzaGluZ1Byb3RlY3Rpb25fKCk7CiAgcmV0dXJuIHVyaS5tYXRjaChnb29nLnVyaS51dGlscy5zcGxpdFJlXykKfTsKZ29vZy51cmkudXRpbHMubmVlZHNQaGlzaGluZ1Byb3RlY3Rpb25fID0gZ29vZy51c2VyQWdlbnQuV0VCS0lUOwpnb29nLnVyaS51dGlscy5waGlzaGluZ1Byb3RlY3Rpb25fID0gZnVuY3Rpb24gJGdvb2ckdXJpJHV0aWxzJHBoaXNoaW5nUHJvdGVjdGlvbl8kKCkgewogIGlmKGdvb2cudXJpLnV0aWxzLm5lZWRzUGhpc2hpbmdQcm90ZWN0aW9uXykgewogICAgZ29vZy51cmkudXRpbHMubmVlZHNQaGlzaGluZ1Byb3RlY3Rpb25fID0gITE7CiAgICB2YXIgbG9jYXRpb24gPSBnb29nLmdsb2JhbC5sb2NhdGlvbjsKICAgIGlmKGxvY2F0aW9uKSB7CiAgICAgIHZhciBocmVmID0gbG9jYXRpb24uaHJlZjsKICAgICAgaWYoaHJlZikgewogICAgICAgIHZhciBkb21haW4gPSBnb29nLnVyaS51dGlscy5nZXREb21haW4oaHJlZik7CiAgICAgICAgaWYoZG9tYWluICYmIGRvbWFpbiAhPSBsb2NhdGlvbi5ob3N0bmFtZSkgewogICAgICAgICAgdGhyb3cgZ29vZy51cmkudXRpbHMubmVlZHNQaGlzaGluZ1Byb3RlY3Rpb25fID0gITAsIEVycm9yKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9Owpnb29nLnVyaS51dGlscy5kZWNvZGVJZlBvc3NpYmxlXyA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRkZWNvZGVJZlBvc3NpYmxlXyQodXJpKSB7CiAgcmV0dXJuIHVyaSAmJiBkZWNvZGVVUklDb21wb25lbnQodXJpKQp9Owpnb29nLnVyaS51dGlscy5nZXRDb21wb25lbnRCeUluZGV4XyA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRnZXRDb21wb25lbnRCeUluZGV4XyQoY29tcG9uZW50SW5kZXgsIHVyaSkgewogIHJldHVybiBnb29nLnVyaS51dGlscy5zcGxpdCh1cmkpW2NvbXBvbmVudEluZGV4XSB8fCBudWxsCn07Cmdvb2cudXJpLnV0aWxzLmdldFNjaGVtZSA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRnZXRTY2hlbWUkKHVyaSkgewogIHJldHVybiBnb29nLnVyaS51dGlscy5nZXRDb21wb25lbnRCeUluZGV4Xyhnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5TQ0hFTUUsIHVyaSkKfTsKZ29vZy51cmkudXRpbHMuZ2V0RWZmZWN0aXZlU2NoZW1lID0gZnVuY3Rpb24gJGdvb2ckdXJpJHV0aWxzJGdldEVmZmVjdGl2ZVNjaGVtZSQodXJpKSB7CiAgdmFyIHNjaGVtZSA9IGdvb2cudXJpLnV0aWxzLmdldFNjaGVtZSh1cmkpOwogIGlmKCFzY2hlbWUgJiYgc2VsZi5sb2NhdGlvbikgewogICAgdmFyIHByb3RvY29sID0gc2VsZi5sb2NhdGlvbi5wcm90b2NvbCwgc2NoZW1lID0gcHJvdG9jb2wuc3Vic3RyKDAsIHByb3RvY29sLmxlbmd0aCAtIDEpCiAgfQogIHJldHVybiBzY2hlbWUgPyBzY2hlbWUudG9Mb3dlckNhc2UoKSA6ICIiCn07Cmdvb2cudXJpLnV0aWxzLmdldFVzZXJJbmZvRW5jb2RlZCA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRnZXRVc2VySW5mb0VuY29kZWQkKHVyaSkgewogIHJldHVybiBnb29nLnVyaS51dGlscy5nZXRDb21wb25lbnRCeUluZGV4Xyhnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5VU0VSX0lORk8sIHVyaSkKfTsKZ29vZy51cmkudXRpbHMuZ2V0VXNlckluZm8gPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkZ2V0VXNlckluZm8kKHVyaSkgewogIHJldHVybiBnb29nLnVyaS51dGlscy5kZWNvZGVJZlBvc3NpYmxlXyhnb29nLnVyaS51dGlscy5nZXRVc2VySW5mb0VuY29kZWQodXJpKSkKfTsKZ29vZy51cmkudXRpbHMuZ2V0RG9tYWluRW5jb2RlZCA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRnZXREb21haW5FbmNvZGVkJCh1cmkpIHsKICByZXR1cm4gZ29vZy51cmkudXRpbHMuZ2V0Q29tcG9uZW50QnlJbmRleF8oZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguRE9NQUlOLCB1cmkpCn07Cmdvb2cudXJpLnV0aWxzLmdldERvbWFpbiA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRnZXREb21haW4kKHVyaSkgewogIHJldHVybiBnb29nLnVyaS51dGlscy5kZWNvZGVJZlBvc3NpYmxlXyhnb29nLnVyaS51dGlscy5nZXREb21haW5FbmNvZGVkKHVyaSkpCn07Cmdvb2cudXJpLnV0aWxzLmdldFBvcnQgPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkZ2V0UG9ydCQodXJpKSB7CiAgcmV0dXJuIE51bWJlcihnb29nLnVyaS51dGlscy5nZXRDb21wb25lbnRCeUluZGV4Xyhnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5QT1JULCB1cmkpKSB8fCBudWxsCn07Cmdvb2cudXJpLnV0aWxzLmdldFBhdGhFbmNvZGVkID0gZnVuY3Rpb24gJGdvb2ckdXJpJHV0aWxzJGdldFBhdGhFbmNvZGVkJCh1cmkpIHsKICByZXR1cm4gZ29vZy51cmkudXRpbHMuZ2V0Q29tcG9uZW50QnlJbmRleF8oZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguUEFUSCwgdXJpKQp9Owpnb29nLnVyaS51dGlscy5nZXRQYXRoID0gZnVuY3Rpb24gJGdvb2ckdXJpJHV0aWxzJGdldFBhdGgkKHVyaSkgewogIHJldHVybiBnb29nLnVyaS51dGlscy5kZWNvZGVJZlBvc3NpYmxlXyhnb29nLnVyaS51dGlscy5nZXRQYXRoRW5jb2RlZCh1cmkpKQp9Owpnb29nLnVyaS51dGlscy5nZXRRdWVyeURhdGEgPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkZ2V0UXVlcnlEYXRhJCh1cmkpIHsKICByZXR1cm4gZ29vZy51cmkudXRpbHMuZ2V0Q29tcG9uZW50QnlJbmRleF8oZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguUVVFUllfREFUQSwgdXJpKQp9Owpnb29nLnVyaS51dGlscy5nZXRGcmFnbWVudEVuY29kZWQgPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkZ2V0RnJhZ21lbnRFbmNvZGVkJCh1cmkpIHsKICB2YXIgaGFzaEluZGV4ID0gdXJpLmluZGV4T2YoIiMiKTsKICByZXR1cm4gMCA+IGhhc2hJbmRleCA/IG51bGwgOiB1cmkuc3Vic3RyKGhhc2hJbmRleCArIDEpCn07Cmdvb2cudXJpLnV0aWxzLnNldEZyYWdtZW50RW5jb2RlZCA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRzZXRGcmFnbWVudEVuY29kZWQkKHVyaSwgZnJhZ21lbnQpIHsKICByZXR1cm4gZ29vZy51cmkudXRpbHMucmVtb3ZlRnJhZ21lbnQodXJpKSArIChmcmFnbWVudCA/ICIjIiArIGZyYWdtZW50IDogIiIpCn07Cmdvb2cudXJpLnV0aWxzLmdldEZyYWdtZW50ID0gZnVuY3Rpb24gJGdvb2ckdXJpJHV0aWxzJGdldEZyYWdtZW50JCh1cmkpIHsKICByZXR1cm4gZ29vZy51cmkudXRpbHMuZGVjb2RlSWZQb3NzaWJsZV8oZ29vZy51cmkudXRpbHMuZ2V0RnJhZ21lbnRFbmNvZGVkKHVyaSkpCn07Cmdvb2cudXJpLnV0aWxzLmdldEhvc3QgPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkZ2V0SG9zdCQodXJpKSB7CiAgdmFyIHBpZWNlcyA9IGdvb2cudXJpLnV0aWxzLnNwbGl0KHVyaSk7CiAgcmV0dXJuIGdvb2cudXJpLnV0aWxzLmJ1aWxkRnJvbUVuY29kZWRQYXJ0cyhwaWVjZXNbZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguU0NIRU1FXSwgcGllY2VzW2dvb2cudXJpLnV0aWxzLkNvbXBvbmVudEluZGV4LlVTRVJfSU5GT10sIHBpZWNlc1tnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5ET01BSU5dLCBwaWVjZXNbZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguUE9SVF0pCn07Cmdvb2cudXJpLnV0aWxzLmdldFBhdGhBbmRBZnRlciA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRnZXRQYXRoQW5kQWZ0ZXIkKHVyaSkgewogIHZhciBwaWVjZXMgPSBnb29nLnVyaS51dGlscy5zcGxpdCh1cmkpOwogIHJldHVybiBnb29nLnVyaS51dGlscy5idWlsZEZyb21FbmNvZGVkUGFydHMobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgcGllY2VzW2dvb2cudXJpLnV0aWxzLkNvbXBvbmVudEluZGV4LlBBVEhdLCBwaWVjZXNbZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguUVVFUllfREFUQV0sIHBpZWNlc1tnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5GUkFHTUVOVF0pCn07Cmdvb2cudXJpLnV0aWxzLnJlbW92ZUZyYWdtZW50ID0gZnVuY3Rpb24gJGdvb2ckdXJpJHV0aWxzJHJlbW92ZUZyYWdtZW50JCh1cmkpIHsKICB2YXIgaGFzaEluZGV4ID0gdXJpLmluZGV4T2YoIiMiKTsKICByZXR1cm4gMCA+IGhhc2hJbmRleCA/IHVyaSA6IHVyaS5zdWJzdHIoMCwgaGFzaEluZGV4KQp9Owpnb29nLnVyaS51dGlscy5oYXZlU2FtZURvbWFpbiA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRoYXZlU2FtZURvbWFpbiQodXJpMSwgdXJpMikgewogIHZhciBwaWVjZXMxID0gZ29vZy51cmkudXRpbHMuc3BsaXQodXJpMSksIHBpZWNlczIgPSBnb29nLnVyaS51dGlscy5zcGxpdCh1cmkyKTsKICByZXR1cm4gcGllY2VzMVtnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5ET01BSU5dID09IHBpZWNlczJbZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguRE9NQUlOXSAmJiBwaWVjZXMxW2dvb2cudXJpLnV0aWxzLkNvbXBvbmVudEluZGV4LlNDSEVNRV0gPT0gcGllY2VzMltnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5TQ0hFTUVdICYmIHBpZWNlczFbZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguUE9SVF0gPT0gcGllY2VzMltnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5QT1JUXQp9Owpnb29nLnVyaS51dGlscy5hc3NlcnROb0ZyYWdtZW50c09yUXVlcmllc18gPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkYXNzZXJ0Tm9GcmFnbWVudHNPclF1ZXJpZXNfJCh1cmkpIHsKICBpZihnb29nLkRFQlVHICYmICgwIDw9IHVyaS5pbmRleE9mKCIjIikgfHwgMCA8PSB1cmkuaW5kZXhPZigiPyIpKSkgewogICAgdGhyb3cgRXJyb3IoImdvb2cudXJpLnV0aWxzOiBGcmFnbWVudCBvciBxdWVyeSBpZGVudGlmaWVycyBhcmUgbm90IHN1cHBvcnRlZDogWyIgKyB1cmkgKyAiXSIpOwogIH0KfTsKZ29vZy51cmkudXRpbHMuYXBwZW5kUXVlcnlEYXRhXyA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRhcHBlbmRRdWVyeURhdGFfJChidWZmZXIpIHsKICBpZihidWZmZXJbMV0pIHsKICAgIHZhciBiYXNlVXJpID0gYnVmZmVyWzBdLCBoYXNoSW5kZXggPSBiYXNlVXJpLmluZGV4T2YoIiMiKTsKICAgIDAgPD0gaGFzaEluZGV4ICYmIChidWZmZXIucHVzaChiYXNlVXJpLnN1YnN0cihoYXNoSW5kZXgpKSwgYnVmZmVyWzBdID0gYmFzZVVyaSA9IGJhc2VVcmkuc3Vic3RyKDAsIGhhc2hJbmRleCkpOwogICAgdmFyIHF1ZXN0aW9uSW5kZXggPSBiYXNlVXJpLmluZGV4T2YoIj8iKTsKICAgIDAgPiBxdWVzdGlvbkluZGV4ID8gYnVmZmVyWzFdID0gIj8iIDogcXVlc3Rpb25JbmRleCA9PSBiYXNlVXJpLmxlbmd0aCAtIDEgJiYgKGJ1ZmZlclsxXSA9IHZvaWQgMCkKICB9CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKQp9Owpnb29nLnVyaS51dGlscy5hcHBlbmRLZXlWYWx1ZVBhaXJzXyA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRhcHBlbmRLZXlWYWx1ZVBhaXJzXyQoa2V5LCB2YWx1ZSwgcGFpcnMpIHsKICBpZihnb29nLmlzQXJyYXkodmFsdWUpKSB7CiAgICBmb3IodmFyIGogPSAwO2ogPCB2YWx1ZS5sZW5ndGg7aisrKSB7CiAgICAgIHBhaXJzLnB1c2goIiYiLCBrZXkpLCAiIiAhPT0gdmFsdWVbal0gJiYgcGFpcnMucHVzaCgiPSIsIGdvb2cuc3RyaW5nLnVybEVuY29kZSh2YWx1ZVtqXSkpCiAgICB9CiAgfWVsc2UgewogICAgbnVsbCAhPSB2YWx1ZSAmJiAocGFpcnMucHVzaCgiJiIsIGtleSksICIiICE9PSB2YWx1ZSAmJiBwYWlycy5wdXNoKCI9IiwgZ29vZy5zdHJpbmcudXJsRW5jb2RlKHZhbHVlKSkpCiAgfQp9Owpnb29nLnVyaS51dGlscy5idWlsZFF1ZXJ5RGF0YUJ1ZmZlcl8gPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkYnVpbGRRdWVyeURhdGFCdWZmZXJfJChidWZmZXIsIGtleXNBbmRWYWx1ZXMsIG9wdF9zdGFydEluZGV4KSB7CiAgZ29vZy5hc3NlcnRzLmFzc2VydCgwID09IE1hdGgubWF4KGtleXNBbmRWYWx1ZXMubGVuZ3RoIC0gKG9wdF9zdGFydEluZGV4IHx8IDApLCAwKSAlIDIsICJnb29nLnVyaS51dGlsczogS2V5L3ZhbHVlIGxpc3RzIG11c3QgYmUgZXZlbiBpbiBsZW5ndGguIik7CiAgZm9yKHZhciBpID0gb3B0X3N0YXJ0SW5kZXggfHwgMDtpIDwga2V5c0FuZFZhbHVlcy5sZW5ndGg7aSArPSAyKSB7CiAgICBnb29nLnVyaS51dGlscy5hcHBlbmRLZXlWYWx1ZVBhaXJzXyhrZXlzQW5kVmFsdWVzW2ldLCBrZXlzQW5kVmFsdWVzW2kgKyAxXSwgYnVmZmVyKQogIH0KICByZXR1cm4gYnVmZmVyCn07Cmdvb2cudXJpLnV0aWxzLmJ1aWxkUXVlcnlEYXRhID0gZnVuY3Rpb24gJGdvb2ckdXJpJHV0aWxzJGJ1aWxkUXVlcnlEYXRhJChrZXlzQW5kVmFsdWVzLCBvcHRfc3RhcnRJbmRleCkgewogIHZhciBidWZmZXIgPSBnb29nLnVyaS51dGlscy5idWlsZFF1ZXJ5RGF0YUJ1ZmZlcl8oW10sIGtleXNBbmRWYWx1ZXMsIG9wdF9zdGFydEluZGV4KTsKICBidWZmZXJbMF0gPSAiIjsKICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpCn07Cmdvb2cudXJpLnV0aWxzLmJ1aWxkUXVlcnlEYXRhQnVmZmVyRnJvbU1hcF8gPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkYnVpbGRRdWVyeURhdGFCdWZmZXJGcm9tTWFwXyQoYnVmZmVyLCBtYXApIHsKICBmb3IodmFyIGtleSBpbiBtYXApIHsKICAgIGdvb2cudXJpLnV0aWxzLmFwcGVuZEtleVZhbHVlUGFpcnNfKGtleSwgbWFwW2tleV0sIGJ1ZmZlcikKICB9CiAgcmV0dXJuIGJ1ZmZlcgp9Owpnb29nLnVyaS51dGlscy5idWlsZFF1ZXJ5RGF0YUZyb21NYXAgPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkYnVpbGRRdWVyeURhdGFGcm9tTWFwJChtYXApIHsKICB2YXIgYnVmZmVyID0gZ29vZy51cmkudXRpbHMuYnVpbGRRdWVyeURhdGFCdWZmZXJGcm9tTWFwXyhbXSwgbWFwKTsKICBidWZmZXJbMF0gPSAiIjsKICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpCn07Cmdvb2cudXJpLnV0aWxzLmFwcGVuZFBhcmFtcyA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRhcHBlbmRQYXJhbXMkKHVyaSwgdmFyX2FyZ3MpIHsKICByZXR1cm4gZ29vZy51cmkudXRpbHMuYXBwZW5kUXVlcnlEYXRhXygyID09IGFyZ3VtZW50cy5sZW5ndGggPyBnb29nLnVyaS51dGlscy5idWlsZFF1ZXJ5RGF0YUJ1ZmZlcl8oW3VyaV0sIGFyZ3VtZW50c1sxXSwgMCkgOiBnb29nLnVyaS51dGlscy5idWlsZFF1ZXJ5RGF0YUJ1ZmZlcl8oW3VyaV0sIGFyZ3VtZW50cywgMSkpCn07Cmdvb2cudXJpLnV0aWxzLmFwcGVuZFBhcmFtc0Zyb21NYXAgPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkYXBwZW5kUGFyYW1zRnJvbU1hcCQodXJpLCBtYXApIHsKICByZXR1cm4gZ29vZy51cmkudXRpbHMuYXBwZW5kUXVlcnlEYXRhXyhnb29nLnVyaS51dGlscy5idWlsZFF1ZXJ5RGF0YUJ1ZmZlckZyb21NYXBfKFt1cmldLCBtYXApKQp9Owpnb29nLnVyaS51dGlscy5hcHBlbmRQYXJhbSA9IGZ1bmN0aW9uICRnb29nJHVyaSR1dGlscyRhcHBlbmRQYXJhbSQodXJpLCBrZXksIHZhbHVlKSB7CiAgcmV0dXJuIGdvb2cudXJpLnV0aWxzLmFwcGVuZFF1ZXJ5RGF0YV8oW3VyaSwgIiYiLCBrZXksICI9IiwgZ29vZy5zdHJpbmcudXJsRW5jb2RlKHZhbHVlKV0pCn07Cmdvb2cudXJpLnV0aWxzLmZpbmRQYXJhbV8gPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkZmluZFBhcmFtXyQodXJpLCBzdGFydEluZGV4LCBrZXlFbmNvZGVkLCBoYXNoT3JFbmRJbmRleCkgewogIGZvcih2YXIgaW5kZXggPSBzdGFydEluZGV4LCBrZXlMZW5ndGggPSBrZXlFbmNvZGVkLmxlbmd0aDswIDw9IChpbmRleCA9IHVyaS5pbmRleE9mKGtleUVuY29kZWQsIGluZGV4KSkgJiYgaW5kZXggPCBoYXNoT3JFbmRJbmRleDspIHsKICAgIHZhciBwcmVjZWRpbmdDaGFyID0gdXJpLmNoYXJDb2RlQXQoaW5kZXggLSAxKTsKICAgIGlmKHByZWNlZGluZ0NoYXIgPT0gZ29vZy51cmkudXRpbHMuQ2hhckNvZGVfLkFNUEVSU0FORCB8fCBwcmVjZWRpbmdDaGFyID09IGdvb2cudXJpLnV0aWxzLkNoYXJDb2RlXy5RVUVTVElPTikgewogICAgICB2YXIgZm9sbG93aW5nQ2hhciA9IHVyaS5jaGFyQ29kZUF0KGluZGV4ICsga2V5TGVuZ3RoKTsKICAgICAgaWYoIWZvbGxvd2luZ0NoYXIgfHwgZm9sbG93aW5nQ2hhciA9PSBnb29nLnVyaS51dGlscy5DaGFyQ29kZV8uRVFVQUwgfHwgZm9sbG93aW5nQ2hhciA9PSBnb29nLnVyaS51dGlscy5DaGFyQ29kZV8uQU1QRVJTQU5EIHx8IGZvbGxvd2luZ0NoYXIgPT0gZ29vZy51cmkudXRpbHMuQ2hhckNvZGVfLkhBU0gpIHsKICAgICAgICByZXR1cm4gaW5kZXgKICAgICAgfQogICAgfQogICAgaW5kZXggKz0ga2V5TGVuZ3RoICsgMQogIH0KICByZXR1cm4tMQp9Owpnb29nLnVyaS51dGlscy5oYXNoT3JFbmRSZV8gPSAvI3wkLzsKZ29vZy51cmkudXRpbHMuaGFzUGFyYW0gPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkaGFzUGFyYW0kKHVyaSwga2V5RW5jb2RlZCkgewogIHJldHVybiAwIDw9IGdvb2cudXJpLnV0aWxzLmZpbmRQYXJhbV8odXJpLCAwLCBrZXlFbmNvZGVkLCB1cmkuc2VhcmNoKGdvb2cudXJpLnV0aWxzLmhhc2hPckVuZFJlXykpCn07Cmdvb2cudXJpLnV0aWxzLmdldFBhcmFtVmFsdWUgPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkZ2V0UGFyYW1WYWx1ZSQodXJpLCBrZXlFbmNvZGVkKSB7CiAgdmFyIGhhc2hPckVuZEluZGV4ID0gdXJpLnNlYXJjaChnb29nLnVyaS51dGlscy5oYXNoT3JFbmRSZV8pLCBmb3VuZEluZGV4ID0gZ29vZy51cmkudXRpbHMuZmluZFBhcmFtXyh1cmksIDAsIGtleUVuY29kZWQsIGhhc2hPckVuZEluZGV4KTsKICBpZigwID4gZm91bmRJbmRleCkgewogICAgcmV0dXJuIG51bGwKICB9CiAgdmFyIGVuZFBvc2l0aW9uID0gdXJpLmluZGV4T2YoIiYiLCBmb3VuZEluZGV4KTsKICBpZigwID4gZW5kUG9zaXRpb24gfHwgZW5kUG9zaXRpb24gPiBoYXNoT3JFbmRJbmRleCkgewogICAgZW5kUG9zaXRpb24gPSBoYXNoT3JFbmRJbmRleAogIH0KICBmb3VuZEluZGV4ICs9IGtleUVuY29kZWQubGVuZ3RoICsgMTsKICByZXR1cm4gZ29vZy5zdHJpbmcudXJsRGVjb2RlKHVyaS5zdWJzdHIoZm91bmRJbmRleCwgZW5kUG9zaXRpb24gLSBmb3VuZEluZGV4KSkKfTsKZ29vZy51cmkudXRpbHMuZ2V0UGFyYW1WYWx1ZXMgPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkZ2V0UGFyYW1WYWx1ZXMkKHVyaSwga2V5RW5jb2RlZCkgewogIGZvcih2YXIgaGFzaE9yRW5kSW5kZXggPSB1cmkuc2VhcmNoKGdvb2cudXJpLnV0aWxzLmhhc2hPckVuZFJlXyksIHBvc2l0aW9uID0gMCwgZm91bmRJbmRleCwgcmVzdWx0ID0gW107MCA8PSAoZm91bmRJbmRleCA9IGdvb2cudXJpLnV0aWxzLmZpbmRQYXJhbV8odXJpLCBwb3NpdGlvbiwga2V5RW5jb2RlZCwgaGFzaE9yRW5kSW5kZXgpKTspIHsKICAgIHBvc2l0aW9uID0gdXJpLmluZGV4T2YoIiYiLCBmb3VuZEluZGV4KTsKICAgIGlmKDAgPiBwb3NpdGlvbiB8fCBwb3NpdGlvbiA+IGhhc2hPckVuZEluZGV4KSB7CiAgICAgIHBvc2l0aW9uID0gaGFzaE9yRW5kSW5kZXgKICAgIH0KICAgIGZvdW5kSW5kZXggKz0ga2V5RW5jb2RlZC5sZW5ndGggKyAxOwogICAgcmVzdWx0LnB1c2goZ29vZy5zdHJpbmcudXJsRGVjb2RlKHVyaS5zdWJzdHIoZm91bmRJbmRleCwgcG9zaXRpb24gLSBmb3VuZEluZGV4KSkpCiAgfQogIHJldHVybiByZXN1bHQKfTsKZ29vZy51cmkudXRpbHMudHJhaWxpbmdRdWVyeVB1bmN0dWF0aW9uUmVfID0gL1s/Jl0oJHwjKS87Cmdvb2cudXJpLnV0aWxzLnJlbW92ZVBhcmFtID0gZnVuY3Rpb24gJGdvb2ckdXJpJHV0aWxzJHJlbW92ZVBhcmFtJCh1cmksIGtleUVuY29kZWQpIHsKICBmb3IodmFyIGhhc2hPckVuZEluZGV4ID0gdXJpLnNlYXJjaChnb29nLnVyaS51dGlscy5oYXNoT3JFbmRSZV8pLCBwb3NpdGlvbiA9IDAsIGZvdW5kSW5kZXgsIGJ1ZmZlciA9IFtdOzAgPD0gKGZvdW5kSW5kZXggPSBnb29nLnVyaS51dGlscy5maW5kUGFyYW1fKHVyaSwgcG9zaXRpb24sIGtleUVuY29kZWQsIGhhc2hPckVuZEluZGV4KSk7KSB7CiAgICBidWZmZXIucHVzaCh1cmkuc3Vic3RyaW5nKHBvc2l0aW9uLCBmb3VuZEluZGV4KSksIHBvc2l0aW9uID0gTWF0aC5taW4odXJpLmluZGV4T2YoIiYiLCBmb3VuZEluZGV4KSArIDEgfHwgaGFzaE9yRW5kSW5kZXgsIGhhc2hPckVuZEluZGV4KQogIH0KICBidWZmZXIucHVzaCh1cmkuc3Vic3RyKHBvc2l0aW9uKSk7CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKS5yZXBsYWNlKGdvb2cudXJpLnV0aWxzLnRyYWlsaW5nUXVlcnlQdW5jdHVhdGlvblJlXywgIiQxIikKfTsKZ29vZy51cmkudXRpbHMuc2V0UGFyYW0gPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkc2V0UGFyYW0kKHVyaSwga2V5RW5jb2RlZCwgdmFsdWUpIHsKICByZXR1cm4gZ29vZy51cmkudXRpbHMuYXBwZW5kUGFyYW0oZ29vZy51cmkudXRpbHMucmVtb3ZlUGFyYW0odXJpLCBrZXlFbmNvZGVkKSwga2V5RW5jb2RlZCwgdmFsdWUpCn07Cmdvb2cudXJpLnV0aWxzLmFwcGVuZFBhdGggPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkYXBwZW5kUGF0aCQoYmFzZVVyaSwgcGF0aCkgewogIGdvb2cudXJpLnV0aWxzLmFzc2VydE5vRnJhZ21lbnRzT3JRdWVyaWVzXyhiYXNlVXJpKTsKICBnb29nLnN0cmluZy5lbmRzV2l0aChiYXNlVXJpLCAiLyIpICYmIChiYXNlVXJpID0gYmFzZVVyaS5zdWJzdHIoMCwgYmFzZVVyaS5sZW5ndGggLSAxKSk7CiAgZ29vZy5zdHJpbmcuc3RhcnRzV2l0aChwYXRoLCAiLyIpICYmIChwYXRoID0gcGF0aC5zdWJzdHIoMSkpOwogIHJldHVybiBnb29nLnN0cmluZy5idWlsZFN0cmluZyhiYXNlVXJpLCAiLyIsIHBhdGgpCn07Cmdvb2cudXJpLnV0aWxzLlN0YW5kYXJkUXVlcnlQYXJhbSA9IHtSQU5ET006Inp4In07Cmdvb2cudXJpLnV0aWxzLm1ha2VVbmlxdWUgPSBmdW5jdGlvbiAkZ29vZyR1cmkkdXRpbHMkbWFrZVVuaXF1ZSQodXJpKSB7CiAgcmV0dXJuIGdvb2cudXJpLnV0aWxzLnNldFBhcmFtKHVyaSwgZ29vZy51cmkudXRpbHMuU3RhbmRhcmRRdWVyeVBhcmFtLlJBTkRPTSwgZ29vZy5zdHJpbmcuZ2V0UmFuZG9tU3RyaW5nKCkpCn07Cmdvb2cubmV0ID0ge307Cmdvb2cubmV0LkVycm9yQ29kZSA9IHtOT19FUlJPUjowLCBBQ0NFU1NfREVOSUVEOjEsIEZJTEVfTk9UX0ZPVU5EOjIsIEZGX1NJTEVOVF9FUlJPUjozLCBDVVNUT01fRVJST1I6NCwgRVhDRVBUSU9OOjUsIEhUVFBfRVJST1I6NiwgQUJPUlQ6NywgVElNRU9VVDo4LCBPRkZMSU5FOjl9Owpnb29nLm5ldC5FcnJvckNvZGUuZ2V0RGVidWdNZXNzYWdlID0gZnVuY3Rpb24gJGdvb2ckbmV0JEVycm9yQ29kZSRnZXREZWJ1Z01lc3NhZ2UkKGVycm9yQ29kZSkgewogIHN3aXRjaChlcnJvckNvZGUpIHsKICAgIGNhc2UgZ29vZy5uZXQuRXJyb3JDb2RlLk5PX0VSUk9SOgogICAgICByZXR1cm4iTm8gRXJyb3IiOwogICAgY2FzZSBnb29nLm5ldC5FcnJvckNvZGUuQUNDRVNTX0RFTklFRDoKICAgICAgcmV0dXJuIkFjY2VzcyBkZW5pZWQgdG8gY29udGVudCBkb2N1bWVudCI7CiAgICBjYXNlIGdvb2cubmV0LkVycm9yQ29kZS5GSUxFX05PVF9GT1VORDoKICAgICAgcmV0dXJuIkZpbGUgbm90IGZvdW5kIjsKICAgIGNhc2UgZ29vZy5uZXQuRXJyb3JDb2RlLkZGX1NJTEVOVF9FUlJPUjoKICAgICAgcmV0dXJuIkZpcmVmb3ggc2lsZW50bHkgZXJyb3JlZCI7CiAgICBjYXNlIGdvb2cubmV0LkVycm9yQ29kZS5DVVNUT01fRVJST1I6CiAgICAgIHJldHVybiJBcHBsaWNhdGlvbiBjdXN0b20gZXJyb3IiOwogICAgY2FzZSBnb29nLm5ldC5FcnJvckNvZGUuRVhDRVBUSU9OOgogICAgICByZXR1cm4iQW4gZXhjZXB0aW9uIG9jY3VycmVkIjsKICAgIGNhc2UgZ29vZy5uZXQuRXJyb3JDb2RlLkhUVFBfRVJST1I6CiAgICAgIHJldHVybiJIdHRwIHJlc3BvbnNlIGF0IDQwMCBvciA1MDAgbGV2ZWwiOwogICAgY2FzZSBnb29nLm5ldC5FcnJvckNvZGUuQUJPUlQ6CiAgICAgIHJldHVybiJSZXF1ZXN0IHdhcyBhYm9ydGVkIjsKICAgIGNhc2UgZ29vZy5uZXQuRXJyb3JDb2RlLlRJTUVPVVQ6CiAgICAgIHJldHVybiJSZXF1ZXN0IHRpbWVkIG91dCI7CiAgICBjYXNlIGdvb2cubmV0LkVycm9yQ29kZS5PRkZMSU5FOgogICAgICByZXR1cm4iVGhlIHJlc291cmNlIGlzIG5vdCBhdmFpbGFibGUgb2ZmbGluZSI7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4iVW5yZWNvZ25pemVkIGVycm9yIGNvZGUiCiAgfQp9Owpnb29nLm5ldC5FdmVudFR5cGUgPSB7Q09NUExFVEU6ImNvbXBsZXRlIiwgU1VDQ0VTUzoic3VjY2VzcyIsIEVSUk9SOiJlcnJvciIsIEFCT1JUOiJhYm9ydCIsIFJFQURZOiJyZWFkeSIsIFJFQURZX1NUQVRFX0NIQU5HRToicmVhZHlzdGF0ZWNoYW5nZSIsIFRJTUVPVVQ6InRpbWVvdXQiLCBJTkNSRU1FTlRBTF9EQVRBOiJpbmNyZW1lbnRhbGRhdGEiLCBQUk9HUkVTUzoicHJvZ3Jlc3MifTsKZ29vZy5uZXQuSHR0cFN0YXR1cyA9IHtDT05USU5VRToxMDAsIFNXSVRDSElOR19QUk9UT0NPTFM6MTAxLCBPSzoyMDAsIENSRUFURUQ6MjAxLCBBQ0NFUFRFRDoyMDIsIE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OOjIwMywgTk9fQ09OVEVOVDoyMDQsIFJFU0VUX0NPTlRFTlQ6MjA1LCBQQVJUSUFMX0NPTlRFTlQ6MjA2LCBNVUxUSVBMRV9DSE9JQ0VTOjMwMCwgTU9WRURfUEVSTUFORU5UTFk6MzAxLCBGT1VORDozMDIsIFNFRV9PVEhFUjozMDMsIE5PVF9NT0RJRklFRDozMDQsIFVTRV9QUk9YWTozMDUsIFRFTVBPUkFSWV9SRURJUkVDVDozMDcsIEJBRF9SRVFVRVNUOjQwMCwgVU5BVVRIT1JJWkVEOjQwMSwgUEFZTUVOVF9SRVFVSVJFRDo0MDIsIEZPUkJJRERFTjo0MDMsIE5PVF9GT1VORDo0MDQsIE1FVEhPRF9OT1RfQUxMT1dFRDo0MDUsIE5PVF9BQ0NFUFRBQkxFOjQwNiwgUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQ6NDA3LCBSRVFVRVNUX1RJTUVPVVQ6NDA4LCAKQ09ORkxJQ1Q6NDA5LCBHT05FOjQxMCwgTEVOR1RIX1JFUVVJUkVEOjQxMSwgUFJFQ09ORElUSU9OX0ZBSUxFRDo0MTIsIFJFUVVFU1RfRU5USVRZX1RPT19MQVJHRTo0MTMsIFJFUVVFU1RfVVJJX1RPT19MT05HOjQxNCwgVU5TVVBQT1JURURfTUVESUFfVFlQRTo0MTUsIFJFUVVFU1RfUkFOR0VfTk9UX1NBVElTRklBQkxFOjQxNiwgRVhQRUNUQVRJT05fRkFJTEVEOjQxNywgSU5URVJOQUxfU0VSVkVSX0VSUk9SOjUwMCwgTk9UX0lNUExFTUVOVEVEOjUwMSwgQkFEX0dBVEVXQVk6NTAyLCBTRVJWSUNFX1VOQVZBSUxBQkxFOjUwMywgR0FURVdBWV9USU1FT1VUOjUwNCwgSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQ6NTA1LCBRVUlSS19JRV9OT19DT05URU5UOjEyMjN9Owpnb29nLm5ldC5IdHRwU3RhdHVzLmlzU3VjY2VzcyA9IGZ1bmN0aW9uICRnb29nJG5ldCRIdHRwU3RhdHVzJGlzU3VjY2VzcyQoc3RhdHVzKSB7CiAgc3dpdGNoKHN0YXR1cykgewogICAgY2FzZSBnb29nLm5ldC5IdHRwU3RhdHVzLk9LOgogICAgOwogICAgY2FzZSBnb29nLm5ldC5IdHRwU3RhdHVzLkNSRUFURUQ6CiAgICA7CiAgICBjYXNlIGdvb2cubmV0Lkh0dHBTdGF0dXMuQUNDRVBURUQ6CiAgICA7CiAgICBjYXNlIGdvb2cubmV0Lkh0dHBTdGF0dXMuTk9fQ09OVEVOVDoKICAgIDsKICAgIGNhc2UgZ29vZy5uZXQuSHR0cFN0YXR1cy5OT1RfTU9ESUZJRUQ6CiAgICA7CiAgICBjYXNlIGdvb2cubmV0Lkh0dHBTdGF0dXMuUVVJUktfSUVfTk9fQ09OVEVOVDoKICAgICAgcmV0dXJuITA7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4hMQogIH0KfTsKZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnkgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWG1sSHR0cEZhY3RvcnkkKCkgewp9Owpnb29nLm5ldC5YbWxIdHRwRmFjdG9yeS5wcm90b3R5cGUuY2FjaGVkT3B0aW9uc18gPSBudWxsOwpnb29nLm5ldC5YbWxIdHRwRmFjdG9yeS5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICRnb29nJG5ldCRYbWxIdHRwRmFjdG9yeSQkZ2V0T3B0aW9ucyQoKSB7CiAgcmV0dXJuIHRoaXMuY2FjaGVkT3B0aW9uc18gfHwgKHRoaXMuY2FjaGVkT3B0aW9uc18gPSB0aGlzLmludGVybmFsR2V0T3B0aW9ucygpKQp9Owpnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnkgPSBmdW5jdGlvbiAkZ29vZyRuZXQkV3JhcHBlclhtbEh0dHBGYWN0b3J5JCh4aHJGYWN0b3J5LCBvcHRpb25zRmFjdG9yeSkgewogIHRoaXMueGhyRmFjdG9yeV8gPSB4aHJGYWN0b3J5OwogIHRoaXMub3B0aW9uc0ZhY3RvcnlfID0gb3B0aW9uc0ZhY3RvcnkKfTsKZ29vZy5pbmhlcml0cyhnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnksIGdvb2cubmV0LlhtbEh0dHBGYWN0b3J5KTsKZ29vZy5uZXQuV3JhcHBlclhtbEh0dHBGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGVJbnN0YW5jZSA9IGZ1bmN0aW9uICRnb29nJG5ldCRXcmFwcGVyWG1sSHR0cEZhY3RvcnkkJGNyZWF0ZUluc3RhbmNlJCgpIHsKICByZXR1cm4gdGhpcy54aHJGYWN0b3J5XygpCn07Cmdvb2cubmV0LldyYXBwZXJYbWxIdHRwRmFjdG9yeS5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICRnb29nJG5ldCRXcmFwcGVyWG1sSHR0cEZhY3RvcnkkJGdldE9wdGlvbnMkKCkgewogIHJldHVybiB0aGlzLm9wdGlvbnNGYWN0b3J5XygpCn07Cmdvb2cubmV0LlhtbEh0dHAgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWG1sSHR0cCQoKSB7CiAgcmV0dXJuIGdvb2cubmV0LlhtbEh0dHAuZmFjdG9yeV8uY3JlYXRlSW5zdGFuY2UoKQp9Owpnb29nLm5ldC5YbWxIdHRwLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWG1sSHR0cCRnZXRPcHRpb25zJCgpIHsKICByZXR1cm4gZ29vZy5uZXQuWG1sSHR0cC5mYWN0b3J5Xy5nZXRPcHRpb25zKCkKfTsKZ29vZy5uZXQuWG1sSHR0cC5PcHRpb25UeXBlID0ge1VTRV9OVUxMX0ZVTkNUSU9OOjAsIExPQ0FMX1JFUVVFU1RfRVJST1I6MX07Cmdvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZSA9IHtVTklOSVRJQUxJWkVEOjAsIExPQURJTkc6MSwgTE9BREVEOjIsIElOVEVSQUNUSVZFOjMsIENPTVBMRVRFOjR9Owpnb29nLm5ldC5YbWxIdHRwLnNldEZhY3RvcnkgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWG1sSHR0cCRzZXRGYWN0b3J5JChmYWN0b3J5LCBvcHRpb25zRmFjdG9yeSkgewogIGdvb2cubmV0LlhtbEh0dHAuc2V0R2xvYmFsRmFjdG9yeShuZXcgZ29vZy5uZXQuV3JhcHBlclhtbEh0dHBGYWN0b3J5KGZhY3RvcnksIG9wdGlvbnNGYWN0b3J5KSkKfTsKZ29vZy5uZXQuWG1sSHR0cC5zZXRHbG9iYWxGYWN0b3J5ID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhtbEh0dHAkc2V0R2xvYmFsRmFjdG9yeSQoZmFjdG9yeSkgewogIGdvb2cubmV0LlhtbEh0dHAuZmFjdG9yeV8gPSBmYWN0b3J5Cn07Cmdvb2cubmV0LkRlZmF1bHRYbWxIdHRwRmFjdG9yeSA9IGZ1bmN0aW9uICRnb29nJG5ldCREZWZhdWx0WG1sSHR0cEZhY3RvcnkkKCkgewp9Owpnb29nLmluaGVyaXRzKGdvb2cubmV0LkRlZmF1bHRYbWxIdHRwRmFjdG9yeSwgZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnkpOwpnb29nLm5ldC5EZWZhdWx0WG1sSHR0cEZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZUluc3RhbmNlID0gZnVuY3Rpb24gJGdvb2ckbmV0JERlZmF1bHRYbWxIdHRwRmFjdG9yeSQkY3JlYXRlSW5zdGFuY2UkKCkgewogIHZhciBwcm9nSWQgPSB0aGlzLmdldFByb2dJZF8oKTsKICByZXR1cm4gcHJvZ0lkID8gbmV3IEFjdGl2ZVhPYmplY3QocHJvZ0lkKSA6IG5ldyBYTUxIdHRwUmVxdWVzdAp9Owpnb29nLm5ldC5EZWZhdWx0WG1sSHR0cEZhY3RvcnkucHJvdG90eXBlLmludGVybmFsR2V0T3B0aW9ucyA9IGZ1bmN0aW9uICRnb29nJG5ldCREZWZhdWx0WG1sSHR0cEZhY3RvcnkkJGludGVybmFsR2V0T3B0aW9ucyQoKSB7CiAgdmFyIHByb2dJZCA9IHRoaXMuZ2V0UHJvZ0lkXygpLCBvcHRpb25zID0ge307CiAgcHJvZ0lkICYmIChvcHRpb25zW2dvb2cubmV0LlhtbEh0dHAuT3B0aW9uVHlwZS5VU0VfTlVMTF9GVU5DVElPTl0gPSAhMCwgb3B0aW9uc1tnb29nLm5ldC5YbWxIdHRwLk9wdGlvblR5cGUuTE9DQUxfUkVRVUVTVF9FUlJPUl0gPSAhMCk7CiAgcmV0dXJuIG9wdGlvbnMKfTsKZ29vZy5uZXQuRGVmYXVsdFhtbEh0dHBGYWN0b3J5LnByb3RvdHlwZS5pZVByb2dJZF8gPSBudWxsOwpnb29nLm5ldC5EZWZhdWx0WG1sSHR0cEZhY3RvcnkucHJvdG90eXBlLmdldFByb2dJZF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkRGVmYXVsdFhtbEh0dHBGYWN0b3J5JCRnZXRQcm9nSWRfJCgpIHsKICBpZighdGhpcy5pZVByb2dJZF8gJiYgInVuZGVmaW5lZCIgPT0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiBBY3RpdmVYT2JqZWN0KSB7CiAgICBmb3IodmFyIEFDVElWRV9YX0lERU5UUyA9IFsiTVNYTUwyLlhNTEhUVFAuNi4wIiwgIk1TWE1MMi5YTUxIVFRQLjMuMCIsICJNU1hNTDIuWE1MSFRUUCIsICJNaWNyb3NvZnQuWE1MSFRUUCJdLCBpID0gMDtpIDwgQUNUSVZFX1hfSURFTlRTLmxlbmd0aDtpKyspIHsKICAgICAgdmFyIGNhbmRpZGF0ZSA9IEFDVElWRV9YX0lERU5UU1tpXTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoY2FuZGlkYXRlKSwgdGhpcy5pZVByb2dJZF8gPSBjYW5kaWRhdGUKICAgICAgfWNhdGNoKGUpIHsKICAgICAgfQogICAgfQogICAgdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgQWN0aXZlWE9iamVjdC4gQWN0aXZlWCBtaWdodCBiZSBkaXNhYmxlZCwgb3IgTVNYTUwgbWlnaHQgbm90IGJlIGluc3RhbGxlZCIpOwogIH0KICByZXR1cm4gdGhpcy5pZVByb2dJZF8KfTsKZ29vZy5uZXQuWG1sSHR0cC5zZXRHbG9iYWxGYWN0b3J5KG5ldyBnb29nLm5ldC5EZWZhdWx0WG1sSHR0cEZhY3RvcnkpOwpnb29nLm5ldC5YaHJJbyA9IGZ1bmN0aW9uICRnb29nJG5ldCRYaHJJbyQob3B0X3htbEh0dHBGYWN0b3J5KSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLmhlYWRlcnMgPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcDsKICB0aGlzLnhtbEh0dHBGYWN0b3J5XyA9IG9wdF94bWxIdHRwRmFjdG9yeSB8fCBudWxsCn07Cmdvb2cuaW5oZXJpdHMoZ29vZy5uZXQuWGhySW8sIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKZ29vZy5uZXQuWGhySW8uUmVzcG9uc2VUeXBlID0ge0RFRkFVTFQ6IiIsIFRFWFQ6InRleHQiLCBET0NVTUVOVDoiZG9jdW1lbnQiLCBCTE9COiJibG9iIiwgQVJSQVlfQlVGRkVSOiJhcnJheWJ1ZmZlciJ9Owpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigiZ29vZy5uZXQuWGhySW8iKTsKZ29vZy5uZXQuWGhySW8uQ09OVEVOVF9UWVBFX0hFQURFUiA9ICJDb250ZW50LVR5cGUiOwpnb29nLm5ldC5YaHJJby5IVFRQX1NDSEVNRV9QQVRURVJOID0gL15odHRwcz8kL2k7Cmdvb2cubmV0LlhocklvLkZPUk1fQ09OVEVOVF9UWVBFID0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IjsKZ29vZy5uZXQuWGhySW8uc2VuZEluc3RhbmNlc18gPSBbXTsKZ29vZy5uZXQuWGhySW8uc2VuZCA9IGZ1bmN0aW9uICRnb29nJG5ldCRYaHJJbyRzZW5kJCh1cmwsIG9wdF9jYWxsYmFjaywgb3B0X21ldGhvZCwgb3B0X2NvbnRlbnQsIG9wdF9oZWFkZXJzLCBvcHRfdGltZW91dEludGVydmFsKSB7CiAgdmFyIHggPSBuZXcgZ29vZy5uZXQuWGhySW87CiAgZ29vZy5uZXQuWGhySW8uc2VuZEluc3RhbmNlc18ucHVzaCh4KTsKICBvcHRfY2FsbGJhY2sgJiYgZ29vZy5ldmVudHMubGlzdGVuKHgsIGdvb2cubmV0LkV2ZW50VHlwZS5DT01QTEVURSwgb3B0X2NhbGxiYWNrKTsKICBnb29nLmV2ZW50cy5saXN0ZW4oeCwgZ29vZy5uZXQuRXZlbnRUeXBlLlJFQURZLCBnb29nLnBhcnRpYWwoZ29vZy5uZXQuWGhySW8uY2xlYW51cFNlbmRfLCB4KSk7CiAgb3B0X3RpbWVvdXRJbnRlcnZhbCAmJiB4LnNldFRpbWVvdXRJbnRlcnZhbChvcHRfdGltZW91dEludGVydmFsKTsKICB4LnNlbmQodXJsLCBvcHRfbWV0aG9kLCBvcHRfY29udGVudCwgb3B0X2hlYWRlcnMpCn07Cmdvb2cubmV0LlhocklvLmNsZWFudXAgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWGhySW8kY2xlYW51cCQoKSB7CiAgZm9yKHZhciBpbnN0YW5jZXMgPSBnb29nLm5ldC5YaHJJby5zZW5kSW5zdGFuY2VzXztpbnN0YW5jZXMubGVuZ3RoOykgewogICAgaW5zdGFuY2VzLnBvcCgpLmRpc3Bvc2UoKQogIH0KfTsKZ29vZy5uZXQuWGhySW8ucHJvdGVjdEVudHJ5UG9pbnRzID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJHByb3RlY3RFbnRyeVBvaW50cyQoZXJyb3JIYW5kbGVyKSB7CiAgZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLm9uUmVhZHlTdGF0ZUNoYW5nZUVudHJ5UG9pbnRfID0gZXJyb3JIYW5kbGVyLnByb3RlY3RFbnRyeVBvaW50KGdvb2cubmV0LlhocklvLnByb3RvdHlwZS5vblJlYWR5U3RhdGVDaGFuZ2VFbnRyeVBvaW50XykKfTsKZ29vZy5uZXQuWGhySW8uY2xlYW51cFNlbmRfID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJGNsZWFudXBTZW5kXyQoWGhySW8pIHsKICBYaHJJby5kaXNwb3NlKCk7CiAgZ29vZy5hcnJheS5yZW1vdmUoZ29vZy5uZXQuWGhySW8uc2VuZEluc3RhbmNlc18sIFhocklvKQp9Owpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUuYWN0aXZlXyA9ICExOwpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUueGhyXyA9IG51bGw7Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS54aHJPcHRpb25zXyA9IG51bGw7Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5sYXN0VXJpXyA9ICIiOwpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUubGFzdE1ldGhvZF8gPSAiIjsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLmxhc3RFcnJvcl8gPSAiIjsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLmVycm9yRGlzcGF0Y2hlZF8gPSAhMTsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLmluU2VuZF8gPSAhMTsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLmluT3Blbl8gPSAhMTsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLmluQWJvcnRfID0gITE7Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS50aW1lb3V0SW50ZXJ2YWxfID0gMDsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLnRpbWVvdXRJZF8gPSBudWxsOwpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUucmVzcG9uc2VUeXBlXyA9IGdvb2cubmV0LlhocklvLlJlc3BvbnNlVHlwZS5ERUZBVUxUOwpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUud2l0aENyZWRlbnRpYWxzXyA9ICExOwpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUuc2V0VGltZW91dEludGVydmFsID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJCRzZXRUaW1lb3V0SW50ZXJ2YWwkKG1zKSB7CiAgdGhpcy50aW1lb3V0SW50ZXJ2YWxfID0gTWF0aC5tYXgoMCwgbXMpCn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJCRzZW5kJCh1cmwsIG9wdF9tZXRob2QsIG9wdF9jb250ZW50LCBvcHRfaGVhZGVycykgewogIGlmKHRoaXMueGhyXykgewogICAgdGhyb3cgRXJyb3IoIltnb29nLm5ldC5YaHJJb10gT2JqZWN0IGlzIGFjdGl2ZSB3aXRoIGFub3RoZXIgcmVxdWVzdCIpOwogIH0KICB2YXIgbWV0aG9kID0gb3B0X21ldGhvZCA/IG9wdF9tZXRob2QudG9VcHBlckNhc2UoKSA6ICJHRVQiOwogIHRoaXMubGFzdFVyaV8gPSB1cmw7CiAgdGhpcy5sYXN0RXJyb3JfID0gIiI7CiAgdGhpcy5sYXN0TWV0aG9kXyA9IG1ldGhvZDsKICB0aGlzLmVycm9yRGlzcGF0Y2hlZF8gPSAhMTsKICB0aGlzLmFjdGl2ZV8gPSAhMDsKICB0aGlzLnhocl8gPSB0aGlzLmNyZWF0ZVhocigpOwogIHRoaXMueGhyT3B0aW9uc18gPSB0aGlzLnhtbEh0dHBGYWN0b3J5XyA/IHRoaXMueG1sSHR0cEZhY3RvcnlfLmdldE9wdGlvbnMoKSA6IGdvb2cubmV0LlhtbEh0dHAuZ2V0T3B0aW9ucygpOwogIHRoaXMueGhyXy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBnb29nLmJpbmQodGhpcy5vblJlYWR5U3RhdGVDaGFuZ2VfLCB0aGlzKTsKICB0cnkgewogICAgdGhpcy5sb2dnZXJfLmZpbmUodGhpcy5mb3JtYXRNc2dfKCJPcGVuaW5nIFhociIpKSwgdGhpcy5pbk9wZW5fID0gITAsIHRoaXMueGhyXy5vcGVuKG1ldGhvZCwgdXJsLCAhMCksIHRoaXMuaW5PcGVuXyA9ICExCiAgfWNhdGNoKGVycikgewogICAgdGhpcy5sb2dnZXJfLmZpbmUodGhpcy5mb3JtYXRNc2dfKCJFcnJvciBvcGVuaW5nIFhocjogIiArIGVyci5tZXNzYWdlKSk7CiAgICB0aGlzLmVycm9yXyhnb29nLm5ldC5FcnJvckNvZGUuRVhDRVBUSU9OLCBlcnIpOwogICAgcmV0dXJuCiAgfQogIHZhciBjb250ZW50ID0gb3B0X2NvbnRlbnQgfHwgIiIsIGhlYWRlcnMgPSB0aGlzLmhlYWRlcnMuY2xvbmUoKTsKICBvcHRfaGVhZGVycyAmJiBnb29nLnN0cnVjdHMuZm9yRWFjaChvcHRfaGVhZGVycywgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgaGVhZGVycy5zZXQoa2V5LCB2YWx1ZSkKICB9KTsKICAiUE9TVCIgPT0gbWV0aG9kICYmICFoZWFkZXJzLmNvbnRhaW5zS2V5KGdvb2cubmV0LlhocklvLkNPTlRFTlRfVFlQRV9IRUFERVIpICYmIGhlYWRlcnMuc2V0KGdvb2cubmV0LlhocklvLkNPTlRFTlRfVFlQRV9IRUFERVIsIGdvb2cubmV0LlhocklvLkZPUk1fQ09OVEVOVF9UWVBFKTsKICBnb29nLnN0cnVjdHMuZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICB0aGlzLnhocl8uc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbHVlKQogIH0sIHRoaXMpOwogIHRoaXMucmVzcG9uc2VUeXBlXyAmJiAodGhpcy54aHJfLnJlc3BvbnNlVHlwZSA9IHRoaXMucmVzcG9uc2VUeXBlXyk7CiAgZ29vZy5vYmplY3QuY29udGFpbnNLZXkodGhpcy54aHJfLCAid2l0aENyZWRlbnRpYWxzIikgJiYgKHRoaXMueGhyXy53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhDcmVkZW50aWFsc18pOwogIHRyeSB7CiAgICB0aGlzLnRpbWVvdXRJZF8gJiYgKGdvb2cuVGltZXIuZGVmYXVsdFRpbWVyT2JqZWN0LmNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZF8pLCB0aGlzLnRpbWVvdXRJZF8gPSBudWxsKSwgMCA8IHRoaXMudGltZW91dEludGVydmFsXyAmJiAodGhpcy5sb2dnZXJfLmZpbmUodGhpcy5mb3JtYXRNc2dfKCJXaWxsIGFib3J0IGFmdGVyICIgKyB0aGlzLnRpbWVvdXRJbnRlcnZhbF8gKyAibXMgaWYgaW5jb21wbGV0ZSIpKSwgdGhpcy50aW1lb3V0SWRfID0gZ29vZy5UaW1lci5kZWZhdWx0VGltZXJPYmplY3Quc2V0VGltZW91dChnb29nLmJpbmQodGhpcy50aW1lb3V0XywgdGhpcyksIHRoaXMudGltZW91dEludGVydmFsXykpLCB0aGlzLmxvZ2dlcl8uZmluZSh0aGlzLmZvcm1hdE1zZ18oIlNlbmRpbmcgcmVxdWVzdCIpKSwgdGhpcy5pblNlbmRfID0gITAsIHRoaXMueGhyXy5zZW5kKGNvbnRlbnQpLCB0aGlzLmluU2VuZF8gPSAhMQogIH1jYXRjaChlcnIkJDApIHsKICAgIHRoaXMubG9nZ2VyXy5maW5lKHRoaXMuZm9ybWF0TXNnXygiU2VuZCBlcnJvcjogIiArIGVyciQkMC5tZXNzYWdlKSksIHRoaXMuZXJyb3JfKGdvb2cubmV0LkVycm9yQ29kZS5FWENFUFRJT04sIGVyciQkMCkKICB9Cn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5jcmVhdGVYaHIgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWGhySW8kJGNyZWF0ZVhociQoKSB7CiAgcmV0dXJuIHRoaXMueG1sSHR0cEZhY3RvcnlfID8gdGhpcy54bWxIdHRwRmFjdG9yeV8uY3JlYXRlSW5zdGFuY2UoKSA6IGdvb2cubmV0LlhtbEh0dHAoKQp9Owpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUudGltZW91dF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkWGhySW8kJHRpbWVvdXRfJCgpIHsKICAidW5kZWZpbmVkIiAhPSB0eXBlb2YgZ29vZyAmJiB0aGlzLnhocl8gJiYgKHRoaXMubGFzdEVycm9yXyA9ICJUaW1lZCBvdXQgYWZ0ZXIgIiArIHRoaXMudGltZW91dEludGVydmFsXyArICJtcywgYWJvcnRpbmciLCB0aGlzLmxvZ2dlcl8uZmluZSh0aGlzLmZvcm1hdE1zZ18odGhpcy5sYXN0RXJyb3JfKSksIHRoaXMuZGlzcGF0Y2hFdmVudChnb29nLm5ldC5FdmVudFR5cGUuVElNRU9VVCksIHRoaXMuYWJvcnQoZ29vZy5uZXQuRXJyb3JDb2RlLlRJTUVPVVQpKQp9Owpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUuZXJyb3JfID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJCRlcnJvcl8kKGVycm9yQ29kZSwgZXJyKSB7CiAgdGhpcy5hY3RpdmVfID0gITE7CiAgdGhpcy54aHJfICYmICh0aGlzLmluQWJvcnRfID0gITAsIHRoaXMueGhyXy5hYm9ydCgpLCB0aGlzLmluQWJvcnRfID0gITEpOwogIHRoaXMubGFzdEVycm9yXyA9IGVycjsKICB0aGlzLmRpc3BhdGNoRXJyb3JzXygpOwogIHRoaXMuY2xlYW5VcFhocl8oKQp9Owpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUuZGlzcGF0Y2hFcnJvcnNfID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJCRkaXNwYXRjaEVycm9yc18kKCkgewogIHRoaXMuZXJyb3JEaXNwYXRjaGVkXyB8fCAodGhpcy5lcnJvckRpc3BhdGNoZWRfID0gITAsIHRoaXMuZGlzcGF0Y2hFdmVudChnb29nLm5ldC5FdmVudFR5cGUuQ09NUExFVEUpLCB0aGlzLmRpc3BhdGNoRXZlbnQoZ29vZy5uZXQuRXZlbnRUeXBlLkVSUk9SKSkKfTsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJCRhYm9ydCQoKSB7CiAgdGhpcy54aHJfICYmIHRoaXMuYWN0aXZlXyAmJiAodGhpcy5sb2dnZXJfLmZpbmUodGhpcy5mb3JtYXRNc2dfKCJBYm9ydGluZyIpKSwgdGhpcy5hY3RpdmVfID0gITEsIHRoaXMuaW5BYm9ydF8gPSAhMCwgdGhpcy54aHJfLmFib3J0KCksIHRoaXMuaW5BYm9ydF8gPSAhMSwgdGhpcy5kaXNwYXRjaEV2ZW50KGdvb2cubmV0LkV2ZW50VHlwZS5DT01QTEVURSksIHRoaXMuZGlzcGF0Y2hFdmVudChnb29nLm5ldC5FdmVudFR5cGUuQUJPUlQpLCB0aGlzLmNsZWFuVXBYaHJfKCkpCn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWGhySW8kJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGhpcy54aHJfICYmICh0aGlzLmFjdGl2ZV8gJiYgKHRoaXMuYWN0aXZlXyA9ICExLCB0aGlzLmluQWJvcnRfID0gITAsIHRoaXMueGhyXy5hYm9ydCgpLCB0aGlzLmluQWJvcnRfID0gITEpLCB0aGlzLmNsZWFuVXBYaHJfKCEwKSk7CiAgZ29vZy5uZXQuWGhySW8uc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLm9uUmVhZHlTdGF0ZUNoYW5nZV8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkWGhySW8kJG9uUmVhZHlTdGF0ZUNoYW5nZV8kKCkgewogIGlmKCF0aGlzLmluT3Blbl8gJiYgIXRoaXMuaW5TZW5kXyAmJiAhdGhpcy5pbkFib3J0XykgewogICAgdGhpcy5vblJlYWR5U3RhdGVDaGFuZ2VFbnRyeVBvaW50XygpCiAgfWVsc2UgewogICAgdGhpcy5vblJlYWR5U3RhdGVDaGFuZ2VIZWxwZXJfKCkKICB9Cn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5vblJlYWR5U3RhdGVDaGFuZ2VFbnRyeVBvaW50XyA9IGZ1bmN0aW9uICRnb29nJG5ldCRYaHJJbyQkb25SZWFkeVN0YXRlQ2hhbmdlRW50cnlQb2ludF8kKCkgewogIHRoaXMub25SZWFkeVN0YXRlQ2hhbmdlSGVscGVyXygpCn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5vblJlYWR5U3RhdGVDaGFuZ2VIZWxwZXJfID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJCRvblJlYWR5U3RhdGVDaGFuZ2VIZWxwZXJfJCgpIHsKICB0aGlzLmFjdGl2ZV8gJiYgInVuZGVmaW5lZCIgIT0gdHlwZW9mIGdvb2cgJiYgKHRoaXMueGhyT3B0aW9uc19bZ29vZy5uZXQuWG1sSHR0cC5PcHRpb25UeXBlLkxPQ0FMX1JFUVVFU1RfRVJST1JdICYmIHRoaXMuZ2V0UmVhZHlTdGF0ZSgpID09IGdvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZS5DT01QTEVURSAmJiAyID09IHRoaXMuZ2V0U3RhdHVzKCkgPyB0aGlzLmxvZ2dlcl8uZmluZSh0aGlzLmZvcm1hdE1zZ18oIkxvY2FsIHJlcXVlc3QgZXJyb3IgZGV0ZWN0ZWQgYW5kIGlnbm9yZWQiKSkgOiB0aGlzLmluU2VuZF8gJiYgdGhpcy5nZXRSZWFkeVN0YXRlKCkgPT0gZ29vZy5uZXQuWG1sSHR0cC5SZWFkeVN0YXRlLkNPTVBMRVRFID8gZ29vZy5UaW1lci5kZWZhdWx0VGltZXJPYmplY3Quc2V0VGltZW91dChnb29nLmJpbmQodGhpcy5vblJlYWR5U3RhdGVDaGFuZ2VfLCB0aGlzKSwgMCkgOiAodGhpcy5kaXNwYXRjaEV2ZW50KGdvb2cubmV0LkV2ZW50VHlwZS5SRUFEWV9TVEFURV9DSEFOR0UpLCAKICB0aGlzLmlzQ29tcGxldGUoKSAmJiAodGhpcy5sb2dnZXJfLmZpbmUodGhpcy5mb3JtYXRNc2dfKCJSZXF1ZXN0IGNvbXBsZXRlIikpLCB0aGlzLmFjdGl2ZV8gPSAhMSwgdGhpcy5pc1N1Y2Nlc3MoKSA/ICh0aGlzLmRpc3BhdGNoRXZlbnQoZ29vZy5uZXQuRXZlbnRUeXBlLkNPTVBMRVRFKSwgdGhpcy5kaXNwYXRjaEV2ZW50KGdvb2cubmV0LkV2ZW50VHlwZS5TVUNDRVNTKSkgOiAodGhpcy5sYXN0RXJyb3JfID0gdGhpcy5nZXRTdGF0dXNUZXh0KCkgKyAiIFsiICsgdGhpcy5nZXRTdGF0dXMoKSArICJdIiwgdGhpcy5kaXNwYXRjaEVycm9yc18oKSksIHRoaXMuY2xlYW5VcFhocl8oKSkpKQp9Owpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUuY2xlYW5VcFhocl8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkWGhySW8kJGNsZWFuVXBYaHJfJChvcHRfZnJvbURpc3Bvc2UpIHsKICBpZih0aGlzLnhocl8pIHsKICAgIHZhciB4aHIgPSB0aGlzLnhocl8sIGNsZWFyZWRPblJlYWR5U3RhdGVDaGFuZ2UgPSB0aGlzLnhock9wdGlvbnNfW2dvb2cubmV0LlhtbEh0dHAuT3B0aW9uVHlwZS5VU0VfTlVMTF9GVU5DVElPTl0gPyBnb29nLm51bGxGdW5jdGlvbiA6IG51bGw7CiAgICB0aGlzLnhock9wdGlvbnNfID0gdGhpcy54aHJfID0gbnVsbDsKICAgIHRoaXMudGltZW91dElkXyAmJiAoZ29vZy5UaW1lci5kZWZhdWx0VGltZXJPYmplY3QuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkXyksIHRoaXMudGltZW91dElkXyA9IG51bGwpOwogICAgb3B0X2Zyb21EaXNwb3NlIHx8IHRoaXMuZGlzcGF0Y2hFdmVudChnb29nLm5ldC5FdmVudFR5cGUuUkVBRFkpOwogICAgdHJ5IHsKICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNsZWFyZWRPblJlYWR5U3RhdGVDaGFuZ2UKICAgIH1jYXRjaChlKSB7CiAgICAgIHRoaXMubG9nZ2VyXy5zZXZlcmUoIlByb2JsZW0gZW5jb3VudGVyZWQgcmVzZXR0aW5nIG9ucmVhZHlzdGF0ZWNoYW5nZTogIiArIGUubWVzc2FnZSkKICAgIH0KICB9Cn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICRnb29nJG5ldCRYaHJJbyQkaXNBY3RpdmUkKCkgewogIHJldHVybiEhdGhpcy54aHJfCn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5pc0NvbXBsZXRlID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJCRpc0NvbXBsZXRlJCgpIHsKICByZXR1cm4gdGhpcy5nZXRSZWFkeVN0YXRlKCkgPT0gZ29vZy5uZXQuWG1sSHR0cC5SZWFkeVN0YXRlLkNPTVBMRVRFCn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5pc1N1Y2Nlc3MgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWGhySW8kJGlzU3VjY2VzcyQoKSB7CiAgdmFyIHN0YXR1cyA9IHRoaXMuZ2V0U3RhdHVzKCk7CiAgcmV0dXJuIGdvb2cubmV0Lkh0dHBTdGF0dXMuaXNTdWNjZXNzKHN0YXR1cykgfHwgMCA9PT0gc3RhdHVzICYmICF0aGlzLmlzTGFzdFVyaUVmZmVjdGl2ZVNjaGVtZUh0dHBfKCkKfTsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLmlzTGFzdFVyaUVmZmVjdGl2ZVNjaGVtZUh0dHBfID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJCRpc0xhc3RVcmlFZmZlY3RpdmVTY2hlbWVIdHRwXyQoKSB7CiAgdmFyIHNjaGVtZSA9IGdvb2cudXJpLnV0aWxzLmdldEVmZmVjdGl2ZVNjaGVtZSgiIiArIHRoaXMubGFzdFVyaV8pOwogIHJldHVybiBnb29nLm5ldC5YaHJJby5IVFRQX1NDSEVNRV9QQVRURVJOLnRlc3Qoc2NoZW1lKQp9Owpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUuZ2V0UmVhZHlTdGF0ZSA9IGZ1bmN0aW9uICRnb29nJG5ldCRYaHJJbyQkZ2V0UmVhZHlTdGF0ZSQoKSB7CiAgcmV0dXJuIHRoaXMueGhyXyA/IHRoaXMueGhyXy5yZWFkeVN0YXRlIDogZ29vZy5uZXQuWG1sSHR0cC5SZWFkeVN0YXRlLlVOSU5JVElBTElaRUQKfTsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLmdldFN0YXR1cyA9IGZ1bmN0aW9uICRnb29nJG5ldCRYaHJJbyQkZ2V0U3RhdHVzJCgpIHsKICB0cnkgewogICAgcmV0dXJuIHRoaXMuZ2V0UmVhZHlTdGF0ZSgpID4gZ29vZy5uZXQuWG1sSHR0cC5SZWFkeVN0YXRlLkxPQURFRCA/IHRoaXMueGhyXy5zdGF0dXMgOiAtMQogIH1jYXRjaChlKSB7CiAgICByZXR1cm4gdGhpcy5sb2dnZXJfLndhcm5pbmcoIkNhbiBub3QgZ2V0IHN0YXR1czogIiArIGUubWVzc2FnZSksIC0xCiAgfQp9Owpnb29nLm5ldC5YaHJJby5wcm90b3R5cGUuZ2V0U3RhdHVzVGV4dCA9IGZ1bmN0aW9uICRnb29nJG5ldCRYaHJJbyQkZ2V0U3RhdHVzVGV4dCQoKSB7CiAgdHJ5IHsKICAgIHJldHVybiB0aGlzLmdldFJlYWR5U3RhdGUoKSA+IGdvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZS5MT0FERUQgPyB0aGlzLnhocl8uc3RhdHVzVGV4dCA6ICIiCiAgfWNhdGNoKGUpIHsKICAgIHJldHVybiB0aGlzLmxvZ2dlcl8uZmluZSgiQ2FuIG5vdCBnZXQgc3RhdHVzOiAiICsgZS5tZXNzYWdlKSwgIiIKICB9Cn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5nZXRSZXNwb25zZVRleHQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWGhySW8kJGdldFJlc3BvbnNlVGV4dCQoKSB7CiAgdHJ5IHsKICAgIHJldHVybiB0aGlzLnhocl8gPyB0aGlzLnhocl8ucmVzcG9uc2VUZXh0IDogIiIKICB9Y2F0Y2goZSkgewogICAgcmV0dXJuIHRoaXMubG9nZ2VyXy5maW5lKCJDYW4gbm90IGdldCByZXNwb25zZVRleHQ6ICIgKyBlLm1lc3NhZ2UpLCAiIgogIH0KfTsKZ29vZy5uZXQuWGhySW8ucHJvdG90eXBlLmdldFJlc3BvbnNlSGVhZGVyID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJCRnZXRSZXNwb25zZUhlYWRlciQoa2V5KSB7CiAgcmV0dXJuIHRoaXMueGhyXyAmJiB0aGlzLmlzQ29tcGxldGUoKSA/IHRoaXMueGhyXy5nZXRSZXNwb25zZUhlYWRlcihrZXkpIDogdm9pZCAwCn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5nZXRBbGxSZXNwb25zZUhlYWRlcnMgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWGhySW8kJGdldEFsbFJlc3BvbnNlSGVhZGVycyQoKSB7CiAgcmV0dXJuIHRoaXMueGhyXyAmJiB0aGlzLmlzQ29tcGxldGUoKSA/IHRoaXMueGhyXy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSA6ICIiCn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5nZXRMYXN0RXJyb3IgPSBmdW5jdGlvbiAkZ29vZyRuZXQkWGhySW8kJGdldExhc3RFcnJvciQoKSB7CiAgcmV0dXJuIGdvb2cuaXNTdHJpbmcodGhpcy5sYXN0RXJyb3JfKSA/IHRoaXMubGFzdEVycm9yXyA6ICIiICsgdGhpcy5sYXN0RXJyb3JfCn07Cmdvb2cubmV0LlhocklvLnByb3RvdHlwZS5mb3JtYXRNc2dfID0gZnVuY3Rpb24gJGdvb2ckbmV0JFhocklvJCRmb3JtYXRNc2dfJChtc2cpIHsKICByZXR1cm4gbXNnICsgIiBbIiArIHRoaXMubGFzdE1ldGhvZF8gKyAiICIgKyB0aGlzLmxhc3RVcmlfICsgIiAiICsgdGhpcy5nZXRTdGF0dXMoKSArICJdIgp9Owpnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeS5yZWdpc3RlcihmdW5jdGlvbih0cmFuc2Zvcm1lcikgewogIGdvb2cubmV0LlhocklvLnByb3RvdHlwZS5vblJlYWR5U3RhdGVDaGFuZ2VFbnRyeVBvaW50XyA9IHRyYW5zZm9ybWVyKGdvb2cubmV0LlhocklvLnByb3RvdHlwZS5vblJlYWR5U3RhdGVDaGFuZ2VFbnRyeVBvaW50XykKfSk7Cmdvb2cuZGVidWcuRXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRXJyb3JIYW5kbGVyJChoYW5kbGVyKSB7CiAgZ29vZy5EaXNwb3NhYmxlLmNhbGwodGhpcyk7CiAgdGhpcy5lcnJvckhhbmRsZXJGbl8gPSBoYW5kbGVyCn07Cmdvb2cuaW5oZXJpdHMoZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXIsIGdvb2cuRGlzcG9zYWJsZSk7Cmdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5hZGRUcmFjZXJzVG9Qcm90ZWN0ZWRGdW5jdGlvbnNfID0gITE7Cmdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRXJyb3JIYW5kbGVyJCR3cmFwJChmbikgewogIHJldHVybiB0aGlzLnByb3RlY3RFbnRyeVBvaW50KGdvb2cuYXNzZXJ0cy5hc3NlcnRGdW5jdGlvbihmbikpCn07Cmdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLnByb3RvdHlwZS51bndyYXAgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRFcnJvckhhbmRsZXIkJHVud3JhcCQoZm4pIHsKICBnb29nLmFzc2VydHMuYXNzZXJ0RnVuY3Rpb24oZm4pOwogIHJldHVybiBmblt0aGlzLmdldEZ1bmN0aW9uSW5kZXhfKCExKV0gfHwgZm4KfTsKZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXIucHJvdG90eXBlLmdldFN0YWNrVHJhY2VIb2xkZXJfID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRXJyb3JIYW5kbGVyJCRnZXRTdGFja1RyYWNlSG9sZGVyXyQoc3RhY2tUcmFjZSkgewogIHZhciBidWZmZXIgPSBbXTsKICBidWZmZXIucHVzaCgiIyNQRV9TVEFDS19TVEFSVCMjIik7CiAgYnVmZmVyLnB1c2goc3RhY2tUcmFjZS5yZXBsYWNlKC8oXHJcbnxccnxcbikvZywgIiMjU1RBQ0tfQlIjIyIpKTsKICBidWZmZXIucHVzaCgiIyNQRV9TVEFDS19FTkQjIyIpOwogIHJldHVybiBidWZmZXIuam9pbigiIikKfTsKZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXIucHJvdG90eXBlLmdldEZ1bmN0aW9uSW5kZXhfID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRXJyb3JIYW5kbGVyJCRnZXRGdW5jdGlvbkluZGV4XyQod3JhcHBlcikgewogIHJldHVybih3cmFwcGVyID8gIl9fd3JhcHBlcl8iIDogIl9fcHJvdGVjdGVkXyIpICsgZ29vZy5nZXRVaWQodGhpcykgKyAiX18iCn07Cmdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5wcm90ZWN0RW50cnlQb2ludCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJEVycm9ySGFuZGxlciQkcHJvdGVjdEVudHJ5UG9pbnQkKGZuKSB7CiAgdmFyIHByb3RlY3RlZEZuTmFtZSA9IHRoaXMuZ2V0RnVuY3Rpb25JbmRleF8oITApOwogIGlmKCFmbltwcm90ZWN0ZWRGbk5hbWVdKSB7CiAgICB2YXIgd3JhcHBlciA9IGZuW3Byb3RlY3RlZEZuTmFtZV0gPSB0aGlzLmdldFByb3RlY3RlZEZ1bmN0aW9uKGZuKTsKICAgIHdyYXBwZXJbdGhpcy5nZXRGdW5jdGlvbkluZGV4XyghMSldID0gZm4KICB9CiAgcmV0dXJuIGZuW3Byb3RlY3RlZEZuTmFtZV0KfTsKZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXIucHJvdG90eXBlLmdldFByb3RlY3RlZEZ1bmN0aW9uID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRXJyb3JIYW5kbGVyJCRnZXRQcm90ZWN0ZWRGdW5jdGlvbiQoZm4pIHsKICB2YXIgdGhhdCA9IHRoaXMsIHRyYWNlcnMgPSB0aGlzLmFkZFRyYWNlcnNUb1Byb3RlY3RlZEZ1bmN0aW9uc187CiAgaWYodHJhY2VycykgewogICAgdmFyIHN0YWNrVHJhY2UgPSBnb29nLmRlYnVnLmdldFN0YWNrdHJhY2VTaW1wbGUoMTUpCiAgfQogIHZhciByZXN1bHQgPSBmdW5jdGlvbiAkcmVzdWx0JCgpIHsKICAgIGlmKHRoYXQuaXNEaXNwb3NlZCgpKSB7CiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpCiAgICB9CiAgICBpZih0cmFjZXJzKSB7CiAgICAgIHZhciB0cmFjZXIgPSBnb29nLmRlYnVnLlRyYWNlLnN0YXJ0VHJhY2VyKCJwcm90ZWN0ZWRFbnRyeVBvaW50OiAiICsgdGhhdC5nZXRTdGFja1RyYWNlSG9sZGVyXyhzdGFja1RyYWNlKSkKICAgIH0KICAgIHRyeSB7CiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpCiAgICB9Y2F0Y2goZSkgewogICAgICB0aHJvdyB0aGF0LmVycm9ySGFuZGxlckZuXyhlKSwgbmV3IGdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLlByb3RlY3RlZEZ1bmN0aW9uRXJyb3IoZSk7CiAgICB9ZmluYWxseSB7CiAgICAgIHRyYWNlcnMgJiYgZ29vZy5kZWJ1Zy5UcmFjZS5zdG9wVHJhY2VyKHRyYWNlcikKICAgIH0KICB9OwogIHJlc3VsdFt0aGlzLmdldEZ1bmN0aW9uSW5kZXhfKCExKV0gPSBmbjsKICByZXR1cm4gcmVzdWx0Cn07Cmdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5wcm90ZWN0V2luZG93U2V0VGltZW91dCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJEVycm9ySGFuZGxlciQkcHJvdGVjdFdpbmRvd1NldFRpbWVvdXQkKCkgewogIHRoaXMucHJvdGVjdFdpbmRvd0Z1bmN0aW9uc0hlbHBlcl8oInNldFRpbWVvdXQiKQp9Owpnb29nLmRlYnVnLkVycm9ySGFuZGxlci5wcm90b3R5cGUucHJvdGVjdFdpbmRvd1NldEludGVydmFsID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRXJyb3JIYW5kbGVyJCRwcm90ZWN0V2luZG93U2V0SW50ZXJ2YWwkKCkgewogIHRoaXMucHJvdGVjdFdpbmRvd0Z1bmN0aW9uc0hlbHBlcl8oInNldEludGVydmFsIikKfTsKZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXIucHJvdG90eXBlLnByb3RlY3RXaW5kb3dGdW5jdGlvbnNIZWxwZXJfID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRXJyb3JIYW5kbGVyJCRwcm90ZWN0V2luZG93RnVuY3Rpb25zSGVscGVyXyQoZm5OYW1lKSB7CiAgdmFyIHdpbiA9IGdvb2cuZ2V0T2JqZWN0QnlOYW1lKCJ3aW5kb3ciKSwgb3JpZ2luYWxGbiA9IHdpbltmbk5hbWVdLCB0aGF0ID0gdGhpczsKICB3aW5bZm5OYW1lXSA9IGZ1bmN0aW9uICR3aW4kZm5OYW1lJChmbiwgdGltZSkgewogICAgZ29vZy5pc1N0cmluZyhmbikgJiYgKGZuID0gZ29vZy5wYXJ0aWFsKGdvb2cuZ2xvYmFsRXZhbCwgZm4pKTsKICAgIGZuID0gdGhhdC5wcm90ZWN0RW50cnlQb2ludChmbik7CiAgICByZXR1cm4gb3JpZ2luYWxGbi5jYWxsID8gb3JpZ2luYWxGbi5jYWxsKHRoaXMsIGZuLCB0aW1lKSA6IG9yaWdpbmFsRm4oZm4sIHRpbWUpCiAgfTsKICB3aW5bZm5OYW1lXVt0aGlzLmdldEZ1bmN0aW9uSW5kZXhfKCExKV0gPSBvcmlnaW5hbEZuCn07Cmdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRFcnJvckhhbmRsZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdmFyIHdpbiA9IGdvb2cuZ2V0T2JqZWN0QnlOYW1lKCJ3aW5kb3ciKTsKICB3aW4uc2V0VGltZW91dCA9IHRoaXMudW53cmFwKHdpbi5zZXRUaW1lb3V0KTsKICB3aW4uc2V0SW50ZXJ2YWwgPSB0aGlzLnVud3JhcCh3aW4uc2V0SW50ZXJ2YWwpOwogIGdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpCn07Cmdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLlByb3RlY3RlZEZ1bmN0aW9uRXJyb3IgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRFcnJvckhhbmRsZXIkUHJvdGVjdGVkRnVuY3Rpb25FcnJvciQoY2F1c2UpIHsKICB2YXIgbWVzc2FnZSA9IGdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLlByb3RlY3RlZEZ1bmN0aW9uRXJyb3IuTUVTU0FHRV9QUkVGSVggKyAoY2F1c2UgJiYgY2F1c2UubWVzc2FnZSA/ICIiICsgY2F1c2UubWVzc2FnZSA6ICIiICsgY2F1c2UpOwogIGdvb2cuZGVidWcuRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKQp9Owpnb29nLmluaGVyaXRzKGdvb2cuZGVidWcuRXJyb3JIYW5kbGVyLlByb3RlY3RlZEZ1bmN0aW9uRXJyb3IsIGdvb2cuZGVidWcuRXJyb3IpOwpnb29nLmRlYnVnLkVycm9ySGFuZGxlci5Qcm90ZWN0ZWRGdW5jdGlvbkVycm9yLk1FU1NBR0VfUFJFRklYID0gIkVycm9yIGluIHByb3RlY3RlZCBmdW5jdGlvbjogIjsKZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRXJyb3JSZXBvcnRlciQoaGFuZGxlclVybCwgb3B0X2NvbnRleHRQcm92aWRlciwgb3B0X25vQXV0b1Byb3RlY3QpIHsKICB0aGlzLmNvbnRleHRQcm92aWRlcl8gPSBvcHRfY29udGV4dFByb3ZpZGVyIHx8IG51bGw7CiAgdGhpcy54aHJTZW5kZXJfID0gZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLmRlZmF1bHRYaHJTZW5kZXI7CiAgdGhpcy5oYW5kbGVyVXJsXyA9IGhhbmRsZXJVcmw7CiAgb3B0X25vQXV0b1Byb3RlY3QgfHwgdGhpcy5zZXR1cF8oKQp9Owpnb29nLmluaGVyaXRzKGdvb2cuZGVidWcuRXJyb3JSZXBvcnRlciwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwpnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXIuRXhjZXB0aW9uRXZlbnQgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRFcnJvclJlcG9ydGVyJEV4Y2VwdGlvbkV2ZW50JChlcnJvcikgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLkV4Y2VwdGlvbkV2ZW50LlRZUEUpOwogIHRoaXMuZXJyb3IgPSBlcnJvcgp9Owpnb29nLmluaGVyaXRzKGdvb2cuZGVidWcuRXJyb3JSZXBvcnRlci5FeGNlcHRpb25FdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwpnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXIuRXhjZXB0aW9uRXZlbnQuVFlQRSA9IGdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJleGNlcHRpb24iKTsKZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLnByb3RvdHlwZS5lcnJvckhhbmRsZXJfID0gbnVsbDsKZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoImdvb2cuZGVidWcuRXJyb3JSZXBvcnRlciIpOwpnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXIuaW5zdGFsbCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJEVycm9yUmVwb3J0ZXIkaW5zdGFsbCQobG9nZ2luZ1VybCwgb3B0X2NvbnRleHRQcm92aWRlciwgb3B0X25vQXV0b1Byb3RlY3QpIHsKICB2YXIgaW5zdGFuY2UgPSBuZXcgZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyKGxvZ2dpbmdVcmwsIG9wdF9jb250ZXh0UHJvdmlkZXIsIG9wdF9ub0F1dG9Qcm90ZWN0KTsKICByZXR1cm4gaW5zdGFuY2UKfTsKZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLmRlZmF1bHRYaHJTZW5kZXIgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRFcnJvclJlcG9ydGVyJGRlZmF1bHRYaHJTZW5kZXIkKHVyaSwgbWV0aG9kLCBjb250ZW50LCBvcHRfaGVhZGVycykgewogIGdvb2cubmV0LlhocklvLnNlbmQodXJpLCBudWxsLCBtZXRob2QsIGNvbnRlbnQsIG9wdF9oZWFkZXJzKQp9Owpnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXIucHJvdG90eXBlLnNldHVwXyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJEVycm9yUmVwb3J0ZXIkJHNldHVwXyQoKSB7CiAgZ29vZy51c2VyQWdlbnQuSUUgPyBnb29nLmRlYnVnLmNhdGNoRXJyb3JzKGdvb2cuYmluZCh0aGlzLmhhbmRsZUV4Y2VwdGlvbiwgdGhpcyksICExLCBudWxsKSA6ICh0aGlzLmVycm9ySGFuZGxlcl8gPSBuZXcgZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXIoZ29vZy5iaW5kKHRoaXMuaGFuZGxlRXhjZXB0aW9uLCB0aGlzKSksIHRoaXMuZXJyb3JIYW5kbGVyXy5wcm90ZWN0V2luZG93U2V0VGltZW91dCgpLCB0aGlzLmVycm9ySGFuZGxlcl8ucHJvdGVjdFdpbmRvd1NldEludGVydmFsKCksIGdvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5Lm1vbml0b3JBbGwodGhpcy5lcnJvckhhbmRsZXJfKSkKfTsKZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLnByb3RvdHlwZS5oYW5kbGVFeGNlcHRpb24gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRFcnJvclJlcG9ydGVyJCRoYW5kbGVFeGNlcHRpb24kKGUsIG9wdF9jb250ZXh0KSB7CiAgdmFyIGVycm9yID0gZ29vZy5kZWJ1Zy5ub3JtYWxpemVFcnJvck9iamVjdChlKSwgY29udGV4dCA9IG9wdF9jb250ZXh0ID8gZ29vZy5vYmplY3QuY2xvbmUob3B0X2NvbnRleHQpIDoge307CiAgaWYodGhpcy5jb250ZXh0UHJvdmlkZXJfKSB7CiAgICB0cnkgewogICAgICB0aGlzLmNvbnRleHRQcm92aWRlcl8oZXJyb3IsIGNvbnRleHQpCiAgICB9Y2F0Y2goZXJyKSB7CiAgICAgIGdvb2cuZGVidWcuRXJyb3JSZXBvcnRlci5sb2dnZXJfLnNldmVyZSgiQ29udGV4dCBwcm92aWRlciB0aHJldyBhbiBleGNlcHRpb246ICIgKyBlcnIubWVzc2FnZSkKICAgIH0KICB9CiAgdGhpcy5zZW5kRXJyb3JSZXBvcnQoZXJyb3IubWVzc2FnZSwgZXJyb3IuZmlsZU5hbWUsIGVycm9yLmxpbmVOdW1iZXIsIGVycm9yLnN0YWNrLCBjb250ZXh0KTsKICB0cnkgewogICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXIuRXhjZXB0aW9uRXZlbnQoZXJyb3IsIGNvbnRleHQpKQogIH1jYXRjaChleCkgewogIH0KfTsKZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLnByb3RvdHlwZS5zZW5kRXJyb3JSZXBvcnQgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRFcnJvclJlcG9ydGVyJCRzZW5kRXJyb3JSZXBvcnQkKG1lc3NhZ2UsIGZpbGVOYW1lLCBsaW5lLCBvcHRfdHJhY2UsIG9wdF9jb250ZXh0KSB7CiAgdHJ5IHsKICAgIHZhciByZXF1ZXN0VXJsID0gZ29vZy51cmkudXRpbHMuYXBwZW5kUGFyYW1zKHRoaXMuaGFuZGxlclVybF8sICJzY3JpcHQiLCBmaWxlTmFtZSwgImVycm9yIiwgbWVzc2FnZSwgImxpbmUiLCBsaW5lKSwgcXVlcnlNYXAgPSB7fTsKICAgIHF1ZXJ5TWFwLnRyYWNlID0gb3B0X3RyYWNlOwogICAgaWYob3B0X2NvbnRleHQpIHsKICAgICAgZm9yKHZhciBlbnRyeSBpbiBvcHRfY29udGV4dCkgewogICAgICAgIHF1ZXJ5TWFwWyJjb250ZXh0LiIgKyBlbnRyeV0gPSBvcHRfY29udGV4dFtlbnRyeV0KICAgICAgfQogICAgfQogICAgdmFyIHF1ZXJ5RGF0YSA9IGdvb2cudXJpLnV0aWxzLmJ1aWxkUXVlcnlEYXRhRnJvbU1hcChxdWVyeU1hcCk7CiAgICB0aGlzLnhoclNlbmRlcl8ocmVxdWVzdFVybCwgIlBPU1QiLCBxdWVyeURhdGEsIHRoaXMuZXh0cmFIZWFkZXJzXykKICB9Y2F0Y2goZSkgewogICAgdmFyIGxvZ01lc3NhZ2UgPSBnb29nLnN0cmluZy5idWlsZFN0cmluZygiRXJyb3Igb2NjdXJyZWQgaW4gc2VuZGluZyBhbiBlcnJvciByZXBvcnQuXG5cbiIsICJzY3JpcHQ6IiwgZmlsZU5hbWUsICJcbiIsICJsaW5lOiIsIGxpbmUsICJcbiIsICJlcnJvcjoiLCBtZXNzYWdlLCAiXG4iLCAidHJhY2U6Iiwgb3B0X3RyYWNlKTsKICAgIGdvb2cuZGVidWcuRXJyb3JSZXBvcnRlci5sb2dnZXJfLmluZm8obG9nTWVzc2FnZSkKICB9Cn07Cmdvb2cuZGVidWcuRXJyb3JSZXBvcnRlci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRXJyb3JSZXBvcnRlciQkZGlzcG9zZUludGVybmFsJCgpIHsKICBnb29nLmRpc3Bvc2UodGhpcy5lcnJvckhhbmRsZXJfKTsKICBnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKY2hhdC5jb21tb24uRXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEVycm9ySGFuZGxlciQocmVwb3J0VXJsKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyLmNhbGwodGhpcyk7CiAgdGhpcy5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJjaGF0LmNvbW1vbi5FcnJvckhhbmRsZXIiKTsKICB0aGlzLnJlcG9ydGVyXyA9IGdvb2cuZGVidWcuRXJyb3JSZXBvcnRlci5pbnN0YWxsKHJlcG9ydFVybCk7CiAgdGhpcy5saXN0ZW4odGhpcy5yZXBvcnRlcl8sIGdvb2cuZGVidWcuRXJyb3JSZXBvcnRlci5FeGNlcHRpb25FdmVudC5UWVBFLCB0aGlzLmhhbmRsZUV4Y2VwdGlvbl8pCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5jb21tb24uRXJyb3JIYW5kbGVyLCBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIpOwpjaGF0LmNvbW1vbi5FcnJvckhhbmRsZXIuZXJyb3JIYW5kbGVyXyA9IG51bGw7CmNoYXQuY29tbW9uLkVycm9ySGFuZGxlci5pbnN0YWxsRXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEVycm9ySGFuZGxlciRpbnN0YWxsRXJyb3JIYW5kbGVyJChyZXBvcnRVcmwpIHsKICBjaGF0LmNvbW1vbi5FcnJvckhhbmRsZXIuZXJyb3JIYW5kbGVyXyA9IG5ldyBjaGF0LmNvbW1vbi5FcnJvckhhbmRsZXIocmVwb3J0VXJsKQp9OwpjaGF0LmNvbW1vbi5FcnJvckhhbmRsZXIuaXNFcnJvckhhbmRsZXJJbnN0YWxsZWQgPSBmdW5jdGlvbiAkY2hhdCRjb21tb24kRXJyb3JIYW5kbGVyJGlzRXJyb3JIYW5kbGVySW5zdGFsbGVkJCgpIHsKICByZXR1cm4gZ29vZy5pc0RlZkFuZE5vdE51bGwoY2hhdC5jb21tb24uRXJyb3JIYW5kbGVyLmVycm9ySGFuZGxlcl8pCn07CmNoYXQuY29tbW9uLkVycm9ySGFuZGxlci51bmluc3RhbGxFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAkY2hhdCRjb21tb24kRXJyb3JIYW5kbGVyJHVuaW5zdGFsbEVycm9ySGFuZGxlciQoKSB7CiAgY2hhdC5jb21tb24uRXJyb3JIYW5kbGVyLmlzRXJyb3JIYW5kbGVySW5zdGFsbGVkKCkgJiYgKGNoYXQuY29tbW9uLkVycm9ySGFuZGxlci5lcnJvckhhbmRsZXJfLmRpc3Bvc2UoKSwgY2hhdC5jb21tb24uRXJyb3JIYW5kbGVyLmVycm9ySGFuZGxlcl8gPSBudWxsKQp9OwpjaGF0LmNvbW1vbi5FcnJvckhhbmRsZXIucmVwb3J0VW5leHBlY3RlZENvZGVQYXRoID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEVycm9ySGFuZGxlciRyZXBvcnRVbmV4cGVjdGVkQ29kZVBhdGgkKHVzZXIsIG1lc3NhZ2UsIGRhdGEpIHsKICB2YXIgZXJyb3JIYW5kbGVyID0gY2hhdC5jb21tb24uRXJyb3JIYW5kbGVyLmVycm9ySGFuZGxlcl87CiAgaWYoZXJyb3JIYW5kbGVyKSB7CiAgICB2YXIgZXJyb3IgPSBFcnJvcigpLCBiYXNlTmFtZSA9ICgiIiArIGVycm9yLmZpbGVOYW1lKS5zcGxpdCgvW1wvXFxdLykucG9wKCksIGNvbnRleHQgPSB7fTsKICAgIGNvbnRleHQudXNlciA9IHVzZXI7CiAgICBjb250ZXh0LmRhdGEgPSBkYXRhOwogICAgY29udGV4dC5tZXNzYWdlID0gbWVzc2FnZTsKICAgIGVycm9ySGFuZGxlci5yZXBvcnRlcl8uc2VuZEVycm9yUmVwb3J0KHVzZXIgKyAiICIgKyBtZXNzYWdlICsgIiAiICsgZGF0YSwgYmFzZU5hbWUsIDEsIGVycm9yLnN0YWNrLCBjb250ZXh0KQogIH0KfTsKY2hhdC5jb21tb24uRXJyb3JIYW5kbGVyLnJlcG9ydEVycm9yID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEVycm9ySGFuZGxlciRyZXBvcnRFcnJvciQoZSkgewogIHZhciBlcnJvckhhbmRsZXIgPSBjaGF0LmNvbW1vbi5FcnJvckhhbmRsZXIuZXJyb3JIYW5kbGVyXzsKICBpZihlcnJvckhhbmRsZXIpIHsKICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcl8oZSk7CiAgICB2YXIgZXJyb3IgPSBnb29nLmRlYnVnLm5vcm1hbGl6ZUVycm9yT2JqZWN0KGUpLCBiYXNlTmFtZSA9ICgiIiArIGVycm9yLmZpbGVOYW1lKS5zcGxpdCgvW1wvXFxdLykucG9wKCk7CiAgICBlcnJvckhhbmRsZXIucmVwb3J0ZXJfLnNlbmRFcnJvclJlcG9ydChlcnJvci5tZXNzYWdlLCBiYXNlTmFtZSwgZXJyb3IubGluZU51bWJlciwgZXJyb3Iuc3RhY2spCiAgfQp9OwpjaGF0LmNvbW1vbi5FcnJvckhhbmRsZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRjaGF0JGNvbW1vbiRFcnJvckhhbmRsZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgZ29vZy5kaXNwb3NlKHRoaXMucmVwb3J0ZXJfKTsKICBjaGF0LmNvbW1vbi5FcnJvckhhbmRsZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKY2hhdC5jb21tb24uRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGVFeGNlcHRpb25fID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEVycm9ySGFuZGxlciQkaGFuZGxlRXhjZXB0aW9uXyQoZXhjZXB0aW9uRXZlbnQpIHsKICB0aGlzLmxvZ0Vycm9yXyhleGNlcHRpb25FdmVudC5lcnJvcikKfTsKY2hhdC5jb21tb24uRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5sb2dFcnJvcl8gPSBmdW5jdGlvbiAkY2hhdCRjb21tb24kRXJyb3JIYW5kbGVyJCRsb2dFcnJvcl8kKGVycm9yKSB7CiAgaWYoZXJyb3IpIHsKICAgIHZhciBvdXRwdXQgPSBnb29nLmRlYnVnLmV4cG9zZUV4Y2VwdGlvbihlcnJvcik7CiAgICB0aGlzLmxvZ2dlcl8uc2V2ZXJlKG91dHB1dCk7CiAgICB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZXJyb3IgPyB3aW5kb3cuY29uc29sZS5lcnJvcihvdXRwdXQpIDogd2luZG93LmNvbnNvbGUubG9nICYmIHdpbmRvdy5jb25zb2xlLmxvZyhvdXRwdXQpKQogIH0KfTsKY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXIgPSBmdW5jdGlvbiAkY2hhdCRjbGllbnQkU2VydmVyTWVzc2FnZURpc3BhdGNoZXIkKCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlRGlzcGF0Y2hlciIpCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXIsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXIuU0VSVklDRV9JRCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyIik7CmNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyLnJlZ2lzdGVyID0gZnVuY3Rpb24gJGNoYXQkY2xpZW50JFNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyJHJlZ2lzdGVyJChhcHBDb250ZXh0KSB7CiAgdmFyIGRpc3BhdGNoZXIgPSBuZXcgY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXI7CiAgYXBwQ29udGV4dC5yZWdpc3RlclNlcnZpY2UoY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXIuU0VSVklDRV9JRCwgZGlzcGF0Y2hlcik7CiAgcmV0dXJuIGRpc3BhdGNoZXIKfTsKY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXIuZ2V0ID0gZnVuY3Rpb24gJGNoYXQkY2xpZW50JFNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyJGdldCQoYXBwQ29udGV4dCkgewogIHJldHVybiBhcHBDb250ZXh0LmdldChjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlRGlzcGF0Y2hlci5TRVJWSUNFX0lEKQp9OwpjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlRGlzcGF0Y2hlci5wcm90b3R5cGUuaGFuZGxlID0gZnVuY3Rpb24gJGNoYXQkY2xpZW50JFNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyJCRoYW5kbGUkKG1zZykgewogIHRoaXMubG9nZ2VyXy5maW5lc3QoInJlY2VpdmVkOiAiICsgbXNnKTsKICByZXR1cm4gZ29vZy5ldmVudHMuaGFzTGlzdGVuZXIodGhpcywgbXNnWzBdKSA/ICh0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyLk1lc3NhZ2VFdmVudChtc2dbMF0sIG1zZykpLCAhMCkgOiAhMQp9OwpjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlRGlzcGF0Y2hlci5NZXNzYWdlRXZlbnQgPSBmdW5jdGlvbiAkY2hhdCRjbGllbnQkU2VydmVyTWVzc2FnZURpc3BhdGNoZXIkTWVzc2FnZUV2ZW50JCh0eXBlLCBtc2cpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHR5cGUsIG1zZyk7CiAgdGhpcy5tc2cgPSBtc2cKfTsKZ29vZy5pbmhlcml0cyhjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlRGlzcGF0Y2hlci5NZXNzYWdlRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXIuTWVzc2FnZUV2ZW50LnByb3RvdHlwZS5nZXRKc3BiID0gZnVuY3Rpb24gJGNoYXQkY2xpZW50JFNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyJE1lc3NhZ2VFdmVudCQkZ2V0SnNwYiQoKSB7CiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5idWlsZE1lc3NhZ2VGcm9tQXJyYXkodGhpcy5tc2cpCn07CnByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENoYXRTdG9yZVVwZGF0ZSQob3B0X2RhdGEpIHsKICBqc3BiLk1lc3NhZ2UuY2FsbCh0aGlzKTsKICB0aGlzLmFycmF5ID0gb3B0X2RhdGEgfHwgWyJjc3UiXTsKICB0aGlzLmFycmF5WzRdID0gdGhpcy5hcnJheVs0XSB8fCBbXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUubWVzc2FnZUlkID0gImNzdSI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUubWVzc2FnZUlkLCBwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlKTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2hhdFN0b3JlVXBkYXRlJCRnZXRKc1BiTWVzc2FnZUlkJCgpIHsKICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5tZXNzYWdlSWQKfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5wcm90b3R5cGUuZ2V0SmlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDaGF0U3RvcmVVcGRhdGUkJGdldEppZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMV0KfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5wcm90b3R5cGUuc2V0SmlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDaGF0U3RvcmVVcGRhdGUkJHNldEppZCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzFdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5wcm90b3R5cGUuZ2V0UmVhZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2hhdFN0b3JlVXBkYXRlJCRnZXRSZWFkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsyXQp9Owpwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLnByb3RvdHlwZS5nZXRVaVN0YXRlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDaGF0U3RvcmVVcGRhdGUkJGdldFVpU3RhdGUkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzNdCn07CnByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUucHJvdG90eXBlLnNldFVpU3RhdGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENoYXRTdG9yZVVwZGF0ZSQkc2V0VWlTdGF0ZSQodmFsdWUpIHsKICB0aGlzLmFycmF5WzNdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5wcm90b3R5cGUuZ2V0TWVzc2FnZXNMaXN0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDaGF0U3RvcmVVcGRhdGUkJGdldE1lc3NhZ2VzTGlzdCQoKSB7CiAgaWYoIXRoaXMubWVzc2FnZXNfKSB7CiAgICB0aGlzLm1lc3NhZ2VzXyA9IFtdOwogICAgZm9yKHZhciBpID0gMDtpIDwgdGhpcy5hcnJheVs0XS5sZW5ndGg7aSsrKSB7CiAgICAgIHRoaXMubWVzc2FnZXNfW2ldID0gbmV3IHByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUuTWVzc2FnZSh0aGlzLmFycmF5WzRdW2ldKQogICAgfQogIH0KICByZXR1cm4gdGhpcy5tZXNzYWdlc18KfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5VaVN0YXRlID0ge0lOSVQ6MSwgQ0xPU0VEOjIsIE1JTklNSVpFRDozLCBPUEVOOjR9Owpwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLk1lc3NhZ2UgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENoYXRTdG9yZVVwZGF0ZSRNZXNzYWdlJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUuTWVzc2FnZSwganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5NZXNzYWdlLnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2hhdFN0b3JlVXBkYXRlJE1lc3NhZ2UkJGdldElkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVswXQp9Owpwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLk1lc3NhZ2UucHJvdG90eXBlLmdldFR5cGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENoYXRTdG9yZVVwZGF0ZSRNZXNzYWdlJCRnZXRUeXBlJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxXQp9Owpwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLk1lc3NhZ2UucHJvdG90eXBlLnNldFR5cGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENoYXRTdG9yZVVwZGF0ZSRNZXNzYWdlJCRzZXRUeXBlJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMV0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLk1lc3NhZ2UucHJvdG90eXBlLmdldFRpbWVzdGFtcCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2hhdFN0b3JlVXBkYXRlJE1lc3NhZ2UkJGdldFRpbWVzdGFtcCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMl0KfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5NZXNzYWdlLnByb3RvdHlwZS5nZXRPdHIgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENoYXRTdG9yZVVwZGF0ZSRNZXNzYWdlJCRnZXRPdHIkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzNdCn07CnByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUuTWVzc2FnZS5wcm90b3R5cGUuZ2V0U2VuZGVyID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDaGF0U3RvcmVVcGRhdGUkTWVzc2FnZSQkZ2V0U2VuZGVyJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs0XQp9Owpwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLk1lc3NhZ2UucHJvdG90eXBlLmdldEJvZHkgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENoYXRTdG9yZVVwZGF0ZSRNZXNzYWdlJCRnZXRCb2R5JCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs1XQp9Owpwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLk1lc3NhZ2UucHJvdG90eXBlLmdldFBhcnNlZEJvZHkgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENoYXRTdG9yZVVwZGF0ZSRNZXNzYWdlJCRnZXRQYXJzZWRCb2R5JCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs2XQp9Owpwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLk1lc3NhZ2UucHJvdG90eXBlLmdldEljb25TZXQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENoYXRTdG9yZVVwZGF0ZSRNZXNzYWdlJCRnZXRJY29uU2V0JCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs3XQp9Owpwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLk1lc3NhZ2UucHJvdG90eXBlLmdldE1lZGlhSXRlbXMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENoYXRTdG9yZVVwZGF0ZSRNZXNzYWdlJCRnZXRNZWRpYUl0ZW1zJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs4XQp9Owpwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLk1lc3NhZ2UucHJvdG90eXBlLmdldElzUmVmbGVjdGVkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDaGF0U3RvcmVVcGRhdGUkTWVzc2FnZSQkZ2V0SXNSZWZsZWN0ZWQkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzldCn07Ci8qCiBQb3J0aW9ucyBvZiB0aGlzIGNvZGUgYXJlIGZyb20gTW9jaGlLaXQsIHJlY2VpdmVkIGJ5CiBUaGUgQ2xvc3VyZSBBdXRob3JzIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4gQWxsIG90aGVyIGNvZGUgaXMgQ29weXJpZ2h0CiAyMDA1LTIwMDkgVGhlIENsb3N1cmUgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKi8KZ29vZy5hc3luYyA9IHt9Owpnb29nLmFzeW5jLkRlZmVycmVkID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkKG9wdF9jYW5jZWxsZXIsIG9wdF9kZWZhdWx0U2NvcGUpIHsKICB0aGlzLmNoYWluXyA9IFtdOwogIHRoaXMuY2FuY2VsbGVyXyA9IG9wdF9jYW5jZWxsZXI7CiAgdGhpcy5kZWZhdWx0U2NvcGVfID0gb3B0X2RlZmF1bHRTY29wZSB8fCBudWxsCn07Cmdvb2cuYXN5bmMuRGVmZXJyZWQucHJvdG90eXBlLmZpcmVkXyA9ICExOwpnb29nLmFzeW5jLkRlZmVycmVkLnByb3RvdHlwZS5oYWRFcnJvcl8gPSAhMTsKZ29vZy5hc3luYy5EZWZlcnJlZC5wcm90b3R5cGUucGF1c2VkXyA9IDA7Cmdvb2cuYXN5bmMuRGVmZXJyZWQucHJvdG90eXBlLnNpbGVudGx5Q2FuY2VsbGVkXyA9ICExOwpnb29nLmFzeW5jLkRlZmVycmVkLnByb3RvdHlwZS5jaGFpbmVkXyA9ICExOwpnb29nLmFzeW5jLkRlZmVycmVkLnByb3RvdHlwZS5icmFuY2hlc18gPSAwOwpnb29nLmFzeW5jLkRlZmVycmVkLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAkZ29vZyRhc3luYyREZWZlcnJlZCQkY2FuY2VsJChvcHRfZGVlcENhbmNlbCkgewogIGlmKHRoaXMuaGFzRmlyZWQoKSkgewogICAgdGhpcy5yZXN1bHRfIGluc3RhbmNlb2YgZ29vZy5hc3luYy5EZWZlcnJlZCAmJiB0aGlzLnJlc3VsdF8uY2FuY2VsKCkKICB9ZWxzZSB7CiAgICBpZih0aGlzLnBhcmVudF8pIHsKICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50XzsKICAgICAgZGVsZXRlIHRoaXMucGFyZW50XzsKICAgICAgb3B0X2RlZXBDYW5jZWwgPyBwYXJlbnQuY2FuY2VsKG9wdF9kZWVwQ2FuY2VsKSA6IHBhcmVudC5icmFuY2hDYW5jZWxfKCkKICAgIH0KICAgIHRoaXMuY2FuY2VsbGVyXyA/IHRoaXMuY2FuY2VsbGVyXy5jYWxsKHRoaXMuZGVmYXVsdFNjb3BlXywgdGhpcykgOiB0aGlzLnNpbGVudGx5Q2FuY2VsbGVkXyA9ICEwOwogICAgdGhpcy5oYXNGaXJlZCgpIHx8IHRoaXMuZXJyYmFjayhuZXcgZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxsZWRFcnJvcih0aGlzKSkKICB9Cn07Cmdvb2cuYXN5bmMuRGVmZXJyZWQucHJvdG90eXBlLmJyYW5jaENhbmNlbF8gPSBmdW5jdGlvbiAkZ29vZyRhc3luYyREZWZlcnJlZCQkYnJhbmNoQ2FuY2VsXyQoKSB7CiAgdGhpcy5icmFuY2hlc18tLTsKICAwID49IHRoaXMuYnJhbmNoZXNfICYmIHRoaXMuY2FuY2VsKCkKfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5wcm90b3R5cGUucGF1c2VfID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkJHBhdXNlXyQoKSB7CiAgdGhpcy5wYXVzZWRfKysKfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5wcm90b3R5cGUudW5wYXVzZV8gPSBmdW5jdGlvbiAkZ29vZyRhc3luYyREZWZlcnJlZCQkdW5wYXVzZV8kKCkgewogIHRoaXMucGF1c2VkXy0tOwogIDAgPT0gdGhpcy5wYXVzZWRfICYmIHRoaXMuaGFzRmlyZWQoKSAmJiB0aGlzLmZpcmVfKCkKfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5wcm90b3R5cGUuY29udGludWVfID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkJGNvbnRpbnVlXyQoaXNTdWNjZXNzLCByZXMpIHsKICB0aGlzLnJlc2JhY2tfKGlzU3VjY2VzcywgcmVzKTsKICB0aGlzLnVucGF1c2VfKCkKfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5wcm90b3R5cGUucmVzYmFja18gPSBmdW5jdGlvbiAkZ29vZyRhc3luYyREZWZlcnJlZCQkcmVzYmFja18kKGlzU3VjY2VzcywgcmVzKSB7CiAgdGhpcy5maXJlZF8gPSAhMDsKICB0aGlzLnJlc3VsdF8gPSByZXM7CiAgdGhpcy5oYWRFcnJvcl8gPSAhaXNTdWNjZXNzOwogIHRoaXMuZmlyZV8oKQp9Owpnb29nLmFzeW5jLkRlZmVycmVkLnByb3RvdHlwZS5jaGVja18gPSBmdW5jdGlvbiAkZ29vZyRhc3luYyREZWZlcnJlZCQkY2hlY2tfJCgpIHsKICBpZih0aGlzLmhhc0ZpcmVkKCkpIHsKICAgIGlmKCF0aGlzLnNpbGVudGx5Q2FuY2VsbGVkXykgewogICAgICB0aHJvdyBuZXcgZ29vZy5hc3luYy5EZWZlcnJlZC5BbHJlYWR5Q2FsbGVkRXJyb3IodGhpcyk7CiAgICB9CiAgICB0aGlzLnNpbGVudGx5Q2FuY2VsbGVkXyA9ICExCiAgfQp9Owpnb29nLmFzeW5jLkRlZmVycmVkLnByb3RvdHlwZS5jYWxsYmFjayA9IGZ1bmN0aW9uICRnb29nJGFzeW5jJERlZmVycmVkJCRjYWxsYmFjayQocmVzdWx0KSB7CiAgdGhpcy5jaGVja18oKTsKICB0aGlzLmFzc2VydE5vdERlZmVycmVkXyhyZXN1bHQpOwogIHRoaXMucmVzYmFja18oITAsIHJlc3VsdCkKfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5wcm90b3R5cGUuZXJyYmFjayA9IGZ1bmN0aW9uICRnb29nJGFzeW5jJERlZmVycmVkJCRlcnJiYWNrJChyZXN1bHQpIHsKICB0aGlzLmNoZWNrXygpOwogIHRoaXMuYXNzZXJ0Tm90RGVmZXJyZWRfKHJlc3VsdCk7CiAgdGhpcy5yZXNiYWNrXyghMSwgcmVzdWx0KQp9Owpnb29nLmFzeW5jLkRlZmVycmVkLnByb3RvdHlwZS5hc3NlcnROb3REZWZlcnJlZF8gPSBmdW5jdGlvbiAkZ29vZyRhc3luYyREZWZlcnJlZCQkYXNzZXJ0Tm90RGVmZXJyZWRfJChvYmopIHsKICBnb29nLmFzc2VydHMuYXNzZXJ0KCEob2JqIGluc3RhbmNlb2YgZ29vZy5hc3luYy5EZWZlcnJlZCksICJEZWZlcnJlZCBpbnN0YW5jZXMgY2FuIG9ubHkgYmUgY2hhaW5lZCBpZiB0aGV5IGFyZSB0aGUgcmVzdWx0IG9mIGEgY2FsbGJhY2siKQp9Owpnb29nLmFzeW5jLkRlZmVycmVkLnByb3RvdHlwZS5hZGRDYWxsYmFjayA9IGZ1bmN0aW9uICRnb29nJGFzeW5jJERlZmVycmVkJCRhZGRDYWxsYmFjayQoY2IsIG9wdF9zY29wZSkgewogIHJldHVybiB0aGlzLmFkZENhbGxiYWNrcyhjYiwgbnVsbCwgb3B0X3Njb3BlKQp9Owpnb29nLmFzeW5jLkRlZmVycmVkLnByb3RvdHlwZS5hZGRFcnJiYWNrID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkJGFkZEVycmJhY2skKGViLCBvcHRfc2NvcGUpIHsKICByZXR1cm4gdGhpcy5hZGRDYWxsYmFja3MobnVsbCwgZWIsIG9wdF9zY29wZSkKfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5wcm90b3R5cGUuYWRkQ2FsbGJhY2tzID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkJGFkZENhbGxiYWNrcyQoY2IsIGViLCBvcHRfc2NvcGUpIHsKICBnb29nLmFzc2VydHMuYXNzZXJ0KCF0aGlzLmNoYWluZWRfLCAiQ2hhaW5lZCBEZWZlcnJlZHMgY2FuIG5vdCBiZSByZS11c2VkIik7CiAgdGhpcy5jaGFpbl8ucHVzaChbY2IsIGViLCBvcHRfc2NvcGVdKTsKICB0aGlzLmhhc0ZpcmVkKCkgJiYgdGhpcy5maXJlXygpOwogIHJldHVybiB0aGlzCn07Cmdvb2cuYXN5bmMuRGVmZXJyZWQucHJvdG90eXBlLmNoYWluRGVmZXJyZWQgPSBmdW5jdGlvbiAkZ29vZyRhc3luYyREZWZlcnJlZCQkY2hhaW5EZWZlcnJlZCQob3RoZXJEZWZlcnJlZCkgewogIHRoaXMuYWRkQ2FsbGJhY2tzKG90aGVyRGVmZXJyZWQuY2FsbGJhY2ssIG90aGVyRGVmZXJyZWQuZXJyYmFjaywgb3RoZXJEZWZlcnJlZCk7CiAgcmV0dXJuIHRoaXMKfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5wcm90b3R5cGUuYnJhbmNoID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkJGJyYW5jaCQob3B0X3Byb3BhZ2F0ZUNhbmNlbCkgewogIHZhciBkID0gbmV3IGdvb2cuYXN5bmMuRGVmZXJyZWQ7CiAgdGhpcy5jaGFpbkRlZmVycmVkKGQpOwogIG9wdF9wcm9wYWdhdGVDYW5jZWwgJiYgKGQucGFyZW50XyA9IHRoaXMsIHRoaXMuYnJhbmNoZXNfKyspOwogIHJldHVybiBkCn07Cmdvb2cuYXN5bmMuRGVmZXJyZWQucHJvdG90eXBlLmhhc0ZpcmVkID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkJGhhc0ZpcmVkJCgpIHsKICByZXR1cm4gdGhpcy5maXJlZF8KfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5wcm90b3R5cGUuaXNFcnJvciA9IGZ1bmN0aW9uICRnb29nJGFzeW5jJERlZmVycmVkJCRpc0Vycm9yJChyZXMpIHsKICByZXR1cm4gcmVzIGluc3RhbmNlb2YgRXJyb3IKfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5wcm90b3R5cGUuaGFzRXJyYmFja18gPSBmdW5jdGlvbiAkZ29vZyRhc3luYyREZWZlcnJlZCQkaGFzRXJyYmFja18kKCkgewogIHJldHVybiBnb29nLmFycmF5LnNvbWUodGhpcy5jaGFpbl8sIGZ1bmN0aW9uKGNoYWluUm93KSB7CiAgICByZXR1cm4gZ29vZy5pc0Z1bmN0aW9uKGNoYWluUm93WzFdKQogIH0pCn07Cmdvb2cuYXN5bmMuRGVmZXJyZWQucHJvdG90eXBlLmZpcmVfID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkJGZpcmVfJCgpIHsKICB0aGlzLnVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXRJZF8gJiYgdGhpcy5oYXNGaXJlZCgpICYmIHRoaXMuaGFzRXJyYmFja18oKSAmJiAoZ29vZy5nbG9iYWwuY2xlYXJUaW1lb3V0KHRoaXMudW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dElkXyksIGRlbGV0ZSB0aGlzLnVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXRJZF8pOwogIHRoaXMucGFyZW50XyAmJiAodGhpcy5wYXJlbnRfLmJyYW5jaGVzXy0tLCBkZWxldGUgdGhpcy5wYXJlbnRfKTsKICBmb3IodmFyIHJlcyA9IHRoaXMucmVzdWx0XywgdW5oYW5kbGVkRXhjZXB0aW9uID0gITEsIGlzQ2hhaW5lZCA9ICExO3RoaXMuY2hhaW5fLmxlbmd0aCAmJiAwID09IHRoaXMucGF1c2VkXzspIHsKICAgIHZhciBjaGFpbkVudHJ5ID0gdGhpcy5jaGFpbl8uc2hpZnQoKSwgY2FsbGJhY2sgPSBjaGFpbkVudHJ5WzBdLCBlcnJiYWNrID0gY2hhaW5FbnRyeVsxXSwgc2NvcGUgPSBjaGFpbkVudHJ5WzJdLCBmID0gdGhpcy5oYWRFcnJvcl8gPyBlcnJiYWNrIDogY2FsbGJhY2s7CiAgICBpZihmKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJldCA9IGYuY2FsbChzY29wZSB8fCB0aGlzLmRlZmF1bHRTY29wZV8sIHJlcyk7CiAgICAgICAgZ29vZy5pc0RlZihyZXQpICYmICh0aGlzLmhhZEVycm9yXyA9IHRoaXMuaGFkRXJyb3JfICYmIChyZXQgPT0gcmVzIHx8IHRoaXMuaXNFcnJvcihyZXQpKSwgdGhpcy5yZXN1bHRfID0gcmVzID0gcmV0KTsKICAgICAgICByZXMgaW5zdGFuY2VvZiBnb29nLmFzeW5jLkRlZmVycmVkICYmIChpc0NoYWluZWQgPSAhMCwgdGhpcy5wYXVzZV8oKSkKICAgICAgfWNhdGNoKGV4KSB7CiAgICAgICAgcmVzID0gZXgsIHRoaXMuaGFkRXJyb3JfID0gITAsIHRoaXMuaGFzRXJyYmFja18oKSB8fCAodW5oYW5kbGVkRXhjZXB0aW9uID0gITApCiAgICAgIH0KICAgIH0KICB9CiAgdGhpcy5yZXN1bHRfID0gcmVzOwogIGlzQ2hhaW5lZCAmJiB0aGlzLnBhdXNlZF8gJiYgKHJlcy5hZGRDYWxsYmFja3MoZ29vZy5iaW5kKHRoaXMuY29udGludWVfLCB0aGlzLCAhMCksIGdvb2cuYmluZCh0aGlzLmNvbnRpbnVlXywgdGhpcywgITEpKSwgcmVzLmNoYWluZWRfID0gITApOwogIHVuaGFuZGxlZEV4Y2VwdGlvbiAmJiAodGhpcy51bmhhbmRsZWRFeGNlcHRpb25UaW1lb3V0SWRfID0gZ29vZy5nbG9iYWwuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgIGdvb2cuREVCVUcgJiYgZ29vZy5pc0RlZihyZXMubWVzc2FnZSkgJiYgcmVzLnN0YWNrICYmIChyZXMubWVzc2FnZSArPSAiXG4iICsgcmVzLnN0YWNrKTsKICAgIHRocm93IHJlczsKICB9LCAwKSkKfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5zdWNjZWVkID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkc3VjY2VlZCQocmVzKSB7CiAgdmFyIGQgPSBuZXcgZ29vZy5hc3luYy5EZWZlcnJlZDsKICBkLmNhbGxiYWNrKHJlcyk7CiAgcmV0dXJuIGQKfTsKZ29vZy5hc3luYy5EZWZlcnJlZC5mYWlsID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkZmFpbCQocmVzKSB7CiAgdmFyIGQgPSBuZXcgZ29vZy5hc3luYy5EZWZlcnJlZDsKICBkLmVycmJhY2socmVzKTsKICByZXR1cm4gZAp9Owpnb29nLmFzeW5jLkRlZmVycmVkLmNhbmNlbGxlZCA9IGZ1bmN0aW9uICRnb29nJGFzeW5jJERlZmVycmVkJGNhbmNlbGxlZCQoKSB7CiAgdmFyIGQgPSBuZXcgZ29vZy5hc3luYy5EZWZlcnJlZDsKICBkLmNhbmNlbCgpOwogIHJldHVybiBkCn07Cmdvb2cuYXN5bmMuRGVmZXJyZWQud2hlbiA9IGZ1bmN0aW9uICRnb29nJGFzeW5jJERlZmVycmVkJHdoZW4kKHZhbHVlLCBjYWxsYmFjaywgb3B0X3Njb3BlKSB7CiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgZ29vZy5hc3luYy5EZWZlcnJlZCA/IHZhbHVlLmJyYW5jaCghMCkuYWRkQ2FsbGJhY2soY2FsbGJhY2ssIG9wdF9zY29wZSkgOiBnb29nLmFzeW5jLkRlZmVycmVkLnN1Y2NlZWQodmFsdWUpLmFkZENhbGxiYWNrKGNhbGxiYWNrLCBvcHRfc2NvcGUpCn07Cmdvb2cuYXN5bmMuRGVmZXJyZWQuQWxyZWFkeUNhbGxlZEVycm9yID0gZnVuY3Rpb24gJGdvb2ckYXN5bmMkRGVmZXJyZWQkQWxyZWFkeUNhbGxlZEVycm9yJCgpIHsKICBnb29nLmRlYnVnLkVycm9yLmNhbGwodGhpcykKfTsKZ29vZy5pbmhlcml0cyhnb29nLmFzeW5jLkRlZmVycmVkLkFscmVhZHlDYWxsZWRFcnJvciwgZ29vZy5kZWJ1Zy5FcnJvcik7Cmdvb2cuYXN5bmMuRGVmZXJyZWQuQWxyZWFkeUNhbGxlZEVycm9yLnByb3RvdHlwZS5tZXNzYWdlID0gIkFscmVhZHkgY2FsbGVkIjsKZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxsZWRFcnJvciA9IGZ1bmN0aW9uICRnb29nJGFzeW5jJERlZmVycmVkJENhbmNlbGxlZEVycm9yJCgpIHsKICBnb29nLmRlYnVnLkVycm9yLmNhbGwodGhpcykKfTsKZ29vZy5pbmhlcml0cyhnb29nLmFzeW5jLkRlZmVycmVkLkNhbmNlbGxlZEVycm9yLCBnb29nLmRlYnVnLkVycm9yKTsKZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxsZWRFcnJvci5wcm90b3R5cGUubWVzc2FnZSA9ICJEZWZlcnJlZCB3YXMgY2FuY2VsbGVkIjsKZmF2YS5BcHBDb250ZXh0RXZlbnRUeXBlID0ge0FTWU5DX1NFUlZJQ0VfQ09ERV9MT0FESU5HOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJhc3luYy1zZXJ2aWNlLWNvZGUtbG9hZGluZyIpLCBBU1lOQ19TRVJWSUNFX0NPREVfTE9BREVEOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJhc3luYy1zZXJ2aWNlLWNvZGUtbG9hZGVkIil9OwpmYXZhLkFwcENvbnRleHQgPSBmdW5jdGlvbiAkZmF2YSRBcHBDb250ZXh0JChvcHRfcGFyZW50QXBwQ29udGV4dCkgewogIGdvb2cuRGlzcG9zYWJsZS5jYWxsKHRoaXMpOwogIGdvb2cuREVCVUcgJiYgKHRoaXMuaWQgPSBmYXZhLkFwcENvbnRleHQubmV4dElkXysrLCB0aGlzLnNlcnZpY2VSZWdpc3RyYXRpb25PcmRlciA9IFtdKTsKICB0aGlzLnNlcnZpY2VzXyA9IHt9OwogIHRoaXMubGF0ZVNlcnZpY2VNb2R1bGVJZE1hcF8gPSB7fTsKICB0aGlzLnNlcnZpY2VGYWN0b3J5TWFwXyA9IHt9OwogIHRoaXMuc2VydmljZUNhbGxiYWNrc18gPSB7fTsKICB0aGlzLmFzeW5jRGVmZXJyYWxzXyA9IHt9OwogIHRoaXMubm9Jbmhlcml0TWFwXyA9IHt9OwogIHRoaXMuZXZlbnRUYXJnZXRfID0gb3B0X3BhcmVudEFwcENvbnRleHQgPyBvcHRfcGFyZW50QXBwQ29udGV4dC5nZXRFdmVudFRhcmdldCgpIDogbmV3IGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0OwogIHRoaXMuc2hvdWxkRGlzcG9zZUV2ZW50VGFyZ2V0XyA9ICFvcHRfcGFyZW50QXBwQ29udGV4dDsKICB0aGlzLnBhcmVudEFwcENvbnRleHRfID0gbnVsbDsKICBvcHRfcGFyZW50QXBwQ29udGV4dCA/ICh0aGlzLnBhcmVudEFwcENvbnRleHRfID0gb3B0X3BhcmVudEFwcENvbnRleHQsIHRoaXMuc2VydmljZUZhY3RvcnlNYXBfID0gb3B0X3BhcmVudEFwcENvbnRleHQuc2VydmljZUZhY3RvcnlNYXBfLCB0aGlzLnNlcnZpY2VDYWxsYmFja3NfID0gb3B0X3BhcmVudEFwcENvbnRleHQuc2VydmljZUNhbGxiYWNrc18sIHRoaXMubGF0ZVNlcnZpY2VNb2R1bGVJZE1hcF8gPSBvcHRfcGFyZW50QXBwQ29udGV4dC5sYXRlU2VydmljZU1vZHVsZUlkTWFwXywgdGhpcy5hc3luY0RlZmVycmFsc18gPSBvcHRfcGFyZW50QXBwQ29udGV4dC5hc3luY0RlZmVycmFsc18pIDogZmF2YS5BcHBDb250ZXh0LnRpbWVJbml0aWFsaXplZF8gPSBnb29nLm5vdygpOwogIHZhciByb290QXBwQ29udGV4dCA9IHRoaXMuZ2V0Um9vdEFwcENvbnRleHQoKTsKICB0aGlzICE9IHJvb3RBcHBDb250ZXh0ICYmIChyb290QXBwQ29udGV4dC5jaGlsZEFwcENvbnRleHRzXyA/IHJvb3RBcHBDb250ZXh0LmNoaWxkQXBwQ29udGV4dHNfLnB1c2godGhpcykgOiByb290QXBwQ29udGV4dC5jaGlsZEFwcENvbnRleHRzXyA9IFt0aGlzXSkKfTsKZ29vZy5pbmhlcml0cyhmYXZhLkFwcENvbnRleHQsIGdvb2cuRGlzcG9zYWJsZSk7Cmdvb2cuREVCVUcgJiYgKGZhdmEuQXBwQ29udGV4dC5uZXh0SWRfID0gMSk7CmZhdmEuQXBwQ29udGV4dC5wcm90b3R5cGUuZ2V0Um9vdEFwcENvbnRleHQgPSBmdW5jdGlvbiAkZmF2YSRBcHBDb250ZXh0JCRnZXRSb290QXBwQ29udGV4dCQoKSB7CiAgZm9yKHZhciBjb250ZXh0ID0gdGhpcztjb250ZXh0LnBhcmVudEFwcENvbnRleHRfOykgewogICAgY29udGV4dCA9IGNvbnRleHQucGFyZW50QXBwQ29udGV4dF8KICB9CiAgcmV0dXJuIGNvbnRleHQKfTsKZmF2YS5BcHBDb250ZXh0LnByb3RvdHlwZS5kZXNjZW5kc0Zyb21fID0gZnVuY3Rpb24gJGZhdmEkQXBwQ29udGV4dCQkZGVzY2VuZHNGcm9tXyQoYXBwQ29udGV4dCkgewogIGZvcih2YXIgY2FuZGlkYXRlID0gdGhpcztjYW5kaWRhdGU7KSB7CiAgICBpZihjYW5kaWRhdGUgPT0gYXBwQ29udGV4dCkgewogICAgICByZXR1cm4hMAogICAgfQogICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlLnBhcmVudEFwcENvbnRleHRfCiAgfQogIHJldHVybiExCn07CmZhdmEuQXBwQ29udGV4dC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gJGZhdmEkQXBwQ29udGV4dCQkZ2V0JChpZCkgewogIHZhciBzZXJ2aWNlID0gdGhpcy5nZXRPck51bGwoaWQpOwogIGdvb2cuREVCVUcgJiYgIXNlcnZpY2UgJiYgdGhpcy5kaXNhYmxlUmVnaXN0cmF0aW9uRXhjZXB0aW9uXyAmJiAoc2VydmljZSA9IHtCT0dVUzoiU2VydmljZSAiICsgaWQgKyAiIHdhcyBub3QgcmVnaXN0ZXJlZCJ9KTsKICBpZighc2VydmljZSkgewogICAgdGhyb3cgbmV3IGZhdmEuQXBwQ29udGV4dC5JbnZhbGlkU2VydmljZUVycm9yKGlkKTsKICB9CiAgcmV0dXJuIHNlcnZpY2UKfTsKZmF2YS5BcHBDb250ZXh0LnByb3RvdHlwZS5pc1JlZ2lzdGVyZWQgPSBmdW5jdGlvbiAkZmF2YSRBcHBDb250ZXh0JCRpc1JlZ2lzdGVyZWQkKGlkKSB7CiAgcmV0dXJuISghdGhpcy5zZXJ2aWNlc19baWRdICYmICF0aGlzLmdldFNlcnZpY2VGYWN0b3J5KGlkKSkKfTsKZmF2YS5BcHBDb250ZXh0LnByb3RvdHlwZS5nZXRPck51bGwgPSBmdW5jdGlvbiAkZmF2YSRBcHBDb250ZXh0JCRnZXRPck51bGwkKGlkKSB7CiAgZm9yKHZhciBjb250ZXh0ID0gdGhpcztjb250ZXh0O2NvbnRleHQgPSBjb250ZXh0LnBhcmVudEFwcENvbnRleHRfKSB7CiAgICBpZihjb250ZXh0LnNlcnZpY2VzX1tpZF0pIHsKICAgICAgcmV0dXJuIGNvbnRleHQuc2VydmljZXNfW2lkXVswXQogICAgfQogICAgaWYoY29udGV4dC5ub0luaGVyaXRNYXBfW2lkXSkgewogICAgICBicmVhawogICAgfQogIH0KICB2YXIgZmFjdG9yeSA9IHRoaXMuZ2V0U2VydmljZUZhY3RvcnkoaWQpOwogIGlmKGZhY3RvcnkpIHsKICAgIHZhciBzZXJ2aWNlID0gZmFjdG9yeSh0aGlzKTsKICAgIHRoaXMucmVnaXN0ZXJTZXJ2aWNlKGlkLCBzZXJ2aWNlKTsKICAgIHJldHVybiBzZXJ2aWNlCiAgfQogIHJldHVybiBudWxsCn07CmZhdmEuQXBwQ29udGV4dC5wcm90b3R5cGUuZ2V0QXN5bmMgPSBmdW5jdGlvbiAkZmF2YSRBcHBDb250ZXh0JCRnZXRBc3luYyQoaWQsIG9wdF9ub0xvYWQpIHsKICByZXR1cm4gdGhpcy5nZXRBc3luY1NlcnZpY2VzKFtpZF0sIG9wdF9ub0xvYWQpW2lkXQp9OwpmYXZhLkFwcENvbnRleHQucHJvdG90eXBlLmdldEFzeW5jU2VydmljZXMgPSBmdW5jdGlvbiAkZmF2YSRBcHBDb250ZXh0JCRnZXRBc3luY1NlcnZpY2VzJChpZHMsIG9wdF9ub0xvYWQpIHsKICBmb3IodmFyIG1vZHVsZU1hbmFnZXIgPSB0aGlzLmdldE1vZHVsZU1hbmFnZXIoKSwgZG9Mb2FkID0gIW9wdF9ub0xvYWQsIGRlZmVycmVkTWFwID0ge30sIG1vZHVsZUlkcyA9IFtdLCB1bmxvYWRlZElkcyA9IFtdLCBpID0gMDtpIDwgaWRzLmxlbmd0aDtpKyspIHsKICAgIHZhciBpZCA9IGlkc1tpXSwgc2VydmljZSA9IHRoaXMuZ2V0T3JOdWxsKGlkKTsKICAgIGlmKHNlcnZpY2UpIHsKICAgICAgdmFyIGQgPSBuZXcgZ29vZy5hc3luYy5EZWZlcnJlZDsKICAgICAgZGVmZXJyZWRNYXBbaWRdID0gZDsKICAgICAgZC5jYWxsYmFjayhzZXJ2aWNlKQogICAgfWVsc2UgewogICAgICBnb29nLmFzc2VydHMuYXNzZXJ0KCFkb0xvYWQgfHwgbW9kdWxlTWFuYWdlciwgIkEgbW9kdWxlIG1hbmFnZXIgaXMgcmVxdWlyZWQgZm9yIGFzeW5jIGxvYWRpbmcuIik7CiAgICAgIHZhciBtb2R1bGVJZCA9IHRoaXMubGF0ZVNlcnZpY2VNb2R1bGVJZE1hcF9baWRdOwogICAgICBkb0xvYWQgJiYgIW1vZHVsZUlkID8gKGQgPSBuZXcgZ29vZy5hc3luYy5EZWZlcnJlZCwgZGVmZXJyZWRNYXBbaWRdID0gZCwgZC5lcnJiYWNrKG5ldyBmYXZhLkFwcENvbnRleHQuSW52YWxpZFNlcnZpY2VFcnJvcihpZCkpKSA6IChtb2R1bGVJZHMucHVzaChtb2R1bGVJZCksIHVubG9hZGVkSWRzLnB1c2goaWQpKQogICAgfQogIH0KICBpZihkb0xvYWQpIHsKICAgIGlmKG1vZHVsZUlkcy5sZW5ndGgpIHsKICAgICAgdGhpcy5hc3luY0xvYWRlZFNlcnZpY2VzXyAmJiB0aGlzLmFzeW5jTG9hZGVkU2VydmljZXNfLnB1c2goImxvYWRlZCgiICsgdW5sb2FkZWRJZHMgKyAiLCIgKyBtb2R1bGVJZHMgKyAiKVxuIiArIGdvb2cuZGVidWcuZ2V0U3RhY2t0cmFjZVNpbXBsZSgpKTsKICAgICAgZm9yKGkgPSAwO2kgPCB1bmxvYWRlZElkcy5sZW5ndGg7aSsrKSB7CiAgICAgICAgdGhpcy5nZXRFdmVudFRhcmdldCgpLmRpc3BhdGNoRXZlbnQobmV3IGZhdmEuQXBwQ29udGV4dC5FdmVudChmYXZhLkFwcENvbnRleHRFdmVudFR5cGUuQVNZTkNfU0VSVklDRV9DT0RFX0xPQURJTkcsIHVubG9hZGVkSWRzW2ldKSkKICAgICAgfQogICAgICBmb3IodmFyIGxvYWREZWZlcnJlZHMgPSB0aGlzLmdldE1vZHVsZU1hbmFnZXIoKS5sb2FkTXVsdGlwbGUobW9kdWxlSWRzKSwgaSA9IDA7aSA8IG1vZHVsZUlkcy5sZW5ndGg7aSsrKSB7CiAgICAgICAgbW9kdWxlSWQgPSBtb2R1bGVJZHNbaV0sIGlkID0gdW5sb2FkZWRJZHNbaV0sIGQgPSBsb2FkRGVmZXJyZWRzW21vZHVsZUlkXSwgZGVmZXJyZWRNYXBbaWRdID0gZCwgdGhpcy5hZGRQb3N0TG9hZENhbGxiYWNrRm9ySWRfKGQsIGlkLCBtb2R1bGVJZCkKICAgICAgfQogICAgfQogIH1lbHNlIHsKICAgIGZvcihpID0gMDtpIDwgdW5sb2FkZWRJZHMubGVuZ3RoO2krKykgewogICAgICBpZCA9IHVubG9hZGVkSWRzW2ldOwogICAgICBtb2R1bGVJZCA9IG1vZHVsZUlkc1tpXTsKICAgICAgZCA9IG5ldyBnb29nLmFzeW5jLkRlZmVycmVkOwogICAgICBkZWZlcnJlZE1hcFtpZF0gPSBkOwogICAgICB2YXIgY2JBcnJheSA9IHRoaXMuc2VydmljZUNhbGxiYWNrc19baWRdOwogICAgICBjYkFycmF5IHx8ICh0aGlzLnNlcnZpY2VDYWxsYmFja3NfW2lkXSA9IGNiQXJyYXkgPSBbXSk7CiAgICAgIG1vZHVsZUlkICYmIHRoaXMuYWRkQmFja3VwTG9hZENhbGxiYWNrXyhkLCBpZCwgbW9kdWxlSWQpOwogICAgICBkLmFkZENhbGxiYWNrKGdvb2cuYmluZCh0aGlzLmdldFNlcnZpY2VNYXliZUFmdGVyTG9hZF8sIHRoaXMsIGlkLCBtb2R1bGVJZCkpOwogICAgICBjYkFycmF5LnB1c2goe2FwcENvbnRleHQ6dGhpcywgZDpkfSkKICAgIH0KICB9CiAgcmV0dXJuIGRlZmVycmVkTWFwCn07CmZhdmEuQXBwQ29udGV4dC5wcm90b3R5cGUuYWRkQmFja3VwTG9hZENhbGxiYWNrXyA9IGZ1bmN0aW9uICRmYXZhJEFwcENvbnRleHQkJGFkZEJhY2t1cExvYWRDYWxsYmFja18kKGQsIHNlcnZpY2VJZCwgbW9kdWxlSWQpIHsKICBkLmFkZENhbGxiYWNrKGZ1bmN0aW9uKCkgewogICAgdGhpcy5hc3luY0xvYWRlZFNlcnZpY2VzXyAmJiB0aGlzLmFzeW5jTG9hZGVkU2VydmljZXNfLnB1c2goImxvYWRlZCgiICsgc2VydmljZUlkICsgIiwiICsgbW9kdWxlSWQgKyAiKVxuIiArIGdvb2cuZGVidWcuZ2V0U3RhY2t0cmFjZVNpbXBsZSgpKTsKICAgIHJldHVybiB0aGlzLmdldE1vZHVsZU1hbmFnZXIoKS5sb2FkKG1vZHVsZUlkKQogIH0sIHRoaXMpOwogIGQuYWRkRXJyYmFjayhnb29nLmJpbmQodGhpcy5nZXRNb2R1bGVMb2FkRXJyb3JfLCB0aGlzLCBzZXJ2aWNlSWQsIG1vZHVsZUlkKSkKfTsKZmF2YS5BcHBDb250ZXh0LnByb3RvdHlwZS5hZGRQb3N0TG9hZENhbGxiYWNrRm9ySWRfID0gZnVuY3Rpb24gJGZhdmEkQXBwQ29udGV4dCQkYWRkUG9zdExvYWRDYWxsYmFja0ZvcklkXyQoZCwgc2VydmljZUlkLCBtb2R1bGVJZCkgewogIGQuYWRkQ2FsbGJhY2soZnVuY3Rpb24oKSB7CiAgICB0aGlzLmdldEV2ZW50VGFyZ2V0KCkuZGlzcGF0Y2hFdmVudChuZXcgZmF2YS5BcHBDb250ZXh0LkV2ZW50KGZhdmEuQXBwQ29udGV4dEV2ZW50VHlwZS5BU1lOQ19TRVJWSUNFX0NPREVfTE9BREVELCBzZXJ2aWNlSWQpKQogIH0sIHRoaXMpOwogIGQuYWRkRXJyYmFjayhnb29nLmJpbmQodGhpcy5nZXRNb2R1bGVMb2FkRXJyb3JfLCB0aGlzLCBzZXJ2aWNlSWQsIG1vZHVsZUlkKSk7CiAgZC5hZGRDYWxsYmFjayhnb29nLmJpbmQodGhpcy5nZXRTZXJ2aWNlTWF5YmVBZnRlckxvYWRfLCB0aGlzLCBzZXJ2aWNlSWQsIG1vZHVsZUlkKSkKfTsKZmF2YS5BcHBDb250ZXh0LnByb3RvdHlwZS5nZXRTZXJ2aWNlTWF5YmVBZnRlckxvYWRfID0gZnVuY3Rpb24gJGZhdmEkQXBwQ29udGV4dCQkZ2V0U2VydmljZU1heWJlQWZ0ZXJMb2FkXyQoc2VydmljZUlkLCBtb2R1bGVJZCkgewogIHZhciBzZXJ2aWNlID0gdGhpcy5nZXRPck51bGwoc2VydmljZUlkKTsKICBpZighc2VydmljZSkgewogICAgaWYodGhpcy5hc3luY0RlZmVycmFsc19bc2VydmljZUlkXSkgewogICAgICB2YXIgZCA9IHRoaXMuYXN5bmNEZWZlcnJhbHNfW3NlcnZpY2VJZF07CiAgICAgIGRlbGV0ZSB0aGlzLmFzeW5jRGVmZXJyYWxzX1tzZXJ2aWNlSWRdOwogICAgICBkLmFkZENhbGxiYWNrKGdvb2cuYmluZCh0aGlzLmdldFNlcnZpY2VNYXliZUFmdGVyTG9hZF8sIHRoaXMsIHNlcnZpY2VJZCwgbW9kdWxlSWQpKTsKICAgICAgcmV0dXJuIGQKICAgIH0KICAgIHRocm93IG5ldyBmYXZhLkFwcENvbnRleHQuTW9kdWxlQ29uZmlndXJhdGlvbkVycm9yKHNlcnZpY2VJZCwgbW9kdWxlSWQsICJNb2R1bGUgbG9hZGVkIGJ1dCBzZXJ2aWNlIG9yIGZhY3Rvcnkgbm90IHJlZ2lzdGVyZWQgd2l0aCBhcHAgY29udGV4dHMuIik7CiAgfQogIHJldHVybiBzZXJ2aWNlCn07CmZhdmEuQXBwQ29udGV4dC5wcm90b3R5cGUuZ2V0TW9kdWxlTG9hZEVycm9yXyA9IGZ1bmN0aW9uICRmYXZhJEFwcENvbnRleHQkJGdldE1vZHVsZUxvYWRFcnJvcl8kKHNlcnZpY2VJZCwgbW9kdWxlSWQsIGNhdXNlKSB7CiAgcmV0dXJuIGNhdXNlIGluc3RhbmNlb2YgZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxsZWRFcnJvciA/IGNhdXNlIDogbmV3IGZhdmEuQXBwQ29udGV4dC5Nb2R1bGVMb2FkRXJyb3Ioc2VydmljZUlkLCBtb2R1bGVJZCwgY2F1c2UpCn07CmZhdmEuQXBwQ29udGV4dC5wcm90b3R5cGUucmVnaXN0ZXJTZXJ2aWNlID0gZnVuY3Rpb24gJGZhdmEkQXBwQ29udGV4dCQkcmVnaXN0ZXJTZXJ2aWNlJChpZCwgc2VydmljZSwgb3B0X2RvbnREaXNwb3NlKSB7CiAgZ29vZy5hc3NlcnRzLmFzc2VydCghdGhpcy5zZXJ2aWNlc19baWRdLCAnU2VydmljZSBmb3IgIiVzIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQnLCBpZCk7CiAgZ29vZy5ERUJVRyAmJiB0aGlzLnNlcnZpY2VSZWdpc3RyYXRpb25PcmRlci5wdXNoKGlkKTsKICB0aGlzLnNlcnZpY2VzX1tpZF0gPSBbc2VydmljZSwgIW9wdF9kb250RGlzcG9zZV07CiAgZm9yKHZhciBjYWxsYmFja3MgPSB0aGlzLmZpbmRTZXJ2aWNlQ2FsbGJhY2tzXyh0aGlzLCBpZCksIGkgPSAwO2kgPCBjYWxsYmFja3MubGVuZ3RoO2krKykgewogICAgY2FsbGJhY2tzW2ldLmNhbGxiYWNrKG51bGwpCiAgfQogIGRlbGV0ZSB0aGlzLmxhdGVTZXJ2aWNlTW9kdWxlSWRNYXBfW2lkXQp9OwpmYXZhLkFwcENvbnRleHQucHJvdG90eXBlLmdldFNlcnZpY2VGYWN0b3J5ID0gZnVuY3Rpb24gJGZhdmEkQXBwQ29udGV4dCQkZ2V0U2VydmljZUZhY3RvcnkkKHNlcnZpY2VJZCkgewogIHJldHVybiB0aGlzLnNlcnZpY2VGYWN0b3J5TWFwX1tzZXJ2aWNlSWRdCn07CmZhdmEuQXBwQ29udGV4dC5zb3J0U2VydmljZUNhbGxiYWNrc18gPSBmdW5jdGlvbiAkZmF2YSRBcHBDb250ZXh0JHNvcnRTZXJ2aWNlQ2FsbGJhY2tzXyQoY2JBcnJheSkgewogIGlmKDEgPCBjYkFycmF5Lmxlbmd0aCkgewogICAgZm9yKHZhciBpID0gMDtpIDwgY2JBcnJheS5sZW5ndGg7KytpKSB7CiAgICAgIGNiQXJyYXlbaV0uaW5kZXggPSBpCiAgICB9CiAgICBjYkFycmF5LnNvcnQoZmF2YS5BcHBDb250ZXh0LnRvcG9Tb3J0U2VydmljZUNhbGxiYWNrc0NhbGxiYWNrXykKICB9Cn07CmZhdmEuQXBwQ29udGV4dC50b3BvU29ydFNlcnZpY2VDYWxsYmFja3NDYWxsYmFja18gPSBmdW5jdGlvbiAkZmF2YSRBcHBDb250ZXh0JHRvcG9Tb3J0U2VydmljZUNhbGxiYWNrc0NhbGxiYWNrXyQoYSwgYikgewogIGlmKGEuYXBwQ29udGV4dCAhPSBiLmFwcENvbnRleHQpIHsKICAgIGlmKGEuYXBwQ29udGV4dC5kZXNjZW5kc0Zyb21fKGIuYXBwQ29udGV4dCkpIHsKICAgICAgcmV0dXJuIDEKICAgIH0KICAgIGlmKGIuYXBwQ29udGV4dC5kZXNjZW5kc0Zyb21fKGEuYXBwQ29udGV4dCkpIHsKICAgICAgcmV0dXJuLTEKICAgIH0KICB9CiAgcmV0dXJuIGEuaW5kZXggPCBiLmluZGV4ID8gLTEgOiBhLmluZGV4ID09IGIuaW5kZXggPyAwIDogMQp9OwpmYXZhLkFwcENvbnRleHQucHJvdG90eXBlLmZpbmRTZXJ2aWNlQ2FsbGJhY2tzXyA9IGZ1bmN0aW9uICRmYXZhJEFwcENvbnRleHQkJGZpbmRTZXJ2aWNlQ2FsbGJhY2tzXyQoYXBwQ29udGV4dCwgc2VydmljZUlkKSB7CiAgdmFyIHJldEFycmF5ID0gW10sIGNiQXJyYXkgPSB0aGlzLnNlcnZpY2VDYWxsYmFja3NfW3NlcnZpY2VJZF07CiAgY2JBcnJheSAmJiAoZ29vZy5hcnJheS5mb3JFYWNoUmlnaHQoY2JBcnJheSwgZnVuY3Rpb24oY2FuZGlkYXRlKSB7CiAgICBjYW5kaWRhdGUuYXBwQ29udGV4dC5kZXNjZW5kc0Zyb21fKGFwcENvbnRleHQpICYmIChyZXRBcnJheS5wdXNoKGNhbmRpZGF0ZS5kKSwgZ29vZy5hcnJheS5yZW1vdmUoY2JBcnJheSwgY2FuZGlkYXRlKSkKICB9KSwgMCA9PSBjYkFycmF5Lmxlbmd0aCAmJiBkZWxldGUgdGhpcy5zZXJ2aWNlQ2FsbGJhY2tzX1tzZXJ2aWNlSWRdKTsKICByZXR1cm4gcmV0QXJyYXkKfTsKZmF2YS5BcHBDb250ZXh0LnByb3RvdHlwZS5jbGVhclNlcnZpY2VDYWxsYmFja3NfID0gZnVuY3Rpb24gJGZhdmEkQXBwQ29udGV4dCQkY2xlYXJTZXJ2aWNlQ2FsbGJhY2tzXyQoYXBwQ29udGV4dCkgewogIHRoaXMuc2VydmljZUNhbGxiYWNrc18gJiYgZ29vZy5zdHJ1Y3RzLmZvckVhY2godGhpcy5zZXJ2aWNlQ2FsbGJhY2tzXywgZnVuY3Rpb24odmFsLCBpZCwgY29sKSB7CiAgICBnb29nLmFycmF5LmZvckVhY2hSaWdodCh2YWwsIGZ1bmN0aW9uKGNhbmRpZGF0ZSkgewogICAgICBjYW5kaWRhdGUuYXBwQ29udGV4dCA9PSBhcHBDb250ZXh0ICYmIGdvb2cuYXJyYXkucmVtb3ZlKHZhbCwgY2FuZGlkYXRlKQogICAgfSk7CiAgICAwID09IHZhbC5sZW5ndGggJiYgZGVsZXRlIGNvbFtpZF0KICB9KQp9OwpmYXZhLkFwcENvbnRleHQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRmYXZhJEFwcENvbnRleHQkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgaWYodGhpcy5nZXRSb290QXBwQ29udGV4dCgpID09IHRoaXMpIHsKICAgIHZhciBjaGlsZEFwcENvbnRleHRzID0gdGhpcy5jaGlsZEFwcENvbnRleHRzXzsKICAgIGlmKGNoaWxkQXBwQ29udGV4dHMpIHsKICAgICAgZm9yKDtjaGlsZEFwcENvbnRleHRzLmxlbmd0aDspIHsKICAgICAgICBjaGlsZEFwcENvbnRleHRzWzBdLmRpc3Bvc2UoKQogICAgICB9CiAgICB9CiAgfWVsc2UgewogICAgZm9yKHZhciBjaGlsZEFwcENvbnRleHRzID0gdGhpcy5nZXRSb290QXBwQ29udGV4dCgpLmNoaWxkQXBwQ29udGV4dHNfLCBpID0gMDtpIDwgY2hpbGRBcHBDb250ZXh0cy5sZW5ndGg7aSsrKSB7CiAgICAgIGlmKGNoaWxkQXBwQ29udGV4dHNbaV0gPT0gdGhpcykgewogICAgICAgIGNoaWxkQXBwQ29udGV4dHMuc3BsaWNlKGksIDEpOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICB9CiAgZm9yKHZhciBpZCBpbiB0aGlzLnNlcnZpY2VzXykgewogICAgdmFyIHNlcnZpY2VIb2xkZXIgPSB0aGlzLnNlcnZpY2VzX1tpZF07CiAgICBzZXJ2aWNlSG9sZGVyWzFdICYmICJ1bmRlZmluZWQiICE9IHR5cGVvZiBzZXJ2aWNlSG9sZGVyWzBdLmRpc3Bvc2UgJiYgc2VydmljZUhvbGRlclswXS5kaXNwb3NlKCkKICB9CiAgdGhpcy5zZXJ2aWNlc18gPSBudWxsOwogIHRoaXMuc2hvdWxkRGlzcG9zZUV2ZW50VGFyZ2V0XyAmJiB0aGlzLmV2ZW50VGFyZ2V0Xy5kaXNwb3NlKCk7CiAgdGhpcy5jbGVhclNlcnZpY2VDYWxsYmFja3NfKHRoaXMpOwogIHRoaXMuc2VydmljZUNhbGxiYWNrc18gPSBudWxsOwogIGdvb2cuZGlzcG9zZSh0aGlzLm92ZXJsYXlBcHBDb250ZXh0Xyk7CiAgdGhpcy5ub0luaGVyaXRNYXBfID0gdGhpcy5vdmVybGF5QXBwQ29udGV4dF8gPSBudWxsOwogIGZhdmEuQXBwQ29udGV4dC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9OwpmYXZhLkFwcENvbnRleHQucHJvdG90eXBlLmdldEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gJGZhdmEkQXBwQ29udGV4dCQkZ2V0RXZlbnRUYXJnZXQkKCkgewogIHJldHVybiB0aGlzLmV2ZW50VGFyZ2V0Xwp9OwpmYXZhLkFwcENvbnRleHQucHJvdG90eXBlLmdldE1vZHVsZU1hbmFnZXIgPSBmdW5jdGlvbiAkZmF2YSRBcHBDb250ZXh0JCRnZXRNb2R1bGVNYW5hZ2VyJCgpIHsKICByZXR1cm4gdGhpcy5tb2R1bGVNYW5hZ2VyXyA/IHRoaXMubW9kdWxlTWFuYWdlcl8gOiB0aGlzLnBhcmVudEFwcENvbnRleHRfID8gdGhpcy5wYXJlbnRBcHBDb250ZXh0Xy5nZXRNb2R1bGVNYW5hZ2VyKCkgOiBudWxsCn07CmZhdmEuQXBwQ29udGV4dC5JbnZhbGlkU2VydmljZUVycm9yID0gZnVuY3Rpb24gJGZhdmEkQXBwQ29udGV4dCRJbnZhbGlkU2VydmljZUVycm9yJChpZCkgewogIGdvb2cuZGVidWcuRXJyb3IuY2FsbCh0aGlzKTsKICB0aGlzLmlkID0gaWQ7CiAgdGhpcy5tZXNzYWdlID0gJ1NlcnZpY2UgZm9yICInICsgaWQgKyAnIiBpcyBub3QgcmVnaXN0ZXJlZCcKfTsKZ29vZy5pbmhlcml0cyhmYXZhLkFwcENvbnRleHQuSW52YWxpZFNlcnZpY2VFcnJvciwgZ29vZy5kZWJ1Zy5FcnJvcik7CmZhdmEuQXBwQ29udGV4dC5Nb2R1bGVMb2FkRXJyb3IgPSBmdW5jdGlvbiAkZmF2YSRBcHBDb250ZXh0JE1vZHVsZUxvYWRFcnJvciQoc2VydmljZUlkLCBtb2R1bGVJZCwgY2F1c2UpIHsKICBnb29nLmRlYnVnLkVycm9yLmNhbGwodGhpcyk7CiAgdGhpcy5tZXNzYWdlID0gJ01vZHVsZSAiJyArIG1vZHVsZUlkICsgJyIgZmFpbGVkIHRvIGxvYWQgd2hlbiByZXF1ZXN0aW5nIHRoZSBzZXJ2aWNlICInICsgc2VydmljZUlkICsgJyIgW2NhdXNlOiAnICsgY2F1c2UgKyAiXSIKfTsKZ29vZy5pbmhlcml0cyhmYXZhLkFwcENvbnRleHQuTW9kdWxlTG9hZEVycm9yLCBnb29nLmRlYnVnLkVycm9yKTsKZmF2YS5BcHBDb250ZXh0Lk1vZHVsZUNvbmZpZ3VyYXRpb25FcnJvciA9IGZ1bmN0aW9uICRmYXZhJEFwcENvbnRleHQkTW9kdWxlQ29uZmlndXJhdGlvbkVycm9yJChzZXJ2aWNlSWQsIG1vZHVsZUlkLCBtc2cpIHsKICBnb29nLmRlYnVnLkVycm9yLmNhbGwodGhpcyk7CiAgdGhpcy5tZXNzYWdlID0gJ0NvbmZpZ3VyYXRpb24gZXJyb3Igd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUgIicgKyBtb2R1bGVJZCArICciIGZvciB0aGUgc2VydmljZSAiJyArIHNlcnZpY2VJZCArICciOiAnICsgbXNnCn07Cmdvb2cuaW5oZXJpdHMoZmF2YS5BcHBDb250ZXh0Lk1vZHVsZUNvbmZpZ3VyYXRpb25FcnJvciwgZ29vZy5kZWJ1Zy5FcnJvcik7CmZhdmEuQXBwQ29udGV4dC5FdmVudCA9IGZ1bmN0aW9uICRmYXZhJEFwcENvbnRleHQkRXZlbnQkKHR5cGUpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHR5cGUpCn07Cmdvb2cuaW5oZXJpdHMoZmF2YS5BcHBDb250ZXh0LkV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CmNoYXQubW9kZWwuTWVzc2FnZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJE1lc3NhZ2UkKHR5cGUsIGlkLCBtc2cpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuaWRfID0gaWQ7CiAgdGhpcy50eXBlXyA9IHR5cGU7CiAgdGhpcy5jcmVhdGlvblRpbWVfID0gZ29vZy5ub3coKTsKICB0aGlzLm1zZ18gPSBtc2cKfTsKZ29vZy5pbmhlcml0cyhjaGF0Lm1vZGVsLk1lc3NhZ2UsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKY2hhdC5tb2RlbC5NZXNzYWdlLnByb3RvdHlwZS5nZXRUeXBlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkTWVzc2FnZSQkZ2V0VHlwZSQoKSB7CiAgcmV0dXJuIHRoaXMudHlwZV8KfTsKY2hhdC5tb2RlbC5NZXNzYWdlLnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJE1lc3NhZ2UkJGdldElkJCgpIHsKICByZXR1cm4gdGhpcy5pZF8KfTsKY2hhdC5tb2RlbC5NZXNzYWdlLnByb3RvdHlwZS5nZXRNc2cgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNZXNzYWdlJCRnZXRNc2ckKCkgewogIHJldHVybiB0aGlzLm1zZ18KfTsKY2hhdC5tb2RlbC5DaGF0TWVzc2FnZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENoYXRNZXNzYWdlJChpZCwgc2VydmVyVGltZSwgaXNPZmZUaGVSZWNvcmQsIHNlbmRlciwgdGV4dCwgcGFyc2VUZXh0LCBpY29uU2V0LCBvcHRfbWVkaWFJdGVtcywgb3B0X2lkeEppZCwgb3B0X2lzUmVmbGVjdGVkLCBvcHRfaXNEaXJlY3QsIG9wdF9pc1B1c2gpIHsKICBjaGF0Lm1vZGVsLk1lc3NhZ2UuY2FsbCh0aGlzLCBjaGF0Lm1vZGVsLk1lc3NhZ2VUeXBlLkNIQVQsIGlkLCB0ZXh0LCAhMSwgb3B0X2lzUHVzaCk7CiAgdGhpcy5wYXJzZVRleHRfID0gcGFyc2VUZXh0OwogIHRoaXMuc2VydmVyVGltZV8gPSBzZXJ2ZXJUaW1lOwogIHRoaXMuaWNvblNldF8gPSBpY29uU2V0OwogIHRoaXMuc2VuZGVyXyA9IHNlbmRlcjsKICB0aGlzLmlzT2ZmVGhlUmVjb3JkXyA9IGlzT2ZmVGhlUmVjb3JkOwogIHRoaXMubWVkaWFJdGVtc18gPSBvcHRfbWVkaWFJdGVtcyB8fCBudWxsCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5tb2RlbC5DaGF0TWVzc2FnZSwgY2hhdC5tb2RlbC5NZXNzYWdlKTsKY2hhdC5tb2RlbC5DaGF0TWVzc2FnZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ2hhdE1lc3NhZ2UkJGVxdWFscyQobWVzc2FnZSkgewogIHJldHVybiB0aGlzLmlkXyA9PSBtZXNzYWdlLmlkXyAmJiB0aGlzLnR5cGVfID09IG1lc3NhZ2UudHlwZV8gJiYgdGhpcy5tc2dfID09IG1lc3NhZ2UubXNnXyAmJiBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLnBhcnNlVGV4dF8pID09IGdvb2cuaXNEZWZBbmROb3ROdWxsKG1lc3NhZ2UucGFyc2VUZXh0XykgJiYgdGhpcy5zZXJ2ZXJUaW1lXyA9PSBtZXNzYWdlLnNlcnZlclRpbWVfICYmIHRoaXMuaWNvblNldF8gPT0gbWVzc2FnZS5pY29uU2V0XyAmJiB0aGlzLnNlbmRlcl8gPT0gbWVzc2FnZS5zZW5kZXJfICYmIHRoaXMuaXNPZmZUaGVSZWNvcmRfID09IG1lc3NhZ2UuaXNPZmZUaGVSZWNvcmRfCn07CmNoYXQubW9kZWwuQ2hhdE1lc3NhZ2UucHJvdG90eXBlLmdldE1lZGlhSXRlbXMgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDaGF0TWVzc2FnZSQkZ2V0TWVkaWFJdGVtcyQoKSB7CiAgcmV0dXJuIHRoaXMubWVkaWFJdGVtc18KfTsKY2hhdC5tb2RlbC5DaGF0TWVzc2FnZS5wcm90b3R5cGUuZ2V0U2VuZGVyID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ2hhdE1lc3NhZ2UkJGdldFNlbmRlciQoKSB7CiAgcmV0dXJuIWFwcHMuY2hhdC5jb3JlLkppZC5Jc1Jvb21KaWQodGhpcy5zZW5kZXJfKSA/IGFwcHMuY2hhdC5jb3JlLkppZC5iYXJlUGFydCh0aGlzLnNlbmRlcl8pIDogdGhpcy5zZW5kZXJfCn07CmNoYXQubW9kZWwuQ2hhdE1lc3NhZ2UucHJvdG90eXBlLmdldEljb25TZXQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDaGF0TWVzc2FnZSQkZ2V0SWNvblNldCQoKSB7CiAgcmV0dXJuIHRoaXMuaWNvblNldF8KfTsKY2hhdC5tb2RlbC5TbXNNZXNzYWdlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkU21zTWVzc2FnZSQoaWQsIHRleHQsIGppZCwgcGhvbmVObywgc2VydmVyVGltZSwgcGFyc2VUZXh0LCBvcHRfaXNQdXNoKSB7CiAgY2hhdC5tb2RlbC5NZXNzYWdlLmNhbGwodGhpcywgY2hhdC5tb2RlbC5NZXNzYWdlVHlwZS5TTVMsIGlkLCB0ZXh0LCAhMSwgb3B0X2lzUHVzaCk7CiAgdGhpcy5qaWRfID0gamlkOwogIHRoaXMuc2VydmVyVGltZV8gPSBzZXJ2ZXJUaW1lOwogIHRoaXMucGFyc2VUZXh0XyA9IHBhcnNlVGV4dAp9Owpnb29nLmluaGVyaXRzKGNoYXQubW9kZWwuU21zTWVzc2FnZSwgY2hhdC5tb2RlbC5NZXNzYWdlKTsKY2hhdC5tb2RlbC5TbXNNZXNzYWdlLnByb3RvdHlwZS5nZXRKaWQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRTbXNNZXNzYWdlJCRnZXRKaWQkKCkgewogIHJldHVybiB0aGlzLmppZF8KfTsKY2hhdC5tb2RlbC5TbXNNZXNzYWdlLnByb3RvdHlwZS5nZXRJY29uU2V0ID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkU21zTWVzc2FnZSQkZ2V0SWNvblNldCQoKSB7CiAgcmV0dXJuIG51bGwKfTsKY2hhdC5tb2RlbC5JbmZvTWVzc2FnZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJEluZm9NZXNzYWdlJChpZCwgdGV4dCwgc3VidHlwZSwgaXNIdG1sLCBvcHRfaXNQdXNoKSB7CiAgY2hhdC5tb2RlbC5NZXNzYWdlLmNhbGwodGhpcywgY2hhdC5tb2RlbC5NZXNzYWdlVHlwZS5JTkZPLCBpZCwgdGV4dCwgaXNIdG1sLCBvcHRfaXNQdXNoKQp9Owpnb29nLmluaGVyaXRzKGNoYXQubW9kZWwuSW5mb01lc3NhZ2UsIGNoYXQubW9kZWwuTWVzc2FnZSk7CmNoYXQubW9kZWwuRXJyb3JNZXNzYWdlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkRXJyb3JNZXNzYWdlJChpZCwgbXNnLCBpc0h0bWwsIG9wdF9pc1B1c2gpIHsKICBjaGF0Lm1vZGVsLk1lc3NhZ2UuY2FsbCh0aGlzLCBjaGF0Lm1vZGVsLk1lc3NhZ2VUeXBlLkVSUk9SLCBpZCwgbXNnLCBpc0h0bWwsIG9wdF9pc1B1c2gpCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5tb2RlbC5FcnJvck1lc3NhZ2UsIGNoYXQubW9kZWwuTWVzc2FnZSk7CmNoYXQubW9kZWwuU2VudEF0TWVzc2FnZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJFNlbnRBdE1lc3NhZ2UkKGlkLCBzZW50QXQsIG9wdF9pc1B1c2gpIHsKICBjaGF0Lm1vZGVsLk1lc3NhZ2UuY2FsbCh0aGlzLCBjaGF0Lm1vZGVsLk1lc3NhZ2VUeXBlLlNFTlRfQVQsIGlkLCAiIiwgITAsIG9wdF9pc1B1c2gpCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5tb2RlbC5TZW50QXRNZXNzYWdlLCBjaGF0Lm1vZGVsLk1lc3NhZ2UpOwpjaGF0Lm1vZGVsLk1lc3NhZ2VUeXBlID0ge0NIQVQ6ImMiLCBJTkZPOiJpIiwgU0VOVF9BVDoic2EiLCBFUlJPUjoiZSIsIFNNUzoicyJ9OwpjaGF0Lm1vZGVsLkluZm9NZXNzYWdlVHlwZSA9IHtGSUxFX1RSQU5TRkVSOiJmdCIsIE9UUjoib3RyIiwgR09SOiJnb3IiLCBTVEFUVVM6InN0IiwgU0VOVF9BVDoic2EiLCBCTE9DSzoiYiIsIFBSRVNFTkNFOiJwIiwgRlJPTV9TRVJWRVI6ImZzIiwgSU5WSVRFOiJpIiwgR0VORVJJQzoiZyIsIEZMVVRFX0VSUk9SOiJmZSJ9OwpjaGF0Lm1vZGVsLkNoYXQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDaGF0JChqaWQsIGlzUmVhZCwgdWlTdGF0ZSkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5qaWRfID0gamlkOwogIHRoaXMuaXNSZWFkXyA9IGlzUmVhZDsKICB0aGlzLnVpU3RhdGVfID0gdWlTdGF0ZTsKICB0aGlzLmlzSGlzdG9yeUxvYWRlZF8gPSAhMTsKICB0aGlzLm1lc3NhZ2VJZExpc3RfID0gW107CiAgdGhpcy5tZXNzYWdlc0J5SWRfID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdGhpcy5wZW5kaW5nVXBkYXRlTWVzc2FnZXNfID0gbnVsbAp9Owpnb29nLmluaGVyaXRzKGNoYXQubW9kZWwuQ2hhdCwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwpjaGF0Lm1vZGVsLkNoYXQuRXZlbnRUeXBlID0ge01FU1NBR0VTX1VQREFURUQ6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoIm1lc3NhZ2VzX3VwZGF0ZWQiKSwgVUlfU1RBVEVfVVBEQVRFRDpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgidWlfc3RhdGVfdXBkYXRlZCIpLCBSRUFEX1NUQVRFX1VQREFURUQ6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInJlYWRfc3RhdGVfdXBkYXRlZCIpLCBISVNUT1JZX0xPQURFRDpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiaGlzdG9yeV9sb2FkZWQiKX07CmNoYXQubW9kZWwuQ2hhdC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ2hhdCQkZGlzcG9zZUludGVybmFsJCgpIHsKICBjaGF0Lm1vZGVsLkNoYXQuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5tZXNzYWdlSWRMaXN0XyA9IFtdOwogIHRoaXMubWVzc2FnZXNCeUlkXy5jbGVhcigpCn07CmNoYXQubW9kZWwuQ2hhdC5wcm90b3R5cGUuZ2V0VWlTdGF0ZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENoYXQkJGdldFVpU3RhdGUkKCkgewogIHJldHVybiB0aGlzLnVpU3RhdGVfCn07CmNoYXQubW9kZWwuQ2hhdC5wcm90b3R5cGUuZ2V0SmlkID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ2hhdCQkZ2V0SmlkJCgpIHsKICByZXR1cm4gdGhpcy5qaWRfCn07CmNoYXQubW9kZWwuQ2hhdC5wcm90b3R5cGUuZ2V0TWVzc2FnZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENoYXQkJGdldE1lc3NhZ2UkKGlkKSB7CiAgcmV0dXJuIHRoaXMubWVzc2FnZXNCeUlkXy5nZXQoaWQpCn07CmNoYXQubW9kZWwuTXV0YWJsZUNoYXQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNdXRhYmxlQ2hhdCQoamlkLCBpc1JlYWQsIHVpU3RhdGUpIHsKICBjaGF0Lm1vZGVsLkNoYXQuY2FsbCh0aGlzLCBqaWQsIGlzUmVhZCwgdWlTdGF0ZSkKfTsKZ29vZy5pbmhlcml0cyhjaGF0Lm1vZGVsLk11dGFibGVDaGF0LCBjaGF0Lm1vZGVsLkNoYXQpOwpjaGF0Lm1vZGVsLk11dGFibGVDaGF0LnByb3RvdHlwZS5zZXRVaVN0YXRlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkTXV0YWJsZUNoYXQkJHNldFVpU3RhdGUkKHVpU3RhdGUpIHsKICByZXR1cm4gdGhpcy51aVN0YXRlXyAhPSB1aVN0YXRlID8gKHRoaXMudWlTdGF0ZV8gPSB1aVN0YXRlLCB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhdC5tb2RlbC5DaGF0LkV2ZW50VHlwZS5VSV9TVEFURV9VUERBVEVEKSwgITApIDogITEKfTsKY2hhdC5tb2RlbC5NdXRhYmxlQ2hhdC5wcm90b3R5cGUuc2V0SXNSZWFkID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkTXV0YWJsZUNoYXQkJHNldElzUmVhZCQoaXNSZWFkKSB7CiAgcmV0dXJuIHRoaXMuaXNSZWFkXyAhPSBpc1JlYWQgPyAodGhpcy5pc1JlYWRfID0gaXNSZWFkLCB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhdC5tb2RlbC5DaGF0LkV2ZW50VHlwZS5SRUFEX1NUQVRFX1VQREFURUQpLCAhMCkgOiAhMQp9OwpjaGF0Lm1vZGVsLk11dGFibGVDaGF0LnByb3RvdHlwZS5hZGRNZXNzYWdlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkTXV0YWJsZUNoYXQkJGFkZE1lc3NhZ2UkKG1lc3NhZ2UpIHsKICB2YXIgb2xkTWVzc2FnZSA9IHRoaXMubWVzc2FnZXNCeUlkXy5nZXQobWVzc2FnZS5nZXRJZCgpKTsKICBvbGRNZXNzYWdlIHx8IHRoaXMubWVzc2FnZUlkTGlzdF8ucHVzaChtZXNzYWdlLmdldElkKCkpOwogIGlmKCFvbGRNZXNzYWdlIHx8ICFvbGRNZXNzYWdlLmVxdWFscyhtZXNzYWdlKSkgewogICAgaWYodGhpcy5tZXNzYWdlc0J5SWRfLnNldChtZXNzYWdlLmdldElkKCksIG1lc3NhZ2UpLCBudWxsICE9IHRoaXMucGVuZGluZ1VwZGF0ZU1lc3NhZ2VzXykgewogICAgICB0aGlzLnBlbmRpbmdVcGRhdGVNZXNzYWdlc18ucHVzaChtZXNzYWdlKQogICAgfWVsc2UgewogICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjaGF0Lm1vZGVsLkNoYXQuTWVzc2FnZUV2ZW50KGNoYXQubW9kZWwuQ2hhdC5FdmVudFR5cGUuTUVTU0FHRVNfVVBEQVRFRCwgW21lc3NhZ2VdKSksIHRoaXMuc2V0SGlzdG9yeUxvYWRlZF8oKSwgITAKICAgIH0KICB9CiAgbnVsbCA9PSB0aGlzLnBlbmRpbmdVcGRhdGVNZXNzYWdlc18gJiYgdGhpcy5zZXRIaXN0b3J5TG9hZGVkXygpOwogIHJldHVybiExCn07CmNoYXQubW9kZWwuTXV0YWJsZUNoYXQucHJvdG90eXBlLmJlZ2luVXBkYXRlTWVzc2FnZXMgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNdXRhYmxlQ2hhdCQkYmVnaW5VcGRhdGVNZXNzYWdlcyQoKSB7CiAgdGhpcy5wZW5kaW5nVXBkYXRlTWVzc2FnZXNfID0gW10KfTsKY2hhdC5tb2RlbC5NdXRhYmxlQ2hhdC5wcm90b3R5cGUuZW5kVXBkYXRlTWVzc2FnZXMgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNdXRhYmxlQ2hhdCQkZW5kVXBkYXRlTWVzc2FnZXMkKCkgewogIGlmKDAgPCB0aGlzLnBlbmRpbmdVcGRhdGVNZXNzYWdlc18ubGVuZ3RoKSB7CiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjaGF0Lm1vZGVsLkNoYXQuTWVzc2FnZUV2ZW50KGNoYXQubW9kZWwuQ2hhdC5FdmVudFR5cGUuTUVTU0FHRVNfVVBEQVRFRCwgdGhpcy5wZW5kaW5nVXBkYXRlTWVzc2FnZXNfKSksIHRoaXMucGVuZGluZ1VwZGF0ZU1lc3NhZ2VzXyA9IG51bGwsIHRoaXMuc2V0SGlzdG9yeUxvYWRlZF8oKSwgITAKICB9CiAgdGhpcy5wZW5kaW5nVXBkYXRlTWVzc2FnZXNfID0gbnVsbDsKICB0aGlzLnNldEhpc3RvcnlMb2FkZWRfKCk7CiAgcmV0dXJuITEKfTsKY2hhdC5tb2RlbC5NdXRhYmxlQ2hhdC5wcm90b3R5cGUuc2V0SGlzdG9yeUxvYWRlZF8gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNdXRhYmxlQ2hhdCQkc2V0SGlzdG9yeUxvYWRlZF8kKCkgewogIHRoaXMuaXNIaXN0b3J5TG9hZGVkXyB8fCAodGhpcy5pc0hpc3RvcnlMb2FkZWRfID0gITAsIHRoaXMuZGlzcGF0Y2hFdmVudChjaGF0Lm1vZGVsLkNoYXQuRXZlbnRUeXBlLkhJU1RPUllfTE9BREVEKSkKfTsKY2hhdC5tb2RlbC5DaGF0Lk1lc3NhZ2VFdmVudCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENoYXQkTWVzc2FnZUV2ZW50JCh0eXBlKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0eXBlKQp9Owpnb29nLmluaGVyaXRzKGNoYXQubW9kZWwuQ2hhdC5NZXNzYWdlRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKY2hhdC5tb2RlbC5DaGF0U2V0ID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ2hhdFNldCQoKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLmNoYXRzQnlKaWRfID0gbmV3IGdvb2cuc3RydWN0cy5NYXAKfTsKZ29vZy5pbmhlcml0cyhjaGF0Lm1vZGVsLkNoYXRTZXQsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKY2hhdC5tb2RlbC5DaGF0U2V0LlNFUlZJQ0VfSUQgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJjaGF0Lm1vZGVsLkNoYXRTZXQiKTsKY2hhdC5tb2RlbC5DaGF0U2V0LkV2ZW50VHlwZSA9IHtDSEFUX09QRU5FRDpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiY2hhdF9vcGVuZWQiKSwgQ0hBVF9VUERBVEVEX01FU1NBR0VTOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJjaGF0X3VwZGF0ZWRfbWVzc2FnZXMiKX07CmNoYXQubW9kZWwuQ2hhdFNldC5nZXQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDaGF0U2V0JGdldCQoYXBwQ29udGV4dCkgewogIHJldHVybiBhcHBDb250ZXh0LmdldChjaGF0Lm1vZGVsLkNoYXRTZXQuU0VSVklDRV9JRCkKfTsKY2hhdC5tb2RlbC5DaGF0U2V0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDaGF0U2V0JCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGNoYXQubW9kZWwuQ2hhdFNldC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICB0aGlzLmNoYXRzQnlKaWRfLmNsZWFyKCkKfTsKY2hhdC5tb2RlbC5NdXRhYmxlQ2hhdFNldCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJE11dGFibGVDaGF0U2V0JChhcHBDb250ZXh0KSB7CiAgY2hhdC5tb2RlbC5DaGF0U2V0LmNhbGwodGhpcyk7CiAgdGhpcy5oYW5kbGVyXyA9IG5ldyBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIodGhpcyk7CiAgdmFyIGRpc3BhdGNoZXIgPSBjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlRGlzcGF0Y2hlci5nZXQoYXBwQ29udGV4dCk7CiAgdGhpcy5oYW5kbGVyXy5saXN0ZW4oZGlzcGF0Y2hlciwgcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5tZXNzYWdlSWQsIHRoaXMuaGFuZGxlQ2hhdFN0b3JlVXBkYXRlXykKfTsKZ29vZy5pbmhlcml0cyhjaGF0Lm1vZGVsLk11dGFibGVDaGF0U2V0LCBjaGF0Lm1vZGVsLkNoYXRTZXQpOwpjaGF0Lm1vZGVsLk11dGFibGVDaGF0U2V0LnJlZ2lzdGVyID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkTXV0YWJsZUNoYXRTZXQkcmVnaXN0ZXIkKGFwcENvbnRleHQpIHsKICB2YXIgbWUgPSBuZXcgY2hhdC5tb2RlbC5NdXRhYmxlQ2hhdFNldChhcHBDb250ZXh0KTsKICBhcHBDb250ZXh0LnJlZ2lzdGVyU2VydmljZShjaGF0Lm1vZGVsLkNoYXRTZXQuU0VSVklDRV9JRCwgbWUpOwogIHJldHVybiBtZQp9OwpjaGF0Lm1vZGVsLk11dGFibGVDaGF0U2V0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNdXRhYmxlQ2hhdFNldCQkZGlzcG9zZUludGVybmFsJCgpIHsKICBjaGF0Lm1vZGVsLk11dGFibGVDaGF0U2V0LnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpOwogIGdvb2cuZGlzcG9zZSh0aGlzLmhhbmRsZXJfKQp9OwpjaGF0Lm1vZGVsLk11dGFibGVDaGF0U2V0LnByb3RvdHlwZS5oYW5kbGVDaGF0U3RvcmVVcGRhdGVfID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkTXV0YWJsZUNoYXRTZXQkJGhhbmRsZUNoYXRTdG9yZVVwZGF0ZV8kKGV2ZW50KSB7CiAgdmFyIHVwZGF0ZSA9IGV2ZW50LmdldEpzcGIoKSwgdWlTdGF0ZTsKICBpZigibnVtYmVyIiA9PSB0eXBlb2YgdXBkYXRlLmdldFVpU3RhdGUoKSkgewogICAgdWlTdGF0ZSA9IHVwZGF0ZS5nZXRVaVN0YXRlKCkKICB9ZWxzZSB7CiAgICBzd2l0Y2godXBkYXRlLmdldFVpU3RhdGUoKSkgewogICAgICBjYXNlICJpIjoKICAgICAgICB1aVN0YXRlID0gcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5VaVN0YXRlLklOSVQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIm8iOgogICAgICAgIHVpU3RhdGUgPSBwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLlVpU3RhdGUuT1BFTjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibSI6CiAgICAgICAgdWlTdGF0ZSA9IHByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUuVWlTdGF0ZS5NSU5JTUlaRUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImMiOgogICAgICAgIHVpU3RhdGUgPSBwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLlVpU3RhdGUuQ0xPU0VECiAgICB9CiAgfQogIHZhciBjdXJyQ2hhdCA9IHRoaXMuY2hhdHNCeUppZF8uZ2V0KHVwZGF0ZS5nZXRKaWQoKSksIG9wZW5lZCA9ICExOwogIGlmKGN1cnJDaGF0KSB7CiAgICBjdXJyQ2hhdC5zZXRJc1JlYWQodXBkYXRlLmdldFJlYWQoKSk7CiAgICB2YXIgb2xkU3RhdGUgPSBjdXJyQ2hhdC5nZXRVaVN0YXRlKCk7CiAgICBpZihjdXJyQ2hhdC5zZXRVaVN0YXRlKHVpU3RhdGUpICYmIChvbGRTdGF0ZSA9PSBwcm90by5hcHBzLmNoYXQuQ2hhdFN0b3JlVXBkYXRlLlVpU3RhdGUuQ0xPU0VEIHx8IG9sZFN0YXRlID09IHByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUuVWlTdGF0ZS5JTklUICYmIHVpU3RhdGUgIT0gcHJvdG8uYXBwcy5jaGF0LkNoYXRTdG9yZVVwZGF0ZS5VaVN0YXRlLkNMT1NFRCkpIHsKICAgICAgb3BlbmVkID0gITAKICAgIH0KICB9ZWxzZSB7CiAgICBjdXJyQ2hhdCA9IG5ldyBjaGF0Lm1vZGVsLk11dGFibGVDaGF0KHVwZGF0ZS5nZXRKaWQoKSwgdXBkYXRlLmdldFJlYWQoKSwgdWlTdGF0ZSksIHRoaXMuY2hhdHNCeUppZF8uc2V0KHVwZGF0ZS5nZXRKaWQoKSwgY3VyckNoYXQpLCB1aVN0YXRlICE9IHByb3RvLmFwcHMuY2hhdC5DaGF0U3RvcmVVcGRhdGUuVWlTdGF0ZS5DTE9TRUQgJiYgKG9wZW5lZCA9ICEwKQogIH0KICBvcGVuZWQgJiYgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjaGF0Lm1vZGVsLkNoYXRTZXQuQ2hhdEV2ZW50KGNoYXQubW9kZWwuQ2hhdFNldC5FdmVudFR5cGUuQ0hBVF9PUEVORUQsIGN1cnJDaGF0KSk7CiAgY3VyckNoYXQuYmVnaW5VcGRhdGVNZXNzYWdlcygpOwogIGlmKDAgPCB1cGRhdGUuZ2V0TWVzc2FnZXNMaXN0KCkubGVuZ3RoKSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCB1cGRhdGUuZ2V0TWVzc2FnZXNMaXN0KCkubGVuZ3RoOysraSkgewogICAgICB2YXIgY3N1TWVzc2FnZSA9IHVwZGF0ZS5nZXRNZXNzYWdlc0xpc3QoKVtpXSwgbWVzc2FnZSA9IG5ldyBjaGF0Lm1vZGVsLkNoYXRNZXNzYWdlKGNzdU1lc3NhZ2UuZ2V0SWQoKSwgY3N1TWVzc2FnZS5nZXRUaW1lc3RhbXAoKSwgY3N1TWVzc2FnZS5nZXRPdHIoKSwgY3N1TWVzc2FnZS5nZXRTZW5kZXIoKSwgY3N1TWVzc2FnZS5nZXRCb2R5KCksIGNzdU1lc3NhZ2UuZ2V0UGFyc2VkQm9keSgpLCBjc3VNZXNzYWdlLmdldEljb25TZXQoKSwgY3N1TWVzc2FnZS5nZXRNZWRpYUl0ZW1zKCksIHZvaWQgMCwgY3N1TWVzc2FnZS5nZXRJc1JlZmxlY3RlZCgpKTsKICAgICAgY3VyckNoYXQuYWRkTWVzc2FnZShtZXNzYWdlKSAmJiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNoYXQubW9kZWwuQ2hhdFNldC5DaGF0RXZlbnQoY2hhdC5tb2RlbC5DaGF0U2V0LkV2ZW50VHlwZS5DSEFUX1VQREFURURfTUVTU0FHRVMsIGN1cnJDaGF0KSkKICAgIH0KICB9CiAgY3VyckNoYXQuZW5kVXBkYXRlTWVzc2FnZXMoKSAmJiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNoYXQubW9kZWwuQ2hhdFNldC5DaGF0RXZlbnQoY2hhdC5tb2RlbC5DaGF0U2V0LkV2ZW50VHlwZS5DSEFUX1VQREFURURfTUVTU0FHRVMsIGN1cnJDaGF0KSkKfTsKY2hhdC5tb2RlbC5DaGF0U2V0LkNoYXRFdmVudCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENoYXRTZXQkQ2hhdEV2ZW50JCh0eXBlLCBjdXJyQ2hhdCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdHlwZSk7CiAgdGhpcy5jaGF0ID0gY3VyckNoYXQKfTsKZ29vZy5pbmhlcml0cyhjaGF0Lm1vZGVsLkNoYXRTZXQuQ2hhdEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7Cmdvb2cuc3RydWN0cy5BdmxUcmVlID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRBdmxUcmVlJChvcHRfY29tcGFyYXRvcikgewogIHRoaXMuY29tcGFyYXRvcl8gPSBvcHRfY29tcGFyYXRvciB8fCBnb29nLnN0cnVjdHMuQXZsVHJlZS5ERUZBVUxUX0NPTVBBUkFUT1JfCn07Cmdvb2cuc3RydWN0cy5BdmxUcmVlLkRFRkFVTFRfQ09NUEFSQVRPUl8gPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJEF2bFRyZWUkREVGQVVMVF9DT01QQVJBVE9SXyQoYSwgYikgewogIHJldHVybiIiICsgYSA8ICIiICsgYiA/IC0xIDogIiIgKyBhID4gIiIgKyBiID8gMSA6IDAKfTsKZ29vZy5zdHJ1Y3RzLkF2bFRyZWUucHJvdG90eXBlLnJvb3RfID0gbnVsbDsKZ29vZy5zdHJ1Y3RzLkF2bFRyZWUucHJvdG90eXBlLmNvbXBhcmF0b3JfID0gbnVsbDsKZ29vZy5zdHJ1Y3RzLkF2bFRyZWUucHJvdG90eXBlLm1pbk5vZGVfID0gbnVsbDsKZ29vZy5zdHJ1Y3RzLkF2bFRyZWUucHJvdG90eXBlLm1heE5vZGVfID0gbnVsbDsKZ29vZy5zdHJ1Y3RzLkF2bFRyZWUucHJvdG90eXBlLmNvdW50XyA9IDA7Cmdvb2cuc3RydWN0cy5BdmxUcmVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJEF2bFRyZWUkJGFkZCQodmFsdWUpIHsKICBpZihudWxsID09IHRoaXMucm9vdF8pIHsKICAgIHJldHVybiB0aGlzLm1heE5vZGVfID0gdGhpcy5taW5Ob2RlXyA9IHRoaXMucm9vdF8gPSBuZXcgZ29vZy5zdHJ1Y3RzLkF2bFRyZWUuTm9kZSh2YWx1ZSksIHRoaXMuY291bnRfID0gMSwgITAKICB9CiAgdmFyIHJldFN0YXR1cyA9ICExOwogIHRoaXMudHJhdmVyc2VfKGZ1bmN0aW9uKG5vZGUpIHsKICAgIHZhciByZXROb2RlID0gbnVsbDsKICAgIGlmKDAgPCB0aGlzLmNvbXBhcmF0b3JfKG5vZGUudmFsdWUsIHZhbHVlKSkgewogICAgICBpZihyZXROb2RlID0gbm9kZS5sZWZ0LCBudWxsID09IG5vZGUubGVmdCkgewogICAgICAgIHZhciBuZXdOb2RlID0gbmV3IGdvb2cuc3RydWN0cy5BdmxUcmVlLk5vZGUodmFsdWUsIG5vZGUpOwogICAgICAgIG5vZGUubGVmdCA9IG5ld05vZGU7CiAgICAgICAgbm9kZSA9PSB0aGlzLm1pbk5vZGVfICYmICh0aGlzLm1pbk5vZGVfID0gbmV3Tm9kZSk7CiAgICAgICAgcmV0U3RhdHVzID0gITA7CiAgICAgICAgdGhpcy5iYWxhbmNlXyhub2RlKQogICAgICB9CiAgICB9ZWxzZSB7CiAgICAgIDAgPiB0aGlzLmNvbXBhcmF0b3JfKG5vZGUudmFsdWUsIHZhbHVlKSAmJiAocmV0Tm9kZSA9IG5vZGUucmlnaHQsIG51bGwgPT0gbm9kZS5yaWdodCAmJiAobmV3Tm9kZSA9IG5ldyBnb29nLnN0cnVjdHMuQXZsVHJlZS5Ob2RlKHZhbHVlLCBub2RlKSwgbm9kZS5yaWdodCA9IG5ld05vZGUsIG5vZGUgPT0gdGhpcy5tYXhOb2RlXyAmJiAodGhpcy5tYXhOb2RlXyA9IG5ld05vZGUpLCByZXRTdGF0dXMgPSAhMCwgdGhpcy5iYWxhbmNlXyhub2RlKSkpCiAgICB9CiAgICByZXR1cm4gcmV0Tm9kZQogIH0pOwogIHJldFN0YXR1cyAmJiAodGhpcy5jb3VudF8gKz0gMSk7CiAgcmV0dXJuIHJldFN0YXR1cwp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRBdmxUcmVlJCRyZW1vdmUkKHZhbHVlKSB7CiAgdmFyIHJldFZhbHVlID0gbnVsbDsKICB0aGlzLnRyYXZlcnNlXyhmdW5jdGlvbihub2RlKSB7CiAgICB2YXIgcmV0Tm9kZSA9IG51bGw7CiAgICAwIDwgdGhpcy5jb21wYXJhdG9yXyhub2RlLnZhbHVlLCB2YWx1ZSkgPyByZXROb2RlID0gbm9kZS5sZWZ0IDogMCA+IHRoaXMuY29tcGFyYXRvcl8obm9kZS52YWx1ZSwgdmFsdWUpID8gcmV0Tm9kZSA9IG5vZGUucmlnaHQgOiAocmV0VmFsdWUgPSBub2RlLnZhbHVlLCB0aGlzLnJlbW92ZU5vZGVfKG5vZGUpKTsKICAgIHJldHVybiByZXROb2RlCiAgfSk7CiAgcmV0VmFsdWUgJiYgKHRoaXMuY291bnRfID0gdGhpcy5yb290XyA/IHRoaXMuY291bnRfIC0gMSA6IDApOwogIHJldHVybiByZXRWYWx1ZQp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJEF2bFRyZWUkJGNsZWFyJCgpIHsKICB0aGlzLm1heE5vZGVfID0gdGhpcy5taW5Ob2RlXyA9IHRoaXMucm9vdF8gPSBudWxsOwogIHRoaXMuY291bnRfID0gMAp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJEF2bFRyZWUkJGNvbnRhaW5zJCh2YWx1ZSkgewogIHZhciBpc0NvbnRhaW5lZCA9ICExOwogIHRoaXMudHJhdmVyc2VfKGZ1bmN0aW9uKG5vZGUpIHsKICAgIHZhciByZXROb2RlID0gbnVsbDsKICAgIDAgPCB0aGlzLmNvbXBhcmF0b3JfKG5vZGUudmFsdWUsIHZhbHVlKSA/IHJldE5vZGUgPSBub2RlLmxlZnQgOiAwID4gdGhpcy5jb21wYXJhdG9yXyhub2RlLnZhbHVlLCB2YWx1ZSkgPyByZXROb2RlID0gbm9kZS5yaWdodCA6IGlzQ29udGFpbmVkID0gITA7CiAgICByZXR1cm4gcmV0Tm9kZQogIH0pOwogIHJldHVybiBpc0NvbnRhaW5lZAp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUuZ2V0Q291bnQgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJEF2bFRyZWUkJGdldENvdW50JCgpIHsKICByZXR1cm4gdGhpcy5jb3VudF8KfTsKZ29vZy5zdHJ1Y3RzLkF2bFRyZWUucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkQXZsVHJlZSQkZ2V0SGVpZ2h0JCgpIHsKICByZXR1cm4gdGhpcy5yb290XyA/IHRoaXMucm9vdF8uaGVpZ2h0IDogMAp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRBdmxUcmVlJCRnZXRWYWx1ZXMkKCkgewogIHZhciByZXQgPSBbXTsKICB0aGlzLmluT3JkZXJUcmF2ZXJzZShmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0LnB1c2godmFsdWUpCiAgfSk7CiAgcmV0dXJuIHJldAp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUuaW5PcmRlclRyYXZlcnNlID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRBdmxUcmVlJCRpbk9yZGVyVHJhdmVyc2UkKGZ1bmMsIG9wdF9zdGFydFZhbHVlKSB7CiAgaWYodGhpcy5yb290XykgewogICAgdmFyIHN0YXJ0Tm9kZTsKICAgIG9wdF9zdGFydFZhbHVlID8gdGhpcy50cmF2ZXJzZV8oZnVuY3Rpb24obm9kZSkgewogICAgICB2YXIgcmV0Tm9kZSA9IG51bGw7CiAgICAgIDAgPCB0aGlzLmNvbXBhcmF0b3JfKG5vZGUudmFsdWUsIG9wdF9zdGFydFZhbHVlKSA/IChyZXROb2RlID0gbm9kZS5sZWZ0LCBzdGFydE5vZGUgPSBub2RlKSA6IDAgPiB0aGlzLmNvbXBhcmF0b3JfKG5vZGUudmFsdWUsIG9wdF9zdGFydFZhbHVlKSA/IHJldE5vZGUgPSBub2RlLnJpZ2h0IDogc3RhcnROb2RlID0gbm9kZTsKICAgICAgcmV0dXJuIHJldE5vZGUKICAgIH0pIDogc3RhcnROb2RlID0gdGhpcy5nZXRNaW5Ob2RlXygpOwogICAgZm9yKHZhciBub2RlJCQwID0gc3RhcnROb2RlLCBwcmV2ID0gc3RhcnROb2RlLmxlZnQgPyBzdGFydE5vZGUubGVmdCA6IHN0YXJ0Tm9kZTtudWxsICE9IG5vZGUkJDA7KSB7CiAgICAgIGlmKG51bGwgIT0gbm9kZSQkMC5sZWZ0ICYmIG5vZGUkJDAubGVmdCAhPSBwcmV2ICYmIG5vZGUkJDAucmlnaHQgIT0gcHJldikgewogICAgICAgIG5vZGUkJDAgPSBub2RlJCQwLmxlZnQKICAgICAgfWVsc2UgewogICAgICAgIGlmKG5vZGUkJDAucmlnaHQgIT0gcHJldiAmJiBmdW5jKG5vZGUkJDAudmFsdWUpKSB7CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICB2YXIgdGVtcCA9IG5vZGUkJDAsIG5vZGUkJDAgPSBudWxsICE9IG5vZGUkJDAucmlnaHQgJiYgbm9kZSQkMC5yaWdodCAhPSBwcmV2ID8gbm9kZSQkMC5yaWdodCA6IG5vZGUkJDAucGFyZW50LCBwcmV2ID0gdGVtcAogICAgICB9CiAgICB9CiAgfQp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUudHJhdmVyc2VfID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRBdmxUcmVlJCR0cmF2ZXJzZV8kKHRyYXZlcnNhbEZ1bmMsIG9wdF9zdGFydE5vZGUsIG9wdF9lbmROb2RlKSB7CiAgZm9yKHZhciBub2RlID0gb3B0X3N0YXJ0Tm9kZSA/IG9wdF9zdGFydE5vZGUgOiB0aGlzLnJvb3RfLCBlbmROb2RlID0gb3B0X2VuZE5vZGUgPyBvcHRfZW5kTm9kZSA6IG51bGw7bm9kZSAmJiBub2RlICE9IGVuZE5vZGU7KSB7CiAgICBub2RlID0gdHJhdmVyc2FsRnVuYy5jYWxsKHRoaXMsIG5vZGUpCiAgfQp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUuYmFsYW5jZV8gPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJEF2bFRyZWUkJGJhbGFuY2VfJChub2RlJCQwKSB7CiAgdGhpcy50cmF2ZXJzZV8oZnVuY3Rpb24obm9kZSkgewogICAgdmFyIGxoID0gbm9kZS5sZWZ0ID8gbm9kZS5sZWZ0LmhlaWdodCA6IDAsIHJoID0gbm9kZS5yaWdodCA/IG5vZGUucmlnaHQuaGVpZ2h0IDogMDsKICAgIDEgPCBsaCAtIHJoID8gKG5vZGUubGVmdC5yaWdodCAmJiAoIW5vZGUubGVmdC5sZWZ0IHx8IG5vZGUubGVmdC5sZWZ0LmhlaWdodCA8IG5vZGUubGVmdC5yaWdodC5oZWlnaHQpICYmIHRoaXMubGVmdFJvdGF0ZV8obm9kZS5sZWZ0KSwgdGhpcy5yaWdodFJvdGF0ZV8obm9kZSkpIDogMSA8IHJoIC0gbGggJiYgKG5vZGUucmlnaHQubGVmdCAmJiAoIW5vZGUucmlnaHQucmlnaHQgfHwgbm9kZS5yaWdodC5yaWdodC5oZWlnaHQgPCBub2RlLnJpZ2h0LmxlZnQuaGVpZ2h0KSAmJiB0aGlzLnJpZ2h0Um90YXRlXyhub2RlLnJpZ2h0KSwgdGhpcy5sZWZ0Um90YXRlXyhub2RlKSk7CiAgICBsaCA9IG5vZGUubGVmdCA/IG5vZGUubGVmdC5oZWlnaHQgOiAwOwogICAgcmggPSBub2RlLnJpZ2h0ID8gbm9kZS5yaWdodC5oZWlnaHQgOiAwOwogICAgbm9kZS5oZWlnaHQgPSBNYXRoLm1heChsaCwgcmgpICsgMTsKICAgIHJldHVybiBub2RlLnBhcmVudAogIH0sIG5vZGUkJDApCn07Cmdvb2cuc3RydWN0cy5BdmxUcmVlLnByb3RvdHlwZS5sZWZ0Um90YXRlXyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkQXZsVHJlZSQkbGVmdFJvdGF0ZV8kKG5vZGUpIHsKICBub2RlLmlzTGVmdENoaWxkKCkgPyAobm9kZS5wYXJlbnQubGVmdCA9IG5vZGUucmlnaHQsIG5vZGUucmlnaHQucGFyZW50ID0gbm9kZS5wYXJlbnQpIDogbm9kZS5pc1JpZ2h0Q2hpbGQoKSA/IChub2RlLnBhcmVudC5yaWdodCA9IG5vZGUucmlnaHQsIG5vZGUucmlnaHQucGFyZW50ID0gbm9kZS5wYXJlbnQpIDogKHRoaXMucm9vdF8gPSBub2RlLnJpZ2h0LCB0aGlzLnJvb3RfLnBhcmVudCA9IG51bGwpOwogIHZhciB0ZW1wID0gbm9kZS5yaWdodDsKICBub2RlLnJpZ2h0ID0gbm9kZS5yaWdodC5sZWZ0OwogIG51bGwgIT0gbm9kZS5yaWdodCAmJiAobm9kZS5yaWdodC5wYXJlbnQgPSBub2RlKTsKICB0ZW1wLmxlZnQgPSBub2RlOwogIG5vZGUucGFyZW50ID0gdGVtcAp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUucmlnaHRSb3RhdGVfID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRBdmxUcmVlJCRyaWdodFJvdGF0ZV8kKG5vZGUpIHsKICBub2RlLmlzTGVmdENoaWxkKCkgPyAobm9kZS5wYXJlbnQubGVmdCA9IG5vZGUubGVmdCwgbm9kZS5sZWZ0LnBhcmVudCA9IG5vZGUucGFyZW50KSA6IG5vZGUuaXNSaWdodENoaWxkKCkgPyAobm9kZS5wYXJlbnQucmlnaHQgPSBub2RlLmxlZnQsIG5vZGUubGVmdC5wYXJlbnQgPSBub2RlLnBhcmVudCkgOiAodGhpcy5yb290XyA9IG5vZGUubGVmdCwgdGhpcy5yb290Xy5wYXJlbnQgPSBudWxsKTsKICB2YXIgdGVtcCA9IG5vZGUubGVmdDsKICBub2RlLmxlZnQgPSBub2RlLmxlZnQucmlnaHQ7CiAgbnVsbCAhPSBub2RlLmxlZnQgJiYgKG5vZGUubGVmdC5wYXJlbnQgPSBub2RlKTsKICB0ZW1wLnJpZ2h0ID0gbm9kZTsKICBub2RlLnBhcmVudCA9IHRlbXAKfTsKZ29vZy5zdHJ1Y3RzLkF2bFRyZWUucHJvdG90eXBlLnJlbW92ZU5vZGVfID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRBdmxUcmVlJCRyZW1vdmVOb2RlXyQobm9kZSkgewogIGlmKG51bGwgIT0gbm9kZS5sZWZ0IHx8IG51bGwgIT0gbm9kZS5yaWdodCkgewogICAgdmFyIGIgPSBudWxsLCByOwogICAgaWYobnVsbCAhPSBub2RlLmxlZnQpIHsKICAgICAgciA9IHRoaXMuZ2V0TWF4Tm9kZV8obm9kZS5sZWZ0KTsKICAgICAgaWYociAhPSBub2RlLmxlZnQpIHsKICAgICAgICBpZihyLnBhcmVudC5yaWdodCA9IHIubGVmdCkgewogICAgICAgICAgci5sZWZ0LnBhcmVudCA9IHIucGFyZW50CiAgICAgICAgfQogICAgICAgIHIubGVmdCA9IG5vZGUubGVmdDsKICAgICAgICByLmxlZnQucGFyZW50ID0gcjsKICAgICAgICBiID0gci5wYXJlbnQKICAgICAgfQogICAgICByLnBhcmVudCA9IG5vZGUucGFyZW50OwogICAgICByLnJpZ2h0ID0gbm9kZS5yaWdodDsKICAgICAgci5yaWdodCAmJiAoci5yaWdodC5wYXJlbnQgPSByKTsKICAgICAgbm9kZSA9PSB0aGlzLm1heE5vZGVfICYmICh0aGlzLm1heE5vZGVfID0gcikKICAgIH1lbHNlIHsKICAgICAgciA9IHRoaXMuZ2V0TWluTm9kZV8obm9kZS5yaWdodCk7CiAgICAgIGlmKHIgIT0gbm9kZS5yaWdodCkgewogICAgICAgIGlmKHIucGFyZW50LmxlZnQgPSByLnJpZ2h0KSB7CiAgICAgICAgICByLnJpZ2h0LnBhcmVudCA9IHIucGFyZW50CiAgICAgICAgfQogICAgICAgIHIucmlnaHQgPSBub2RlLnJpZ2h0OwogICAgICAgIHIucmlnaHQucGFyZW50ID0gcjsKICAgICAgICBiID0gci5wYXJlbnQKICAgICAgfQogICAgICByLnBhcmVudCA9IG5vZGUucGFyZW50OwogICAgICByLmxlZnQgPSBub2RlLmxlZnQ7CiAgICAgIHIubGVmdCAmJiAoci5sZWZ0LnBhcmVudCA9IHIpOwogICAgICBub2RlID09IHRoaXMubWluTm9kZV8gJiYgKHRoaXMubWluTm9kZV8gPSByKQogICAgfQogICAgbm9kZS5pc0xlZnRDaGlsZCgpID8gbm9kZS5wYXJlbnQubGVmdCA9IHIgOiBub2RlLmlzUmlnaHRDaGlsZCgpID8gbm9kZS5wYXJlbnQucmlnaHQgPSByIDogdGhpcy5yb290XyA9IHI7CiAgICB0aGlzLmJhbGFuY2VfKGIgPyBiIDogcikKICB9ZWxzZSB7CiAgICBub2RlLmlzTGVmdENoaWxkKCkgPyAobm9kZS5wYXJlbnQubGVmdCA9IG51bGwsIG5vZGUgPT0gdGhpcy5taW5Ob2RlXyAmJiAodGhpcy5taW5Ob2RlXyA9IG5vZGUucGFyZW50KSwgdGhpcy5iYWxhbmNlXyhub2RlLnBhcmVudCkpIDogbm9kZS5pc1JpZ2h0Q2hpbGQoKSA/IChub2RlLnBhcmVudC5yaWdodCA9IG51bGwsIG5vZGUgPT0gdGhpcy5tYXhOb2RlXyAmJiAodGhpcy5tYXhOb2RlXyA9IG5vZGUucGFyZW50KSwgdGhpcy5iYWxhbmNlXyhub2RlLnBhcmVudCkpIDogdGhpcy5jbGVhcigpCiAgfQp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUuZ2V0TWluTm9kZV8gPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJEF2bFRyZWUkJGdldE1pbk5vZGVfJChvcHRfcm9vdE5vZGUpIHsKICBpZighb3B0X3Jvb3ROb2RlKSB7CiAgICByZXR1cm4gdGhpcy5taW5Ob2RlXwogIH0KICB2YXIgbWluTm9kZSA9IG9wdF9yb290Tm9kZTsKICB0aGlzLnRyYXZlcnNlXyhmdW5jdGlvbihub2RlKSB7CiAgICB2YXIgcmV0Tm9kZSA9IG51bGw7CiAgICBub2RlLmxlZnQgJiYgKHJldE5vZGUgPSBtaW5Ob2RlID0gbm9kZS5sZWZ0KTsKICAgIHJldHVybiByZXROb2RlCiAgfSwgb3B0X3Jvb3ROb2RlKTsKICByZXR1cm4gbWluTm9kZQp9Owpnb29nLnN0cnVjdHMuQXZsVHJlZS5wcm90b3R5cGUuZ2V0TWF4Tm9kZV8gPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJEF2bFRyZWUkJGdldE1heE5vZGVfJChvcHRfcm9vdE5vZGUpIHsKICBpZighb3B0X3Jvb3ROb2RlKSB7CiAgICByZXR1cm4gdGhpcy5tYXhOb2RlXwogIH0KICB2YXIgbWF4Tm9kZSA9IG9wdF9yb290Tm9kZTsKICB0aGlzLnRyYXZlcnNlXyhmdW5jdGlvbihub2RlKSB7CiAgICB2YXIgcmV0Tm9kZSA9IG51bGw7CiAgICBub2RlLnJpZ2h0ICYmIChyZXROb2RlID0gbWF4Tm9kZSA9IG5vZGUucmlnaHQpOwogICAgcmV0dXJuIHJldE5vZGUKICB9LCBvcHRfcm9vdE5vZGUpOwogIHJldHVybiBtYXhOb2RlCn07Cmdvb2cuc3RydWN0cy5BdmxUcmVlLk5vZGUgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJEF2bFRyZWUkTm9kZSQodmFsdWUsIG9wdF9wYXJlbnQpIHsKICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgdGhpcy5wYXJlbnQgPSBvcHRfcGFyZW50ID8gb3B0X3BhcmVudCA6IG51bGwKfTsKZ29vZy5zdHJ1Y3RzLkF2bFRyZWUuTm9kZS5wcm90b3R5cGUubGVmdCA9IG51bGw7Cmdvb2cuc3RydWN0cy5BdmxUcmVlLk5vZGUucHJvdG90eXBlLnJpZ2h0ID0gbnVsbDsKZ29vZy5zdHJ1Y3RzLkF2bFRyZWUuTm9kZS5wcm90b3R5cGUuaGVpZ2h0ID0gMTsKZ29vZy5zdHJ1Y3RzLkF2bFRyZWUuTm9kZS5wcm90b3R5cGUuaXNSaWdodENoaWxkID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRBdmxUcmVlJE5vZGUkJGlzUmlnaHRDaGlsZCQoKSB7CiAgcmV0dXJuISF0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5yaWdodCA9PSB0aGlzCn07Cmdvb2cuc3RydWN0cy5BdmxUcmVlLk5vZGUucHJvdG90eXBlLmlzTGVmdENoaWxkID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRBdmxUcmVlJE5vZGUkJGlzTGVmdENoaWxkJCgpIHsKICByZXR1cm4hIXRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmxlZnQgPT0gdGhpcwp9Owp0YWxrLm1lZGlhLnBob25lID0ge307CnRhbGsubWVkaWEucGhvbmUuc2VydmljZXMgPSB7fTsKdGFsay5tZWRpYS5waG9uZS5zZXJ2aWNlcy51bmlxdWVJZENvdW50ZXJfID0gMDsKdGFsay5tZWRpYS5waG9uZS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJHNlcnZpY2VzJGdldFVuaXF1ZUlkJChuYW1lKSB7CiAgcmV0dXJuIG5hbWUgKyB0YWxrLm1lZGlhLnBob25lLnNlcnZpY2VzLnVuaXF1ZUlkQ291bnRlcl8rKwp9Owp0YWxrLm1lZGlhLnBob25lLnNlcnZpY2VzLlBIT05FX1VUSUwgPSB0YWxrLm1lZGlhLnBob25lLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJwaG9uZS11dGlsIik7CnRhbGsubWVkaWEucGhvbmUuc2VydmljZXMuQ09VTlRSWV9QUklPUklUWSA9IHRhbGsubWVkaWEucGhvbmUuc2VydmljZXMuZ2V0VW5pcXVlSWQoImNvdW50cnktcHJpb3JpdHkiKTsKdGFsay5tZWRpYS5waG9uZS5BYnN0cmFjdE51bWJlclV0aWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRBYnN0cmFjdE51bWJlclV0aWwkKCkgewp9Owp0YWxrLm1lZGlhLnBob25lLkFic3RyYWN0TnVtYmVyVXRpbC5wcm90b3R5cGUuY2Fub25pY2FsaXplUGhvbmVOdW1iZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRBYnN0cmFjdE51bWJlclV0aWwkJGNhbm9uaWNhbGl6ZVBob25lTnVtYmVyJCgpIHsKfTsKdGFsay5tZWRpYS5waG9uZS5BYnN0cmFjdE51bWJlclV0aWwucHJvdG90eXBlLmZvcm1hdE51bWJlckZvckRpc3BsYXkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRBYnN0cmFjdE51bWJlclV0aWwkJGZvcm1hdE51bWJlckZvckRpc3BsYXkkKCkgewp9Owp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcyA9IHt9Owp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9BRkdIQU5JU1RBTiA9ICJBZmdoYW5pc3RhbiI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FMQkFOSUEgPSAiQWxiYW5pYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FMR0VSSUEgPSAiQWxnZXJpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FNRVJJQ0FOX1NBTU9BID0gIkFtZXJpY2FuIFNhbW9hIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQU5ET1JSQSA9ICJBbmRvcnJhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQU5HT0xBID0gIkFuZ29sYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FOR1VJTExBID0gIkFuZ3VpbGxhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQU5USUdVQV9BTkRfQkFSQlVEQSA9ICJBbnRpZ3VhIGFuZCBCYXJidWRhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQVJHRU5USU5BID0gIkFyZ2VudGluYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FSTUVOSUEgPSAiQXJtZW5pYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FSVUJBID0gIkFydWJhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQVVTVFJBTElBID0gIkF1c3RyYWxpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FVU1RSSUEgPSAiQXVzdHJpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FaRVJCQUlKQU4gPSAiQXplcmJhaWphbiI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JBSEFNQVMgPSAiQmFoYW1hcyI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JBSFJBSU4gPSAiQmFocmFpbiI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JBTkdMQURFU0ggPSAiQmFuZ2xhZGVzaCI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JBUkJBRE9TID0gIkJhcmJhZG9zIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQkVMQVJVUyA9ICJCZWxhcnVzIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQkVMR0lVTSA9ICJCZWxnaXVtIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQkVMSVpFID0gIkJlbGl6ZSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JFTklOID0gIkJlbmluIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQkVSTVVEQSA9ICJCZXJtdWRhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQkhVVEFOID0gIkJodXRhbiI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JPTElWSUEgPSAiQm9saXZpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JPU05JQV9BTkRfSEVSWkVHT1ZJTkEgPSAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JPVFNXQU5BID0gIkJvdHN3YW5hIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQlJBWklMID0gIkJyYXppbCI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JSVU5FSSA9ICJCcnVuZWkiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CVUxHQVJJQSA9ICJCdWxnYXJpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JVUktJTkFfRkFTTyA9ICJCdXJraW5hIEZhc28iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CVVJVTkRJID0gIkJ1cnVuZGkiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DQU1CT0RJQSA9ICJDYW1ib2RpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NBTUVST09OID0gIkNhbWVyb29uIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ0FOQURBID0gIkNhbmFkYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NBUEVfVkVSREUgPSAiQ2FwZSBWZXJkZSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NBWU1BTl9JU0xBTkRTID0gIkNheW1hbiBJc2xhbmRzIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ0VOVFJBTF9BRlJJQ0FOX1JFUFVCTElDID0gIkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NIQUQgPSAiQ2hhZCI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NISUxFID0gIkNoaWxlIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ0hJTkEgPSAiQ2hpbmEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DT0xPTUJJQSA9ICJDb2xvbWJpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NPTU9ST1NfQU5EX01BWU9UVEUgPSAiQ29tb3JvcyBhbmQgTWF5b3R0ZSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NPTkdPID0gIkNvbmdvIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ09OR09fREVNX1JFUCA9ICJDb25nbyBEZW0gUmVwIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ09TVEFfUklDQSA9ICJDb3N0YSBSaWNhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ09URV9ESVZPSVJFID0gIkNvdGUgZCdJdm9pcmUiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DUk9BVElBID0gIkNyb2F0aWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DVUJBID0gIkN1YmEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DWVBSVVMgPSAiQ3lwcnVzIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ1pFQ0hfUkVQVUJMSUMgPSAiQ3plY2ggUmVwdWJsaWMiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9ERU5NQVJLID0gIkRlbm1hcmsiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9ESklCT1VUSSA9ICJEamlib3V0aSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0RPTUlOSUNBID0gIkRvbWluaWNhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRE9NSU5JQ0FOX1JFUFVCTElDID0gIkRvbWluaWNhbiBSZXB1YmxpYyI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0VDVUFET1IgPSAiRWN1YWRvciI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0VHWVBUID0gIkVneXB0IjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRUxfU0FMVkFET1IgPSAiRWwgU2FsdmFkb3IiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9FUVVBVE9SSUFMX0dVSU5FQSA9ICJFcXVhdG9yaWFsIEd1aW5lYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0VSSVRSRUEgPSAiRXJpdHJlYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0VTVE9OSUEgPSAiRXN0b25pYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0VUSElPUElBID0gIkV0aGlvcGlhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRkFST0VfSVNMQU5EUyA9ICJGYXJvZSBJc2xhbmRzIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRklKSSA9ICJGaWppIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRklOTEFORCA9ICJGaW5sYW5kIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRlJBTkNFID0gIkZyYW5jZSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0ZSRU5DSF9HVUlBTkEgPSAiRnJlbmNoIEd1aWFuYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0ZSRU5DSF9QT0xZTkVTSUEgPSAiRnJlbmNoIFBvbHluZXNpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dBQk9OID0gIkdhYm9uIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR0FNQklBID0gIkdhbWJpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dFT1JHSUEgPSAiR2VvcmdpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dFUk1BTlkgPSAiR2VybWFueSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dIQU5BID0gIkdoYW5hIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR0lCUkFMVEFSID0gIkdpYnJhbHRhciI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dSRUVDRSA9ICJHcmVlY2UiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9HUkVFTkxBTkQgPSAiR3JlZW5sYW5kIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR1JFTkFEQSA9ICJHcmVuYWRhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR1VBREVMT1VQRSA9ICJHdWFkZWxvdXBlIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR1VBTSA9ICJHdWFtIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR1VBVEVNQUxBID0gIkd1YXRlbWFsYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dVSU5FQSA9ICJHdWluZWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9HVUlORUFfQklTU0FVID0gIkd1aW5lYSBCaXNzYXUiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9HVVlBTkEgPSAiR3V5YW5hIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfSEFJVEkgPSAiSGFpdGkiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9IT05EVVJBUyA9ICJIb25kdXJhcyI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0hPTkdfS09ORyA9ICJIb25nIEtvbmciOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9IVU5HQVJZID0gIkh1bmdhcnkiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9JQ0VMQU5EID0gIkljZWxhbmQiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9JTkRJQSA9ICJJbmRpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0lORE9ORVNJQSA9ICJJbmRvbmVzaWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9JUkFOID0gIklyYW4iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9JUkFRID0gIklyYXEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9JUkVMQU5EID0gIklyZWxhbmQiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9JU1JBRUwgPSAiSXNyYWVsIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfSVRBTFkgPSAiSXRhbHkiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9KQU1BSUNBID0gIkphbWFpY2EiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9KQVBBTiA9ICJKYXBhbiI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0pPUkRBTiA9ICJKb3JkYW4iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9LQVpBS0hTVEFOID0gIkthemFraHN0YW4iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9LRU5ZQSA9ICJLZW55YSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0tPUkVBX1NPVVRIID0gIktvcmVhLCBTb3V0aCI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0tVV0FJVCA9ICJLdXdhaXQiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9LWVJHWVpTVEFOID0gIkt5cmd5enN0YW4iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9MQU9TID0gIkxhb3MiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9MQVRWSUEgPSAiTGF0dmlhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTEVCQU5PTiA9ICJMZWJhbm9uIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTEVTT1RITyA9ICJMZXNvdGhvIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTElCRVJJQSA9ICJMaWJlcmlhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTElCWUEgPSAiTGlieWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9MSUVDSFRFTlNURUlOID0gIkxpZWNodGVuc3RlaW4iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9MSVRIVUFOSUEgPSAiTGl0aHVhbmlhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTFVYRU1CT1VSRyA9ICJMdXhlbWJvdXJnIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTUFDQU8gPSAiTWFjYW8iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NQUNFRE9OSUEgPSAiTWFjZWRvbmlhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTUFEQUdBU0NBUiA9ICJNYWRhZ2FzY2FyIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTUFMQVdJID0gIk1hbGF3aSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX01BTEFZU0lBID0gIk1hbGF5c2lhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTUFMRElWRVMgPSAiTWFsZGl2ZXMiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NQUxJID0gIk1hbGkiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NQUxUQSA9ICJNYWx0YSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX01BUlNIQUxMX0lTTEFORFMgPSAiTWFyc2hhbGwgSXNsYW5kcyI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX01BUlRJTklRVUUgPSAiTWFydGluaXF1ZSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX01BVVJJVEFOSUEgPSAiTWF1cml0YW5pYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX01BVVJJVElVUyA9ICJNYXVyaXRpdXMiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NRVhJQ08gPSAiTWV4aWNvIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTUlDUk9ORVNJQSA9ICJNaWNyb25lc2lhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTU9MRE9WQSA9ICJNb2xkb3ZhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTU9OQUNPID0gIk1vbmFjbyI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX01PTkdPTElBID0gIk1vbmdvbGlhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTU9OVEVORUdSTyA9ICJNb250ZW5lZ3JvIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTU9OVFNFUlJBVCA9ICJNb250c2VycmF0IjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTU9ST0NDTyA9ICJNb3JvY2NvIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTU9aQU1CSVFVRSA9ICJNb3phbWJpcXVlIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTVlBTk1BUiA9ICJNeWFubWFyIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTkFNSUJJQSA9ICJOYW1pYmlhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTkFVUlUgPSAiTmF1cnUiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9ORVBBTCA9ICJOZXBhbCI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX05FVEhFUkxBTkRTID0gIk5ldGhlcmxhbmRzIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTkVUSEVSTEFORFNfQU5USUxMRVMgPSAiTmV0aGVybGFuZHMgQW50aWxsZXMiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9ORVdfQ0FMRURPTklBID0gIk5ldyBDYWxlZG9uaWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9ORVdfWkVBTEFORCA9ICJOZXcgWmVhbGFuZCI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX05JQ0FSQUdVQSA9ICJOaWNhcmFndWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9OSUdFUiA9ICJOaWdlciI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX05JR0VSSUEgPSAiTmlnZXJpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX05PUkZPTEtfSVNMQU5EID0gIk5vcmZvbGsgSXNsYW5kIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTk9SVEhFUk5fTUFSSUFOQV9JU0xBTkRTID0gIk5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX05PUldBWSA9ICJOb3J3YXkiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9PTUFOID0gIk9tYW4iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9QQUtJU1RBTiA9ICJQYWtpc3RhbiI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1BBTEFVID0gIlBhbGF1IjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUEFMRVNUSU5FID0gIlBhbGVzdGluaWFuIFRlcnJpdG9yaWVzIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUEFOQU1BID0gIlBhbmFtYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1BBUkFHVUFZID0gIlBhcmFndWF5IjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUEVSVSA9ICJQZXJ1IjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUEhJTElQUElORVMgPSAiUGhpbGlwcGluZXMiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9QT0xBTkQgPSAiUG9sYW5kIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUE9SVFVHQUwgPSAiUG9ydHVnYWwiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9QVUVSVE9fUklDTyA9ICJQdWVydG8gUmljbyI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1FBVEFSID0gIlFhdGFyIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUkVVTklPTiA9ICJSZXVuaW9uIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUk9NQU5JQSA9ICJSb21hbmlhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUlVTU0lBID0gIlJ1c3NpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1JXQU5EQSA9ICJSd2FuZGEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TQUlOVF9LSVRUU19BTkRfTkVWSVMgPSAiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU0FJTlRfTFVDSUEgPSAiU2FpbnQgTHVjaWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TQUlOVF9QSUVSUkVfQU5EX01JUVVFTE9OID0gIlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TQUlOVF9WSU5DRU5UX0dSRU5BRElORVMgPSAiU2FpbnQgVmluY2VudCBHcmVuYWRpbmVzIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU0FOX01BUklOTyA9ICJTYW4gTWFyaW5vIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU0FVRElfQVJBQklBID0gIlNhdWRpIEFyYWJpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1NFTkVHQUwgPSAiU2VuZWdhbCI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1NFUkJJQSA9ICJTZXJiaWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TRVlDSEVMTEVTID0gIlNleWNoZWxsZXMiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TSUVSUkFfTEVPTkUgPSAiU2llcnJhIExlb25lIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU0lOR0FQT1JFID0gIlNpbmdhcG9yZSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1NMT1ZBS0lBID0gIlNsb3Zha2lhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU0xPVkVOSUEgPSAiU2xvdmVuaWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TT01BTElBID0gIlNvbWFsaWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TT1VUSF9BRlJJQ0EgPSAiU291dGggQWZyaWNhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU1BBSU4gPSAiU3BhaW4iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TUklfTEFOS0EgPSAiU3JpIExhbmthIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU1VEQU4gPSAiU3VkYW4iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TVVJJTkFNRSA9ICJTdXJpbmFtZSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1NXQVpJTEFORCA9ICJTd2F6aWxhbmQiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TV0VERU4gPSAiU3dlZGVuIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU1dJVFpFUkxBTkQgPSAiU3dpdHplcmxhbmQiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TWVJJQSA9ICJTeXJpYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1RBSVdBTiA9ICJUYWl3YW4iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UQUpJS0lTVEFOID0gIlRhamlraXN0YW4iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UQU5aQU5JQSA9ICJUYW56YW5pYSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1RIQUlMQU5EID0gIlRoYWlsYW5kIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVE9HTyA9ICJUb2dvIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVE9OR0EgPSAiVG9uZ2EiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UUklOSURBRF9BTkRfVE9CQUdPID0gIlRyaW5pZGFkIGFuZCBUb2JhZ28iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UVU5JU0lBID0gIlR1bmlzaWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UVVJLRVkgPSAiVHVya2V5IjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVFVSS01FTklTVEFOID0gIlR1cmttZW5pc3RhbiI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1RVUktTX0FORF9DQUlDT1MgPSAiVHVya3MgYW5kIENhaWNvcyI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1RVVkFMVSA9ICJUdXZhbHUiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9VR0FOREEgPSAiVWdhbmRhIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVUtSQUlORSA9ICJVa3JhaW5lIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVU5JVEVEX0FSQUJfRU1JUkFURVMgPSAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9VTklURURfS0lOR0RPTSA9ICJVbml0ZWQgS2luZ2RvbSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1VSVUdVQVkgPSAiVXJ1Z3VheSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1VOSVRFRF9TVEFURVMgPSAiVW5pdGVkIFN0YXRlcyI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1VaQkVLSVNUQU4gPSAiVXpiZWtpc3RhbiI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1ZBTlVBVFUgPSAiVmFudWF0dSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1ZFTkVaVUVMQSA9ICJWZW5lenVlbGEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9WSUVUTkFNID0gIlZpZXRuYW0iOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9WSVJHSU5fSVNMQU5EU19CUklUSVNIID0gIlZpcmdpbiBJc2xhbmRzLCBCcml0aXNoIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVklSR0lOX0lTTEFORFNfVVMgPSAiVmlyZ2luIElzbGFuZHMsIFVTIjsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU0FNT0EgPSAiU2Ftb2EiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9ZRU1FTiA9ICJZZW1lbiI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1pBTUJJQSA9ICJaYW1iaWEiOwp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9aSU1CQUJXRSA9ICJaaW1iYWJ3ZSI7CnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLkNvdW50cnkgPSB7YWY6e2NvZGU6IjkzIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9BRkdIQU5JU1RBTiwgaW1nUG9zaXRpb246Ii0yMzExcHgifSwgYWw6e2NvZGU6IjM1NSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQUxCQU5JQSwgaW1nUG9zaXRpb246Ii0xMDM0cHgifSwgZHo6e2NvZGU6IjIxMyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQUxHRVJJQSwgaW1nUG9zaXRpb246Ii01MjhweCJ9LCBhczp7Y29kZToiMTY4NCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQU1FUklDQU5fU0FNT0EsIGltZ1Bvc2l0aW9uOiItMTU2MnB4In0sIGFkOntjb2RlOiIzNzYiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FORE9SUkEsIGltZ1Bvc2l0aW9uOiItNTk0cHgifSwgYW86e2NvZGU6IjI0NCIsIApuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FOR09MQSwgaW1nUG9zaXRpb246Ii0xOTQ3cHgifSwgYWk6e2NvZGU6IjEyNjQiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FOR1VJTExBLCBpbWdQb3NpdGlvbjoiLTE5ODBweCJ9LCBhZzp7Y29kZToiMTI2OCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQU5USUdVQV9BTkRfQkFSQlVEQSwgaW1nUG9zaXRpb246Ii04NjlweCJ9LCBhcjp7Y29kZToiNTQiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0FSR0VOVElOQSwgaW1nUG9zaXRpb246Ii0yMzc3cHgifSwgYW06e2NvZGU6IjM3NCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQVJNRU5JQSwgaW1nUG9zaXRpb246Ii0xNzZweCJ9LCBhdzp7Y29kZToiMjk3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9BUlVCQSwgCmltZ1Bvc2l0aW9uOiItNzkycHgifSwgYXU6e2NvZGU6IjYxIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9BVVNUUkFMSUEsIGltZ1Bvc2l0aW9uOiItMTcxNnB4In0sIGF0Ontjb2RlOiI0MyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQVVTVFJJQSwgaW1nUG9zaXRpb246Ii0xMzMxcHgifSwgYXo6e2NvZGU6Ijk5NCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQVpFUkJBSUpBTiwgaW1nUG9zaXRpb246Ii0xMjQzcHgifSwgYnM6e2NvZGU6IjEyNDIiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JBSEFNQVMsIGltZ1Bvc2l0aW9uOiItMzYzcHgifSwgYmg6e2NvZGU6Ijk3MyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQkFIUkFJTiwgaW1nUG9zaXRpb246Ii0xNDk2cHgifSwgYmQ6e2NvZGU6Ijg4MCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQkFOR0xBREVTSCwgCmltZ1Bvc2l0aW9uOiItMTc3MXB4In0sIGJiOntjb2RlOiIxMjQ2IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CQVJCQURPUywgaW1nUG9zaXRpb246Ii0xNTczcHgifSwgYnk6e2NvZGU6IjM3NSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQkVMQVJVUywgaW1nUG9zaXRpb246Ii0xMTAwcHgifSwgYmU6e2NvZGU6IjMyIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CRUxHSVVNLCBpbWdQb3NpdGlvbjoiMCJ9LCBiejp7Y29kZToiNTAxIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CRUxJWkUsIGltZ1Bvc2l0aW9uOiItNDg0cHgifSwgYmo6e2NvZGU6IjIyOSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQkVOSU4sIGltZ1Bvc2l0aW9uOiItMTI5OHB4In0sIGJtOntjb2RlOiIxNDQxIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CRVJNVURBLCAKaW1nUG9zaXRpb246Ii0xOTE0cHgifSwgYnQ6e2NvZGU6Ijk3NSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQkhVVEFOLCBpbWdQb3NpdGlvbjoiLTE4NDhweCJ9LCBibzp7Y29kZToiNTkxIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CT0xJVklBLCBpbWdQb3NpdGlvbjoiLTE2NTBweCJ9LCBiYTp7Y29kZToiMzg3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CT1NOSUFfQU5EX0hFUlpFR09WSU5BLCBpbWdQb3NpdGlvbjoiLTE1ODRweCJ9LCBidzp7Y29kZToiMjY3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CT1RTV0FOQSwgaW1nUG9zaXRpb246Ii0yNzA3cHgifSwgYnI6e2NvZGU6IjU1IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CUkFaSUwsIGltZ1Bvc2l0aW9uOiItNzcwcHgifSwgYm46e2NvZGU6IjY3MyIsIApuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JSVU5FSSwgaW1nUG9zaXRpb246Ii0xNjgzcHgifSwgYmc6e2NvZGU6IjM1OSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQlVMR0FSSUEsIGltZ1Bvc2l0aW9uOiItMjU4NnB4In0sIGJmOntjb2RlOiIyMjYiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0JVUktJTkFfRkFTTywgaW1nUG9zaXRpb246Ii03MjZweCJ9LCBiaTp7Y29kZToiMjU3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9CVVJVTkRJLCBpbWdQb3NpdGlvbjoiLTE4OTJweCJ9LCBraDp7Y29kZToiODU1IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DQU1CT0RJQSwgaW1nUG9zaXRpb246Ii0yNDJweCJ9LCBjbTp7Y29kZToiMjM3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DQU1FUk9PTiwgCmltZ1Bvc2l0aW9uOiItMjA1N3B4In0sIGNhOntjb2RlOiIxIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DQU5BREEsIGltZ1Bvc2l0aW9uOiItMTM3NXB4In0sIGN2Ontjb2RlOiIyMzgiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NBUEVfVkVSREUsIGltZ1Bvc2l0aW9uOiItMjY1MnB4In0sIGt5Ontjb2RlOiIxMzQ1IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DQVlNQU5fSVNMQU5EUywgaW1nUG9zaXRpb246Ii0zMDhweCJ9LCBjZjp7Y29kZToiMjM2IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DRU5UUkFMX0FGUklDQU5fUkVQVUJMSUMsIGltZ1Bvc2l0aW9uOiItMTgzN3B4In0sIHRkOntjb2RlOiIyMzUiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NIQUQsIGltZ1Bvc2l0aW9uOiItODE0cHgifSwgY2w6e2NvZGU6IjU2IiwgCm5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ0hJTEUsIGltZ1Bvc2l0aW9uOiItMTM0MnB4In0sIGNuOntjb2RlOiI4NiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ0hJTkEsIGltZ1Bvc2l0aW9uOiItODI1cHgifSwgY286e2NvZGU6IjU3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DT0xPTUJJQSwgaW1nUG9zaXRpb246Ii0zMzBweCJ9LCBrbTp7Y29kZToiMjY5IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DT01PUk9TX0FORF9NQVlPVFRFLCBpbWdQb3NpdGlvbjoiLTE0MzBweCJ9LCBjZzp7Y29kZToiMjQyIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9DT05HTywgaW1nUG9zaXRpb246Ii0xNzkzcHgifSwgY2Q6e2NvZGU6IjI0MyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ09OR09fREVNX1JFUCwgCmltZ1Bvc2l0aW9uOiItMTUxOHB4In0sIGNyOntjb2RlOiI1MDYiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NPU1RBX1JJQ0EsIGltZ1Bvc2l0aW9uOiItMjA5MHB4In0sIGNpOntjb2RlOiIyMjUiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NPVEVfRElWT0lSRSwgaW1nUG9zaXRpb246Ii0xNjYxcHgifSwgaHI6e2NvZGU6IjM4NSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ1JPQVRJQSwgaW1nUG9zaXRpb246Ii05MDJweCJ9LCBjdTp7Y29kZToiNTMiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NVQkEsIGltZ1Bvc2l0aW9uOiItNzQ4cHgifSwgY3k6e2NvZGU6IjM1NyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfQ1lQUlVTLCBpbWdQb3NpdGlvbjoiLTU2MXB4In0sIGN6Ontjb2RlOiI0MjAiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0NaRUNIX1JFUFVCTElDLCAKaW1nUG9zaXRpb246Ii0yMjU2cHgifSwgZGs6e2NvZGU6IjQ1IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9ERU5NQVJLLCBpbWdQb3NpdGlvbjoiLTEzODZweCJ9LCBkajp7Y29kZToiMjUzIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9ESklCT1VUSSwgaW1nUG9zaXRpb246Ii0yMTAxcHgifSwgZG06e2NvZGU6IjE3NjciLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0RPTUlOSUNBLCBpbWdQb3NpdGlvbjoiLTI0MzJweCJ9LCAiZG8iOntjb2RlOiIxODA5IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9ET01JTklDQU5fUkVQVUJMSUMsIGltZ1Bvc2l0aW9uOiItMTUyOXB4In0sIGVjOntjb2RlOiI1OTMiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0VDVUFET1IsIGltZ1Bvc2l0aW9uOiItMTE4OHB4In0sIGVnOntjb2RlOiIyMCIsIApuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0VHWVBULCBpbWdQb3NpdGlvbjoiLTIyMDFweCJ9LCBzdjp7Y29kZToiNTAzIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9FTF9TQUxWQURPUiwgaW1nUG9zaXRpb246Ii0xNjM5cHgifSwgZ3E6e2NvZGU6IjI0MCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRVFVQVRPUklBTF9HVUlORUEsIGltZ1Bvc2l0aW9uOiItMTUwN3B4In0sIGVyOntjb2RlOiIyOTEiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0VSSVRSRUEsIGltZ1Bvc2l0aW9uOiItNzE1cHgifSwgZWU6e2NvZGU6IjM3MiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRVNUT05JQSwgaW1nUG9zaXRpb246Ii0yNDEwcHgifSwgZXQ6e2NvZGU6IjI1MSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRVRISU9QSUEsIAppbWdQb3NpdGlvbjoiLTI0NDNweCJ9LCBmbzp7Y29kZToiMjk4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9GQVJPRV9JU0xBTkRTLCBpbWdQb3NpdGlvbjoiLTExMTFweCJ9LCBmajp7Y29kZToiNjc5IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9GSUpJLCBpbWdQb3NpdGlvbjoiLTE4NTlweCJ9LCBmaTp7Y29kZToiMzU4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9GSU5MQU5ELCBpbWdQb3NpdGlvbjoiLTE5MDNweCJ9LCBmcjp7Y29kZToiMzMiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0ZSQU5DRSwgaW1nUG9zaXRpb246Ii0xMDEycHgifSwgZ2Y6e2NvZGU6IjU5NCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRlJFTkNIX0dVSUFOQSwgaW1nUG9zaXRpb246Ii0yMjM0cHgifSwgcGY6e2NvZGU6IjY4OSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfRlJFTkNIX1BPTFlORVNJQSwgCmltZ1Bvc2l0aW9uOiItMTcwNXB4In0sIGdhOntjb2RlOiIyNDEiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dBQk9OLCBpbWdQb3NpdGlvbjoiLTg4MHB4In0sIGdtOntjb2RlOiIyMjAiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dBTUJJQSwgaW1nUG9zaXRpb246Ii02MjdweCJ9LCBnZTp7Y29kZToiOTk1IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9HRU9SR0lBLCBpbWdQb3NpdGlvbjoiLTg1OHB4In0sIGRlOntjb2RlOiI0OSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR0VSTUFOWSwgaW1nUG9zaXRpb246Ii0yNTA5cHgifSwgZ2g6e2NvZGU6IjIzMyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR0hBTkEsIGltZ1Bvc2l0aW9uOiItMjExMnB4In0sIGdpOntjb2RlOiIzNTAiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dJQlJBTFRBUiwgCmltZ1Bvc2l0aW9uOiItMjc1cHgifSwgZ3I6e2NvZGU6IjMwIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9HUkVFQ0UsIGltZ1Bvc2l0aW9uOiItMTY1cHgifSwgZ2w6e2NvZGU6IjI5OSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR1JFRU5MQU5ELCBpbWdQb3NpdGlvbjoiLTE3NjBweCJ9LCBnZDp7Y29kZToiMTQ3MyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR1JFTkFEQSwgaW1nUG9zaXRpb246Ii0yMzk5cHgifSwgZ3A6e2NvZGU6IjU5MCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR1VBREVMT1VQRSwgaW1nUG9zaXRpb246Ii00MDdweCJ9LCBndTp7Y29kZToiMTY3MSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR1VBTSwgaW1nUG9zaXRpb246Ii0yMzY2cHgifSwgZ3Q6e2NvZGU6IjUwMiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfR1VBVEVNQUxBLCAKaW1nUG9zaXRpb246Ii05MzVweCJ9LCBnbjp7Y29kZToiMjI0IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9HVUlORUEsIGltZ1Bvc2l0aW9uOiItMjU3NXB4In0sIGd3Ontjb2RlOiIyNDUiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dVSU5FQV9CSVNTQVUsIGltZ1Bvc2l0aW9uOiItMTkyNXB4In0sIGd5Ontjb2RlOiI1OTIiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0dVWUFOQSwgaW1nUG9zaXRpb246Ii04MDNweCJ9LCBodDp7Y29kZToiNTA5IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9IQUlUSSwgaW1nUG9zaXRpb246Ii0zMTlweCJ9LCBobjp7Y29kZToiNTA0IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9IT05EVVJBUywgaW1nUG9zaXRpb246Ii0yMTU2cHgifSwgaGs6e2NvZGU6Ijg1MiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfSE9OR19LT05HLCAKaW1nUG9zaXRpb246Ii0yNjk2cHgifSwgaHU6e2NvZGU6IjM2IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9IVU5HQVJZLCBpbWdQb3NpdGlvbjoiLTY4MnB4In0sIGlzOntjb2RlOiIzNTQiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0lDRUxBTkQsIGltZ1Bvc2l0aW9uOiItMTk5MXB4In0sICJpbiI6e2NvZGU6IjkxIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9JTkRJQSwgaW1nUG9zaXRpb246Ii0xNjk0cHgifSwgaWQ6e2NvZGU6IjYyIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9JTkRPTkVTSUEsIGltZ1Bvc2l0aW9uOiItMTk1OHB4In0sIGlyOntjb2RlOiI5OCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfSVJBTiwgaW1nUG9zaXRpb246Ii0yMDEzcHgifSwgaXE6e2NvZGU6Ijk2NCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfSVJBUSwgCmltZ1Bvc2l0aW9uOiItNjQ5cHgifSwgaWU6e2NvZGU6IjM1MyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfSVJFTEFORCwgaW1nUG9zaXRpb246Ii0xOTY5cHgifSwgaWw6e2NvZGU6Ijk3MiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfSVNSQUVMLCBpbWdQb3NpdGlvbjoiLTM0MXB4In0sIGl0Ontjb2RlOiIzOSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfSVRBTFksIGltZ1Bvc2l0aW9uOiItMTQzcHgifSwgam06e2NvZGU6IjE4NzYiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0pBTUFJQ0EsIGltZ1Bvc2l0aW9uOiItMTcyN3B4In0sIGpwOntjb2RlOiI4MSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfSkFQQU4sIGltZ1Bvc2l0aW9uOiItNDI5cHgifSwgam86e2NvZGU6Ijk2MiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfSk9SREFOLCAKaW1nUG9zaXRpb246Ii0xNDYzcHgifSwga3o6e2NvZGU6IjciLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0tBWkFLSFNUQU4sIGltZ1Bvc2l0aW9uOiItMTIxMHB4In0sIGtlOntjb2RlOiIyNTQiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0tFTllBLCBpbWdQb3NpdGlvbjoiLTI2MzBweCJ9LCBrcjp7Y29kZToiODIiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0tPUkVBX1NPVVRILCBpbWdQb3NpdGlvbjoiLTIyNDVweCJ9LCBrdzp7Y29kZToiOTY1IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9LVVdBSVQsIGltZ1Bvc2l0aW9uOiItMjQ4N3B4In0sIGtnOntjb2RlOiI5OTYiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0tZUkdZWlNUQU4sIGltZ1Bvc2l0aW9uOiItMTYxN3B4In0sIGxhOntjb2RlOiI4NTYiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0xBT1MsIAppbWdQb3NpdGlvbjoiLTQ1MXB4In0sIGx2Ontjb2RlOiIzNzEiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX0xBVFZJQSwgaW1nUG9zaXRpb246Ii0xOTM2cHgifSwgbGI6e2NvZGU6Ijk2MSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTEVCQU5PTiwgaW1nUG9zaXRpb246Ii0xMjU0cHgifSwgbHM6e2NvZGU6IjI2NiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTEVTT1RITywgaW1nUG9zaXRpb246Ii0yMTkwcHgifSwgbHI6e2NvZGU6IjIzMSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTElCRVJJQSwgaW1nUG9zaXRpb246Ii0yMDY4cHgifSwgbHk6e2NvZGU6IjIxOCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTElCWUEsIGltZ1Bvc2l0aW9uOiItMTMycHgifSwgbGk6e2NvZGU6IjQyMyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTElFQ0hURU5TVEVJTiwgCmltZ1Bvc2l0aW9uOiItOTc5cHgifSwgbHQ6e2NvZGU6IjM3MCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTElUSFVBTklBLCBpbWdQb3NpdGlvbjoiLTExMjJweCJ9LCBsdTp7Y29kZToiMzUyIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9MVVhFTUJPVVJHLCBpbWdQb3NpdGlvbjoiLTE0NzRweCJ9LCBtbzp7Y29kZToiODUzIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NQUNBTywgaW1nUG9zaXRpb246Ii0yNTk3cHgifSwgbWs6e2NvZGU6IjM4OSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTUFDRURPTklBLCBpbWdQb3NpdGlvbjoiLTEzNTNweCJ9LCBtZzp7Y29kZToiMjYxIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NQURBR0FTQ0FSLCBpbWdQb3NpdGlvbjoiLTEyODdweCJ9LCBtdzp7Y29kZToiMjY1IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NQUxBV0ksIAppbWdQb3NpdGlvbjoiLTIxNDVweCJ9LCBteTp7Y29kZToiNjAiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX01BTEFZU0lBLCBpbWdQb3NpdGlvbjoiLTE4NzBweCJ9LCBtdjp7Y29kZToiOTYwIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NQUxESVZFUywgaW1nUG9zaXRpb246Ii02MTZweCJ9LCBtbDp7Y29kZToiMjIzIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NQUxJLCBpbWdQb3NpdGlvbjoiLTI1MjBweCJ9LCBtdDp7Y29kZToiMzU2IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NQUxUQSwgaW1nUG9zaXRpb246Ii0xNTUxcHgifSwgbWg6e2NvZGU6IjY5MiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTUFSU0hBTExfSVNMQU5EUywgaW1nUG9zaXRpb246Ii0xMTQ0cHgifSwgbXE6e2NvZGU6IjU5NiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTUFSVElOSVFVRSwgCmltZ1Bvc2l0aW9uOiItMTk4cHgifSwgbXI6e2NvZGU6IjIyMiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTUFVUklUQU5JQSwgaW1nUG9zaXRpb246Ii0yNTNweCJ9LCBtdTp7Y29kZToiMjMwIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NQVVSSVRJVVMsIGltZ1Bvc2l0aW9uOiItMjE3OXB4In0sIG14Ontjb2RlOiI1MiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTUVYSUNPLCBpbWdQb3NpdGlvbjoiLTIwMjRweCJ9LCBmbTp7Y29kZToiNjkxIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NSUNST05FU0lBLCBpbWdQb3NpdGlvbjoiLTE3MzhweCJ9LCBtZDp7Y29kZToiMzczIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NT0xET1ZBLCBpbWdQb3NpdGlvbjoiLTI2ODVweCJ9LCBtYzp7Y29kZToiMzc3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NT05BQ08sIAppbWdQb3NpdGlvbjoiLTkxM3B4In0sIG1uOntjb2RlOiI5NzYiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX01PTkdPTElBLCBpbWdQb3NpdGlvbjoiLTI1NTNweCJ9LCBtZTp7Y29kZToiMzgyIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NT05URU5FR1JPLCBpbWdQb3NpdGlvbjoiLTIxNjdweCJ9LCBtczp7Y29kZToiMTY2NCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTU9OVFNFUlJBVCwgaW1nUG9zaXRpb246Ii01ODNweCJ9LCBtYTp7Y29kZToiMjEyIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NT1JPQ0NPLCBpbWdQb3NpdGlvbjoiLTIzMzNweCJ9LCBtejp7Y29kZToiMjU4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9NT1pBTUJJUVVFLCBpbWdQb3NpdGlvbjoiLTYzOHB4In0sIG1tOntjb2RlOiI5NSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTVlBTk1BUiwgCmltZ1Bvc2l0aW9uOiItMTFweCJ9LCBuYTp7Y29kZToiMjY0IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9OQU1JQklBLCBpbWdQb3NpdGlvbjoiLTE4ODFweCJ9LCBucjp7Y29kZToiNjc0IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9OQVVSVSwgaW1nUG9zaXRpb246Ii0xNzQ5cHgifSwgbnA6e2NvZGU6Ijk3NyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTkVQQUwsIGltZ1Bvc2l0aW9uOiItMTEwcHgifSwgbmw6e2NvZGU6IjMxIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9ORVRIRVJMQU5EUywgaW1nUG9zaXRpb246Ii0xNDQxcHgifSwgYW46e2NvZGU6IjU5OSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTkVUSEVSTEFORFNfQU5USUxMRVMsIGltZ1Bvc2l0aW9uOiItMjIwcHgifSwgbmM6e2NvZGU6IjY4NyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTkVXX0NBTEVET05JQSwgCmltZ1Bvc2l0aW9uOiItMTI3NnB4In0sIG56Ontjb2RlOiI2NCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTkVXX1pFQUxBTkQsIGltZ1Bvc2l0aW9uOiItMTU0MHB4In0sIG5pOntjb2RlOiI1MDUiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX05JQ0FSQUdVQSwgaW1nUG9zaXRpb246Ii0xNTRweCJ9LCBuZTp7Y29kZToiMjI3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9OSUdFUiwgaW1nUG9zaXRpb246Ii01NTBweCJ9LCBuZzp7Y29kZToiMjM0IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9OSUdFUklBLCBpbWdQb3NpdGlvbjoiLTI0NzZweCJ9LCBuZjp7Y29kZToiNjcyMyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfTk9SRk9MS19JU0xBTkQsIGltZ1Bvc2l0aW9uOiItMjA5cHgifSwgbXA6e2NvZGU6IjEiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX05PUlRIRVJOX01BUklBTkFfSVNMQU5EUywgCmltZ1Bvc2l0aW9uOiItNzA0cHgifSwgbm86e2NvZGU6IjQ3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9OT1JXQVksIGltZ1Bvc2l0aW9uOiItODM2cHgifSwgb206e2NvZGU6Ijk2OCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfT01BTiwgaW1nUG9zaXRpb246Ii0yNDU0cHgifSwgcGs6e2NvZGU6IjkyIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9QQUtJU1RBTiwgaW1nUG9zaXRpb246Ii0yMDM1cHgifSwgcHc6e2NvZGU6IjY4MCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUEFMQVUsIGltZ1Bvc2l0aW9uOiItMjMxcHgifSwgcHM6e2NvZGU6Ijk3MCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUEFMRVNUSU5FLCBpbWdQb3NpdGlvbjoiLTExOTlweCJ9LCBwYTp7Y29kZToiNTA3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9QQU5BTUEsIAppbWdQb3NpdGlvbjoiLTg0N3B4In0sIHB5Ontjb2RlOiI1OTUiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1BBUkFHVUFZLCBpbWdQb3NpdGlvbjoiLTIzNDRweCJ9LCBwZTp7Y29kZToiNTEiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1BFUlUsIGltZ1Bvc2l0aW9uOiItOTQ2cHgifSwgcGg6e2NvZGU6IjYzIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9QSElMSVBQSU5FUywgaW1nUG9zaXRpb246Ii0xODE1cHgifSwgcGw6e2NvZGU6IjQ4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9QT0xBTkQsIGltZ1Bvc2l0aW9uOiItMTE3N3B4In0sIHB0Ontjb2RlOiIzNTEiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1BPUlRVR0FMLCBpbWdQb3NpdGlvbjoiLTUxN3B4In0sIHByOntjb2RlOiIxNzg3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9QVUVSVE9fUklDTywgCmltZ1Bvc2l0aW9uOiItNDczcHgifSwgcWE6e2NvZGU6Ijk3NCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUUFUQVIsIGltZ1Bvc2l0aW9uOiItNDYycHgifSwgcmU6e2NvZGU6IjI2MiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfUkVVTklPTiwgaW1nUG9zaXRpb246Ii0yNjRweCJ9LCBybzp7Y29kZToiNDAiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1JPTUFOSUEsIGltZ1Bvc2l0aW9uOiItNjcxcHgifSwgcnU6e2NvZGU6IjciLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1JVU1NJQSwgaW1nUG9zaXRpb246Ii02NjBweCJ9LCBydzp7Y29kZToiMjUwIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9SV0FOREEsIGltZ1Bvc2l0aW9uOiItMjY3NHB4In0sIGtuOntjb2RlOiIxODY5IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TQUlOVF9LSVRUU19BTkRfTkVWSVMsIAppbWdQb3NpdGlvbjoiLTk5cHgifSwgbGM6e2NvZGU6IjE3NTgiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1NBSU5UX0xVQ0lBLCBpbWdQb3NpdGlvbjoiLTEzOTdweCJ9LCBwbTp7Y29kZToiNTA4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TQUlOVF9QSUVSUkVfQU5EX01JUVVFTE9OLCBpbWdQb3NpdGlvbjoiLTEwNzhweCJ9LCB2Yzp7Y29kZToiMTc4NCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU0FJTlRfVklOQ0VOVF9HUkVOQURJTkVTLCBpbWdQb3NpdGlvbjoiLTI2MTlweCJ9LCBzbTp7Y29kZToiMzc4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TQU5fTUFSSU5PLCBpbWdQb3NpdGlvbjoiLTIxMjNweCJ9LCBzYTp7Y29kZToiOTY2IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TQVVESV9BUkFCSUEsIGltZ1Bvc2l0aW9uOiItMzNweCJ9LCAKc246e2NvZGU6IjIyMSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU0VORUdBTCwgaW1nUG9zaXRpb246Ii0yMTM0cHgifSwgcnM6e2NvZGU6IjM4MSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU0VSQklBLCBpbWdQb3NpdGlvbjoiLTI0NjVweCJ9LCBzYzp7Y29kZToiMjQ4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TRVlDSEVMTEVTLCBpbWdQb3NpdGlvbjoiLTEwNDVweCJ9LCBzbDp7Y29kZToiMjMyIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TSUVSUkFfTEVPTkUsIGltZ1Bvc2l0aW9uOiItNzM3cHgifSwgc2c6e2NvZGU6IjY1IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TSU5HQVBPUkUsIGltZ1Bvc2l0aW9uOiItMjJweCJ9LCBzazp7Y29kZToiNDIxIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TTE9WQUtJQSwgCmltZ1Bvc2l0aW9uOiItMjIxMnB4In0sIHNpOntjb2RlOiIzODYiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1NMT1ZFTklBLCBpbWdQb3NpdGlvbjoiLTEyMjFweCJ9LCBzbzp7Y29kZToiMjUyIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TT01BTElBLCBpbWdQb3NpdGlvbjoiLTEzNjRweCJ9LCB6YTp7Y29kZToiMjciLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1NPVVRIX0FGUklDQSwgaW1nUG9zaXRpb246Ii0yMzU1cHgifSwgZXM6e2NvZGU6IjM0IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TUEFJTiwgaW1nUG9zaXRpb246Ii0xMTU1cHgifSwgbGs6e2NvZGU6Ijk0IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TUklfTEFOS0EsIGltZ1Bvc2l0aW9uOiItMjY0MXB4In0sIHNkOntjb2RlOiIyNDkiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1NVREFOLCAKaW1nUG9zaXRpb246Ii0zNTJweCJ9LCBzcjp7Y29kZToiNTk3IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TVVJJTkFNRSwgaW1nUG9zaXRpb246Ii0yNjYzcHgifSwgc3o6e2NvZGU6IjI2OCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfU1dBWklMQU5ELCBpbWdQb3NpdGlvbjoiLTIyNzhweCJ9LCBzZTp7Y29kZToiNDYiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1NXRURFTiwgaW1nUG9zaXRpb246Ii0zODVweCJ9LCBjaDp7Y29kZToiNDEiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1NXSVRaRVJMQU5ELCBpbWdQb3NpdGlvbjoiLTEzMjBweCJ9LCBzeTp7Y29kZToiOTYzIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TWVJJQSwgaW1nUG9zaXRpb246Ii0xODI2cHgifSwgdHc6e2NvZGU6Ijg4NiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVEFJV0FOLCAKaW1nUG9zaXRpb246Ii01MDZweCJ9LCB0ajp7Y29kZToiOTkyIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UQUpJS0lTVEFOLCBpbWdQb3NpdGlvbjoiLTE4N3B4In0sIHR6Ontjb2RlOiIyNTUiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1RBTlpBTklBLCBpbWdQb3NpdGlvbjoiLTIyODlweCJ9LCB0aDp7Y29kZToiNjYiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1RIQUlMQU5ELCBpbWdQb3NpdGlvbjoiLTk1N3B4In0sIHRnOntjb2RlOiIyMjgiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1RPR08sIGltZ1Bvc2l0aW9uOiItNjA1cHgifSwgdG86e2NvZGU6IjY3NiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVE9OR0EsIGltZ1Bvc2l0aW9uOiItMTA4OXB4In0sIHR0Ontjb2RlOiIxODY4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UUklOSURBRF9BTkRfVE9CQUdPLCAKaW1nUG9zaXRpb246Ii00NDBweCJ9LCB0bjp7Y29kZToiMjE2IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UVU5JU0lBLCBpbWdQb3NpdGlvbjoiLTUzOXB4In0sIHRyOntjb2RlOiI5MCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVFVSS0VZLCBpbWdQb3NpdGlvbjoiLTE2MDZweCJ9LCB0bTp7Y29kZToiOTkzIiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UVVJLTUVOSVNUQU4sIGltZ1Bvc2l0aW9uOiItMjU0MnB4In0sIHRjOntjb2RlOiIxNjQ5IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UVVJLU19BTkRfQ0FJQ09TLCBpbWdQb3NpdGlvbjoiLTEzMDlweCJ9LCB0djp7Y29kZToiNjg4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9UVVZBTFUsIGltZ1Bvc2l0aW9uOiItMjg2cHgifSwgdWc6e2NvZGU6IjI1NiIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVUdBTkRBLCAKaW1nUG9zaXRpb246Ii0xMTY2cHgifSwgdWE6e2NvZGU6IjM4MCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVUtSQUlORSwgaW1nUG9zaXRpb246Ii0yMDAycHgifSwgYWU6e2NvZGU6Ijk3MSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVU5JVEVEX0FSQUJfRU1JUkFURVMsIGltZ1Bvc2l0aW9uOiItMjIyM3B4In0sIGdiOntjb2RlOiI0NCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVU5JVEVEX0tJTkdET00sIGltZ1Bvc2l0aW9uOiItNTVweCJ9LCB1eTp7Y29kZToiNTk4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9VUlVHVUFZLCBpbWdQb3NpdGlvbjoiLTI2MDhweCJ9LCB1czp7Y29kZToiMSIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVU5JVEVEX1NUQVRFUywgaW1nUG9zaXRpb246Ii00NHB4In0sIHV6Ontjb2RlOiI5OTgiLCAKbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9VWkJFS0lTVEFOLCBpbWdQb3NpdGlvbjoiLTEwMDFweCJ9LCB2dTp7Y29kZToiNjc4IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9WQU5VQVRVLCBpbWdQb3NpdGlvbjoiLTEyNjVweCJ9LCB2ZTp7Y29kZToiNTgiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1ZFTkVaVUVMQSwgaW1nUG9zaXRpb246Ii0xMDU2cHgifSwgdm46e2NvZGU6Ijg0IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9WSUVUTkFNLCBpbWdQb3NpdGlvbjoiLTk2OHB4In0sIHZnOntjb2RlOiIxMjg0IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9WSVJHSU5fSVNMQU5EU19CUklUSVNILCBpbWdQb3NpdGlvbjoiLTE0MDhweCJ9LCB2aTp7Y29kZToiMTM0MCIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfVklSR0lOX0lTTEFORFNfVVMsIAppbWdQb3NpdGlvbjoiLTE3ODJweCJ9LCB3czp7Y29kZToiNjg1IiwgbmFtZTp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5NU0dfTkFNRV9TQU1PQSwgaW1nUG9zaXRpb246Ii0yMzAwcHgifSwgeWU6e2NvZGU6Ijk2NyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfWUVNRU4sIGltZ1Bvc2l0aW9uOiItMTY3MnB4In0sIHptOntjb2RlOiIyNjAiLCBuYW1lOnRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLk1TR19OQU1FX1pBTUJJQSwgaW1nUG9zaXRpb246Ii0xNTk1cHgifSwgenc6e2NvZGU6IjI2MyIsIG5hbWU6dGFsay5tZWRpYS5waG9uZS5Db3VudHJpZXMuTVNHX05BTUVfWklNQkFCV0UsIGltZ1Bvc2l0aW9uOiItMjA0NnB4In19Owp0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5tYWtlQ291bnRyeURhdGEgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRDb3VudHJpZXMkbWFrZUNvdW50cnlEYXRhJChjdXN0b21EYXRhKSB7CiAgZm9yKHZhciBjb3VudHJ5RGF0YSA9IHt9LCBpID0gMDtpIDwgY3VzdG9tRGF0YS5sZW5ndGg7aSsrKSB7CiAgICB2YXIgY3VzdG9tID0gY3VzdG9tRGF0YVtpXSwgY291bnRyeUNvZGUgPSBjdXN0b20uY291bnRyeUNvZGUudG9Mb3dlckNhc2UoKSwgc3RhbmRhcmQgPSB0YWxrLm1lZGlhLnBob25lLkNvdW50cmllcy5Db3VudHJ5W2NvdW50cnlDb2RlXTsKICAgIHN0YW5kYXJkICYmIChjb3VudHJ5RGF0YVtjb3VudHJ5Q29kZV0gPSB7Y29kZTpzdGFuZGFyZC5jb2RlLCBpbWdQb3NpdGlvbjpzdGFuZGFyZC5pbWdQb3NpdGlvbiwgbmFtZTpjdXN0b20ubmFtZSB8fCBzdGFuZGFyZC5uYW1lLCBsYWJlbDpjdXN0b20ubGFiZWx9KQogIH0KICByZXR1cm4gY291bnRyeURhdGEKfTsKdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkTnVtYmVyVXRpbCQoKSB7Cn07CnRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5wcm90b3R5cGUuY2Fub25pY2FsaXplUGhvbmVOdW1iZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSROdW1iZXJVdGlsJCRjYW5vbmljYWxpemVQaG9uZU51bWJlciQobnVtYmVyLCBvcHRfY291bnRyeUNvZGUsIG9wdF9uZGRDb2RlKSB7CiAgcmV0dXJuIHRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5jYW5vbmljYWxpemVQaG9uZU51bWJlcihudW1iZXIsIG9wdF9jb3VudHJ5Q29kZSwgb3B0X25kZENvZGUpCn07CnRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5wcm90b3R5cGUuZm9ybWF0TnVtYmVyRm9yRGlzcGxheSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJE51bWJlclV0aWwkJGZvcm1hdE51bWJlckZvckRpc3BsYXkkKG51bWJlcikgewogIHJldHVybiB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZm9ybWF0TnVtYmVyRm9yRGlzcGxheShudW1iZXIpCn07CnRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5kZWZhdWx0Q291bnRyeUNvZGVfID0gIjEiOwp0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZGVmYXVsdENvdW50cnlfID0gInVzIjsKdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLmRlZmF1bHROZGRDb2RlXyA9ICIiOwp0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY2Fub25pY2FsaXplUGhvbmVOdW1iZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSROdW1iZXJVdGlsJGNhbm9uaWNhbGl6ZVBob25lTnVtYmVyJChudW1iZXIsIG9wdF9jb3VudHJ5Q29kZSwgb3B0X25kZENvZGUpIHsKICBpZighbnVtYmVyKSB7CiAgICByZXR1cm4gbnVsbAogIH0KICB2YXIgbnVtYmVyID0gdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLnJlbW92ZVdoaXRlc3BhY2UobnVtYmVyKSwgY2hlY2tDb3VudHJ5Q29kZSA9ICIrIiAhPSBudW1iZXIuY2hhckF0KDApLCBudW1iZXIgPSB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY29udmVydExldHRlcnNUb051bWJlcnMobnVtYmVyKSwgbnVtYmVyID0gdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLnJlbW92ZUFsbE5vbkRpZ2l0cyhudW1iZXIpOwogIGlmKDAgPT0gbnVtYmVyLmxlbmd0aCkgewogICAgcmV0dXJuIG51bGwKICB9CiAgb3B0X2NvdW50cnlDb2RlID0gb3B0X2NvdW50cnlDb2RlIHx8IHRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5nZXREZWZhdWx0Q291bnRyeUNvZGUoKTsKICBvcHRfbmRkQ29kZSA9IG9wdF9uZGRDb2RlIHx8IHRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5nZXREZWZhdWx0TmRkQ29kZSgpOwogIGlmKGNoZWNrQ291bnRyeUNvZGUpIHsKICAgIGlmKDAgIT0gbnVtYmVyLmluZGV4T2Yob3B0X2NvdW50cnlDb2RlKSAmJiAob3B0X25kZENvZGUgJiYgMCA9PSBudW1iZXIuaW5kZXhPZihvcHRfbmRkQ29kZSkgJiYgKG51bWJlciA9IG51bWJlci5zdWJzdHJpbmcob3B0X25kZENvZGUubGVuZ3RoKSksIG51bWJlciA9IG9wdF9jb3VudHJ5Q29kZSArIG51bWJlciksICF0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuaXNWYWxpZFNpemUobnVtYmVyLmxlbmd0aCAtIG9wdF9jb3VudHJ5Q29kZS5sZW5ndGgsIG9wdF9jb3VudHJ5Q29kZSkpIHsKICAgICAgcmV0dXJuIG51bGwKICAgIH0KICB9ZWxzZSB7CiAgICB2YXIgY291bnRyeUNvZGVBbmROZGQgPSBvcHRfY291bnRyeUNvZGUgKyBvcHRfbmRkQ29kZTsKICAgIDAgPT0gbnVtYmVyLmluZGV4T2YoY291bnRyeUNvZGVBbmROZGQpICYmIChudW1iZXIgPSBvcHRfY291bnRyeUNvZGUgKyBudW1iZXIuc3Vic3RyaW5nKGNvdW50cnlDb2RlQW5kTmRkLmxlbmd0aCkpCiAgfQogIHJldHVybiIrIiArIG51bWJlcgp9Owp0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZm9ybWF0TnVtYmVyRm9yRGlzcGxheSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJE51bWJlclV0aWwkZm9ybWF0TnVtYmVyRm9yRGlzcGxheSQobnVtYmVyKSB7CiAgdmFyIGNhbm9uaWNhbGl6ZWROdW1iZXIgPSB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY2Fub25pY2FsaXplUGhvbmVOdW1iZXIobnVtYmVyKTsKICBpZighY2Fub25pY2FsaXplZE51bWJlcikgewogICAgcmV0dXJuIiIKICB9CiAgaWYoMCA9PSBjYW5vbmljYWxpemVkTnVtYmVyLmluZGV4T2YoIisxIikgJiYgMTIgPT0gY2Fub25pY2FsaXplZE51bWJlci5sZW5ndGgpIHsKICAgIHZhciBudW1iZXIgPSBjYW5vbmljYWxpemVkTnVtYmVyLCBudW1iZXIgPSBudW1iZXIuc2xpY2UoMiksIGFyZWFDb2RlID0gbnVtYmVyLnNsaWNlKDAsIDMpLCBmaXJzdEhhbGYgPSBudW1iZXIuc2xpY2UoMywgNiksIHNlY29uZEhhbGYgPSBudW1iZXIuc2xpY2UoNik7CiAgICByZXR1cm4iKCIgKyBhcmVhQ29kZSArICIpICIgKyBmaXJzdEhhbGYgKyAiLSIgKyBzZWNvbmRIYWxmCiAgfQogIHJldHVybiBudW1iZXIKfTsKdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLmdldEF1dG9Db21wbGV0ZVJvd1RleHQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSROdW1iZXJVdGlsJGdldEF1dG9Db21wbGV0ZVJvd1RleHQkKG51bWJlciwgdGFnLCBuYW1lLCBlbWFpbCkgewogIHJldHVybiBudW1iZXIgKyAiICgiICsgdGFnICsgIikgIiArIChuYW1lID8gJyInICsgbmFtZSArICciJyA6ICI8IiArIGVtYWlsICsgIj4iKQp9Owp0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZ2V0Q2FsbGluZ0NvZGVGcm9tTnVtYmVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkTnVtYmVyVXRpbCRnZXRDYWxsaW5nQ29kZUZyb21OdW1iZXIkKG51bWJlcikgewogIGdvb2cuaXNEZWYodGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLmNvdW50cnlDb2Rlc18pIHx8IHRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5jcmVhdGVDb3VudHJ5Q29kZXNfKCk7CiAgdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLm1heWJlU2V0RGVmYXVsdHNfKCk7CiAgdmFyIHJlZ0V4ID0gL1wrKCgoKFxkKVxkPylcZD8pXGQ/KS8sIG1hdGNoID0gcmVnRXguZXhlYyhudW1iZXIpOwogIGlmKG1hdGNoKSB7CiAgICBpZih0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY291bnRyeUNvZGVzX1ttYXRjaFsxXV0pIHsKICAgICAgcmV0dXJuIG1hdGNoWzFdCiAgICB9CiAgICBpZih0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY291bnRyeUNvZGVzX1ttYXRjaFsyXV0pIHsKICAgICAgcmV0dXJuIG1hdGNoWzJdCiAgICB9CiAgICBpZih0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY291bnRyeUNvZGVzX1ttYXRjaFszXV0pIHsKICAgICAgcmV0dXJuIG1hdGNoWzNdCiAgICB9CiAgICBpZih0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY291bnRyeUNvZGVzX1ttYXRjaFs0XV0pIHsKICAgICAgcmV0dXJuIG1hdGNoWzRdCiAgICB9CiAgfQogIHJldHVybiBudWxsCn07CnRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5nZXRDb3VudHJ5RnJvbUNhbGxpbmdDb2RlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkTnVtYmVyVXRpbCRnZXRDb3VudHJ5RnJvbUNhbGxpbmdDb2RlJChudW1iZXIpIHsKICBnb29nLmlzRGVmKHRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5jb3VudHJ5Q29kZXNfKSB8fCB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY3JlYXRlQ291bnRyeUNvZGVzXygpOwogIHRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5tYXliZVNldERlZmF1bHRzXygpOwogIHJldHVybiB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY291bnRyeUNvZGVzX1tudW1iZXJdCn07CnRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5jcmVhdGVDb3VudHJ5Q29kZXNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkTnVtYmVyVXRpbCRjcmVhdGVDb3VudHJ5Q29kZXNfJCgpIHsKICB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY291bnRyeUNvZGVzXyA9IFtdOwogIGdvb2cuYXJyYXkuZm9yRWFjaChnb29nLm9iamVjdC5nZXRLZXlzKHRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLkNvdW50cnkpLCBmdW5jdGlvbihjb2RlKSB7CiAgICB2YXIgY291bnRyeSA9IHRhbGsubWVkaWEucGhvbmUuQ291bnRyaWVzLkNvdW50cnlbY29kZV07CiAgICB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY291bnRyeUNvZGVzX1tjb3VudHJ5LmNvZGVdID0gY29kZQogIH0pOwogIHRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5jb3VudHJ5Q29kZXNfWyIxIl0gPSAidXMiOwogIHRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5tYXliZVNldERlZmF1bHRzXygpCn07CnRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5yZW1vdmVBbGxOb25EaWdpdHMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSROdW1iZXJVdGlsJHJlbW92ZUFsbE5vbkRpZ2l0cyQobW9iaWxlTnVtYmVyKSB7CiAgcmV0dXJuIG1vYmlsZU51bWJlci5yZXBsYWNlKC9bXlxkXS9nLCAiIikKfTsKdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLnJlbW92ZVdoaXRlc3BhY2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSROdW1iZXJVdGlsJHJlbW92ZVdoaXRlc3BhY2UkKG1vYmlsZU51bWJlcikgewogIHJldHVybiBtb2JpbGVOdW1iZXIucmVwbGFjZSgvW1xzXS9nLCAiIikKfTsKdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLmNvbnZlcnRMZXR0ZXJzVG9OdW1iZXJzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkTnVtYmVyVXRpbCRjb252ZXJ0TGV0dGVyc1RvTnVtYmVycyQobnVtYmVyKSB7CiAgbnVtYmVyID0gbnVtYmVyLnRvTG93ZXJDYXNlKCk7CiAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UoL1thYmNdL2csICIyIik7CiAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UoL1tkZWZdL2csICIzIik7CiAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UoL1tnaGldL2csICI0Iik7CiAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UoL1tqa2xdL2csICI1Iik7CiAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UoL1ttbm9dL2csICI2Iik7CiAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UoL1twcXJzXS9nLCAiNyIpOwogIG51bWJlciA9IG51bWJlci5yZXBsYWNlKC9bdHV2XS9nLCAiOCIpOwogIHJldHVybiBudW1iZXIgPSBudW1iZXIucmVwbGFjZSgvW3d4eXpdL2csICI5IikKfTsKdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLmdldERlZmF1bHRDb3VudHJ5Q29kZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJE51bWJlclV0aWwkZ2V0RGVmYXVsdENvdW50cnlDb2RlJCgpIHsKICByZXR1cm4gdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLmRlZmF1bHRDb3VudHJ5Q29kZV8KfTsKdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLnNldERlZmF1bHRDb3VudHJ5Q29kZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJE51bWJlclV0aWwkc2V0RGVmYXVsdENvdW50cnlDb2RlJChjb2RlKSB7CiAgdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLmRlZmF1bHRDb3VudHJ5Q29kZV8gPSBjb2RlCn07CnRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5nZXREZWZhdWx0Q291bnRyeSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJE51bWJlclV0aWwkZ2V0RGVmYXVsdENvdW50cnkkKCkgewogIHJldHVybiB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZGVmYXVsdENvdW50cnlfCn07CnRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5zZXREZWZhdWx0Q291bnRyeSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJE51bWJlclV0aWwkc2V0RGVmYXVsdENvdW50cnkkKGNvdW50cnkpIHsKICB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZGVmYXVsdENvdW50cnlfID0gY291bnRyeQp9Owp0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZ2V0RGVmYXVsdE5kZENvZGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSROdW1iZXJVdGlsJGdldERlZmF1bHROZGRDb2RlJCgpIHsKICByZXR1cm4gdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLmRlZmF1bHROZGRDb2RlXwp9Owp0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuc2V0RGVmYXVsdE5kZENvZGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSROdW1iZXJVdGlsJHNldERlZmF1bHROZGRDb2RlJChjb2RlKSB7CiAgdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLmRlZmF1bHROZGRDb2RlXyA9IGNvZGUKfTsKdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsLm1heWJlU2V0RGVmYXVsdHNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkTnVtYmVyVXRpbCRtYXliZVNldERlZmF1bHRzXyQoKSB7CiAgZ29vZy5pc0RlZih0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuY291bnRyeUNvZGVzXykgJiYgKHRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5jb3VudHJ5Q29kZXNfW3RhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5nZXREZWZhdWx0Q291bnRyeUNvZGUoKV0gPSB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZGVmYXVsdENvdW50cnlfKQp9Owp0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuaXNWYWxpZFNpemUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSROdW1iZXJVdGlsJGlzVmFsaWRTaXplJChudW1iZXIsIGNvdW50cnlDb2RlKSB7CiAgcmV0dXJuIjEiID09IGNvdW50cnlDb2RlID8gMTAgPT0gbnVtYmVyIDogMyA8PSBudW1iZXIgJiYgMTQgPj0gbnVtYmVyCn07CnRhbGsubWVkaWEucGhvbmUuRGVsZWdhdGluZ051bWJlclV0aWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSREZWxlZ2F0aW5nTnVtYmVyVXRpbCQoYXBwQ29udGV4dCkgewogIHRoaXMuYXBwQ29udGV4dF8gPSBhcHBDb250ZXh0OwogIHRoaXMuc2ltcGxlTnVtYmVyVXRpbF8gPSBuZXcgdGFsay5tZWRpYS5waG9uZS5OdW1iZXJVdGlsCn07CnRhbGsubWVkaWEucGhvbmUuRGVsZWdhdGluZ051bWJlclV0aWwucHJvdG90eXBlLmdldEFuZExvYWRVdGlsXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJERlbGVnYXRpbmdOdW1iZXJVdGlsJCRnZXRBbmRMb2FkVXRpbF8kKCkgewogIHZhciBudW1iZXJVdGlsID0gdGhpcy5hcHBDb250ZXh0Xy5nZXRPck51bGwodGFsay5tZWRpYS5waG9uZS5zZXJ2aWNlcy5QSE9ORV9VVElMKTsKICBpZihudW1iZXJVdGlsKSB7CiAgICByZXR1cm4gbnVtYmVyVXRpbAogIH0KICB0aGlzLmFwcENvbnRleHRfLmdldEFzeW5jKHRhbGsubWVkaWEucGhvbmUuc2VydmljZXMuUEhPTkVfVVRJTCk7CiAgcmV0dXJuIHRoaXMuc2ltcGxlTnVtYmVyVXRpbF8KfTsKdGFsay5tZWRpYS5waG9uZS5EZWxlZ2F0aW5nTnVtYmVyVXRpbC5wcm90b3R5cGUuY2Fub25pY2FsaXplUGhvbmVOdW1iZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSREZWxlZ2F0aW5nTnVtYmVyVXRpbCQkY2Fub25pY2FsaXplUGhvbmVOdW1iZXIkKG51bWJlciwgb3B0X2NvdW50cnlDb2RlLCBvcHRfbmRkQ29kZSkgewogIHJldHVybiB0aGlzLmdldEFuZExvYWRVdGlsXygpLmNhbm9uaWNhbGl6ZVBob25lTnVtYmVyKG51bWJlciwgb3B0X2NvdW50cnlDb2RlLCBvcHRfbmRkQ29kZSkKfTsKdGFsay5tZWRpYS5waG9uZS5EZWxlZ2F0aW5nTnVtYmVyVXRpbC5wcm90b3R5cGUuZm9ybWF0TnVtYmVyRm9yRGlzcGxheSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJERlbGVnYXRpbmdOdW1iZXJVdGlsJCRmb3JtYXROdW1iZXJGb3JEaXNwbGF5JChudW1iZXIpIHsKICByZXR1cm4gdGhpcy5nZXRBbmRMb2FkVXRpbF8oKS5mb3JtYXROdW1iZXJGb3JEaXNwbGF5KG51bWJlcikKfTsKZ29vZy51c2VyQWdlbnQuanNjcmlwdCA9IHt9Owpnb29nLnVzZXJBZ2VudC5qc2NyaXB0LkFTU1VNRV9OT19KU0NSSVBUID0gITE7Cmdvb2cudXNlckFnZW50LmpzY3JpcHQuaW5pdF8gPSBmdW5jdGlvbiAkZ29vZyR1c2VyQWdlbnQkanNjcmlwdCRpbml0XyQoKSB7CiAgdmFyIGhhc1NjcmlwdEVuZ2luZSA9ICJTY3JpcHRFbmdpbmUiIGluIGdvb2cuZ2xvYmFsOwogIGdvb2cudXNlckFnZW50LmpzY3JpcHQuREVURUNURURfSEFTX0pTQ1JJUFRfID0gaGFzU2NyaXB0RW5naW5lICYmICJKU2NyaXB0IiA9PSBnb29nLmdsb2JhbC5TY3JpcHRFbmdpbmUoKTsKICBnb29nLnVzZXJBZ2VudC5qc2NyaXB0LkRFVEVDVEVEX1ZFUlNJT05fID0gZ29vZy51c2VyQWdlbnQuanNjcmlwdC5ERVRFQ1RFRF9IQVNfSlNDUklQVF8gPyBnb29nLmdsb2JhbC5TY3JpcHRFbmdpbmVNYWpvclZlcnNpb24oKSArICIuIiArIGdvb2cuZ2xvYmFsLlNjcmlwdEVuZ2luZU1pbm9yVmVyc2lvbigpICsgIi4iICsgZ29vZy5nbG9iYWwuU2NyaXB0RW5naW5lQnVpbGRWZXJzaW9uKCkgOiAiMCIKfTsKZ29vZy51c2VyQWdlbnQuanNjcmlwdC5BU1NVTUVfTk9fSlNDUklQVCB8fCBnb29nLnVzZXJBZ2VudC5qc2NyaXB0LmluaXRfKCk7Cmdvb2cudXNlckFnZW50LmpzY3JpcHQuSEFTX0pTQ1JJUFQgPSBnb29nLnVzZXJBZ2VudC5qc2NyaXB0LkFTU1VNRV9OT19KU0NSSVBUID8gITEgOiBnb29nLnVzZXJBZ2VudC5qc2NyaXB0LkRFVEVDVEVEX0hBU19KU0NSSVBUXzsKZ29vZy51c2VyQWdlbnQuanNjcmlwdC5WRVJTSU9OID0gZ29vZy51c2VyQWdlbnQuanNjcmlwdC5BU1NVTUVfTk9fSlNDUklQVCA/ICIwIiA6IGdvb2cudXNlckFnZW50LmpzY3JpcHQuREVURUNURURfVkVSU0lPTl87Cmdvb2cudXNlckFnZW50LmpzY3JpcHQuaXNWZXJzaW9uID0gZnVuY3Rpb24gJGdvb2ckdXNlckFnZW50JGpzY3JpcHQkaXNWZXJzaW9uJCh2ZXJzaW9uKSB7CiAgcmV0dXJuIDAgPD0gZ29vZy5zdHJpbmcuY29tcGFyZVZlcnNpb25zKGdvb2cudXNlckFnZW50LmpzY3JpcHQuVkVSU0lPTiwgdmVyc2lvbikKfTsKZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyID0gZnVuY3Rpb24gJGdvb2ckc3RyaW5nJFN0cmluZ0J1ZmZlciQob3B0X2ExLCB2YXJfYXJncykgewogIHRoaXMuYnVmZmVyXyA9IGdvb2cudXNlckFnZW50LmpzY3JpcHQuSEFTX0pTQ1JJUFQgPyBbXSA6ICIiOwogIG51bGwgIT0gb3B0X2ExICYmIHRoaXMuYXBwZW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykKfTsKZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckU3RyaW5nQnVmZmVyJCRzZXQkKHMpIHsKICB0aGlzLmNsZWFyKCk7CiAgdGhpcy5hcHBlbmQocykKfTsKZ29vZy51c2VyQWdlbnQuanNjcmlwdC5IQVNfSlNDUklQVCA/IChnb29nLnN0cmluZy5TdHJpbmdCdWZmZXIucHJvdG90eXBlLmJ1ZmZlckxlbmd0aF8gPSAwLCBnb29nLnN0cmluZy5TdHJpbmdCdWZmZXIucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRTdHJpbmdCdWZmZXIkJGFwcGVuZCQoYTEsIG9wdF9hMiwgdmFyX2FyZ3MpIHsKICBudWxsID09IG9wdF9hMiA/IHRoaXMuYnVmZmVyX1t0aGlzLmJ1ZmZlckxlbmd0aF8rK10gPSBhMSA6ICh0aGlzLmJ1ZmZlcl8ucHVzaC5hcHBseSh0aGlzLmJ1ZmZlcl8sIGFyZ3VtZW50cyksIHRoaXMuYnVmZmVyTGVuZ3RoXyA9IHRoaXMuYnVmZmVyXy5sZW5ndGgpOwogIHJldHVybiB0aGlzCn0pIDogZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckU3RyaW5nQnVmZmVyJCRhcHBlbmQkKGExLCBvcHRfYTIsIHZhcl9hcmdzKSB7CiAgdGhpcy5idWZmZXJfICs9IGExOwogIGlmKG51bGwgIT0gb3B0X2EyKSB7CiAgICBmb3IodmFyIGkgPSAxO2kgPCBhcmd1bWVudHMubGVuZ3RoO2krKykgewogICAgICB0aGlzLmJ1ZmZlcl8gKz0gYXJndW1lbnRzW2ldCiAgICB9CiAgfQogIHJldHVybiB0aGlzCn07Cmdvb2cuc3RyaW5nLlN0cmluZ0J1ZmZlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAkZ29vZyRzdHJpbmckU3RyaW5nQnVmZmVyJCRjbGVhciQoKSB7CiAgZ29vZy51c2VyQWdlbnQuanNjcmlwdC5IQVNfSlNDUklQVCA/IHRoaXMuYnVmZmVyTGVuZ3RoXyA9IHRoaXMuYnVmZmVyXy5sZW5ndGggPSAwIDogdGhpcy5idWZmZXJfID0gIiIKfTsKZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICRnb29nJHN0cmluZyRTdHJpbmdCdWZmZXIkJHRvU3RyaW5nJCgpIHsKICBpZihnb29nLnVzZXJBZ2VudC5qc2NyaXB0LkhBU19KU0NSSVBUKSB7CiAgICB2YXIgc3RyID0gdGhpcy5idWZmZXJfLmpvaW4oIiIpOwogICAgdGhpcy5jbGVhcigpOwogICAgc3RyICYmIHRoaXMuYXBwZW5kKHN0cik7CiAgICByZXR1cm4gc3RyCiAgfQogIHJldHVybiB0aGlzLmJ1ZmZlcl8KfTsKZ29vZy5VcmkgPSBmdW5jdGlvbiAkZ29vZyRVcmkkKG9wdF91cmksIG9wdF9pZ25vcmVDYXNlKSB7CiAgdmFyIG07CiAgb3B0X3VyaSBpbnN0YW5jZW9mIGdvb2cuVXJpID8gKHRoaXMuc2V0SWdub3JlQ2FzZShudWxsID09IG9wdF9pZ25vcmVDYXNlID8gb3B0X3VyaS5nZXRJZ25vcmVDYXNlKCkgOiBvcHRfaWdub3JlQ2FzZSksIHRoaXMuc2V0U2NoZW1lKG9wdF91cmkuZ2V0U2NoZW1lKCkpLCB0aGlzLnNldFVzZXJJbmZvKG9wdF91cmkuZ2V0VXNlckluZm8oKSksIHRoaXMuc2V0RG9tYWluKG9wdF91cmkuZ2V0RG9tYWluKCkpLCB0aGlzLnNldFBvcnQob3B0X3VyaS5nZXRQb3J0KCkpLCB0aGlzLnNldFBhdGgob3B0X3VyaS5nZXRQYXRoKCkpLCB0aGlzLnNldFF1ZXJ5RGF0YShvcHRfdXJpLmdldFF1ZXJ5RGF0YSgpLmNsb25lKCkpLCB0aGlzLnNldEZyYWdtZW50KG9wdF91cmkuZ2V0RnJhZ21lbnQoKSkpIDogb3B0X3VyaSAmJiAobSA9IGdvb2cudXJpLnV0aWxzLnNwbGl0KCIiICsgb3B0X3VyaSkpID8gKHRoaXMuc2V0SWdub3JlQ2FzZSghIW9wdF9pZ25vcmVDYXNlKSwgdGhpcy5zZXRTY2hlbWUobVtnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5TQ0hFTUVdIHx8IAogICIiLCAhMCksIHRoaXMuc2V0VXNlckluZm8obVtnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5VU0VSX0lORk9dIHx8ICIiLCAhMCksIHRoaXMuc2V0RG9tYWluKG1bZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguRE9NQUlOXSB8fCAiIiwgITApLCB0aGlzLnNldFBvcnQobVtnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5QT1JUXSksIHRoaXMuc2V0UGF0aChtW2dvb2cudXJpLnV0aWxzLkNvbXBvbmVudEluZGV4LlBBVEhdIHx8ICIiLCAhMCksIHRoaXMuc2V0UXVlcnkobVtnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5RVUVSWV9EQVRBXSB8fCAiIiwgITApLCB0aGlzLnNldEZyYWdtZW50KG1bZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguRlJBR01FTlRdIHx8ICIiLCAhMCkpIDogKHRoaXMuc2V0SWdub3JlQ2FzZSghIW9wdF9pZ25vcmVDYXNlKSwgdGhpcy5xdWVyeURhdGFfID0gbmV3IGdvb2cuVXJpLlF1ZXJ5RGF0YShudWxsLCB0aGlzLCAKICB0aGlzLmlnbm9yZUNhc2VfKSkKfTsKZ29vZy5VcmkuUkFORE9NX1BBUkFNID0gZ29vZy51cmkudXRpbHMuU3RhbmRhcmRRdWVyeVBhcmFtLlJBTkRPTTsKZ29vZy5VcmkucHJvdG90eXBlLnNjaGVtZV8gPSAiIjsKZ29vZy5VcmkucHJvdG90eXBlLnVzZXJJbmZvXyA9ICIiOwpnb29nLlVyaS5wcm90b3R5cGUuZG9tYWluXyA9ICIiOwpnb29nLlVyaS5wcm90b3R5cGUucG9ydF8gPSBudWxsOwpnb29nLlVyaS5wcm90b3R5cGUucGF0aF8gPSAiIjsKZ29vZy5VcmkucHJvdG90eXBlLmZyYWdtZW50XyA9ICIiOwpnb29nLlVyaS5wcm90b3R5cGUuaXNSZWFkT25seV8gPSAhMTsKZ29vZy5VcmkucHJvdG90eXBlLmlnbm9yZUNhc2VfID0gITE7Cmdvb2cuVXJpLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICRnb29nJFVyaSQkdG9TdHJpbmckKCkgewogIGlmKHRoaXMuY2FjaGVkVG9TdHJpbmdfKSB7CiAgICByZXR1cm4gdGhpcy5jYWNoZWRUb1N0cmluZ18KICB9CiAgdmFyIG91dCA9IFtdOwogIHRoaXMuc2NoZW1lXyAmJiBvdXQucHVzaChnb29nLlVyaS5lbmNvZGVTcGVjaWFsQ2hhcnNfKHRoaXMuc2NoZW1lXywgZ29vZy5VcmkucmVEaXNhbGxvd2VkSW5TY2hlbWVPclVzZXJJbmZvXyksICI6Iik7CiAgdGhpcy5kb21haW5fICYmIChvdXQucHVzaCgiLy8iKSwgdGhpcy51c2VySW5mb18gJiYgb3V0LnB1c2goZ29vZy5VcmkuZW5jb2RlU3BlY2lhbENoYXJzXyh0aGlzLnVzZXJJbmZvXywgZ29vZy5VcmkucmVEaXNhbGxvd2VkSW5TY2hlbWVPclVzZXJJbmZvXyksICJAIiksIG91dC5wdXNoKGdvb2cuVXJpLmVuY29kZVN0cmluZ18odGhpcy5kb21haW5fKSksIG51bGwgIT0gdGhpcy5wb3J0XyAmJiBvdXQucHVzaCgiOiIsICIiICsgdGhpcy5nZXRQb3J0KCkpKTsKICB0aGlzLnBhdGhfICYmICh0aGlzLmhhc0RvbWFpbigpICYmICIvIiAhPSB0aGlzLnBhdGhfLmNoYXJBdCgwKSAmJiBvdXQucHVzaCgiLyIpLCBvdXQucHVzaChnb29nLlVyaS5lbmNvZGVTcGVjaWFsQ2hhcnNfKHRoaXMucGF0aF8sICIvIiA9PSB0aGlzLnBhdGhfLmNoYXJBdCgwKSA/IGdvb2cuVXJpLnJlRGlzYWxsb3dlZEluQWJzb2x1dGVQYXRoXyA6IGdvb2cuVXJpLnJlRGlzYWxsb3dlZEluUmVsYXRpdmVQYXRoXykpKTsKICB2YXIgcXVlcnkgPSAiIiArIHRoaXMucXVlcnlEYXRhXzsKICBxdWVyeSAmJiBvdXQucHVzaCgiPyIsIHF1ZXJ5KTsKICB0aGlzLmZyYWdtZW50XyAmJiBvdXQucHVzaCgiIyIsIGdvb2cuVXJpLmVuY29kZVNwZWNpYWxDaGFyc18odGhpcy5mcmFnbWVudF8sIGdvb2cuVXJpLnJlRGlzYWxsb3dlZEluRnJhZ21lbnRfKSk7CiAgcmV0dXJuIHRoaXMuY2FjaGVkVG9TdHJpbmdfID0gb3V0LmpvaW4oIiIpCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRyZXNvbHZlJChyZWxhdGl2ZVVyaSkgewogIHZhciBhYnNvbHV0ZVVyaSA9IHRoaXMuY2xvbmUoKSwgb3ZlcnJpZGRlbiA9IHJlbGF0aXZlVXJpLmhhc1NjaGVtZSgpOwogIG92ZXJyaWRkZW4gPyBhYnNvbHV0ZVVyaS5zZXRTY2hlbWUocmVsYXRpdmVVcmkuZ2V0U2NoZW1lKCkpIDogb3ZlcnJpZGRlbiA9IHJlbGF0aXZlVXJpLmhhc1VzZXJJbmZvKCk7CiAgb3ZlcnJpZGRlbiA/IGFic29sdXRlVXJpLnNldFVzZXJJbmZvKHJlbGF0aXZlVXJpLmdldFVzZXJJbmZvKCkpIDogb3ZlcnJpZGRlbiA9IHJlbGF0aXZlVXJpLmhhc0RvbWFpbigpOwogIG92ZXJyaWRkZW4gPyBhYnNvbHV0ZVVyaS5zZXREb21haW4ocmVsYXRpdmVVcmkuZ2V0RG9tYWluKCkpIDogb3ZlcnJpZGRlbiA9IHJlbGF0aXZlVXJpLmhhc1BvcnQoKTsKICB2YXIgcGF0aCA9IHJlbGF0aXZlVXJpLmdldFBhdGgoKTsKICBpZihvdmVycmlkZGVuKSB7CiAgICBhYnNvbHV0ZVVyaS5zZXRQb3J0KHJlbGF0aXZlVXJpLmdldFBvcnQoKSkKICB9ZWxzZSB7CiAgICBpZihvdmVycmlkZGVuID0gcmVsYXRpdmVVcmkuaGFzUGF0aCgpKSB7CiAgICAgIGlmKCIvIiAhPSBwYXRoLmNoYXJBdCgwKSkgewogICAgICAgIGlmKHRoaXMuaGFzRG9tYWluKCkgJiYgIXRoaXMuaGFzUGF0aCgpKSB7CiAgICAgICAgICBwYXRoID0gIi8iICsgcGF0aAogICAgICAgIH1lbHNlIHsKICAgICAgICAgIHZhciBsYXN0U2xhc2hJbmRleCA9IGFic29sdXRlVXJpLmdldFBhdGgoKS5sYXN0SW5kZXhPZigiLyIpOwogICAgICAgICAgLTEgIT0gbGFzdFNsYXNoSW5kZXggJiYgKHBhdGggPSBhYnNvbHV0ZVVyaS5nZXRQYXRoKCkuc3Vic3RyKDAsIGxhc3RTbGFzaEluZGV4ICsgMSkgKyBwYXRoKQogICAgICAgIH0KICAgICAgfQogICAgICBwYXRoID0gZ29vZy5VcmkucmVtb3ZlRG90U2VnbWVudHMocGF0aCkKICAgIH0KICB9CiAgb3ZlcnJpZGRlbiA/IGFic29sdXRlVXJpLnNldFBhdGgocGF0aCkgOiBvdmVycmlkZGVuID0gcmVsYXRpdmVVcmkuaGFzUXVlcnkoKTsKICBvdmVycmlkZGVuID8gYWJzb2x1dGVVcmkuc2V0UXVlcnkocmVsYXRpdmVVcmkuZ2V0RGVjb2RlZFF1ZXJ5KCkpIDogb3ZlcnJpZGRlbiA9IHJlbGF0aXZlVXJpLmhhc0ZyYWdtZW50KCk7CiAgb3ZlcnJpZGRlbiAmJiBhYnNvbHV0ZVVyaS5zZXRGcmFnbWVudChyZWxhdGl2ZVVyaS5nZXRGcmFnbWVudCgpKTsKICByZXR1cm4gYWJzb2x1dGVVcmkKfTsKZ29vZy5VcmkucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRjbG9uZSQoKSB7CiAgcmV0dXJuIGdvb2cuVXJpLmNyZWF0ZSh0aGlzLnNjaGVtZV8sIHRoaXMudXNlckluZm9fLCB0aGlzLmRvbWFpbl8sIHRoaXMucG9ydF8sIHRoaXMucGF0aF8sIHRoaXMucXVlcnlEYXRhXy5jbG9uZSgpLCB0aGlzLmZyYWdtZW50XywgdGhpcy5pZ25vcmVDYXNlXykKfTsKZ29vZy5VcmkucHJvdG90eXBlLmdldFNjaGVtZSA9IGZ1bmN0aW9uICRnb29nJFVyaSQkZ2V0U2NoZW1lJCgpIHsKICByZXR1cm4gdGhpcy5zY2hlbWVfCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5zZXRTY2hlbWUgPSBmdW5jdGlvbiAkZ29vZyRVcmkkJHNldFNjaGVtZSQobmV3U2NoZW1lLCBvcHRfZGVjb2RlKSB7CiAgdGhpcy5lbmZvcmNlUmVhZE9ubHkoKTsKICBkZWxldGUgdGhpcy5jYWNoZWRUb1N0cmluZ187CiAgaWYodGhpcy5zY2hlbWVfID0gb3B0X2RlY29kZSA/IGdvb2cuVXJpLmRlY29kZU9yRW1wdHlfKG5ld1NjaGVtZSkgOiBuZXdTY2hlbWUpIHsKICAgIHRoaXMuc2NoZW1lXyA9IHRoaXMuc2NoZW1lXy5yZXBsYWNlKC86JC8sICIiKQogIH0KICByZXR1cm4gdGhpcwp9Owpnb29nLlVyaS5wcm90b3R5cGUuaGFzU2NoZW1lID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRoYXNTY2hlbWUkKCkgewogIHJldHVybiEhdGhpcy5zY2hlbWVfCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5nZXRVc2VySW5mbyA9IGZ1bmN0aW9uICRnb29nJFVyaSQkZ2V0VXNlckluZm8kKCkgewogIHJldHVybiB0aGlzLnVzZXJJbmZvXwp9Owpnb29nLlVyaS5wcm90b3R5cGUuc2V0VXNlckluZm8gPSBmdW5jdGlvbiAkZ29vZyRVcmkkJHNldFVzZXJJbmZvJChuZXdVc2VySW5mbywgb3B0X2RlY29kZSkgewogIHRoaXMuZW5mb3JjZVJlYWRPbmx5KCk7CiAgZGVsZXRlIHRoaXMuY2FjaGVkVG9TdHJpbmdfOwogIHRoaXMudXNlckluZm9fID0gb3B0X2RlY29kZSA/IGdvb2cuVXJpLmRlY29kZU9yRW1wdHlfKG5ld1VzZXJJbmZvKSA6IG5ld1VzZXJJbmZvOwogIHJldHVybiB0aGlzCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5oYXNVc2VySW5mbyA9IGZ1bmN0aW9uICRnb29nJFVyaSQkaGFzVXNlckluZm8kKCkgewogIHJldHVybiEhdGhpcy51c2VySW5mb18KfTsKZ29vZy5VcmkucHJvdG90eXBlLmdldERvbWFpbiA9IGZ1bmN0aW9uICRnb29nJFVyaSQkZ2V0RG9tYWluJCgpIHsKICByZXR1cm4gdGhpcy5kb21haW5fCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5zZXREb21haW4gPSBmdW5jdGlvbiAkZ29vZyRVcmkkJHNldERvbWFpbiQobmV3RG9tYWluLCBvcHRfZGVjb2RlKSB7CiAgdGhpcy5lbmZvcmNlUmVhZE9ubHkoKTsKICBkZWxldGUgdGhpcy5jYWNoZWRUb1N0cmluZ187CiAgdGhpcy5kb21haW5fID0gb3B0X2RlY29kZSA/IGdvb2cuVXJpLmRlY29kZU9yRW1wdHlfKG5ld0RvbWFpbikgOiBuZXdEb21haW47CiAgcmV0dXJuIHRoaXMKfTsKZ29vZy5VcmkucHJvdG90eXBlLmhhc0RvbWFpbiA9IGZ1bmN0aW9uICRnb29nJFVyaSQkaGFzRG9tYWluJCgpIHsKICByZXR1cm4hIXRoaXMuZG9tYWluXwp9Owpnb29nLlVyaS5wcm90b3R5cGUuZ2V0UG9ydCA9IGZ1bmN0aW9uICRnb29nJFVyaSQkZ2V0UG9ydCQoKSB7CiAgcmV0dXJuIHRoaXMucG9ydF8KfTsKZ29vZy5VcmkucHJvdG90eXBlLnNldFBvcnQgPSBmdW5jdGlvbiAkZ29vZyRVcmkkJHNldFBvcnQkKG5ld1BvcnQpIHsKICB0aGlzLmVuZm9yY2VSZWFkT25seSgpOwogIGRlbGV0ZSB0aGlzLmNhY2hlZFRvU3RyaW5nXzsKICBpZihuZXdQb3J0KSB7CiAgICBuZXdQb3J0ID0gTnVtYmVyKG5ld1BvcnQpOwogICAgaWYoaXNOYU4obmV3UG9ydCkgfHwgMCA+IG5ld1BvcnQpIHsKICAgICAgdGhyb3cgRXJyb3IoIkJhZCBwb3J0IG51bWJlciAiICsgbmV3UG9ydCk7CiAgICB9CiAgICB0aGlzLnBvcnRfID0gbmV3UG9ydAogIH1lbHNlIHsKICAgIHRoaXMucG9ydF8gPSBudWxsCiAgfQogIHJldHVybiB0aGlzCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5oYXNQb3J0ID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRoYXNQb3J0JCgpIHsKICByZXR1cm4gbnVsbCAhPSB0aGlzLnBvcnRfCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5nZXRQYXRoID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRnZXRQYXRoJCgpIHsKICByZXR1cm4gdGhpcy5wYXRoXwp9Owpnb29nLlVyaS5wcm90b3R5cGUuc2V0UGF0aCA9IGZ1bmN0aW9uICRnb29nJFVyaSQkc2V0UGF0aCQobmV3UGF0aCwgb3B0X2RlY29kZSkgewogIHRoaXMuZW5mb3JjZVJlYWRPbmx5KCk7CiAgZGVsZXRlIHRoaXMuY2FjaGVkVG9TdHJpbmdfOwogIHRoaXMucGF0aF8gPSBvcHRfZGVjb2RlID8gZ29vZy5VcmkuZGVjb2RlT3JFbXB0eV8obmV3UGF0aCkgOiBuZXdQYXRoOwogIHJldHVybiB0aGlzCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5oYXNQYXRoID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRoYXNQYXRoJCgpIHsKICByZXR1cm4hIXRoaXMucGF0aF8KfTsKZ29vZy5VcmkucHJvdG90eXBlLmhhc1F1ZXJ5ID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRoYXNRdWVyeSQoKSB7CiAgcmV0dXJuIiIgIT09IHRoaXMucXVlcnlEYXRhXy50b1N0cmluZygpCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5zZXRRdWVyeURhdGEgPSBmdW5jdGlvbiAkZ29vZyRVcmkkJHNldFF1ZXJ5RGF0YSQocXVlcnlEYXRhLCBvcHRfZGVjb2RlKSB7CiAgdGhpcy5lbmZvcmNlUmVhZE9ubHkoKTsKICBkZWxldGUgdGhpcy5jYWNoZWRUb1N0cmluZ187CiAgcXVlcnlEYXRhIGluc3RhbmNlb2YgZ29vZy5VcmkuUXVlcnlEYXRhID8gKHRoaXMucXVlcnlEYXRhXyA9IHF1ZXJ5RGF0YSwgdGhpcy5xdWVyeURhdGFfLnVyaV8gPSB0aGlzLCB0aGlzLnF1ZXJ5RGF0YV8uc2V0SWdub3JlQ2FzZSh0aGlzLmlnbm9yZUNhc2VfKSkgOiAob3B0X2RlY29kZSB8fCAocXVlcnlEYXRhID0gZ29vZy5VcmkuZW5jb2RlU3BlY2lhbENoYXJzXyhxdWVyeURhdGEsIGdvb2cuVXJpLnJlRGlzYWxsb3dlZEluUXVlcnlfKSksIHRoaXMucXVlcnlEYXRhXyA9IG5ldyBnb29nLlVyaS5RdWVyeURhdGEocXVlcnlEYXRhLCB0aGlzLCB0aGlzLmlnbm9yZUNhc2VfKSk7CiAgcmV0dXJuIHRoaXMKfTsKZ29vZy5VcmkucHJvdG90eXBlLnNldFF1ZXJ5ID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRzZXRRdWVyeSQobmV3UXVlcnksIG9wdF9kZWNvZGUpIHsKICByZXR1cm4gdGhpcy5zZXRRdWVyeURhdGEobmV3UXVlcnksIG9wdF9kZWNvZGUpCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5nZXRFbmNvZGVkUXVlcnkgPSBmdW5jdGlvbiAkZ29vZyRVcmkkJGdldEVuY29kZWRRdWVyeSQoKSB7CiAgcmV0dXJuIHRoaXMucXVlcnlEYXRhXy50b1N0cmluZygpCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5nZXREZWNvZGVkUXVlcnkgPSBmdW5jdGlvbiAkZ29vZyRVcmkkJGdldERlY29kZWRRdWVyeSQoKSB7CiAgcmV0dXJuIHRoaXMucXVlcnlEYXRhXy50b0RlY29kZWRTdHJpbmcoKQp9Owpnb29nLlVyaS5wcm90b3R5cGUuZ2V0UXVlcnlEYXRhID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRnZXRRdWVyeURhdGEkKCkgewogIHJldHVybiB0aGlzLnF1ZXJ5RGF0YV8KfTsKZ29vZy5VcmkucHJvdG90eXBlLmdldFF1ZXJ5ID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRnZXRRdWVyeSQoKSB7CiAgcmV0dXJuIHRoaXMuZ2V0RW5jb2RlZFF1ZXJ5KCkKfTsKZ29vZy5VcmkucHJvdG90eXBlLnNldFBhcmFtZXRlclZhbHVlID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRzZXRQYXJhbWV0ZXJWYWx1ZSQoa2V5LCB2YWx1ZSkgewogIHRoaXMuZW5mb3JjZVJlYWRPbmx5KCk7CiAgZGVsZXRlIHRoaXMuY2FjaGVkVG9TdHJpbmdfOwogIHRoaXMucXVlcnlEYXRhXy5zZXQoa2V5LCB2YWx1ZSk7CiAgcmV0dXJuIHRoaXMKfTsKZ29vZy5VcmkucHJvdG90eXBlLnNldFBhcmFtZXRlclZhbHVlcyA9IGZ1bmN0aW9uICRnb29nJFVyaSQkc2V0UGFyYW1ldGVyVmFsdWVzJChrZXksIHZhbHVlcykgewogIHRoaXMuZW5mb3JjZVJlYWRPbmx5KCk7CiAgZGVsZXRlIHRoaXMuY2FjaGVkVG9TdHJpbmdfOwogIGdvb2cuaXNBcnJheSh2YWx1ZXMpIHx8ICh2YWx1ZXMgPSBbIiIgKyB2YWx1ZXNdKTsKICB0aGlzLnF1ZXJ5RGF0YV8uc2V0VmFsdWVzKGtleSwgdmFsdWVzKTsKICByZXR1cm4gdGhpcwp9Owpnb29nLlVyaS5wcm90b3R5cGUuZ2V0UGFyYW1ldGVyVmFsdWUgPSBmdW5jdGlvbiAkZ29vZyRVcmkkJGdldFBhcmFtZXRlclZhbHVlJChwYXJhbU5hbWUpIHsKICByZXR1cm4gdGhpcy5xdWVyeURhdGFfLmdldChwYXJhbU5hbWUpCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5nZXRGcmFnbWVudCA9IGZ1bmN0aW9uICRnb29nJFVyaSQkZ2V0RnJhZ21lbnQkKCkgewogIHJldHVybiB0aGlzLmZyYWdtZW50Xwp9Owpnb29nLlVyaS5wcm90b3R5cGUuc2V0RnJhZ21lbnQgPSBmdW5jdGlvbiAkZ29vZyRVcmkkJHNldEZyYWdtZW50JChuZXdGcmFnbWVudCwgb3B0X2RlY29kZSkgewogIHRoaXMuZW5mb3JjZVJlYWRPbmx5KCk7CiAgZGVsZXRlIHRoaXMuY2FjaGVkVG9TdHJpbmdfOwogIHRoaXMuZnJhZ21lbnRfID0gb3B0X2RlY29kZSA/IGdvb2cuVXJpLmRlY29kZU9yRW1wdHlfKG5ld0ZyYWdtZW50KSA6IG5ld0ZyYWdtZW50OwogIHJldHVybiB0aGlzCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5oYXNGcmFnbWVudCA9IGZ1bmN0aW9uICRnb29nJFVyaSQkaGFzRnJhZ21lbnQkKCkgewogIHJldHVybiEhdGhpcy5mcmFnbWVudF8KfTsKZ29vZy5VcmkucHJvdG90eXBlLm1ha2VVbmlxdWUgPSBmdW5jdGlvbiAkZ29vZyRVcmkkJG1ha2VVbmlxdWUkKCkgewogIHRoaXMuZW5mb3JjZVJlYWRPbmx5KCk7CiAgdGhpcy5zZXRQYXJhbWV0ZXJWYWx1ZShnb29nLlVyaS5SQU5ET01fUEFSQU0sIGdvb2cuc3RyaW5nLmdldFJhbmRvbVN0cmluZygpKTsKICByZXR1cm4gdGhpcwp9Owpnb29nLlVyaS5wcm90b3R5cGUucmVtb3ZlUGFyYW1ldGVyID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRyZW1vdmVQYXJhbWV0ZXIkKGtleSkgewogIHRoaXMuZW5mb3JjZVJlYWRPbmx5KCk7CiAgdGhpcy5xdWVyeURhdGFfLnJlbW92ZShrZXkpOwogIHJldHVybiB0aGlzCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5lbmZvcmNlUmVhZE9ubHkgPSBmdW5jdGlvbiAkZ29vZyRVcmkkJGVuZm9yY2VSZWFkT25seSQoKSB7CiAgaWYodGhpcy5pc1JlYWRPbmx5XykgewogICAgdGhyb3cgRXJyb3IoIlRyaWVkIHRvIG1vZGlmeSBhIHJlYWQtb25seSBVcmkiKTsKICB9Cn07Cmdvb2cuVXJpLnByb3RvdHlwZS5zZXRJZ25vcmVDYXNlID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRzZXRJZ25vcmVDYXNlJChpZ25vcmVDYXNlKSB7CiAgdGhpcy5pZ25vcmVDYXNlXyA9IGlnbm9yZUNhc2U7CiAgdGhpcy5xdWVyeURhdGFfICYmIHRoaXMucXVlcnlEYXRhXy5zZXRJZ25vcmVDYXNlKGlnbm9yZUNhc2UpOwogIHJldHVybiB0aGlzCn07Cmdvb2cuVXJpLnByb3RvdHlwZS5nZXRJZ25vcmVDYXNlID0gZnVuY3Rpb24gJGdvb2ckVXJpJCRnZXRJZ25vcmVDYXNlJCgpIHsKICByZXR1cm4gdGhpcy5pZ25vcmVDYXNlXwp9Owpnb29nLlVyaS5wYXJzZSA9IGZ1bmN0aW9uICRnb29nJFVyaSRwYXJzZSQodXJpLCBvcHRfaWdub3JlQ2FzZSkgewogIHJldHVybiB1cmkgaW5zdGFuY2VvZiBnb29nLlVyaSA/IHVyaS5jbG9uZSgpIDogbmV3IGdvb2cuVXJpKHVyaSwgb3B0X2lnbm9yZUNhc2UpCn07Cmdvb2cuVXJpLmNyZWF0ZSA9IGZ1bmN0aW9uICRnb29nJFVyaSRjcmVhdGUkKG9wdF9zY2hlbWUsIG9wdF91c2VySW5mbywgb3B0X2RvbWFpbiwgb3B0X3BvcnQsIG9wdF9wYXRoLCBvcHRfcXVlcnksIG9wdF9mcmFnbWVudCwgb3B0X2lnbm9yZUNhc2UpIHsKICB2YXIgdXJpID0gbmV3IGdvb2cuVXJpKG51bGwsIG9wdF9pZ25vcmVDYXNlKTsKICBvcHRfc2NoZW1lICYmIHVyaS5zZXRTY2hlbWUob3B0X3NjaGVtZSk7CiAgb3B0X3VzZXJJbmZvICYmIHVyaS5zZXRVc2VySW5mbyhvcHRfdXNlckluZm8pOwogIG9wdF9kb21haW4gJiYgdXJpLnNldERvbWFpbihvcHRfZG9tYWluKTsKICBvcHRfcG9ydCAmJiB1cmkuc2V0UG9ydChvcHRfcG9ydCk7CiAgb3B0X3BhdGggJiYgdXJpLnNldFBhdGgob3B0X3BhdGgpOwogIG9wdF9xdWVyeSAmJiB1cmkuc2V0UXVlcnlEYXRhKG9wdF9xdWVyeSk7CiAgb3B0X2ZyYWdtZW50ICYmIHVyaS5zZXRGcmFnbWVudChvcHRfZnJhZ21lbnQpOwogIHJldHVybiB1cmkKfTsKZ29vZy5VcmkucmVzb2x2ZSA9IGZ1bmN0aW9uICRnb29nJFVyaSRyZXNvbHZlJChiYXNlLCByZWwpIHsKICBiYXNlIGluc3RhbmNlb2YgZ29vZy5VcmkgfHwgKGJhc2UgPSBnb29nLlVyaS5wYXJzZShiYXNlKSk7CiAgcmVsIGluc3RhbmNlb2YgZ29vZy5VcmkgfHwgKHJlbCA9IGdvb2cuVXJpLnBhcnNlKHJlbCkpOwogIHJldHVybiBiYXNlLnJlc29sdmUocmVsKQp9Owpnb29nLlVyaS5yZW1vdmVEb3RTZWdtZW50cyA9IGZ1bmN0aW9uICRnb29nJFVyaSRyZW1vdmVEb3RTZWdtZW50cyQocGF0aCkgewogIGlmKCIuLiIgPT0gcGF0aCB8fCAiLiIgPT0gcGF0aCkgewogICAgcmV0dXJuIiIKICB9CiAgaWYoIWdvb2cuc3RyaW5nLmNvbnRhaW5zKHBhdGgsICIuLyIpICYmICFnb29nLnN0cmluZy5jb250YWlucyhwYXRoLCAiLy4iKSkgewogICAgcmV0dXJuIHBhdGgKICB9CiAgZm9yKHZhciBsZWFkaW5nU2xhc2ggPSBnb29nLnN0cmluZy5zdGFydHNXaXRoKHBhdGgsICIvIiksIHNlZ21lbnRzID0gcGF0aC5zcGxpdCgiLyIpLCBvdXQgPSBbXSwgcG9zID0gMDtwb3MgPCBzZWdtZW50cy5sZW5ndGg7KSB7CiAgICB2YXIgc2VnbWVudCA9IHNlZ21lbnRzW3BvcysrXTsKICAgICIuIiA9PSBzZWdtZW50ID8gbGVhZGluZ1NsYXNoICYmIHBvcyA9PSBzZWdtZW50cy5sZW5ndGggJiYgb3V0LnB1c2goIiIpIDogIi4uIiA9PSBzZWdtZW50ID8gKCgxIDwgb3V0Lmxlbmd0aCB8fCAxID09IG91dC5sZW5ndGggJiYgIiIgIT0gb3V0WzBdKSAmJiBvdXQucG9wKCksIGxlYWRpbmdTbGFzaCAmJiBwb3MgPT0gc2VnbWVudHMubGVuZ3RoICYmIG91dC5wdXNoKCIiKSkgOiAob3V0LnB1c2goc2VnbWVudCksIGxlYWRpbmdTbGFzaCA9ICEwKQogIH0KICByZXR1cm4gb3V0LmpvaW4oIi8iKQp9Owpnb29nLlVyaS5kZWNvZGVPckVtcHR5XyA9IGZ1bmN0aW9uICRnb29nJFVyaSRkZWNvZGVPckVtcHR5XyQodmFsKSB7CiAgcmV0dXJuIHZhbCA/IGRlY29kZVVSSUNvbXBvbmVudCh2YWwpIDogIiIKfTsKZ29vZy5VcmkuZW5jb2RlU3RyaW5nXyA9IGZ1bmN0aW9uICRnb29nJFVyaSRlbmNvZGVTdHJpbmdfJCh1bmVzY2FwZWRQYXJ0KSB7CiAgcmV0dXJuIGdvb2cuaXNTdHJpbmcodW5lc2NhcGVkUGFydCkgPyBlbmNvZGVVUklDb21wb25lbnQodW5lc2NhcGVkUGFydCkgOiBudWxsCn07Cmdvb2cuVXJpLmVuY29kZVNwZWNpYWxSZWdFeHBfID0gL15bYS16QS1aMC05XC1fLiF+KicoKTpcLzs/XSokLzsKZ29vZy5VcmkuZW5jb2RlU3BlY2lhbENoYXJzXyA9IGZ1bmN0aW9uICRnb29nJFVyaSRlbmNvZGVTcGVjaWFsQ2hhcnNfJCh1bmVzY2FwZWRQYXJ0LCBleHRyYSkgewogIHZhciByZXQgPSBudWxsOwogIGdvb2cuaXNTdHJpbmcodW5lc2NhcGVkUGFydCkgJiYgKHJldCA9IHVuZXNjYXBlZFBhcnQsIGdvb2cuVXJpLmVuY29kZVNwZWNpYWxSZWdFeHBfLnRlc3QocmV0KSB8fCAocmV0ID0gZW5jb2RlVVJJKHVuZXNjYXBlZFBhcnQpKSwgMCA8PSByZXQuc2VhcmNoKGV4dHJhKSAmJiAocmV0ID0gcmV0LnJlcGxhY2UoZXh0cmEsIGdvb2cuVXJpLmVuY29kZUNoYXJfKSkpOwogIHJldHVybiByZXQKfTsKZ29vZy5VcmkuZW5jb2RlQ2hhcl8gPSBmdW5jdGlvbiAkZ29vZyRVcmkkZW5jb2RlQ2hhcl8kKGNoKSB7CiAgdmFyIG4gPSBjaC5jaGFyQ29kZUF0KDApOwogIHJldHVybiIlIiArIChuID4+IDQgJiAxNSkudG9TdHJpbmcoMTYpICsgKG4gJiAxNSkudG9TdHJpbmcoMTYpCn07Cmdvb2cuVXJpLnJlRGlzYWxsb3dlZEluU2NoZW1lT3JVc2VySW5mb18gPSAvWyNcL1w/QF0vZzsKZ29vZy5VcmkucmVEaXNhbGxvd2VkSW5SZWxhdGl2ZVBhdGhfID0gL1tcI1w/Ol0vZzsKZ29vZy5VcmkucmVEaXNhbGxvd2VkSW5BYnNvbHV0ZVBhdGhfID0gL1tcI1w/XS9nOwpnb29nLlVyaS5yZURpc2FsbG93ZWRJblF1ZXJ5XyA9IC9bXCNcP0BdL2c7Cmdvb2cuVXJpLnJlRGlzYWxsb3dlZEluRnJhZ21lbnRfID0gLyMvZzsKZ29vZy5VcmkuaGF2ZVNhbWVEb21haW4gPSBmdW5jdGlvbiAkZ29vZyRVcmkkaGF2ZVNhbWVEb21haW4kKHVyaTFTdHJpbmcsIHVyaTJTdHJpbmcpIHsKICB2YXIgcGllY2VzMSA9IGdvb2cudXJpLnV0aWxzLnNwbGl0KHVyaTFTdHJpbmcpLCBwaWVjZXMyID0gZ29vZy51cmkudXRpbHMuc3BsaXQodXJpMlN0cmluZyk7CiAgcmV0dXJuIHBpZWNlczFbZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXguRE9NQUlOXSA9PSBwaWVjZXMyW2dvb2cudXJpLnV0aWxzLkNvbXBvbmVudEluZGV4LkRPTUFJTl0gJiYgcGllY2VzMVtnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleC5QT1JUXSA9PSBwaWVjZXMyW2dvb2cudXJpLnV0aWxzLkNvbXBvbmVudEluZGV4LlBPUlRdCn07Cmdvb2cuVXJpLlF1ZXJ5RGF0YSA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkKG9wdF9xdWVyeSwgb3B0X3VyaSwgb3B0X2lnbm9yZUNhc2UpIHsKICB0aGlzLmVuY29kZWRRdWVyeV8gPSBvcHRfcXVlcnkgfHwgbnVsbDsKICB0aGlzLnVyaV8gPSBvcHRfdXJpIHx8IG51bGw7CiAgdGhpcy5pZ25vcmVDYXNlXyA9ICEhb3B0X2lnbm9yZUNhc2UKfTsKZ29vZy5VcmkuUXVlcnlEYXRhLnByb3RvdHlwZS5lbnN1cmVLZXlNYXBJbml0aWFsaXplZF8gPSBmdW5jdGlvbiAkZ29vZyRVcmkkUXVlcnlEYXRhJCRlbnN1cmVLZXlNYXBJbml0aWFsaXplZF8kKCkgewogIGlmKCF0aGlzLmtleU1hcF8gJiYgKHRoaXMua2V5TWFwXyA9IG5ldyBnb29nLnN0cnVjdHMuTWFwLCB0aGlzLmNvdW50XyA9IDAsIHRoaXMuZW5jb2RlZFF1ZXJ5XykpIHsKICAgIGZvcih2YXIgcGFpcnMgPSB0aGlzLmVuY29kZWRRdWVyeV8uc3BsaXQoIiYiKSwgaSA9IDA7aSA8IHBhaXJzLmxlbmd0aDtpKyspIHsKICAgICAgdmFyIGluZGV4T2ZFcXVhbHMgPSBwYWlyc1tpXS5pbmRleE9mKCI9IiksIG5hbWUgPSBudWxsLCB2YWx1ZSA9IG51bGw7CiAgICAgIDAgPD0gaW5kZXhPZkVxdWFscyA/IChuYW1lID0gcGFpcnNbaV0uc3Vic3RyaW5nKDAsIGluZGV4T2ZFcXVhbHMpLCB2YWx1ZSA9IHBhaXJzW2ldLnN1YnN0cmluZyhpbmRleE9mRXF1YWxzICsgMSkpIDogbmFtZSA9IHBhaXJzW2ldOwogICAgICBuYW1lID0gZ29vZy5zdHJpbmcudXJsRGVjb2RlKG5hbWUpOwogICAgICBuYW1lID0gdGhpcy5nZXRLZXlOYW1lXyhuYW1lKTsKICAgICAgdGhpcy5hZGQobmFtZSwgdmFsdWUgPyBnb29nLnN0cmluZy51cmxEZWNvZGUodmFsdWUpIDogIiIpCiAgICB9CiAgfQp9Owpnb29nLlVyaS5RdWVyeURhdGEuY3JlYXRlRnJvbU1hcCA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkY3JlYXRlRnJvbU1hcCQobWFwLCBvcHRfdXJpLCBvcHRfaWdub3JlQ2FzZSkgewogIHZhciBrZXlzID0gZ29vZy5zdHJ1Y3RzLmdldEtleXMobWFwKTsKICBpZigidW5kZWZpbmVkIiA9PSB0eXBlb2Yga2V5cykgewogICAgdGhyb3cgRXJyb3IoIktleXMgYXJlIHVuZGVmaW5lZCIpOwogIH0KICByZXR1cm4gZ29vZy5VcmkuUXVlcnlEYXRhLmNyZWF0ZUZyb21LZXlzVmFsdWVzKGtleXMsIGdvb2cuc3RydWN0cy5nZXRWYWx1ZXMobWFwKSwgb3B0X3VyaSwgb3B0X2lnbm9yZUNhc2UpCn07Cmdvb2cuVXJpLlF1ZXJ5RGF0YS5jcmVhdGVGcm9tS2V5c1ZhbHVlcyA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkY3JlYXRlRnJvbUtleXNWYWx1ZXMkKGtleXMsIHZhbHVlcywgb3B0X3VyaSwgb3B0X2lnbm9yZUNhc2UpIHsKICBpZihrZXlzLmxlbmd0aCAhPSB2YWx1ZXMubGVuZ3RoKSB7CiAgICB0aHJvdyBFcnJvcigiTWlzbWF0Y2hlZCBsZW5ndGhzIGZvciBrZXlzL3ZhbHVlcyIpOwogIH0KICBmb3IodmFyIHF1ZXJ5RGF0YSA9IG5ldyBnb29nLlVyaS5RdWVyeURhdGEobnVsbCwgb3B0X3VyaSwgb3B0X2lnbm9yZUNhc2UpLCBpID0gMDtpIDwga2V5cy5sZW5ndGg7aSsrKSB7CiAgICBxdWVyeURhdGEuYWRkKGtleXNbaV0sIHZhbHVlc1tpXSkKICB9CiAgcmV0dXJuIHF1ZXJ5RGF0YQp9Owpnb29nLlVyaS5RdWVyeURhdGEucHJvdG90eXBlLmtleU1hcF8gPSBudWxsOwpnb29nLlVyaS5RdWVyeURhdGEucHJvdG90eXBlLmNvdW50XyA9IG51bGw7Cmdvb2cuVXJpLlF1ZXJ5RGF0YS5kZWNvZGVkUXVlcnlfID0gbnVsbDsKZ29vZy5VcmkuUXVlcnlEYXRhLnByb3RvdHlwZS5nZXRDb3VudCA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkJGdldENvdW50JCgpIHsKICB0aGlzLmVuc3VyZUtleU1hcEluaXRpYWxpemVkXygpOwogIHJldHVybiB0aGlzLmNvdW50Xwp9Owpnb29nLlVyaS5RdWVyeURhdGEucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkJGFkZCQoa2V5LCB2YWx1ZSkgewogIHRoaXMuZW5zdXJlS2V5TWFwSW5pdGlhbGl6ZWRfKCk7CiAgdGhpcy5pbnZhbGlkYXRlQ2FjaGVfKCk7CiAga2V5ID0gdGhpcy5nZXRLZXlOYW1lXyhrZXkpOwogIGlmKHRoaXMuY29udGFpbnNLZXkoa2V5KSkgewogICAgdmFyIGN1cnJlbnQgPSB0aGlzLmtleU1hcF8uZ2V0KGtleSk7CiAgICBnb29nLmlzQXJyYXkoY3VycmVudCkgPyBjdXJyZW50LnB1c2godmFsdWUpIDogdGhpcy5rZXlNYXBfLnNldChrZXksIFtjdXJyZW50LCB2YWx1ZV0pCiAgfWVsc2UgewogICAgdGhpcy5rZXlNYXBfLnNldChrZXksIHZhbHVlKQogIH0KICB0aGlzLmNvdW50XysrOwogIHJldHVybiB0aGlzCn07Cmdvb2cuVXJpLlF1ZXJ5RGF0YS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gJGdvb2ckVXJpJFF1ZXJ5RGF0YSQkcmVtb3ZlJChrZXkpIHsKICB0aGlzLmVuc3VyZUtleU1hcEluaXRpYWxpemVkXygpOwogIGtleSA9IHRoaXMuZ2V0S2V5TmFtZV8oa2V5KTsKICBpZih0aGlzLmtleU1hcF8uY29udGFpbnNLZXkoa2V5KSkgewogICAgdGhpcy5pbnZhbGlkYXRlQ2FjaGVfKCk7CiAgICB2YXIgb2xkID0gdGhpcy5rZXlNYXBfLmdldChrZXkpOwogICAgZ29vZy5pc0FycmF5KG9sZCkgPyB0aGlzLmNvdW50XyAtPSBvbGQubGVuZ3RoIDogdGhpcy5jb3VudF8tLTsKICAgIHJldHVybiB0aGlzLmtleU1hcF8ucmVtb3ZlKGtleSkKICB9CiAgcmV0dXJuITEKfTsKZ29vZy5VcmkuUXVlcnlEYXRhLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkJGNsZWFyJCgpIHsKICB0aGlzLmludmFsaWRhdGVDYWNoZV8oKTsKICB0aGlzLmtleU1hcF8gJiYgdGhpcy5rZXlNYXBfLmNsZWFyKCk7CiAgdGhpcy5jb3VudF8gPSAwCn07Cmdvb2cuVXJpLlF1ZXJ5RGF0YS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkJGlzRW1wdHkkKCkgewogIHRoaXMuZW5zdXJlS2V5TWFwSW5pdGlhbGl6ZWRfKCk7CiAgcmV0dXJuIDAgPT0gdGhpcy5jb3VudF8KfTsKZ29vZy5VcmkuUXVlcnlEYXRhLnByb3RvdHlwZS5jb250YWluc0tleSA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkJGNvbnRhaW5zS2V5JChrZXkpIHsKICB0aGlzLmVuc3VyZUtleU1hcEluaXRpYWxpemVkXygpOwogIGtleSA9IHRoaXMuZ2V0S2V5TmFtZV8oa2V5KTsKICByZXR1cm4gdGhpcy5rZXlNYXBfLmNvbnRhaW5zS2V5KGtleSkKfTsKZ29vZy5VcmkuUXVlcnlEYXRhLnByb3RvdHlwZS5jb250YWluc1ZhbHVlID0gZnVuY3Rpb24gJGdvb2ckVXJpJFF1ZXJ5RGF0YSQkY29udGFpbnNWYWx1ZSQodmFsdWUpIHsKICB2YXIgdmFscyA9IHRoaXMuZ2V0VmFsdWVzKCk7CiAgcmV0dXJuIGdvb2cuYXJyYXkuY29udGFpbnModmFscywgdmFsdWUpCn07Cmdvb2cuVXJpLlF1ZXJ5RGF0YS5wcm90b3R5cGUuZ2V0S2V5cyA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkJGdldEtleXMkKCkgewogIHRoaXMuZW5zdXJlS2V5TWFwSW5pdGlhbGl6ZWRfKCk7CiAgZm9yKHZhciB2YWxzID0gdGhpcy5rZXlNYXBfLmdldFZhbHVlcygpLCBrZXlzID0gdGhpcy5rZXlNYXBfLmdldEtleXMoKSwgcnYgPSBbXSwgaSA9IDA7aSA8IGtleXMubGVuZ3RoO2krKykgewogICAgdmFyIHZhbCA9IHZhbHNbaV07CiAgICBpZihnb29nLmlzQXJyYXkodmFsKSkgewogICAgICBmb3IodmFyIGogPSAwO2ogPCB2YWwubGVuZ3RoO2orKykgewogICAgICAgIHJ2LnB1c2goa2V5c1tpXSkKICAgICAgfQogICAgfWVsc2UgewogICAgICBydi5wdXNoKGtleXNbaV0pCiAgICB9CiAgfQogIHJldHVybiBydgp9Owpnb29nLlVyaS5RdWVyeURhdGEucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkJGdldFZhbHVlcyQob3B0X2tleSkgewogIHRoaXMuZW5zdXJlS2V5TWFwSW5pdGlhbGl6ZWRfKCk7CiAgdmFyIHJ2OwogIGlmKG9wdF9rZXkpIHsKICAgIHZhciBrZXkgPSB0aGlzLmdldEtleU5hbWVfKG9wdF9rZXkpOwogICAgaWYodGhpcy5jb250YWluc0tleShrZXkpKSB7CiAgICAgIHZhciB2YWx1ZSA9IHRoaXMua2V5TWFwXy5nZXQoa2V5KTsKICAgICAgaWYoZ29vZy5pc0FycmF5KHZhbHVlKSkgewogICAgICAgIHJldHVybiB2YWx1ZQogICAgICB9CiAgICAgIHJ2ID0gW107CiAgICAgIHJ2LnB1c2godmFsdWUpCiAgICB9ZWxzZSB7CiAgICAgIHJ2ID0gW10KICAgIH0KICB9ZWxzZSB7CiAgICB2YXIgdmFscyA9IHRoaXMua2V5TWFwXy5nZXRWYWx1ZXMoKTsKICAgIHJ2ID0gW107CiAgICBmb3IodmFyIGkgPSAwO2kgPCB2YWxzLmxlbmd0aDtpKyspIHsKICAgICAgdmFyIHZhbCA9IHZhbHNbaV07CiAgICAgIGdvb2cuaXNBcnJheSh2YWwpID8gZ29vZy5hcnJheS5leHRlbmQocnYsIHZhbCkgOiBydi5wdXNoKHZhbCkKICAgIH0KICB9CiAgcmV0dXJuIHJ2Cn07Cmdvb2cuVXJpLlF1ZXJ5RGF0YS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gJGdvb2ckVXJpJFF1ZXJ5RGF0YSQkc2V0JChrZXksIHZhbHVlKSB7CiAgdGhpcy5lbnN1cmVLZXlNYXBJbml0aWFsaXplZF8oKTsKICB0aGlzLmludmFsaWRhdGVDYWNoZV8oKTsKICBrZXkgPSB0aGlzLmdldEtleU5hbWVfKGtleSk7CiAgaWYodGhpcy5jb250YWluc0tleShrZXkpKSB7CiAgICB2YXIgb2xkID0gdGhpcy5rZXlNYXBfLmdldChrZXkpOwogICAgZ29vZy5pc0FycmF5KG9sZCkgPyB0aGlzLmNvdW50XyAtPSBvbGQubGVuZ3RoIDogdGhpcy5jb3VudF8tLQogIH0KICB0aGlzLmtleU1hcF8uc2V0KGtleSwgdmFsdWUpOwogIHRoaXMuY291bnRfKys7CiAgcmV0dXJuIHRoaXMKfTsKZ29vZy5VcmkuUXVlcnlEYXRhLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAkZ29vZyRVcmkkUXVlcnlEYXRhJCRnZXQkKGtleSwgb3B0X2RlZmF1bHQpIHsKICB0aGlzLmVuc3VyZUtleU1hcEluaXRpYWxpemVkXygpOwogIGtleSA9IHRoaXMuZ2V0S2V5TmFtZV8oa2V5KTsKICBpZih0aGlzLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgIHZhciB2YWwgPSB0aGlzLmtleU1hcF8uZ2V0KGtleSk7CiAgICByZXR1cm4gZ29vZy5pc0FycmF5KHZhbCkgPyB2YWxbMF0gOiB2YWwKICB9CiAgcmV0dXJuIG9wdF9kZWZhdWx0Cn07Cmdvb2cuVXJpLlF1ZXJ5RGF0YS5wcm90b3R5cGUuc2V0VmFsdWVzID0gZnVuY3Rpb24gJGdvb2ckVXJpJFF1ZXJ5RGF0YSQkc2V0VmFsdWVzJChrZXksIHZhbHVlcykgewogIHRoaXMuZW5zdXJlS2V5TWFwSW5pdGlhbGl6ZWRfKCk7CiAgdGhpcy5pbnZhbGlkYXRlQ2FjaGVfKCk7CiAga2V5ID0gdGhpcy5nZXRLZXlOYW1lXyhrZXkpOwogIGlmKHRoaXMuY29udGFpbnNLZXkoa2V5KSkgewogICAgdmFyIG9sZCA9IHRoaXMua2V5TWFwXy5nZXQoa2V5KTsKICAgIGdvb2cuaXNBcnJheShvbGQpID8gdGhpcy5jb3VudF8gLT0gb2xkLmxlbmd0aCA6IHRoaXMuY291bnRfLS0KICB9CiAgMCA8IHZhbHVlcy5sZW5ndGggJiYgKHRoaXMua2V5TWFwXy5zZXQoa2V5LCB2YWx1ZXMpLCB0aGlzLmNvdW50XyArPSB2YWx1ZXMubGVuZ3RoKQp9Owpnb29nLlVyaS5RdWVyeURhdGEucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckVXJpJFF1ZXJ5RGF0YSQkdG9TdHJpbmckKCkgewogIGlmKHRoaXMuZW5jb2RlZFF1ZXJ5XykgewogICAgcmV0dXJuIHRoaXMuZW5jb2RlZFF1ZXJ5XwogIH0KICBpZighdGhpcy5rZXlNYXBfKSB7CiAgICByZXR1cm4iIgogIH0KICBmb3IodmFyIHNiID0gW10sIGNvdW50ID0gMCwga2V5cyA9IHRoaXMua2V5TWFwXy5nZXRLZXlzKCksIGkgPSAwO2kgPCBrZXlzLmxlbmd0aDtpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldLCBlbmNvZGVkS2V5ID0gZ29vZy5zdHJpbmcudXJsRW5jb2RlKGtleSksIHZhbCA9IHRoaXMua2V5TWFwXy5nZXQoa2V5KTsKICAgIGlmKGdvb2cuaXNBcnJheSh2YWwpKSB7CiAgICAgIGZvcih2YXIgaiA9IDA7aiA8IHZhbC5sZW5ndGg7aisrKSB7CiAgICAgICAgMCA8IGNvdW50ICYmIHNiLnB1c2goIiYiKSwgc2IucHVzaChlbmNvZGVkS2V5KSwgIiIgIT09IHZhbFtqXSAmJiBzYi5wdXNoKCI9IiwgZ29vZy5zdHJpbmcudXJsRW5jb2RlKHZhbFtqXSkpLCBjb3VudCsrCiAgICAgIH0KICAgIH1lbHNlIHsKICAgICAgMCA8IGNvdW50ICYmIHNiLnB1c2goIiYiKSwgc2IucHVzaChlbmNvZGVkS2V5KSwgIiIgIT09IHZhbCAmJiBzYi5wdXNoKCI9IiwgZ29vZy5zdHJpbmcudXJsRW5jb2RlKHZhbCkpLCBjb3VudCsrCiAgICB9CiAgfQogIHJldHVybiB0aGlzLmVuY29kZWRRdWVyeV8gPSBzYi5qb2luKCIiKQp9Owpnb29nLlVyaS5RdWVyeURhdGEucHJvdG90eXBlLnRvRGVjb2RlZFN0cmluZyA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkJHRvRGVjb2RlZFN0cmluZyQoKSB7CiAgdGhpcy5kZWNvZGVkUXVlcnlfIHx8ICh0aGlzLmRlY29kZWRRdWVyeV8gPSBnb29nLlVyaS5kZWNvZGVPckVtcHR5Xyh0aGlzLnRvU3RyaW5nKCkpKTsKICByZXR1cm4gdGhpcy5kZWNvZGVkUXVlcnlfCn07Cmdvb2cuVXJpLlF1ZXJ5RGF0YS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlXyA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkJGludmFsaWRhdGVDYWNoZV8kKCkgewogIGRlbGV0ZSB0aGlzLmRlY29kZWRRdWVyeV87CiAgZGVsZXRlIHRoaXMuZW5jb2RlZFF1ZXJ5XzsKICB0aGlzLnVyaV8gJiYgZGVsZXRlIHRoaXMudXJpXy5jYWNoZWRUb1N0cmluZ18KfTsKZ29vZy5VcmkuUXVlcnlEYXRhLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICRnb29nJFVyaSRRdWVyeURhdGEkJGNsb25lJCgpIHsKICB2YXIgcnYgPSBuZXcgZ29vZy5VcmkuUXVlcnlEYXRhOwogIHRoaXMuZGVjb2RlZFF1ZXJ5XyAmJiAocnYuZGVjb2RlZFF1ZXJ5XyA9IHRoaXMuZGVjb2RlZFF1ZXJ5Xyk7CiAgdGhpcy5lbmNvZGVkUXVlcnlfICYmIChydi5lbmNvZGVkUXVlcnlfID0gdGhpcy5lbmNvZGVkUXVlcnlfKTsKICB0aGlzLmtleU1hcF8gJiYgKHJ2LmtleU1hcF8gPSB0aGlzLmtleU1hcF8uY2xvbmUoKSk7CiAgcmV0dXJuIHJ2Cn07Cmdvb2cuVXJpLlF1ZXJ5RGF0YS5wcm90b3R5cGUuZ2V0S2V5TmFtZV8gPSBmdW5jdGlvbiAkZ29vZyRVcmkkUXVlcnlEYXRhJCRnZXRLZXlOYW1lXyQoYXJnKSB7CiAgdmFyIGtleU5hbWUgPSAiIiArIGFyZzsKICB0aGlzLmlnbm9yZUNhc2VfICYmIChrZXlOYW1lID0ga2V5TmFtZS50b0xvd2VyQ2FzZSgpKTsKICByZXR1cm4ga2V5TmFtZQp9Owpnb29nLlVyaS5RdWVyeURhdGEucHJvdG90eXBlLnNldElnbm9yZUNhc2UgPSBmdW5jdGlvbiAkZ29vZyRVcmkkUXVlcnlEYXRhJCRzZXRJZ25vcmVDYXNlJChpZ25vcmVDYXNlKSB7CiAgdmFyIHJlc2V0S2V5cyA9IGlnbm9yZUNhc2UgJiYgIXRoaXMuaWdub3JlQ2FzZV87CiAgcmVzZXRLZXlzICYmICh0aGlzLmVuc3VyZUtleU1hcEluaXRpYWxpemVkXygpLCB0aGlzLmludmFsaWRhdGVDYWNoZV8oKSwgZ29vZy5zdHJ1Y3RzLmZvckVhY2godGhpcy5rZXlNYXBfLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICB2YXIgbG93ZXJDYXNlID0ga2V5LnRvTG93ZXJDYXNlKCk7CiAgICBrZXkgIT0gbG93ZXJDYXNlICYmICh0aGlzLnJlbW92ZShrZXkpLCB0aGlzLmFkZChsb3dlckNhc2UsIHZhbHVlKSkKICB9LCB0aGlzKSk7CiAgdGhpcy5pZ25vcmVDYXNlXyA9IGlnbm9yZUNhc2UKfTsKZ29vZy5VcmkuUXVlcnlEYXRhLnByb3RvdHlwZS5leHRlbmQgPSBmdW5jdGlvbiAkZ29vZyRVcmkkUXVlcnlEYXRhJCRleHRlbmQkKHZhcl9hcmdzKSB7CiAgZm9yKHZhciBpID0gMDtpIDwgYXJndW1lbnRzLmxlbmd0aDtpKyspIHsKICAgIHZhciBkYXRhID0gYXJndW1lbnRzW2ldOwogICAgZ29vZy5zdHJ1Y3RzLmZvckVhY2goZGF0YSwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICB0aGlzLmFkZChrZXksIHZhbHVlKQogICAgfSwgdGhpcykKICB9Cn07Cmdvb2cuaTE4biA9IHt9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lTTyA9IHtFUkFTOlsiQkMiLCAiQUQiXSwgRVJBTkFNRVM6WyJCZWZvcmUgQ2hyaXN0IiwgIkFubm8gRG9taW5pIl0sIE5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6IkphbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUsSnVseSxBdWd1c3QsU2VwdGVtYmVyLE9jdG9iZXIsTm92ZW1iZXIsRGVjZW1iZXIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6IkphbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUsSnVseSxBdWd1c3QsU2VwdGVtYmVyLE9jdG9iZXIsTm92ZW1iZXIsRGVjZW1iZXIiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKYW4sRmViLE1hcixBcHIsTWF5LEp1bixKdWwsQXVnLFNlcCxPY3QsTm92LERlYyIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJTdW5kYXksTW9uZGF5LFR1ZXNkYXksV2VkbmVzZGF5LFRodXJzZGF5LEZyaWRheSxTYXR1cmRheSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJTdW5kYXksTW9uZGF5LFR1ZXNkYXksV2VkbmVzZGF5LFRodXJzZGF5LEZyaWRheSxTYXR1cmRheSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiU3VuLE1vbixUdWUsV2VkLFRodSxGcmksU2F0Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiU3VuLE1vbixUdWUsV2VkLFRodSxGcmksU2F0Ii5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiUyxNLFQsVyxULEYsUyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJTLE0sVCxXLFQsRixTIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAiUTMiLCAKIlE0Il0sIFFVQVJURVJTOlsiMXN0IHF1YXJ0ZXIiLCAiMm5kIHF1YXJ0ZXIiLCAiM3JkIHF1YXJ0ZXIiLCAiNHRoIHF1YXJ0ZXIiXSwgQU1QTVM6WyJBTSIsICJQTSJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIHkgTU1NTSBkZCIsICJ5IE1NTU0gZCIsICJ5IE1NTSBkIiwgInl5eXktTU0tZGQiXSwgVElNRUZPUk1BVFM6WyJISDptbTpzcyB2IiwgIkhIOm1tOnNzIHoiLCAiSEg6bW06c3MiLCAiSEg6bW0iXSwgQVZBSUxBQkxFRk9STUFUUzp7TWQ6Ik0vZCIsIE1NTU1kOiJNTU1NIGQiLCBNTU1kOiJNTU0gZCJ9LCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYW0gPSB7RVJBUzpbIlx1MTJkMy9cdTEyZDMiLCAiXHUxMmQzL1x1MTIxZCJdLCBFUkFOQU1FUzpbIlx1MTJkM1x1MTIxOFx1MTI3MCBcdTEyZDNcdTEyMDhcdTEyMWQiLCAiXHUxMmQzXHUxMjE4XHUxMjcwIFx1MTIxZFx1MTIxNVx1MTIyOFx1MTI3NSJdLCBOQVJST1dNT05USFM6Ilx1MTMwMyxcdTEzNGMsXHUxMjFiLFx1MTJhNCxcdTEyMWMsXHUxMzAxLFx1MTMwMSxcdTEyYTYsXHUxMjM0LFx1MTJhNixcdTEyOTYsXHUxMmYyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJcdTEzMDMsXHUxMzRjLFx1MTIxYixcdTEyYTQsXHUxMjFjLFx1MTMwMSxcdTEzMDEsXHUxMmE2LFx1MTIzNCxcdTEyYTYsXHUxMjk2LFx1MTJmMiIuc3BsaXQoIiwiKSwgTU9OVEhTOiJcdTEzMDNcdTEyOTVcdTEyZTlcdTEyYzhcdTEyMmEsXHUxMzRjXHUxMjY1XHUxMjI5XHUxMmM4XHUxMjJhLFx1MTIxYlx1MTIyZFx1MTI3ZCxcdTEyYTRcdTEzNTVcdTEyMjhcdTEyMGQsXHUxMjFjXHUxMmVkLFx1MTMwMVx1MTI5NSxcdTEzMDFcdTEyMGJcdTEyZWQsXHUxMmE2XHUxMzA4XHUxMjM1XHUxMjc1LFx1MTIzNFx1MTM1NVx1MTI3NFx1MTIxZFx1MTI2MFx1MTIyZCxcdTEyYTZcdTEyYWRcdTEyNzBcdTEyY2RcdTEyNjBcdTEyMmQsXHUxMjk2XHUxMjZjXHUxMjFkXHUxMjYwXHUxMjJkLFx1MTJmMlx1MTIzNFx1MTIxZFx1MTI2MFx1MTIyZCIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVNT05USFM6Ilx1MTMwM1x1MTI5NVx1MTJlOVx1MTJjOFx1MTIyYSxcdTEzNGNcdTEyNjVcdTEyMjlcdTEyYzhcdTEyMmEsXHUxMjFiXHUxMjJkXHUxMjdkLFx1MTJhNFx1MTM1NVx1MTIyOFx1MTIwZCxcdTEyMWNcdTEyZWQsXHUxMzAxXHUxMjk1LFx1MTMwMVx1MTIwYlx1MTJlZCxcdTEyYTZcdTEzMDhcdTEyMzVcdTEyNzUsXHUxMjM0XHUxMzU1XHUxMjc0XHUxMjFkXHUxMjYwXHUxMjJkLFx1MTJhNlx1MTJhZFx1MTI3MFx1MTJjZFx1MTI2MFx1MTIyZCxcdTEyOTZcdTEyNmNcdTEyMWRcdTEyNjBcdTEyMmQsXHUxMmYyXHUxMjM0XHUxMjFkXHUxMjYwXHUxMjJkIi5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiXHUxMzAzXHUxMjk1XHUxMmU5LFx1MTM0Y1x1MTI2NVx1MTIyOSxcdTEyMWJcdTEyMmRcdTEyN2QsXHUxMmE0XHUxMzU1XHUxMjI4LFx1MTIxY1x1MTJlZCxcdTEzMDFcdTEyOTUsXHUxMzAxXHUxMjBiXHUxMmVkLFx1MTJhNlx1MTMwOFx1MTIzNSxcdTEyMzRcdTEzNTVcdTEyNzQsXHUxMmE2XHUxMmFkXHUxMjcwLFx1MTI5Nlx1MTI2Y1x1MTIxZCxcdTEyZjJcdTEyMzRcdTEyMWQiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6Ilx1MTMwM1x1MTI5NVx1MTJlOSxcdTEzNGNcdTEyNjVcdTEyMjksXHUxMjFiXHUxMjJkXHUxMjdkLFx1MTJhNFx1MTM1NVx1MTIyOCxcdTEyMWNcdTEyZWQsXHUxMzAxXHUxMjk1LFx1MTMwMVx1MTIwYlx1MTJlZCxcdTEyYTZcdTEzMDhcdTEyMzUsXHUxMjM0XHUxMzU1XHUxMjc0LFx1MTJhNlx1MTJhZFx1MTI3MCxcdTEyOTZcdTEyNmNcdTEyMWQsXHUxMmYyXHUxMjM0XHUxMjFkIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiXHUxMmE1XHUxMjExXHUxMmY1LFx1MTIzMFx1MTI5ZSxcdTEyMWJcdTEyYWRcdTEyMzBcdTEyOWUsXHUxMjI4XHUxMjYxXHUxMmQ1LFx1MTIxMFx1MTIxOVx1MTIzNSxcdTEyZDNcdTEyMmRcdTEyNjUsXHUxMjQ1XHUxMmYzXHUxMjFjIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Ilx1MTJhNVx1MTIxMVx1MTJmNSxcdTEyMzBcdTEyOWUsXHUxMjFiXHUxMmFkXHUxMjMwXHUxMjllLFx1MTIyOFx1MTI2MVx1MTJkNSxcdTEyMTBcdTEyMTlcdTEyMzUsXHUxMmQzXHUxMjJkXHUxMjY1LFx1MTI0NVx1MTJmM1x1MTIxYyIuc3BsaXQoIiwiKSwgClNIT1JUV0VFS0RBWVM6Ilx1MTJhNVx1MTIxMVx1MTJmNSxcdTEyMzBcdTEyOWUsXHUxMjFiXHUxMmFkXHUxMjMwLFx1MTIyOFx1MTI2MVx1MTJkNSxcdTEyMTBcdTEyMTlcdTEyMzUsXHUxMmQzXHUxMjJkXHUxMjY1LFx1MTI0NVx1MTJmM1x1MTIxYyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MTJhNVx1MTIxMVx1MTJmNSxcdTEyMzBcdTEyOWUsXHUxMjFiXHUxMmFkXHUxMjMwLFx1MTIyOFx1MTI2MVx1MTJkNSxcdTEyMTBcdTEyMTlcdTEyMzUsXHUxMmQzXHUxMjJkXHUxMjY1LFx1MTI0NVx1MTJmM1x1MTIxYyIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1MTJhNSxcdTEyMzAsXHUxMjFiLFx1MTIyOCxcdTEyMTAsXHUxMmQzLFx1MTI0NSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTEyYTUsXHUxMjMwLFx1MTIxYixcdTEyMjgsXHUxMjEwLFx1MTJkMyxcdTEyNDUiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJRMSIsIAoiUTIiLCAiUTMiLCAiUTQiXSwgUVVBUlRFUlM6WyIxXHUxMjliXHUxMmNkIFx1MTIyOVx1MTI2NSIsICJcdTEyMDFcdTEyMDhcdTEyNzBcdTEyOWJcdTEyY2QgXHUxMjI5XHUxMjY1IiwgIjNcdTEyOWJcdTEyY2QgXHUxMjI5XHUxMjY1IiwgIjRcdTEyOWJcdTEyY2QgXHUxMjI5XHUxMjY1Il0sIEFNUE1TOlsiXHUxMzIxXHUxMmNiXHUxMjc1IiwgIlx1MTJhOFx1MTIzM1x1MTJkM1x1MTI3NSJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIGQgTU1NTSB5IiwgImQgTU1NTSB5IiwgImQgTU1NIHkiLCAiZGQvTU0veXl5eSJdLCBUSU1FRk9STUFUUzpbImg6bW06c3MgYSB6enp6IiwgImg6bW06c3MgYSB6IiwgImg6bW06c3MgYSIsICJoOm1tIGEiXSwgRklSU1REQVlPRldFRUs6NSwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjF9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyID0ge0VSQVM6WyJcdTA2NDIuXHUwNjQ1IiwgIlx1MDY0NSJdLCBFUkFOQU1FUzpbIlx1MDY0Mlx1MDYyOFx1MDY0NCBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NGFcdTA2NDRcdTA2MjdcdTA2MmYiLCAiXHUwNjQ1XHUwNjRhXHUwNjQ0XHUwNjI3XHUwNjJmXHUwNjRhIl0sIE5BUlJPV01PTlRIUzoiXHUwNjRhLFx1MDY0MSxcdTA2NDUsXHUwNjIzLFx1MDY0OCxcdTA2NDYsXHUwNjQ0LFx1MDYzYSxcdTA2MzMsXHUwNjQzLFx1MDYyOCxcdTA2MmYiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MDY0YSxcdTA2NDEsXHUwNjQ1LFx1MDYyMyxcdTA2NDgsXHUwNjQ2LFx1MDY0NCxcdTA2M2EsXHUwNjMzLFx1MDY0MyxcdTA2MjgsXHUwNjJmIi5zcGxpdCgiLCIpLCBNT05USFM6Ilx1MDY0YVx1MDY0Nlx1MDYyN1x1MDY0YVx1MDYzMSxcdTA2NDFcdTA2MjhcdTA2MzFcdTA2MjdcdTA2NGFcdTA2MzEsXHUwNjQ1XHUwNjI3XHUwNjMxXHUwNjMzLFx1MDYyM1x1MDYyOFx1MDYzMVx1MDY0YVx1MDY0NCxcdTA2NDVcdTA2MjdcdTA2NGFcdTA2NDgsXHUwNjRhXHUwNjQ4XHUwNjQ2XHUwNjRhXHUwNjQ4LFx1MDY0YVx1MDY0OFx1MDY0NFx1MDY0YVx1MDY0OCxcdTA2MjNcdTA2M2FcdTA2MzNcdTA2MzdcdTA2MzMsXHUwNjMzXHUwNjI4XHUwNjJhXHUwNjQ1XHUwNjI4XHUwNjMxLFx1MDYyM1x1MDY0M1x1MDYyYVx1MDY0OFx1MDYyOFx1MDYzMSxcdTA2NDZcdTA2NDhcdTA2NDFcdTA2NDVcdTA2MjhcdTA2MzEsXHUwNjJmXHUwNjRhXHUwNjMzXHUwNjQ1XHUwNjI4XHUwNjMxIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORU1PTlRIUzoiXHUwNjRhXHUwNjQ2XHUwNjI3XHUwNjRhXHUwNjMxLFx1MDY0MVx1MDYyOFx1MDYzMVx1MDYyN1x1MDY0YVx1MDYzMSxcdTA2NDVcdTA2MjdcdTA2MzFcdTA2MzMsXHUwNjIzXHUwNjI4XHUwNjMxXHUwNjRhXHUwNjQ0LFx1MDY0NVx1MDYyN1x1MDY0YVx1MDY0OCxcdTA2NGFcdTA2NDhcdTA2NDZcdTA2NGFcdTA2NDgsXHUwNjRhXHUwNjQ4XHUwNjQ0XHUwNjRhXHUwNjQ4LFx1MDYyM1x1MDYzYVx1MDYzM1x1MDYzN1x1MDYzMyxcdTA2MzNcdTA2MjhcdTA2MmFcdTA2NDVcdTA2MjhcdTA2MzEsXHUwNjIzXHUwNjQzXHUwNjJhXHUwNjQ4XHUwNjI4XHUwNjMxLFx1MDY0Nlx1MDY0OFx1MDY0MVx1MDY0NVx1MDYyOFx1MDYzMSxcdTA2MmZcdTA2NGFcdTA2MzNcdTA2NDVcdTA2MjhcdTA2MzEiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJcdTA2NGFcdTA2NDZcdTA2MjdcdTA2NGFcdTA2MzEsXHUwNjQxXHUwNjI4XHUwNjMxXHUwNjI3XHUwNjRhXHUwNjMxLFx1MDY0NVx1MDYyN1x1MDYzMVx1MDYzMyxcdTA2MjNcdTA2MjhcdTA2MzFcdTA2NGFcdTA2NDQsXHUwNjQ1XHUwNjI3XHUwNjRhXHUwNjQ4LFx1MDY0YVx1MDY0OFx1MDY0Nlx1MDY0YVx1MDY0OCxcdTA2NGFcdTA2NDhcdTA2NDRcdTA2NGFcdTA2NDgsXHUwNjIzXHUwNjNhXHUwNjMzXHUwNjM3XHUwNjMzLFx1MDYzM1x1MDYyOFx1MDYyYVx1MDY0NVx1MDYyOFx1MDYzMSxcdTA2MjNcdTA2NDNcdTA2MmFcdTA2NDhcdTA2MjhcdTA2MzEsXHUwNjQ2XHUwNjQ4XHUwNjQxXHUwNjQ1XHUwNjI4XHUwNjMxLFx1MDYyZlx1MDY0YVx1MDYzM1x1MDY0NVx1MDYyOFx1MDYzMSIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwNjRhXHUwNjQ2XHUwNjI3XHUwNjRhXHUwNjMxLFx1MDY0MVx1MDYyOFx1MDYzMVx1MDYyN1x1MDY0YVx1MDYzMSxcdTA2NDVcdTA2MjdcdTA2MzFcdTA2MzMsXHUwNjIzXHUwNjI4XHUwNjMxXHUwNjRhXHUwNjQ0LFx1MDY0NVx1MDYyN1x1MDY0YVx1MDY0OCxcdTA2NGFcdTA2NDhcdTA2NDZcdTA2NGFcdTA2NDgsXHUwNjRhXHUwNjQ4XHUwNjQ0XHUwNjRhXHUwNjQ4LFx1MDYyM1x1MDYzYVx1MDYzM1x1MDYzN1x1MDYzMyxcdTA2MzNcdTA2MjhcdTA2MmFcdTA2NDVcdTA2MjhcdTA2MzEsXHUwNjIzXHUwNjQzXHUwNjJhXHUwNjQ4XHUwNjI4XHUwNjMxLFx1MDY0Nlx1MDY0OFx1MDY0MVx1MDY0NVx1MDYyOFx1MDYzMSxcdTA2MmZcdTA2NGFcdTA2MzNcdTA2NDVcdTA2MjhcdTA2MzEiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJcdTA2MjdcdTA2NDRcdTA2MjNcdTA2MmRcdTA2MmYsXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjJiXHUwNjQ2XHUwNjRhXHUwNjQ2LFx1MDYyN1x1MDY0NFx1MDYyYlx1MDY0NFx1MDYyN1x1MDYyYlx1MDYyN1x1MDYyMSxcdTA2MjdcdTA2NDRcdTA2MjNcdTA2MzFcdTA2MjhcdTA2MzlcdTA2MjdcdTA2MjEsXHUwNjI3XHUwNjQ0XHUwNjJlXHUwNjQ1XHUwNjRhXHUwNjMzLFx1MDYyN1x1MDY0NFx1MDYyY1x1MDY0NVx1MDYzOVx1MDYyOSxcdTA2MjdcdTA2NDRcdTA2MzNcdTA2MjhcdTA2MmEiLnNwbGl0KCIsIiksIApTVEFOREFMT05FV0VFS0RBWVM6Ilx1MDYyN1x1MDY0NFx1MDYyM1x1MDYyZFx1MDYyZixcdTA2MjdcdTA2NDRcdTA2MjdcdTA2MmJcdTA2NDZcdTA2NGFcdTA2NDYsXHUwNjI3XHUwNjQ0XHUwNjJiXHUwNjQ0XHUwNjI3XHUwNjJiXHUwNjI3XHUwNjIxLFx1MDYyN1x1MDY0NFx1MDYyM1x1MDYzMVx1MDYyOFx1MDYzOVx1MDYyN1x1MDYyMSxcdTA2MjdcdTA2NDRcdTA2MmVcdTA2NDVcdTA2NGFcdTA2MzMsXHUwNjI3XHUwNjQ0XHUwNjJjXHUwNjQ1XHUwNjM5XHUwNjI5LFx1MDYyN1x1MDY0NFx1MDYzM1x1MDYyOFx1MDYyYSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjJkXHUwNjJmLFx1MDYyN1x1MDY0NFx1MDYyN1x1MDYyYlx1MDY0Nlx1MDY0YVx1MDY0NixcdTA2MjdcdTA2NDRcdTA2MmJcdTA2NDRcdTA2MjdcdTA2MmJcdTA2MjdcdTA2MjEsXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjMxXHUwNjI4XHUwNjM5XHUwNjI3XHUwNjIxLFx1MDYyN1x1MDY0NFx1MDYyZVx1MDY0NVx1MDY0YVx1MDYzMyxcdTA2MjdcdTA2NDRcdTA2MmNcdTA2NDVcdTA2MzlcdTA2MjksXHUwNjI3XHUwNjQ0XHUwNjMzXHUwNjI4XHUwNjJhIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MDYyN1x1MDY0NFx1MDYyM1x1MDYyZFx1MDYyZixcdTA2MjdcdTA2NDRcdTA2MjdcdTA2MmJcdTA2NDZcdTA2NGFcdTA2NDYsXHUwNjI3XHUwNjQ0XHUwNjJiXHUwNjQ0XHUwNjI3XHUwNjJiXHUwNjI3XHUwNjIxLFx1MDYyN1x1MDY0NFx1MDYyM1x1MDYzMVx1MDYyOFx1MDYzOVx1MDYyN1x1MDYyMSxcdTA2MjdcdTA2NDRcdTA2MmVcdTA2NDVcdTA2NGFcdTA2MzMsXHUwNjI3XHUwNjQ0XHUwNjJjXHUwNjQ1XHUwNjM5XHUwNjI5LFx1MDYyN1x1MDY0NFx1MDYzM1x1MDYyOFx1MDYyYSIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1MDYyZCxcdTA2NDYsXHUwNjJiLFx1MDYzMSxcdTA2MmUsXHUwNjJjLFx1MDYzMyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTA2MmQsXHUwNjQ2LFx1MDYyYixcdTA2MzEsXHUwNjJlLFx1MDYyYyxcdTA2MzMiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJcdTA2MjdcdTA2NDRcdTA2MzFcdTA2MjhcdTA2MzkgXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjQ4XHUwNjQ0IiwgCiJcdTA2MjdcdTA2NDRcdTA2MzFcdTA2MjhcdTA2MzkgXHUwNjI3XHUwNjQ0XHUwNjJiXHUwNjI3XHUwNjQ2XHUwNjRhIiwgIlx1MDYyN1x1MDY0NFx1MDYzMVx1MDYyOFx1MDYzOSBcdTA2MjdcdTA2NDRcdTA2MmJcdTA2MjdcdTA2NDRcdTA2MmIiLCAiXHUwNjI3XHUwNjQ0XHUwNjMxXHUwNjI4XHUwNjM5IFx1MDYyN1x1MDY0NFx1MDYzMVx1MDYyN1x1MDYyOFx1MDYzOSJdLCBRVUFSVEVSUzpbIlx1MDYyN1x1MDY0NFx1MDYzMVx1MDYyOFx1MDYzOSBcdTA2MjdcdTA2NDRcdTA2MjNcdTA2NDhcdTA2NDQiLCAiXHUwNjI3XHUwNjQ0XHUwNjMxXHUwNjI4XHUwNjM5IFx1MDYyN1x1MDY0NFx1MDYyYlx1MDYyN1x1MDY0Nlx1MDY0YSIsICJcdTA2MjdcdTA2NDRcdTA2MzFcdTA2MjhcdTA2MzkgXHUwNjI3XHUwNjQ0XHUwNjJiXHUwNjI3XHUwNjQ0XHUwNjJiIiwgIlx1MDYyN1x1MDY0NFx1MDYzMVx1MDYyOFx1MDYzOSBcdTA2MjdcdTA2NDRcdTA2MzFcdTA2MjdcdTA2MjhcdTA2MzkiXSwgCkFNUE1TOlsiXHUwNjM1IiwgIlx1MDY0NSJdLCBEQVRFRk9STUFUUzpbIkVFRUVcdTA2MGMgZCBNTU1NXHUwNjBjIHkiLCAiZCBNTU1NXHUwNjBjIHkiLCAiZGRcdTIwMGYvTU1cdTIwMGYveXl5eSIsICJkXHUyMDBmL01cdTIwMGYveXl5eSJdLCBUSU1FRk9STUFUUzpbInp6enogaDptbTpzcyBhIiwgInogaDptbTpzcyBhIiwgImg6bW06c3MgYSIsICJoOm1tIGEiXSwgRklSU1REQVlPRldFRUs6NSwgV0VFS0VORFJBTkdFOls0LCA1XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjF9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JnID0ge0VSQVM6WyJcdTA0M2ZcdTA0NDAuIFx1MDQzZC4gXHUwNDM1LiIsICJcdTA0M2VcdTA0NDIgXHUwNDNkLiBcdTA0MzUuIl0sIEVSQU5BTUVTOlsiXHUwNDNmXHUwNDQwLlx1MDQyNVx1MDQ0MC4iLCAiXHUwNDQxXHUwNDNiLlx1MDQyNVx1MDQ0MC4iXSwgTkFSUk9XTU9OVEhTOiJcdTA0NGYsXHUwNDQ0LFx1MDQzYyxcdTA0MzAsXHUwNDNjLFx1MDQ0ZSxcdTA0NGUsXHUwNDMwLFx1MDQ0MSxcdTA0M2UsXHUwNDNkLFx1MDQzNCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiXHUwNDRmLFx1MDQ0NCxcdTA0M2MsXHUwNDMwLFx1MDQzYyxcdTA0NGUsXHUwNDRlLFx1MDQzMCxcdTA0NDEsXHUwNDNlLFx1MDQzZCxcdTA0MzQiLnNwbGl0KCIsIiksIE1PTlRIUzoiXHUwNDRmXHUwNDNkXHUwNDQzXHUwNDMwXHUwNDQwXHUwNDM4LFx1MDQ0NFx1MDQzNVx1MDQzMlx1MDQ0MFx1MDQ0M1x1MDQzMFx1MDQ0MFx1MDQzOCxcdTA0M2NcdTA0MzBcdTA0NDBcdTA0NDIsXHUwNDMwXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNiLFx1MDQzY1x1MDQzMFx1MDQzOSxcdTA0NGVcdTA0M2RcdTA0MzgsXHUwNDRlXHUwNDNiXHUwNDM4LFx1MDQzMFx1MDQzMlx1MDQzM1x1MDQ0M1x1MDQ0MVx1MDQ0MixcdTA0NDFcdTA0MzVcdTA0M2ZcdTA0NDJcdTA0MzVcdTA0M2NcdTA0MzJcdTA0NDBcdTA0MzgsXHUwNDNlXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDNjXHUwNDMyXHUwNDQwXHUwNDM4LFx1MDQzZFx1MDQzZVx1MDQzNVx1MDQzY1x1MDQzMlx1MDQ0MFx1MDQzOCxcdTA0MzRcdTA0MzVcdTA0M2FcdTA0MzVcdTA0M2NcdTA0MzJcdTA0NDBcdTA0MzgiLnNwbGl0KCIsIiksIApTVEFOREFMT05FTU9OVEhTOiJcdTA0NGZcdTA0M2RcdTA0NDNcdTA0MzBcdTA0NDBcdTA0MzgsXHUwNDQ0XHUwNDM1XHUwNDMyXHUwNDQwXHUwNDQzXHUwNDMwXHUwNDQwXHUwNDM4LFx1MDQzY1x1MDQzMFx1MDQ0MFx1MDQ0MixcdTA0MzBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2IsXHUwNDNjXHUwNDMwXHUwNDM5LFx1MDQ0ZVx1MDQzZFx1MDQzOCxcdTA0NGVcdTA0M2JcdTA0MzgsXHUwNDMwXHUwNDMyXHUwNDMzXHUwNDQzXHUwNDQxXHUwNDQyLFx1MDQ0MVx1MDQzNVx1MDQzZlx1MDQ0Mlx1MDQzNVx1MDQzY1x1MDQzMlx1MDQ0MFx1MDQzOCxcdTA0M2VcdTA0M2FcdTA0NDJcdTA0M2VcdTA0M2NcdTA0MzJcdTA0NDBcdTA0MzgsXHUwNDNkXHUwNDNlXHUwNDM1XHUwNDNjXHUwNDMyXHUwNDQwXHUwNDM4LFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQzNVx1MDQzY1x1MDQzMlx1MDQ0MFx1MDQzOCIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6Ilx1MDQ0Zlx1MDQzZC4sXHUwNDQ0XHUwNDM1XHUwNDMyXHUwNDQwLixcdTA0M2NcdTA0MzBcdTA0NDBcdTA0NDIsXHUwNDMwXHUwNDNmXHUwNDQwLixcdTA0M2NcdTA0MzBcdTA0MzksXHUwNDRlXHUwNDNkXHUwNDM4LFx1MDQ0ZVx1MDQzYlx1MDQzOCxcdTA0MzBcdTA0MzJcdTA0MzMuLFx1MDQ0MVx1MDQzNVx1MDQzZlx1MDQ0Mi4sXHUwNDNlXHUwNDNhXHUwNDQyLixcdTA0M2RcdTA0M2VcdTA0MzVcdTA0M2MuLFx1MDQzNFx1MDQzNVx1MDQzYS4iLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6Ilx1MDQ0Zlx1MDQzZC4sXHUwNDQ0XHUwNDM1XHUwNDMyXHUwNDQwLixcdTA0M2NcdTA0MzBcdTA0NDBcdTA0NDIsXHUwNDMwXHUwNDNmXHUwNDQwLixcdTA0M2NcdTA0MzBcdTA0MzksXHUwNDRlXHUwNDNkXHUwNDM4LFx1MDQ0ZVx1MDQzYlx1MDQzOCxcdTA0MzBcdTA0MzJcdTA0MzMuLFx1MDQ0MVx1MDQzNVx1MDQzZlx1MDQ0Mi4sXHUwNDNlXHUwNDNhXHUwNDQyLixcdTA0M2RcdTA0M2VcdTA0MzVcdTA0M2MuLFx1MDQzNFx1MDQzNVx1MDQzYS4iLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJcdTA0M2RcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGYsXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDNkXHUwNDM4XHUwNDNhLFx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZFx1MDQzOFx1MDQzYSxcdTA0NDFcdTA0NDBcdTA0NGZcdTA0MzRcdTA0MzAsXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDMyXHUwNDRhXHUwNDQwXHUwNDQyXHUwNDRhXHUwNDNhLFx1MDQzZlx1MDQzNVx1MDQ0Mlx1MDQ0YVx1MDQzYSxcdTA0NDFcdTA0NGFcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzAiLnNwbGl0KCIsIiksIApTVEFOREFMT05FV0VFS0RBWVM6Ilx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzYlx1MDQ0ZixcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0M2RcdTA0MzhcdTA0M2EsXHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNkXHUwNDM4XHUwNDNhLFx1MDQ0MVx1MDQ0MFx1MDQ0Zlx1MDQzNFx1MDQzMCxcdTA0NDdcdTA0MzVcdTA0NDJcdTA0MzJcdTA0NGFcdTA0NDBcdTA0NDJcdTA0NGFcdTA0M2EsXHUwNDNmXHUwNDM1XHUwNDQyXHUwNDRhXHUwNDNhLFx1MDQ0MVx1MDQ0YVx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMCIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiXHUwNDNkXHUwNDM0LFx1MDQzZlx1MDQzZCxcdTA0MzJcdTA0NDIsXHUwNDQxXHUwNDQwLFx1MDQ0N1x1MDQ0MixcdTA0M2ZcdTA0NDIsXHUwNDQxXHUwNDMxIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiXHUwNDNkXHUwNDM0LFx1MDQzZlx1MDQzZCxcdTA0MzJcdTA0NDIsXHUwNDQxXHUwNDQwLFx1MDQ0N1x1MDQ0MixcdTA0M2ZcdTA0NDIsXHUwNDQxXHUwNDMxIi5zcGxpdCgiLCIpLCAKTkFSUk9XV0VFS0RBWVM6Ilx1MDQzZCxcdTA0M2YsXHUwNDMyLFx1MDQ0MSxcdTA0NDcsXHUwNDNmLFx1MDQ0MSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTA0M2QsXHUwNDNmLFx1MDQzMixcdTA0NDEsXHUwNDQ3LFx1MDQzZixcdTA0NDEiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJJIFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzYy4iLCAiSUkgXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDNjLiIsICJJSUkgXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDNjLiIsICJJViBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0M2MuIl0sIFFVQVJURVJTOlsiMS1cdTA0MzJcdTA0M2UgXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDNjXHUwNDM1XHUwNDQxXHUwNDM1XHUwNDQ3XHUwNDM4XHUwNDM1IiwgIjItXHUwNDQwXHUwNDNlIFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQzNVx1MDQ0N1x1MDQzOFx1MDQzNSIsICIzLVx1MDQ0Mlx1MDQzZSBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0M2NcdTA0MzVcdTA0NDFcdTA0MzVcdTA0NDdcdTA0MzhcdTA0MzUiLCAKIjQtXHUwNDQyXHUwNDNlIFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQzNVx1MDQ0N1x1MDQzOFx1MDQzNSJdLCBBTVBNUzpbIlx1MDQzZlx1MDQ0MC4gXHUwNDNlXHUwNDMxLiIsICJcdTA0NDFcdTA0M2IuIFx1MDQzZVx1MDQzMS4iXSwgREFURUZPUk1BVFM6WyJkZCBNTU1NIHksIEVFRUUiLCAiZGQgTU1NTSB5IiwgImRkLk1NLnl5eXkiLCAiZGQuTU0ueXkiXSwgVElNRUZPUk1BVFM6WyJISDptbTpzcyB6enp6IiwgIkhIOm1tOnNzIHoiLCAiSEg6bW06c3MiLCAiSEg6bW0iXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuID0ge0VSQVM6WyJcdTA5OTZcdTA5YzNcdTA5YjdcdTA5Y2RcdTA5OWZcdTA5YWFcdTA5YzJcdTA5YjBcdTA5Y2RcdTA5YWMiLCAiXHUwOTk2XHUwOWMzXHUwOWI3XHUwOWNkXHUwOTlmXHUwOWJlXHUwOWFjXHUwOWNkXHUwOWE2Il0sIEVSQU5BTUVTOlsiXHUwOTk2XHUwOWMzXHUwOWI3XHUwOWNkXHUwOTlmXHUwOWFhXHUwOWMyXHUwOWIwXHUwOWNkXHUwOWFjIiwgIlx1MDk5Nlx1MDljM1x1MDliN1x1MDljZFx1MDk5Zlx1MDliZVx1MDlhY1x1MDljZFx1MDlhNiJdLCBOQVJST1dNT05USFM6Ilx1MDk5Y1x1MDliZSxcdTA5YWJcdTA5YzcsXHUwOWFlXHUwOWJlLFx1MDk4ZixcdTA5YWVcdTA5YzcsXHUwOTljXHUwOWMxXHUwOWE4LFx1MDk5Y1x1MDljMSxcdTA5ODYsXHUwOWI4XHUwOWM3LFx1MDk4NSxcdTA5YTgsXHUwOWExXHUwOWJmIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJcdTA5OWNcdTA5YmUsXHUwOWFiXHUwOWM3LFx1MDlhZVx1MDliZSxcdTA5OGYsXHUwOWFlXHUwOWM3LFx1MDk5Y1x1MDljMVx1MDlhOCxcdTA5OWNcdTA5YzEsXHUwOTg2LFx1MDliOFx1MDljNyxcdTA5ODUsXHUwOWE4LFx1MDlhMVx1MDliZiIuc3BsaXQoIiwiKSwgCk1PTlRIUzoiXHUwOTljXHUwOWJlXHUwOWE4XHUwOWMxXHUwOWFmXHUwOWJjXHUwOWJlXHUwOWIwXHUwOWMwLFx1MDlhYlx1MDljN1x1MDlhY1x1MDljZFx1MDliMFx1MDljMVx1MDlhZlx1MDliY1x1MDliZVx1MDliMFx1MDljMCxcdTA5YWVcdTA5YmVcdTA5YjBcdTA5Y2RcdTA5OWEsXHUwOThmXHUwOWFhXHUwOWNkXHUwOWIwXHUwOWJmXHUwOWIyLFx1MDlhZVx1MDljNyxcdTA5OWNcdTA5YzFcdTA5YTgsXHUwOTljXHUwOWMxXHUwOWIyXHUwOWJlXHUwOTg3LFx1MDk4Nlx1MDk5N1x1MDliOFx1MDljZFx1MDk5ZixcdTA5YjhcdTA5YzdcdTA5YWFcdTA5Y2RcdTA5OWZcdTA5YzdcdTA5YWVcdTA5Y2RcdTA5YWNcdTA5YjAsXHUwOTg1XHUwOTk1XHUwOWNkXHUwOTlmXHUwOWNiXHUwOWFjXHUwOWIwLFx1MDlhOFx1MDlhZFx1MDljN1x1MDlhZVx1MDljZFx1MDlhY1x1MDliMCxcdTA5YTFcdTA5YmZcdTA5YjhcdTA5YzdcdTA5YWVcdTA5Y2RcdTA5YWNcdTA5YjAiLnNwbGl0KCIsIiksIApTVEFOREFMT05FTU9OVEhTOiJcdTA5OWNcdTA5YmVcdTA5YThcdTA5YzFcdTA5YWZcdTA5YmNcdTA5YmVcdTA5YjBcdTA5YzAsXHUwOWFiXHUwOWM3XHUwOWFjXHUwOWNkXHUwOWIwXHUwOWMxXHUwOWFmXHUwOWJjXHUwOWJlXHUwOWIwXHUwOWMwLFx1MDlhZVx1MDliZVx1MDliMFx1MDljZFx1MDk5YSxcdTA5OGZcdTA5YWFcdTA5Y2RcdTA5YjBcdTA5YmZcdTA5YjIsXHUwOWFlXHUwOWM3LFx1MDk5Y1x1MDljMVx1MDlhOCxcdTA5OWNcdTA5YzFcdTA5YjJcdTA5YmVcdTA5ODcsXHUwOTg2XHUwOTk3XHUwOWI4XHUwOWNkXHUwOTlmLFx1MDliOFx1MDljN1x1MDlhYVx1MDljZFx1MDk5Zlx1MDljN1x1MDlhZVx1MDljZFx1MDlhY1x1MDliMCxcdTA5ODVcdTA5OTVcdTA5Y2RcdTA5OWZcdTA5Y2JcdTA5YWNcdTA5YjAsXHUwOWE4XHUwOWFkXHUwOWM3XHUwOWFlXHUwOWNkXHUwOWFjXHUwOWIwLFx1MDlhMVx1MDliZlx1MDliOFx1MDljN1x1MDlhZVx1MDljZFx1MDlhY1x1MDliMCIuc3BsaXQoIiwiKSwgClNIT1JUTU9OVEhTOiJcdTA5OWNcdTA5YmVcdTA5YThcdTA5YzFcdTA5YWZcdTA5YmNcdTA5YmVcdTA5YjBcdTA5YzAsXHUwOWFiXHUwOWM3XHUwOWFjXHUwOWNkXHUwOWIwXHUwOWMxXHUwOWFmXHUwOWJjXHUwOWJlXHUwOWIwXHUwOWMwLFx1MDlhZVx1MDliZVx1MDliMFx1MDljZFx1MDk5YSxcdTA5OGZcdTA5YWFcdTA5Y2RcdTA5YjBcdTA5YmZcdTA5YjIsXHUwOWFlXHUwOWM3LFx1MDk5Y1x1MDljMVx1MDlhOCxcdTA5OWNcdTA5YzFcdTA5YjJcdTA5YmVcdTA5ODcsXHUwOTg2XHUwOTk3XHUwOWI4XHUwOWNkXHUwOTlmLFx1MDliOFx1MDljN1x1MDlhYVx1MDljZFx1MDk5Zlx1MDljN1x1MDlhZVx1MDljZFx1MDlhY1x1MDliMCxcdTA5ODVcdTA5OTVcdTA5Y2RcdTA5OWZcdTA5Y2JcdTA5YWNcdTA5YjAsXHUwOWE4XHUwOWFkXHUwOWM3XHUwOWFlXHUwOWNkXHUwOWFjXHUwOWIwLFx1MDlhMVx1MDliZlx1MDliOFx1MDljN1x1MDlhZVx1MDljZFx1MDlhY1x1MDliMCIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwOTljXHUwOWJlXHUwOWE4XHUwOWMxXHUwOWFmXHUwOWJjXHUwOWJlXHUwOWIwXHUwOWMwLFx1MDlhYlx1MDljN1x1MDlhY1x1MDljZFx1MDliMFx1MDljMVx1MDlhZlx1MDliY1x1MDliZVx1MDliMFx1MDljMCxcdTA5YWVcdTA5YmVcdTA5YjBcdTA5Y2RcdTA5OWEsXHUwOThmXHUwOWFhXHUwOWNkXHUwOWIwXHUwOWJmXHUwOWIyLFx1MDlhZVx1MDljNyxcdTA5OWNcdTA5YzFcdTA5YTgsXHUwOTljXHUwOWMxXHUwOWIyXHUwOWJlXHUwOTg3LFx1MDk4Nlx1MDk5N1x1MDliOFx1MDljZFx1MDk5ZixcdTA5YjhcdTA5YzdcdTA5YWFcdTA5Y2RcdTA5OWZcdTA5YzdcdTA5YWVcdTA5Y2RcdTA5YWNcdTA5YjAsXHUwOTg1XHUwOTk1XHUwOWNkXHUwOTlmXHUwOWNiXHUwOWFjXHUwOWIwLFx1MDlhOFx1MDlhZFx1MDljN1x1MDlhZVx1MDljZFx1MDlhY1x1MDliMCxcdTA5YTFcdTA5YmZcdTA5YjhcdTA5YzdcdTA5YWVcdTA5Y2RcdTA5YWNcdTA5YjAiLnNwbGl0KCIsIiksIApXRUVLREFZUzoiXHUwOWIwXHUwOWFjXHUwOWJmXHUwOWFjXHUwOWJlXHUwOWIwLFx1MDliOFx1MDljYlx1MDlhZVx1MDlhY1x1MDliZVx1MDliMCxcdTA5YWVcdTA5OTlcdTA5Y2RcdTA5OTdcdTA5YjJcdTA5YWNcdTA5YmVcdTA5YjAsXHUwOWFjXHUwOWMxXHUwOWE3XHUwOWFjXHUwOWJlXHUwOWIwLFx1MDlhY1x1MDljM1x1MDliOVx1MDliN1x1MDljZFx1MDlhYVx1MDlhNFx1MDliZlx1MDlhY1x1MDliZVx1MDliMCxcdTA5YjZcdTA5YzFcdTA5OTVcdTA5Y2RcdTA5YjBcdTA5YWNcdTA5YmVcdTA5YjAsXHUwOWI2XHUwOWE4XHUwOWJmXHUwOWFjXHUwOWJlXHUwOWIwIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Ilx1MDliMFx1MDlhY1x1MDliZlx1MDlhY1x1MDliZVx1MDliMCxcdTA5YjhcdTA5Y2JcdTA5YWVcdTA5YWNcdTA5YmVcdTA5YjAsXHUwOWFlXHUwOTk5XHUwOWNkXHUwOTk3XHUwOWIyXHUwOWFjXHUwOWJlXHUwOWIwLFx1MDlhY1x1MDljMVx1MDlhN1x1MDlhY1x1MDliZVx1MDliMCxcdTA5YWNcdTA5YzNcdTA5YjlcdTA5YjdcdTA5Y2RcdTA5YWFcdTA5YTRcdTA5YmZcdTA5YWNcdTA5YmVcdTA5YjAsXHUwOWI2XHUwOWMxXHUwOTk1XHUwOWNkXHUwOWIwXHUwOWFjXHUwOWJlXHUwOWIwLFx1MDliNlx1MDlhOFx1MDliZlx1MDlhY1x1MDliZVx1MDliMCIuc3BsaXQoIiwiKSwgClNIT1JUV0VFS0RBWVM6Ilx1MDliMFx1MDlhY1x1MDliZixcdTA5YjhcdTA5Y2JcdTA5YWUsXHUwOWFlXHUwOTk5XHUwOWNkXHUwOTk3XHUwOWIyLFx1MDlhY1x1MDljMVx1MDlhNyxcdTA5YWNcdTA5YzNcdTA5YjlcdTA5YjhcdTA5Y2RcdTA5YWFcdTA5YTRcdTA5YmYsXHUwOWI2XHUwOWMxXHUwOTk1XHUwOWNkXHUwOWIwLFx1MDliNlx1MDlhOFx1MDliZiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MDliMFx1MDlhY1x1MDliZixcdTA5YjhcdTA5Y2JcdTA5YWUsXHUwOWFlXHUwOTk5XHUwOWNkXHUwOTk3XHUwOWIyLFx1MDlhY1x1MDljMVx1MDlhNyxcdTA5YWNcdTA5YzNcdTA5YjlcdTA5YjhcdTA5Y2RcdTA5YWFcdTA5YTRcdTA5YmYsXHUwOWI2XHUwOWMxXHUwOTk1XHUwOWNkXHUwOWIwLFx1MDliNlx1MDlhOFx1MDliZiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1MDliMCxcdTA5YjhcdTA5Y2IsXHUwOWFlLFx1MDlhY1x1MDljMSxcdTA5YWNcdTA5YzMsXHUwOWI2XHUwOWMxLFx1MDliNiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiXHUwOWIwLFx1MDliOFx1MDljYixcdTA5YWUsXHUwOWFjXHUwOWMxLFx1MDlhY1x1MDljMyxcdTA5YjZcdTA5YzEsXHUwOWI2Ii5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiXHUwOTlhXHUwOWE0XHUwOWMxXHUwOWIwXHUwOWNkXHUwOWE1XHUwOWJlXHUwOTgyXHUwOWI2IFx1MDllNyIsICJcdTA5OWFcdTA5YTRcdTA5YzFcdTA5YjBcdTA5Y2RcdTA5YTVcdTA5YmVcdTA5ODJcdTA5YjYgXHUwOWU4IiwgIlx1MDk5YVx1MDlhNFx1MDljMVx1MDliMFx1MDljZFx1MDlhNVx1MDliZVx1MDk4Mlx1MDliNiBcdTA5ZTkiLCAiXHUwOTlhXHUwOWE0XHUwOWMxXHUwOWIwXHUwOWNkXHUwOWE1XHUwOWJlXHUwOTgyXHUwOWI2IFx1MDllYSJdLCBRVUFSVEVSUzpbIlx1MDlhYVx1MDljZFx1MDliMFx1MDlhNVx1MDlhZSBcdTA5OWFcdTA5YTRcdTA5YzFcdTA5YjBcdTA5Y2RcdTA5YTVcdTA5YmVcdTA5ODJcdTA5YjYiLCAiXHUwOWE2XHUwOWNkXHUwOWFjXHUwOWJmXHUwOWE0XHUwOWMwXHUwOWFmXHUwOWJjIFx1MDk5YVx1MDlhNFx1MDljMVx1MDliMFx1MDljZFx1MDlhNVx1MDliZVx1MDk4Mlx1MDliNiIsIAoiXHUwOWE0XHUwOWMzXHUwOWE0XHUwOWMwXHUwOWFmXHUwOWJjIFx1MDk5YVx1MDlhNFx1MDljMVx1MDliMFx1MDljZFx1MDlhNVx1MDliZVx1MDk4Mlx1MDliNiIsICJcdTA5OWFcdTA5YTRcdTA5YzFcdTA5YjBcdTA5Y2RcdTA5YTUgXHUwOTlhXHUwOWE0XHUwOWMxXHUwOWIwXHUwOWNkXHUwOWE1XHUwOWJlXHUwOTgyXHUwOWI2Il0sIEFNUE1TOlsiYW0iLCAicG0iXSwgREFURUZPUk1BVFM6WyJFRUVFLCBkIE1NTU0sIHkiLCAiZCBNTU1NLCB5IiwgImQgTU1NLCB5IiwgImQvTS95eSJdLCBUSU1FRk9STUFUUzpbImg6bW06c3MgYSB6enp6IiwgImg6bW06c3MgYSB6IiwgImg6bW06c3MgYSIsICJoOm1tIGEiXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhID0ge0VSQVM6WyJhQyIsICJkQyJdLCBFUkFOQU1FUzpbImFiYW5zIGRlIENyaXN0IiwgImRlc3ByXHUwMGU5cyBkZSBDcmlzdCJdLCBOQVJST1dNT05USFM6IkcsRixNLEEsTSxKLEcsQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJnLGYsbSxhLG0saixqLGEscyxvLG4sZCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJkZSBnZW5lcixkZSBmZWJyZXIsZGUgbWFyXHUwMGU3LGRcdTIwMTlhYnJpbCxkZSBtYWlnLGRlIGp1bnksZGUganVsaW9sLGRcdTIwMTlhZ29zdCxkZSBzZXRlbWJyZSxkXHUyMDE5b2N0dWJyZSxkZSBub3ZlbWJyZSxkZSBkZXNlbWJyZSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiZ2VuZXIsZmVicmVyLG1hclx1MDBlNyxhYnJpbCxtYWlnLGp1bnksanVsaW9sLGFnb3N0LHNldGVtYnJlLG9jdHVicmUsbm92ZW1icmUsZGVzZW1icmUiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJkZSBnZW4uLGRlIGZlYnIuLGRlIG1hclx1MDBlNyxkXHUyMDE5YWJyLixkZSBtYWlnLGRlIGp1bnksZGUganVsLixkXHUyMDE5YWcuLGRlIHNldC4sZFx1MjAxOW9jdC4sZGUgbm92LixkZSBkZXMuIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJnZW4uLGZlYnIuLG1hclx1MDBlNyxhYnIuLG1haWcsanVueSxqdWwuLGFnLixzZXQuLG9jdC4sbm92LixkZXMuIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiZGl1bWVuZ2UsZGlsbHVucyxkaW1hcnRzLGRpbWVjcmVzLGRpam91cyxkaXZlbmRyZXMsZGlzc2FidGUiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiRGl1bWVuZ2UsRGlsbHVucyxEaW1hcnRzLERpbWVjcmVzLERpam91cyxEaXZlbmRyZXMsRGlzc2FidGUiLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6ImRnLixkbC4sZHQuLGRjLixkai4sZHYuLGRzLiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6ImRnLGRsLGR0LGRjLGRqLGR2LGRzIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiRyxsLFQsQyxKLFYsUyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJnLGwsdCxjLGosdixzIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiMVQiLCAKIjJUIiwgIjNUIiwgIjRUIl0sIFFVQVJURVJTOlsiMXIgdHJpbWVzdHJlIiwgIjJuIHRyaW1lc3RyZSIsICIzciB0cmltZXN0cmUiLCAiNHQgdHJpbWVzdHJlIl0sIEFNUE1TOlsiYS5tLiIsICJwLm0uIl0sIERBVEVGT1JNQVRTOlsiRUVFRSBkIE1NTU0gJ2RlJyB5IiwgImQgTU1NTSAnZGUnIHkiLCAiZGQvTU0veXl5eSIsICJkZC9NTS95eSJdLCBUSU1FRk9STUFUUzpbIkg6bW06c3Mgenp6eiIsICJIOm1tOnNzIHoiLCAiSDptbTpzcyIsICJIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jcyA9IHtFUkFTOlsicFx1MDE1OS4gbi4gbC4iLCAibi4gbC4iXSwgRVJBTkFNRVM6WyJwXHUwMTU5LiBuLiBsLiIsICJuLiBsLiJdLCBOQVJST1dNT05USFM6IjEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJsLFx1MDBmYSxiLGQsayxcdTAxMGQsXHUwMTBkLHMseixcdTAxNTksbCxwIi5zcGxpdCgiLCIpLCBNT05USFM6ImxlZG5hLFx1MDBmYW5vcmEsYlx1MDE1OWV6bmEsZHVibmEsa3ZcdTAxMWJ0bmEsXHUwMTBkZXJ2bmEsXHUwMTBkZXJ2ZW5jZSxzcnBuYSx6XHUwMGUxXHUwMTU5XHUwMGVkLFx1MDE1OVx1MDBlZGpuYSxsaXN0b3BhZHUscHJvc2luY2UiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6ImxlZGVuLFx1MDBmYW5vcixiXHUwMTU5ZXplbixkdWJlbixrdlx1MDExYnRlbixcdTAxMGRlcnZlbixcdTAxMGRlcnZlbmVjLHNycGVuLHpcdTAwZTFcdTAxNTlcdTAwZWQsXHUwMTU5XHUwMGVkamVuLGxpc3RvcGFkLHByb3NpbmVjIi5zcGxpdCgiLCIpLCAKU0hPUlRNT05USFM6IkxlZCxcdTAwZGFubyxCXHUwMTU5ZSxEdWIsS3ZcdTAxMWIsXHUwMTBjZXIsXHUwMTBjdmMsU3JwLFpcdTAwZTFcdTAxNTksXHUwMTU4XHUwMGVkaixMaXMsUHJvIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRNT05USFM6IjEuLDIuLDMuLDQuLDUuLDYuLDcuLDguLDkuLDEwLiwxMS4sMTIuIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoibmVkXHUwMTFibGUscG9uZFx1MDExYmxcdTAwZWQsXHUwMGZhdGVyXHUwMGZkLHN0XHUwMTU5ZWRhLFx1MDEwZHR2cnRlayxwXHUwMGUxdGVrLHNvYm90YSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJuZWRcdTAxMWJsZSxwb25kXHUwMTFibFx1MDBlZCxcdTAwZmF0ZXJcdTAwZmQsc3RcdTAxNTllZGEsXHUwMTBkdHZydGVrLHBcdTAwZTF0ZWssc29ib3RhIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJuZSxwbyxcdTAwZmF0LHN0LFx1MDEwZHQscFx1MDBlMSxzbyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Im5lLHBvLFx1MDBmYXQsc3QsXHUwMTBkdCxwXHUwMGUxLHNvIi5zcGxpdCgiLCIpLCAKTkFSUk9XV0VFS0RBWVM6Ik4sUCxcdTAwZGEsUyxcdTAxMGMsUCxTIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6Ik4sUCxcdTAwZGEsUyxcdTAxMGMsUCxTIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAiUTMiLCAiUTQiXSwgUVVBUlRFUlM6WyIxLiBcdTAxMGR0dnJ0bGV0XHUwMGVkIiwgIjIuIFx1MDEwZHR2cnRsZXRcdTAwZWQiLCAiMy4gXHUwMTBkdHZydGxldFx1MDBlZCIsICI0LiBcdTAxMGR0dnJ0bGV0XHUwMGVkIl0sIEFNUE1TOlsiZG9wLiIsICJvZHAuIl0sIERBVEVGT1JNQVRTOlsiRUVFRSwgZC4gTU1NTSB5IiwgImQuIE1NTU0geSIsICJkLk0ueXl5eSIsICJkZC5NTS55eSJdLCBUSU1FRk9STUFUUzpbIkg6bW06c3Mgenp6eiIsICJIOm1tOnNzIHoiLCAiSDptbTpzcyIsICJIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kYSA9IHtFUkFTOlsiZi5Lci4iLCAiZS5Lci4iXSwgRVJBTkFNRVM6WyJmLktyLiIsICJlLktyLiJdLCBOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJqYW51YXIsZmVicnVhcixtYXJ0cyxhcHJpbCxtYWosanVuaSxqdWxpLGF1Z3VzdCxzZXB0ZW1iZXIsb2t0b2Jlcixub3ZlbWJlcixkZWNlbWJlciIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiamFudWFyLGZlYnJ1YXIsbWFydHMsYXByaWwsbWFqLGp1bmksanVsaSxhdWd1c3Qsc2VwdGVtYmVyLG9rdG9iZXIsbm92ZW1iZXIsZGVjZW1iZXIiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJqYW4uLGZlYi4sbWFyLixhcHIuLG1haixqdW4uLGp1bC4sYXVnLixzZXAuLG9rdC4sbm92LixkZWMuIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJqYW4sZmViLG1hcixhcHIsbWFqLGp1bixqdWwsYXVnLHNlcCxva3Qsbm92LGRlYyIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6InNcdTAwZjhuZGFnLG1hbmRhZyx0aXJzZGFnLG9uc2RhZyx0b3JzZGFnLGZyZWRhZyxsXHUwMGY4cmRhZyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJzXHUwMGY4bmRhZyxtYW5kYWcsdGlyc2RhZyxvbnNkYWcsdG9yc2RhZyxmcmVkYWcsbFx1MDBmOHJkYWciLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6InNcdTAwZjhuLG1hbix0aXIsb25zLHRvcixmcmUsbFx1MDBmOHIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJzXHUwMGY4bixtYW4sdGlyLG9ucyx0b3IsZnJlLGxcdTAwZjhyIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiUyxNLFQsTyxULEYsTCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJTLE0sVCxPLFQsRixMIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiSzEiLCAKIksyIiwgIkszIiwgIks0Il0sIFFVQVJURVJTOlsiMS4ga3ZhcnRhbCIsICIyLiBrdmFydGFsIiwgIjMuIGt2YXJ0YWwiLCAiNC4ga3ZhcnRhbCJdLCBBTVBNUzpbImYubS4iLCAiZS5tLiJdLCBEQVRFRk9STUFUUzpbIkVFRUUgJ2RlbicgZC4gTU1NTSB5IiwgImQuIE1NTSB5IiwgImRkL01NL3l5eXkiLCAiZGQvTU0veXkiXSwgVElNRUZPUk1BVFM6WyJISC5tbS5zcyB6enp6IiwgIkhILm1tLnNzIHoiLCAiSEgubW0uc3MiLCAiSEgubW0iXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlID0ge0VSQVM6WyJ2LiBDaHIuIiwgIm4uIENoci4iXSwgRVJBTkFNRVM6WyJ2LiBDaHIuIiwgIm4uIENoci4iXSwgTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIE1PTlRIUzoiSmFudWFyLEZlYnJ1YXIsTVx1MDBlNHJ6LEFwcmlsLE1haSxKdW5pLEp1bGksQXVndXN0LFNlcHRlbWJlcixPa3RvYmVyLE5vdmVtYmVyLERlemVtYmVyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJKYW51YXIsRmVicnVhcixNXHUwMGU0cnosQXByaWwsTWFpLEp1bmksSnVsaSxBdWd1c3QsU2VwdGVtYmVyLE9rdG9iZXIsTm92ZW1iZXIsRGV6ZW1iZXIiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKYW4sRmViLE1cdTAwZTRyLEFwcixNYWksSnVuLEp1bCxBdWcsU2VwLE9rdCxOb3YsRGV6Ii5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJKYW4sRmViLE1cdTAwZTRyLEFwcixNYWksSnVuLEp1bCxBdWcsU2VwLE9rdCxOb3YsRGV6Ii5zcGxpdCgiLCIpLCBXRUVLREFZUzoiU29ubnRhZyxNb250YWcsRGllbnN0YWcsTWl0dHdvY2gsRG9ubmVyc3RhZyxGcmVpdGFnLFNhbXN0YWciLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiU29ubnRhZyxNb250YWcsRGllbnN0YWcsTWl0dHdvY2gsRG9ubmVyc3RhZyxGcmVpdGFnLFNhbXN0YWciLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6IlNvLixNby4sRGkuLE1pLixEby4sRnIuLFNhLiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6IlNvLE1vLERpLE1pLERvLEZyLFNhIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiUyxNLEQsTSxELEYsUyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJTLE0sRCxNLEQsRixTIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAKIlEzIiwgIlE0Il0sIFFVQVJURVJTOlsiMS4gUXVhcnRhbCIsICIyLiBRdWFydGFsIiwgIjMuIFF1YXJ0YWwiLCAiNC4gUXVhcnRhbCJdLCBBTVBNUzpbInZvcm0uIiwgIm5hY2htLiJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIGQuIE1NTU0geSIsICJkLiBNTU1NIHkiLCAiZGQuTU0ueXl5eSIsICJkZC5NTS55eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfQVQgPSB7RVJBUzpbInYuIENoci4iLCAibi4gQ2hyLiJdLCBFUkFOQU1FUzpbInYuIENoci4iLCAibi4gQ2hyLiJdLCBOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJKXHUwMGU0bm5lcixGZWJydWFyLE1cdTAwZTRyeixBcHJpbCxNYWksSnVuaSxKdWxpLEF1Z3VzdCxTZXB0ZW1iZXIsT2t0b2JlcixOb3ZlbWJlcixEZXplbWJlciIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiSlx1MDBlNG5uZXIsRmVicnVhcixNXHUwMGU0cnosQXByaWwsTWFpLEp1bmksSnVsaSxBdWd1c3QsU2VwdGVtYmVyLE9rdG9iZXIsTm92ZW1iZXIsRGV6ZW1iZXIiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKXHUwMGU0bixGZWIsTVx1MDBlNHIsQXByLE1haSxKdW4sSnVsLEF1ZyxTZXAsT2t0LE5vdixEZXoiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6IkpcdTAwZTRuLEZlYixNXHUwMGU0cixBcHIsTWFpLEp1bixKdWwsQXVnLFNlcCxPa3QsTm92LERleiIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6IlNvbm50YWcsTW9udGFnLERpZW5zdGFnLE1pdHR3b2NoLERvbm5lcnN0YWcsRnJlaXRhZyxTYW1zdGFnIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6IlNvbm50YWcsTW9udGFnLERpZW5zdGFnLE1pdHR3b2NoLERvbm5lcnN0YWcsRnJlaXRhZyxTYW1zdGFnIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJTby4sTW8uLERpLixNaS4sRG8uLEZyLixTYS4iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJTbyxNbyxEaSxNaSxEbyxGcixTYSIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IlMsTSxELE0sRCxGLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiUyxNLEQsTSxELEYsUyIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIlExIiwgCiJRMiIsICJRMyIsICJRNCJdLCBRVUFSVEVSUzpbIjEuIFF1YXJ0YWwiLCAiMi4gUXVhcnRhbCIsICIzLiBRdWFydGFsIiwgIjQuIFF1YXJ0YWwiXSwgQU1QTVM6WyJ2b3JtLiIsICJuYWNobS4iXSwgREFURUZPUk1BVFM6WyJFRUVFLCBkZC4gTU1NTSB5IiwgImRkLiBNTU1NIHkiLCAiZGQuTU0ueXl5eSIsICJkZC5NTS55eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfQ0ggPSBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlOwpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VsID0ge0VSQVM6WyJcdTAzYzAuXHUwM2E3LiIsICJcdTAzYmMuXHUwM2E3LiJdLCBFUkFOQU1FUzpbIlx1MDNjMC5cdTAzYTcuIiwgIlx1MDNiYy5cdTAzYTcuIl0sIE5BUlJPV01PTlRIUzoiXHUwMzk5LFx1MDNhNixcdTAzOWMsXHUwMzkxLFx1MDM5YyxcdTAzOTksXHUwMzk5LFx1MDM5MSxcdTAzYTMsXHUwMzlmLFx1MDM5ZCxcdTAzOTQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MDM5OSxcdTAzYTYsXHUwMzljLFx1MDM5MSxcdTAzOWMsXHUwMzk5LFx1MDM5OSxcdTAzOTEsXHUwM2EzLFx1MDM5ZixcdTAzOWQsXHUwMzk0Ii5zcGxpdCgiLCIpLCBNT05USFM6Ilx1MDM5OVx1MDNiMVx1MDNiZFx1MDNiZlx1MDNjNVx1MDNiMVx1MDNjMVx1MDNhZlx1MDNiZlx1MDNjNSxcdTAzYTZcdTAzYjVcdTAzYjJcdTAzYzFcdTAzYmZcdTAzYzVcdTAzYjFcdTAzYzFcdTAzYWZcdTAzYmZcdTAzYzUsXHUwMzljXHUwM2IxXHUwM2MxXHUwM2M0XHUwM2FmXHUwM2JmXHUwM2M1LFx1MDM5MVx1MDNjMFx1MDNjMVx1MDNiOVx1MDNiYlx1MDNhZlx1MDNiZlx1MDNjNSxcdTAzOWNcdTAzYjFcdTAzOTBcdTAzYmZcdTAzYzUsXHUwMzk5XHUwM2JmXHUwM2M1XHUwM2JkXHUwM2FmXHUwM2JmXHUwM2M1LFx1MDM5OVx1MDNiZlx1MDNjNVx1MDNiYlx1MDNhZlx1MDNiZlx1MDNjNSxcdTAzOTFcdTAzYzVcdTAzYjNcdTAzYmZcdTAzY2RcdTAzYzNcdTAzYzRcdTAzYmZcdTAzYzUsXHUwM2EzXHUwM2I1XHUwM2MwXHUwM2M0XHUwM2I1XHUwM2JjXHUwM2IyXHUwM2MxXHUwM2FmXHUwM2JmXHUwM2M1LFx1MDM5Zlx1MDNiYVx1MDNjNFx1MDNjOVx1MDNiMlx1MDNjMVx1MDNhZlx1MDNiZlx1MDNjNSxcdTAzOWRcdTAzYmZcdTAzYjVcdTAzYmNcdTAzYjJcdTAzYzFcdTAzYWZcdTAzYmZcdTAzYzUsXHUwMzk0XHUwM2I1XHUwM2JhXHUwM2I1XHUwM2JjXHUwM2IyXHUwM2MxXHUwM2FmXHUwM2JmXHUwM2M1Ii5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORU1PTlRIUzoiXHUwMzk5XHUwM2IxXHUwM2JkXHUwM2JmXHUwM2M1XHUwM2FjXHUwM2MxXHUwM2I5XHUwM2JmXHUwM2MyLFx1MDNhNlx1MDNiNVx1MDNiMlx1MDNjMVx1MDNiZlx1MDNjNVx1MDNhY1x1MDNjMVx1MDNiOVx1MDNiZlx1MDNjMixcdTAzOWNcdTAzYWNcdTAzYzFcdTAzYzRcdTAzYjlcdTAzYmZcdTAzYzIsXHUwMzkxXHUwM2MwXHUwM2MxXHUwM2FmXHUwM2JiXHUwM2I5XHUwM2JmXHUwM2MyLFx1MDM5Y1x1MDNhY1x1MDNiOVx1MDNiZlx1MDNjMixcdTAzOTlcdTAzYmZcdTAzY2RcdTAzYmRcdTAzYjlcdTAzYmZcdTAzYzIsXHUwMzk5XHUwM2JmXHUwM2NkXHUwM2JiXHUwM2I5XHUwM2JmXHUwM2MyLFx1MDM5MVx1MDNjZFx1MDNiM1x1MDNiZlx1MDNjNVx1MDNjM1x1MDNjNFx1MDNiZlx1MDNjMixcdTAzYTNcdTAzYjVcdTAzYzBcdTAzYzRcdTAzYWRcdTAzYmNcdTAzYjJcdTAzYzFcdTAzYjlcdTAzYmZcdTAzYzIsXHUwMzlmXHUwM2JhXHUwM2M0XHUwM2NlXHUwM2IyXHUwM2MxXHUwM2I5XHUwM2JmXHUwM2MyLFx1MDM5ZFx1MDNiZlx1MDNhZFx1MDNiY1x1MDNiMlx1MDNjMVx1MDNiOVx1MDNiZlx1MDNjMixcdTAzOTRcdTAzYjVcdTAzYmFcdTAzYWRcdTAzYmNcdTAzYjJcdTAzYzFcdTAzYjlcdTAzYmZcdTAzYzIiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoiXHUwMzk5XHUwM2IxXHUwM2JkLFx1MDNhNlx1MDNiNVx1MDNiMixcdTAzOWNcdTAzYjFcdTAzYzEsXHUwMzkxXHUwM2MwXHUwM2MxLFx1MDM5Y1x1MDNiMVx1MDNjYSxcdTAzOTlcdTAzYmZcdTAzYzVcdTAzYmQsXHUwMzk5XHUwM2JmXHUwM2M1XHUwM2JiLFx1MDM5MVx1MDNjNVx1MDNiMyxcdTAzYTNcdTAzYjVcdTAzYzAsXHUwMzlmXHUwM2JhXHUwM2M0LFx1MDM5ZFx1MDNiZlx1MDNiNSxcdTAzOTRcdTAzYjVcdTAzYmEiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwMzk5XHUwM2IxXHUwM2JkLFx1MDNhNlx1MDNiNVx1MDNiMixcdTAzOWNcdTAzYWNcdTAzYzEsXHUwMzkxXHUwM2MwXHUwM2MxLFx1MDM5Y1x1MDNhY1x1MDNiOSxcdTAzOTlcdTAzYmZcdTAzY2RcdTAzYmQsXHUwMzk5XHUwM2JmXHUwM2NkXHUwM2JiLFx1MDM5MVx1MDNjNVx1MDNiMyxcdTAzYTNcdTAzYjVcdTAzYzAsXHUwMzlmXHUwM2JhXHUwM2M0LFx1MDM5ZFx1MDNiZlx1MDNhZCxcdTAzOTRcdTAzYjVcdTAzYmEiLnNwbGl0KCIsIiksIApXRUVLREFZUzoiXHUwMzlhXHUwM2M1XHUwM2MxXHUwM2I5XHUwM2IxXHUwM2JhXHUwM2FlLFx1MDM5NFx1MDNiNVx1MDNjNVx1MDNjNFx1MDNhZFx1MDNjMVx1MDNiMSxcdTAzYTRcdTAzYzFcdTAzYWZcdTAzYzRcdTAzYjcsXHUwM2E0XHUwM2I1XHUwM2M0XHUwM2FjXHUwM2MxXHUwM2M0XHUwM2I3LFx1MDNhMFx1MDNhZFx1MDNiY1x1MDNjMFx1MDNjNFx1MDNiNyxcdTAzYTBcdTAzYjFcdTAzYzFcdTAzYjFcdTAzYzNcdTAzYmFcdTAzYjVcdTAzYzVcdTAzYWUsXHUwM2EzXHUwM2FjXHUwM2IyXHUwM2IyXHUwM2IxXHUwM2M0XHUwM2JmIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Ilx1MDM5YVx1MDNjNVx1MDNjMVx1MDNiOVx1MDNiMVx1MDNiYVx1MDNhZSxcdTAzOTRcdTAzYjVcdTAzYzVcdTAzYzRcdTAzYWRcdTAzYzFcdTAzYjEsXHUwM2E0XHUwM2MxXHUwM2FmXHUwM2M0XHUwM2I3LFx1MDNhNFx1MDNiNVx1MDNjNFx1MDNhY1x1MDNjMVx1MDNjNFx1MDNiNyxcdTAzYTBcdTAzYWRcdTAzYmNcdTAzYzBcdTAzYzRcdTAzYjcsXHUwM2EwXHUwM2IxXHUwM2MxXHUwM2IxXHUwM2MzXHUwM2JhXHUwM2I1XHUwM2M1XHUwM2FlLFx1MDNhM1x1MDNhY1x1MDNiMlx1MDNiMlx1MDNiMVx1MDNjNFx1MDNiZiIuc3BsaXQoIiwiKSwgClNIT1JUV0VFS0RBWVM6Ilx1MDM5YVx1MDNjNVx1MDNjMSxcdTAzOTRcdTAzYjVcdTAzYzUsXHUwM2E0XHUwM2MxXHUwM2I5LFx1MDNhNFx1MDNiNVx1MDNjNCxcdTAzYTBcdTAzYjVcdTAzYmMsXHUwM2EwXHUwM2IxXHUwM2MxLFx1MDNhM1x1MDNiMVx1MDNiMiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MDM5YVx1MDNjNVx1MDNjMSxcdTAzOTRcdTAzYjVcdTAzYzUsXHUwM2E0XHUwM2MxXHUwM2FmLFx1MDNhNFx1MDNiNVx1MDNjNCxcdTAzYTBcdTAzYWRcdTAzYmMsXHUwM2EwXHUwM2IxXHUwM2MxLFx1MDNhM1x1MDNhY1x1MDNiMiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1MDM5YSxcdTAzOTQsXHUwM2E0LFx1MDNhNCxcdTAzYTAsXHUwM2EwLFx1MDNhMyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTAzOWEsXHUwMzk0LFx1MDNhNCxcdTAzYTQsXHUwM2EwLFx1MDNhMCxcdTAzYTMiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJcdTAzYTQxIiwgCiJcdTAzYTQyIiwgIlx1MDNhNDMiLCAiXHUwM2E0NCJdLCBRVUFSVEVSUzpbIjFcdTAzYmYgXHUwM2M0XHUwM2MxXHUwM2FmXHUwM2JjXHUwM2I3XHUwM2JkXHUwM2JmIiwgIjJcdTAzYmYgXHUwM2M0XHUwM2MxXHUwM2FmXHUwM2JjXHUwM2I3XHUwM2JkXHUwM2JmIiwgIjNcdTAzYmYgXHUwM2M0XHUwM2MxXHUwM2FmXHUwM2JjXHUwM2I3XHUwM2JkXHUwM2JmIiwgIjRcdTAzYmYgXHUwM2M0XHUwM2MxXHUwM2FmXHUwM2JjXHUwM2I3XHUwM2JkXHUwM2JmIl0sIEFNUE1TOlsiXHUwM2MwLlx1MDNiYy4iLCAiXHUwM2JjLlx1MDNiYy4iXSwgREFURUZPUk1BVFM6WyJFRUVFLCBkIE1NTU0geSIsICJkIE1NTU0geSIsICJkIE1NTSB5IiwgImQvTS95eSJdLCBUSU1FRk9STUFUUzpbImg6bW06c3MgYSB6enp6IiwgImg6bW06c3MgYSB6IiwgImg6bW06c3MgYSIsICJoOm1tIGEiXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuID0ge0VSQVM6WyJCQyIsICJBRCJdLCBFUkFOQU1FUzpbIkJlZm9yZSBDaHJpc3QiLCAiQW5ubyBEb21pbmkiXSwgTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIE1PTlRIUzoiSmFudWFyeSxGZWJydWFyeSxNYXJjaCxBcHJpbCxNYXksSnVuZSxKdWx5LEF1Z3VzdCxTZXB0ZW1iZXIsT2N0b2JlcixOb3ZlbWJlcixEZWNlbWJlciIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiSmFudWFyeSxGZWJydWFyeSxNYXJjaCxBcHJpbCxNYXksSnVuZSxKdWx5LEF1Z3VzdCxTZXB0ZW1iZXIsT2N0b2JlcixOb3ZlbWJlcixEZWNlbWJlciIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6IkphbixGZWIsTWFyLEFwcixNYXksSnVuLEp1bCxBdWcsU2VwLE9jdCxOb3YsRGVjIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJKYW4sRmViLE1hcixBcHIsTWF5LEp1bixKdWwsQXVnLFNlcCxPY3QsTm92LERlYyIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6IlN1bmRheSxNb25kYXksVHVlc2RheSxXZWRuZXNkYXksVGh1cnNkYXksRnJpZGF5LFNhdHVyZGF5Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6IlN1bmRheSxNb25kYXksVHVlc2RheSxXZWRuZXNkYXksVGh1cnNkYXksRnJpZGF5LFNhdHVyZGF5Ii5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJTdW4sTW9uLFR1ZSxXZWQsVGh1LEZyaSxTYXQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJTdW4sTW9uLFR1ZSxXZWQsVGh1LEZyaSxTYXQiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJTLE0sVCxXLFQsRixTIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6IlMsTSxULFcsVCxGLFMiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJRMSIsICJRMiIsICJRMyIsIAoiUTQiXSwgUVVBUlRFUlM6WyIxc3QgcXVhcnRlciIsICIybmQgcXVhcnRlciIsICIzcmQgcXVhcnRlciIsICI0dGggcXVhcnRlciJdLCBBTVBNUzpbIkFNIiwgIlBNIl0sIERBVEVGT1JNQVRTOlsiRUVFRSwgTU1NTSBkLCB5IiwgIk1NTU0gZCwgeSIsICJNTU0gZCwgeSIsICJNL2QveXkiXSwgVElNRUZPUk1BVFM6WyJoOm1tOnNzIGEgenp6eiIsICJoOm1tOnNzIGEgeiIsICJoOm1tOnNzIGEiLCAiaDptbSBhIl0sIEZJUlNUREFZT0ZXRUVLOjYsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWToyfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BVSA9IHtFUkFTOlsiQkMiLCAiQUQiXSwgRVJBTkFNRVM6WyJCZWZvcmUgQ2hyaXN0IiwgIkFubm8gRG9taW5pIl0sIE5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6IkphbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUsSnVseSxBdWd1c3QsU2VwdGVtYmVyLE9jdG9iZXIsTm92ZW1iZXIsRGVjZW1iZXIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6IkphbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUsSnVseSxBdWd1c3QsU2VwdGVtYmVyLE9jdG9iZXIsTm92ZW1iZXIsRGVjZW1iZXIiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKYW4sRmViLE1hcixBcHIsTWF5LEp1bixKdWwsQXVnLFNlcCxPY3QsTm92LERlYyIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJTdW5kYXksTW9uZGF5LFR1ZXNkYXksV2VkbmVzZGF5LFRodXJzZGF5LEZyaWRheSxTYXR1cmRheSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJTdW5kYXksTW9uZGF5LFR1ZXNkYXksV2VkbmVzZGF5LFRodXJzZGF5LEZyaWRheSxTYXR1cmRheSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiU3VuLE1vbixUdWUsV2VkLFRodSxGcmksU2F0Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiU3VuLE1vbixUdWUsV2VkLFRodSxGcmksU2F0Ii5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiUyxNLFQsVyxULEYsUyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJTLE0sVCxXLFQsRixTIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAiUTMiLCAKIlE0Il0sIFFVQVJURVJTOlsiMXN0IHF1YXJ0ZXIiLCAiMm5kIHF1YXJ0ZXIiLCAiM3JkIHF1YXJ0ZXIiLCAiNHRoIHF1YXJ0ZXIiXSwgQU1QTVM6WyJBTSIsICJQTSJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIGQgTU1NTSB5IiwgImQgTU1NTSB5IiwgImRkL01NL3l5eXkiLCAiZC9NTS95eSJdLCBUSU1FRk9STUFUUzpbImg6bW06c3MgYSB6enp6IiwgImg6bW06c3MgYSB6IiwgImg6bW06c3MgYSIsICJoOm1tIGEiXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dCID0ge0VSQVM6WyJCQyIsICJBRCJdLCBFUkFOQU1FUzpbIkJlZm9yZSBDaHJpc3QiLCAiQW5ubyBEb21pbmkiXSwgTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIE1PTlRIUzoiSmFudWFyeSxGZWJydWFyeSxNYXJjaCxBcHJpbCxNYXksSnVuZSxKdWx5LEF1Z3VzdCxTZXB0ZW1iZXIsT2N0b2JlcixOb3ZlbWJlcixEZWNlbWJlciIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiSmFudWFyeSxGZWJydWFyeSxNYXJjaCxBcHJpbCxNYXksSnVuZSxKdWx5LEF1Z3VzdCxTZXB0ZW1iZXIsT2N0b2JlcixOb3ZlbWJlcixEZWNlbWJlciIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6IkphbixGZWIsTWFyLEFwcixNYXksSnVuLEp1bCxBdWcsU2VwLE9jdCxOb3YsRGVjIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJKYW4sRmViLE1hcixBcHIsTWF5LEp1bixKdWwsQXVnLFNlcCxPY3QsTm92LERlYyIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6IlN1bmRheSxNb25kYXksVHVlc2RheSxXZWRuZXNkYXksVGh1cnNkYXksRnJpZGF5LFNhdHVyZGF5Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6IlN1bmRheSxNb25kYXksVHVlc2RheSxXZWRuZXNkYXksVGh1cnNkYXksRnJpZGF5LFNhdHVyZGF5Ii5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJTdW4sTW9uLFR1ZSxXZWQsVGh1LEZyaSxTYXQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJTdW4sTW9uLFR1ZSxXZWQsVGh1LEZyaSxTYXQiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJTLE0sVCxXLFQsRixTIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6IlMsTSxULFcsVCxGLFMiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJRMSIsICJRMiIsICJRMyIsIAoiUTQiXSwgUVVBUlRFUlM6WyIxc3QgcXVhcnRlciIsICIybmQgcXVhcnRlciIsICIzcmQgcXVhcnRlciIsICI0dGggcXVhcnRlciJdLCBBTVBNUzpbIkFNIiwgIlBNIl0sIERBVEVGT1JNQVRTOlsiRUVFRSwgZCBNTU1NIHkiLCAiZCBNTU1NIHkiLCAiZCBNTU0geSIsICJkZC9NTS95eXl5Il0sIFRJTUVGT1JNQVRTOlsiSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JRSA9IHtFUkFTOlsiQkMiLCAiQUQiXSwgRVJBTkFNRVM6WyJCZWZvcmUgQ2hyaXN0IiwgIkFubm8gRG9taW5pIl0sIE5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6IkphbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUsSnVseSxBdWd1c3QsU2VwdGVtYmVyLE9jdG9iZXIsTm92ZW1iZXIsRGVjZW1iZXIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6IkphbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUsSnVseSxBdWd1c3QsU2VwdGVtYmVyLE9jdG9iZXIsTm92ZW1iZXIsRGVjZW1iZXIiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKYW4sRmViLE1hcixBcHIsTWF5LEp1bixKdWwsQXVnLFNlcCxPY3QsTm92LERlYyIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJTdW5kYXksTW9uZGF5LFR1ZXNkYXksV2VkbmVzZGF5LFRodXJzZGF5LEZyaWRheSxTYXR1cmRheSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJTdW5kYXksTW9uZGF5LFR1ZXNkYXksV2VkbmVzZGF5LFRodXJzZGF5LEZyaWRheSxTYXR1cmRheSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiU3VuLE1vbixUdWUsV2VkLFRodSxGcmksU2F0Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiU3VuLE1vbixUdWUsV2VkLFRodSxGcmksU2F0Ii5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiUyxNLFQsVyxULEYsUyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJTLE0sVCxXLFQsRixTIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAiUTMiLCAKIlE0Il0sIFFVQVJURVJTOlsiMXN0IHF1YXJ0ZXIiLCAiMm5kIHF1YXJ0ZXIiLCAiM3JkIHF1YXJ0ZXIiLCAiNHRoIHF1YXJ0ZXIiXSwgQU1QTVM6WyJhLm0uIiwgInAubS4iXSwgREFURUZPUk1BVFM6WyJFRUVFIGQgTU1NTSB5IiwgImQgTU1NTSB5IiwgImQgTU1NIHkiLCAiZGQvTU0veXl5eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU4gPSB7RVJBUzpbIkJDIiwgIkFEIl0sIEVSQU5BTUVTOlsiQmVmb3JlIENocmlzdCIsICJBbm5vIERvbWluaSJdLCBOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJKYW51YXJ5LEZlYnJ1YXJ5LE1hcmNoLEFwcmlsLE1heSxKdW5lLEp1bHksQXVndXN0LFNlcHRlbWJlcixPY3RvYmVyLE5vdmVtYmVyLERlY2VtYmVyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJKYW51YXJ5LEZlYnJ1YXJ5LE1hcmNoLEFwcmlsLE1heSxKdW5lLEp1bHksQXVndXN0LFNlcHRlbWJlcixPY3RvYmVyLE5vdmVtYmVyLERlY2VtYmVyIi5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6IkphbixGZWIsTWFyLEFwcixNYXksSnVuLEp1bCxBdWcsU2VwLE9jdCxOb3YsRGVjIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiU3VuZGF5LE1vbmRheSxUdWVzZGF5LFdlZG5lc2RheSxUaHVyc2RheSxGcmlkYXksU2F0dXJkYXkiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiU3VuZGF5LE1vbmRheSxUdWVzZGF5LFdlZG5lc2RheSxUaHVyc2RheSxGcmlkYXksU2F0dXJkYXkiLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6IlN1bixNb24sVHVlLFdlZCxUaHUsRnJpLFNhdCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6IlN1bixNb24sVHVlLFdlZCxUaHUsRnJpLFNhdCIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IlMsTSxULFcsVCxGLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiUyxNLFQsVyxULEYsUyIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIlExIiwgIlEyIiwgIlEzIiwgCiJRNCJdLCBRVUFSVEVSUzpbIjFzdCBxdWFydGVyIiwgIjJuZCBxdWFydGVyIiwgIjNyZCBxdWFydGVyIiwgIjR0aCBxdWFydGVyIl0sIEFNUE1TOlsiQU0iLCAiUE0iXSwgREFURUZPUk1BVFM6WyJFRUVFIGQgTU1NTSB5IiwgImQgTU1NTSB5IiwgImRkLU1NTS15IiwgImRkL01NL3l5Il0sIFRJTUVGT1JNQVRTOlsiaDptbTpzcyBhIHp6enoiLCAiaDptbTpzcyBhIHoiLCAiaDptbTpzcyBhIiwgImg6bW0gYSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzYsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0cgPSB7RVJBUzpbIkJDIiwgIkFEIl0sIEVSQU5BTUVTOlsiQmVmb3JlIENocmlzdCIsICJBbm5vIERvbWluaSJdLCBOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJKYW51YXJ5LEZlYnJ1YXJ5LE1hcmNoLEFwcmlsLE1heSxKdW5lLEp1bHksQXVndXN0LFNlcHRlbWJlcixPY3RvYmVyLE5vdmVtYmVyLERlY2VtYmVyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJKYW51YXJ5LEZlYnJ1YXJ5LE1hcmNoLEFwcmlsLE1heSxKdW5lLEp1bHksQXVndXN0LFNlcHRlbWJlcixPY3RvYmVyLE5vdmVtYmVyLERlY2VtYmVyIi5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6IkphbixGZWIsTWFyLEFwcixNYXksSnVuLEp1bCxBdWcsU2VwLE9jdCxOb3YsRGVjIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiU3VuZGF5LE1vbmRheSxUdWVzZGF5LFdlZG5lc2RheSxUaHVyc2RheSxGcmlkYXksU2F0dXJkYXkiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiU3VuZGF5LE1vbmRheSxUdWVzZGF5LFdlZG5lc2RheSxUaHVyc2RheSxGcmlkYXksU2F0dXJkYXkiLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6IlN1bixNb24sVHVlLFdlZCxUaHUsRnJpLFNhdCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6IlN1bixNb24sVHVlLFdlZCxUaHUsRnJpLFNhdCIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IlMsTSxULFcsVCxGLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiUyxNLFQsVyxULEYsUyIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIlExIiwgIlEyIiwgIlEzIiwgCiJRNCJdLCBRVUFSVEVSUzpbIjFzdCBxdWFydGVyIiwgIjJuZCBxdWFydGVyIiwgIjNyZCBxdWFydGVyIiwgIjR0aCBxdWFydGVyIl0sIEFNUE1TOlsiQU0iLCAiUE0iXSwgREFURUZPUk1BVFM6WyJFRUVFLCBkIE1NTU0sIHkiLCAiZCBNTU1NLCB5IiwgImQgTU1NLCB5IiwgImQvTS95eSJdLCBUSU1FRk9STUFUUzpbImg6bW06c3MgYSB6enp6IiwgImg6bW06c3MgYSB6IiwgImg6bW06c3MgYSIsICJoOm1tIGEiXSwgRklSU1REQVlPRldFRUs6NiwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjJ9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTID0gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbjsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9aQSA9IHtFUkFTOlsiQkMiLCAiQUQiXSwgRVJBTkFNRVM6WyJCZWZvcmUgQ2hyaXN0IiwgIkFubm8gRG9taW5pIl0sIE5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6IkphbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUsSnVseSxBdWd1c3QsU2VwdGVtYmVyLE9jdG9iZXIsTm92ZW1iZXIsRGVjZW1iZXIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6IkphbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUsSnVseSxBdWd1c3QsU2VwdGVtYmVyLE9jdG9iZXIsTm92ZW1iZXIsRGVjZW1iZXIiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKYW4sRmViLE1hcixBcHIsTWF5LEp1bixKdWwsQXVnLFNlcCxPY3QsTm92LERlYyIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJTdW5kYXksTW9uZGF5LFR1ZXNkYXksV2VkbmVzZGF5LFRodXJzZGF5LEZyaWRheSxTYXR1cmRheSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJTdW5kYXksTW9uZGF5LFR1ZXNkYXksV2VkbmVzZGF5LFRodXJzZGF5LEZyaWRheSxTYXR1cmRheSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiU3VuLE1vbixUdWUsV2VkLFRodSxGcmksU2F0Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiU3VuLE1vbixUdWUsV2VkLFRodSxGcmksU2F0Ii5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiUyxNLFQsVyxULEYsUyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJTLE0sVCxXLFQsRixTIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAiUTMiLCAKIlE0Il0sIFFVQVJURVJTOlsiMXN0IHF1YXJ0ZXIiLCAiMm5kIHF1YXJ0ZXIiLCAiM3JkIHF1YXJ0ZXIiLCAiNHRoIHF1YXJ0ZXIiXSwgQU1QTVM6WyJBTSIsICJQTSJdLCBEQVRFRk9STUFUUzpbIkVFRUUgZGQgTU1NTSB5IiwgImRkIE1NTU0geSIsICJkZCBNTU0geSIsICJ5eXl5L01NL2RkIl0sIFRJTUVGT1JNQVRTOlsiaDptbTpzcyBhIHp6enoiLCAiaDptbTpzcyBhIHoiLCAiaDptbTpzcyBhIiwgImg6bW0gYSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXMgPSB7RVJBUzpbImEuQy4iLCAiZC5DLiJdLCBFUkFOQU1FUzpbImFudGVzIGRlIENyaXN0byIsICJhbm5vIERcdTAwZjNtaW5pIl0sIE5BUlJPV01PTlRIUzoiRSxGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkUsRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6ImVuZXJvLGZlYnJlcm8sbWFyem8sYWJyaWwsbWF5byxqdW5pbyxqdWxpbyxhZ29zdG8sc2VwdGllbWJyZSxvY3R1YnJlLG5vdmllbWJyZSxkaWNpZW1icmUiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6ImVuZXJvLGZlYnJlcm8sbWFyem8sYWJyaWwsbWF5byxqdW5pbyxqdWxpbyxhZ29zdG8sc2VwdGllbWJyZSxvY3R1YnJlLG5vdmllbWJyZSxkaWNpZW1icmUiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJlbmUsZmViLG1hcixhYnIsbWF5LGp1bixqdWwsYWdvLHNlcCxvY3Qsbm92LGRpYyIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiZW5lLGZlYixtYXIsYWJyLG1heW8sanVuLGp1bCxhZ28sc2VwLG9jdCxub3YsZGljIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiZG9taW5nbyxsdW5lcyxtYXJ0ZXMsbWlcdTAwZTlyY29sZXMsanVldmVzLHZpZXJuZXMsc1x1MDBlMWJhZG8iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiZG9taW5nbyxsdW5lcyxtYXJ0ZXMsbWlcdTAwZTlyY29sZXMsanVldmVzLHZpZXJuZXMsc1x1MDBlMWJhZG8iLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6ImRvbSxsdW4sbWFyLG1pXHUwMGU5LGp1ZSx2aWUsc1x1MDBlMWIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJkb20sbHVuLG1hcixtaVx1MDBlOSxqdWUsdmllLHNcdTAwZTFiIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiRCxMLE0sTSxKLFYsUyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJELEwsTSxNLEosVixTIi5zcGxpdCgiLCIpLCAKU0hPUlRRVUFSVEVSUzpbIlQxIiwgIlQyIiwgIlQzIiwgIlQ0Il0sIFFVQVJURVJTOlsiMWVyIHRyaW1lc3RyZSIsICIyXHUwMGJhIHRyaW1lc3RyZSIsICIzZXIgdHJpbWVzdHJlIiwgIjRcdTAwYmEgdHJpbWVzdHJlIl0sIEFNUE1TOlsiYS5tLiIsICJwLm0uIl0sIERBVEVGT1JNQVRTOlsiRUVFRSBkICdkZScgTU1NTSAnZGUnIHkiLCAiZCAnZGUnIE1NTU0gJ2RlJyB5IiwgImRkL01NL3l5eXkiLCAiZGQvTU0veXkiXSwgVElNRUZPUk1BVFM6WyJISDptbTpzcyB6enp6IiwgIkhIOm1tOnNzIHoiLCAiSEg6bW06c3MiLCAiSEg6bW0iXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzXzQxOSA9IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXM7Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXQgPSB7RVJBUzpbImUubS5hLiIsICJtLmEuai4iXSwgRVJBTkFNRVM6WyJlbm5lIG1laWUgYWVnYSIsICJtZWllIGFqYSBqXHUwMGU0cmdpIl0sIE5BUlJPV01PTlRIUzoiSixWLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkosVixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6ImphYW51YXIsdmVlYnJ1YXIsbVx1MDBlNHJ0cyxhcHJpbGwsbWFpLGp1dW5pLGp1dWxpLGF1Z3VzdCxzZXB0ZW1iZXIsb2t0b29iZXIsbm92ZW1iZXIsZGV0c2VtYmVyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJqYWFudWFyLHZlZWJydWFyLG1cdTAwZTRydHMsYXByaWxsLG1haSxqdXVuaSxqdXVsaSxhdWd1c3Qsc2VwdGVtYmVyLG9rdG9vYmVyLG5vdmVtYmVyLGRldHNlbWJlciIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6ImphYW4sdmVlYnIsbVx1MDBlNHJ0cyxhcHIsbWFpLGp1dW5pLGp1dWxpLGF1ZyxzZXB0LG9rdCxub3YsZGV0cyIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiamFhbix2ZWVicixtXHUwMGU0cnRzLGFwcixtYWksanV1bmksanV1bGksYXVnLHNlcHQsb2t0LG5vdixkZXRzIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoicFx1MDBmY2hhcFx1MDBlNGV2LGVzbWFzcFx1MDBlNGV2LHRlaXNpcFx1MDBlNGV2LGtvbG1hcFx1MDBlNGV2LG5lbGphcFx1MDBlNGV2LHJlZWRlLGxhdXBcdTAwZTRldiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJwXHUwMGZjaGFwXHUwMGU0ZXYsZXNtYXNwXHUwMGU0ZXYsdGVpc2lwXHUwMGU0ZXYsa29sbWFwXHUwMGU0ZXYsbmVsamFwXHUwMGU0ZXYscmVlZGUsbGF1cFx1MDBlNGV2Ii5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJQLEUsVCxLLE4sUixMIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiUCxFLFQsSyxOLFIsTCIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IlAsRSxULEssTixSLEwiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiUCxFLFQsSyxOLFIsTCIuc3BsaXQoIiwiKSwgClNIT1JUUVVBUlRFUlM6WyJLMSIsICJLMiIsICJLMyIsICJLNCJdLCBRVUFSVEVSUzpbIjEuIGt2YXJ0YWwiLCAiMi4ga3ZhcnRhbCIsICIzLiBrdmFydGFsIiwgIjQuIGt2YXJ0YWwiXSwgQU1QTVM6WyJlbm5lIGtlc2twXHUwMGU0ZXZhIiwgInBcdTAwZTRyYXN0IGtlc2twXHUwMGU0ZXZhIl0sIERBVEVGT1JNQVRTOlsiRUVFRSwgZC4gTU1NTSB5IiwgImQuIE1NTU0geSIsICJkZC5NTS55eXl5IiwgImRkLk1NLnl5Il0sIFRJTUVGT1JNQVRTOlsiSDptbS5zcyB6enp6IiwgIkg6bW0uc3MgeiIsICJIOm1tLnNzIiwgIkg6bW0iXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V1ID0ge0VSQVM6WyJLLmEuIiwgIksuby4iXSwgRVJBTkFNRVM6WyJLLmEuIiwgIksuby4iXSwgTkFSUk9XTU9OVEhTOiJVLE8sTSxBLE0sRSxVLEEsSSxVLEEsQSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiVSxPLE0sQSxNLEUsVSxBLEksVSxBLEEiLnNwbGl0KCIsIiksIE1PTlRIUzoidXJ0YXJyaWxhLG90c2FpbGEsbWFydHhvYSxhcGlyaWxhLG1haWF0emEsZWthaW5hLHV6dGFpbGEsYWJ1enR1YSxpcmFpbGEsdXJyaWEsYXphcm9hLGFiZW5kdWEiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6InVydGFycmlsYSxvdHNhaWxhLG1hcnR4b2EsYXBpcmlsYSxtYWlhdHphLGVrYWluYSx1enRhaWxhLGFidXp0dWEsaXJhaWxhLHVycmlhLGF6YXJvYSxhYmVuZHVhIi5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoidXJ0LG90cyxtYXIsYXBpLG1haSxla2EsdXp0LGFidSxpcmEsdXJyLGF6YSxhYmUiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6InVydCxvdHMsbWFyLGFwaSxtYWksZWthLHV6dCxhYnUsaXJhLHVycixhemEsYWJlIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiaWdhbmRlYSxhc3RlbGVoZW5hLGFzdGVhcnRlYSxhc3RlYXprZW5hLG9zdGVndW5hLG9zdGlyYWxhLGxhcnVuYmF0YSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJpZ2FuZGVhLGFzdGVsZWhlbmEsYXN0ZWFydGVhLGFzdGVhemtlbmEsb3N0ZWd1bmEsb3N0aXJhbGEsbGFydW5iYXRhIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJpZyxhbCxhcyxheixvZyxvcixsciIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6ImlnLGFsLGFzLGF6LG9nLG9yLGxyIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiSSxNLEEsQSxBLE8sSSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJJLE0sQSxMLEEsTyxJIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiMUhoIiwgCiIySGgiLCAiM0hoIiwgIjRIaCJdLCBRVUFSVEVSUzpbIjEuIGhpcnVoaWxla29hIiwgIjIuIGhpcnVoaWxla29hIiwgIjMuIGhpcnVoaWxla29hIiwgIjQuIGhpcnVoaWxla29hIl0sIEFNUE1TOlsiQU0iLCAiUE0iXSwgREFURUZPUk1BVFM6WyJFRUVFLCB5J2VrbycgTU1NTSdyZW4nIGRkJ2EnIiwgInknZWtvJyBNTU0ncmVuJyBkZCdhJyIsICJ5IE1NTSBkIiwgInl5eXktTU0tZGQiXSwgVElNRUZPUk1BVFM6WyJISDptbTpzcyB6enp6IiwgIkhIOm1tOnNzIHoiLCAiSEg6bW06c3MiLCAiSEg6bW0iXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhID0ge0VSQVM6WyJcdTA2NDIuXHUwNjQ1LiIsICJcdTA2NDUuIl0sIEVSQU5BTUVTOlsiXHUwNjQyXHUwNjI4XHUwNjQ0IFx1MDYyN1x1MDYzMiBcdTA2NDVcdTA2Y2NcdTA2NDRcdTA2MjdcdTA2MmYiLCAiXHUwNjQ1XHUwNmNjXHUwNjQ0XHUwNjI3XHUwNjJmXHUwNmNjIl0sIE5BUlJPV01PTlRIUzoiXHUwNjk4LFx1MDY0MSxcdTA2NDUsXHUwNjIyLFx1MDY0NSxcdTA2OTgsXHUwNjk4LFx1MDYyNyxcdTA2MzMsXHUwNjI3LFx1MDY0NixcdTA2MmYiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MDY5OCxcdTA2NDEsXHUwNjQ1LFx1MDYyMixcdTA2NDUsXHUwNjk4LFx1MDY5OCxcdTA2MjcsXHUwNjMzLFx1MDYyNyxcdTA2NDYsXHUwNjJmIi5zcGxpdCgiLCIpLCBNT05USFM6Ilx1MDY5OFx1MDYyN1x1MDY0Nlx1MDY0OFx1MDZjY1x1MDY0N1x1MDY1NCxcdTA2NDFcdTA2NDhcdTA2MzFcdTA2Y2NcdTA2NDdcdTA2NTQsXHUwNjQ1XHUwNjI3XHUwNjMxXHUwNjMzLFx1MDYyMlx1MDY0OFx1MDYzMVx1MDZjY1x1MDY0NCxcdTA2NDVcdTA2NDdcdTA2NTQsXHUwNjk4XHUwNjQ4XHUwNjI2XHUwNjQ2LFx1MDY5OFx1MDY0OFx1MDYyNlx1MDZjY1x1MDY0N1x1MDY1NCxcdTA2MjdcdTA2NDhcdTA2MmEsXHUwNjMzXHUwNjdlXHUwNjJhXHUwNjI3XHUwNjQ1XHUwNjI4XHUwNjMxLFx1MDYyN1x1MDZhOVx1MDYyYVx1MDYyOFx1MDYzMSxcdTA2NDZcdTA2NDhcdTA2MjdcdTA2NDVcdTA2MjhcdTA2MzEsXHUwNjJmXHUwNjMzXHUwNjI3XHUwNjQ1XHUwNjI4XHUwNjMxIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORU1PTlRIUzoiXHUwNjk4XHUwNjI3XHUwNjQ2XHUwNjQ4XHUwNmNjXHUwNjQ3LFx1MDY0MVx1MDY0OFx1MDYzMVx1MDZjY1x1MDY0NyxcdTA2NDVcdTA2MjdcdTA2MzFcdTA2MzMsXHUwNjIyXHUwNjQ4XHUwNjMxXHUwNmNjXHUwNjQ0LFx1MDY0NVx1MDY0NyxcdTA2OThcdTA2NDhcdTA2MjZcdTA2NDYsXHUwNjk4XHUwNjQ4XHUwNjI2XHUwNmNjXHUwNjQ3LFx1MDYyN1x1MDY0OFx1MDYyYSxcdTA2MzNcdTA2N2VcdTA2MmFcdTA2MjdcdTA2NDVcdTA2MjhcdTA2MzEsXHUwNjI3XHUwNmE5XHUwNjJhXHUwNjI4XHUwNjMxLFx1MDY0Nlx1MDY0OFx1MDYyN1x1MDY0NVx1MDYyOFx1MDYzMSxcdTA2MmZcdTA2MzNcdTA2MjdcdTA2NDVcdTA2MjhcdTA2MzEiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJcdTA2OThcdTA2MjdcdTA2NDZcdTA2NDhcdTA2Y2NcdTA2NDdcdTA2NTQsXHUwNjQxXHUwNjQ4XHUwNjMxXHUwNmNjXHUwNjQ3XHUwNjU0LFx1MDY0NVx1MDYyN1x1MDYzMVx1MDYzMyxcdTA2MjJcdTA2NDhcdTA2MzFcdTA2Y2NcdTA2NDQsXHUwNjQ1XHUwNjQ3XHUwNjU0LFx1MDY5OFx1MDY0OFx1MDYyNlx1MDY0NixcdTA2OThcdTA2NDhcdTA2MjZcdTA2Y2NcdTA2NDdcdTA2NTQsXHUwNjI3XHUwNjQ4XHUwNjJhLFx1MDYzM1x1MDY3ZVx1MDYyYVx1MDYyN1x1MDY0NVx1MDYyOFx1MDYzMSxcdTA2MjdcdTA2YTlcdTA2MmFcdTA2MjhcdTA2MzEsXHUwNjQ2XHUwNjQ4XHUwNjI3XHUwNjQ1XHUwNjI4XHUwNjMxLFx1MDYyZlx1MDYzM1x1MDYyN1x1MDY0NVx1MDYyOFx1MDYzMSIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwNjk4XHUwNjI3XHUwNjQ2XHUwNjQ4XHUwNmNjXHUwNjQ3LFx1MDY0MVx1MDY0OFx1MDYzMVx1MDZjY1x1MDY0NyxcdTA2NDVcdTA2MjdcdTA2MzFcdTA2MzMsXHUwNjIyXHUwNjQ4XHUwNjMxXHUwNmNjXHUwNjQ0LFx1MDY0NVx1MDY0NyxcdTA2OThcdTA2NDhcdTA2MjZcdTA2NDYsXHUwNjk4XHUwNjQ4XHUwNjI2XHUwNmNjXHUwNjQ3LFx1MDYyN1x1MDY0OFx1MDYyYSxcdTA2MzNcdTA2N2VcdTA2MmFcdTA2MjdcdTA2NDVcdTA2MjhcdTA2MzEsXHUwNjI3XHUwNmE5XHUwNjJhXHUwNjI4XHUwNjMxLFx1MDY0Nlx1MDY0OFx1MDYyN1x1MDY0NVx1MDYyOFx1MDYzMSxcdTA2MmZcdTA2MzNcdTA2MjdcdTA2NDVcdTA2MjhcdTA2MzEiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJcdTA2Y2NcdTA2YTlcdTA2MzRcdTA2NDZcdTA2MjhcdTA2NDcsXHUwNjJmXHUwNjQ4XHUwNjM0XHUwNjQ2XHUwNjI4XHUwNjQ3LFx1MDYzM1x1MDY0N1x1MjAwY1x1MDYzNFx1MDY0Nlx1MDYyOFx1MDY0NyxcdTA2ODZcdTA2NDdcdTA2MjdcdTA2MzFcdTA2MzRcdTA2NDZcdTA2MjhcdTA2NDcsXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjM0XHUwNjQ2XHUwNjI4XHUwNjQ3LFx1MDYyY1x1MDY0NVx1MDYzOVx1MDY0NyxcdTA2MzRcdTA2NDZcdTA2MjhcdTA2NDciLnNwbGl0KCIsIiksIApTVEFOREFMT05FV0VFS0RBWVM6Ilx1MDZjY1x1MDZhOVx1MDYzNFx1MDY0Nlx1MDYyOFx1MDY0NyxcdTA2MmZcdTA2NDhcdTA2MzRcdTA2NDZcdTA2MjhcdTA2NDcsXHUwNjMzXHUwNjQ3XHUyMDBjXHUwNjM0XHUwNjQ2XHUwNjI4XHUwNjQ3LFx1MDY4Nlx1MDY0N1x1MDYyN1x1MDYzMVx1MDYzNFx1MDY0Nlx1MDYyOFx1MDY0NyxcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MzRcdTA2NDZcdTA2MjhcdTA2NDcsXHUwNjJjXHUwNjQ1XHUwNjM5XHUwNjQ3LFx1MDYzNFx1MDY0Nlx1MDYyOFx1MDY0NyIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiXHUwNmNjXHUwNmE5XHUwNjM0XHUwNjQ2XHUwNjI4XHUwNjQ3LFx1MDYyZlx1MDY0OFx1MDYzNFx1MDY0Nlx1MDYyOFx1MDY0NyxcdTA2MzNcdTA2NDdcdTIwMGNcdTA2MzRcdTA2NDZcdTA2MjhcdTA2NDcsXHUwNjg2XHUwNjQ3XHUwNjI3XHUwNjMxXHUwNjM0XHUwNjQ2XHUwNjI4XHUwNjQ3LFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYzNFx1MDY0Nlx1MDYyOFx1MDY0NyxcdTA2MmNcdTA2NDVcdTA2MzlcdTA2NDcsXHUwNjM0XHUwNjQ2XHUwNjI4XHUwNjQ3Ii5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MDZjY1x1MDZhOVx1MDYzNFx1MDY0Nlx1MDYyOFx1MDY0NyxcdTA2MmZcdTA2NDhcdTA2MzRcdTA2NDZcdTA2MjhcdTA2NDcsXHUwNjMzXHUwNjQ3XHUyMDBjXHUwNjM0XHUwNjQ2XHUwNjI4XHUwNjQ3LFx1MDY4Nlx1MDY0N1x1MDYyN1x1MDYzMVx1MDYzNFx1MDY0Nlx1MDYyOFx1MDY0NyxcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MzRcdTA2NDZcdTA2MjhcdTA2NDcsXHUwNjJjXHUwNjQ1XHUwNjM5XHUwNjQ3LFx1MDYzNFx1MDY0Nlx1MDYyOFx1MDY0NyIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1MDZjYyxcdTA2MmYsXHUwNjMzLFx1MDY4NixcdTA2N2UsXHUwNjJjLFx1MDYzNCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTA2Y2MsXHUwNjJmLFx1MDYzMyxcdTA2ODYsXHUwNjdlLFx1MDYyYyxcdTA2MzQiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJcdTA2MzNcdTIwMGNcdTA2NDVcdTA2ZjEiLCAKIlx1MDYzM1x1MjAwY1x1MDY0NVx1MDZmMiIsICJcdTA2MzNcdTIwMGNcdTA2NDVcdTA2ZjMiLCAiXHUwNjMzXHUyMDBjXHUwNjQ1XHUwNmY0Il0sIFFVQVJURVJTOlsiXHUwNjMzXHUwNjQ3XHUyMDBjXHUwNjQ1XHUwNjI3XHUwNjQ3XHUwNjQ3XHUwNjU0IFx1MDYyN1x1MDY0OFx1MDY0NCIsICJcdTA2MzNcdTA2NDdcdTIwMGNcdTA2NDVcdTA2MjdcdTA2NDdcdTA2NDdcdTA2NTQgXHUwNjJmXHUwNjQ4XHUwNjQ1IiwgIlx1MDYzM1x1MDY0N1x1MjAwY1x1MDY0NVx1MDYyN1x1MDY0N1x1MDY0N1x1MDY1NCBcdTA2MzNcdTA2NDhcdTA2NDUiLCAiXHUwNjMzXHUwNjQ3XHUyMDBjXHUwNjQ1XHUwNjI3XHUwNjQ3XHUwNjQ3XHUwNjU0IFx1MDY4Nlx1MDY0N1x1MDYyN1x1MDYzMVx1MDY0NSJdLCBBTVBNUzpbIlx1MDY0Mlx1MDYyOFx1MDY0NFx1MjAwY1x1MDYyN1x1MDYzMlx1MDYzOFx1MDY0N1x1MDYzMSIsICJcdTA2MjhcdTA2MzlcdTA2MmZcdTA2MjdcdTA2MzJcdTA2MzhcdTA2NDdcdTA2MzEiXSwgCkRBVEVGT1JNQVRTOlsiRUVFRSBkIE1NTU0geSIsICJkIE1NTU0geSIsICJkIE1NTSB5IiwgInl5eXkvTS9kIl0sIFRJTUVGT1JNQVRTOlsiSDptbTpzcyAoenp6eikiLCAiSDptbTpzcyAoeikiLCAiSDptbTpzcyIsICJIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjUsIFdFRUtFTkRSQU5HRTpbMywgNF0sIEZJUlNUV0VFS0NVVE9GRkRBWToxfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19maSA9IHtFUkFTOlsiZUtyLiIsICJqS3IuIl0sIEVSQU5BTUVTOlsiZW5uZW4gS3Jpc3R1a3NlbiBzeW50eW1cdTAwZTRcdTAwZTQiLCAialx1MDBlNGxrZWVuIEtyaXN0dWtzZW4gc3ludHltXHUwMGU0biJdLCBOQVJST1dNT05USFM6IlQsSCxNLEgsVCxLLEgsRSxTLEwsTSxKIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJULEgsTSxILFQsSyxILEUsUyxMLE0sSiIuc3BsaXQoIiwiKSwgTU9OVEhTOiJ0YW1taWt1dXRhLGhlbG1pa3V1dGEsbWFhbGlza3V1dGEsaHVodGlrdXV0YSx0b3Vrb2t1dXRhLGtlc1x1MDBlNGt1dXRhLGhlaW5cdTAwZTRrdXV0YSxlbG9rdXV0YSxzeXlza3V1dGEsbG9rYWt1dXRhLG1hcnJhc2t1dXRhLGpvdWx1a3V1dGEiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6InRhbW1pa3V1LGhlbG1pa3V1LG1hYWxpc2t1dSxodWh0aWt1dSx0b3Vrb2t1dSxrZXNcdTAwZTRrdXUsaGVpblx1MDBlNGt1dSxlbG9rdXUsc3l5c2t1dSxsb2tha3V1LG1hcnJhc2t1dSxqb3VsdWt1dSIuc3BsaXQoIiwiKSwgClNIT1JUTU9OVEhTOiJ0YW1taWt1dXRhLGhlbG1pa3V1dGEsbWFhbGlza3V1dGEsaHVodGlrdXV0YSx0b3Vrb2t1dXRhLGtlc1x1MDBlNGt1dXRhLGhlaW5cdTAwZTRrdXV0YSxlbG9rdXV0YSxzeXlza3V1dGEsbG9rYWt1dXRhLG1hcnJhc2t1dXRhLGpvdWx1a3V1dGEiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoidGFtbWksaGVsbWksbWFhbGlzLGh1aHRpLHRvdWtvLGtlc1x1MDBlNCxoZWluXHUwMGU0LGVsbyxzeXlzLGxva2EsbWFycmFzLGpvdWx1Ii5zcGxpdCgiLCIpLCBXRUVLREFZUzoic3VubnVudGFpbmEsbWFhbmFudGFpbmEsdGlpc3RhaW5hLGtlc2tpdmlpa2tvbmEsdG9yc3RhaW5hLHBlcmphbnRhaW5hLGxhdWFudGFpbmEiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoic3VubnVudGFpLG1hYW5hbnRhaSx0aWlzdGFpLGtlc2tpdmlpa2tvLHRvcnN0YWkscGVyamFudGFpLGxhdWFudGFpIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJzdSxtYSx0aSxrZSx0byxwZSxsYSIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJzdSxtYSx0aSxrZSx0byxwZSxsYSIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IlMsTSxULEssVCxQLEwiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiUyxNLFQsSyxULFAsTCIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIjEuIG5lbGouIiwgIjIuIG5lbGouIiwgIjMuIG5lbGouIiwgIjQuIG5lbGouIl0sIFFVQVJURVJTOlsiMS4gbmVsalx1MDBlNG5uZXMiLCAiMi4gbmVsalx1MDBlNG5uZXMiLCAiMy4gbmVsalx1MDBlNG5uZXMiLCAiNC4gbmVsalx1MDBlNG5uZXMiXSwgQU1QTVM6WyJhcC4iLCAiaXAuIl0sIERBVEVGT1JNQVRTOlsiY2NjYywgZC4gTU1NTSB5IiwgImQuIE1NTU0geSIsICJkLk0ueXl5eSIsICJkLk0ueXl5eSJdLCBUSU1FRk9STUFUUzpbIkgubW0uc3Mgenp6eiIsICJILm1tLnNzIHoiLCAiSC5tbS5zcyIsICJILm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgCjZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlsID0ge0VSQVM6WyJCQyIsICJBRCJdLCBFUkFOQU1FUzpbIkJDIiwgIkFEIl0sIE5BUlJPV01PTlRIUzoiRSxQLE0sQSxNLEgsSCxBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkUsUCxNLEEsTSxILEgsQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6IkVuZXJvLFBlYnJlcm8sTWFyc28sQWJyaWwsTWF5byxIdW55byxIdWx5byxBZ29zdG8sU2V0eWVtYnJlLE9rdHVicmUsTm9ieWVtYnJlLERpc3llbWJyZSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiRW5lcm8sUGVicmVybyxNYXJzbyxBYnJpbCxNYXlvLEh1bnlvLEh1bHlvLEFnb3N0byxTZXR5ZW1icmUsT2t0dWJyZSxOb2J5ZW1icmUsRGlzeWVtYnJlIi5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiRW5lLFBlYixNYXIsQWJyLE1heSxIdW4sSHVsLEFnbyxTZXQsT2t0LE5vYixEaXMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiRW5lLFBlYixNYXIsQWJyLE1heSxIdW4sSHVsLEFnbyxTZXQsT2t0LE5vYixEaXMiLnNwbGl0KCIsIiksIApXRUVLREFZUzoiTGluZ2dvLEx1bmVzLE1hcnRlcyxNaXllcmt1bGVzLEh1d2ViZXMsQml5ZXJuZXMsU2FiYWRvIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6IkxpbmdnbyxMdW5lcyxNYXJ0ZXMsTWl5ZXJrdWxlcyxIdXdlYmVzLEJpeWVybmVzLFNhYmFkbyIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiTGluLEx1bixNYXIsTXllLEh1dyxCeWUsU2FiIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiTGluLEx1bixNYXIsTWl5LEh1dyxCaXksU2FiIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiTCxMLE0sTSxILEIsUyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJMLEwsTSxNLEgsQixTIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAiUTMiLCAiUTQiXSwgUVVBUlRFUlM6WyJpa2EtMSBzYW5na2FwYXQiLCAiaWthLTIgc2FuZ2thcGF0IiwgImlrYS0zIHF1YXJ0ZXIiLCAiaWthLTQgbmEgcXVhcnRlciJdLCAKQU1QTVM6WyJBTSIsICJQTSJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIE1NTU0gZGQgeSIsICJNTU1NIGQsIHkiLCAiTU1NIGQsIHkiLCAiTS9kL3l5Il0sIFRJTUVGT1JNQVRTOlsiSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjYsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWToyfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mciA9IHtFUkFTOlsiYXYuIEouLUMuIiwgImFwLiBKLi1DLiJdLCBFUkFOQU1FUzpbImF2YW50IEpcdTAwZTlzdXMtQ2hyaXN0IiwgImFwclx1MDBlOHMgSlx1MDBlOXN1cy1DaHJpc3QiXSwgTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIE1PTlRIUzoiamFudmllcixmXHUwMGU5dnJpZXIsbWFycyxhdnJpbCxtYWksanVpbixqdWlsbGV0LGFvXHUwMGZidCxzZXB0ZW1icmUsb2N0b2JyZSxub3ZlbWJyZSxkXHUwMGU5Y2VtYnJlIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJqYW52aWVyLGZcdTAwZTl2cmllcixtYXJzLGF2cmlsLG1haSxqdWluLGp1aWxsZXQsYW9cdTAwZmJ0LHNlcHRlbWJyZSxvY3RvYnJlLG5vdmVtYnJlLGRcdTAwZTljZW1icmUiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJqYW52LixmXHUwMGU5dnIuLG1hcnMsYXZyLixtYWksanVpbixqdWlsLixhb1x1MDBmYnQsc2VwdC4sb2N0Lixub3YuLGRcdTAwZTljLiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiamFudi4sZlx1MDBlOXZyLixtYXJzLGF2ci4sbWFpLGp1aW4sanVpbC4sYW9cdTAwZmJ0LHNlcHQuLG9jdC4sbm92LixkXHUwMGU5Yy4iLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJkaW1hbmNoZSxsdW5kaSxtYXJkaSxtZXJjcmVkaSxqZXVkaSx2ZW5kcmVkaSxzYW1lZGkiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiZGltYW5jaGUsbHVuZGksbWFyZGksbWVyY3JlZGksamV1ZGksdmVuZHJlZGksc2FtZWRpIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJkaW0uLGx1bi4sbWFyLixtZXIuLGpldS4sdmVuLixzYW0uIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiZGltLixsdW4uLG1hci4sbWVyLixqZXUuLHZlbi4sc2FtLiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IkQsTCxNLE0sSixWLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiRCxMLE0sTSxKLFYsUyIuc3BsaXQoIiwiKSwgClNIT1JUUVVBUlRFUlM6WyJUMSIsICJUMiIsICJUMyIsICJUNCJdLCBRVUFSVEVSUzpbIjFlciB0cmltZXN0cmUiLCAiMmUgdHJpbWVzdHJlIiwgIjNlIHRyaW1lc3RyZSIsICI0ZSB0cmltZXN0cmUiXSwgQU1QTVM6WyJBTSIsICJQTSJdLCBEQVRFRk9STUFUUzpbIkVFRUUgZCBNTU1NIHkiLCAiZCBNTU1NIHkiLCAiZCBNTU0geSIsICJkZC9NTS95eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0EgPSB7RVJBUzpbImF2LiBKLi1DLiIsICJhcC4gSi4tQy4iXSwgRVJBTkFNRVM6WyJhdmFudCBKXHUwMGU5c3VzLUNocmlzdCIsICJhcHJcdTAwZThzIEpcdTAwZTlzdXMtQ2hyaXN0Il0sIE5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6ImphbnZpZXIsZlx1MDBlOXZyaWVyLG1hcnMsYXZyaWwsbWFpLGp1aW4sanVpbGxldCxhb1x1MDBmYnQsc2VwdGVtYnJlLG9jdG9icmUsbm92ZW1icmUsZFx1MDBlOWNlbWJyZSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiamFudmllcixmXHUwMGU5dnJpZXIsbWFycyxhdnJpbCxtYWksanVpbixqdWlsbGV0LGFvXHUwMGZidCxzZXB0ZW1icmUsb2N0b2JyZSxub3ZlbWJyZSxkXHUwMGU5Y2VtYnJlIi5zcGxpdCgiLCIpLCAKU0hPUlRNT05USFM6ImphbnYuLGZcdTAwZTl2ci4sbWFycyxhdnIuLG1haSxqdWluLGp1aWwuLGFvXHUwMGZidCxzZXB0LixvY3QuLG5vdi4sZFx1MDBlOWMuIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRNT05USFM6ImphbnYuLGZcdTAwZTl2ci4sbWFycyxhdnIuLG1haSxqdWluLGp1aWwuLGFvXHUwMGZidCxzZXB0LixvY3QuLG5vdi4sZFx1MDBlOWMuIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiZGltYW5jaGUsbHVuZGksbWFyZGksbWVyY3JlZGksamV1ZGksdmVuZHJlZGksc2FtZWRpIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6ImRpbWFuY2hlLGx1bmRpLG1hcmRpLG1lcmNyZWRpLGpldWRpLHZlbmRyZWRpLHNhbWVkaSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiZGltLixsdW4uLG1hci4sbWVyLixqZXUuLHZlbi4sc2FtLiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6ImRpbS4sbHVuLixtYXIuLG1lci4samV1Lix2ZW4uLHNhbS4iLnNwbGl0KCIsIiksIApOQVJST1dXRUVLREFZUzoiRCxMLE0sTSxKLFYsUyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJELEwsTSxNLEosVixTIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiVDEiLCAiVDIiLCAiVDMiLCAiVDQiXSwgUVVBUlRFUlM6WyIxZXIgdHJpbWVzdHJlIiwgIjJlIHRyaW1lc3RyZSIsICIzZSB0cmltZXN0cmUiLCAiNGUgdHJpbWVzdHJlIl0sIEFNUE1TOlsiQU0iLCAiUE0iXSwgREFURUZPUk1BVFM6WyJFRUVFIGQgTU1NTSB5IiwgImQgTU1NTSB5IiwgInl5eXktTU0tZGQiLCAieXktTU0tZGQiXSwgVElNRUZPUk1BVFM6WyJISCAnaCcgbW0gJ21pbicgc3MgJ3MnIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2wgPSB7RVJBUzpbImEuQy4iLCAiZC5DLiJdLCBFUkFOQU1FUzpbImFudGVzIGRlIENyaXN0byIsICJkZXNwb2lzIGRlIENyaXN0byJdLCBOQVJST1dNT05USFM6IlgsRixNLEEsTSxYLFgsQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJYLEYsTSxBLE0sWCxYLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJYYW5laXJvLEZlYnJlaXJvLE1hcnpvLEFicmlsLE1haW8sWHVcdTAwZjFvLFh1bGxvLEFnb3N0byxTZXRlbWJybyxPdXR1YnJvLE5vdmVtYnJvLERlY2VtYnJvIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJYYW5laXJvLEZlYnJlaXJvLE1hcnpvLEFicmlsLE1haW8sWHVcdTAwZjFvLFh1bGxvLEFnb3N0byxTZXRlbWJybyxPdXR1YnJvLE5vdmVtYnJvLERlY2VtYnJvIi5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiWGFuLEZlYixNYXIsQWJyLE1haSxYdVx1MDBmMSxYdWwsQWdvLFNldCxPdXQsTm92LERlYyIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiWGFuLEZlYixNYXIsQWJyLE1haSxYdVx1MDBmMSxYdWwsQWdvLFNldCxPdXQsTm92LERlYyIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6IkRvbWluZ28sTHVucyxNYXJ0ZXMsTVx1MDBlOXJjb3JlcyxYb3ZlcyxWZW5yZXMsU1x1MDBlMWJhZG8iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiRG9taW5nbyxMdW5zLE1hcnRlcyxNXHUwMGU5cmNvcmVzLFhvdmVzLFZlbnJlcyxTXHUwMGUxYmFkbyIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiRG9tLEx1bixNYXIsTVx1MDBlOXIsWG92LFZlbixTXHUwMGUxYiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6IkRvbSxMdW4sTWFyLE1cdTAwZTlyLFhvdixWZW4sU1x1MDBlMWIiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJELEwsTSxNLFgsVixTIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6IkQsTCxNLE0sWCxWLFMiLnNwbGl0KCIsIiksIApTSE9SVFFVQVJURVJTOlsiVDEiLCAiVDIiLCAiVDMiLCAiVDQiXSwgUVVBUlRFUlM6WyIxbyB0cmltZXN0cmUiLCAiMm8gdHJpbWVzdHJlIiwgIjNvIHRyaW1lc3RyZSIsICI0byB0cmltZXN0cmUiXSwgQU1QTVM6WyJhLm0uIiwgInAubS4iXSwgREFURUZPUk1BVFM6WyJFRUVFIGRkIE1NTU0geSIsICJkZCBNTU1NIHkiLCAiZCBNTU0sIHkiLCAiZGQvTU0veXkiXSwgVElNRUZPUk1BVFM6WyJISDptbTpzcyB6enp6IiwgIkhIOm1tOnNzIHoiLCAiSEg6bW06c3MiLCAiSEg6bW0iXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dzdyA9IHtFUkFTOlsidi4gQ2hyLiIsICJuLiBDaHIuIl0sIEVSQU5BTUVTOlsidi4gQ2hyLiIsICJuLiBDaHIuIl0sIE5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6IkphbnVhcixGZWJydWFyLE1cdTAwZTRyeixBcHJpbCxNYWksSnVuaSxKdWxpLEF1Z3VzY2h0LFNlcHRcdTAwZTRtYmVyLE9rdG9vYmVyLE5vdlx1MDBlNG1iZXIsRGV6XHUwMGU0bWJlciIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiSmFudWFyLEZlYnJ1YXIsTVx1MDBlNHJ6LEFwcmlsLE1haSxKdW5pLEp1bGksQXVndXNjaHQsU2VwdFx1MDBlNG1iZXIsT2t0b29iZXIsTm92XHUwMGU0bWJlcixEZXpcdTAwZTRtYmVyIi5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiSmFuLEZlYixNXHUwMGU0cixBcHIsTWFpLEp1bixKdWwsQXVnLFNlcCxPa3QsTm92LERleiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiSmFuLEZlYixNXHUwMGU0cixBcHIsTWFpLEp1bixKdWwsQXVnLFNlcCxPa3QsTm92LERleiIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6IlN1bm50aWcsTVx1MDBlNFx1MDBlNG50aWcsWmlpc2NodGlnLE1pdHR3dWNoLER1bnNjaHRpZyxGcmlpdGlnLFNhbXNjaHRpZyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJTdW5udGlnLE1cdTAwZTRcdTAwZTRudGlnLFppaXNjaHRpZyxNaXR0d3VjaCxEdW5zY2h0aWcsRnJpaXRpZyxTYW1zY2h0aWciLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6IlN1LixNXHUwMGU0LixaaS4sTWkuLER1LixGci4sU2EuIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiU3UuLE1cdTAwZTQuLFppLixNaS4sRHUuLEZyLixTYS4iLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJTLE0sRCxNLEQsRixTIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6IlMsTSxELE0sRCxGLFMiLnNwbGl0KCIsIiksIApTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAiUTMiLCAiUTQiXSwgUVVBUlRFUlM6WyIxLiBRdWFydGFsIiwgIjIuIFF1YXJ0YWwiLCAiMy4gUXVhcnRhbCIsICI0LiBRdWFydGFsIl0sIEFNUE1TOlsidm9ybS4iLCAibmFtLiJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIGQuIE1NTU0geSIsICJkLiBNTU1NIHkiLCAiZGQuTU0ueXl5eSIsICJkZC5NTS55eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ3UgPSB7RVJBUzpbIlx1MGE4OFx1MGFiMlx1MGFjMVx1MGFhOFx1MGFiZSBcdTBhOWNcdTBhYThcdTBhY2RcdTBhYWUgXHUwYWFhXHUwYWI5XHUwYWM3XHUwYWI4XHUwYWJlXHUwYTgyIiwgIlx1MGE4N1x1MGFiOFx1MGFiNVx1MGFjMFx1MGFiOFx1MGFhOCJdLCBFUkFOQU1FUzpbIlx1MGE4OFx1MGFiOFx1MGFiNVx1MGFjMFx1MGFiOFx1MGFhOCBcdTBhYWFcdTBhYzJcdTBhYjBcdTBhY2RcdTBhYjVcdTBhYzciLCAiXHUwYTg3XHUwYWI4XHUwYWI1XHUwYWMwXHUwYWI4XHUwYWE4Il0sIE5BUlJPV01PTlRIUzoiXHUwYTljXHUwYWJlLFx1MGFhYlx1MGFjNyxcdTBhYWVcdTBhYmUsXHUwYThmLFx1MGFhZVx1MGFjNyxcdTBhOWNcdTBhYzIsXHUwYTljXHUwYWMxLFx1MGE5MSxcdTBhYjgsXHUwYTkxLFx1MGFhOCxcdTBhYTFcdTBhYmYiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MGE5Y1x1MGFiZSxcdTBhYWJcdTBhYzcsXHUwYWFlXHUwYWJlLFx1MGE4ZixcdTBhYWVcdTBhYzcsXHUwYTljXHUwYWMyLFx1MGE5Y1x1MGFjMSxcdTBhOTEsXHUwYWI4LFx1MGE5MSxcdTBhYTgsXHUwYWExXHUwYWJmIi5zcGxpdCgiLCIpLCAKTU9OVEhTOiJcdTBhOWNcdTBhYmVcdTBhYThcdTBhY2RcdTBhYWZcdTBhYzFcdTBhODZcdTBhYjBcdTBhYzAsXHUwYWFiXHUwYWM3XHUwYWFjXHUwYWNkXHUwYWIwXHUwYWMxXHUwYTg2XHUwYWIwXHUwYWMwLFx1MGFhZVx1MGFiZVx1MGFiMFx1MGFjZFx1MGE5YSxcdTBhOGZcdTBhYWFcdTBhY2RcdTBhYjBcdTBhYmZcdTBhYjIsXHUwYWFlXHUwYWM3LFx1MGE5Y1x1MGFjMlx1MGFhOCxcdTBhOWNcdTBhYzFcdTBhYjJcdTBhYmVcdTBhODgsXHUwYTkxXHUwYTk3XHUwYWI4XHUwYWNkXHUwYTlmLFx1MGFiOFx1MGFhYVx1MGFjZFx1MGE5Zlx1MGFjN1x1MGFhZVx1MGFjZFx1MGFhY1x1MGFiMCxcdTBhOTFcdTBhOTVcdTBhY2RcdTBhOWZcdTBhY2RcdTBhYWNcdTBhYjAsXHUwYWE4XHUwYWI1XHUwYWM3XHUwYWFlXHUwYWNkXHUwYWFjXHUwYWIwLFx1MGFhMVx1MGFiZlx1MGFiOFx1MGFjN1x1MGFhZVx1MGFjZFx1MGFhY1x1MGFiMCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiXHUwYTljXHUwYWJlXHUwYWE4XHUwYWNkXHUwYWFmXHUwYWMxXHUwYTg2XHUwYWIwXHUwYWMwLFx1MGFhYlx1MGFjN1x1MGFhY1x1MGFjZFx1MGFiMFx1MGFjMVx1MGE4Nlx1MGFiMFx1MGFjMCxcdTBhYWVcdTBhYmVcdTBhYjBcdTBhY2RcdTBhOWEsXHUwYThmXHUwYWFhXHUwYWNkXHUwYWIwXHUwYWJmXHUwYWIyLFx1MGFhZVx1MGFjNyxcdTBhOWNcdTBhYzJcdTBhYTgsXHUwYTljXHUwYWMxXHUwYWIyXHUwYWJlXHUwYTg4LFx1MGE5MVx1MGE5N1x1MGFiOFx1MGFjZFx1MGE5ZixcdTBhYjhcdTBhYWFcdTBhY2RcdTBhOWZcdTBhYzdcdTBhYWVcdTBhY2RcdTBhYWNcdTBhYjAsXHUwYTkxXHUwYTk1XHUwYWNkXHUwYTlmXHUwYWNkXHUwYWFjXHUwYWIwLFx1MGFhOFx1MGFiNVx1MGFjN1x1MGFhZVx1MGFjZFx1MGFhY1x1MGFiMCxcdTBhYTFcdTBhYmZcdTBhYjhcdTBhYzdcdTBhYWVcdTBhY2RcdTBhYWNcdTBhYjAiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoiXHUwYTljXHUwYWJlXHUwYWE4XHUwYWNkXHUwYWFmXHUwYWMxLFx1MGFhYlx1MGFjN1x1MGFhY1x1MGFjZFx1MGFiMFx1MGFjMSxcdTBhYWVcdTBhYmVcdTBhYjBcdTBhY2RcdTBhOWEsXHUwYThmXHUwYWFhXHUwYWNkXHUwYWIwXHUwYWJmXHUwYWIyLFx1MGFhZVx1MGFjNyxcdTBhOWNcdTBhYzJcdTBhYTgsXHUwYTljXHUwYWMxXHUwYWIyXHUwYWJlXHUwYTg4LFx1MGE5MVx1MGE5N1x1MGFiOFx1MGFjZFx1MGE5ZixcdTBhYjhcdTBhYWFcdTBhY2RcdTBhOWZcdTBhYzcsXHUwYTkxXHUwYTk1XHUwYWNkXHUwYTlmXHUwYWNiLFx1MGFhOFx1MGFiNVx1MGFjNyxcdTBhYTFcdTBhYmZcdTBhYjhcdTBhYzciLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwYTljXHUwYWJlXHUwYWE4XHUwYWNkXHUwYWFmXHUwYWMxLFx1MGFhYlx1MGFjN1x1MGFhY1x1MGFjZFx1MGFiMFx1MGFjMSxcdTBhYWVcdTBhYmVcdTBhYjBcdTBhY2RcdTBhOWEsXHUwYThmXHUwYWFhXHUwYWNkXHUwYWIwXHUwYWJmXHUwYWIyLFx1MGFhZVx1MGFjNyxcdTBhOWNcdTBhYzJcdTBhYTgsXHUwYTljXHUwYWMxXHUwYWIyXHUwYWJlXHUwYTg4LFx1MGE5MVx1MGE5N1x1MGFiOFx1MGFjZFx1MGE5ZixcdTBhYjhcdTBhYWFcdTBhY2RcdTBhOWZcdTBhYzcsXHUwYTkxXHUwYTk1XHUwYWNkXHUwYTlmXHUwYWNiLFx1MGFhOFx1MGFiNVx1MGFjNyxcdTBhYTFcdTBhYmZcdTBhYjhcdTBhYzciLnNwbGl0KCIsIiksIApXRUVLREFZUzoiXHUwYWIwXHUwYWI1XHUwYWJmXHUwYWI1XHUwYWJlXHUwYWIwLFx1MGFiOFx1MGFjYlx1MGFhZVx1MGFiNVx1MGFiZVx1MGFiMCxcdTBhYWVcdTBhODJcdTBhOTdcdTBhYjNcdTBhYjVcdTBhYmVcdTBhYjAsXHUwYWFjXHUwYWMxXHUwYWE3XHUwYWI1XHUwYWJlXHUwYWIwLFx1MGE5N1x1MGFjMVx1MGFiMFx1MGFjMVx1MGFiNVx1MGFiZVx1MGFiMCxcdTBhYjZcdTBhYzFcdTBhOTVcdTBhY2RcdTBhYjBcdTBhYjVcdTBhYmVcdTBhYjAsXHUwYWI2XHUwYWE4XHUwYWJmXHUwYWI1XHUwYWJlXHUwYWIwIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Ilx1MGFiMFx1MGFiNVx1MGFiZlx1MGFiNVx1MGFiZVx1MGFiMCxcdTBhYjhcdTBhY2JcdTBhYWVcdTBhYjVcdTBhYmVcdTBhYjAsXHUwYWFlXHUwYTgyXHUwYTk3XHUwYWIzXHUwYWI1XHUwYWJlXHUwYWIwLFx1MGFhY1x1MGFjMVx1MGFhN1x1MGFiNVx1MGFiZVx1MGFiMCxcdTBhOTdcdTBhYzFcdTBhYjBcdTBhYzFcdTBhYjVcdTBhYmVcdTBhYjAsXHUwYWI2XHUwYWMxXHUwYTk1XHUwYWNkXHUwYWIwXHUwYWI1XHUwYWJlXHUwYWIwLFx1MGFiNlx1MGFhOFx1MGFiZlx1MGFiNVx1MGFiZVx1MGFiMCIuc3BsaXQoIiwiKSwgClNIT1JUV0VFS0RBWVM6Ilx1MGFiMFx1MGFiNVx1MGFiZixcdTBhYjhcdTBhY2JcdTBhYWUsXHUwYWFlXHUwYTgyXHUwYTk3XHUwYWIzLFx1MGFhY1x1MGFjMVx1MGFhNyxcdTBhOTdcdTBhYzFcdTBhYjBcdTBhYzEsXHUwYWI2XHUwYWMxXHUwYTk1XHUwYWNkXHUwYWIwLFx1MGFiNlx1MGFhOFx1MGFiZiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MGFiMFx1MGFiNVx1MGFiZixcdTBhYjhcdTBhY2JcdTBhYWUsXHUwYWFlXHUwYTgyXHUwYTk3XHUwYWIzLFx1MGFhY1x1MGFjMVx1MGFhNyxcdTBhOTdcdTBhYzFcdTBhYjBcdTBhYzEsXHUwYWI2XHUwYWMxXHUwYTk1XHUwYWNkXHUwYWIwLFx1MGFiNlx1MGFhOFx1MGFiZiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1MGFiMCxcdTBhYjhcdTBhY2IsXHUwYWFlXHUwYTgyLFx1MGFhY1x1MGFjMSxcdTBhOTdcdTBhYzEsXHUwYWI2XHUwYWMxLFx1MGFiNiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTBhYjAsXHUwYWI4XHUwYWNiLFx1MGFhZVx1MGE4MixcdTBhYWNcdTBhYzEsXHUwYTk3XHUwYWMxLFx1MGFiNlx1MGFjMSxcdTBhYjYiLnNwbGl0KCIsIiksIApTSE9SVFFVQVJURVJTOlsiXHUwYWFhXHUwYWM3XHUwYWI5XHUwYWIyXHUwYWJlIFx1MGFiOVx1MGE4Mlx1MGFhNCAxIiwgIlEyIiwgIlEzIiwgIlx1MGE5YVx1MGFjY1x1MGFhNFx1MGFiZSBcdTBhYjlcdTBhODJcdTBhYTQgNCJdLCBRVUFSVEVSUzpbIlx1MGFhYVx1MGFjN1x1MGFiOVx1MGFiMlx1MGFiZSBcdTBhYjlcdTBhODJcdTBhYTQgMSIsICJcdTBhYTFcdTBhYzJcdTBhYjhcdTBhOGJcdTBhYmUgXHUwYWI5XHUwYTgyXHUwYWE0IDIiLCAiXHUwYWE0XHUwYWMwXHUwYWI4XHUwYThiXHUwYWJlIFx1MGFiOVx1MGE4Mlx1MGFhNCAzIiwgIlx1MGE5YVx1MGFjY1x1MGFhNFx1MGFiZSBcdTBhYjlcdTBhODJcdTBhYTQgNCJdLCBBTVBNUzpbIlx1MGFhYVx1MGFjMlx1MGFiMFx1MGFjZFx1MGFiNSBcdTBhYWVcdTBhYTdcdTBhY2RcdTBhYWZcdTBhYmVcdTBhYjlcdTBhY2RcdTBhYTgiLCAiXHUwYTg5XHUwYWE0XHUwYWNkXHUwYWE0XHUwYWIwIFx1MGFhZVx1MGFhN1x1MGFjZFx1MGFhZlx1MGFiZVx1MGFiOVx1MGFjZFx1MGFhOCJdLCAKREFURUZPUk1BVFM6WyJFRUVFLCBkIE1NTU0sIHkiLCAiZCBNTU1NLCB5IiwgImQgTU1NLCB5IiwgImQtTU0teXkiXSwgVElNRUZPUk1BVFM6WyJoaDptbTpzcyBhIHp6enoiLCAiaGg6bW06c3MgYSB6IiwgImhoOm1tOnNzIGEiLCAiaGg6bW0gYSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzYsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGUgPSB7RVJBUzpbIlx1MDVkY1x1MDVlNFx1MDVlMFx1MDVkNFx1MDVmNFx1MDVlMSIsICJcdTA1ZGNcdTA1ZTFcdTA1ZDRcdTA1ZjRcdTA1ZTAiXSwgRVJBTkFNRVM6WyJcdTA1ZGNcdTA1ZTRcdTA1ZTBcdTA1ZDkgXHUwNWQ0XHUwNWUxXHUwNWU0XHUwNWQ5XHUwNWU4XHUwNWQ0IiwgIlx1MDVkY1x1MDVlMVx1MDVlNFx1MDVkOVx1MDVlOFx1MDVkNCJdLCBOQVJST1dNT05USFM6IjEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiIxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiIuc3BsaXQoIiwiKSwgTU9OVEhTOiJcdTA1ZDlcdTA1ZTBcdTA1ZDVcdTA1ZDBcdTA1ZTgsXHUwNWU0XHUwNWQxXHUwNWU4XHUwNWQ1XHUwNWQwXHUwNWU4LFx1MDVkZVx1MDVlOFx1MDVlNSxcdTA1ZDBcdTA1ZTRcdTA1ZThcdTA1ZDlcdTA1ZGMsXHUwNWRlXHUwNWQwXHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVlMFx1MDVkOSxcdTA1ZDlcdTA1ZDVcdTA1ZGNcdTA1ZDksXHUwNWQwXHUwNWQ1XHUwNWQyXHUwNWQ1XHUwNWUxXHUwNWQ4LFx1MDVlMVx1MDVlNFx1MDVkOFx1MDVkZVx1MDVkMVx1MDVlOCxcdTA1ZDBcdTA1ZDVcdTA1ZTdcdTA1ZDhcdTA1ZDVcdTA1ZDFcdTA1ZTgsXHUwNWUwXHUwNWQ1XHUwNWQxXHUwNWRlXHUwNWQxXHUwNWU4LFx1MDVkM1x1MDVlNlx1MDVkZVx1MDVkMVx1MDVlOCIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVNT05USFM6Ilx1MDVkOVx1MDVlMFx1MDVkNVx1MDVkMFx1MDVlOCxcdTA1ZTRcdTA1ZDFcdTA1ZThcdTA1ZDVcdTA1ZDBcdTA1ZTgsXHUwNWRlXHUwNWU4XHUwNWU1LFx1MDVkMFx1MDVlNFx1MDVlOFx1MDVkOVx1MDVkYyxcdTA1ZGVcdTA1ZDBcdTA1ZDksXHUwNWQ5XHUwNWQ1XHUwNWUwXHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVkY1x1MDVkOSxcdTA1ZDBcdTA1ZDVcdTA1ZDJcdTA1ZDVcdTA1ZTFcdTA1ZDgsXHUwNWUxXHUwNWU0XHUwNWQ4XHUwNWRlXHUwNWQxXHUwNWU4LFx1MDVkMFx1MDVkNVx1MDVlN1x1MDVkOFx1MDVkNVx1MDVkMVx1MDVlOCxcdTA1ZTBcdTA1ZDVcdTA1ZDFcdTA1ZGVcdTA1ZDFcdTA1ZTgsXHUwNWQzXHUwNWU2XHUwNWRlXHUwNWQxXHUwNWU4Ii5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiXHUwNWQ5XHUwNWUwXHUwNWQ1LFx1MDVlNFx1MDVkMVx1MDVlOCxcdTA1ZGVcdTA1ZThcdTA1ZTUsXHUwNWQwXHUwNWU0XHUwNWU4LFx1MDVkZVx1MDVkMFx1MDVkOSxcdTA1ZDlcdTA1ZDVcdTA1ZTAsXHUwNWQ5XHUwNWQ1XHUwNWRjLFx1MDVkMFx1MDVkNVx1MDVkMixcdTA1ZTFcdTA1ZTRcdTA1ZDgsXHUwNWQwXHUwNWQ1XHUwNWU3LFx1MDVlMFx1MDVkNVx1MDVkMSxcdTA1ZDNcdTA1ZTZcdTA1ZGUiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6Ilx1MDVkOVx1MDVlMFx1MDVkNVx1MDVmMyxcdTA1ZTRcdTA1ZDFcdTA1ZThcdTA1ZjMsXHUwNWRlXHUwNWU4XHUwNWU1LFx1MDVkMFx1MDVlNFx1MDVlOFx1MDVmMyxcdTA1ZGVcdTA1ZDBcdTA1ZDksXHUwNWQ5XHUwNWQ1XHUwNWUwXHUwNWYzLFx1MDVkOVx1MDVkNVx1MDVkY1x1MDVmMyxcdTA1ZDBcdTA1ZDVcdTA1ZDJcdTA1ZjMsXHUwNWUxXHUwNWU0XHUwNWQ4XHUwNWYzLFx1MDVkMFx1MDVkNVx1MDVlN1x1MDVmMyxcdTA1ZTBcdTA1ZDVcdTA1ZDFcdTA1ZjMsXHUwNWQzXHUwNWU2XHUwNWRlXHUwNWYzIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVlOFx1MDVkMFx1MDVlOVx1MDVkNVx1MDVkZixcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWU5XHUwNWUwXHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZTlcdTA1ZGNcdTA1ZDlcdTA1ZTlcdTA1ZDksXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVlOFx1MDVkMVx1MDVkOVx1MDVlMlx1MDVkOSxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWQ3XHUwNWRlXHUwNWQ5XHUwNWU5XHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZTlcdTA1ZDlcdTA1ZTlcdTA1ZDksXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVlOVx1MDVkMVx1MDVlYSIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVXRUVLREFZUzoiXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVlOFx1MDVkMFx1MDVlOVx1MDVkNVx1MDVkZixcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWU5XHUwNWUwXHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZTlcdTA1ZGNcdTA1ZDlcdTA1ZTlcdTA1ZDksXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVlOFx1MDVkMVx1MDVkOVx1MDVlMlx1MDVkOSxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWQ3XHUwNWRlXHUwNWQ5XHUwNWU5XHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZTlcdTA1ZDlcdTA1ZTlcdTA1ZDksXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVlOVx1MDVkMVx1MDVlYSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVkMFx1MDVmMyxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWQxXHUwNWYzLFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZDJcdTA1ZjMsXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVkM1x1MDVmMyxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWQ0XHUwNWYzLFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZDVcdTA1ZjMsXHUwNWU5XHUwNWQxXHUwNWVhIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZDBcdTA1ZjMsXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVkMVx1MDVmMyxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWQyXHUwNWYzLFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZDNcdTA1ZjMsXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVkNFx1MDVmMyxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWQ1XHUwNWYzLFx1MDVlOVx1MDVkMVx1MDVlYSIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1MDVkMCxcdTA1ZDEsXHUwNWQyLFx1MDVkMyxcdTA1ZDQsXHUwNWQ1LFx1MDVlOSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTA1ZDAsXHUwNWQxLFx1MDVkMixcdTA1ZDMsXHUwNWQ0LFx1MDVkNSxcdTA1ZTkiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJcdTA1ZThcdTA1ZDFcdTA1ZTJcdTA1ZDVcdTA1ZGYgMSIsICJcdTA1ZThcdTA1ZDFcdTA1ZTJcdTA1ZDVcdTA1ZGYgMiIsIAoiXHUwNWU4XHUwNWQxXHUwNWUyXHUwNWQ1XHUwNWRmIDMiLCAiXHUwNWU4XHUwNWQxXHUwNWUyXHUwNWQ1XHUwNWRmIDQiXSwgUVVBUlRFUlM6WyJcdTA1ZThcdTA1ZDFcdTA1ZTJcdTA1ZDVcdTA1ZGYgMSIsICJcdTA1ZThcdTA1ZDFcdTA1ZTJcdTA1ZDVcdTA1ZGYgMiIsICJcdTA1ZThcdTA1ZDFcdTA1ZTJcdTA1ZDVcdTA1ZGYgMyIsICJcdTA1ZThcdTA1ZDFcdTA1ZTJcdTA1ZDVcdTA1ZGYgNCJdLCBBTVBNUzpbIlx1MDVkY1x1MDVlNFx1MDVlMFx1MDVkNFx1MDVmNFx1MDVlNiIsICJcdTA1ZDBcdTA1ZDdcdTA1ZDRcdTA1ZjRcdTA1ZTYiXSwgREFURUZPUk1BVFM6WyJFRUVFLCBkIFx1MDVkMU1NTU0geSIsICJkIFx1MDVkMU1NTU0geSIsICJkIFx1MDVkMU1NTSB5eXl5IiwgImRkL01NL3l5Il0sIFRJTUVGT1JNQVRTOlsiSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjYsIFdFRUtFTkRSQU5HRTpbNCwgNV0sIApGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGkgPSB7RVJBUzpbIlx1MDkwOFx1MDkzOFx1MDkzZVx1MDkyYVx1MDk0Mlx1MDkzMFx1MDk0ZFx1MDkzNSIsICJcdTA5MzhcdTA5MjgiXSwgRVJBTkFNRVM6WyJcdTA5MDhcdTA5MzhcdTA5M2VcdTA5MmFcdTA5NDJcdTA5MzBcdTA5NGRcdTA5MzUiLCAiXHUwOTM4XHUwOTI4Il0sIE5BUlJPV01PTlRIUzoiXHUwOTFjLFx1MDkyYlx1MDkzYyxcdTA5MmVcdTA5M2UsXHUwOTA1LFx1MDkyZSxcdTA5MWNcdTA5NDIsXHUwOTFjXHUwOTQxLFx1MDkwNSxcdTA5MzhcdTA5M2YsXHUwOTA1LFx1MDkyOCxcdTA5MjZcdTA5M2YiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MDkxYyxcdTA5MmJcdTA5M2MsXHUwOTJlXHUwOTNlLFx1MDkwNSxcdTA5MmUsXHUwOTFjXHUwOTQyLFx1MDkxY1x1MDk0MSxcdTA5MDUsXHUwOTM4XHUwOTNmLFx1MDkwNSxcdTA5MjgsXHUwOTI2XHUwOTNmIi5zcGxpdCgiLCIpLCBNT05USFM6Ilx1MDkxY1x1MDkyOFx1MDkzNVx1MDkzMFx1MDk0MCxcdTA5MmJcdTA5MzBcdTA5MzVcdTA5MzBcdTA5NDAsXHUwOTJlXHUwOTNlXHUwOTMwXHUwOTRkXHUwOTFhLFx1MDkwNVx1MDkyYVx1MDk0ZFx1MDkzMFx1MDk0OFx1MDkzMixcdTA5MmVcdTA5MDgsXHUwOTFjXHUwOTQyXHUwOTI4LFx1MDkxY1x1MDk0MVx1MDkzMlx1MDkzZVx1MDkwOCxcdTA5MDVcdTA5MTdcdTA5MzhcdTA5NGRcdTA5MjQsXHUwOTM4XHUwOTNmXHUwOTI0XHUwOTJlXHUwOTRkXHUwOTJjXHUwOTMwLFx1MDkwNVx1MDkxNVx1MDk0ZFx1MDkyNFx1MDk0Mlx1MDkyY1x1MDkzMCxcdTA5MjhcdTA5MzVcdTA5MmVcdTA5NGRcdTA5MmNcdTA5MzAsXHUwOTI2XHUwOTNmXHUwOTM4XHUwOTJlXHUwOTRkXHUwOTJjXHUwOTMwIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORU1PTlRIUzoiXHUwOTFjXHUwOTI4XHUwOTM1XHUwOTMwXHUwOTQwLFx1MDkyYlx1MDkzMFx1MDkzNVx1MDkzMFx1MDk0MCxcdTA5MmVcdTA5M2VcdTA5MzBcdTA5NGRcdTA5MWEsXHUwOTA1XHUwOTJhXHUwOTRkXHUwOTMwXHUwOTQ4XHUwOTMyLFx1MDkyZVx1MDkwOCxcdTA5MWNcdTA5NDJcdTA5MjgsXHUwOTFjXHUwOTQxXHUwOTMyXHUwOTNlXHUwOTA4LFx1MDkwNVx1MDkxN1x1MDkzOFx1MDk0ZFx1MDkyNCxcdTA5MzhcdTA5M2ZcdTA5MjRcdTA5MmVcdTA5NGRcdTA5MmNcdTA5MzAsXHUwOTA1XHUwOTE1XHUwOTRkXHUwOTI0XHUwOTQyXHUwOTJjXHUwOTMwLFx1MDkyOFx1MDkzNVx1MDkyZVx1MDk0ZFx1MDkyY1x1MDkzMCxcdTA5MjZcdTA5M2ZcdTA5MzhcdTA5MmVcdTA5NGRcdTA5MmNcdTA5MzAiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJcdTA5MWNcdTA5MjhcdTA5MzVcdTA5MzBcdTA5NDAsXHUwOTJiXHUwOTMwXHUwOTM1XHUwOTMwXHUwOTQwLFx1MDkyZVx1MDkzZVx1MDkzMFx1MDk0ZFx1MDkxYSxcdTA5MDVcdTA5MmFcdTA5NGRcdTA5MzBcdTA5NDhcdTA5MzIsXHUwOTJlXHUwOTA4LFx1MDkxY1x1MDk0Mlx1MDkyOCxcdTA5MWNcdTA5NDFcdTA5MzJcdTA5M2VcdTA5MDgsXHUwOTA1XHUwOTE3XHUwOTM4XHUwOTRkXHUwOTI0LFx1MDkzOFx1MDkzZlx1MDkyNFx1MDkyZVx1MDk0ZFx1MDkyY1x1MDkzMCxcdTA5MDVcdTA5MTVcdTA5NGRcdTA5MjRcdTA5NDJcdTA5MmNcdTA5MzAsXHUwOTI4XHUwOTM1XHUwOTJlXHUwOTRkXHUwOTJjXHUwOTMwLFx1MDkyNlx1MDkzZlx1MDkzOFx1MDkyZVx1MDk0ZFx1MDkyY1x1MDkzMCIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwOTFjXHUwOTI4XHUwOTM1XHUwOTMwXHUwOTQwLFx1MDkyYlx1MDkzMFx1MDkzNVx1MDkzMFx1MDk0MCxcdTA5MmVcdTA5M2VcdTA5MzBcdTA5NGRcdTA5MWEsXHUwOTA1XHUwOTJhXHUwOTRkXHUwOTMwXHUwOTQ4XHUwOTMyLFx1MDkyZVx1MDkwOCxcdTA5MWNcdTA5NDJcdTA5MjgsXHUwOTFjXHUwOTQxXHUwOTMyXHUwOTNlXHUwOTA4LFx1MDkwNVx1MDkxN1x1MDkzOFx1MDk0ZFx1MDkyNCxcdTA5MzhcdTA5M2ZcdTA5MjRcdTA5MmVcdTA5NGRcdTA5MmNcdTA5MzAsXHUwOTA1XHUwOTE1XHUwOTRkXHUwOTI0XHUwOTQyXHUwOTJjXHUwOTMwLFx1MDkyOFx1MDkzNVx1MDkyZVx1MDk0ZFx1MDkyY1x1MDkzMCxcdTA5MjZcdTA5M2ZcdTA5MzhcdTA5MmVcdTA5NGRcdTA5MmNcdTA5MzAiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJcdTA5MzBcdTA5MzVcdTA5M2ZcdTA5MzVcdTA5M2VcdTA5MzAsXHUwOTM4XHUwOTRiXHUwOTJlXHUwOTM1XHUwOTNlXHUwOTMwLFx1MDkyZVx1MDkwMlx1MDkxN1x1MDkzMlx1MDkzNVx1MDkzZVx1MDkzMCxcdTA5MmNcdTA5NDFcdTA5MjdcdTA5MzVcdTA5M2VcdTA5MzAsXHUwOTJjXHUwOTQzXHUwOTM5XHUwOTM4XHUwOTRkXHUwOTJhXHUwOTI0XHUwOTNmXHUwOTM1XHUwOTNlXHUwOTMwLFx1MDkzNlx1MDk0MVx1MDkxNVx1MDk0ZFx1MDkzMFx1MDkzNVx1MDkzZVx1MDkzMCxcdTA5MzZcdTA5MjhcdTA5M2ZcdTA5MzVcdTA5M2VcdTA5MzAiLnNwbGl0KCIsIiksIApTVEFOREFMT05FV0VFS0RBWVM6Ilx1MDkzMFx1MDkzNVx1MDkzZlx1MDkzNVx1MDkzZVx1MDkzMCxcdTA5MzhcdTA5NGJcdTA5MmVcdTA5MzVcdTA5M2VcdTA5MzAsXHUwOTJlXHUwOTAyXHUwOTE3XHUwOTMyXHUwOTM1XHUwOTNlXHUwOTMwLFx1MDkyY1x1MDk0MVx1MDkyN1x1MDkzNVx1MDkzZVx1MDkzMCxcdTA5MmNcdTA5NDNcdTA5MzlcdTA5MzhcdTA5NGRcdTA5MmFcdTA5MjRcdTA5M2ZcdTA5MzVcdTA5M2VcdTA5MzAsXHUwOTM2XHUwOTQxXHUwOTE1XHUwOTRkXHUwOTMwXHUwOTM1XHUwOTNlXHUwOTMwLFx1MDkzNlx1MDkyOFx1MDkzZlx1MDkzNVx1MDkzZVx1MDkzMCIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiXHUwOTMwXHUwOTM1XHUwOTNmLixcdTA5MzhcdTA5NGJcdTA5MmUuLFx1MDkyZVx1MDkwMlx1MDkxN1x1MDkzMi4sXHUwOTJjXHUwOTQxXHUwOTI3LixcdTA5MmNcdTA5NDNcdTA5MzkuLFx1MDkzNlx1MDk0MVx1MDkxNVx1MDk0ZFx1MDkzMC4sXHUwOTM2XHUwOTI4XHUwOTNmLiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJcdTA5MzBcdTA5MzVcdTA5M2YuLFx1MDkzOFx1MDk0Ylx1MDkyZS4sXHUwOTJlXHUwOTAyXHUwOTE3XHUwOTMyLixcdTA5MmNcdTA5NDFcdTA5MjcuLFx1MDkyY1x1MDk0M1x1MDkzOS4sXHUwOTM2XHUwOTQxXHUwOTE1XHUwOTRkXHUwOTMwLixcdTA5MzZcdTA5MjhcdTA5M2YuIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiXHUwOTMwLFx1MDkzOFx1MDk0YixcdTA5MmVcdTA5MDIsXHUwOTJjXHUwOTQxLFx1MDkxN1x1MDk0MSxcdTA5MzZcdTA5NDEsXHUwOTM2Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6Ilx1MDkzMCxcdTA5MzhcdTA5NGIsXHUwOTJlXHUwOTAyLFx1MDkyY1x1MDk0MSxcdTA5MTdcdTA5NDEsXHUwOTM2XHUwOTQxLFx1MDkzNiIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIlx1MDkyNFx1MDkzZlx1MDkyZVx1MDkzZVx1MDkzOVx1MDk0MCIsICJcdTA5MjZcdTA5NDJcdTA5MzhcdTA5MzBcdTA5NDAgXHUwOTI0XHUwOTNmXHUwOTJlXHUwOTNlXHUwOTM5XHUwOTQwIiwgCiJcdTA5MjRcdTA5NDBcdTA5MzhcdTA5MzBcdTA5NDAgXHUwOTI0XHUwOTNmXHUwOTJlXHUwOTNlXHUwOTM5XHUwOTQwIiwgIlx1MDkxYVx1MDk0Y1x1MDkyNVx1MDk0MCBcdTA5MjRcdTA5M2ZcdTA5MmVcdTA5M2VcdTA5MzlcdTA5NDAiXSwgUVVBUlRFUlM6WyJcdTA5MjRcdTA5M2ZcdTA5MmVcdTA5M2VcdTA5MzlcdTA5NDAiLCAiXHUwOTI2XHUwOTQyXHUwOTM4XHUwOTMwXHUwOTQwIFx1MDkyNFx1MDkzZlx1MDkyZVx1MDkzZVx1MDkzOVx1MDk0MCIsICJcdTA5MjRcdTA5NDBcdTA5MzhcdTA5MzBcdTA5NDAgXHUwOTI0XHUwOTNmXHUwOTJlXHUwOTNlXHUwOTM5XHUwOTQwIiwgIlx1MDkxYVx1MDk0Y1x1MDkyNVx1MDk0MCBcdTA5MjRcdTA5M2ZcdTA5MmVcdTA5M2VcdTA5MzlcdTA5NDAiXSwgQU1QTVM6WyJcdTA5MmFcdTA5NDJcdTA5MzBcdTA5NGRcdTA5MzVcdTA5M2VcdTA5MzlcdTA5NGRcdTA5MjgiLCAiXHUwOTA1XHUwOTJhXHUwOTMwXHUwOTNlXHUwOTM5XHUwOTRkXHUwOTI4Il0sIApEQVRFRk9STUFUUzpbIkVFRUUsIGQgTU1NTSB5IiwgImQgTU1NTSB5IiwgImRkLU1NLXl5eXkiLCAiZC1NLXl5Il0sIFRJTUVGT1JNQVRTOlsiaDptbTpzcyBhIHp6enoiLCAiaDptbTpzcyBhIHoiLCAiaDptbTpzcyBhIiwgImg6bW0gYSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzYsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHIgPSB7RVJBUzpbInAuIG4uIGUuIiwgIkEuIEQuIl0sIEVSQU5BTUVTOlsiUHJpamUgS3Jpc3RhIiwgIlBvc2xpamUgS3Jpc3RhIl0sIE5BUlJPV01PTlRIUzoiMS4sMi4sMy4sNC4sNS4sNi4sNy4sOC4sOS4sMTAuLDExLiwxMi4iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IjEuLDIuLDMuLDQuLDUuLDYuLDcuLDguLDkuLDEwLiwxMS4sMTIuIi5zcGxpdCgiLCIpLCBNT05USFM6InNpamVcdTAxMGRuamEsdmVsamFcdTAxMGRlLG9cdTAxN2V1amthLHRyYXZuamEsc3ZpYm5qYSxsaXBuamEsc3JwbmphLGtvbG92b3phLHJ1am5hLGxpc3RvcGFkYSxzdHVkZW5vZ2EscHJvc2luY2EiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6InNpamVcdTAxMGRhbmosdmVsamFcdTAxMGRhLG9cdTAxN2V1amFrLHRyYXZhbmosc3ZpYmFuaixsaXBhbmosc3JwYW5qLGtvbG92b3oscnVqYW4sbGlzdG9wYWQsc3R1ZGVuaSxwcm9zaW5hYyIuc3BsaXQoIiwiKSwgClNIT1JUTU9OVEhTOiJzaWosdmVsaixvXHUwMTdldSx0cmEsc3ZpLGxpcCxzcnAsa29sLHJ1aixsaXMsc3R1LHBybyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJzaWosdmVsaixvXHUwMTdldSx0cmEsc3ZpLGxpcCxzcnAsa29sLHJ1aixsaXMsc3R1LHBybyIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6Im5lZGplbGphLHBvbmVkamVsamFrLHV0b3JhayxzcmlqZWRhLFx1MDEwZGV0dnJ0YWsscGV0YWssc3Vib3RhIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Im5lZGplbGphLHBvbmVkamVsamFrLHV0b3JhayxzcmlqZWRhLFx1MDEwZGV0dnJ0YWsscGV0YWssc3Vib3RhIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJuZWQscG9uLHV0byxzcmksXHUwMTBkZXQscGV0LHN1YiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Im5lZCxwb24sdXRvLHNyaSxcdTAxMGRldCxwZXQsc3ViIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiTixQLFUsUyxcdTAxMGMsUCxTIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJuLHAsdSxzLFx1MDEwZCxwLHMiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyIxa3YiLCAiMmt2IiwgIjNrdiIsICI0a3YiXSwgUVVBUlRFUlM6WyIxLiBrdmFydGFsIiwgIjIuIGt2YXJ0YWwiLCAiMy4ga3ZhcnRhbCIsICI0LiBrdmFydGFsIl0sIEFNUE1TOlsicHJpamUgcG9kbmUiLCAiUE0iXSwgREFURUZPUk1BVFM6WyJFRUVFLCBkLiBNTU1NIHkuIiwgImQuIE1NTU0geS4iLCAiZC4gTS4geS4iLCAiZC5NLnkuIl0sIFRJTUVGT1JNQVRTOlsiSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19odSA9IHtFUkFTOlsiaS4gZS4iLCAiaS4gc3ouIl0sIEVSQU5BTUVTOlsiaWRcdTAxNTFzelx1MDBlMW1cdTAwZWR0XHUwMGUxc3VuayBlbFx1MDE1MXR0IiwgImlkXHUwMTUxc3pcdTAwZTFtXHUwMGVkdFx1MDBlMXN1bmsgc3plcmludCJdLCBOQVJST1dNT05USFM6IkosRixNLFx1MDBjMSxNLEosSixcdTAwYzEsU3osTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkosRixNLFx1MDBjMSxNLEosSixBLFN6LE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6ImphbnVcdTAwZTFyLGZlYnJ1XHUwMGUxcixtXHUwMGUxcmNpdXMsXHUwMGUxcHJpbGlzLG1cdTAwZTFqdXMsalx1MDBmYW5pdXMsalx1MDBmYWxpdXMsYXVndXN6dHVzLHN6ZXB0ZW1iZXIsb2t0XHUwMGYzYmVyLG5vdmVtYmVyLGRlY2VtYmVyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJqYW51XHUwMGUxcixmZWJydVx1MDBlMXIsbVx1MDBlMXJjaXVzLFx1MDBlMXByaWxpcyxtXHUwMGUxanVzLGpcdTAwZmFuaXVzLGpcdTAwZmFsaXVzLGF1Z3VzenR1cyxzemVwdGVtYmVyLG9rdFx1MDBmM2Jlcixub3ZlbWJlcixkZWNlbWJlciIuc3BsaXQoIiwiKSwgClNIT1JUTU9OVEhTOiJqYW4uLGZlYnIuLG1cdTAwZTFyYy4sXHUwMGUxcHIuLG1cdTAwZTFqLixqXHUwMGZhbi4salx1MDBmYWwuLGF1Zy4sc3plcHQuLG9rdC4sbm92LixkZWMuIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRNT05USFM6Imphbi4sZmVici4sbVx1MDBlMXJjLixcdTAwZTFwci4sbVx1MDBlMWouLGpcdTAwZmFuLixqXHUwMGZhbC4sYXVnLixzemVwdC4sb2t0Lixub3YuLGRlYy4iLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJ2YXNcdTAwZTFybmFwLGhcdTAwZTl0Zlx1MDE1MSxrZWRkLHN6ZXJkYSxjc1x1MDBmY3RcdTAwZjZydFx1MDBmNmsscFx1MDBlOW50ZWssc3pvbWJhdCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJ2YXNcdTAwZTFybmFwLGhcdTAwZTl0Zlx1MDE1MSxrZWRkLHN6ZXJkYSxjc1x1MDBmY3RcdTAwZjZydFx1MDBmNmsscFx1MDBlOW50ZWssc3pvbWJhdCIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiVixILEssU3plLENzLFAsU3pvIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6IlYsSCxLLFN6ZSxDcyxQLFN6byIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IlYsSCxLLFN6LENzLFAsU3oiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiVixILEssU3osQ3MsUCxTeiIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIk4xIiwgIk4yIiwgIk4zIiwgIk40Il0sIFFVQVJURVJTOlsiSS4gbmVneWVkXHUwMGU5diIsICJJSS4gbmVneWVkXHUwMGU5diIsICJJSUkuIG5lZ3llZFx1MDBlOXYiLCAiSVYuIG5lZ3llZFx1MDBlOXYiXSwgQU1QTVM6WyJkZS4iLCAiZHUuIl0sIERBVEVGT1JNQVRTOlsieS4gTU1NTSBkLiwgRUVFRSIsICJ5LiBNTU1NIGQuIiwgInl5eXkuTU0uZGQuIiwgInl5eXkuTU0uZGQuIl0sIFRJTUVGT1JNQVRTOlsiSDptbTpzcyB6enp6IiwgIkg6bW06c3MgeiIsICJIOm1tOnNzIiwgIkg6bW0iXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lkID0ge0VSQVM6WyJTTSIsICJNIl0sIEVSQU5BTUVTOlsiU00iLCAiTSJdLCBOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJKYW51YXJpLEZlYnJ1YXJpLE1hcmV0LEFwcmlsLE1laSxKdW5pLEp1bGksQWd1c3R1cyxTZXB0ZW1iZXIsT2t0b2JlcixOb3ZlbWJlcixEZXNlbWJlciIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiSmFudWFyaSxGZWJydWFyaSxNYXJldCxBcHJpbCxNZWksSnVuaSxKdWxpLEFndXN0dXMsU2VwdGVtYmVyLE9rdG9iZXIsTm92ZW1iZXIsRGVzZW1iZXIiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKYW4sRmViLE1hcixBcHIsTWVpLEp1bixKdWwsQWd0LFNlcCxPa3QsTm92LERlcyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJKYW4sRmViLE1hcixBcHIsTWVpLEp1bixKdWwsQWd0LFNlcCxPa3QsTm92LERlcyIuc3BsaXQoIiwiKSwgCldFRUtEQVlTOiJNaW5nZ3UsU2VuaW4sU2VsYXNhLFJhYnUsS2FtaXMsSnVtYXQsU2FidHUiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiTWluZ2d1LFNlbmluLFNlbGFzYSxSYWJ1LEthbWlzLEp1bWF0LFNhYnR1Ii5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJNaW4sU2VuLFNlbCxSYWIsS2FtLEp1bSxTYWIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJNaW4sU2VuLFNlbCxSYWIsS2FtLEp1bSxTYWIiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJNLFMsUyxSLEssSixTIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6Ik0sUyxTLFIsSyxKLFMiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJLMSIsICJLMiIsICJLMyIsICJLNCJdLCBRVUFSVEVSUzpbImt1YXJ0YWwgcGVydGFtYSIsICJrdWFydGFsIGtlZHVhIiwgImt1YXJ0YWwga2V0aWdhIiwgImt1YXJ0YWwga2VlbXBhdCJdLCBBTVBNUzpbInBhZ2kiLCAibWFsYW0iXSwgCkRBVEVGT1JNQVRTOlsiRUVFRSwgZGQgTU1NTSB5eXl5IiwgImQgTU1NTSB5eXl5IiwgImQgTU1NIHl5eXkiLCAiZGQvTU0veXkiXSwgVElNRUZPUk1BVFM6WyJIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaW4gPSB7RVJBUzpbIlNNIiwgIk0iXSwgRVJBTkFNRVM6WyJTTSIsICJNIl0sIE5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6IkphbnVhcmksRmVicnVhcmksTWFyZXQsQXByaWwsTWVpLEp1bmksSnVsaSxBZ3VzdHVzLFNlcHRlbWJlcixPa3RvYmVyLE5vdmVtYmVyLERlc2VtYmVyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJKYW51YXJpLEZlYnJ1YXJpLE1hcmV0LEFwcmlsLE1laSxKdW5pLEp1bGksQWd1c3R1cyxTZXB0ZW1iZXIsT2t0b2JlcixOb3ZlbWJlcixEZXNlbWJlciIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6IkphbixGZWIsTWFyLEFwcixNZWksSnVuLEp1bCxBZ3QsU2VwLE9rdCxOb3YsRGVzIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRNT05USFM6IkphbixGZWIsTWFyLEFwcixNZWksSnVuLEp1bCxBZ3QsU2VwLE9rdCxOb3YsRGVzIi5zcGxpdCgiLCIpLCAKV0VFS0RBWVM6Ik1pbmdndSxTZW5pbixTZWxhc2EsUmFidSxLYW1pcyxKdW1hdCxTYWJ0dSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJNaW5nZ3UsU2VuaW4sU2VsYXNhLFJhYnUsS2FtaXMsSnVtYXQsU2FidHUiLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6Ik1pbixTZW4sU2VsLFJhYixLYW0sSnVtLFNhYiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ik1pbixTZW4sU2VsLFJhYixLYW0sSnVtLFNhYiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ik0sUyxTLFIsSyxKLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiTSxTLFMsUixLLEosUyIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIksxIiwgIksyIiwgIkszIiwgIks0Il0sIFFVQVJURVJTOlsia3VhcnRhbCBwZXJ0YW1hIiwgImt1YXJ0YWwga2VkdWEiLCAia3VhcnRhbCBrZXRpZ2EiLCAia3VhcnRhbCBrZWVtcGF0Il0sIEFNUE1TOlsicGFnaSIsICJtYWxhbSJdLCAKREFURUZPUk1BVFM6WyJFRUVFLCBkZCBNTU1NIHl5eXkiLCAiZCBNTU1NIHl5eXkiLCAiZCBNTU0geXl5eSIsICJkZC9NTS95eSJdLCBUSU1FRk9STUFUUzpbIkg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pcyA9IHtFUkFTOlsiZnlyaXIgS3Jpc3QiLCAiZWZ0aXIgS3Jpc3QiXSwgRVJBTkFNRVM6WyJmeXJpciBLcmlzdCIsICJlZnRpciBLcmlzdCJdLCBOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosXHUwMGMxLEwsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6ImosZixtLGEsbSxqLGosXHUwMGUxLHMsbyxuLGQiLnNwbGl0KCIsIiksIE1PTlRIUzoiamFuXHUwMGZhYXIsZmViclx1MDBmYWFyLG1hcnMsYXByXHUwMGVkbCxtYVx1MDBlZCxqXHUwMGZhblx1MDBlZCxqXHUwMGZhbFx1MDBlZCxcdTAwZTFnXHUwMGZhc3Qsc2VwdGVtYmVyLG9rdFx1MDBmM2JlcixuXHUwMGYzdmVtYmVyLGRlc2VtYmVyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJqYW5cdTAwZmFhcixmZWJyXHUwMGZhYXIsbWFycyxhcHJcdTAwZWRsLG1hXHUwMGVkLGpcdTAwZmFuXHUwMGVkLGpcdTAwZmFsXHUwMGVkLFx1MDBlMWdcdTAwZmFzdCxzZXB0ZW1iZXIsb2t0XHUwMGYzYmVyLG5cdTAwZjN2ZW1iZXIsZGVzZW1iZXIiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoiamFuLGZlYixtYXIsYXByLG1hXHUwMGVkLGpcdTAwZmFuLGpcdTAwZmFsLFx1MDBlMWdcdTAwZmEsc2VwLG9rdCxuXHUwMGYzdixkZXMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiamFuLGZlYixtYXIsYXByLG1hXHUwMGVkLGpcdTAwZmFuLGpcdTAwZmFsLFx1MDBlMWdcdTAwZmEsc2VwLG9rdCxuXHUwMGYzdixkZXMiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJzdW5udWRhZ3VyLG1cdTAwZTFudWRhZ3VyLFx1MDBmZXJpXHUwMGYwanVkYWd1cixtaVx1MDBmMHZpa3VkYWd1cixmaW1tdHVkYWd1cixmXHUwMGY2c3R1ZGFndXIsbGF1Z2FyZGFndXIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoic3VubnVkYWd1cixtXHUwMGUxbnVkYWd1cixcdTAwZmVyaVx1MDBmMGp1ZGFndXIsbWlcdTAwZjB2aWt1ZGFndXIsZmltbXR1ZGFndXIsZlx1MDBmNnN0dWRhZ3VyLGxhdWdhcmRhZ3VyIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJzdW4sbVx1MDBlMW4sXHUwMGZlcmksbWlcdTAwZjAsZmltLGZcdTAwZjZzLGxhdSIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJzdW4sbVx1MDBlMW4sXHUwMGZlcmksbWlcdTAwZjAsZmltLGZcdTAwZjZzLGxhdSIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IlMsTSxcdTAwZGUsTSxGLEYsTCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJzLG0sXHUwMGZlLG0sZixmLGwiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJGMSIsICJGMiIsICJGMyIsICJGNCJdLCBRVUFSVEVSUzpbIjFzdCBmalx1MDBmM3JcdTAwZjB1bmd1ciIsICIybmQgZmpcdTAwZjNyXHUwMGYwdW5ndXIiLCAiM3JkIGZqXHUwMGYzclx1MDBmMHVuZ3VyIiwgIjR0aCBmalx1MDBmM3JcdTAwZjB1bmd1ciJdLCBBTVBNUzpbImYuaC4iLCAiZS5oLiJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIGQuIE1NTU0geSIsICJkLiBNTU1NIHkiLCAiZC5NLnl5eXkiLCAiZC5NLnl5eXkiXSwgVElNRUZPUk1BVFM6WyJISDptbTpzcyB6enp6IiwgIkhIOm1tOnNzIHoiLCAiSEg6bW06c3MiLCAKIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdCA9IHtFUkFTOlsiYUMiLCAiZEMiXSwgRVJBTkFNRVM6WyJhLkMuIiwgImQuQyJdLCBOQVJST1dNT05USFM6IkcsRixNLEEsTSxHLEwsQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJHLEYsTSxBLE0sRyxMLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJnZW5uYWlvLGZlYmJyYWlvLG1hcnpvLGFwcmlsZSxtYWdnaW8sZ2l1Z25vLGx1Z2xpbyxhZ29zdG8sc2V0dGVtYnJlLG90dG9icmUsbm92ZW1icmUsZGljZW1icmUiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6Ikdlbm5haW8sRmViYnJhaW8sTWFyem8sQXByaWxlLE1hZ2dpbyxHaXVnbm8sTHVnbGlvLEFnb3N0byxTZXR0ZW1icmUsT3R0b2JyZSxOb3ZlbWJyZSxEaWNlbWJyZSIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6ImdlbixmZWIsbWFyLGFwcixtYWcsZ2l1LGx1ZyxhZ28sc2V0LG90dCxub3YsZGljIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJnZW4sZmViLG1hcixhcHIsbWFnLGdpdSxsdWcsYWdvLHNldCxvdHQsbm92LGRpYyIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6ImRvbWVuaWNhLGx1bmVkXHUwMGVjLG1hcnRlZFx1MDBlYyxtZXJjb2xlZFx1MDBlYyxnaW92ZWRcdTAwZWMsdmVuZXJkXHUwMGVjLHNhYmF0byIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJEb21lbmljYSxMdW5lZFx1MDBlYyxNYXJ0ZWRcdTAwZWMsTWVyY29sZWRcdTAwZWMsR2lvdmVkXHUwMGVjLFZlbmVyZFx1MDBlYyxTYWJhdG8iLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6ImRvbSxsdW4sbWFyLG1lcixnaW8sdmVuLHNhYiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6ImRvbSxsdW4sbWFyLG1lcixnaW8sdmVuLHNhYiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IkQsTCxNLE0sRyxWLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiRCxMLE0sTSxHLFYsUyIuc3BsaXQoIiwiKSwgClNIT1JUUVVBUlRFUlM6WyJUMSIsICJUMiIsICJUMyIsICJUNCJdLCBRVUFSVEVSUzpbIjFvIHRyaW1lc3RyZSIsICIybyB0cmltZXN0cmUiLCAiM28gdHJpbWVzdHJlIiwgIjRvIHRyaW1lc3RyZSJdLCBBTVBNUzpbIm0uIiwgInAuIl0sIERBVEVGT1JNQVRTOlsiRUVFRSBkIE1NTU0geSIsICJkZCBNTU1NIHkiLCAiZGQvTU1NL3kiLCAiZGQvTU0veXkiXSwgVElNRUZPUk1BVFM6WyJISDptbTpzcyB6enp6IiwgIkhIOm1tOnNzIHoiLCAiSEg6bW06c3MiLCAiSEg6bW0iXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l3ID0ge0VSQVM6WyJcdTA1ZGNcdTA1ZTRcdTA1ZTBcdTA1ZDRcdTA1ZjRcdTA1ZTEiLCAiXHUwNWRjXHUwNWUxXHUwNWQ0XHUwNWY0XHUwNWUwIl0sIEVSQU5BTUVTOlsiXHUwNWRjXHUwNWU0XHUwNWUwXHUwNWQ5IFx1MDVkNFx1MDVlMVx1MDVlNFx1MDVkOVx1MDVlOFx1MDVkNCIsICJcdTA1ZGNcdTA1ZTFcdTA1ZTRcdTA1ZDlcdTA1ZThcdTA1ZDQiXSwgTkFSUk9XTU9OVEhTOiIxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIiLnNwbGl0KCIsIiksIE1PTlRIUzoiXHUwNWQ5XHUwNWUwXHUwNWQ1XHUwNWQwXHUwNWU4LFx1MDVlNFx1MDVkMVx1MDVlOFx1MDVkNVx1MDVkMFx1MDVlOCxcdTA1ZGVcdTA1ZThcdTA1ZTUsXHUwNWQwXHUwNWU0XHUwNWU4XHUwNWQ5XHUwNWRjLFx1MDVkZVx1MDVkMFx1MDVkOSxcdTA1ZDlcdTA1ZDVcdTA1ZTBcdTA1ZDksXHUwNWQ5XHUwNWQ1XHUwNWRjXHUwNWQ5LFx1MDVkMFx1MDVkNVx1MDVkMlx1MDVkNVx1MDVlMVx1MDVkOCxcdTA1ZTFcdTA1ZTRcdTA1ZDhcdTA1ZGVcdTA1ZDFcdTA1ZTgsXHUwNWQwXHUwNWQ1XHUwNWU3XHUwNWQ4XHUwNWQ1XHUwNWQxXHUwNWU4LFx1MDVlMFx1MDVkNVx1MDVkMVx1MDVkZVx1MDVkMVx1MDVlOCxcdTA1ZDNcdTA1ZTZcdTA1ZGVcdTA1ZDFcdTA1ZTgiLnNwbGl0KCIsIiksIApTVEFOREFMT05FTU9OVEhTOiJcdTA1ZDlcdTA1ZTBcdTA1ZDVcdTA1ZDBcdTA1ZTgsXHUwNWU0XHUwNWQxXHUwNWU4XHUwNWQ1XHUwNWQwXHUwNWU4LFx1MDVkZVx1MDVlOFx1MDVlNSxcdTA1ZDBcdTA1ZTRcdTA1ZThcdTA1ZDlcdTA1ZGMsXHUwNWRlXHUwNWQwXHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVlMFx1MDVkOSxcdTA1ZDlcdTA1ZDVcdTA1ZGNcdTA1ZDksXHUwNWQwXHUwNWQ1XHUwNWQyXHUwNWQ1XHUwNWUxXHUwNWQ4LFx1MDVlMVx1MDVlNFx1MDVkOFx1MDVkZVx1MDVkMVx1MDVlOCxcdTA1ZDBcdTA1ZDVcdTA1ZTdcdTA1ZDhcdTA1ZDVcdTA1ZDFcdTA1ZTgsXHUwNWUwXHUwNWQ1XHUwNWQxXHUwNWRlXHUwNWQxXHUwNWU4LFx1MDVkM1x1MDVlNlx1MDVkZVx1MDVkMVx1MDVlOCIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6Ilx1MDVkOVx1MDVlMFx1MDVkNSxcdTA1ZTRcdTA1ZDFcdTA1ZTgsXHUwNWRlXHUwNWU4XHUwNWU1LFx1MDVkMFx1MDVlNFx1MDVlOCxcdTA1ZGVcdTA1ZDBcdTA1ZDksXHUwNWQ5XHUwNWQ1XHUwNWUwLFx1MDVkOVx1MDVkNVx1MDVkYyxcdTA1ZDBcdTA1ZDVcdTA1ZDIsXHUwNWUxXHUwNWU0XHUwNWQ4LFx1MDVkMFx1MDVkNVx1MDVlNyxcdTA1ZTBcdTA1ZDVcdTA1ZDEsXHUwNWQzXHUwNWU2XHUwNWRlIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJcdTA1ZDlcdTA1ZTBcdTA1ZDVcdTA1ZjMsXHUwNWU0XHUwNWQxXHUwNWU4XHUwNWYzLFx1MDVkZVx1MDVlOFx1MDVlNSxcdTA1ZDBcdTA1ZTRcdTA1ZThcdTA1ZjMsXHUwNWRlXHUwNWQwXHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVlMFx1MDVmMyxcdTA1ZDlcdTA1ZDVcdTA1ZGNcdTA1ZjMsXHUwNWQwXHUwNWQ1XHUwNWQyXHUwNWYzLFx1MDVlMVx1MDVlNFx1MDVkOFx1MDVmMyxcdTA1ZDBcdTA1ZDVcdTA1ZTdcdTA1ZjMsXHUwNWUwXHUwNWQ1XHUwNWQxXHUwNWYzLFx1MDVkM1x1MDVlNlx1MDVkZVx1MDVmMyIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6Ilx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZThcdTA1ZDBcdTA1ZTlcdTA1ZDVcdTA1ZGYsXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVlOVx1MDVlMFx1MDVkOSxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWU5XHUwNWRjXHUwNWQ5XHUwNWU5XHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZThcdTA1ZDFcdTA1ZDlcdTA1ZTJcdTA1ZDksXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVkN1x1MDVkZVx1MDVkOVx1MDVlOVx1MDVkOSxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWU5XHUwNWQ5XHUwNWU5XHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZTlcdTA1ZDFcdTA1ZWEiLnNwbGl0KCIsIiksIApTVEFOREFMT05FV0VFS0RBWVM6Ilx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZThcdTA1ZDBcdTA1ZTlcdTA1ZDVcdTA1ZGYsXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVlOVx1MDVlMFx1MDVkOSxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWU5XHUwNWRjXHUwNWQ5XHUwNWU5XHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZThcdTA1ZDFcdTA1ZDlcdTA1ZTJcdTA1ZDksXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVkN1x1MDVkZVx1MDVkOVx1MDVlOVx1MDVkOSxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWU5XHUwNWQ5XHUwNWU5XHUwNWQ5LFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZTlcdTA1ZDFcdTA1ZWEiLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6Ilx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZDBcdTA1ZjMsXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVkMVx1MDVmMyxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWQyXHUwNWYzLFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZDNcdTA1ZjMsXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVkNFx1MDVmMyxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWQ1XHUwNWYzLFx1MDVlOVx1MDVkMVx1MDVlYSIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWQwXHUwNWYzLFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZDFcdTA1ZjMsXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVkMlx1MDVmMyxcdTA1ZDlcdTA1ZDVcdTA1ZGQgXHUwNWQzXHUwNWYzLFx1MDVkOVx1MDVkNVx1MDVkZCBcdTA1ZDRcdTA1ZjMsXHUwNWQ5XHUwNWQ1XHUwNWRkIFx1MDVkNVx1MDVmMyxcdTA1ZTlcdTA1ZDFcdTA1ZWEiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJcdTA1ZDAsXHUwNWQxLFx1MDVkMixcdTA1ZDMsXHUwNWQ0LFx1MDVkNSxcdTA1ZTkiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiXHUwNWQwLFx1MDVkMSxcdTA1ZDIsXHUwNWQzLFx1MDVkNCxcdTA1ZDUsXHUwNWU5Ii5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiXHUwNWU4XHUwNWQxXHUwNWUyXHUwNWQ1XHUwNWRmIDEiLCAiXHUwNWU4XHUwNWQxXHUwNWUyXHUwNWQ1XHUwNWRmIDIiLCAKIlx1MDVlOFx1MDVkMVx1MDVlMlx1MDVkNVx1MDVkZiAzIiwgIlx1MDVlOFx1MDVkMVx1MDVlMlx1MDVkNVx1MDVkZiA0Il0sIFFVQVJURVJTOlsiXHUwNWU4XHUwNWQxXHUwNWUyXHUwNWQ1XHUwNWRmIDEiLCAiXHUwNWU4XHUwNWQxXHUwNWUyXHUwNWQ1XHUwNWRmIDIiLCAiXHUwNWU4XHUwNWQxXHUwNWUyXHUwNWQ1XHUwNWRmIDMiLCAiXHUwNWU4XHUwNWQxXHUwNWUyXHUwNWQ1XHUwNWRmIDQiXSwgQU1QTVM6WyJcdTA1ZGNcdTA1ZTRcdTA1ZTBcdTA1ZDRcdTA1ZjRcdTA1ZTYiLCAiXHUwNWQwXHUwNWQ3XHUwNWQ0XHUwNWY0XHUwNWU2Il0sIERBVEVGT1JNQVRTOlsiRUVFRSwgZCBcdTA1ZDFNTU1NIHkiLCAiZCBcdTA1ZDFNTU1NIHkiLCAiZCBcdTA1ZDFNTU0geXl5eSIsICJkZC9NTS95eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCAKRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2phID0ge0VSQVM6WyJcdTdkMDBcdTUxNDNcdTUyNGQiLCAiXHU4OTdmXHU2NmE2Il0sIEVSQU5BTUVTOlsiXHU3ZDAwXHU1MTQzXHU1MjRkIiwgIlx1ODk3Zlx1NjZhNiJdLCBOQVJST1dNT05USFM6IjEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiIxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiIuc3BsaXQoIiwiKSwgTU9OVEhTOiIxXHU2NzA4LDJcdTY3MDgsM1x1NjcwOCw0XHU2NzA4LDVcdTY3MDgsNlx1NjcwOCw3XHU2NzA4LDhcdTY3MDgsOVx1NjcwOCwxMFx1NjcwOCwxMVx1NjcwOCwxMlx1NjcwOCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiMVx1NjcwOCwyXHU2NzA4LDNcdTY3MDgsNFx1NjcwOCw1XHU2NzA4LDZcdTY3MDgsN1x1NjcwOCw4XHU2NzA4LDlcdTY3MDgsMTBcdTY3MDgsMTFcdTY3MDgsMTJcdTY3MDgiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiIxXHU2NzA4LDJcdTY3MDgsM1x1NjcwOCw0XHU2NzA4LDVcdTY3MDgsNlx1NjcwOCw3XHU2NzA4LDhcdTY3MDgsOVx1NjcwOCwxMFx1NjcwOCwxMVx1NjcwOCwxMlx1NjcwOCIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiMVx1NjcwOCwyXHU2NzA4LDNcdTY3MDgsNFx1NjcwOCw1XHU2NzA4LDZcdTY3MDgsN1x1NjcwOCw4XHU2NzA4LDlcdTY3MDgsMTBcdTY3MDgsMTFcdTY3MDgsMTJcdTY3MDgiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJcdTY1ZTVcdTY2ZGNcdTY1ZTUsXHU2NzA4XHU2NmRjXHU2NWU1LFx1NzA2Ylx1NjZkY1x1NjVlNSxcdTZjMzRcdTY2ZGNcdTY1ZTUsXHU2NzI4XHU2NmRjXHU2NWU1LFx1OTFkMVx1NjZkY1x1NjVlNSxcdTU3MWZcdTY2ZGNcdTY1ZTUiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiXHU2NWU1XHU2NmRjXHU2NWU1LFx1NjcwOFx1NjZkY1x1NjVlNSxcdTcwNmJcdTY2ZGNcdTY1ZTUsXHU2YzM0XHU2NmRjXHU2NWU1LFx1NjcyOFx1NjZkY1x1NjVlNSxcdTkxZDFcdTY2ZGNcdTY1ZTUsXHU1NzFmXHU2NmRjXHU2NWU1Ii5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJcdTY1ZTUsXHU2NzA4LFx1NzA2YixcdTZjMzQsXHU2NzI4LFx1OTFkMSxcdTU3MWYiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiXHU2NWU1LFx1NjcwOCxcdTcwNmIsXHU2YzM0LFx1NjcyOCxcdTkxZDEsXHU1NzFmIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiXHU2NWU1LFx1NjcwOCxcdTcwNmIsXHU2YzM0LFx1NjcyOCxcdTkxZDEsXHU1NzFmIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6Ilx1NjVlNSxcdTY3MDgsXHU3MDZiLFx1NmMzNCxcdTY3MjgsXHU5MWQxLFx1NTcxZiIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIlExIiwgIlEyIiwgIlEzIiwgIlE0Il0sIFFVQVJURVJTOlsiXHU3YjJjMVx1NTZkYlx1NTM0YVx1NjcxZiIsICJcdTdiMmMyXHU1NmRiXHU1MzRhXHU2NzFmIiwgIlx1N2IyYzNcdTU2ZGJcdTUzNGFcdTY3MWYiLCAiXHU3YjJjNFx1NTZkYlx1NTM0YVx1NjcxZiJdLCBBTVBNUzpbIlx1NTM0OFx1NTI0ZCIsICJcdTUzNDhcdTVmOGMiXSwgREFURUZPUk1BVFM6WyJ5XHU1ZTc0TVx1NjcwOGRcdTY1ZTVFRUVFIiwgCiJ5XHU1ZTc0TVx1NjcwOGRcdTY1ZTUiLCAieXl5eS9NTS9kZCIsICJ5eS9NTS9kZCJdLCBUSU1FRk9STUFUUzpbIkhcdTY2NDJtbVx1NTIwNnNzXHU3OWQyIHp6enoiLCAiSDptbTpzcyB6IiwgIkg6bW06c3MiLCAiSDptbSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa24gPSB7RVJBUzpbIlx1MGM5NVx1MGNjZFx1MGNiMFx1MGNiZi5cdTBjYWFcdTBjYzIiLCAiXHUwYzljXHUwY2JlXHUwY2I5XHUwY2MwIl0sIEVSQU5BTUVTOlsiXHUwYzg4XHUwY2I4XHUwY2FhXHUwY2MyXHUwY2I1XHUwY2VmLiIsICJcdTBjOTVcdTBjY2RcdTBjYjBcdTBjYmZcdTBjYjhcdTBjY2RcdTBjYTQgXHUwY2I2XHUwYzk1Il0sIE5BUlJPV01PTlRIUzoiXHUwYzljLFx1MGNhYlx1MGNjNixcdTBjYWVcdTBjYmUsXHUwYzhlLFx1MGNhZVx1MGNjNyxcdTBjOWNcdTBjYzIsXHUwYzljXHUwY2MxLFx1MGM4NixcdTBjYjhcdTBjYzYsXHUwYzg1LFx1MGNhOCxcdTBjYTFcdTBjYmYiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MGM5YyxcdTBjYWJcdTBjYzYsXHUwY2FlXHUwY2JlLFx1MGM4ZSxcdTBjYWVcdTBjYzcsXHUwYzljXHUwY2MyLFx1MGM5Y1x1MGNjMSxcdTBjODYsXHUwY2I4XHUwY2M2LFx1MGM4NSxcdTBjYTgsXHUwY2ExXHUwY2JmIi5zcGxpdCgiLCIpLCAKTU9OVEhTOiJcdTBjOWNcdTBjYThcdTBjYjVcdTBjYjBcdTBjYzAsXHUwY2FiXHUwY2M2XHUwY2FjXHUwY2NkXHUwY2IwXHUwY2I1XHUwY2IwXHUwY2MwLFx1MGNhZVx1MGNiZVx1MGNiMFx1MGNjZFx1MGM5YVx1MGNjZCxcdTBjOGVcdTBjYWFcdTBjY2RcdTBjYjBcdTBjYmZcdTBjYjJcdTBjY2QsXHUwY2FlXHUwY2M2LFx1MGM5Y1x1MGNjMlx1MGNhOFx1MGNjZCxcdTBjOWNcdTBjYzFcdTBjYjJcdTBjYzgsXHUwYzg2XHUwYzk3XHUwY2I4XHUwY2NkXHUwYzlmXHUwY2NkLFx1MGNiOFx1MGNhYVx1MGNjZFx1MGM5Zlx1MGNjNlx1MGM4Mlx1MGNhY1x1MGNiMFx1MGNjZCxcdTBjODVcdTBjOTVcdTBjY2RcdTBjOWZcdTBjY2JcdTBjYWNcdTBjYjBcdTBjY2QsXHUwY2E4XHUwY2I1XHUwY2M2XHUwYzgyXHUwY2FjXHUwY2IwXHUwY2NkLFx1MGNhMVx1MGNiZlx1MGNiOFx1MGNjNlx1MGM4Mlx1MGNhY1x1MGNiMFx1MGNjZCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiXHUwYzljXHUwY2E4XHUwY2I1XHUwY2IwXHUwY2MwLFx1MGNhYlx1MGNjNlx1MGNhY1x1MGNjZFx1MGNiMFx1MGNiNVx1MGNiMFx1MGNjMCxcdTBjYWVcdTBjYmVcdTBjYjBcdTBjY2RcdTBjOWFcdTBjY2QsXHUwYzhlXHUwY2FhXHUwY2NkXHUwY2IwXHUwY2JmXHUwY2IyXHUwY2NkLFx1MGNhZVx1MGNjNixcdTBjOWNcdTBjYzJcdTBjYThcdTBjY2QsXHUwYzljXHUwY2MxXHUwY2IyXHUwY2M4LFx1MGM4Nlx1MGM5N1x1MGNiOFx1MGNjZFx1MGM5Zlx1MGNjZCxcdTBjYjhcdTBjYWFcdTBjY2RcdTBjOWZcdTBjYzZcdTBjODJcdTBjYWNcdTBjYjBcdTBjY2QsXHUwYzg1XHUwYzk1XHUwY2NkXHUwYzlmXHUwY2NiXHUwY2FjXHUwY2IwXHUwY2NkLFx1MGNhOFx1MGNiNVx1MGNjNlx1MGM4Mlx1MGNhY1x1MGNiMFx1MGNjZCxcdTBjYTFcdTBjYmZcdTBjYjhcdTBjYzZcdTBjODJcdTBjYWNcdTBjYjBcdTBjY2QiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoiXHUwYzljXHUwY2E4XHUwY2I1XHUwY2IwXHUwY2MwLFx1MGNhYlx1MGNjNlx1MGNhY1x1MGNjZFx1MGNiMFx1MGNiNVx1MGNiMFx1MGNjMCxcdTBjYWVcdTBjYmVcdTBjYjBcdTBjY2RcdTBjOWFcdTBjY2QsXHUwYzhlXHUwY2FhXHUwY2NkXHUwY2IwXHUwY2JmXHUwY2IyXHUwY2NkLFx1MGNhZVx1MGNjNixcdTBjOWNcdTBjYzJcdTBjYThcdTBjY2QsXHUwYzljXHUwY2MxXHUwY2IyXHUwY2M4LFx1MGM4Nlx1MGM5N1x1MGNiOFx1MGNjZFx1MGM5Zlx1MGNjZCxcdTBjYjhcdTBjYWFcdTBjY2RcdTBjOWZcdTBjYzZcdTBjODJcdTBjYWNcdTBjYjBcdTBjY2QsXHUwYzg1XHUwYzk1XHUwY2NkXHUwYzlmXHUwY2NiXHUwY2FjXHUwY2IwXHUwY2NkLFx1MGNhOFx1MGNiNVx1MGNjNlx1MGM4Mlx1MGNhY1x1MGNiMFx1MGNjZCxcdTBjYTFcdTBjYmZcdTBjYjhcdTBjYzZcdTBjODJcdTBjYWNcdTBjYjBcdTBjY2QiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwYzljXHUwY2E4XHUwY2I1XHUwY2IwXHUwY2MwLFx1MGNhYlx1MGNjNlx1MGNhY1x1MGNjZFx1MGNiMFx1MGNiNVx1MGNiMFx1MGNjMCxcdTBjYWVcdTBjYmVcdTBjYjBcdTBjY2RcdTBjOWFcdTBjY2QsXHUwYzhlXHUwY2FhXHUwY2NkXHUwY2IwXHUwY2JmXHUwY2IyXHUwY2NkLFx1MGNhZVx1MGNjNixcdTBjOWNcdTBjYzJcdTBjYThcdTBjY2QsXHUwYzljXHUwY2MxXHUwY2IyXHUwY2M4LFx1MGM4Nlx1MGM5N1x1MGNiOFx1MGNjZFx1MGM5Zlx1MGNjZCxcdTBjYjhcdTBjYWFcdTBjY2RcdTBjOWZcdTBjYzZcdTBjODJcdTBjYWNcdTBjYjBcdTBjY2QsXHUwYzg1XHUwYzk1XHUwY2NkXHUwYzlmXHUwY2NiXHUwY2FjXHUwY2IwXHUwY2NkLFx1MGNhOFx1MGNiNVx1MGNjNlx1MGM4Mlx1MGNhY1x1MGNiMFx1MGNjZCxcdTBjYTFcdTBjYmZcdTBjYjhcdTBjYzZcdTBjODJcdTBjYWNcdTBjYjBcdTBjY2QiLnNwbGl0KCIsIiksIApXRUVLREFZUzoiXHUwY2IwXHUwY2I1XHUwY2JmXHUwY2I1XHUwY2JlXHUwY2IwLFx1MGNiOFx1MGNjYlx1MGNhZVx1MGNiNVx1MGNiZVx1MGNiMCxcdTBjYWVcdTBjODJcdTBjOTdcdTBjYjNcdTBjYjVcdTBjYmVcdTBjYjAsXHUwY2FjXHUwY2MxXHUwY2E3XHUwY2I1XHUwY2JlXHUwY2IwLFx1MGM5N1x1MGNjMVx1MGNiMFx1MGNjMVx1MGNiNVx1MGNiZVx1MGNiMCxcdTBjYjZcdTBjYzFcdTBjOTVcdTBjY2RcdTBjYjBcdTBjYjVcdTBjYmVcdTBjYjAsXHUwY2I2XHUwY2E4XHUwY2JmXHUwY2I1XHUwY2JlXHUwY2IwIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Ilx1MGNiMFx1MGNiNVx1MGNiZlx1MGNiNVx1MGNiZVx1MGNiMCxcdTBjYjhcdTBjY2JcdTBjYWVcdTBjYjVcdTBjYmVcdTBjYjAsXHUwY2FlXHUwYzgyXHUwYzk3XHUwY2IzXHUwY2I1XHUwY2JlXHUwY2IwLFx1MGNhY1x1MGNjMVx1MGNhN1x1MGNiNVx1MGNiZVx1MGNiMCxcdTBjOTdcdTBjYzFcdTBjYjBcdTBjYzFcdTBjYjVcdTBjYmVcdTBjYjAsXHUwY2I2XHUwY2MxXHUwYzk1XHUwY2NkXHUwY2IwXHUwY2I1XHUwY2JlXHUwY2IwLFx1MGNiNlx1MGNhOFx1MGNiZlx1MGNiNVx1MGNiZVx1MGNiMCIuc3BsaXQoIiwiKSwgClNIT1JUV0VFS0RBWVM6Ilx1MGNiMC4sXHUwY2I4XHUwY2NiLixcdTBjYWVcdTBjODIuLFx1MGNhY1x1MGNjMS4sXHUwYzk3XHUwY2MxLixcdTBjYjZcdTBjYzEuLFx1MGNiNlx1MGNhOFx1MGNiZi4iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJcdTBjYjAuLFx1MGNiOFx1MGNjYi4sXHUwY2FlXHUwYzgyLixcdTBjYWNcdTBjYzEuLFx1MGM5N1x1MGNjMS4sXHUwY2I2XHUwY2MxLixcdTBjYjZcdTBjYThcdTBjYmYuIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiXHUwY2IwLFx1MGNiOFx1MGNjYixcdTBjYWVcdTBjODIsXHUwY2FjXHUwY2MxLFx1MGM5N1x1MGNjMSxcdTBjYjZcdTBjYzEsXHUwY2I2Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6Ilx1MGNiMCxcdTBjYjhcdTBjY2IsXHUwY2FlXHUwYzgyLFx1MGNhY1x1MGNjMSxcdTBjOTdcdTBjYzEsXHUwY2I2XHUwY2MxLFx1MGNiNiIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIlx1MGM5Mlx1MGM4Mlx1MGNhNlx1MGNjMSAxIiwgCiJcdTBjOGVcdTBjYjBcdTBjYTFcdTBjYzEgMiIsICJcdTBjYWVcdTBjYzJcdTBjYjBcdTBjYzEgMyIsICJcdTBjYThcdTBjYmVcdTBjYjJcdTBjYzNcdTBjOTUgNCJdLCBRVUFSVEVSUzpbIlx1MGM5Mlx1MGM4Mlx1MGNhNlx1MGNjMSAxIiwgIlx1MGM4ZVx1MGNiMFx1MGNhMVx1MGNjMSAyIiwgIlx1MGNhZVx1MGNjMlx1MGNiMFx1MGNjMSAzIiwgIlx1MGNhOFx1MGNiZVx1MGNiMlx1MGNjM1x1MGM5NSA0Il0sIEFNUE1TOlsiQU0iLCAiUE0iXSwgREFURUZPUk1BVFM6WyJFRUVFIGQgTU1NTSB5IiwgImQgTU1NTSB5IiwgImQgTU1NIHkiLCAiZC1NLXl5Il0sIFRJTUVGT1JNQVRTOlsiaGg6bW06c3MgYSB6enp6IiwgImhoOm1tOnNzIGEgeiIsICJoaDptbTpzcyBhIiwgImhoOm1tIGEiXSwgRklSU1REQVlPRldFRUs6NiwgV0VFS0VORFJBTkdFOls2LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjJ9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvID0ge0VSQVM6WyJcdWFlMzBcdWM2ZDBcdWM4MDQiLCAiXHVjMTFjXHVhZTMwIl0sIEVSQU5BTUVTOlsiXHVjMTFjXHViODI1XHVhZTMwXHVjNmQwXHVjODA0IiwgIlx1YzExY1x1YjgyNVx1YWUzMFx1YzZkMCJdLCBOQVJST1dNT05USFM6IjFcdWM2ZDQsMlx1YzZkNCwzXHVjNmQ0LDRcdWM2ZDQsNVx1YzZkNCw2XHVjNmQ0LDdcdWM2ZDQsOFx1YzZkNCw5XHVjNmQ0LDEwXHVjNmQ0LDExXHVjNmQ0LDEyXHVjNmQ0Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiIxXHVjNmQ0LDJcdWM2ZDQsM1x1YzZkNCw0XHVjNmQ0LDVcdWM2ZDQsNlx1YzZkNCw3XHVjNmQ0LDhcdWM2ZDQsOVx1YzZkNCwxMFx1YzZkNCwxMVx1YzZkNCwxMlx1YzZkNCIuc3BsaXQoIiwiKSwgTU9OVEhTOiIxXHVjNmQ0LDJcdWM2ZDQsM1x1YzZkNCw0XHVjNmQ0LDVcdWM2ZDQsNlx1YzZkNCw3XHVjNmQ0LDhcdWM2ZDQsOVx1YzZkNCwxMFx1YzZkNCwxMVx1YzZkNCwxMlx1YzZkNCIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVNT05USFM6IjFcdWM2ZDQsMlx1YzZkNCwzXHVjNmQ0LDRcdWM2ZDQsNVx1YzZkNCw2XHVjNmQ0LDdcdWM2ZDQsOFx1YzZkNCw5XHVjNmQ0LDEwXHVjNmQ0LDExXHVjNmQ0LDEyXHVjNmQ0Ii5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiMVx1YzZkNCwyXHVjNmQ0LDNcdWM2ZDQsNFx1YzZkNCw1XHVjNmQ0LDZcdWM2ZDQsN1x1YzZkNCw4XHVjNmQ0LDlcdWM2ZDQsMTBcdWM2ZDQsMTFcdWM2ZDQsMTJcdWM2ZDQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiMVx1YzZkNCwyXHVjNmQ0LDNcdWM2ZDQsNFx1YzZkNCw1XHVjNmQ0LDZcdWM2ZDQsN1x1YzZkNCw4XHVjNmQ0LDlcdWM2ZDQsMTBcdWM2ZDQsMTFcdWM2ZDQsMTJcdWM2ZDQiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJcdWM3N2NcdWM2OTRcdWM3N2MsXHVjNmQ0XHVjNjk0XHVjNzdjLFx1ZDY1NFx1YzY5NFx1Yzc3YyxcdWMyMThcdWM2OTRcdWM3N2MsXHViYWE5XHVjNjk0XHVjNzdjLFx1YWUwOFx1YzY5NFx1Yzc3YyxcdWQxYTBcdWM2OTRcdWM3N2MiLnNwbGl0KCIsIiksIApTVEFOREFMT05FV0VFS0RBWVM6Ilx1Yzc3Y1x1YzY5NFx1Yzc3YyxcdWM2ZDRcdWM2OTRcdWM3N2MsXHVkNjU0XHVjNjk0XHVjNzdjLFx1YzIxOFx1YzY5NFx1Yzc3YyxcdWJhYTlcdWM2OTRcdWM3N2MsXHVhZTA4XHVjNjk0XHVjNzdjLFx1ZDFhMFx1YzY5NFx1Yzc3YyIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiXHVjNzdjLFx1YzZkNCxcdWQ2NTQsXHVjMjE4LFx1YmFhOSxcdWFlMDgsXHVkMWEwIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiXHVjNzdjLFx1YzZkNCxcdWQ2NTQsXHVjMjE4LFx1YmFhOSxcdWFlMDgsXHVkMWEwIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiXHVjNzdjLFx1YzZkNCxcdWQ2NTQsXHVjMjE4LFx1YmFhOSxcdWFlMDgsXHVkMWEwIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6Ilx1Yzc3YyxcdWM2ZDQsXHVkNjU0LFx1YzIxOCxcdWJhYTksXHVhZTA4LFx1ZDFhMCIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIjFcdWJkODRcdWFlMzAiLCAKIjJcdWJkODRcdWFlMzAiLCAiM1x1YmQ4NFx1YWUzMCIsICI0XHViZDg0XHVhZTMwIl0sIFFVQVJURVJTOlsiXHVjODFjIDEvNFx1YmQ4NFx1YWUzMCIsICJcdWM4MWMgMi80XHViZDg0XHVhZTMwIiwgIlx1YzgxYyAzLzRcdWJkODRcdWFlMzAiLCAiXHVjODFjIDQvNFx1YmQ4NFx1YWUzMCJdLCBBTVBNUzpbIlx1YzYyNFx1YzgwNCIsICJcdWM2MjRcdWQ2YzQiXSwgREFURUZPUk1BVFM6WyJ5XHViMTQ0IE1cdWM2ZDQgZFx1Yzc3YyBFRUVFIiwgInlcdWIxNDQgTVx1YzZkNCBkXHVjNzdjIiwgInl5eXkuIE0uIGQuIiwgInl5LiBNLiBkLiJdLCBUSU1FRk9STUFUUzpbImEgaFx1YzJkYyBtXHViZDg0IHNcdWNkMDggenp6eiIsICJhIGhcdWMyZGMgbVx1YmQ4NCBzXHVjZDA4IHoiLCAiYSBoOm1tOnNzIiwgImEgaDptbSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbG4gPSB7RVJBUzpbImxpYlx1MDBmM3NvIHlhIiwgIm5zaW1hIHlhIFkiXSwgRVJBTkFNRVM6WyJZYW1ibyB5YSBZXHUwMGU5enUgS3JcdTAwZWRzIiwgIk5zaW1hIHlhIFlcdTAwZTl6dSBLclx1MDBlZHMiXSwgTkFSUk9XTU9OVEhTOiJ5LGYsbSxhLG0seSx5LGEscyxcdTAyNTQsbixkIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJ5LGYsbSxhLG0seSx5LGEscyxcdTAyNTQsbixkIi5zcGxpdCgiLCIpLCBNT05USFM6InNcdTAwZTFuelx1MDBlMSB5YSB5YW1ibyxzXHUwMGUxbnpcdTAwZTEgeWEgbVx1MDBlZGJhbFx1MDBlOSxzXHUwMGUxbnpcdTAwZTEgeWEgbVx1MDBlZHNcdTAwZTF0byxzXHUwMGUxbnpcdTAwZTEgeWEgbVx1MDBlZG5laSxzXHUwMGUxbnpcdTAwZTEgeWEgbVx1MDBlZHRcdTAwZTFubyxzXHUwMGUxbnpcdTAwZTEgeWEgbW90XHUwMGYzYlx1MDBlMSxzXHUwMGUxbnpcdTAwZTEgeWEgbnNhbWJvLHNcdTAwZTFuelx1MDBlMSB5YSBtd2FtYmUsc1x1MDBlMW56XHUwMGUxIHlhIGxpYndhLHNcdTAwZTFuelx1MDBlMSB5YSB6XHUwMGYzbWksc1x1MDBlMW56XHUwMGUxIHlhIHpcdTAwZjNtaSBuYSBtXHUwMjU0XHUwMzBja1x1MDI1NFx1MDMwMSxzXHUwMGUxbnpcdTAwZTEgeWEgelx1MDBmM21pIG5hIG1cdTAwZWRiYWxcdTAwZTkiLnNwbGl0KCIsIiksIApTVEFOREFMT05FTU9OVEhTOiJzXHUwMGUxbnpcdTAwZTEgeWEgeWFtYm8sc1x1MDBlMW56XHUwMGUxIHlhIG1cdTAwZWRiYWxcdTAwZTksc1x1MDBlMW56XHUwMGUxIHlhIG1cdTAwZWRzXHUwMGUxdG8sc1x1MDBlMW56XHUwMGUxIHlhIG1cdTAwZWRuZWksc1x1MDBlMW56XHUwMGUxIHlhIG1cdTAwZWR0XHUwMGUxbm8sc1x1MDBlMW56XHUwMGUxIHlhIG1vdFx1MDBmM2JcdTAwZTEsc1x1MDBlMW56XHUwMGUxIHlhIG5zYW1ibyxzXHUwMGUxbnpcdTAwZTEgeWEgbXdhbWJlLHNcdTAwZTFuelx1MDBlMSB5YSBsaWJ3YSxzXHUwMGUxbnpcdTAwZTEgeWEgelx1MDBmM21pLHNcdTAwZTFuelx1MDBlMSB5YSB6XHUwMGYzbWkgbmEgbVx1MDI1NFx1MDMwY2tcdTAyNTRcdTAzMDEsc1x1MDBlMW56XHUwMGUxIHlhIHpcdTAwZjNtaSBuYSBtXHUwMGVkYmFsXHUwMGU5Ii5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoieWFuLGZibCxtc2ksYXBsLG1haSx5dW4seXVsLGFndCxzdGIsXHUwMjU0dGIsbnZiLGRzYiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoieWFuLGZibCxtc2ksYXBsLG1haSx5dW4seXVsLGFndCxzdGIsXHUwMjU0dGIsbnZiLGRzYiIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6ImV5ZW5nYSxtb2tcdTAyNTRsXHUwMjU0IG13YSB5YW1ibyxtb2tcdTAyNTRsXHUwMjU0IG13YSBtXHUwMGVkYmFsXHUwMGU5LG1va1x1MDI1NGxcdTAyNTQgbXdhIG1cdTAwZWRzXHUwMGUxdG8sbW9rXHUwMjU0bFx1MDI1NCB5YSBtXHUwMGVkblx1MDBlOWksbW9rXHUwMjU0bFx1MDI1NCB5YSBtXHUwMGVkdFx1MDBlMW5vLG1wXHUwMjU0XHUwMzAxc1x1MDI1NCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJleWVuZ2EsbW9rXHUwMjU0bFx1MDI1NCBtd2EgeWFtYm8sbW9rXHUwMjU0bFx1MDI1NCBtd2EgbVx1MDBlZGJhbFx1MDBlOSxtb2tcdTAyNTRsXHUwMjU0IG13YSBtXHUwMGVkc1x1MDBlMXRvLG1va1x1MDI1NGxcdTAyNTQgeWEgbVx1MDBlZG5cdTAwZTlpLG1va1x1MDI1NGxcdTAyNTQgeWEgbVx1MDBlZHRcdTAwZTFubyxtcFx1MDI1NFx1MDMwMXNcdTAyNTQiLnNwbGl0KCIsIiksIApTSE9SVFdFRUtEQVlTOiJleWUseWJvLG1ibCxtc3QsbWluLG10bixtcHMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJleWUseWJvLG1ibCxtc3QsbWluLG10bixtcHMiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJlLHksbSxtLG0sbSxwIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6ImUseSxtLG0sbSxtLHAiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJTTTEiLCAiU00yIiwgIlNNMyIsICJTTTQiXSwgUVVBUlRFUlM6WyJzXHUwMGUxbnpcdTAwZTEgbVx1MDBlZHNcdTAwZTF0byB5YSB5YW1ibyIsICJzXHUwMGUxbnpcdTAwZTEgbVx1MDBlZHNcdTAwZTF0byB5YSBtXHUwMGVkYmFsXHUwMGU5IiwgInNcdTAwZTFuelx1MDBlMSBtXHUwMGVkc1x1MDBlMXRvIHlhIG1cdTAwZWRzXHUwMGUxdG8iLCAic1x1MDBlMW56XHUwMGUxIG1cdTAwZWRzXHUwMGUxdG8geWEgbVx1MDBlZG5laSJdLCBBTVBNUzpbIm50XHUwMjU0XHUwMzAxbmdcdTAyNTRcdTAzMDEiLCAKIm1wXHUwMGYza3dhIl0sIERBVEVGT1JNQVRTOlsiRUVFRSBkIE1NTU0geSIsICJkIE1NTU0geSIsICJkIE1NTSB5IiwgImQvTS95eXl5Il0sIFRJTUVGT1JNQVRTOlsiSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdCA9IHtFUkFTOlsicHIuIEtyLiIsICJwbyBLci4iXSwgRVJBTkFNRVM6WyJwcmllXHUwMTYxIEtyaXN0XHUwMTczIiwgInBvIEtyaXN0YXVzIl0sIE5BUlJPV01PTlRIUzoiUyxWLEssQixHLEIsTCxSLFIsUyxMLEciLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IlMsVixLLEIsRyxCLEwsUixSLFMsTCxHIi5zcGxpdCgiLCIpLCBNT05USFM6InNhdXNpbyx2YXNhcmlzLGtvdmFzLGJhbGFuZGlzLGdlZ3VcdTAxN2VcdTAxMTcsYmlyXHUwMTdlZWxpcyxsaWVwYSxydWdwalx1MDE2YnRpcyxydWdzXHUwMTE3amlzLHNwYWxpcyxsYXBrcml0aXMsZ3J1b2RpcyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiU2F1c2lzLFZhc2FyaXMsS292YXMsQmFsYW5kaXMsR2VndVx1MDE3ZVx1MDExNyxCaXJcdTAxN2VlbGlzLExpZXBhLFJ1Z3BqXHUwMTZidGlzLFJ1Z3NcdTAxMTdqaXMsU3BhbGlzLExhcGtyaXRpcyxHcnVvZGlzIi5zcGxpdCgiLCIpLCAKU0hPUlRNT05USFM6IlNhdXMuLFZhcyxLb3YuLEJhbC4sR2VnLixCaXIuLExpZXAuLFJ1Z3AuLFJ1Z3MuLFNwYWwuLExhcGtyLixHcnVvZC4iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiU2F1cy4sVmFzLixLb3YuLEJhbC4sR2VnLixCaXIuLExpZXAuLFJ1Z3AuLFJ1Z3MuLFNwYWwuLExhcGtyLixHcnVvZC4iLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJzZWttYWRpZW5pcyxwaXJtYWRpZW5pcyxhbnRyYWRpZW5pcyx0cmVcdTAxMGRpYWRpZW5pcyxrZXR2aXJ0YWRpZW5pcyxwZW5rdGFkaWVuaXMsXHUwMTYxZVx1MDE2MXRhZGllbmlzIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6InNla21hZGllbmlzLHBpcm1hZGllbmlzLGFudHJhZGllbmlzLHRyZVx1MDEwZGlhZGllbmlzLGtldHZpcnRhZGllbmlzLHBlbmt0YWRpZW5pcyxcdTAxNjFlXHUwMTYxdGFkaWVuaXMiLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6IlNrLFByLEFuLFRyLEt0LFBuLFx1MDE2MHQiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiU2ssUHIsQW4sVHIsS3QsUG4sXHUwMTYwdCIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IlMsUCxBLFQsSyxQLFx1MDE2MCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJTLFAsQSxULEssUCxcdTAxNjAiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJJIGsuIiwgIklJIGsuIiwgIklJSSBrLiIsICJJViBrZXR2LiJdLCBRVUFSVEVSUzpbIkkga2V0dmlydGlzIiwgIklJIGtldHZpcnRpcyIsICJJSUkga2V0dmlydGlzIiwgIklWIGtldHZpcnRpcyJdLCBBTVBNUzpbInByaWVcdTAxNjFwaWV0IiwgInBvcGlldCJdLCBEQVRFRk9STUFUUzpbInkgJ20nLiBNTU1NIGQgJ2QnLiwgRUVFRSIsICJ5ICdtJy4gTU1NTSBkICdkJy4iLCAieSBNTU0gZCIsICJ5eXl5LU1NLWRkIl0sIFRJTUVGT1JNQVRTOlsiSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIApXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHYgPSB7RVJBUzpbInAubS5cdTAxMTMuIiwgIm0uXHUwMTEzLiJdLCBFUkFOQU1FUzpbInBpcm1zIG1cdTAxNmJzdSBcdTAxMTNyYXMiLCAibVx1MDE2YnN1IFx1MDExM3JcdTAxMDEiXSwgTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIE1PTlRIUzoiamFudlx1MDEwMXJpcyxmZWJydVx1MDEwMXJpcyxtYXJ0cyxhcHJcdTAxMmJsaXMsbWFpanMsalx1MDE2Ym5panMsalx1MDE2YmxpanMsYXVndXN0cyxzZXB0ZW1icmlzLG9rdG9icmlzLG5vdmVtYnJpcyxkZWNlbWJyaXMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6ImphbnZcdTAxMDFyaXMsZmVicnVcdTAxMDFyaXMsbWFydHMsYXByXHUwMTJibGlzLG1haWpzLGpcdTAxNmJuaWpzLGpcdTAxNmJsaWpzLGF1Z3VzdHMsc2VwdGVtYnJpcyxva3RvYnJpcyxub3ZlbWJyaXMsZGVjZW1icmlzIi5zcGxpdCgiLCIpLCAKU0hPUlRNT05USFM6ImphbnYuLGZlYnIuLG1hcnRzLGFwci4sbWFpanMsalx1MDE2Ym4uLGpcdTAxNmJsLixhdWcuLHNlcHQuLG9rdC4sbm92LixkZWMuIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRNT05USFM6ImphbnYuLGZlYnIuLG1hcnRzLGFwci4sbWFpanMsalx1MDE2Ym4uLGpcdTAxNmJsLixhdWcuLHNlcHQuLG9rdC4sbm92LixkZWMuIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoic3ZcdTAxMTN0ZGllbmEscGlybWRpZW5hLG90cmRpZW5hLHRyZVx1MDE2MWRpZW5hLGNldHVydGRpZW5hLHBpZWt0ZGllbmEsc2VzdGRpZW5hIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6InN2XHUwMTEzdGRpZW5hLHBpcm1kaWVuYSxvdHJkaWVuYSx0cmVcdTAxNjFkaWVuYSxjZXR1cnRkaWVuYSxwaWVrdGRpZW5hLHNlc3RkaWVuYSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiU3YsUHIsT3QsVHIsQ2UsUGssU2UiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJTdixQcixPdCxUcixDZSxQayxTZSIuc3BsaXQoIiwiKSwgCk5BUlJPV1dFRUtEQVlTOiJTLFAsTyxULEMsUCxTIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6IlMsUCxPLFQsQyxQLFMiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJDMSIsICJDMiIsICJDMyIsICJDNCJdLCBRVUFSVEVSUzpbIjEuIGNldHVya3NuaXMiLCAiMi4gY2V0dXJrc25pcyIsICIzLiBjZXR1cmtzbmlzIiwgIjQuIGNldHVya3NuaXMiXSwgQU1QTVM6WyJwcmlla1x1MDE2MXB1c2RpZW5cdTAxMDEiLCAicFx1MDExM2NwdXNkaWVuXHUwMTAxIl0sIERBVEVGT1JNQVRTOlsiRUVFRSwgeS4gJ2dhZGEnIGQuIE1NTU0iLCAieS4gJ2dhZGEnIGQuIE1NTU0iLCAieS4gJ2dhZGEnIGQuIE1NTSIsICJkZC5NTS55eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWwgPSB7RVJBUzpbIlx1MGQxNVx1MGQ0ZFx1MGQzMFx1MGQzZi5cdTBkMmVcdTBkNDIiLCAiXHUwZDE1XHUwZDRkXHUwZDMwXHUwZDNmLlx1MGQyYVx1MGQzZi4iXSwgRVJBTkFNRVM6WyJcdTBkMTVcdTBkNGRcdTBkMzBcdTBkM2ZcdTBkMzhcdTBkNGRcdTBkMjRcdTBkNDFcdTBkMzVcdTBkM2ZcdTBkMjhcdTBkNDFcdTBkNGQgXHUwZDJlXHUwZDQxXHUwZDJlXHUwZDRkXHUwZDJhXHUwZDRkXHUyMDBjIiwgIlx1MGQxNVx1MGQ0ZFx1MGQzMFx1MGQzZlx1MGQzOFx1MGQ0ZFx1MGQyNFx1MGQ0MVx1MGQzNVx1MGQzZlx1MGQyOFx1MGQ0ZCBcdTBkMmFcdTBkM2ZcdTBkMjhcdTBkNGRcdTIwMGRcdTBkMmFcdTBkNGQiXSwgTkFSUk9XTU9OVEhTOiJcdTBkMWMsXHUwZDJiXHUwZDQ2LFx1MGQyZVx1MGQzZSxcdTBkMGYsXHUwZDJlXHUwZDQ3LFx1MGQxY1x1MGQ0MixcdTBkMWNcdTBkNDIsXHUwZDEzLFx1MGQzOFx1MGQ0NixcdTBkMTIsXHUwZDI4LFx1MGQyMVx1MGQzZiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MGQxYyxcdTBkMmJcdTBkNDYsXHUwZDJlXHUwZDNlLFx1MGQwZixcdTBkMmVcdTBkNDcsXHUwZDFjXHUwZDQyLFx1MGQxY1x1MGQ0MixcdTBkMTMsXHUwZDM4XHUwZDQ2LFx1MGQxMixcdTBkMjgsXHUwZDIxXHUwZDNmIi5zcGxpdCgiLCIpLCBNT05USFM6Ilx1MGQxY1x1MGQyOFx1MGQ0MVx1MGQzNVx1MGQzMFx1MGQzZixcdTBkMmJcdTBkNDZcdTBkMmNcdTBkNGRcdTBkMzBcdTBkNDFcdTBkMzVcdTBkMzBcdTBkM2YsXHUwZDJlXHUwZDNlXHUwZDMwXHUwZDRkXHUyMDBkXHUwZDFhXHUwZDRkXHUwZDFhXHUwZDRkLFx1MGQwZlx1MGQyYVx1MGQ0ZFx1MGQzMFx1MGQzZlx1MGQzMlx1MGQ0ZFx1MjAwZCxcdTBkMmVcdTBkNDdcdTBkMmZcdTBkNGQsXHUwZDFjXHUwZDQyXHUwZDIzXHUwZDRkXHUyMDBkLFx1MGQxY1x1MGQ0Mlx1MGQzMlx1MGQ0OCxcdTBkMDZcdTBkMTdcdTBkMzhcdTBkNGRcdTBkMzFcdTBkNGRcdTBkMzFcdTBkNGQsXHUwZDM4XHUwZDQ2XHUwZDJhXHUwZDRkXHUwZDMxXHUwZDRkXHUwZDMxXHUwZDAyXHUwZDJjXHUwZDMwXHUwZDRkXHUyMDBkLFx1MGQxMlx1MGQxNVx1MGQ0ZFx1MGQxZlx1MGQ0Ylx1MGQyY1x1MGQzMFx1MGQ0ZFx1MjAwZCxcdTBkMjhcdTBkMzVcdTBkMDJcdTBkMmNcdTBkMzBcdTBkNGRcdTIwMGQsXHUwZDIxXHUwZDNmXHUwZDM4XHUwZDAyXHUwZDJjXHUwZDMwXHUwZDRkXHUyMDBkIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORU1PTlRIUzoiXHUwZDFjXHUwZDI4XHUwZDQxXHUwZDM1XHUwZDMwXHUwZDNmLFx1MGQyYlx1MGQ0Nlx1MGQyY1x1MGQ0ZFx1MGQzMFx1MGQ0MVx1MGQzNVx1MGQzMFx1MGQzZixcdTBkMmVcdTBkM2VcdTBkMzBcdTBkNGRcdTIwMGRcdTBkMWFcdTBkNGRcdTBkMWFcdTBkNGQsXHUwZDBmXHUwZDJhXHUwZDRkXHUwZDMwXHUwZDNmXHUwZDMyXHUwZDRkXHUyMDBkLFx1MGQyZVx1MGQ0N1x1MGQyZlx1MGQ0ZCxcdTBkMWNcdTBkNDJcdTBkMjNcdTBkNGRcdTIwMGQsXHUwZDFjXHUwZDQyXHUwZDMyXHUwZDQ4LFx1MGQwNlx1MGQxN1x1MGQzOFx1MGQ0ZFx1MGQzMVx1MGQ0ZFx1MGQzMVx1MGQ0ZCxcdTBkMzhcdTBkNDZcdTBkMmFcdTBkNGRcdTBkMzFcdTBkNGRcdTBkMzFcdTBkMDJcdTBkMmNcdTBkMzBcdTBkNGRcdTIwMGQsXHUwZDEyXHUwZDE1XHUwZDRkXHUwZDFmXHUwZDRiXHUwZDJjXHUwZDMwXHUwZDRkXHUyMDBkLFx1MGQyOFx1MGQzNVx1MGQwMlx1MGQyY1x1MGQzMFx1MGQ0ZFx1MjAwZCxcdTBkMjFcdTBkM2ZcdTBkMzhcdTBkMDJcdTBkMmNcdTBkMzBcdTBkNGRcdTIwMGQiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoiXHUwZDFjXHUwZDI4XHUwZDQxLFx1MGQyYlx1MGQ0Nlx1MGQyY1x1MGQ0ZFx1MGQzMFx1MGQ0MSxcdTBkMmVcdTBkM2VcdTBkMzBcdTBkNGRcdTIwMGQsXHUwZDBmXHUwZDJhXHUwZDRkXHUwZDMwXHUwZDNmLFx1MGQyZVx1MGQ0N1x1MGQyZlx1MGQ0ZCxcdTBkMWNcdTBkNDJcdTBkMjNcdTBkNGRcdTIwMGQsXHUwZDFjXHUwZDQyXHUwZDMyXHUwZDQ4LFx1MGQxM1x1MGQxNyxcdTBkMzhcdTBkNDZcdTBkMmFcdTBkNGRcdTBkMzFcdTBkNGRcdTBkMzFcdTBkMDIsXHUwZDEyXHUwZDE1XHUwZDRkXHUwZDFmXHUwZDRiLFx1MGQyOFx1MGQzNVx1MGQwMixcdTBkMjFcdTBkM2ZcdTBkMzhcdTBkMDIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwZDFjXHUwZDI4XHUwZDQxLFx1MGQyYlx1MGQ0Nlx1MGQyY1x1MGQ0ZFx1MGQzMFx1MGQ0MSxcdTBkMmVcdTBkM2VcdTBkMzBcdTBkNGRcdTIwMGQsXHUwZDBmXHUwZDJhXHUwZDRkXHUwZDMwXHUwZDNmLFx1MGQyZVx1MGQ0N1x1MGQyZlx1MGQ0ZCxcdTBkMWNcdTBkNDJcdTBkMjNcdTBkNGRcdTIwMGQsXHUwZDFjXHUwZDQyXHUwZDMyXHUwZDQ4LFx1MGQxM1x1MGQxNyxcdTBkMzhcdTBkNDZcdTBkMmFcdTBkNGRcdTBkMzFcdTBkNGRcdTBkMzFcdTBkMDIsXHUwZDEyXHUwZDE1XHUwZDRkXHUwZDFmXHUwZDRiLFx1MGQyOFx1MGQzNVx1MGQwMixcdTBkMjFcdTBkM2ZcdTBkMzhcdTBkMDIiLnNwbGl0KCIsIiksIApXRUVLREFZUzoiXHUwZDFlXHUwZDNlXHUwZDJmXHUwZDMxXHUwZDNlXHUwZDM0XHUwZDRkXHUwZDFhLFx1MGQyNFx1MGQzZlx1MGQxOVx1MGQ0ZFx1MGQxNVx1MGQzM1x1MGQzZVx1MGQzNFx1MGQ0ZFx1MGQxYSxcdTBkMWFcdTBkNGFcdTBkMzVcdTBkNGRcdTBkMzVcdTBkM2VcdTBkMzRcdTBkNGRcdTBkMWEsXHUwZDJjXHUwZDQxXHUwZDI3XHUwZDI4XHUwZDNlXHUwZDM0XHUwZDRkXHUwZDFhLFx1MGQzNVx1MGQ0ZFx1MGQyZlx1MGQzZVx1MGQzNFx1MGQzZVx1MGQzNFx1MGQ0ZFx1MGQxYSxcdTBkMzVcdTBkNDZcdTBkMzNcdTBkNGRcdTBkMzNcdTBkM2ZcdTBkMmZcdTBkM2VcdTBkMzRcdTBkNGRcdTBkMWEsXHUwZDM2XHUwZDI4XHUwZDNmXHUwZDJmXHUwZDNlXHUwZDM0XHUwZDRkXHUwZDFhIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Ilx1MGQxZVx1MGQzZVx1MGQyZlx1MGQzMVx1MGQzZVx1MGQzNFx1MGQ0ZFx1MGQxYSxcdTBkMjRcdTBkM2ZcdTBkMTlcdTBkNGRcdTBkMTVcdTBkMzNcdTBkM2VcdTBkMzRcdTBkNGRcdTBkMWEsXHUwZDFhXHUwZDRhXHUwZDM1XHUwZDRkXHUwZDM1XHUwZDNlXHUwZDM0XHUwZDRkXHUwZDFhLFx1MGQyY1x1MGQ0MVx1MGQyN1x1MGQyOFx1MGQzZVx1MGQzNFx1MGQ0ZFx1MGQxYSxcdTBkMzVcdTBkNGRcdTBkMmZcdTBkM2VcdTBkMzRcdTBkM2VcdTBkMzRcdTBkNGRcdTBkMWEsXHUwZDM1XHUwZDQ2XHUwZDMzXHUwZDRkXHUwZDMzXHUwZDNmXHUwZDJmXHUwZDNlXHUwZDM0XHUwZDRkXHUwZDFhLFx1MGQzNlx1MGQyOFx1MGQzZlx1MGQyZlx1MGQzZVx1MGQzNFx1MGQ0ZFx1MGQxYSIuc3BsaXQoIiwiKSwgClNIT1JUV0VFS0RBWVM6Ilx1MGQxZVx1MGQzZVx1MGQyZlx1MGQzMFx1MGQ0ZFx1MjAwZCxcdTBkMjRcdTBkM2ZcdTBkMTlcdTBkNGRcdTBkMTVcdTBkMzNcdTBkNGRcdTIwMGQsXHUwZDFhXHUwZDRhXHUwZDM1XHUwZDRkXHUwZDM1LFx1MGQyY1x1MGQ0MVx1MGQyN1x1MGQyOFx1MGQ0ZFx1MjAwZCxcdTBkMzVcdTBkNGRcdTBkMmZcdTBkM2VcdTBkMzRcdTBkMDIsXHUwZDM1XHUwZDQ2XHUwZDMzXHUwZDRkXHUwZDMzXHUwZDNmLFx1MGQzNlx1MGQyOFx1MGQzZiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MGQxZVx1MGQzZVx1MGQyZlx1MGQzMFx1MGQ0ZFx1MjAwZCxcdTBkMjRcdTBkM2ZcdTBkMTlcdTBkNGRcdTBkMTVcdTBkMzNcdTBkNGRcdTIwMGQsXHUwZDFhXHUwZDRhXHUwZDM1XHUwZDRkXHUwZDM1LFx1MGQyY1x1MGQ0MVx1MGQyN1x1MGQyOFx1MGQ0ZFx1MjAwZCxcdTBkMzVcdTBkNGRcdTBkMmZcdTBkM2VcdTBkMzRcdTBkMDIsXHUwZDM1XHUwZDQ2XHUwZDMzXHUwZDRkXHUwZDMzXHUwZDNmLFx1MGQzNlx1MGQyOFx1MGQzZiIuc3BsaXQoIiwiKSwgCk5BUlJPV1dFRUtEQVlTOiJcdTBkMWVcdTBkM2UsXHUwZDI0XHUwZDNmLFx1MGQxYVx1MGQ0YSxcdTBkMmNcdTBkNDEsXHUwZDM1XHUwZDRkXHUwZDJmXHUwZDNlLFx1MGQzNVx1MGQ0NixcdTBkMzYiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiXHUwZDFlXHUwZDNlLFx1MGQyNFx1MGQzZixcdTBkMWFcdTBkNGEsXHUwZDJjXHUwZDQxLFx1MGQzNVx1MGQ0ZFx1MGQyZlx1MGQzZSxcdTBkMzVcdTBkNDYsXHUwZDM2Ii5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAiUTMiLCAiUTQiXSwgUVVBUlRFUlM6WyJcdTBkMTJcdTBkMjhcdTBkNGRcdTBkMjhcdTBkM2VcdTBkMDIgXHUwZDJhXHUwZDNlXHUwZDI2XHUwZDAyIiwgIlx1MGQzMFx1MGQyM1x1MGQ0ZFx1MGQxZlx1MGQzZVx1MGQwMiBcdTBkMmFcdTBkM2VcdTBkMjZcdTBkMDIiLCAiXHUwZDJlXHUwZDQyXHUwZDI4XHUwZDRkXHUwZDI4XHUwZDNlXHUwZDAyIFx1MGQyYVx1MGQzZVx1MGQyNlx1MGQwMiIsIAoiXHUwZDI4XHUwZDNlXHUwZDMyXHUwZDNlXHUwZDAyIFx1MGQyYVx1MGQzZVx1MGQyNlx1MGQwMiJdLCBBTVBNUzpbIlx1MGQzMFx1MGQzZVx1MGQzNVx1MGQzZlx1MGQzMlx1MGQ0NiIsICJcdTBkMzVcdTBkNDhcdTBkMTVcdTBkNDFcdTBkMjhcdTBkNGRcdTBkMjhcdTBkNDdcdTBkMzBcdTBkMDIiXSwgREFURUZPUk1BVFM6WyJ5LCBNTU1NIGQsIEVFRUUiLCAieSwgTU1NTSBkIiwgInksIE1NTSBkIiwgImRkL01NL3l5Il0sIFRJTUVGT1JNQVRTOlsiaDptbTpzcyBhIHp6enoiLCAiaDptbTpzcyBhIHoiLCAiaDptbTpzcyBhIiwgImg6bW0gYSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzYsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXIgPSB7RVJBUzpbIlx1MDkwOFx1MDkzOFx1MDkzZVx1MDkyYVx1MDk0Mlx1MDkzMFx1MDk0ZFx1MDkzNSIsICJcdTA5MzhcdTA5MjgiXSwgRVJBTkFNRVM6WyJcdTA5MDhcdTA5MzhcdTA5MzVcdTA5NDBcdTA5MzhcdTA5MjhcdTA5MmFcdTA5NDJcdTA5MzBcdTA5NGRcdTA5MzUiLCAiXHUwOTA4XHUwOTM4XHUwOTM1XHUwOTQwXHUwOTM4XHUwOTI4Il0sIE5BUlJPV01PTlRIUzoiXHUwOTFjXHUwOTNlLFx1MDkyYlx1MDk0NyxcdTA5MmVcdTA5M2UsXHUwOTBmLFx1MDkyZVx1MDk0NyxcdTA5MWNcdTA5NDIsXHUwOTFjXHUwOTQxLFx1MDkxMSxcdTA5MzgsXHUwOTExLFx1MDkyOFx1MDk0YixcdTA5MjFcdTA5M2YiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MDkxY1x1MDkzZSxcdTA5MmJcdTA5NDcsXHUwOTJlXHUwOTNlLFx1MDkwZixcdTA5MmVcdTA5NDcsXHUwOTFjXHUwOTQyLFx1MDkxY1x1MDk0MSxcdTA5MTEsXHUwOTM4LFx1MDkxMSxcdTA5MjhcdTA5NGIsXHUwOTIxXHUwOTNmIi5zcGxpdCgiLCIpLCAKTU9OVEhTOiJcdTA5MWNcdTA5M2VcdTA5MjhcdTA5NDdcdTA5MzVcdTA5M2VcdTA5MzBcdTA5NDAsXHUwOTJiXHUwOTQ3XHUwOTJjXHUwOTRkXHUwOTMwXHUwOTQxXHUwOTM1XHUwOTNlXHUwOTMwXHUwOTQwLFx1MDkyZVx1MDkzZVx1MDkzMFx1MDk0ZFx1MDkxYSxcdTA5MGZcdTA5MmFcdTA5NGRcdTA5MzBcdTA5M2ZcdTA5MzIsXHUwOTJlXHUwOTQ3LFx1MDkxY1x1MDk0Mlx1MDkyOCxcdTA5MWNcdTA5NDFcdTA5MzJcdTA5NDgsXHUwOTExXHUwOTE3XHUwOTM4XHUwOTRkXHUwOTFmLFx1MDkzOFx1MDkyYVx1MDk0ZFx1MDkxZlx1MDk0N1x1MDkwMlx1MDkyY1x1MDkzMCxcdTA5MTFcdTA5MTVcdTA5NGRcdTA5MWZcdTA5NGJcdTA5MmNcdTA5MzAsXHUwOTI4XHUwOTRiXHUwOTM1XHUwOTRkXHUwOTM5XHUwOTQ3XHUwOTAyXHUwOTJjXHUwOTMwLFx1MDkyMVx1MDkzZlx1MDkzOFx1MDk0N1x1MDkwMlx1MDkyY1x1MDkzMCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiXHUwOTFjXHUwOTNlXHUwOTI4XHUwOTQ3XHUwOTM1XHUwOTNlXHUwOTMwXHUwOTQwLFx1MDkyYlx1MDk0N1x1MDkyY1x1MDk0ZFx1MDkzMFx1MDk0MVx1MDkzNVx1MDkzZVx1MDkzMFx1MDk0MCxcdTA5MmVcdTA5M2VcdTA5MzBcdTA5NGRcdTA5MWEsXHUwOTBmXHUwOTJhXHUwOTRkXHUwOTMwXHUwOTNmXHUwOTMyLFx1MDkyZVx1MDk0NyxcdTA5MWNcdTA5NDJcdTA5MjgsXHUwOTFjXHUwOTQxXHUwOTMyXHUwOTQ4LFx1MDkxMVx1MDkxN1x1MDkzOFx1MDk0ZFx1MDkxZixcdTA5MzhcdTA5MmFcdTA5NGRcdTA5MWZcdTA5NDdcdTA5MDJcdTA5MmNcdTA5MzAsXHUwOTExXHUwOTE1XHUwOTRkXHUwOTFmXHUwOTRiXHUwOTJjXHUwOTMwLFx1MDkyOFx1MDk0Ylx1MDkzNVx1MDk0ZFx1MDkzOVx1MDk0N1x1MDkwMlx1MDkyY1x1MDkzMCxcdTA5MjFcdTA5M2ZcdTA5MzhcdTA5NDdcdTA5MDJcdTA5MmNcdTA5MzAiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoiXHUwOTFjXHUwOTNlXHUwOTI4XHUwOTQ3LFx1MDkyYlx1MDk0N1x1MDkyY1x1MDk0ZFx1MDkzMFx1MDk0MSxcdTA5MmVcdTA5M2VcdTA5MzBcdTA5NGRcdTA5MWEsXHUwOTBmXHUwOTJhXHUwOTRkXHUwOTMwXHUwOTNmLFx1MDkyZVx1MDk0NyxcdTA5MWNcdTA5NDJcdTA5MjgsXHUwOTFjXHUwOTQxXHUwOTMyXHUwOTQ4LFx1MDkxMVx1MDkxNyxcdTA5MzhcdTA5NDdcdTA5MmFcdTA5NGRcdTA5MWZcdTA5NDdcdTA5MDIsXHUwOTExXHUwOTE1XHUwOTRkXHUwOTFmXHUwOTRiXHUwOTJjXHUwOTMwLFx1MDkyOFx1MDk0Ylx1MDkzNVx1MDk0ZFx1MDkzOVx1MDk0N1x1MDkwMixcdTA5MjFcdTA5M2ZcdTA5MzhcdTA5NDdcdTA5MDIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwOTFjXHUwOTNlXHUwOTI4XHUwOTQ3LFx1MDkyYlx1MDk0N1x1MDkyY1x1MDk0ZFx1MDkzMFx1MDk0MSxcdTA5MmVcdTA5M2VcdTA5MzBcdTA5NGRcdTA5MWEsXHUwOTBmXHUwOTJhXHUwOTRkXHUwOTMwXHUwOTNmLFx1MDkyZVx1MDk0NyxcdTA5MWNcdTA5NDJcdTA5MjgsXHUwOTFjXHUwOTQxXHUwOTMyXHUwOTQ4LFx1MDkxMVx1MDkxNyxcdTA5MzhcdTA5NDdcdTA5MmFcdTA5NGRcdTA5MWZcdTA5NDdcdTA5MDIsXHUwOTExXHUwOTE1XHUwOTRkXHUwOTFmXHUwOTRiXHUwOTJjXHUwOTMwLFx1MDkyOFx1MDk0Ylx1MDkzNVx1MDk0ZFx1MDkzOVx1MDk0N1x1MDkwMixcdTA5MjFcdTA5M2ZcdTA5MzhcdTA5NDdcdTA5MDIiLnNwbGl0KCIsIiksIApXRUVLREFZUzoiXHUwOTMwXHUwOTM1XHUwOTNmXHUwOTM1XHUwOTNlXHUwOTMwLFx1MDkzOFx1MDk0Ylx1MDkyZVx1MDkzNVx1MDkzZVx1MDkzMCxcdTA5MmVcdTA5MDJcdTA5MTdcdTA5MzNcdTA5MzVcdTA5M2VcdTA5MzAsXHUwOTJjXHUwOTQxXHUwOTI3XHUwOTM1XHUwOTNlXHUwOTMwLFx1MDkxN1x1MDk0MVx1MDkzMFx1MDk0MVx1MDkzNVx1MDkzZVx1MDkzMCxcdTA5MzZcdTA5NDFcdTA5MTVcdTA5NGRcdTA5MzBcdTA5MzVcdTA5M2VcdTA5MzAsXHUwOTM2XHUwOTI4XHUwOTNmXHUwOTM1XHUwOTNlXHUwOTMwIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Ilx1MDkzMFx1MDkzNVx1MDkzZlx1MDkzNVx1MDkzZVx1MDkzMCxcdTA5MzhcdTA5NGJcdTA5MmVcdTA5MzVcdTA5M2VcdTA5MzAsXHUwOTJlXHUwOTAyXHUwOTE3XHUwOTMzXHUwOTM1XHUwOTNlXHUwOTMwLFx1MDkyY1x1MDk0MVx1MDkyN1x1MDkzNVx1MDkzZVx1MDkzMCxcdTA5MTdcdTA5NDFcdTA5MzBcdTA5NDFcdTA5MzVcdTA5M2VcdTA5MzAsXHUwOTM2XHUwOTQxXHUwOTE1XHUwOTRkXHUwOTMwXHUwOTM1XHUwOTNlXHUwOTMwLFx1MDkzNlx1MDkyOFx1MDkzZlx1MDkzNVx1MDkzZVx1MDkzMCIuc3BsaXQoIiwiKSwgClNIT1JUV0VFS0RBWVM6Ilx1MDkzMFx1MDkzNVx1MDkzZixcdTA5MzhcdTA5NGJcdTA5MmUsXHUwOTJlXHUwOTAyXHUwOTE3XHUwOTMzLFx1MDkyY1x1MDk0MVx1MDkyNyxcdTA5MTdcdTA5NDFcdTA5MzBcdTA5NDEsXHUwOTM2XHUwOTQxXHUwOTE1XHUwOTRkXHUwOTMwLFx1MDkzNlx1MDkyOFx1MDkzZiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MDkzMFx1MDkzNVx1MDkzZixcdTA5MzhcdTA5NGJcdTA5MmUsXHUwOTJlXHUwOTAyXHUwOTE3XHUwOTMzLFx1MDkyY1x1MDk0MVx1MDkyNyxcdTA5MTdcdTA5NDFcdTA5MzBcdTA5NDEsXHUwOTM2XHUwOTQxXHUwOTE1XHUwOTRkXHUwOTMwLFx1MDkzNlx1MDkyOFx1MDkzZiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1MDkzMCxcdTA5MzhcdTA5NGIsXHUwOTJlXHUwOTAyLFx1MDkyY1x1MDk0MSxcdTA5MTdcdTA5NDEsXHUwOTM2XHUwOTQxLFx1MDkzNiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTA5MzAsXHUwOTM4XHUwOTRiLFx1MDkyZVx1MDkwMixcdTA5MmNcdTA5NDEsXHUwOTE3XHUwOTQxLFx1MDkzNlx1MDk0MSxcdTA5MzYiLnNwbGl0KCIsIiksIApTSE9SVFFVQVJURVJTOlsiXHUwOTI0XHUwOTNmIDEiLCAiMiBcdTA5MzBcdTA5NDAgXHUwOTI0XHUwOTNmXHUwOTJlXHUwOTNlXHUwOTM5XHUwOTQwIiwgIlx1MDkyNFx1MDkzZiAzIiwgIlx1MDkyNFx1MDkzZiA0Il0sIFFVQVJURVJTOlsiXHUwOTJhXHUwOTRkXHUwOTMwXHUwOTI1XHUwOTJlIFx1MDkyNFx1MDkzZlx1MDkyZVx1MDkzZVx1MDkzOVx1MDk0MCIsICJcdTA5MjZcdTA5NGRcdTA5MzVcdTA5M2ZcdTA5MjRcdTA5NDBcdTA5MmYgXHUwOTI0XHUwOTNmXHUwOTJlXHUwOTNlXHUwOTM5XHUwOTQwIiwgIlx1MDkyNFx1MDk0M1x1MDkyNFx1MDk0MFx1MDkyZiBcdTA5MjRcdTA5M2ZcdTA5MmVcdTA5M2VcdTA5MzlcdTA5NDAiLCAiXHUwOTFhXHUwOTI0XHUwOTQxXHUwOTMwXHUwOTRkXHUwOTI1IFx1MDkyNFx1MDkzZlx1MDkyZVx1MDkzZVx1MDkzOVx1MDk0MCJdLCBBTVBNUzpbIlx1MDkyZS5cdTA5MmFcdTA5NDIuIiwgIlx1MDkyZS5cdTA5MjhcdTA5MDIuIl0sIERBVEVGT1JNQVRTOlsiRUVFRSBkIE1NTU0geSIsIAoiZCBNTU1NIHkiLCAiZCBNTU0geSIsICJkLU0teXkiXSwgVElNRUZPUk1BVFM6WyJoLW1tLXNzIGEgenp6eiIsICJoLW1tLXNzIGEgeiIsICJoLW1tLXNzIGEiLCAiaC1tbSBhIl0sIEZJUlNUREFZT0ZXRUVLOjYsIFdFRUtFTkRSQU5HRTpbNiwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWToyfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tcyA9IHtFUkFTOlsiUy5NLiIsICJUTSJdLCBFUkFOQU1FUzpbIlMuTS4iLCAiVE0iXSwgTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLE8sUyxPLE4sRCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixPLFMsTyxOLEQiLnNwbGl0KCIsIiksIE1PTlRIUzoiSmFudWFyaSxGZWJydWFyaSxNYWMsQXByaWwsTWVpLEp1bixKdWxhaSxPZ29zLFNlcHRlbWJlcixPa3RvYmVyLE5vdmVtYmVyLERpc2VtYmVyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJKYW51YXJpLEZlYnJ1YXJpLE1hYyxBcHJpbCxNZWksSnVuLEp1bGFpLE9nb3MsU2VwdGVtYmVyLE9rdG9iZXIsTm92ZW1iZXIsRGlzZW1iZXIiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKYW4sRmViLE1hYyxBcHIsTWVpLEp1bixKdWwsT2dvcyxTZXAsT2t0LE5vdixEaXMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiSmFuLEZlYixNYWMsQXByLE1laSxKdW4sSnVsLE9nb3MsU2VwLE9rdCxOb3YsRGlzIi5zcGxpdCgiLCIpLCAKV0VFS0RBWVM6IkFoYWQsSXNuaW4sU2VsYXNhLFJhYnUsS2hhbWlzLEp1bWFhdCxTYWJ0dSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJBaGFkLElzbmluLFNlbGFzYSxSYWJ1LEtoYW1pcyxKdW1hYXQsU2FidHUiLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6IkFoZCxJc24sU2VsLFJhYixLaGEsSnVtLFNhYiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6IkFoZCxJc24sU2VsLFJhYixLaGEsSnVtLFNhYiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IkEsSSxTLFIsSyxKLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiQSxJLFMsUixLLEosUyIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIlN1a3UgMSIsICJTdWt1IEtlLTIiLCAiU3VrdSBLZS0zIiwgIlN1a3UgS2UtNCJdLCBRVUFSVEVSUzpbIlN1a3UgcGVydGFtYSIsICJTdWt1IEtlLTIiLCAiU3VrdSBLZS0zIiwgIlN1a3UgS2UtNCJdLCBBTVBNUzpbIlBHIiwgCiJQVEciXSwgREFURUZPUk1BVFM6WyJFRUVFLCBkIE1NTU0geSIsICJkIE1NTU0geSIsICJkZC9NTS95eXl5IiwgImQvTU0veXkiXSwgVElNRUZPUk1BVFM6WyJoOm1tOnNzIGEgenp6eiIsICJoOm1tOnNzIGEgeiIsICJoOm1tOnNzIGEiLCAiaDptbSBhIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdCA9IHtFUkFTOlsiUUsiLCAiV0siXSwgRVJBTkFNRVM6WyJRYWJlbCBLcmlzdHUiLCAiV2FyYSBLcmlzdHUiXSwgTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sXHUwMTIwLEwsQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sXHUwMTIwLEwsQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6Ikphbm5hcixGcmFyLE1hcnp1LEFwcmlsLE1lamp1LFx1MDEyMHVuanUsTHVsanUsQXd3aXNzdSxTZXR0ZW1icnUsT3R0dWJydSxOb3ZlbWJydSxEaVx1MDEwYmVtYnJ1Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJKYW5uYXIsRnJhcixNYXJ6dSxBcHJpbCxNZWpqdSxcdTAxMjB1bmp1LEx1bGp1LEF3d2lzc3UsU2V0dGVtYnJ1LE90dHVicnUsTm92ZW1icnUsRGlcdTAxMGJlbWJydSIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6IkphbixGcmEsTWFyLEFwcixNZWosXHUwMTIwdW4sTHVsLEF3dyxTZXQsT3R0LE5vdixEaVx1MDEwYiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiSmFuLEZyYSxNYXIsQXByLE1laixcdTAxMjB1bixMdWwsQXd3LFNldCxPdHQsTm92LERpXHUwMTBiIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiSWwtXHUwMTI2YWRkLEl0LVRuZWpuLEl0LVRsaWV0YSxMLUVyYmdcdTAxMjdhLElsLVx1MDEyNmFtaXMsSWwtXHUwMTIwaW1nXHUwMTI3YSxJcy1TaWJ0Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6IklsLVx1MDEyNmFkZCxJdC1UbmVqbixJdC1UbGlldGEsTC1FcmJnXHUwMTI3YSxJbC1cdTAxMjZhbWlzLElsLVx1MDEyMGltZ1x1MDEyN2EsSXMtU2lidCIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiXHUwMTI2YWQsVG5lLFRsaSxFcmIsXHUwMTI2YW0sXHUwMTIwaW0sU2liIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiXHUwMTI2YWQsVG5lLFRsaSxFcmIsXHUwMTI2YW0sXHUwMTIwaW0sU2liIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiXHUwMTI2LFQsVCxFLFx1MDEyNixcdTAxMjAsUyIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiXHUwMTI2LFQsVCxFLFx1MDEyNixcdTAxMjAsUyIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIksxIiwgIksyIiwgIkszIiwgIks0Il0sIFFVQVJURVJTOlsiSzEiLCAiSzIiLCAiSzMiLCAiSzQiXSwgQU1QTVM6WyJRTiIsICJXTiJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIGQgJ3RhJ1x1MjAxOSBNTU1NIHkiLCAiZCAndGEnXHUyMDE5IE1NTU0geSIsICJkZCBNTU0geSIsICJkZC9NTS95eXl5Il0sIFRJTUVGT1JNQVRTOlsiSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjYsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWToyfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubCA9IHtFUkFTOlsidi4gQ2hyLiIsICJuLiBDaHIuIl0sIEVSQU5BTUVTOlsiVm9vciBDaHJpc3R1cyIsICJuYSBDaHJpc3R1cyJdLCBOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJqYW51YXJpLGZlYnJ1YXJpLG1hYXJ0LGFwcmlsLG1laSxqdW5pLGp1bGksYXVndXN0dXMsc2VwdGVtYmVyLG9rdG9iZXIsbm92ZW1iZXIsZGVjZW1iZXIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6ImphbnVhcmksZmVicnVhcmksbWFhcnQsYXByaWwsbWVpLGp1bmksanVsaSxhdWd1c3R1cyxzZXB0ZW1iZXIsb2t0b2Jlcixub3ZlbWJlcixkZWNlbWJlciIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6Imphbi4sZmViLixtcnQuLGFwci4sbWVpLGp1bi4sanVsLixhdWcuLHNlcC4sb2t0Lixub3YuLGRlYy4iLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6ImphbixmZWIsbXJ0LGFwcixtZWksanVuLGp1bCxhdWcsc2VwLG9rdCxub3YsZGVjIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiem9uZGFnLG1hYW5kYWcsZGluc2RhZyx3b2Vuc2RhZyxkb25kZXJkYWcsdnJpamRhZyx6YXRlcmRhZyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJ6b25kYWcsbWFhbmRhZyxkaW5zZGFnLHdvZW5zZGFnLGRvbmRlcmRhZyx2cmlqZGFnLHphdGVyZGFnIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJ6byxtYSxkaSx3byxkbyx2cix6YSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6InpvLG1hLGRpLHdvLGRvLHZyLHphIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiWixNLEQsVyxELFYsWiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJaLE0sRCxXLEQsVixaIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiSzEiLCAiSzIiLCAiSzMiLCAiSzQiXSwgClFVQVJURVJTOlsiMWUga3dhcnRhYWwiLCAiMmUga3dhcnRhYWwiLCAiM2Uga3dhcnRhYWwiLCAiNGUga3dhcnRhYWwiXSwgQU1QTVM6WyJBTSIsICJQTSJdLCBEQVRFRk9STUFUUzpbIkVFRUUgZCBNTU1NIHkiLCAiZCBNTU1NIHkiLCAiZCBNTU0geSIsICJkZC1NTS15eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm8gPSB7RVJBUzpbImYuS3IuIiwgImUuS3IuIl0sIEVSQU5BTUVTOlsiZi5Lci4iLCAiZS5Lci4iXSwgTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIE1PTlRIUzoiamFudWFyLGZlYnJ1YXIsbWFycyxhcHJpbCxtYWksanVuaSxqdWxpLGF1Z3VzdCxzZXB0ZW1iZXIsb2t0b2Jlcixub3ZlbWJlcixkZXNlbWJlciIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiamFudWFyLGZlYnJ1YXIsbWFycyxhcHJpbCxtYWksanVuaSxqdWxpLGF1Z3VzdCxzZXB0ZW1iZXIsb2t0b2Jlcixub3ZlbWJlcixkZXNlbWJlciIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6Imphbi4sZmViLixtYXJzLGFwci4sbWFpLGp1bmksanVsaSxhdWcuLHNlcC4sb2t0Lixub3YuLGRlcy4iLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6ImphbixmZWIsbWFyLGFwcixtYWksanVuLGp1bCxhdWcsc2VwLG9rdCxub3YsZGVzIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoic1x1MDBmOG5kYWcsbWFuZGFnLHRpcnNkYWcsb25zZGFnLHRvcnNkYWcsZnJlZGFnLGxcdTAwZjhyZGFnIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6InNcdTAwZjhuZGFnLG1hbmRhZyx0aXJzZGFnLG9uc2RhZyx0b3JzZGFnLGZyZWRhZyxsXHUwMGY4cmRhZyIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoic1x1MDBmOG4uLG1hbi4sdGlyLixvbnMuLHRvci4sZnJlLixsXHUwMGY4ci4iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJzXHUwMGY4LixtYS4sdGkuLG9uLix0by4sZnIuLGxcdTAwZjguIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiUyxNLFQsTyxULEYsTCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJTLE0sVCxPLFQsRixMIi5zcGxpdCgiLCIpLCAKU0hPUlRRVUFSVEVSUzpbIksxIiwgIksyIiwgIkszIiwgIks0Il0sIFFVQVJURVJTOlsiMS4ga3ZhcnRhbCIsICIyLiBrdmFydGFsIiwgIjMuIGt2YXJ0YWwiLCAiNC4ga3ZhcnRhbCJdLCBBTVBNUzpbIkFNIiwgIlBNIl0sIERBVEVGT1JNQVRTOlsiRUVFRSBkLiBNTU1NIHkiLCAiZC4gTU1NTSB5IiwgImQuIE1NTSB5IiwgImRkLk1NLnl5Il0sIFRJTUVGT1JNQVRTOlsiJ2tsJy4gSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vciA9IHtFUkFTOlsiQkNFIiwgIkNFIl0sIEVSQU5BTUVTOlsiQkNFIiwgIkNFIl0sIE5BUlJPV01PTlRIUzoiXHUwYjFjXHUwYjNlLFx1MGIyYlx1MGI0NyxcdTBiMmVcdTBiM2UsXHUwYjA1LFx1MGIyZVx1MGI0NyxcdTBiMWNcdTBiNDEsXHUwYjFjXHUwYjQxLFx1MGIwNSxcdTBiMzhcdTBiNDcsXHUwYjA1LFx1MGIyOCxcdTBiMjFcdTBiM2YiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MGIxY1x1MGIzZSxcdTBiMmJcdTBiNDcsXHUwYjJlXHUwYjNlLFx1MGIwNSxcdTBiMmVcdTBiNDcsXHUwYjFjXHUwYjQxLFx1MGIxY1x1MGI0MSxcdTBiMDUsXHUwYjM4XHUwYjQ3LFx1MGIwNSxcdTBiMjgsXHUwYjIxXHUwYjNmIi5zcGxpdCgiLCIpLCBNT05USFM6Ilx1MGIxY1x1MGIzZVx1MGIyOFx1MGI0MVx1MGIwNlx1MGIzMFx1MGI0MCxcdTBiMmJcdTBiNDdcdTBiMmNcdTBiNGRcdTBiMzBcdTBiNDFcdTBiNWZcdTBiM2VcdTBiMzBcdTBiNDAsXHUwYjJlXHUwYjNlXHUwYjMwXHUwYjRkXHUwYjFhXHUwYjRkXHUwYjFhLFx1MGIwNVx1MGIyYVx1MGI0ZFx1MGIzMFx1MGI0N1x1MGIzMixcdTBiMmVcdTBiNDcsXHUwYjFjXHUwYjQxXHUwYjI4LFx1MGIxY1x1MGI0MVx1MGIzMlx1MGIzZVx1MGIwNyxcdTBiMDVcdTBiMTdcdTBiMzdcdTBiNGRcdTBiMWYsXHUwYjM4XHUwYjQ3XHUwYjJhXHUwYjRkXHUwYjFmXHUwYjQ3XHUwYjJlXHUwYjRkXHUwYjJjXHUwYjMwLFx1MGIwNVx1MGIxNVx1MGI0ZFx1MGIxZlx1MGI0Ylx1MGIyY1x1MGIzMCxcdTBiMjhcdTBiMmRcdTBiNDdcdTBiMmVcdTBiNGRcdTBiMmNcdTBiMzAsXHUwYjIxXHUwYjNmXHUwYjM4XHUwYjQ3XHUwYjJlXHUwYjRkXHUwYjJjXHUwYjMwIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORU1PTlRIUzoiXHUwYjFjXHUwYjNlXHUwYjI4XHUwYjQxXHUwYjA2XHUwYjMwXHUwYjQwLFx1MGIyYlx1MGI0N1x1MGIyY1x1MGI0ZFx1MGIzMFx1MGI0MVx1MGI1Zlx1MGIzZVx1MGIzMFx1MGI0MCxcdTBiMmVcdTBiM2VcdTBiMzBcdTBiNGRcdTBiMWFcdTBiNGRcdTBiMWEsXHUwYjA1XHUwYjJhXHUwYjRkXHUwYjMwXHUwYjQ3XHUwYjMyLFx1MGIyZVx1MGI0NyxcdTBiMWNcdTBiNDFcdTBiMjgsXHUwYjFjXHUwYjQxXHUwYjMyXHUwYjNlXHUwYjA3LFx1MGIwNVx1MGIxN1x1MGIzN1x1MGI0ZFx1MGIxZixcdTBiMzhcdTBiNDdcdTBiMmFcdTBiNGRcdTBiMWZcdTBiNDdcdTBiMmVcdTBiNGRcdTBiMmNcdTBiMzAsXHUwYjA1XHUwYjE1XHUwYjRkXHUwYjFmXHUwYjRiXHUwYjJjXHUwYjMwLFx1MGIyOFx1MGIyZFx1MGI0N1x1MGIyZVx1MGI0ZFx1MGIyY1x1MGIzMCxcdTBiMjFcdTBiM2ZcdTBiMzhcdTBiNDdcdTBiMmVcdTBiNGRcdTBiMmNcdTBiMzAiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoiXHUwYjFjXHUwYjNlXHUwYjI4XHUwYjQxXHUwYjA2XHUwYjMwXHUwYjQwLFx1MGIyYlx1MGI0N1x1MGIyY1x1MGI0ZFx1MGIzMFx1MGI0MVx1MGI1Zlx1MGIzZVx1MGIzMFx1MGI0MCxcdTBiMmVcdTBiM2VcdTBiMzBcdTBiNGRcdTBiMWFcdTBiNGRcdTBiMWEsXHUwYjA1XHUwYjJhXHUwYjRkXHUwYjMwXHUwYjQ3XHUwYjMyLFx1MGIyZVx1MGI0NyxcdTBiMWNcdTBiNDFcdTBiMjgsXHUwYjFjXHUwYjQxXHUwYjMyXHUwYjNlXHUwYjA3LFx1MGIwNVx1MGIxN1x1MGIzN1x1MGI0ZFx1MGIxZixcdTBiMzhcdTBiNDdcdTBiMmFcdTBiNGRcdTBiMWZcdTBiNDdcdTBiMmVcdTBiNGRcdTBiMmNcdTBiMzAsXHUwYjA1XHUwYjE1XHUwYjRkXHUwYjFmXHUwYjRiXHUwYjJjXHUwYjMwLFx1MGIyOFx1MGIyZFx1MGI0N1x1MGIyZVx1MGI0ZFx1MGIyY1x1MGIzMCxcdTBiMjFcdTBiM2ZcdTBiMzhcdTBiNDdcdTBiMmVcdTBiNGRcdTBiMmNcdTBiMzAiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwYjFjXHUwYjNlXHUwYjI4XHUwYjQxXHUwYjA2XHUwYjMwXHUwYjQwLFx1MGIyYlx1MGI0N1x1MGIyY1x1MGI0ZFx1MGIzMFx1MGI0MVx1MGI1Zlx1MGIzZVx1MGIzMFx1MGI0MCxcdTBiMmVcdTBiM2VcdTBiMzBcdTBiNGRcdTBiMWFcdTBiNGRcdTBiMWEsXHUwYjA1XHUwYjJhXHUwYjRkXHUwYjMwXHUwYjQ3XHUwYjMyLFx1MGIyZVx1MGI0NyxcdTBiMWNcdTBiNDFcdTBiMjgsXHUwYjFjXHUwYjQxXHUwYjMyXHUwYjNlXHUwYjA3LFx1MGIwNVx1MGIxN1x1MGIzN1x1MGI0ZFx1MGIxZixcdTBiMzhcdTBiNDdcdTBiMmFcdTBiNGRcdTBiMWZcdTBiNDdcdTBiMmVcdTBiNGRcdTBiMmNcdTBiMzAsXHUwYjA1XHUwYjE1XHUwYjRkXHUwYjFmXHUwYjRiXHUwYjJjXHUwYjMwLFx1MGIyOFx1MGIyZFx1MGI0N1x1MGIyZVx1MGI0ZFx1MGIyY1x1MGIzMCxcdTBiMjFcdTBiM2ZcdTBiMzhcdTBiNDdcdTBiMmVcdTBiNGRcdTBiMmNcdTBiMzAiLnNwbGl0KCIsIiksIApXRUVLREFZUzoiXHUwYjMwXHUwYjJjXHUwYjNmXHUwYjJjXHUwYjNlXHUwYjMwLFx1MGIzOFx1MGI0Ylx1MGIyZVx1MGIyY1x1MGIzZVx1MGIzMCxcdTBiMmVcdTBiMTlcdTBiNGRcdTBiMTdcdTBiMzNcdTBiMmNcdTBiM2VcdTBiMzAsXHUwYjJjXHUwYjQxXHUwYjI3XHUwYjJjXHUwYjNlXHUwYjMwLFx1MGIxN1x1MGI0MVx1MGIzMFx1MGI0MVx1MGIyY1x1MGIzZVx1MGIzMCxcdTBiMzZcdTBiNDFcdTBiMTVcdTBiNGRcdTBiMzBcdTBiMmNcdTBiM2VcdTBiMzAsXHUwYjM2XHUwYjI4XHUwYjNmXHUwYjJjXHUwYjNlXHUwYjMwIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Ilx1MGIzMFx1MGIyY1x1MGIzZlx1MGIyY1x1MGIzZVx1MGIzMCxcdTBiMzhcdTBiNGJcdTBiMmVcdTBiMmNcdTBiM2VcdTBiMzAsXHUwYjJlXHUwYjE5XHUwYjRkXHUwYjE3XHUwYjMzXHUwYjJjXHUwYjNlXHUwYjMwLFx1MGIyY1x1MGI0MVx1MGIyN1x1MGIyY1x1MGIzZVx1MGIzMCxcdTBiMTdcdTBiNDFcdTBiMzBcdTBiNDFcdTBiMmNcdTBiM2VcdTBiMzAsXHUwYjM2XHUwYjQxXHUwYjE1XHUwYjRkXHUwYjMwXHUwYjJjXHUwYjNlXHUwYjMwLFx1MGIzNlx1MGIyOFx1MGIzZlx1MGIyY1x1MGIzZVx1MGIzMCIuc3BsaXQoIiwiKSwgClNIT1JUV0VFS0RBWVM6Ilx1MGIzMFx1MGIyY1x1MGIzZixcdTBiMzhcdTBiNGJcdTBiMmUsXHUwYjJlXHUwYjE5XHUwYjRkXHUwYjE3XHUwYjMzLFx1MGIyY1x1MGI0MVx1MGIyNyxcdTBiMTdcdTBiNDFcdTBiMzBcdTBiNDEsXHUwYjM2XHUwYjQxXHUwYjE1XHUwYjRkXHUwYjMwLFx1MGIzNlx1MGIyOFx1MGIzZiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MGIzMFx1MGIyY1x1MGIzZixcdTBiMzhcdTBiNGJcdTBiMmUsXHUwYjJlXHUwYjE5XHUwYjRkXHUwYjE3XHUwYjMzLFx1MGIyY1x1MGI0MVx1MGIyNyxcdTBiMTdcdTBiNDFcdTBiMzBcdTBiNDEsXHUwYjM2XHUwYjQxXHUwYjE1XHUwYjRkXHUwYjMwLFx1MGIzNlx1MGIyOFx1MGIzZiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1MGIzMCxcdTBiMzhcdTBiNGIsXHUwYjJlLFx1MGIyY1x1MGI0MSxcdTBiMTdcdTBiNDEsXHUwYjM2XHUwYjQxLFx1MGIzNiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTBiMzAsXHUwYjM4XHUwYjRiLFx1MGIyZSxcdTBiMmNcdTBiNDEsXHUwYjE3XHUwYjQxLFx1MGIzNlx1MGI0MSxcdTBiMzYiLnNwbGl0KCIsIiksIApTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAiUTMiLCAiUTQiXSwgUVVBUlRFUlM6WyJRMSIsICJRMiIsICJRMyIsICJRNCJdLCBBTVBNUzpbImFtIiwgInBtIl0sIERBVEVGT1JNQVRTOlsiRUVFRSwgZCBNTU1NIHkiLCAiZCBNTU1NIHkiLCAiZCBNTU0geSIsICJkLU0teXkiXSwgVElNRUZPUk1BVFM6WyJoOm1tOnNzIGEgenp6eiIsICJoOm1tOnNzIGEgeiIsICJoOm1tOnNzIGEiLCAiaDptbSBhIl0sIEZJUlNUREFZT0ZXRUVLOjYsIFdFRUtFTkRSQU5HRTpbNiwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWToyfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wbCA9IHtFUkFTOlsicC5uLmUuIiwgIm4uZS4iXSwgRVJBTkFNRVM6WyJwLm4uZS4iLCAibi5lLiJdLCBOQVJST1dNT05USFM6InMsbCxtLGssbSxjLGwscyx3LHAsbCxnIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJzLGwsbSxrLG0sYyxsLHMsdyxwLGwsZyIuc3BsaXQoIiwiKSwgTU9OVEhTOiJzdHljem5pYSxsdXRlZ28sbWFyY2Esa3dpZXRuaWEsbWFqYSxjemVyd2NhLGxpcGNhLHNpZXJwbmlhLHdyemVcdTAxNWJuaWEscGFcdTAxN2Fkemllcm5pa2EsbGlzdG9wYWRhLGdydWRuaWEiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6InN0eWN6ZVx1MDE0NCxsdXR5LG1hcnplYyxrd2llY2llXHUwMTQ0LG1haixjemVyd2llYyxsaXBpZWMsc2llcnBpZVx1MDE0NCx3cnplc2llXHUwMTQ0LHBhXHUwMTdhZHppZXJuaWssbGlzdG9wYWQsZ3J1ZHppZVx1MDE0NCIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6InN0eSxsdXQsbWFyLGt3aSxtYWosY3plLGxpcCxzaWUsd3J6LHBhXHUwMTdhLGxpcyxncnUiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6InN0eSxsdXQsbWFyLGt3aSxtYWosY3plLGxpcCxzaWUsd3J6LHBhXHUwMTdhLGxpcyxncnUiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJuaWVkemllbGEscG9uaWVkemlhXHUwMTQyZWssd3RvcmVrLFx1MDE1YnJvZGEsY3p3YXJ0ZWsscGlcdTAxMDV0ZWssc29ib3RhIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Im5pZWR6aWVsYSxwb25pZWR6aWFcdTAxNDJlayx3dG9yZWssXHUwMTVicm9kYSxjendhcnRlayxwaVx1MDEwNXRlayxzb2JvdGEiLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6Im5pZWR6Lixwb24uLHd0LixcdTAxNWJyLixjencuLHB0Lixzb2IuIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoibmllZHouLHBvbi4sd3QuLFx1MDE1YnIuLGN6dy4scHQuLHNvYi4iLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJOLFAsVyxcdTAxNWEsQyxQLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiTixQLFcsXHUwMTVhLEMsUCxTIi5zcGxpdCgiLCIpLCAKU0hPUlRRVUFSVEVSUzpbIksxIiwgIksyIiwgIkszIiwgIks0Il0sIFFVQVJURVJTOlsiSSBrd2FydGFcdTAxNDIiLCAiSUkga3dhcnRhXHUwMTQyIiwgIklJSSBrd2FydGFcdTAxNDIiLCAiSVYga3dhcnRhXHUwMTQyIl0sIEFNUE1TOlsiQU0iLCAiUE0iXSwgREFURUZPUk1BVFM6WyJFRUVFLCBkIE1NTU0geSIsICJkIE1NTU0geSIsICJkIE1NTSB5IiwgImRkLk1NLnl5eXkiXSwgVElNRUZPUk1BVFM6WyJISDptbTpzcyB6enp6IiwgIkhIOm1tOnNzIHoiLCAiSEg6bW06c3MiLCAiSEg6bW0iXSwgRklSU1REQVlPRldFRUs6MCwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjN9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0ID0ge0VSQVM6WyJhLkMuIiwgImQuQy4iXSwgRVJBTkFNRVM6WyJBbnRlcyBkZSBDcmlzdG8iLCAiQW5vIGRvIFNlbmhvciJdLCBOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJqYW5laXJvLGZldmVyZWlybyxtYXJcdTAwZTdvLGFicmlsLG1haW8sanVuaG8sanVsaG8sYWdvc3RvLHNldGVtYnJvLG91dHVicm8sbm92ZW1icm8sZGV6ZW1icm8iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6ImphbmVpcm8sZmV2ZXJlaXJvLG1hclx1MDBlN28sYWJyaWwsbWFpbyxqdW5obyxqdWxobyxhZ29zdG8sc2V0ZW1icm8sb3V0dWJybyxub3ZlbWJybyxkZXplbWJybyIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6ImphbixmZXYsbWFyLGFicixtYWksanVuLGp1bCxhZ28sc2V0LG91dCxub3YsZGV6Ii5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJqYW4sZmV2LG1hcixhYnIsbWFpLGp1bixqdWwsYWdvLHNldCxvdXQsbm92LGRleiIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6ImRvbWluZ28sc2VndW5kYS1mZWlyYSx0ZXJcdTAwZTdhLWZlaXJhLHF1YXJ0YS1mZWlyYSxxdWludGEtZmVpcmEsc2V4dGEtZmVpcmEsc1x1MDBlMWJhZG8iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiZG9taW5nbyxzZWd1bmRhLWZlaXJhLHRlclx1MDBlN2EtZmVpcmEscXVhcnRhLWZlaXJhLHF1aW50YS1mZWlyYSxzZXh0YS1mZWlyYSxzXHUwMGUxYmFkbyIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiZG9tLHNlZyx0ZXIscXVhLHF1aSxzZXgsc1x1MDBlMWIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJkb20sc2VnLHRlcixxdWEscXVpLHNleCxzXHUwMGUxYiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IkQsUyxULFEsUSxTLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiRCxTLFQsUSxRLFMsUyIuc3BsaXQoIiwiKSwgClNIT1JUUVVBUlRFUlM6WyJUMSIsICJUMiIsICJUMyIsICJUNCJdLCBRVUFSVEVSUzpbIjFcdTAwYmEgdHJpbWVzdHJlIiwgIjJcdTAwYmEgdHJpbWVzdHJlIiwgIjNcdTAwYmEgdHJpbWVzdHJlIiwgIjRcdTAwYmEgdHJpbWVzdHJlIl0sIEFNUE1TOlsiQU0iLCAiUE0iXSwgREFURUZPUk1BVFM6WyJFRUVFLCBkICdkZScgTU1NTSAnZGUnIHkiLCAiZCAnZGUnIE1NTU0gJ2RlJyB5IiwgImRkL01NL3l5eXkiLCAiZGQvTU0veXkiXSwgVElNRUZPUk1BVFM6WyJISCdoJ21tJ21pbidzcydzJyB6enp6IiwgIkhIJ2gnbW0nbWluJ3NzJ3MnIHoiLCAiSEg6bW06c3MiLCAiSEg6bW0iXSwgRklSU1REQVlPRldFRUs6NiwgV0VFS0VORFJBTkdFOls1LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjJ9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0JSID0gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdDsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9QVCA9IHtFUkFTOlsiYS5DLiIsICJkLkMuIl0sIEVSQU5BTUVTOlsiQW50ZXMgZGUgQ3Jpc3RvIiwgIkFubyBkbyBTZW5ob3IiXSwgTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiSixGLE0sQSxNLEosSixBLFMsTyxOLEQiLnNwbGl0KCIsIiksIE1PTlRIUzoiSmFuZWlybyxGZXZlcmVpcm8sTWFyXHUwMGU3byxBYnJpbCxNYWlvLEp1bmhvLEp1bGhvLEFnb3N0byxTZXRlbWJybyxPdXR1YnJvLE5vdmVtYnJvLERlemVtYnJvIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJKYW5laXJvLEZldmVyZWlybyxNYXJcdTAwZTdvLEFicmlsLE1haW8sSnVuaG8sSnVsaG8sQWdvc3RvLFNldGVtYnJvLE91dHVicm8sTm92ZW1icm8sRGV6ZW1icm8iLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKYW4sRmV2LE1hcixBYnIsTWFpLEp1bixKdWwsQWdvLFNldCxPdXQsTm92LERleiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiSmFuLEZldixNYXIsQWJyLE1haSxKdW4sSnVsLEFnbyxTZXQsT3V0LE5vdixEZXoiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJEb21pbmdvLFNlZ3VuZGEtZmVpcmEsVGVyXHUwMGU3YS1mZWlyYSxRdWFydGEtZmVpcmEsUXVpbnRhLWZlaXJhLFNleHRhLWZlaXJhLFNcdTAwZTFiYWRvIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6IkRvbWluZ28sU2VndW5kYS1mZWlyYSxUZXJcdTAwZTdhLWZlaXJhLFF1YXJ0YS1mZWlyYSxRdWludGEtZmVpcmEsU2V4dGEtZmVpcmEsU1x1MDBlMWJhZG8iLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6ImRvbSxzZWcsdGVyLHF1YSxxdWksc2V4LHNcdTAwZTFiIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiZG9tLHNlZyx0ZXIscXVhLHF1aSxzZXgsc1x1MDBlMWIiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJELFMsVCxRLFEsUyxTIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6IkQsUyxULFEsUSxTLFMiLnNwbGl0KCIsIiksIApTSE9SVFFVQVJURVJTOlsiVDEiLCAiVDIiLCAiVDMiLCAiVDQiXSwgUVVBUlRFUlM6WyIxLlx1MDBiYSB0cmltZXN0cmUiLCAiMi5cdTAwYmEgdHJpbWVzdHJlIiwgIjMuXHUwMGJhIHRyaW1lc3RyZSIsICI0Llx1MDBiYSB0cmltZXN0cmUiXSwgQU1QTVM6WyJhLm0uIiwgInAubS4iXSwgREFURUZPUk1BVFM6WyJFRUVFLCBkICdkZScgTU1NTSAnZGUnIHkiLCAiZCAnZGUnIE1NTU0gJ2RlJyB5IiwgImRkL01NL3l5eXkiLCAiZGQvTU0veXkiXSwgVElNRUZPUk1BVFM6WyJIOm1tOnNzIHp6enoiLCAiSDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ybyA9IHtFUkFTOlsiXHUwMGVlLkhyLiIsICJkLkhyLiJdLCBFUkFOQU1FUzpbIlx1MDBlZW5haW50ZSBkZSBIcmlzdG9zIiwgImR1cFx1MDEwMyBIcmlzdG9zIl0sIE5BUlJPV01PTlRIUzoiSSxGLE0sQSxNLEksSSxBLFMsTyxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkksRixNLEEsTSxJLEksQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBNT05USFM6ImlhbnVhcmllLGZlYnJ1YXJpZSxtYXJ0aWUsYXByaWxpZSxtYWksaXVuaWUsaXVsaWUsYXVndXN0LHNlcHRlbWJyaWUsb2N0b21icmllLG5vaWVtYnJpZSxkZWNlbWJyaWUiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6ImlhbnVhcmllLGZlYnJ1YXJpZSxtYXJ0aWUsYXByaWxpZSxtYWksaXVuaWUsaXVsaWUsYXVndXN0LHNlcHRlbWJyaWUsb2N0b21icmllLG5vaWVtYnJpZSxkZWNlbWJyaWUiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJpYW4uLGZlYi4sbWFyLixhcHIuLG1haSxpdW4uLGl1bC4sYXVnLixzZXB0LixvY3QuLG5vdi4sZGVjLiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiaWFuLixmZWIuLG1hci4sYXByLixtYWksaXVuLixpdWwuLGF1Zy4sc2VwdC4sb2N0Lixub3YuLGRlYy4iLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJkdW1pbmljXHUwMTAzLGx1bmksbWFyXHUwMjFiaSxtaWVyY3VyaSxqb2ksdmluZXJpLHNcdTAwZTJtYlx1MDEwM3RcdTAxMDMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiZHVtaW5pY1x1MDEwMyxsdW5pLG1hclx1MDIxYmksbWllcmN1cmksam9pLHZpbmVyaSxzXHUwMGUybWJcdTAxMDN0XHUwMTAzIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJEdSxMdSxNYSxNaSxKbyxWaSxTXHUwMGUyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiRHUsTHUsTWEsTWksSm8sVmksU1x1MDBlMiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IkQsTCxNLE0sSixWLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiRCxMLE0sTSxKLFYsUyIuc3BsaXQoIiwiKSwgClNIT1JUUVVBUlRFUlM6WyJ0cmltLiBJIiwgInRyaW0uIElJIiwgInRyaW0uIElJSSIsICJ0cmltLiBJViJdLCBRVUFSVEVSUzpbInRyaW1lc3RydWwgSSIsICJ0cmltZXN0cnVsIGFsIElJLWxlYSIsICJ0cmltZXN0cnVsIGFsIElJSS1sZWEiLCAidHJpbWVzdHJ1bCBhbCBJVi1sZWEiXSwgQU1QTVM6WyJBTSIsICJQTSJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIGQgTU1NTSB5IiwgImQgTU1NTSB5IiwgImRkLk1NLnl5eXkiLCAiZGQuTU0ueXl5eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnUgPSB7RVJBUzpbIlx1MDQzNFx1MDQzZSBcdTA0M2QuXHUwNDRkLiIsICJcdTA0M2QuXHUwNDRkLiJdLCBFUkFOQU1FUzpbIlx1MDQzNFx1MDQzZSBcdTA0M2QuXHUwNDRkLiIsICJcdTA0M2QuXHUwNDRkLiJdLCBOQVJST1dNT05USFM6Ilx1MDQyZixcdTA0MjQsXHUwNDFjLFx1MDQxMCxcdTA0MWMsXHUwNDE4LFx1MDQxOCxcdTA0MTAsXHUwNDIxLFx1MDQxZSxcdTA0MWQsXHUwNDE0Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJcdTA0MmYsXHUwNDI0LFx1MDQxYyxcdTA0MTAsXHUwNDFjLFx1MDQxOCxcdTA0MTgsXHUwNDEwLFx1MDQyMSxcdTA0MWUsXHUwNDFkLFx1MDQxNCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJcdTA0NGZcdTA0M2RcdTA0MzJcdTA0MzBcdTA0NDBcdTA0NGYsXHUwNDQ0XHUwNDM1XHUwNDMyXHUwNDQwXHUwNDMwXHUwNDNiXHUwNDRmLFx1MDQzY1x1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzMCxcdTA0MzBcdTA0M2ZcdTA0NDBcdTA0MzVcdTA0M2JcdTA0NGYsXHUwNDNjXHUwNDMwXHUwNDRmLFx1MDQzOFx1MDQ0ZVx1MDQzZFx1MDQ0ZixcdTA0MzhcdTA0NGVcdTA0M2JcdTA0NGYsXHUwNDMwXHUwNDMyXHUwNDMzXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDMwLFx1MDQ0MVx1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQ0Zlx1MDQzMVx1MDQ0MFx1MDQ0ZixcdTA0M2VcdTA0M2FcdTA0NDJcdTA0NGZcdTA0MzFcdTA0NDBcdTA0NGYsXHUwNDNkXHUwNDNlXHUwNDRmXHUwNDMxXHUwNDQwXHUwNDRmLFx1MDQzNFx1MDQzNVx1MDQzYVx1MDQzMFx1MDQzMVx1MDQ0MFx1MDQ0ZiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVNT05USFM6Ilx1MDQyZlx1MDQzZFx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQ0YyxcdTA0MjRcdTA0MzVcdTA0MzJcdTA0NDBcdTA0MzBcdTA0M2JcdTA0NGMsXHUwNDFjXHUwNDMwXHUwNDQwXHUwNDQyLFx1MDQxMFx1MDQzZlx1MDQ0MFx1MDQzNVx1MDQzYlx1MDQ0YyxcdTA0MWNcdTA0MzBcdTA0MzksXHUwNDE4XHUwNDRlXHUwNDNkXHUwNDRjLFx1MDQxOFx1MDQ0ZVx1MDQzYlx1MDQ0YyxcdTA0MTBcdTA0MzJcdTA0MzNcdTA0NDNcdTA0NDFcdTA0NDIsXHUwNDIxXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDRmXHUwNDMxXHUwNDQwXHUwNDRjLFx1MDQxZVx1MDQzYVx1MDQ0Mlx1MDQ0Zlx1MDQzMVx1MDQ0MFx1MDQ0YyxcdTA0MWRcdTA0M2VcdTA0NGZcdTA0MzFcdTA0NDBcdTA0NGMsXHUwNDE0XHUwNDM1XHUwNDNhXHUwNDMwXHUwNDMxXHUwNDQwXHUwNDRjIi5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiXHUwNDRmXHUwNDNkXHUwNDMyLFx1MDQ0NFx1MDQzNVx1MDQzMixcdTA0M2NcdTA0MzBcdTA0NDAsXHUwNDMwXHUwNDNmXHUwNDQwLFx1MDQzY1x1MDQzMFx1MDQ0ZixcdTA0MzhcdTA0NGVcdTA0M2QsXHUwNDM4XHUwNDRlXHUwNDNiLFx1MDQzMFx1MDQzMlx1MDQzMyxcdTA0NDFcdTA0MzVcdTA0M2QsXHUwNDNlXHUwNDNhXHUwNDQyLFx1MDQzZFx1MDQzZVx1MDQ0ZixcdTA0MzRcdTA0MzVcdTA0M2EiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6Ilx1MDQyZlx1MDQzZFx1MDQzMi4sXHUwNDI0XHUwNDM1XHUwNDMyXHUwNDQwLixcdTA0MWNcdTA0MzBcdTA0NDBcdTA0NDIsXHUwNDEwXHUwNDNmXHUwNDQwLixcdTA0MWNcdTA0MzBcdTA0MzksXHUwNDE4XHUwNDRlXHUwNDNkXHUwNDRjLFx1MDQxOFx1MDQ0ZVx1MDQzYlx1MDQ0YyxcdTA0MTBcdTA0MzJcdTA0MzMuLFx1MDQyMVx1MDQzNVx1MDQzZFx1MDQ0Mi4sXHUwNDFlXHUwNDNhXHUwNDQyLixcdTA0MWRcdTA0M2VcdTA0NGZcdTA0MzEuLFx1MDQxNFx1MDQzNVx1MDQzYS4iLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJcdTA0MzJcdTA0M2VcdTA0NDFcdTA0M2FcdTA0NDBcdTA0MzVcdTA0NDFcdTA0MzVcdTA0M2RcdTA0NGNcdTA0MzUsXHUwNDNmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNkXHUwNDM4XHUwNDNhLFx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZFx1MDQzOFx1MDQzYSxcdTA0NDFcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzAsXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDMzLFx1MDQzZlx1MDQ0Zlx1MDQ0Mlx1MDQzZFx1MDQzOFx1MDQ0Nlx1MDQzMCxcdTA0NDFcdTA0NDNcdTA0MzFcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzAiLnNwbGl0KCIsIiksIApTVEFOREFMT05FV0VFS0RBWVM6Ilx1MDQxMlx1MDQzZVx1MDQ0MVx1MDQzYVx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQzNVx1MDQzZFx1MDQ0Y1x1MDQzNSxcdTA0MWZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M2JcdTA0NGNcdTA0M2RcdTA0MzhcdTA0M2EsXHUwNDEyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNkXHUwNDM4XHUwNDNhLFx1MDQyMVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMCxcdTA0MjdcdTA0MzVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzMsXHUwNDFmXHUwNDRmXHUwNDQyXHUwNDNkXHUwNDM4XHUwNDQ2XHUwNDMwLFx1MDQyMVx1MDQ0M1x1MDQzMVx1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMCIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiXHUwNDMyXHUwNDQxLFx1MDQzZlx1MDQzZCxcdTA0MzJcdTA0NDIsXHUwNDQxXHUwNDQwLFx1MDQ0N1x1MDQ0MixcdTA0M2ZcdTA0NDIsXHUwNDQxXHUwNDMxIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiXHUwNDEyXHUwNDQxLFx1MDQxZlx1MDQzZCxcdTA0MTJcdTA0NDIsXHUwNDIxXHUwNDQwLFx1MDQyN1x1MDQ0MixcdTA0MWZcdTA0NDIsXHUwNDIxXHUwNDMxIi5zcGxpdCgiLCIpLCAKTkFSUk9XV0VFS0RBWVM6Ilx1MDQxMixcdTA0MWZcdTA0M2QsXHUwNDEyXHUwNDQyLFx1MDQyMSxcdTA0MjcsXHUwNDFmLFx1MDQyMSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTA0MTIsXHUwNDFmLFx1MDQxMixcdTA0MjEsXHUwNDI3LFx1MDQxZixcdTA0MjEiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyIxLVx1MDQzOSBcdTA0M2FcdTA0MzIuIiwgIjItXHUwNDM5IFx1MDQzYVx1MDQzMi4iLCAiMy1cdTA0MzkgXHUwNDNhXHUwNDMyLiIsICI0LVx1MDQzOSBcdTA0M2FcdTA0MzIuIl0sIFFVQVJURVJTOlsiMS1cdTA0MzkgXHUwNDNhXHUwNDMyXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDMwXHUwNDNiIiwgIjItXHUwNDM5IFx1MDQzYVx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzMFx1MDQzYiIsICIzLVx1MDQzOSBcdTA0M2FcdTA0MzJcdTA0MzBcdTA0NDBcdTA0NDJcdTA0MzBcdTA0M2IiLCAiNC1cdTA0MzkgXHUwNDNhXHUwNDMyXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDMwXHUwNDNiIl0sIApBTVBNUzpbIlx1MDQzNFx1MDQzZSBcdTA0M2ZcdTA0M2VcdTA0M2JcdTA0NDNcdTA0MzRcdTA0M2RcdTA0NGYiLCAiXHUwNDNmXHUwNDNlXHUwNDQxXHUwNDNiXHUwNDM1IFx1MDQzZlx1MDQzZVx1MDQzYlx1MDQ0M1x1MDQzNFx1MDQzZFx1MDQ0ZiJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIGQgTU1NTSB5XHUwMGEwJ1x1MDQzMycuIiwgImQgTU1NTSB5XHUwMGEwJ1x1MDQzMycuIiwgImRkLk1NLnl5eXkiLCAiZGQuTU0ueXkiXSwgVElNRUZPUk1BVFM6WyJIOm1tOnNzIHp6enoiLCAiSDptbTpzcyB6IiwgIkg6bW06c3MiLCAiSDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2sgPSB7RVJBUzpbInByZWQgbi5sLiIsICJuLmwuIl0sIEVSQU5BTUVTOlsicHJlZCBuLmwuIiwgIm4ubC4iXSwgTkFSUk9XTU9OVEhTOiJqLGYsbSxhLG0saixqLGEscyxvLG4sZCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiaixmLG0sYSxtLGosaixhLHMsbyxuLGQiLnNwbGl0KCIsIiksIE1PTlRIUzoiamFudVx1MDBlMXJhLGZlYnJ1XHUwMGUxcmEsbWFyY2EsYXByXHUwMGVkbGEsbVx1MDBlMWphLGpcdTAwZmFuYSxqXHUwMGZhbGEsYXVndXN0YSxzZXB0ZW1icmEsb2t0XHUwMGYzYnJhLG5vdmVtYnJhLGRlY2VtYnJhIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJqYW51XHUwMGUxcixmZWJydVx1MDBlMXIsbWFyZWMsYXByXHUwMGVkbCxtXHUwMGUxaixqXHUwMGZhbixqXHUwMGZhbCxhdWd1c3Qsc2VwdGVtYmVyLG9rdFx1MDBmM2Jlcixub3ZlbWJlcixkZWNlbWJlciIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6ImphbixmZWIsbWFyLGFwcixtXHUwMGUxaixqXHUwMGZhbixqXHUwMGZhbCxhdWcsc2VwLG9rdCxub3YsZGVjIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJqYW4sZmViLG1hcixhcHIsbVx1MDBlMWosalx1MDBmYW4salx1MDBmYWwsYXVnLHNlcCxva3Qsbm92LGRlYyIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6Im5lZGVcdTAxM2VhLHBvbmRlbG9rLHV0b3JvayxzdHJlZGEsXHUwMTYxdHZydG9rLHBpYXRvayxzb2JvdGEiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoibmVkZVx1MDEzZWEscG9uZGVsb2ssdXRvcm9rLHN0cmVkYSxcdTAxNjF0dnJ0b2sscGlhdG9rLHNvYm90YSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoibmUscG8sdXQsc3QsXHUwMTYxdCxwaSxzbyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Im5lLHBvLHV0LHN0LFx1MDE2MXQscGksc28iLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJOLFAsVSxTLFx1MDE2MCxQLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiTixQLFUsUyxcdTAxNjAsUCxTIi5zcGxpdCgiLCIpLCAKU0hPUlRRVUFSVEVSUzpbIlExIiwgIlEyIiwgIlEzIiwgIlE0Il0sIFFVQVJURVJTOlsiMS4gXHUwMTYxdHZyXHUwMTY1cm9rIiwgIjIuIFx1MDE2MXR2clx1MDE2NXJvayIsICIzLiBcdTAxNjF0dnJcdTAxNjVyb2siLCAiNC4gXHUwMTYxdHZyXHUwMTY1cm9rIl0sIEFNUE1TOlsiZG9wb2x1ZG5pYSIsICJwb3BvbHVkblx1MDBlZCJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIGQuIE1NTU0geSIsICJkLiBNTU1NIHkiLCAiZC5NLnl5eXkiLCAiZC5NLnl5eXkiXSwgVElNRUZPUk1BVFM6WyJIOm1tOnNzIHp6enoiLCAiSDptbTpzcyB6IiwgIkg6bW06c3MiLCAiSDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2wgPSB7RVJBUzpbInByLiBuLiBcdTAxNjF0LiIsICJwbyBLci4iXSwgRVJBTkFNRVM6WyJwcmVkIG5hXHUwMTYxaW0gXHUwMTYxdGV0amVtIiwgIm5hXHUwMTYxZSBcdTAxNjF0ZXRqZSJdLCBOQVJST1dNT05USFM6ImosZixtLGEsbSxqLGosYSxzLG8sbixkIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJqLGYsbSxhLG0saixqLGEscyxvLG4sZCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJqYW51YXIsZmVicnVhcixtYXJlYyxhcHJpbCxtYWosanVuaWosanVsaWosYXZndXN0LHNlcHRlbWJlcixva3RvYmVyLG5vdmVtYmVyLGRlY2VtYmVyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJqYW51YXIsZmVicnVhcixtYXJlYyxhcHJpbCxtYWosanVuaWosanVsaWosYXZndXN0LHNlcHRlbWJlcixva3RvYmVyLG5vdmVtYmVyLGRlY2VtYmVyIi5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiamFuLixmZWIuLG1hci4sYXByLixtYWosanVuLixqdWwuLGF2Zy4sc2VwLixva3QuLG5vdi4sZGVjLiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiamFuLGZlYixtYXIsYXByLG1haixqdW4sanVsLGF2ZyxzZXAsb2t0LG5vdixkZWMiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJuZWRlbGphLHBvbmVkZWxqZWssdG9yZWssc3JlZGEsXHUwMTBkZXRydGVrLHBldGVrLHNvYm90YSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJuZWRlbGphLHBvbmVkZWxqZWssdG9yZWssc3JlZGEsXHUwMTBkZXRydGVrLHBldGVrLHNvYm90YSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoibmVkLixwb24uLHRvci4sc3JlLixcdTAxMGRldC4scGV0Lixzb2IuIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoibmVkLHBvbix0b3Isc3JlLFx1MDEwZGV0LHBldCxzb2IiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJuLHAsdCxzLFx1MDEwZCxwLHMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoibixwLHQscyxcdTAxMGQscCxzIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUTEiLCAKIlEyIiwgIlEzIiwgIlE0Il0sIFFVQVJURVJTOlsiMS4gXHUwMTBkZXRydGxldGplIiwgIjIuIFx1MDEwZGV0cnRsZXRqZSIsICIzLiBcdTAxMGRldHJ0bGV0amUiLCAiNC4gXHUwMTBkZXRydGxldGplIl0sIEFNUE1TOlsiZG9wLiIsICJwb3AuIl0sIERBVEVGT1JNQVRTOlsiRUVFRSwgZGQuIE1NTU0geSIsICJkZC4gTU1NTSB5IiwgImQuIE1NTSB5eXl5IiwgImQuIE1NLiB5eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3EgPSB7RVJBUzpbInAuZS5yLiIsICJuLmUuci4iXSwgRVJBTkFNRVM6WyJwLmUuci4iLCAibi5lLnIuIl0sIE5BUlJPV01PTlRIUzoiSixTLE0sUCxNLFEsSyxHLFMsVCxOLEQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IkosUyxNLFAsTSxRLEssRyxTLFQsTixEIi5zcGxpdCgiLCIpLCBNT05USFM6ImphbmFyLHNoa3VydCxtYXJzLHByaWxsLG1haixxZXJzaG9yLGtvcnJpayxndXNodCxzaHRhdG9yLHRldG9yLG5cdTAwZWJudG9yLGRoamV0b3IiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6ImphbmFyLHNoa3VydCxtYXJzLHByaWxsLG1haixxZXJzaG9yLGtvcnJpayxndXNodCxzaHRhdG9yLHRldG9yLG5cdTAwZWJudG9yLGRoamV0b3IiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKYW4sU2hrLE1hcixQcmksTWFqLFFlcixLb3IsR3NoLFNodCxUZXQsTlx1MDBlYm4sRGhqIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRNT05USFM6IkphbixTaGssTWFyLFByaSxNYWosUWVyLEtvcixHc2gsU2h0LFRldCxOXHUwMGVibixEaGoiLnNwbGl0KCIsIiksIApXRUVLREFZUzoiZSBkaWVsLGUgaFx1MDBlYm5cdTAwZWIsZSBtYXJ0XHUwMGViLGUgbVx1MDBlYnJrdXJcdTAwZWIsZSBlbmp0ZSxlIHByZW10ZSxlIHNodHVuXHUwMGViIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6ImUgZGllbCxlIGhcdTAwZWJuXHUwMGViLGUgbWFydFx1MDBlYixlIG1cdTAwZWJya3VyXHUwMGViLGUgZW5qdGUsZSBwcmVtdGUsZSBzaHR1blx1MDBlYiIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiRGllLEhcdTAwZWJuLE1hcixNXHUwMGVicixFbmosUHJlLFNodCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6IkRpZSxIXHUwMGVibixNYXIsTVx1MDBlYnIsRW5qLFByZSxTaHQiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJELEgsTSxNLEUsUCxTIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6IkQsSCxNLE0sRSxQLFMiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJRMSIsICJRMiIsICJRMyIsIAoiUTQiXSwgUVVBUlRFUlM6WyJRMSIsICJRMiIsICJRMyIsICJRNCJdLCBBTVBNUzpbIlBEIiwgIk1EIl0sIERBVEVGT1JNQVRTOlsiRUVFRSwgZGQgTU1NTSB5IiwgImRkIE1NTU0geSIsICJ5eXl5LU1NLWRkIiwgInl5LU1NLWRkIl0sIFRJTUVGT1JNQVRTOlsiaC5tbS5zcy5hIHp6enoiLCAiaC5tbS5zcy5hIHoiLCAiaC5tbS5zcy5hIiwgImgubW0uYSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3IgPSB7RVJBUzpbIlx1MDQzZi4gXHUwNDNkLiBcdTA0MzUuIiwgIlx1MDQzZC4gXHUwNDM1LiJdLCBFUkFOQU1FUzpbIlx1MDQxZlx1MDQ0MFx1MDQzNSBcdTA0M2RcdTA0M2VcdTA0MzJcdTA0MzUgXHUwNDM1XHUwNDQwXHUwNDM1IiwgIlx1MDQxZFx1MDQzZVx1MDQzMlx1MDQzNSBcdTA0MzVcdTA0NDBcdTA0MzUiXSwgTkFSUk9XTU9OVEhTOiJcdTA0NTgsXHUwNDQ0LFx1MDQzYyxcdTA0MzAsXHUwNDNjLFx1MDQ1OCxcdTA0NTgsXHUwNDMwLFx1MDQ0MSxcdTA0M2UsXHUwNDNkLFx1MDQzNCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiXHUwNDU4LFx1MDQ0NCxcdTA0M2MsXHUwNDMwLFx1MDQzYyxcdTA0NTgsXHUwNDU4LFx1MDQzMCxcdTA0NDEsXHUwNDNlLFx1MDQzZCxcdTA0MzQiLnNwbGl0KCIsIiksIE1PTlRIUzoiXHUwNDU4XHUwNDMwXHUwNDNkXHUwNDQzXHUwNDMwXHUwNDQwLFx1MDQ0NFx1MDQzNVx1MDQzMVx1MDQ0MFx1MDQ0M1x1MDQzMFx1MDQ0MCxcdTA0M2NcdTA0MzBcdTA0NDBcdTA0NDIsXHUwNDMwXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDNiLFx1MDQzY1x1MDQzMFx1MDQ1OCxcdTA0NThcdTA0NDNcdTA0M2QsXHUwNDU4XHUwNDQzXHUwNDNiLFx1MDQzMFx1MDQzMlx1MDQzM1x1MDQ0M1x1MDQ0MVx1MDQ0MixcdTA0NDFcdTA0MzVcdTA0M2ZcdTA0NDJcdTA0MzVcdTA0M2NcdTA0MzFcdTA0MzBcdTA0NDAsXHUwNDNlXHUwNDNhXHUwNDQyXHUwNDNlXHUwNDMxXHUwNDMwXHUwNDQwLFx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzNVx1MDQzY1x1MDQzMVx1MDQzMFx1MDQ0MCxcdTA0MzRcdTA0MzVcdTA0NDZcdTA0MzVcdTA0M2NcdTA0MzFcdTA0MzBcdTA0NDAiLnNwbGl0KCIsIiksIApTVEFOREFMT05FTU9OVEhTOiJcdTA0NThcdTA0MzBcdTA0M2RcdTA0NDNcdTA0MzBcdTA0NDAsXHUwNDQ0XHUwNDM1XHUwNDMxXHUwNDQwXHUwNDQzXHUwNDMwXHUwNDQwLFx1MDQzY1x1MDQzMFx1MDQ0MFx1MDQ0MixcdTA0MzBcdTA0M2ZcdTA0NDBcdTA0MzhcdTA0M2IsXHUwNDNjXHUwNDMwXHUwNDU4LFx1MDQ1OFx1MDQ0M1x1MDQzZCxcdTA0NThcdTA0NDNcdTA0M2IsXHUwNDMwXHUwNDMyXHUwNDMzXHUwNDQzXHUwNDQxXHUwNDQyLFx1MDQ0MVx1MDQzNVx1MDQzZlx1MDQ0Mlx1MDQzNVx1MDQzY1x1MDQzMVx1MDQzMFx1MDQ0MCxcdTA0M2VcdTA0M2FcdTA0NDJcdTA0M2VcdTA0MzFcdTA0MzBcdTA0NDAsXHUwNDNkXHUwNDNlXHUwNDMyXHUwNDM1XHUwNDNjXHUwNDMxXHUwNDMwXHUwNDQwLFx1MDQzNFx1MDQzNVx1MDQ0Nlx1MDQzNVx1MDQzY1x1MDQzMVx1MDQzMFx1MDQ0MCIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6Ilx1MDQ1OFx1MDQzMFx1MDQzZCxcdTA0NDRcdTA0MzVcdTA0MzEsXHUwNDNjXHUwNDMwXHUwNDQwLFx1MDQzMFx1MDQzZlx1MDQ0MCxcdTA0M2NcdTA0MzBcdTA0NTgsXHUwNDU4XHUwNDQzXHUwNDNkLFx1MDQ1OFx1MDQ0M1x1MDQzYixcdTA0MzBcdTA0MzJcdTA0MzMsXHUwNDQxXHUwNDM1XHUwNDNmLFx1MDQzZVx1MDQzYVx1MDQ0MixcdTA0M2RcdTA0M2VcdTA0MzIsXHUwNDM0XHUwNDM1XHUwNDQ2Ii5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJcdTA0NThcdTA0MzBcdTA0M2QsXHUwNDQ0XHUwNDM1XHUwNDMxLFx1MDQzY1x1MDQzMFx1MDQ0MCxcdTA0MzBcdTA0M2ZcdTA0NDAsXHUwNDNjXHUwNDMwXHUwNDU4LFx1MDQ1OFx1MDQ0M1x1MDQzZCxcdTA0NThcdTA0NDNcdTA0M2IsXHUwNDMwXHUwNDMyXHUwNDMzLFx1MDQ0MVx1MDQzNVx1MDQzZixcdTA0M2VcdTA0M2FcdTA0NDIsXHUwNDNkXHUwNDNlXHUwNDMyLFx1MDQzNFx1MDQzNVx1MDQ0NiIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6Ilx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQ1OVx1MDQzMCxcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0MzRcdTA0MzVcdTA0NTlcdTA0MzBcdTA0M2EsXHUwNDQzXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDMwXHUwNDNhLFx1MDQ0MVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMCxcdTA0NDdcdTA0MzVcdTA0NDJcdTA0MzJcdTA0NDBcdTA0NDJcdTA0MzBcdTA0M2EsXHUwNDNmXHUwNDM1XHUwNDQyXHUwNDMwXHUwNDNhLFx1MDQ0MVx1MDQ0M1x1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMCIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVXRUVLREFZUzoiXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDU5XHUwNDMwLFx1MDQzZlx1MDQzZVx1MDQzZFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQ1OVx1MDQzMFx1MDQzYSxcdTA0NDNcdTA0NDJcdTA0M2VcdTA0NDBcdTA0MzBcdTA0M2EsXHUwNDQxXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwLFx1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQzMlx1MDQ0MFx1MDQ0Mlx1MDQzMFx1MDQzYSxcdTA0M2ZcdTA0MzVcdTA0NDJcdTA0MzBcdTA0M2EsXHUwNDQxXHUwNDQzXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJcdTA0M2RcdTA0MzVcdTA0MzQsXHUwNDNmXHUwNDNlXHUwNDNkLFx1MDQ0M1x1MDQ0Mlx1MDQzZSxcdTA0NDFcdTA0NDBcdTA0MzUsXHUwNDQ3XHUwNDM1XHUwNDQyLFx1MDQzZlx1MDQzNVx1MDQ0MixcdTA0NDFcdTA0NDNcdTA0MzEiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJcdTA0M2RcdTA0MzVcdTA0MzQsXHUwNDNmXHUwNDNlXHUwNDNkLFx1MDQ0M1x1MDQ0Mlx1MDQzZSxcdTA0NDFcdTA0NDBcdTA0MzUsXHUwNDQ3XHUwNDM1XHUwNDQyLFx1MDQzZlx1MDQzNVx1MDQ0MixcdTA0NDFcdTA0NDNcdTA0MzEiLnNwbGl0KCIsIiksIApOQVJST1dXRUVLREFZUzoiXHUwNDNkLFx1MDQzZixcdTA0NDMsXHUwNDQxLFx1MDQ0NyxcdTA0M2YsXHUwNDQxIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6Ilx1MDQzZCxcdTA0M2YsXHUwNDQzLFx1MDQ0MSxcdTA0NDcsXHUwNDNmLFx1MDQ0MSIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIlx1MDQxYTEiLCAiXHUwNDFhMiIsICJcdTA0MWEzIiwgIlx1MDQxYTQiXSwgUVVBUlRFUlM6WyJcdTA0MWZcdTA0NDBcdTA0MzJcdTA0M2UgXHUwNDQyXHUwNDQwXHUwNDNlXHUwNDNjXHUwNDM1XHUwNDQxXHUwNDM1XHUwNDQ3XHUwNDU4XHUwNDM1IiwgIlx1MDQxNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzZSBcdTA0NDJcdTA0NDBcdTA0M2VcdTA0M2NcdTA0MzVcdTA0NDFcdTA0MzVcdTA0NDdcdTA0NThcdTA0MzUiLCAiXHUwNDIyXHUwNDQwXHUwNDM1XHUwNDViXHUwNDM1IFx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQzNVx1MDQ0N1x1MDQ1OFx1MDQzNSIsIAoiXHUwNDI3XHUwNDM1XHUwNDQyXHUwNDMyXHUwNDQwXHUwNDQyXHUwNDNlIFx1MDQ0Mlx1MDQ0MFx1MDQzZVx1MDQzY1x1MDQzNVx1MDQ0MVx1MDQzNVx1MDQ0N1x1MDQ1OFx1MDQzNSJdLCBBTVBNUzpbIlx1MDQzZlx1MDQ0MFx1MDQzNSBcdTA0M2ZcdTA0M2VcdTA0MzRcdTA0M2RcdTA0MzUiLCAiXHUwNDNmXHUwNDNlXHUwNDNmXHUwNDNlXHUwNDM0XHUwNDNkXHUwNDM1Il0sIERBVEVGT1JNQVRTOlsiRUVFRSwgZGQuIE1NTU0geS4iLCAiZGQuIE1NTU0geS4iLCAiZGQuTU0ueS4iLCAiZC5NLnl5LiJdLCBUSU1FRk9STUFUUzpbIkhILm1tLnNzIHp6enoiLCAiSEgubW0uc3MgeiIsICJISC5tbS5zcyIsICJISC5tbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3YgPSB7RVJBUzpbImYuS3IuIiwgImUuS3IuIl0sIEVSQU5BTUVTOlsiZlx1MDBmNnJlIEtyaXN0dXMiLCAiZWZ0ZXIgS3Jpc3R1cyJdLCBOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJqYW51YXJpLGZlYnJ1YXJpLG1hcnMsYXByaWwsbWFqLGp1bmksanVsaSxhdWd1c3RpLHNlcHRlbWJlcixva3RvYmVyLG5vdmVtYmVyLGRlY2VtYmVyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJqYW51YXJpLGZlYnJ1YXJpLG1hcnMsYXByaWwsbWFqLGp1bmksanVsaSxhdWd1c3RpLHNlcHRlbWJlcixva3RvYmVyLG5vdmVtYmVyLGRlY2VtYmVyIi5zcGxpdCgiLCIpLCBTSE9SVE1PTlRIUzoiamFuLGZlYixtYXIsYXByLG1haixqdW4sanVsLGF1ZyxzZXAsb2t0LG5vdixkZWMiLnNwbGl0KCIsIiksIApTVEFOREFMT05FU0hPUlRNT05USFM6ImphbixmZWIsbWFyLGFwcixtYWosanVuLGp1bCxhdWcsc2VwLG9rdCxub3YsZGVjIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoic1x1MDBmNm5kYWcsbVx1MDBlNW5kYWcsdGlzZGFnLG9uc2RhZyx0b3JzZGFnLGZyZWRhZyxsXHUwMGY2cmRhZyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJzXHUwMGY2bmRhZyxtXHUwMGU1bmRhZyx0aXNkYWcsb25zZGFnLHRvcnNkYWcsZnJlZGFnLGxcdTAwZjZyZGFnIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJzXHUwMGY2bixtXHUwMGU1bix0aXMsb25zLHRvcnMsZnJlLGxcdTAwZjZyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoic1x1MDBmNm4sbVx1MDBlNW4sdGlzLG9ucyx0b3IsZnJlLGxcdTAwZjZyIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiUyxNLFQsTyxULEYsTCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJTLE0sVCxPLFQsRixMIi5zcGxpdCgiLCIpLCAKU0hPUlRRVUFSVEVSUzpbIksxIiwgIksyIiwgIkszIiwgIks0Il0sIFFVQVJURVJTOlsiMTphIGt2YXJ0YWxldCIsICIyOmEga3ZhcnRhbGV0IiwgIjM6ZSBrdmFydGFsZXQiLCAiNDplIGt2YXJ0YWxldCJdLCBBTVBNUzpbImZtIiwgImVtIl0sIERBVEVGT1JNQVRTOlsiRUVFRSdlbicgJ2RlbicgZDonZScgTU1NTSB5IiwgImQgTU1NTSB5IiwgImQgTU1NIHkiLCAieXl5eS1NTS1kZCJdLCBUSU1FRk9STUFUUzpbIidrbCcuIEhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3cgPSB7RVJBUzpbIktLIiwgIkJLIl0sIEVSQU5BTUVTOlsiS2FibGEgeWEgS3Jpc3RvIiwgIkJhYWRhIHlhIEtyaXN0byJdLCBOQVJST1dNT05USFM6IkosRixNLEEsTSxKLEosQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJKLEYsTSxBLE0sSixKLEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJKYW51YXJpLEZlYnJ1YXJpLE1hY2hpLEFwcmlsaSxNZWksSnVuaSxKdWxhaSxBZ29zdGksU2VwdGVtYmEsT2t0b2JhLE5vdmVtYmEsRGVzZW1iYSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiSmFudWFyaSxGZWJydWFyaSxNYWNoaSxBcHJpbGksTWVpLEp1bmksSnVsYWksQWdvc3RpLFNlcHRlbWJhLE9rdG9iYSxOb3ZlbWJhLERlc2VtYmEiLnNwbGl0KCIsIiksIFNIT1JUTU9OVEhTOiJKYW4sRmViLE1hYyxBcHIsTWVpLEp1bixKdWwsQWdvLFNlcCxPa3QsTm92LERlcyIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiSmFuLEZlYixNYWMsQXByLE1laSxKdW4sSnVsLEFnbyxTZXAsT2t0LE5vdixEZXMiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJKdW1hcGlsaSxKdW1hdGF0dSxKdW1hbm5lLEp1bWF0YW5vLEFsaGFtaXNpLElqdW1hYSxKdW1hbW9zaSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJKdW1hcGlsaSxKdW1hdGF0dSxKdW1hbm5lLEp1bWF0YW5vLEFsaGFtaXNpLElqdW1hYSxKdW1hbW9zaSIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiSjIsSjMsSjQsSjUsQWxoLElqLEoxIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiSjIsSjMsSjQsSjUsQWxoLElqLEoxIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiMiwzLDQsNSxBLEksMSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiIyLDMsNCw1LEEsSSwxIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUjEiLCAiUjIiLCAiUjMiLCAiUjQiXSwgClFVQVJURVJTOlsiUm9ibyAxIiwgIlJvYm8gMiIsICJSb2JvIDMiLCAiUm9ibyA0Il0sIEFNUE1TOlsiYXN1YnVoaSIsICJhbGFzaXJpIl0sIERBVEVGT1JNQVRTOlsiRUVFRSwgZCBNTU1NIHkiLCAiZCBNTU1NIHkiLCAiZCBNTU0geSIsICJkZC9NTS95eXl5Il0sIFRJTUVGT1JNQVRTOlsiaDptbTpzcyBhIHp6enoiLCAiaDptbTpzcyBhIHoiLCAiaDptbTpzcyBhIiwgImg6bW0gYSJdLCBGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGEgPSB7RVJBUzpbIlx1MGI5NVx1MGJiZi5cdTBiYWVcdTBiYzEuIiwgIlx1MGI5NVx1MGJiZi5cdTBiYWFcdTBiYmYuIl0sIEVSQU5BTUVTOlsiXHUwYjk1XHUwYmJmXHUwYmIxXHUwYmJmXHUwYmI4XHUwYmNkXHUwYmE0XHUwYmMxXHUwYmI1XHUwYmMxXHUwYjk1XHUwYmNkXHUwYjk1XHUwYmMxIFx1MGJhZVx1MGJjMVx1MGJhOVx1MGJjZCIsICJcdTBiODVcdTBiYTlcdTBiY2IgXHUwYjlmXHUwYmNiXHUwYmFlXHUwYmJmXHUwYmE5XHUwYmJmIl0sIE5BUlJPV01PTlRIUzoiXHUwYjljLFx1MGJhYVx1MGJiZixcdTBiYWVcdTBiYmUsXHUwYjhmLFx1MGJhZVx1MGJjNyxcdTBiOWNcdTBiYzIsXHUwYjljXHUwYmMyLFx1MGI4NixcdTBiOWFcdTBiYzYsXHUwYjg1LFx1MGJhOCxcdTBiOWZcdTBiYmYiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MGI5YyxcdTBiYWFcdTBiYmYsXHUwYmFlXHUwYmJlLFx1MGI4ZixcdTBiYWVcdTBiYzcsXHUwYjljXHUwYmMyLFx1MGI5Y1x1MGJjMixcdTBiODYsXHUwYjlhXHUwYmM2LFx1MGI4NSxcdTBiYTgsXHUwYjlmXHUwYmJmIi5zcGxpdCgiLCIpLCAKTU9OVEhTOiJcdTBiOWNcdTBiYTlcdTBiYjVcdTBiYjBcdTBiYmYsXHUwYmFhXHUwYmJmXHUwYmFhXHUwYmNkXHUwYmIwXHUwYmI1XHUwYmIwXHUwYmJmLFx1MGJhZVx1MGJiZVx1MGJiMFx1MGJjZFx1MGI5YVx1MGJjZCxcdTBiOGZcdTBiYWFcdTBiY2RcdTBiYjBcdTBiYjJcdTBiY2QsXHUwYmFlXHUwYmM3LFx1MGI5Y1x1MGJjMlx1MGJhOVx1MGJjZCxcdTBiOWNcdTBiYzJcdTBiYjJcdTBiYzgsXHUwYjg2XHUwYjk1XHUwYmI4XHUwYmNkXHUwYjlmXHUwYmNkLFx1MGI5YVx1MGJjNlx1MGJhYVx1MGJjZFx1MGI5Zlx1MGJhZVx1MGJjZFx1MGJhYVx1MGJiMFx1MGJjZCxcdTBiODVcdTBiOTVcdTBiY2RcdTBiOWZcdTBiY2JcdTBiYWFcdTBiYjBcdTBiY2QsXHUwYmE4XHUwYmI1XHUwYmFlXHUwYmNkXHUwYmFhXHUwYmIwXHUwYmNkLFx1MGI5Zlx1MGJiZlx1MGI5YVx1MGJhZVx1MGJjZFx1MGJhYVx1MGJiMFx1MGJjZCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiXHUwYjljXHUwYmE5XHUwYmI1XHUwYmIwXHUwYmJmLFx1MGJhYVx1MGJiZlx1MGJhYVx1MGJjZFx1MGJiMFx1MGJiNVx1MGJiMFx1MGJiZixcdTBiYWVcdTBiYmVcdTBiYjBcdTBiY2RcdTBiOWFcdTBiY2QsXHUwYjhmXHUwYmFhXHUwYmNkXHUwYmIwXHUwYmIyXHUwYmNkLFx1MGJhZVx1MGJjNyxcdTBiOWNcdTBiYzJcdTBiYTlcdTBiY2QsXHUwYjljXHUwYmMyXHUwYmIyXHUwYmM4LFx1MGI4Nlx1MGI5NVx1MGJiOFx1MGJjZFx1MGI5Zlx1MGJjMSxcdTBiOWFcdTBiYzZcdTBiYWFcdTBiY2RcdTBiOWZcdTBiYWVcdTBiY2RcdTBiYWFcdTBiYjBcdTBiY2QsXHUwYjg1XHUwYjk1XHUwYmNkXHUwYjlmXHUwYmNiXHUwYmFhXHUwYmIwXHUwYmNkLFx1MGJhOFx1MGJiNVx1MGJhZVx1MGJjZFx1MGJhYVx1MGJiMFx1MGJjZCxcdTBiOWZcdTBiYmZcdTBiOWFcdTBiYWVcdTBiY2RcdTBiYWFcdTBiYjBcdTBiY2QiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoiXHUwYjljXHUwYmE5LixcdTBiYWFcdTBiYmZcdTBiYWFcdTBiY2QuLFx1MGJhZVx1MGJiZVx1MGJiMFx1MGJjZC4sXHUwYjhmXHUwYmFhXHUwYmNkLixcdTBiYWVcdTBiYzcsXHUwYjljXHUwYmMyXHUwYmE5XHUwYmNkLFx1MGI5Y1x1MGJjMlx1MGJiMlx1MGJjOCxcdTBiODZcdTBiOTUuLFx1MGI5YVx1MGJjNlx1MGJhYVx1MGJjZC4sXHUwYjg1XHUwYjk1XHUwYmNkLixcdTBiYThcdTBiYjUuLFx1MGI5Zlx1MGJiZlx1MGI5YS4iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwYjljXHUwYmE5LixcdTBiYWFcdTBiYmZcdTBiYWFcdTBiY2QuLFx1MGJhZVx1MGJiZVx1MGJiMFx1MGJjZC4sXHUwYjhmXHUwYmFhXHUwYmNkLixcdTBiYWVcdTBiYzcsXHUwYjljXHUwYmMyXHUwYmE5XHUwYmNkLFx1MGI5Y1x1MGJjMlx1MGJiMlx1MGJjOCxcdTBiODZcdTBiOTUuLFx1MGI5YVx1MGJjNlx1MGJhYVx1MGJjZC4sXHUwYjg1XHUwYjk1XHUwYmNkLixcdTBiYThcdTBiYjUuLFx1MGI5Zlx1MGJiZlx1MGI5YS4iLnNwbGl0KCIsIiksIApXRUVLREFZUzoiXHUwYjllXHUwYmJlXHUwYmFmXHUwYmJmXHUwYmIxXHUwYmMxLFx1MGJhNFx1MGJiZlx1MGI5OVx1MGJjZFx1MGI5NVx1MGJiM1x1MGJjZCxcdTBiOWFcdTBiYzZcdTBiYjVcdTBiY2RcdTBiYjVcdTBiYmVcdTBiYWZcdTBiY2QsXHUwYmFhXHUwYmMxXHUwYmE0XHUwYmE5XHUwYmNkLFx1MGJiNVx1MGJiZlx1MGJhZlx1MGJiZVx1MGJiNFx1MGJhOVx1MGJjZCxcdTBiYjVcdTBiYzZcdTBiYjNcdTBiY2RcdTBiYjNcdTBiYmYsXHUwYjlhXHUwYmE5XHUwYmJmIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Ilx1MGI5ZVx1MGJiZVx1MGJhZlx1MGJiZlx1MGJiMVx1MGJjMSxcdTBiYTRcdTBiYmZcdTBiOTlcdTBiY2RcdTBiOTVcdTBiYjNcdTBiY2QsXHUwYjlhXHUwYmM2XHUwYmI1XHUwYmNkXHUwYmI1XHUwYmJlXHUwYmFmXHUwYmNkLFx1MGJhYVx1MGJjMVx1MGJhNFx1MGJhOVx1MGJjZCxcdTBiYjVcdTBiYmZcdTBiYWZcdTBiYmVcdTBiYjRcdTBiYTlcdTBiY2QsXHUwYmI1XHUwYmM2XHUwYmIzXHUwYmNkXHUwYmIzXHUwYmJmLFx1MGI5YVx1MGJhOVx1MGJiZiIuc3BsaXQoIiwiKSwgClNIT1JUV0VFS0RBWVM6Ilx1MGI5ZVx1MGJiZSxcdTBiYTRcdTBiYmYsXHUwYjlhXHUwYmM2LFx1MGJhYVx1MGJjMSxcdTBiYjVcdTBiYmYsXHUwYmI1XHUwYmM2LFx1MGI5YSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MGI5ZVx1MGJiZSxcdTBiYTRcdTBiYmYsXHUwYjlhXHUwYmM2LFx1MGJhYVx1MGJjMSxcdTBiYjVcdTBiYmYsXHUwYmI1XHUwYmM2LFx1MGI5YSIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1MGI5ZVx1MGJiZSxcdTBiYTRcdTBiYmYsXHUwYjlhXHUwYmM2LFx1MGJhYVx1MGJjMSxcdTBiYjVcdTBiYmYsXHUwYmI1XHUwYmM2LFx1MGI5YSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTBiOWVcdTBiYmUsXHUwYmE0XHUwYmJmLFx1MGI5YVx1MGJjNixcdTBiYWFcdTBiYzEsXHUwYmI1XHUwYmJmLFx1MGJiNVx1MGJjNixcdTBiOWEiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJcdTBiOTVcdTBiYmVcdTBiYjJcdTBiYmVcdTBiYTNcdTBiY2RcdTBiOWZcdTBiYzExIiwgCiJcdTBiOTVcdTBiYmVcdTBiYjJcdTBiYmVcdTBiYTNcdTBiY2RcdTBiOWZcdTBiYzEyIiwgIlx1MGI5NVx1MGJiZVx1MGJiMlx1MGJiZVx1MGJhM1x1MGJjZFx1MGI5Zlx1MGJjMTMiLCAiXHUwYjk1XHUwYmJlXHUwYmIyXHUwYmJlXHUwYmEzXHUwYmNkXHUwYjlmXHUwYmMxNCJdLCBRVUFSVEVSUzpbIlx1MGJhZVx1MGJjMVx1MGJhNFx1MGJiMlx1MGJjZCBcdTBiOTVcdTBiYmVcdTBiYjJcdTBiYmVcdTBiYTNcdTBiY2RcdTBiOWZcdTBiYzEiLCAiXHUwYjg3XHUwYmIwXHUwYmEzXHUwYmNkXHUwYjlmXHUwYmJlXHUwYmFlXHUwYmNkIFx1MGI5NVx1MGJiZVx1MGJiMlx1MGJiZVx1MGJhM1x1MGJjZFx1MGI5Zlx1MGJjMSIsICJcdTBiYWVcdTBiYzJcdTBiYTlcdTBiY2RcdTBiYjFcdTBiYmVcdTBiYWVcdTBiY2QgXHUwYjk1XHUwYmJlXHUwYmIyXHUwYmJlXHUwYmEzXHUwYmNkXHUwYjlmXHUwYmMxIiwgIlx1MGJhOFx1MGJiZVx1MGJhOVx1MGJjZFx1MGI5NVx1MGJiZVx1MGJhZVx1MGJjZCBcdTBiOTVcdTBiYmVcdTBiYjJcdTBiYmVcdTBiYTNcdTBiY2RcdTBiOWZcdTBiYzEiXSwgCkFNUE1TOlsiXHUwYmFlXHUwYmMxXHUwYmIxXHUwYmNkXHUwYmFhXHUwYjk1XHUwYmIyXHUwYmNkIiwgIlx1MGJhYVx1MGJiZlx1MGJiMVx1MGJjZFx1MGJhYVx1MGI5NVx1MGJiMlx1MGJjZCJdLCBEQVRFRk9STUFUUzpbIkVFRUUsIGQgTU1NTSwgeSIsICJkIE1NTU0sIHkiLCAiZCBNTU0sIHkiLCAiZC1NLXl5Il0sIFRJTUVGT1JNQVRTOlsiaDptbTpzcyBhIHp6enoiLCAiaDptbTpzcyBhIHoiLCAiaDptbTpzcyBhIiwgImg6bW0gYSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzYsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGUgPSB7RVJBUzpbIlx1MGMwOFx1MGMzOFx1MGMzZVx1MGMyYVx1MGM0Mlx1MGMzMFx1MGM0ZFx1MGMzNS4iLCAiXHUwYzM4XHUwYzI4XHUwYzRkLiJdLCBFUkFOQU1FUzpbIlx1MGMwOFx1MGMzOFx1MGMzZVx1MGMyYVx1MGM0Mlx1MGMzMFx1MGM0ZFx1MGMzNS4iLCAiXHUwYzM4XHUwYzI4XHUwYzRkLiJdLCBOQVJST1dNT05USFM6Ilx1MGMxYyxcdTBjMmJcdTBjM2YsXHUwYzJlXHUwYzNlLFx1MGMwZixcdTBjMmVcdTBjNDYsXHUwYzFjXHUwYzQxLFx1MGMxY1x1MGM0MSxcdTBjMDYsXHUwYzM4XHUwYzQ2LFx1MGMwNSxcdTBjMjgsXHUwYzIxXHUwYzNmIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJcdTBjMWMsXHUwYzJiXHUwYzNmLFx1MGMyZSxcdTBjMGUsXHUwYzJlXHUwYzQ2LFx1MGMxY1x1MGM0MSxcdTBjMWNcdTBjNDEsXHUwYzA2LFx1MGMzOFx1MGM0NixcdTBjMDUsXHUwYzI4LFx1MGMyMVx1MGMzZiIuc3BsaXQoIiwiKSwgCk1PTlRIUzoiXHUwYzFjXHUwYzI4XHUwYzM1XHUwYzMwXHUwYzNmLFx1MGMyYlx1MGMzZlx1MGMyY1x1MGM0ZFx1MGMzMFx1MGMzNVx1MGMzMFx1MGMzZixcdTBjMmVcdTBjM2VcdTBjMzBcdTBjNGRcdTBjMWFcdTBjM2YsXHUwYzBlXHUwYzJhXHUwYzRkXHUwYzMwXHUwYzNmXHUwYzMyXHUwYzRkLFx1MGMyZVx1MGM0NyxcdTBjMWNcdTBjNDJcdTBjMjhcdTBjNGQsXHUwYzFjXHUwYzQyXHUwYzMyXHUwYzQ4LFx1MGMwNlx1MGMxN1x1MGMzOFx1MGM0ZFx1MGMxZlx1MGM0MSxcdTBjMzhcdTBjNDZcdTBjMmFcdTBjNGRcdTBjMWZcdTBjNDZcdTBjMDJcdTBjMmNcdTBjMzBcdTBjNGQsXHUwYzA1XHUwYzE1XHUwYzRkXHUwYzFmXHUwYzRiXHUwYzJjXHUwYzMwXHUwYzRkLFx1MGMyOFx1MGMzNVx1MGMwMlx1MGMyY1x1MGMzMFx1MGM0ZCxcdTBjMjFcdTBjM2ZcdTBjMzhcdTBjNDZcdTBjMDJcdTBjMmNcdTBjMzBcdTBjNGQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6Ilx1MGMxY1x1MGMyOFx1MGMzNVx1MGMzMFx1MGMzZixcdTBjMmJcdTBjM2ZcdTBjMmNcdTBjNGRcdTBjMzBcdTBjMzVcdTBjMzBcdTBjM2YsXHUwYzJlXHUwYzNlXHUwYzMwXHUwYzRkXHUwYzFhXHUwYzNmLFx1MGMwZVx1MGMyYVx1MGM0ZFx1MGMzMFx1MGMzZlx1MGMzMlx1MGM0ZCxcdTBjMmVcdTBjNDcsXHUwYzFjXHUwYzQyXHUwYzI4XHUwYzRkLFx1MGMxY1x1MGM0Mlx1MGMzMlx1MGM0OCxcdTBjMDZcdTBjMTdcdTBjMzhcdTBjNGRcdTBjMWZcdTBjNDEsXHUwYzM4XHUwYzQ2XHUwYzJhXHUwYzRkXHUwYzFmXHUwYzQ2XHUwYzAyXHUwYzJjXHUwYzMwXHUwYzRkLFx1MGMwNVx1MGMxNVx1MGM0ZFx1MGMxZlx1MGM0Ylx1MGMyY1x1MGMzMFx1MGM0ZCxcdTBjMjhcdTBjMzVcdTBjMDJcdTBjMmNcdTBjMzBcdTBjNGQsXHUwYzIxXHUwYzNmXHUwYzM4XHUwYzQ2XHUwYzAyXHUwYzJjXHUwYzMwXHUwYzRkIi5zcGxpdCgiLCIpLCAKU0hPUlRNT05USFM6Ilx1MGMxY1x1MGMyOCxcdTBjMmJcdTBjM2ZcdTBjMmNcdTBjNGRcdTBjMzAsXHUwYzJlXHUwYzNlXHUwYzMwXHUwYzRkXHUwYzFhXHUwYzNmLFx1MGMwZlx1MGMyYVx1MGM0ZFx1MGMzMFx1MGMzZixcdTBjMmVcdTBjNDcsXHUwYzFjXHUwYzQyXHUwYzI4XHUwYzRkLFx1MGMxY1x1MGM0Mlx1MGMzMlx1MGM0OCxcdTBjMDZcdTBjMTdcdTBjMzhcdTBjNGRcdTBjMWZcdTBjNDEsXHUwYzM4XHUwYzQ2XHUwYzJhXHUwYzRkXHUwYzFmXHUwYzQ2XHUwYzAyXHUwYzJjXHUwYzMwXHUwYzRkLFx1MGMwNVx1MGMxNVx1MGM0ZFx1MGMxZlx1MGM0Ylx1MGMyY1x1MGMzMFx1MGM0ZCxcdTBjMjhcdTBjMzVcdTBjMDJcdTBjMmNcdTBjMzBcdTBjNGQsXHUwYzIxXHUwYzNmXHUwYzM4XHUwYzQ2XHUwYzAyXHUwYzJjXHUwYzMwXHUwYzRkIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRNT05USFM6Ilx1MGMxY1x1MGMyOCxcdTBjMmJcdTBjM2ZcdTBjMmNcdTBjNGRcdTBjMzAsXHUwYzJlXHUwYzNlXHUwYzMwXHUwYzRkXHUwYzFhXHUwYzNmLFx1MGMwZlx1MGMyYVx1MGM0ZFx1MGMzMFx1MGMzZixcdTBjMmVcdTBjNDcsXHUwYzFjXHUwYzQyXHUwYzI4XHUwYzRkLFx1MGMxY1x1MGM0Mlx1MGMzMlx1MGM0OCxcdTBjMDZcdTBjMTdcdTBjMzhcdTBjNGRcdTBjMWZcdTBjNDEsXHUwYzM4XHUwYzQ2XHUwYzJhXHUwYzRkXHUwYzFmXHUwYzQ2XHUwYzAyXHUwYzJjXHUwYzMwXHUwYzRkLFx1MGMwNVx1MGMxNVx1MGM0ZFx1MGMxZlx1MGM0Ylx1MGMyY1x1MGMzMFx1MGM0ZCxcdTBjMjhcdTBjMzVcdTBjMDJcdTBjMmNcdTBjMzBcdTBjNGQsXHUwYzIxXHUwYzNmXHUwYzM4XHUwYzQ2XHUwYzAyXHUwYzJjXHUwYzMwXHUwYzRkIi5zcGxpdCgiLCIpLCAKV0VFS0RBWVM6Ilx1MGMwNlx1MGMyNlx1MGMzZlx1MGMzNVx1MGMzZVx1MGMzMFx1MGMwMixcdTBjMzhcdTBjNGJcdTBjMmVcdTBjMzVcdTBjM2VcdTBjMzBcdTBjMDIsXHUwYzJlXHUwYzAyXHUwYzE3XHUwYzMzXHUwYzM1XHUwYzNlXHUwYzMwXHUwYzAyLFx1MGMyY1x1MGM0MVx1MGMyN1x1MGMzNVx1MGMzZVx1MGMzMFx1MGMwMixcdTBjMTdcdTBjNDFcdTBjMzBcdTBjNDFcdTBjMzVcdTBjM2VcdTBjMzBcdTBjMDIsXHUwYzM2XHUwYzQxXHUwYzE1XHUwYzRkXHUwYzMwXHUwYzM1XHUwYzNlXHUwYzMwXHUwYzAyLFx1MGMzNlx1MGMyOFx1MGMzZlx1MGMzNVx1MGMzZVx1MGMzMFx1MGMwMiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJcdTBjMDZcdTBjMjZcdTBjM2ZcdTBjMzVcdTBjM2VcdTBjMzBcdTBjMDIsXHUwYzM4XHUwYzRiXHUwYzJlXHUwYzM1XHUwYzNlXHUwYzMwXHUwYzAyLFx1MGMyZVx1MGMwMlx1MGMxN1x1MGMzM1x1MGMzNVx1MGMzZVx1MGMzMFx1MGMwMixcdTBjMmNcdTBjNDFcdTBjMjdcdTBjMzVcdTBjM2VcdTBjMzBcdTBjMDIsXHUwYzE3XHUwYzQxXHUwYzMwXHUwYzQxXHUwYzM1XHUwYzNlXHUwYzMwXHUwYzAyLFx1MGMzNlx1MGM0MVx1MGMxNVx1MGM0ZFx1MGMzMFx1MGMzNVx1MGMzZVx1MGMzMFx1MGMwMixcdTBjMzZcdTBjMjhcdTBjM2ZcdTBjMzVcdTBjM2VcdTBjMzBcdTBjMDIiLnNwbGl0KCIsIiksIApTSE9SVFdFRUtEQVlTOiJcdTBjMDZcdTBjMjZcdTBjM2YsXHUwYzM4XHUwYzRiXHUwYzJlLFx1MGMyZVx1MGMwMlx1MGMxN1x1MGMzMyxcdTBjMmNcdTBjNDFcdTBjMjcsXHUwYzE3XHUwYzQxXHUwYzMwXHUwYzQxLFx1MGMzNlx1MGM0MVx1MGMxNVx1MGM0ZFx1MGMzMCxcdTBjMzZcdTBjMjhcdTBjM2YiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJcdTBjMDZcdTBjMjZcdTBjM2YsXHUwYzM4XHUwYzRiXHUwYzJlLFx1MGMyZVx1MGMwMlx1MGMxN1x1MGMzMyxcdTBjMmNcdTBjNDFcdTBjMjcsXHUwYzE3XHUwYzQxXHUwYzMwXHUwYzQxLFx1MGMzNlx1MGM0MVx1MGMxNVx1MGM0ZFx1MGMzMCxcdTBjMzZcdTBjMjhcdTBjM2YiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJcdTBjMDYsXHUwYzM4XHUwYzRiLFx1MGMyZSxcdTBjMmRcdTBjNDEsXHUwYzE3XHUwYzQxLFx1MGMzNlx1MGM0MSxcdTBjMzYiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiXHUwYzA2LFx1MGMzOFx1MGM0YixcdTBjMmUsXHUwYzJkXHUwYzQxLFx1MGMxN1x1MGM0MSxcdTBjMzZcdTBjNDEsXHUwYzM2Ii5zcGxpdCgiLCIpLCAKU0hPUlRRVUFSVEVSUzpbIlx1MGMxMlx1MGMxNVx1MGMxZlx1MGMzZiAxIiwgIlx1MGMzMFx1MGM0Nlx1MGMwMlx1MGMyMVx1MGM0MSAyIiwgIlx1MGMyZVx1MGM0Mlx1MGMyMVx1MGM0MSAzIiwgIlx1MGMyOFx1MGMzZVx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSA0Il0sIFFVQVJURVJTOlsiXHUwYzEyXHUwYzE1XHUwYzFmXHUwYzNmIDEiLCAiXHUwYzMwXHUwYzQ2XHUwYzAyXHUwYzIxXHUwYzQxIDIiLCAiXHUwYzJlXHUwYzQyXHUwYzIxXHUwYzQxIDMiLCAiXHUwYzI4XHUwYzNlXHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxIDQiXSwgQU1QTVM6WyJcdTBjMmFcdTBjNDJcdTBjMzBcdTBjNGRcdTBjMzVcdTBjM2VcdTBjMzlcdTBjNGRcdTBjMjhcdTBjMDIiLCAiXHUwYzA1XHUwYzJhXHUwYzMwXHUwYzNlXHUwYzM5XHUwYzRkXHUwYzI4XHUwYzAyIl0sIERBVEVGT1JNQVRTOlsiRUVFRSBkIE1NTU0geSIsICJkIE1NTU0geSIsICJkIE1NTSB5IiwgImRkLU1NLXl5Il0sIFRJTUVGT1JNQVRTOlsiaDptbTpzcyBhIHp6enoiLCAKImg6bW06c3MgYSB6IiwgImg6bW06c3MgYSIsICJoOm1tIGEiXSwgRklSU1REQVlPRldFRUs6NiwgV0VFS0VORFJBTkdFOls2LCA2XSwgRklSU1RXRUVLQ1VUT0ZGREFZOjJ9Owpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RoID0ge0VSQVM6WyJcdTBlMWJcdTBlMzVcdTBlMDFcdTBlNDhcdTBlMmRcdTBlMTkgXHUwZTA0Llx1MGUyOC4iLCAiXHUwZTA0Llx1MGUyOC4iXSwgRVJBTkFNRVM6WyJcdTBlMWJcdTBlMzVcdTBlMDFcdTBlNDhcdTBlMmRcdTBlMTlcdTBlMDRcdTBlMjNcdTBlMzRcdTBlMmFcdTBlMTVcdTBlNGNcdTBlMjhcdTBlMzFcdTBlMDFcdTBlMjNcdTBlMzJcdTBlMGEiLCAiXHUwZTA0XHUwZTIzXHUwZTM0XHUwZTJhXHUwZTE1XHUwZTRjXHUwZTI4XHUwZTMxXHUwZTAxXHUwZTIzXHUwZTMyXHUwZTBhIl0sIE5BUlJPV01PTlRIUzoiXHUwZTIxLlx1MGUwNC4sXHUwZTAxLlx1MGUxZS4sXHUwZTIxXHUwZTM1Llx1MGUwNC4sXHUwZTQwXHUwZTIxLlx1MGUyMi4sXHUwZTFlLlx1MGUwNC4sXHUwZTIxXHUwZTM0Llx1MGUyMixcdTBlMDEuXHUwZTA0LixcdTBlMmEuXHUwZTA0LixcdTBlMDEuXHUwZTIyLixcdTBlMTUuXHUwZTA0LixcdTBlMWUuXHUwZTIyLixcdTBlMTguXHUwZTA0LiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVOQVJST1dNT05USFM6Ilx1MGUyMS5cdTBlMDQuLFx1MGUwMS5cdTBlMWUuLFx1MGUyMVx1MGUzNS5cdTBlMDQuLFx1MGU0MFx1MGUyMS5cdTBlMjIuLFx1MGUxZS5cdTBlMDQuLFx1MGUyMVx1MGUzNC5cdTBlMjIuLFx1MGUwMS5cdTBlMDQuLFx1MGUyYS5cdTBlMDQuLFx1MGUwMS5cdTBlMjIuLFx1MGUxNS5cdTBlMDQuLFx1MGUxZS5cdTBlMjIuLFx1MGUxOC5cdTBlMDQuIi5zcGxpdCgiLCIpLCBNT05USFM6Ilx1MGUyMVx1MGUwMVx1MGUyM1x1MGUzMlx1MGUwNFx1MGUyMSxcdTBlMDFcdTBlMzhcdTBlMjFcdTBlMjBcdTBlMzJcdTBlMWVcdTBlMzFcdTBlMTlcdTBlMThcdTBlNGMsXHUwZTIxXHUwZTM1XHUwZTE5XHUwZTMyXHUwZTA0XHUwZTIxLFx1MGU0MFx1MGUyMVx1MGUyOVx1MGUzMlx1MGUyMlx1MGUxOSxcdTBlMWVcdTBlMjRcdTBlMjlcdTBlMjBcdTBlMzJcdTBlMDRcdTBlMjEsXHUwZTIxXHUwZTM0XHUwZTE2XHUwZTM4XHUwZTE5XHUwZTMyXHUwZTIyXHUwZTE5LFx1MGUwMVx1MGUyM1x1MGUwMVx1MGUwZVx1MGUzMlx1MGUwNFx1MGUyMSxcdTBlMmFcdTBlMzRcdTBlMDdcdTBlMmJcdTBlMzJcdTBlMDRcdTBlMjEsXHUwZTAxXHUwZTMxXHUwZTE5XHUwZTIyXHUwZTMyXHUwZTIyXHUwZTE5LFx1MGUxNVx1MGUzOFx1MGUyNVx1MGUzMlx1MGUwNFx1MGUyMSxcdTBlMWVcdTBlMjRcdTBlMjhcdTBlMDhcdTBlMzRcdTBlMDFcdTBlMzJcdTBlMjJcdTBlMTksXHUwZTE4XHUwZTMxXHUwZTE5XHUwZTI3XHUwZTMyXHUwZTA0XHUwZTIxIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORU1PTlRIUzoiXHUwZTIxXHUwZTAxXHUwZTIzXHUwZTMyXHUwZTA0XHUwZTIxLFx1MGUwMVx1MGUzOFx1MGUyMVx1MGUyMFx1MGUzMlx1MGUxZVx1MGUzMVx1MGUxOVx1MGUxOFx1MGU0YyxcdTBlMjFcdTBlMzVcdTBlMTlcdTBlMzJcdTBlMDRcdTBlMjEsXHUwZTQwXHUwZTIxXHUwZTI5XHUwZTMyXHUwZTIyXHUwZTE5LFx1MGUxZVx1MGUyNFx1MGUyOVx1MGUyMFx1MGUzMlx1MGUwNFx1MGUyMSxcdTBlMjFcdTBlMzRcdTBlMTZcdTBlMzhcdTBlMTlcdTBlMzJcdTBlMjJcdTBlMTksXHUwZTAxXHUwZTIzXHUwZTAxXHUwZTBlXHUwZTMyXHUwZTA0XHUwZTIxLFx1MGUyYVx1MGUzNFx1MGUwN1x1MGUyYlx1MGUzMlx1MGUwNFx1MGUyMSxcdTBlMDFcdTBlMzFcdTBlMTlcdTBlMjJcdTBlMzJcdTBlMjJcdTBlMTksXHUwZTE1XHUwZTM4XHUwZTI1XHUwZTMyXHUwZTA0XHUwZTIxLFx1MGUxZVx1MGUyNFx1MGUyOFx1MGUwOFx1MGUzNFx1MGUwMVx1MGUzMlx1MGUyMlx1MGUxOSxcdTBlMThcdTBlMzFcdTBlMTlcdTBlMjdcdTBlMzJcdTBlMDRcdTBlMjEiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoiXHUwZTIxLlx1MGUwNC4sXHUwZTAxLlx1MGUxZS4sXHUwZTIxXHUwZTM1Llx1MGUwNC4sXHUwZTQwXHUwZTIxLlx1MGUyMi4sXHUwZTFlLlx1MGUwNC4sXHUwZTIxXHUwZTM0Llx1MGUyMi4sXHUwZTAxLlx1MGUwNC4sXHUwZTJhLlx1MGUwNC4sXHUwZTAxLlx1MGUyMi4sXHUwZTE1Llx1MGUwNC4sXHUwZTFlLlx1MGUyMi4sXHUwZTE4Llx1MGUwNC4iLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwZTIxLlx1MGUwNC4sXHUwZTAxLlx1MGUxZS4sXHUwZTIxXHUwZTM1Llx1MGUwNC4sXHUwZTQwXHUwZTIxLlx1MGUyMi4sXHUwZTFlLlx1MGUwNC4sXHUwZTIxXHUwZTM0Llx1MGUyMi4sXHUwZTAxLlx1MGUwNC4sXHUwZTJhLlx1MGUwNC4sXHUwZTAxLlx1MGUyMi4sXHUwZTE1Llx1MGUwNC4sXHUwZTFlLlx1MGUyMi4sXHUwZTE4Llx1MGUwNC4iLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJcdTBlMjdcdTBlMzFcdTBlMTlcdTBlMmRcdTBlMzJcdTBlMTdcdTBlMzRcdTBlMTVcdTBlMjJcdTBlNGMsXHUwZTI3XHUwZTMxXHUwZTE5XHUwZTA4XHUwZTMxXHUwZTE5XHUwZTE3XHUwZTIzXHUwZTRjLFx1MGUyN1x1MGUzMVx1MGUxOVx1MGUyZFx1MGUzMVx1MGUwN1x1MGUwNFx1MGUzMlx1MGUyMyxcdTBlMjdcdTBlMzFcdTBlMTlcdTBlMWVcdTBlMzhcdTBlMTgsXHUwZTI3XHUwZTMxXHUwZTE5XHUwZTFlXHUwZTI0XHUwZTJiXHUwZTMxXHUwZTJhXHUwZTFhXHUwZTE0XHUwZTM1LFx1MGUyN1x1MGUzMVx1MGUxOVx1MGUyOFx1MGUzOFx1MGUwMVx1MGUyM1x1MGU0YyxcdTBlMjdcdTBlMzFcdTBlMTlcdTBlNDBcdTBlMmFcdTBlMzJcdTBlMjNcdTBlNGMiLnNwbGl0KCIsIiksIApTVEFOREFMT05FV0VFS0RBWVM6Ilx1MGUyN1x1MGUzMVx1MGUxOVx1MGUyZFx1MGUzMlx1MGUxN1x1MGUzNFx1MGUxNVx1MGUyMlx1MGU0YyxcdTBlMjdcdTBlMzFcdTBlMTlcdTBlMDhcdTBlMzFcdTBlMTlcdTBlMTdcdTBlMjNcdTBlNGMsXHUwZTI3XHUwZTMxXHUwZTE5XHUwZTJkXHUwZTMxXHUwZTA3XHUwZTA0XHUwZTMyXHUwZTIzLFx1MGUyN1x1MGUzMVx1MGUxOVx1MGUxZVx1MGUzOFx1MGUxOCxcdTBlMjdcdTBlMzFcdTBlMTlcdTBlMWVcdTBlMjRcdTBlMmJcdTBlMzFcdTBlMmFcdTBlMWFcdTBlMTRcdTBlMzUsXHUwZTI3XHUwZTMxXHUwZTE5XHUwZTI4XHUwZTM4XHUwZTAxXHUwZTIzXHUwZTRjLFx1MGUyN1x1MGUzMVx1MGUxOVx1MGU0MFx1MGUyYVx1MGUzMlx1MGUyM1x1MGU0YyIuc3BsaXQoIiwiKSwgU0hPUlRXRUVLREFZUzoiXHUwZTJkXHUwZTMyLixcdTBlMDguLFx1MGUyZC4sXHUwZTFlLixcdTBlMWVcdTBlMjQuLFx1MGUyOC4sXHUwZTJhLiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJcdTBlMmRcdTBlMzIuLFx1MGUwOC4sXHUwZTJkLixcdTBlMWUuLFx1MGUxZVx1MGUyNC4sXHUwZTI4LixcdTBlMmEuIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiXHUwZTJkLFx1MGUwOCxcdTBlMmQsXHUwZTFlLFx1MGUxZSxcdTBlMjgsXHUwZTJhIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6Ilx1MGUyZCxcdTBlMDgsXHUwZTJkLFx1MGUxZSxcdTBlMWUsXHUwZTI4LFx1MGUyYSIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIlExIiwgIlEyIiwgIlEzIiwgIlE0Il0sIFFVQVJURVJTOlsiXHUwZTQ0XHUwZTE1XHUwZTIzXHUwZTIxXHUwZTMyXHUwZTJhIDEiLCAiXHUwZTQ0XHUwZTE1XHUwZTIzXHUwZTIxXHUwZTMyXHUwZTJhIDIiLCAiXHUwZTQ0XHUwZTE1XHUwZTIzXHUwZTIxXHUwZTMyXHUwZTJhIDMiLCAiXHUwZTQ0XHUwZTE1XHUwZTIzXHUwZTIxXHUwZTMyXHUwZTJhIDQiXSwgQU1QTVM6WyJcdTBlMDFcdTBlNDhcdTBlMmRcdTBlMTlcdTBlNDBcdTBlMTdcdTBlMzVcdTBlNDhcdTBlMjJcdTBlMDciLCAKIlx1MGUyYlx1MGUyNVx1MGUzMVx1MGUwN1x1MGU0MFx1MGUxN1x1MGUzNVx1MGU0OFx1MGUyMlx1MGUwNyJdLCBEQVRFRk9STUFUUzpbIkVFRUVcdTBlMTdcdTBlMzVcdTBlNDggZCBNTU1NIEcgeSIsICJkIE1NTU0geSIsICJkIE1NTSB5IiwgImQvTS95eXl5Il0sIFRJTUVGT1JNQVRTOlsiSCBcdTBlMTlcdTBlMzJcdTBlMmNcdTBlMzRcdTBlMDFcdTBlMzIgbSBcdTBlMTlcdTBlMzJcdTBlMTdcdTBlMzUgc3MgXHUwZTI3XHUwZTM0XHUwZTE5XHUwZTMyXHUwZTE3XHUwZTM1IHp6enoiLCAiSCBcdTBlMTlcdTBlMzJcdTBlMmNcdTBlMzRcdTBlMDFcdTBlMzIgbSBcdTBlMTlcdTBlMzJcdTBlMTdcdTBlMzUgc3MgXHUwZTI3XHUwZTM0XHUwZTE5XHUwZTMyXHUwZTE3XHUwZTM1IHoiLCAiSDptbTpzcyIsICJIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjYsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWToyfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190bCA9IHtFUkFTOlsiQkMiLCAiQUQiXSwgRVJBTkFNRVM6WyJCQyIsICJBRCJdLCBOQVJST1dNT05USFM6IkUsUCxNLEEsTSxILEgsQSxTLE8sTixEIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJFLFAsTSxBLE0sSCxILEEsUyxPLE4sRCIuc3BsaXQoIiwiKSwgTU9OVEhTOiJFbmVybyxQZWJyZXJvLE1hcnNvLEFicmlsLE1heW8sSHVueW8sSHVseW8sQWdvc3RvLFNldHllbWJyZSxPa3R1YnJlLE5vYnllbWJyZSxEaXN5ZW1icmUiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6IkVuZXJvLFBlYnJlcm8sTWFyc28sQWJyaWwsTWF5byxIdW55byxIdWx5byxBZ29zdG8sU2V0eWVtYnJlLE9rdHVicmUsTm9ieWVtYnJlLERpc3llbWJyZSIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6IkVuZSxQZWIsTWFyLEFicixNYXksSHVuLEh1bCxBZ28sU2V0LE9rdCxOb2IsRGlzIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRNT05USFM6IkVuZSxQZWIsTWFyLEFicixNYXksSHVuLEh1bCxBZ28sU2V0LE9rdCxOb2IsRGlzIi5zcGxpdCgiLCIpLCAKV0VFS0RBWVM6IkxpbmdnbyxMdW5lcyxNYXJ0ZXMsTWl5ZXJrdWxlcyxIdXdlYmVzLEJpeWVybmVzLFNhYmFkbyIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJMaW5nZ28sTHVuZXMsTWFydGVzLE1peWVya3VsZXMsSHV3ZWJlcyxCaXllcm5lcyxTYWJhZG8iLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6IkxpbixMdW4sTWFyLE15ZSxIdXcsQnllLFNhYiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6IkxpbixMdW4sTWFyLE1peSxIdXcsQml5LFNhYiIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IkwsTCxNLE0sSCxCLFMiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiTCxMLE0sTSxILEIsUyIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIlExIiwgIlEyIiwgIlEzIiwgIlE0Il0sIFFVQVJURVJTOlsiaWthLTEgc2FuZ2thcGF0IiwgImlrYS0yIHNhbmdrYXBhdCIsICJpa2EtMyBxdWFydGVyIiwgImlrYS00IG5hIHF1YXJ0ZXIiXSwgCkFNUE1TOlsiQU0iLCAiUE0iXSwgREFURUZPUk1BVFM6WyJFRUVFLCBNTU1NIGRkIHkiLCAiTU1NTSBkLCB5IiwgIk1NTSBkLCB5IiwgIk0vZC95eSJdLCBUSU1FRk9STUFUUzpbIkhIOm1tOnNzIHp6enoiLCAiSEg6bW06c3MgeiIsICJISDptbTpzcyIsICJISDptbSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHIgPSB7RVJBUzpbIk1cdTAwZDYiLCAiTVMiXSwgRVJBTkFNRVM6WyJNaWxhdHRhbiBcdTAwZDZuY2UiLCAiTWlsYXR0YW4gU29ucmEiXSwgTkFSUk9XTU9OVEhTOiJPLFx1MDE1ZSxNLE4sTSxILFQsQSxFLEUsSyxBIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJPLFx1MDE1ZSxNLE4sTSxILFQsQSxFLEUsSyxBIi5zcGxpdCgiLCIpLCBNT05USFM6Ik9jYWssXHUwMTVldWJhdCxNYXJ0LE5pc2FuLE1heVx1MDEzMXMsSGF6aXJhbixUZW1tdXosQVx1MDExZnVzdG9zLEV5bFx1MDBmY2wsRWtpbSxLYXNcdTAxMzFtLEFyYWxcdTAxMzFrIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJPY2FrLFx1MDE1ZXViYXQsTWFydCxOaXNhbixNYXlcdTAxMzFzLEhhemlyYW4sVGVtbXV6LEFcdTAxMWZ1c3RvcyxFeWxcdTAwZmNsLEVraW0sS2FzXHUwMTMxbSxBcmFsXHUwMTMxayIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6Ik9jYSxcdTAxNWV1YixNYXIsTmlzLE1heSxIYXosVGVtLEFcdTAxMWZ1LEV5bCxFa2ksS2FzLEFyYSIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiT2NhLFx1MDE1ZXViLE1hcixOaXMsTWF5LEhheixUZW0sQVx1MDExZnUsRXlsLEVraSxLYXMsQXJhIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiUGF6YXIsUGF6YXJ0ZXNpLFNhbFx1MDEzMSxcdTAwYzdhclx1MDE1ZmFtYmEsUGVyXHUwMTVmZW1iZSxDdW1hLEN1bWFydGVzaSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJQYXphcixQYXphcnRlc2ksU2FsXHUwMTMxLFx1MDBjN2FyXHUwMTVmYW1iYSxQZXJcdTAxNWZlbWJlLEN1bWEsQ3VtYXJ0ZXNpIi5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJQYXosUHp0LFNhbCxcdTAwYzdhcixQZXIsQ3VtLENtdCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6IlBheixQenQsU2FsLFx1MDBjN2FyLFBlcixDdW0sQ210Ii5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiUCxQLFMsXHUwMGM3LFAsQyxDIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6IlAsUCxTLFx1MDBjNyxQLEMsQyIuc3BsaXQoIiwiKSwgClNIT1JUUVVBUlRFUlM6WyJcdTAwYzcxIiwgIlx1MDBjNzIiLCAiXHUwMGM3MyIsICJcdTAwYzc0Il0sIFFVQVJURVJTOlsiMS4gXHUwMGU3ZXlyZWsiLCAiMi4gXHUwMGU3ZXlyZWsiLCAiMy4gXHUwMGU3ZXlyZWsiLCAiNC4gXHUwMGU3ZXlyZWsiXSwgQU1QTVM6WyJBTSIsICJQTSJdLCBEQVRFRk9STUFUUzpbImQgTU1NTSB5IEVFRUUiLCAiZCBNTU1NIHkiLCAiZCBNTU0geSIsICJkZCBNTSB5eXl5Il0sIFRJTUVGT1JNQVRTOlsiSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191ayA9IHtFUkFTOlsiXHUwNDM0XHUwNDNlIFx1MDQzZC5cdTA0MzUuIiwgIlx1MDQzZC5cdTA0MzUuIl0sIEVSQU5BTUVTOlsiXHUwNDM0XHUwNDNlIFx1MDQzZFx1MDQzMFx1MDQ0OFx1MDQzZVx1MDQ1NyBcdTA0MzVcdTA0NDBcdTA0MzgiLCAiXHUwNDNkXHUwNDMwXHUwNDQ4XHUwNDNlXHUwNDU3IFx1MDQzNVx1MDQ0MFx1MDQzOCJdLCBOQVJST1dNT05USFM6Ilx1MDQyMSxcdTA0MWIsXHUwNDExLFx1MDQxYSxcdTA0MjIsXHUwNDI3LFx1MDQxYixcdTA0MjEsXHUwNDEyLFx1MDQxNixcdTA0MWIsXHUwNDEzIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiJcdTA0MjEsXHUwNDFiLFx1MDQxMSxcdTA0MWEsXHUwNDIyLFx1MDQyNyxcdTA0MWIsXHUwNDIxLFx1MDQxMixcdTA0MTYsXHUwNDFiLFx1MDQxMyIuc3BsaXQoIiwiKSwgTU9OVEhTOiJcdTA0NDFcdTA0NTZcdTA0NDdcdTA0M2RcdTA0NGYsXHUwNDNiXHUwNDRlXHUwNDQyXHUwNDNlXHUwNDMzXHUwNDNlLFx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzN1x1MDQzZFx1MDQ0ZixcdTA0M2FcdTA0MzJcdTA0NTZcdTA0NDJcdTA0M2RcdTA0NGYsXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNkXHUwNDRmLFx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzZFx1MDQ0ZixcdTA0M2JcdTA0MzhcdTA0M2ZcdTA0M2RcdTA0NGYsXHUwNDQxXHUwNDM1XHUwNDQwXHUwNDNmXHUwNDNkXHUwNDRmLFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQzZFx1MDQ0ZixcdTA0MzZcdTA0M2VcdTA0MzJcdTA0NDJcdTA0M2RcdTA0NGYsXHUwNDNiXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNlXHUwNDNmXHUwNDMwXHUwNDM0XHUwNDMwLFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNFx1MDQzZFx1MDQ0ZiIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVNT05USFM6Ilx1MDQyMVx1MDQ1Nlx1MDQ0N1x1MDQzNVx1MDQzZFx1MDQ0YyxcdTA0MWJcdTA0NGVcdTA0NDJcdTA0MzhcdTA0MzksXHUwNDExXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3XHUwNDM1XHUwNDNkXHUwNDRjLFx1MDQxYVx1MDQzMlx1MDQ1Nlx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQ0YyxcdTA0MjJcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzVcdTA0M2RcdTA0NGMsXHUwNDI3XHUwNDM1XHUwNDQwXHUwNDMyXHUwNDM1XHUwNDNkXHUwNDRjLFx1MDQxYlx1MDQzOFx1MDQzZlx1MDQzNVx1MDQzZFx1MDQ0YyxcdTA0MjFcdTA0MzVcdTA0NDBcdTA0M2ZcdTA0MzVcdTA0M2RcdTA0NGMsXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQxXHUwNDM1XHUwNDNkXHUwNDRjLFx1MDQxNlx1MDQzZVx1MDQzMlx1MDQ0Mlx1MDQzNVx1MDQzZFx1MDQ0YyxcdTA0MWJcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M2VcdTA0M2ZcdTA0MzBcdTA0MzQsXHUwNDEzXHUwNDQwXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDNkXHUwNDRjIi5zcGxpdCgiLCIpLCAKU0hPUlRNT05USFM6Ilx1MDQ0MVx1MDQ1Nlx1MDQ0Ny4sXHUwNDNiXHUwNDRlXHUwNDQyLixcdTA0MzFcdTA0MzVcdTA0NDAuLFx1MDQzYVx1MDQzMlx1MDQ1Nlx1MDQ0Mi4sXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDMyLixcdTA0NDdcdTA0MzVcdTA0NDBcdTA0MzIuLFx1MDQzYlx1MDQzOFx1MDQzZi4sXHUwNDQxXHUwNDM1XHUwNDQwXHUwNDNmLixcdTA0MzJcdTA0MzVcdTA0NDAuLFx1MDQzNlx1MDQzZVx1MDQzMlx1MDQ0Mi4sXHUwNDNiXHUwNDM4XHUwNDQxXHUwNDQyLixcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzQuIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRNT05USFM6Ilx1MDQyMVx1MDQ1Nlx1MDQ0NyxcdTA0MWJcdTA0NGVcdTA0NDIsXHUwNDExXHUwNDM1XHUwNDQwLFx1MDQxYVx1MDQzMlx1MDQ1NixcdTA0MjJcdTA0NDBcdTA0MzAsXHUwNDI3XHUwNDM1XHUwNDQwLFx1MDQxYlx1MDQzOFx1MDQzZixcdTA0MjFcdTA0MzVcdTA0NDAsXHUwNDEyXHUwNDM1XHUwNDQwLFx1MDQxNlx1MDQzZVx1MDQzMixcdTA0MWJcdTA0MzhcdTA0NDEsXHUwNDEzXHUwNDQwXHUwNDQzIi5zcGxpdCgiLCIpLCAKV0VFS0RBWVM6Ilx1MDQxZFx1MDQzNVx1MDQzNFx1MDQ1Nlx1MDQzYlx1MDQ0ZixcdTA0MWZcdTA0M2VcdTA0M2RcdTA0MzVcdTA0MzRcdTA0NTZcdTA0M2JcdTA0M2VcdTA0M2EsXHUwNDEyXHUwNDU2XHUwNDMyXHUwNDQyXHUwNDNlXHUwNDQwXHUwNDNlXHUwNDNhLFx1MDQyMVx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMCxcdTA0MjdcdTA0MzVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDAsXHUwNDFmXHUwMmJjXHUwNDRmXHUwNDQyXHUwNDNkXHUwNDM4XHUwNDQ2XHUwNDRmLFx1MDQyMVx1MDQ0M1x1MDQzMVx1MDQzZVx1MDQ0Mlx1MDQzMCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJcdTA0MWRcdTA0MzVcdTA0MzRcdTA0NTZcdTA0M2JcdTA0NGYsXHUwNDFmXHUwNDNlXHUwNDNkXHUwNDM1XHUwNDM0XHUwNDU2XHUwNDNiXHUwNDNlXHUwNDNhLFx1MDQxMlx1MDQ1Nlx1MDQzMlx1MDQ0Mlx1MDQzZVx1MDQ0MFx1MDQzZVx1MDQzYSxcdTA0MjFcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzAsXHUwNDI3XHUwNDM1XHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQwLFx1MDQxZlx1MDJiY1x1MDQ0Zlx1MDQ0Mlx1MDQzZFx1MDQzOFx1MDQ0Nlx1MDQ0ZixcdTA0MjFcdTA0NDNcdTA0MzFcdTA0M2VcdTA0NDJcdTA0MzAiLnNwbGl0KCIsIiksIApTSE9SVFdFRUtEQVlTOiJcdTA0MWRcdTA0MzQsXHUwNDFmXHUwNDNkLFx1MDQxMlx1MDQ0MixcdTA0MjFcdTA0NDAsXHUwNDI3XHUwNDQyLFx1MDQxZlx1MDQ0MixcdTA0MjFcdTA0MzEiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJcdTA0MWRcdTA0MzQsXHUwNDFmXHUwNDNkLFx1MDQxMlx1MDQ0MixcdTA0MjFcdTA0NDAsXHUwNDI3XHUwNDQyLFx1MDQxZlx1MDQ0MixcdTA0MjFcdTA0MzEiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJcdTA0MWQsXHUwNDFmLFx1MDQxMixcdTA0MjEsXHUwNDI3LFx1MDQxZixcdTA0MjEiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiXHUwNDFkLFx1MDQxZixcdTA0MTIsXHUwNDIxLFx1MDQyNyxcdTA0MWYsXHUwNDIxIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiSSBcdTA0M2FcdTA0MzIuIiwgIklJIFx1MDQzYVx1MDQzMi4iLCAiSUlJIFx1MDQzYVx1MDQzMi4iLCAiSVYgXHUwNDNhXHUwNDMyLiJdLCAKUVVBUlRFUlM6WyJJIFx1MDQzYVx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzMFx1MDQzYiIsICJJSSBcdTA0M2FcdTA0MzJcdTA0MzBcdTA0NDBcdTA0NDJcdTA0MzBcdTA0M2IiLCAiSUlJIFx1MDQzYVx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzMFx1MDQzYiIsICJJViBcdTA0M2FcdTA0MzJcdTA0MzBcdTA0NDBcdTA0NDJcdTA0MzBcdTA0M2IiXSwgQU1QTVM6WyJcdTA0MzRcdTA0M2YiLCAiXHUwNDNmXHUwNDNmIl0sIERBVEVGT1JNQVRTOlsiRUVFRSwgZCBNTU1NIHkgJ1x1MDQ0MCcuIiwgImQgTU1NTSB5ICdcdTA0NDAnLiIsICJkIE1NTSB5IiwgImRkLk1NLnl5Il0sIFRJTUVGT1JNQVRTOlsiSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjAsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWTozfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191ciA9IHtFUkFTOlsiXHUwNjQyIFx1MDY0NSIsICJcdTA2MzlcdTA2NGFcdTA2MzNcdTA2NDhcdTA2Y2MgXHUwNjMzXHUwNjQ2Il0sIEVSQU5BTUVTOlsiXHUwNjQyXHUwNjI4XHUwNjQ0IFx1MDY0NVx1MDYzM1x1MDY0YVx1MDYyZCIsICJcdTA2MzlcdTA2NGFcdTA2MzNcdTA2NDhcdTA2Y2MgXHUwNjMzXHUwNjQ2Il0sIE5BUlJPV01PTlRIUzoiMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IjEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyIi5zcGxpdCgiLCIpLCBNT05USFM6Ilx1MDYyY1x1MDY0Nlx1MDY0OFx1MDYzMVx1MDZjYyxcdTA2NDFcdTA2MzFcdTA2NDhcdTA2MzFcdTA2Y2MsXHUwNjQ1XHUwNjI3XHUwNjMxIFx1MDY4NixcdTA2MjdcdTA2N2VcdTA2MzFcdTA2NGFcdTA2NDQsXHUwNjQ1XHUwNjI2LFx1MDYyY1x1MDY0OFx1MDY0NixcdTA2MmNcdTA2NDhcdTA2NDRcdTA2MjdcdTA2MjYsXHUwNjI3XHUwNmFmXHUwNjMzXHUwNjJhLFx1MDYzM1x1MDYyYVx1MDY0NVx1MDYyOFx1MDYzMSxcdTA2MjdcdTA2YTlcdTA2MmFcdTA2NDhcdTA2MjhcdTA2MzEsXHUwNjQ2XHUwNjQ4XHUwNjQ1XHUwNjI4XHUwNjMxLFx1MDYyZlx1MDYzM1x1MDY0NVx1MDYyOFx1MDYzMSIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVNT05USFM6Ilx1MDYyY1x1MDY0Nlx1MDY0OFx1MDYzMVx1MDZjYyxcdTA2NDFcdTA2MzFcdTA2NDhcdTA2MzFcdTA2Y2MsXHUwNjQ1XHUwNjI3XHUwNjMxIFx1MDY4NixcdTA2MjdcdTA2N2VcdTA2MzFcdTA2NGFcdTA2NDQsXHUwNjQ1XHUwNjI2LFx1MDYyY1x1MDY0OFx1MDY0NixcdTA2MmNcdTA2NDhcdTA2NDRcdTA2MjdcdTA2MjYsXHUwNjI3XHUwNmFmXHUwNjMzXHUwNjJhLFx1MDYzM1x1MDYyYVx1MDY0NVx1MDYyOFx1MDYzMSxcdTA2MjdcdTA2YTlcdTA2MmFcdTA2NDhcdTA2MjhcdTA2MzEsXHUwNjQ2XHUwNjQ4XHUwNjQ1XHUwNjI4XHUwNjMxLFx1MDYyZlx1MDYzM1x1MDY0NVx1MDYyOFx1MDYzMSIuc3BsaXQoIiwiKSwgU0hPUlRNT05USFM6Ilx1MDYyY1x1MDY0Nlx1MDY0OFx1MDYzMVx1MDZjYyxcdTA2NDFcdTA2MzFcdTA2NDhcdTA2MzFcdTA2Y2MsXHUwNjQ1XHUwNjI3XHUwNjMxIFx1MDY4NixcdTA2MjdcdTA2N2VcdTA2MzFcdTA2NGFcdTA2NDQsXHUwNjQ1XHUwNjI2LFx1MDYyY1x1MDY0OFx1MDY0NixcdTA2MmNcdTA2NDhcdTA2NDRcdTA2MjdcdTA2MjYsXHUwNjI3XHUwNmFmXHUwNjMzXHUwNjJhLFx1MDYzM1x1MDYyYVx1MDY0NVx1MDYyOFx1MDYzMSxcdTA2MjdcdTA2YTlcdTA2MmFcdTA2NDhcdTA2MjhcdTA2MzEsXHUwNjQ2XHUwNjQ4XHUwNjQ1XHUwNjI4XHUwNjMxLFx1MDYyZlx1MDYzM1x1MDY0NVx1MDYyOFx1MDYzMSIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiXHUwNjJjXHUwNjQ2XHUwNjQ4XHUwNjMxXHUwNmNjLFx1MDY0MVx1MDYzMVx1MDY0OFx1MDYzMVx1MDZjYyxcdTA2NDVcdTA2MjdcdTA2MzEgXHUwNjg2LFx1MDYyN1x1MDY3ZVx1MDYzMVx1MDY0YVx1MDY0NCxcdTA2NDVcdTA2MjYsXHUwNjJjXHUwNjQ4XHUwNjQ2LFx1MDYyY1x1MDY0OFx1MDY0NFx1MDYyN1x1MDYyNixcdTA2MjdcdTA2YWZcdTA2MzNcdTA2MmEsXHUwNjMzXHUwNjJhXHUwNjQ1XHUwNjI4XHUwNjMxLFx1MDYyN1x1MDZhOVx1MDYyYVx1MDY0OFx1MDYyOFx1MDYzMSxcdTA2NDZcdTA2NDhcdTA2NDVcdTA2MjhcdTA2MzEsXHUwNjJmXHUwNjMzXHUwNjQ1XHUwNjI4XHUwNjMxIi5zcGxpdCgiLCIpLCBXRUVLREFZUzoiXHUwNjI3XHUwNjJhXHUwNjQ4XHUwNjI3XHUwNjMxLFx1MDY3ZVx1MDY0YVx1MDYzMSxcdTA2NDVcdTA2NDZcdTA2YWZcdTA2NDQsXHUwNjI4XHUwNjJmXHUwNjQ3LFx1MDYyY1x1MDY0NVx1MDYzOVx1MDYzMVx1MDYyN1x1MDYyYSxcdTA2MmNcdTA2NDVcdTA2MzlcdTA2YzEsXHUwNmMxXHUwNjQxXHUwNjJhXHUwNmMxIi5zcGxpdCgiLCIpLCAKU1RBTkRBTE9ORVdFRUtEQVlTOiJcdTA2MjdcdTA2MmFcdTA2NDhcdTA2MjdcdTA2MzEsXHUwNjdlXHUwNjRhXHUwNjMxLFx1MDY0NVx1MDY0Nlx1MDZhZlx1MDY0NCxcdTA2MjhcdTA2MmZcdTA2NDcsXHUwNjJjXHUwNjQ1XHUwNjM5XHUwNjMxXHUwNjI3XHUwNjJhLFx1MDYyY1x1MDY0NVx1MDYzOVx1MDZjMSxcdTA2YzFcdTA2NDFcdTA2MmFcdTA2YzEiLnNwbGl0KCIsIiksIFNIT1JUV0VFS0RBWVM6Ilx1MDYyN1x1MDYyYVx1MDY0OFx1MDYyN1x1MDYzMSxcdTA2N2VcdTA2NGFcdTA2MzEsXHUwNjQ1XHUwNjQ2XHUwNmFmXHUwNjQ0LFx1MDYyOFx1MDYyZlx1MDY0NyxcdTA2MmNcdTA2NDVcdTA2MzlcdTA2MzFcdTA2MjdcdTA2MmEsXHUwNjJjXHUwNjQ1XHUwNjM5XHUwNmMxLFx1MDZjMVx1MDY0MVx1MDYyYVx1MDZjMSIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1MDYyN1x1MDYyYVx1MDY0OFx1MDYyN1x1MDYzMSxcdTA2N2VcdTA2NGFcdTA2MzEsXHUwNjQ1XHUwNjQ2XHUwNmFmXHUwNjQ0LFx1MDYyOFx1MDYyZlx1MDY0NyxcdTA2MmNcdTA2NDVcdTA2MzlcdTA2MzFcdTA2MjdcdTA2MmEsXHUwNjJjXHUwNjQ1XHUwNjM5XHUwNmMxLFx1MDZjMVx1MDY0MVx1MDYyYVx1MDZjMSIuc3BsaXQoIiwiKSwgCk5BUlJPV1dFRUtEQVlTOiIxLDIsMyw0LDUsNiw3Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6IjEsMiwzLDQsNSw2LDciLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyJcdTA2N2VcdTA2YzFcdTA2NDRcdTA2Y2MgXHUwNjMzXHUwNmMxIFx1MDY0NVx1MDYyN1x1MDZjMVx1MDZjYyIsICJcdTA2MmZcdTA2NDhcdTA2MzNcdTA2MzFcdTA2Y2MgXHUwNjMzXHUwNmMxIFx1MDY0NVx1MDYyN1x1MDZjMVx1MDZjYyIsICJcdTA2MmFcdTA2NGFcdTA2MzNcdTA2MzFcdTA2Y2MgXHUwNjMzXHUwNmMxIFx1MDY0NVx1MDYyN1x1MDZjMVx1MDZjYyIsICJcdTA2ODZcdTA2NDhcdTA2MmFcdTA2NDdcdTA2Y2MgXHUwNjMzXHUwNmMxIFx1MDY0NVx1MDYyN1x1MDZjMVx1MDZjYyJdLCBRVUFSVEVSUzpbIlx1MDY3ZVx1MDZjMVx1MDY0NFx1MDZjYyBcdTA2MzNcdTA2YzEgXHUwNjQ1XHUwNjI3XHUwNmMxXHUwNmNjIiwgIlx1MDYyZlx1MDY0OFx1MDYzM1x1MDYzMVx1MDZjYyBcdTA2MzNcdTA2YzEgXHUwNjQ1XHUwNjI3XHUwNmMxXHUwNmNjIiwgCiJcdTA2MmFcdTA2NGFcdTA2MzNcdTA2MzFcdTA2Y2MgXHUwNjMzXHUwNmMxIFx1MDY0NVx1MDYyN1x1MDZjMVx1MDZjYyIsICJcdTA2ODZcdTA2NDhcdTA2MmFcdTA2NDdcdTA2Y2MgXHUwNjMzXHUwNmMxIFx1MDY0NVx1MDYyN1x1MDZjMVx1MDZjYyJdLCBBTVBNUzpbIlx1MDYyZlx1MDY0NiIsICJcdTA2MzFcdTA2MjdcdTA2MmEiXSwgREFURUZPUk1BVFM6WyJFRUVFXHUwNjBkIGRcdTA2MGQgTU1NTSB5IiwgImRcdTA2MGQgTU1NTSB5IiwgImRcdTA2MGQgTU1NIHkiLCAiZC9NL3l5Il0sIFRJTUVGT1JNQVRTOlsiaDptbTpzcyBhIHp6enoiLCAiaDptbTpzcyBhIHoiLCAiaDptbTpzcyBhIiwgImg6bW0gYSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmkgPSB7RVJBUzpbInRyLiBDTiIsICJzYXUgQ04iXSwgRVJBTkFNRVM6WyJ0ci4gQ04iLCAic2F1IENOIl0sIE5BUlJPV01PTlRIUzoiMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IjEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyIi5zcGxpdCgiLCIpLCBNT05USFM6InRoXHUwMGUxbmcgbVx1MWVkOXQsdGhcdTAwZTFuZyBoYWksdGhcdTAwZTFuZyBiYSx0aFx1MDBlMW5nIHRcdTAxYjAsdGhcdTAwZTFuZyBuXHUwMTAzbSx0aFx1MDBlMW5nIHNcdTAwZTF1LHRoXHUwMGUxbmcgYlx1MWVhM3ksdGhcdTAwZTFuZyB0XHUwMGUxbSx0aFx1MDBlMW5nIGNoXHUwMGVkbix0aFx1MDBlMW5nIG1cdTAxYjBcdTFlZGRpLHRoXHUwMGUxbmcgbVx1MDFiMFx1MWVkZGkgbVx1MWVkOXQsdGhcdTAwZTFuZyBtXHUwMWIwXHUxZWRkaSBoYWkiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6InRoXHUwMGUxbmcgbVx1MWVkOXQsdGhcdTAwZTFuZyBoYWksdGhcdTAwZTFuZyBiYSx0aFx1MDBlMW5nIHRcdTAxYjAsdGhcdTAwZTFuZyBuXHUwMTAzbSx0aFx1MDBlMW5nIHNcdTAwZTF1LHRoXHUwMGUxbmcgYlx1MWVhM3ksdGhcdTAwZTFuZyB0XHUwMGUxbSx0aFx1MDBlMW5nIGNoXHUwMGVkbix0aFx1MDBlMW5nIG1cdTAxYjBcdTFlZGRpLHRoXHUwMGUxbmcgbVx1MDFiMFx1MWVkZGkgbVx1MWVkOXQsdGhcdTAwZTFuZyBtXHUwMWIwXHUxZWRkaSBoYWkiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoidGhnIDEsdGhnIDIsdGhnIDMsdGhnIDQsdGhnIDUsdGhnIDYsdGhnIDcsdGhnIDgsdGhnIDksdGhnIDEwLHRoZyAxMSx0aGcgMTIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoidGhnIDEsdGhnIDIsdGhnIDMsdGhnIDQsdGhnIDUsdGhnIDYsdGhnIDcsdGhnIDgsdGhnIDksdGhnIDEwLHRoZyAxMSx0aGcgMTIiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJDaFx1MWVlNyBuaFx1MWVhZHQsVGhcdTFlZTkgaGFpLFRoXHUxZWU5IGJhLFRoXHUxZWU5IHRcdTAxYjAsVGhcdTFlZTkgblx1MDEwM20sVGhcdTFlZTkgc1x1MDBlMXUsVGhcdTFlZTkgYlx1MWVhM3kiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiQ2hcdTFlZTcgbmhcdTFlYWR0LFRoXHUxZWU5IGhhaSxUaFx1MWVlOSBiYSxUaFx1MWVlOSB0XHUwMWIwLFRoXHUxZWU5IG5cdTAxMDNtLFRoXHUxZWU5IHNcdTAwZTF1LFRoXHUxZWU5IGJcdTFlYTN5Ii5zcGxpdCgiLCIpLCBTSE9SVFdFRUtEQVlTOiJDTixUaCAyLFRoIDMsVGggNCxUaCA1LFRoIDYsVGggNyIuc3BsaXQoIiwiKSwgClNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJDTixUaCAyLFRoIDMsVGggNCxUaCA1LFRoIDYsVGggNyIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6IkNOLFQyLFQzLFQ0LFQ1LFQ2LFQ3Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6IkNOLFQyLFQzLFQ0LFQ1LFQ2LFQ3Ii5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiUTEiLCAiUTIiLCAiUTMiLCAiUTQiXSwgUVVBUlRFUlM6WyJRdVx1MDBmZCAxIiwgIlF1XHUwMGZkIDIiLCAiUXVcdTAwZmQgMyIsICJRdVx1MDBmZCA0Il0sIEFNUE1TOlsiU0EiLCAiQ0giXSwgREFURUZPUk1BVFM6WyJFRUVFLCAnbmdcdTAwZTB5JyBkZCBNTU1NICduXHUwMTAzbScgeSIsICInTmdcdTAwZTB5JyBkZCAndGhcdTAwZTFuZycgTSAnblx1MDEwM20nIHkiLCAiZGQtTU0teXl5eSIsICJkZC9NTS95eXl5Il0sIFRJTUVGT1JNQVRTOlsiSEg6bW06c3Mgenp6eiIsICJISDptbTpzcyB6IiwgIkhIOm1tOnNzIiwgIkhIOm1tIl0sIApGSVJTVERBWU9GV0VFSzowLCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6M307Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemggPSB7RVJBUzpbIlx1NTE2Y1x1NTE0M1x1NTI0ZCIsICJcdTUxNmNcdTUxNDMiXSwgRVJBTkFNRVM6WyJcdTUxNmNcdTUxNDNcdTUyNGQiLCAiXHU1MTZjXHU1MTQzIl0sIE5BUlJPV01PTlRIUzoiMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dNT05USFM6IjFcdTY3MDgsMlx1NjcwOCwzXHU2NzA4LDRcdTY3MDgsNVx1NjcwOCw2XHU2NzA4LDdcdTY3MDgsOFx1NjcwOCw5XHU2NzA4LDEwXHU2NzA4LDExXHU2NzA4LDEyXHU2NzA4Ii5zcGxpdCgiLCIpLCBNT05USFM6IjFcdTY3MDgsMlx1NjcwOCwzXHU2NzA4LDRcdTY3MDgsNVx1NjcwOCw2XHU2NzA4LDdcdTY3MDgsOFx1NjcwOCw5XHU2NzA4LDEwXHU2NzA4LDExXHU2NzA4LDEyXHU2NzA4Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FTU9OVEhTOiJcdTRlMDBcdTY3MDgsXHU0ZThjXHU2NzA4LFx1NGUwOVx1NjcwOCxcdTU2ZGJcdTY3MDgsXHU0ZTk0XHU2NzA4LFx1NTE2ZFx1NjcwOCxcdTRlMDNcdTY3MDgsXHU1MTZiXHU2NzA4LFx1NGU1ZFx1NjcwOCxcdTUzNDFcdTY3MDgsXHU1MzQxXHU0ZTAwXHU2NzA4LFx1NTM0MVx1NGU4Y1x1NjcwOCIuc3BsaXQoIiwiKSwgClNIT1JUTU9OVEhTOiIxXHU2NzA4LDJcdTY3MDgsM1x1NjcwOCw0XHU2NzA4LDVcdTY3MDgsNlx1NjcwOCw3XHU2NzA4LDhcdTY3MDgsOVx1NjcwOCwxMFx1NjcwOCwxMVx1NjcwOCwxMlx1NjcwOCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUTU9OVEhTOiJcdTRlMDBcdTY3MDgsXHU0ZThjXHU2NzA4LFx1NGUwOVx1NjcwOCxcdTU2ZGJcdTY3MDgsXHU0ZTk0XHU2NzA4LFx1NTE2ZFx1NjcwOCxcdTRlMDNcdTY3MDgsXHU1MTZiXHU2NzA4LFx1NGU1ZFx1NjcwOCxcdTUzNDFcdTY3MDgsXHU1MzQxXHU0ZTAwXHU2NzA4LFx1NTM0MVx1NGU4Y1x1NjcwOCIuc3BsaXQoIiwiKSwgV0VFS0RBWVM6Ilx1NjYxZlx1NjcxZlx1NjVlNSxcdTY2MWZcdTY3MWZcdTRlMDAsXHU2NjFmXHU2NzFmXHU0ZThjLFx1NjYxZlx1NjcxZlx1NGUwOSxcdTY2MWZcdTY3MWZcdTU2ZGIsXHU2NjFmXHU2NzFmXHU0ZTk0LFx1NjYxZlx1NjcxZlx1NTE2ZCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVdFRUtEQVlTOiJcdTY2MWZcdTY3MWZcdTY1ZTUsXHU2NjFmXHU2NzFmXHU0ZTAwLFx1NjYxZlx1NjcxZlx1NGU4YyxcdTY2MWZcdTY3MWZcdTRlMDksXHU2NjFmXHU2NzFmXHU1NmRiLFx1NjYxZlx1NjcxZlx1NGU5NCxcdTY2MWZcdTY3MWZcdTUxNmQiLnNwbGl0KCIsIiksIApTSE9SVFdFRUtEQVlTOiJcdTU0NjhcdTY1ZTUsXHU1NDY4XHU0ZTAwLFx1NTQ2OFx1NGU4YyxcdTU0NjhcdTRlMDksXHU1NDY4XHU1NmRiLFx1NTQ2OFx1NGU5NCxcdTU0NjhcdTUxNmQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVFdFRUtEQVlTOiJcdTU0NjhcdTY1ZTUsXHU1NDY4XHU0ZTAwLFx1NTQ2OFx1NGU4YyxcdTU0NjhcdTRlMDksXHU1NDY4XHU1NmRiLFx1NTQ2OFx1NGU5NCxcdTU0NjhcdTUxNmQiLnNwbGl0KCIsIiksIE5BUlJPV1dFRUtEQVlTOiJcdTY1ZTUsXHU0ZTAwLFx1NGU4YyxcdTRlMDksXHU1NmRiLFx1NGU5NCxcdTUxNmQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVOQVJST1dXRUVLREFZUzoiXHU2NWU1LFx1NGUwMCxcdTRlOGMsXHU0ZTA5LFx1NTZkYixcdTRlOTQsXHU1MTZkIi5zcGxpdCgiLCIpLCBTSE9SVFFVQVJURVJTOlsiMVx1NWI2MyIsICIyXHU1YjYzIiwgIjNcdTViNjMiLCAiNFx1NWI2MyJdLCBRVUFSVEVSUzpbIlx1N2IyYzFcdTViNjNcdTVlYTYiLCAKIlx1N2IyYzJcdTViNjNcdTVlYTYiLCAiXHU3YjJjM1x1NWI2M1x1NWVhNiIsICJcdTdiMmM0XHU1YjYzXHU1ZWE2Il0sIEFNUE1TOlsiXHU0ZTBhXHU1MzQ4IiwgIlx1NGUwYlx1NTM0OCJdLCBEQVRFRk9STUFUUzpbInlcdTVlNzRNXHU2NzA4ZFx1NjVlNUVFRUUiLCAieVx1NWU3NE1cdTY3MDhkXHU2NWU1IiwgInl5eXktTS1kIiwgInl5LU0tZCJdLCBUSU1FRk9STUFUUzpbInp6enphaFx1NjVmNm1tXHU1MjA2c3NcdTc5ZDIiLCAiemFoXHU2NWY2bW1cdTUyMDZzc1x1NzlkMiIsICJhaDptbTpzcyIsICJhaDptbSJdLCBGSVJTVERBWU9GV0VFSzo2LCBXRUVLRU5EUkFOR0U6WzUsIDZdLCBGSVJTVFdFRUtDVVRPRkZEQVk6Mn07Cmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfQ04gPSBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poOwpnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hLID0ge0VSQVM6WyJcdTg5N2ZcdTUxNDNcdTUyNGQiLCAiXHU4OTdmXHU1MTQzIl0sIEVSQU5BTUVTOlsiXHU4OTdmXHU1MTQzXHU1MjRkIiwgIlx1ODk3Zlx1NTE0MyJdLCBOQVJST1dNT05USFM6IjEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XTU9OVEhTOiIxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiIuc3BsaXQoIiwiKSwgTU9OVEhTOiIxXHU2NzA4LDJcdTY3MDgsM1x1NjcwOCw0XHU2NzA4LDVcdTY3MDgsNlx1NjcwOCw3XHU2NzA4LDhcdTY3MDgsOVx1NjcwOCwxMFx1NjcwOCwxMVx1NjcwOCwxMlx1NjcwOCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU1PTlRIUzoiXHU0ZTAwXHU2NzA4LFx1NGU4Y1x1NjcwOCxcdTRlMDlcdTY3MDgsXHU1NmRiXHU2NzA4LFx1NGU5NFx1NjcwOCxcdTUxNmRcdTY3MDgsXHU0ZTAzXHU2NzA4LFx1NTE2Ylx1NjcwOCxcdTRlNWRcdTY3MDgsXHU1MzQxXHU2NzA4LFx1NTM0MVx1NGUwMFx1NjcwOCxcdTUzNDFcdTRlOGNcdTY3MDgiLnNwbGl0KCIsIiksIApTSE9SVE1PTlRIUzoiMVx1NjcwOCwyXHU2NzA4LDNcdTY3MDgsNFx1NjcwOCw1XHU2NzA4LDZcdTY3MDgsN1x1NjcwOCw4XHU2NzA4LDlcdTY3MDgsMTBcdTY3MDgsMTFcdTY3MDgsMTJcdTY3MDgiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVTSE9SVE1PTlRIUzoiMVx1NjcwOCwyXHU2NzA4LDNcdTY3MDgsNFx1NjcwOCw1XHU2NzA4LDZcdTY3MDgsN1x1NjcwOCw4XHU2NzA4LDlcdTY3MDgsMTBcdTY3MDgsMTFcdTY3MDgsMTJcdTY3MDgiLnNwbGl0KCIsIiksIFdFRUtEQVlTOiJcdTY2MWZcdTY3MWZcdTY1ZTUsXHU2NjFmXHU2NzFmXHU0ZTAwLFx1NjYxZlx1NjcxZlx1NGU4YyxcdTY2MWZcdTY3MWZcdTRlMDksXHU2NjFmXHU2NzFmXHU1NmRiLFx1NjYxZlx1NjcxZlx1NGU5NCxcdTY2MWZcdTY3MWZcdTUxNmQiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVXRUVLREFZUzoiXHU2NjFmXHU2NzFmXHU2NWU1LFx1NjYxZlx1NjcxZlx1NGUwMCxcdTY2MWZcdTY3MWZcdTRlOGMsXHU2NjFmXHU2NzFmXHU0ZTA5LFx1NjYxZlx1NjcxZlx1NTZkYixcdTY2MWZcdTY3MWZcdTRlOTQsXHU2NjFmXHU2NzFmXHU1MTZkIi5zcGxpdCgiLCIpLCAKU0hPUlRXRUVLREFZUzoiXHU5MDMxXHU2NWU1LFx1OTAzMVx1NGUwMCxcdTkwMzFcdTRlOGMsXHU5MDMxXHU0ZTA5LFx1OTAzMVx1NTZkYixcdTkwMzFcdTRlOTQsXHU5MDMxXHU1MTZkIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRXRUVLREFZUzoiXHU1NDY4XHU2NWU1LFx1NTQ2OFx1NGUwMCxcdTU0NjhcdTRlOGMsXHU1NDY4XHU0ZTA5LFx1NTQ2OFx1NTZkYixcdTU0NjhcdTRlOTQsXHU1NDY4XHU1MTZkIi5zcGxpdCgiLCIpLCBOQVJST1dXRUVLREFZUzoiXHU2NWU1LFx1NGUwMCxcdTRlOGMsXHU0ZTA5LFx1NTZkYixcdTRlOTQsXHU1MTZkIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FTkFSUk9XV0VFS0RBWVM6Ilx1NjVlNSxcdTRlMDAsXHU0ZThjLFx1NGUwOSxcdTU2ZGIsXHU0ZTk0LFx1NTE2ZCIuc3BsaXQoIiwiKSwgU0hPUlRRVUFSVEVSUzpbIjFcdTViNjMiLCAiMlx1NWI2MyIsICIzXHU1YjYzIiwgIjRcdTViNjMiXSwgUVVBUlRFUlM6WyJcdTdiMmMxXHU1YjYzIiwgCiJcdTdiMmMyXHU1YjYzIiwgIlx1N2IyYzNcdTViNjMiLCAiXHU3YjJjNFx1NWI2MyJdLCBBTVBNUzpbIlx1NGUwYVx1NTM0OCIsICJcdTRlMGJcdTUzNDgiXSwgREFURUZPUk1BVFM6WyJ5XHU1ZTc0TVx1NjcwOGRcdTY1ZTVFRUVFIiwgInlcdTVlNzRNXHU2NzA4ZFx1NjVlNSIsICJ5XHU1ZTc0TVx1NjcwOGRcdTY1ZTUiLCAieXlcdTVlNzRNXHU2NzA4ZFx1NjVlNSJdLCBUSU1FRk9STUFUUzpbImFoOm1tOnNzIFt6enp6XSIsICJhaDptbTpzcyBbel0iLCAiYWhoOm1tOnNzIiwgImFoOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjYsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWToyfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9UVyA9IHtFUkFTOlsiXHU4OTdmXHU1MTQzXHU1MjRkIiwgIlx1ODk3Zlx1NTE0MyJdLCBFUkFOQU1FUzpbIlx1ODk3Zlx1NTE0M1x1NTI0ZCIsICJcdTg5N2ZcdTUxNDMiXSwgTkFSUk9XTU9OVEhTOiIxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV01PTlRIUzoiMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIiLnNwbGl0KCIsIiksIE1PTlRIUzoiMVx1NjcwOCwyXHU2NzA4LDNcdTY3MDgsNFx1NjcwOCw1XHU2NzA4LDZcdTY3MDgsN1x1NjcwOCw4XHU2NzA4LDlcdTY3MDgsMTBcdTY3MDgsMTFcdTY3MDgsMTJcdTY3MDgiLnNwbGl0KCIsIiksIFNUQU5EQUxPTkVNT05USFM6Ilx1NGUwMFx1NjcwOCxcdTRlOGNcdTY3MDgsXHU0ZTA5XHU2NzA4LFx1NTZkYlx1NjcwOCxcdTRlOTRcdTY3MDgsXHU1MTZkXHU2NzA4LFx1NGUwM1x1NjcwOCxcdTUxNmJcdTY3MDgsXHU0ZTVkXHU2NzA4LFx1NTM0MVx1NjcwOCxcdTUzNDFcdTRlMDBcdTY3MDgsXHU1MzQxXHU0ZThjXHU2NzA4Ii5zcGxpdCgiLCIpLCAKU0hPUlRNT05USFM6IjFcdTY3MDgsMlx1NjcwOCwzXHU2NzA4LDRcdTY3MDgsNVx1NjcwOCw2XHU2NzA4LDdcdTY3MDgsOFx1NjcwOCw5XHU2NzA4LDEwXHU2NzA4LDExXHU2NzA4LDEyXHU2NzA4Ii5zcGxpdCgiLCIpLCBTVEFOREFMT05FU0hPUlRNT05USFM6IjFcdTY3MDgsMlx1NjcwOCwzXHU2NzA4LDRcdTY3MDgsNVx1NjcwOCw2XHU2NzA4LDdcdTY3MDgsOFx1NjcwOCw5XHU2NzA4LDEwXHU2NzA4LDExXHU2NzA4LDEyXHU2NzA4Ii5zcGxpdCgiLCIpLCBXRUVLREFZUzoiXHU2NjFmXHU2NzFmXHU2NWU1LFx1NjYxZlx1NjcxZlx1NGUwMCxcdTY2MWZcdTY3MWZcdTRlOGMsXHU2NjFmXHU2NzFmXHU0ZTA5LFx1NjYxZlx1NjcxZlx1NTZkYixcdTY2MWZcdTY3MWZcdTRlOTQsXHU2NjFmXHU2NzFmXHU1MTZkIi5zcGxpdCgiLCIpLCBTVEFOREFMT05FV0VFS0RBWVM6Ilx1NjYxZlx1NjcxZlx1NjVlNSxcdTY2MWZcdTY3MWZcdTRlMDAsXHU2NjFmXHU2NzFmXHU0ZThjLFx1NjYxZlx1NjcxZlx1NGUwOSxcdTY2MWZcdTY3MWZcdTU2ZGIsXHU2NjFmXHU2NzFmXHU0ZTk0LFx1NjYxZlx1NjcxZlx1NTE2ZCIuc3BsaXQoIiwiKSwgClNIT1JUV0VFS0RBWVM6Ilx1OTAzMVx1NjVlNSxcdTkwMzFcdTRlMDAsXHU5MDMxXHU0ZThjLFx1OTAzMVx1NGUwOSxcdTkwMzFcdTU2ZGIsXHU5MDMxXHU0ZTk0LFx1OTAzMVx1NTE2ZCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVM6Ilx1NTQ2OFx1NjVlNSxcdTU0NjhcdTRlMDAsXHU1NDY4XHU0ZThjLFx1NTQ2OFx1NGUwOSxcdTU0NjhcdTU2ZGIsXHU1NDY4XHU0ZTk0LFx1NTQ2OFx1NTE2ZCIuc3BsaXQoIiwiKSwgTkFSUk9XV0VFS0RBWVM6Ilx1NjVlNSxcdTRlMDAsXHU0ZThjLFx1NGUwOSxcdTU2ZGIsXHU0ZTk0LFx1NTE2ZCIuc3BsaXQoIiwiKSwgU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTOiJcdTY1ZTUsXHU0ZTAwLFx1NGU4YyxcdTRlMDksXHU1NmRiLFx1NGU5NCxcdTUxNmQiLnNwbGl0KCIsIiksIFNIT1JUUVVBUlRFUlM6WyIxXHU1YjYzIiwgIjJcdTViNjMiLCAiM1x1NWI2MyIsICI0XHU1YjYzIl0sIFFVQVJURVJTOlsiXHU3YjJjMVx1NWI2MyIsIAoiXHU3YjJjMlx1NWI2MyIsICJcdTdiMmMzXHU1YjYzIiwgIlx1N2IyYzRcdTViNjMiXSwgQU1QTVM6WyJcdTRlMGFcdTUzNDgiLCAiXHU0ZTBiXHU1MzQ4Il0sIERBVEVGT1JNQVRTOlsieVx1NWU3NE1cdTY3MDhkXHU2NWU1RUVFRSIsICJ5XHU1ZTc0TVx1NjcwOGRcdTY1ZTUiLCAieXl5eS9NL2QiLCAieXkvTS9kIl0sIFRJTUVGT1JNQVRTOlsienp6emFoXHU2NjQybW1cdTUyMDZzc1x1NzlkMiIsICJ6YWhcdTY2NDJtbVx1NTIwNnNzXHU3OWQyIiwgImFoOm1tOnNzIiwgImFoOm1tIl0sIEZJUlNUREFZT0ZXRUVLOjYsIFdFRUtFTkRSQU5HRTpbNSwgNl0sIEZJUlNUV0VFS0NVVE9GRkRBWToyfTsKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyA9ICJhbSIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FtIDogImFyIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXIgOiAiYmciID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19iZyA6ICJibiIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuIDogImNhIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2EgOiAiY3MiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jcyA6ICJkYSIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhIDogImRlIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUgOiAiZGVfQVQiID09IGdvb2cuTE9DQUxFIHx8ICJkZS1BVCIgPT0gZ29vZy5MT0NBTEUgPyAKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9BVCA6ICJkZV9DSCIgPT0gZ29vZy5MT0NBTEUgfHwgImRlLUNIIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUgOiAiZWwiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbCA6ICJlbiIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuIDogImVuX0FVIiA9PSBnb29nLkxPQ0FMRSB8fCAiZW4tQVUiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BVSA6ICJlbl9HQiIgPT0gZ29vZy5MT0NBTEUgfHwgImVuLUdCIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0IgOiAiZW5fSUUiID09IGdvb2cuTE9DQUxFIHx8ICJlbi1JRSIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lFIDogImVuX0lOIiA9PSBnb29nLkxPQ0FMRSB8fCAKImVuLUlOIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU4gOiAiZW5fU0ciID09IGdvb2cuTE9DQUxFIHx8ICJlbi1TRyIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NHIDogImVuX1VTIiA9PSBnb29nLkxPQ0FMRSB8fCAiZW4tVVMiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbiA6ICJlbl9aQSIgPT0gZ29vZy5MT0NBTEUgfHwgImVuLVpBIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWkEgOiAiZXMiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lcyA6ICJlc180MTkiID09IGdvb2cuTE9DQUxFIHx8ICJlcy00MTkiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lcyA6ICJldCIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0IDogCiJldSIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V1IDogImZhIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmEgOiAiZmkiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19maSA6ICJmaWwiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19maWwgOiAiZnIiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mciA6ICJmcl9DQSIgPT0gZ29vZy5MT0NBTEUgfHwgImZyLUNBIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0EgOiAiZ2wiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nbCA6ICJnc3ciID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3cgOiAiZ3UiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndSA6IAoiaGUiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oZSA6ICJoaSIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hpIDogImhyIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHIgOiAiaHUiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19odSA6ICJpZCIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lkIDogImluIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaW4gOiAiaXMiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pcyA6ICJpdCIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l0IDogIml3IiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXcgOiAiamEiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYSA6IAoia24iID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbiA6ICJrbyIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvIDogImxuIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbG4gOiAibHQiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdCA6ICJsdiIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2x2IDogIm1sIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWwgOiAibXIiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tciA6ICJtcyIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21zIDogIm10IiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXQgOiAibmwiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubCA6IAoibm8iID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubyA6ICJvciIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29yIDogInBsIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGwgOiAicHQiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdCA6ICJwdF9CUiIgPT0gZ29vZy5MT0NBTEUgfHwgInB0LUJSIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHQgOiAicHRfUFQiID09IGdvb2cuTE9DQUxFIHx8ICJwdC1QVCIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1BUIDogInJvIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm8gOiAicnUiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydSA6ICJzayIgPT0gZ29vZy5MT0NBTEUgPyAKZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zayA6ICJzbCIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NsIDogInNxIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3EgOiAic3IiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zciA6ICJzdiIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N2IDogInN3IiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3cgOiAidGEiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190YSA6ICJ0ZSIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RlIDogInRoIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGggOiAidGwiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190bCA6IAoidHIiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ciA6ICJ1ayIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VrIDogInVyIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXIgOiAidmkiID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192aSA6ICJ6aCIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poIDogInpoX0NOIiA9PSBnb29nLkxPQ0FMRSB8fCAiemgtQ04iID09IGdvb2cuTE9DQUxFID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCA6ICJ6aF9ISyIgPT0gZ29vZy5MT0NBTEUgfHwgInpoLUhLIiA9PSBnb29nLkxPQ0FMRSA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSEsgOiAiemhfVFciID09IGdvb2cuTE9DQUxFIHx8ICJ6aC1UVyIgPT0gZ29vZy5MT0NBTEUgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX1RXIDogCmdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW47Cmdvb2cuZGF0ZSA9IHt9Owpnb29nLmRhdGUud2Vla0RheSA9IHtNT046MCwgVFVFOjEsIFdFRDoyLCBUSFU6MywgRlJJOjQsIFNBVDo1LCBTVU46Nn07Cmdvb2cuZGF0ZS5tb250aCA9IHtKQU46MCwgRkVCOjEsIE1BUjoyLCBBUFI6MywgTUFZOjQsIEpVTjo1LCBKVUw6NiwgQVVHOjcsIFNFUDo4LCBPQ1Q6OSwgTk9WOjEwLCBERUM6MTF9Owpnb29nLmRhdGUuZm9ybWF0TW9udGhBbmRZZWFyID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSRmb3JtYXRNb250aEFuZFllYXIkKG1vbnRoTmFtZSwgeWVhck51bSkgewogIHZhciBNU0dfTU9OVEhfQU5EX1lFQVIgPSBtb250aE5hbWUgKyAoIiAiICsgeWVhck51bSk7CiAgcmV0dXJuIE1TR19NT05USF9BTkRfWUVBUgp9Owpnb29nLmRhdGUuc3BsaXREYXRlU3RyaW5nUmVnZXhfID0gL14oXGR7NH0pKD86KD86LT8oXGR7Mn0pKD86LT8oXGR7Mn0pKT8pfCg/Oi0/KFxkezN9KSl8KD86LT9XKFxkezJ9KSg/Oi0/KFsxLTddKSk/KSk/JC87Cmdvb2cuZGF0ZS5zcGxpdFRpbWVTdHJpbmdSZWdleF8gPSAvXihcZHsyfSkoPzo6PyhcZHsyfSkoPzo6PyhcZHsyfSkoXC5cZCspPyk/KT8kLzsKZ29vZy5kYXRlLnNwbGl0VGltZXpvbmVTdHJpbmdSZWdleF8gPSAvWnwoPzooWy0rXSkoXGR7Mn0pKD86Oj8oXGR7Mn0pKT8pJC87Cmdvb2cuZGF0ZS5zcGxpdER1cmF0aW9uUmVnZXhfID0gL14oLSk/UCg/OihcZCspWSk/KD86KFxkKylNKT8oPzooXGQrKUQpPyhUKD86KFxkKylIKT8oPzooXGQrKU0pPyg/OihcZCsoPzpcLlxkKyk/KVMpPyk/JC87Cmdvb2cuZGF0ZS5pc0xlYXBZZWFyID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSRpc0xlYXBZZWFyJCh5ZWFyKSB7CiAgcmV0dXJuIDAgPT0geWVhciAlIDQgJiYgKDAgIT0geWVhciAlIDEwMCB8fCAwID09IHllYXIgJSA0MDApCn07Cmdvb2cuZGF0ZS5pc0xvbmdJc29ZZWFyID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSRpc0xvbmdJc29ZZWFyJCh5ZWFyKSB7CiAgdmFyIG4gPSA1ICogeWVhciArIDEyIC0gNCAqIChNYXRoLmZsb29yKHllYXIgLyAxMDApIC0gTWF0aC5mbG9vcih5ZWFyIC8gNDAwKSksIG4gPSBuICsgKE1hdGguZmxvb3IoKHllYXIgLSAxMDApIC8gNDAwKSAtIE1hdGguZmxvb3IoKHllYXIgLSAxMDIpIC8gNDAwKSksIG4gPSBuICsgKE1hdGguZmxvb3IoKHllYXIgLSAyMDApIC8gNDAwKSAtIE1hdGguZmxvb3IoKHllYXIgLSAxOTkpIC8gNDAwKSk7CiAgcmV0dXJuIDUgPiBuICUgMjgKfTsKZ29vZy5kYXRlLmdldE51bWJlck9mRGF5c0luTW9udGggPSBmdW5jdGlvbiAkZ29vZyRkYXRlJGdldE51bWJlck9mRGF5c0luTW9udGgkKHllYXIsIG1vbnRoKSB7CiAgc3dpdGNoKG1vbnRoKSB7CiAgICBjYXNlIGdvb2cuZGF0ZS5tb250aC5GRUI6CiAgICAgIHJldHVybiBnb29nLmRhdGUuaXNMZWFwWWVhcih5ZWFyKSA/IDI5IDogMjg7CiAgICBjYXNlIGdvb2cuZGF0ZS5tb250aC5KVU46CiAgICA7CiAgICBjYXNlIGdvb2cuZGF0ZS5tb250aC5TRVA6CiAgICA7CiAgICBjYXNlIGdvb2cuZGF0ZS5tb250aC5OT1Y6CiAgICA7CiAgICBjYXNlIGdvb2cuZGF0ZS5tb250aC5BUFI6CiAgICAgIHJldHVybiAzMAogIH0KICByZXR1cm4gMzEKfTsKZ29vZy5kYXRlLmlzU2FtZURheSA9IGZ1bmN0aW9uICRnb29nJGRhdGUkaXNTYW1lRGF5JChkYXRlLCBvcHRfbm93KSB7CiAgdmFyIG5vdyA9IG9wdF9ub3cgfHwgbmV3IERhdGU7CiAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpID09IG5vdy5nZXREYXRlKCkgJiYgZ29vZy5kYXRlLmlzU2FtZU1vbnRoKGRhdGUsIG5vdykKfTsKZ29vZy5kYXRlLmlzU2FtZU1vbnRoID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSRpc1NhbWVNb250aCQoZGF0ZSwgb3B0X25vdykgewogIHZhciBub3cgPSBvcHRfbm93IHx8IG5ldyBEYXRlOwogIHJldHVybiBkYXRlLmdldE1vbnRoKCkgPT0gbm93LmdldE1vbnRoKCkgJiYgZ29vZy5kYXRlLmlzU2FtZVllYXIoZGF0ZSwgbm93KQp9Owpnb29nLmRhdGUuaXNTYW1lWWVhciA9IGZ1bmN0aW9uICRnb29nJGRhdGUkaXNTYW1lWWVhciQoZGF0ZSwgb3B0X25vdykgewogIHZhciBub3cgPSBvcHRfbm93IHx8IG5ldyBEYXRlOwogIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgPT0gbm93LmdldEZ1bGxZZWFyKCkKfTsKZ29vZy5kYXRlLmdldFdlZWtOdW1iZXIgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJGdldFdlZWtOdW1iZXIkKHllYXIsIG1vbnRoLCBkYXRlLCBvcHRfd2Vla0RheSwgb3B0X2ZpcnN0RGF5T2ZXZWVrKSB7CiAgdmFyIGQgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSksIGN1dG9mZiA9IG9wdF93ZWVrRGF5IHx8IGdvb2cuZGF0ZS53ZWVrRGF5LlRIVSwgZmlyc3RkYXkgPSBvcHRfZmlyc3REYXlPZldlZWsgfHwgZ29vZy5kYXRlLndlZWtEYXkuTU9OLCBpc29kYXkgPSAoZC5nZXREYXkoKSArIDYpICUgNywgZGF5cG9zID0gKGlzb2RheSAtIGZpcnN0ZGF5ICsgNykgJSA3LCBjdXRvZmZwb3MgPSAoY3V0b2ZmIC0gZmlyc3RkYXkgKyA3KSAlIDcsIGN1dG9mZlNhbWVXZWVrID0gZC52YWx1ZU9mKCkgKyA4NjRFNSAqIChjdXRvZmZwb3MgLSBkYXlwb3MpLCBqYW4xID0gKG5ldyBEYXRlKChuZXcgRGF0ZShjdXRvZmZTYW1lV2VlaykpLmdldEZ1bGxZZWFyKCksIDAsIDEpKS52YWx1ZU9mKCk7CiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yb3VuZCgoY3V0b2ZmU2FtZVdlZWsgLSBqYW4xKSAvIDg2NEU1KSAvIDcpICsgMQp9Owpnb29nLmRhdGUuZnJvbUlzb1N0cmluZyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkZnJvbUlzb1N0cmluZyQoZm9ybWF0dGVkKSB7CiAgdmFyIHJldCA9IG5ldyBnb29nLmRhdGUuRGF0ZVRpbWUoMkUzKTsKICByZXR1cm4gZ29vZy5kYXRlLnNldElzbzg2MDFEYXRlVGltZShyZXQsIGZvcm1hdHRlZCkgPyByZXQgOiBudWxsCn07Cmdvb2cuZGF0ZS5zZXRJc284NjAxRGF0ZVRpbWUgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJHNldElzbzg2MDFEYXRlVGltZSQoZGF0ZVRpbWUsIGZvcm1hdHRlZCkgewogIHZhciBmb3JtYXR0ZWQgPSBnb29nLnN0cmluZy50cmltKGZvcm1hdHRlZCksIGRlbGltID0gLTEgPT0gZm9ybWF0dGVkLmluZGV4T2YoIlQiKSA/ICIgIiA6ICJUIiwgcGFydHMgPSBmb3JtYXR0ZWQuc3BsaXQoZGVsaW0pOwogIHJldHVybiBnb29nLmRhdGUuc2V0SXNvODYwMURhdGVPbmx5XyhkYXRlVGltZSwgcGFydHNbMF0pICYmICgyID4gcGFydHMubGVuZ3RoIHx8IGdvb2cuZGF0ZS5zZXRJc284NjAxVGltZU9ubHlfKGRhdGVUaW1lLCBwYXJ0c1sxXSkpCn07Cmdvb2cuZGF0ZS5zZXRJc284NjAxRGF0ZU9ubHlfID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSRzZXRJc284NjAxRGF0ZU9ubHlfJChkLCBmb3JtYXR0ZWQpIHsKICB2YXIgcGFydHMgPSBmb3JtYXR0ZWQubWF0Y2goZ29vZy5kYXRlLnNwbGl0RGF0ZVN0cmluZ1JlZ2V4Xyk7CiAgaWYoIXBhcnRzKSB7CiAgICByZXR1cm4hMQogIH0KICB2YXIgeWVhciA9IE51bWJlcihwYXJ0c1sxXSksIG1vbnRoID0gTnVtYmVyKHBhcnRzWzJdKSwgZGF0ZSA9IE51bWJlcihwYXJ0c1szXSksIGRheU9mWWVhciA9IE51bWJlcihwYXJ0c1s0XSksIHdlZWsgPSBOdW1iZXIocGFydHNbNV0pLCBkYXlPZldlZWsgPSBOdW1iZXIocGFydHNbNl0pIHx8IDE7CiAgZC5zZXRGdWxsWWVhcih5ZWFyKTsKICBpZihkYXlPZlllYXIpIHsKICAgIGQuc2V0RGF0ZSgxKTsKICAgIGQuc2V0TW9udGgoMCk7CiAgICB2YXIgb2Zmc2V0ID0gZGF5T2ZZZWFyIC0gMTsKICAgIGQuYWRkKG5ldyBnb29nLmRhdGUuSW50ZXJ2YWwoZ29vZy5kYXRlLkludGVydmFsLkRBWVMsIG9mZnNldCkpCiAgfWVsc2UgewogICAgd2VlayA/IGdvb2cuZGF0ZS5zZXREYXRlRnJvbUlzbzg2MDFXZWVrXyhkLCB3ZWVrLCBkYXlPZldlZWspIDogKG1vbnRoICYmIChkLnNldERhdGUoMSksIGQuc2V0TW9udGgobW9udGggLSAxKSksIGRhdGUgJiYgZC5zZXREYXRlKGRhdGUpKQogIH0KICByZXR1cm4hMAp9Owpnb29nLmRhdGUuc2V0RGF0ZUZyb21Jc284NjAxV2Vla18gPSBmdW5jdGlvbiAkZ29vZyRkYXRlJHNldERhdGVGcm9tSXNvODYwMVdlZWtfJChkLCB3ZWVrLCBkYXlPZldlZWspIHsKICBkLnNldE1vbnRoKDApOwogIGQuc2V0RGF0ZSgxKTsKICB2YXIganNEYXkgPSBkLmdldERheSgpLCBqYW4xV2Vla0RheSA9IGpzRGF5IHx8IDcsIHN0YXJ0RGVsdGEgPSA0ID49IGphbjFXZWVrRGF5ID8gMSAtIGphbjFXZWVrRGF5IDogOCAtIGphbjFXZWVrRGF5LCBhYnNvbHV0ZURheXMgPSBOdW1iZXIoZGF5T2ZXZWVrKSArIDcgKiAoTnVtYmVyKHdlZWspIC0gMSksIGRlbHRhID0gc3RhcnREZWx0YSArIGFic29sdXRlRGF5cyAtIDEsIGludGVydmFsID0gbmV3IGdvb2cuZGF0ZS5JbnRlcnZhbChnb29nLmRhdGUuSW50ZXJ2YWwuREFZUywgZGVsdGEpOwogIGQuYWRkKGludGVydmFsKQp9Owpnb29nLmRhdGUuc2V0SXNvODYwMVRpbWVPbmx5XyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkc2V0SXNvODYwMVRpbWVPbmx5XyQoZCwgZm9ybWF0dGVkKSB7CiAgdmFyIHBhcnRzID0gZm9ybWF0dGVkLm1hdGNoKGdvb2cuZGF0ZS5zcGxpdFRpbWV6b25lU3RyaW5nUmVnZXhfKSwgb2Zmc2V0ID0gMDsKICBwYXJ0cyAmJiAoIloiICE9IHBhcnRzWzBdICYmIChvZmZzZXQgPSA2MCAqIHBhcnRzWzJdICsgTnVtYmVyKHBhcnRzWzNdKSwgb2Zmc2V0ICo9ICItIiA9PSBwYXJ0c1sxXSA/IDEgOiAtMSksIG9mZnNldCAtPSBkLmdldFRpbWV6b25lT2Zmc2V0KCksIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5zdWJzdHIoMCwgZm9ybWF0dGVkLmxlbmd0aCAtIHBhcnRzWzBdLmxlbmd0aCkpOwogIHBhcnRzID0gZm9ybWF0dGVkLm1hdGNoKGdvb2cuZGF0ZS5zcGxpdFRpbWVTdHJpbmdSZWdleF8pOwogIGlmKCFwYXJ0cykgewogICAgcmV0dXJuITEKICB9CiAgZC5zZXRIb3VycyhOdW1iZXIocGFydHNbMV0pKTsKICBkLnNldE1pbnV0ZXMoTnVtYmVyKHBhcnRzWzJdKSB8fCAwKTsKICBkLnNldFNlY29uZHMoTnVtYmVyKHBhcnRzWzNdKSB8fCAwKTsKICBkLnNldE1pbGxpc2Vjb25kcyhwYXJ0c1s0XSA/IDFFMyAqIHBhcnRzWzRdIDogMCk7CiAgMCAhPSBvZmZzZXQgJiYgZC5zZXRUaW1lKGQuZ2V0VGltZSgpICsgNkU0ICogb2Zmc2V0KTsKICByZXR1cm4hMAp9Owpnb29nLmRhdGUuSW50ZXJ2YWwgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJEludGVydmFsJChvcHRfeWVhcnMsIG9wdF9tb250aHMsIG9wdF9kYXlzLCBvcHRfaG91cnMsIG9wdF9taW51dGVzLCBvcHRfc2Vjb25kcykgewogIGlmKGdvb2cuaXNTdHJpbmcob3B0X3llYXJzKSkgewogICAgdmFyIHR5cGUgPSBvcHRfeWVhcnMsIGludGVydmFsID0gb3B0X21vbnRoczsKICAgIHRoaXMueWVhcnMgPSB0eXBlID09IGdvb2cuZGF0ZS5JbnRlcnZhbC5ZRUFSUyA/IGludGVydmFsIDogMDsKICAgIHRoaXMubW9udGhzID0gdHlwZSA9PSBnb29nLmRhdGUuSW50ZXJ2YWwuTU9OVEhTID8gaW50ZXJ2YWwgOiAwOwogICAgdGhpcy5kYXlzID0gdHlwZSA9PSBnb29nLmRhdGUuSW50ZXJ2YWwuREFZUyA/IGludGVydmFsIDogMDsKICAgIHRoaXMuaG91cnMgPSB0eXBlID09IGdvb2cuZGF0ZS5JbnRlcnZhbC5IT1VSUyA/IGludGVydmFsIDogMDsKICAgIHRoaXMubWludXRlcyA9IHR5cGUgPT0gZ29vZy5kYXRlLkludGVydmFsLk1JTlVURVMgPyBpbnRlcnZhbCA6IDA7CiAgICB0aGlzLnNlY29uZHMgPSB0eXBlID09IGdvb2cuZGF0ZS5JbnRlcnZhbC5TRUNPTkRTID8gaW50ZXJ2YWwgOiAwCiAgfWVsc2UgewogICAgdGhpcy55ZWFycyA9IG9wdF95ZWFycyB8fCAwLCB0aGlzLm1vbnRocyA9IG9wdF9tb250aHMgfHwgMCwgdGhpcy5kYXlzID0gb3B0X2RheXMgfHwgMCwgdGhpcy5ob3VycyA9IG9wdF9ob3VycyB8fCAwLCB0aGlzLm1pbnV0ZXMgPSBvcHRfbWludXRlcyB8fCAwLCB0aGlzLnNlY29uZHMgPSBvcHRfc2Vjb25kcyB8fCAwCiAgfQp9Owpnb29nLmRhdGUuSW50ZXJ2YWwuZnJvbUlzb1N0cmluZyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkSW50ZXJ2YWwkZnJvbUlzb1N0cmluZyQoZHVyYXRpb24pIHsKICB2YXIgcGFydHMgPSBkdXJhdGlvbi5tYXRjaChnb29nLmRhdGUuc3BsaXREdXJhdGlvblJlZ2V4Xyk7CiAgaWYoIXBhcnRzKSB7CiAgICByZXR1cm4gbnVsbAogIH0KICB2YXIgdGltZUVtcHR5ID0gIShwYXJ0c1s2XSB8fCBwYXJ0c1s3XSB8fCBwYXJ0c1s4XSksIGRhdGVUaW1lRW1wdHkgPSB0aW1lRW1wdHkgJiYgIShwYXJ0c1syXSB8fCBwYXJ0c1szXSB8fCBwYXJ0c1s0XSk7CiAgaWYoZGF0ZVRpbWVFbXB0eSB8fCB0aW1lRW1wdHkgJiYgcGFydHNbNV0pIHsKICAgIHJldHVybiBudWxsCiAgfQogIHZhciBuZWdhdGl2ZSA9IHBhcnRzWzFdLCB5ZWFycyA9IHBhcnNlSW50KHBhcnRzWzJdLCAxMCkgfHwgMCwgbW9udGhzID0gcGFyc2VJbnQocGFydHNbM10sIDEwKSB8fCAwLCBkYXlzID0gcGFyc2VJbnQocGFydHNbNF0sIDEwKSB8fCAwLCBob3VycyA9IHBhcnNlSW50KHBhcnRzWzZdLCAxMCkgfHwgMCwgbWludXRlcyA9IHBhcnNlSW50KHBhcnRzWzddLCAxMCkgfHwgMCwgc2Vjb25kcyA9IHBhcnNlRmxvYXQocGFydHNbOF0pIHx8IDA7CiAgcmV0dXJuIG5lZ2F0aXZlID8gbmV3IGdvb2cuZGF0ZS5JbnRlcnZhbCgteWVhcnMsIC1tb250aHMsIC1kYXlzLCAtaG91cnMsIC1taW51dGVzLCAtc2Vjb25kcykgOiBuZXcgZ29vZy5kYXRlLkludGVydmFsKHllYXJzLCBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKQp9Owpnb29nLmRhdGUuSW50ZXJ2YWwucHJvdG90eXBlLnRvSXNvU3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSRJbnRlcnZhbCQkdG9Jc29TdHJpbmckKG9wdF92ZXJib3NlKSB7CiAgdmFyIG1pbkZpZWxkID0gTWF0aC5taW4odGhpcy55ZWFycywgdGhpcy5tb250aHMsIHRoaXMuZGF5cywgdGhpcy5ob3VycywgdGhpcy5taW51dGVzLCB0aGlzLnNlY29uZHMpLCBtYXhGaWVsZCA9IE1hdGgubWF4KHRoaXMueWVhcnMsIHRoaXMubW9udGhzLCB0aGlzLmRheXMsIHRoaXMuaG91cnMsIHRoaXMubWludXRlcywgdGhpcy5zZWNvbmRzKTsKICBpZigwID4gbWluRmllbGQgJiYgMCA8IG1heEZpZWxkKSB7CiAgICByZXR1cm4gbnVsbAogIH0KICBpZighb3B0X3ZlcmJvc2UgJiYgMCA9PSBtaW5GaWVsZCAmJiAwID09IG1heEZpZWxkKSB7CiAgICByZXR1cm4iUFQwUyIKICB9CiAgdmFyIHJlcyA9IFtdOwogIDAgPiBtaW5GaWVsZCAmJiByZXMucHVzaCgiLSIpOwogIHJlcy5wdXNoKCJQIik7CiAgKHRoaXMueWVhcnMgfHwgb3B0X3ZlcmJvc2UpICYmIHJlcy5wdXNoKE1hdGguYWJzKHRoaXMueWVhcnMpICsgIlkiKTsKICAodGhpcy5tb250aHMgfHwgb3B0X3ZlcmJvc2UpICYmIHJlcy5wdXNoKE1hdGguYWJzKHRoaXMubW9udGhzKSArICJNIik7CiAgKHRoaXMuZGF5cyB8fCBvcHRfdmVyYm9zZSkgJiYgcmVzLnB1c2goTWF0aC5hYnModGhpcy5kYXlzKSArICJEIik7CiAgaWYodGhpcy5ob3VycyB8fCB0aGlzLm1pbnV0ZXMgfHwgdGhpcy5zZWNvbmRzIHx8IG9wdF92ZXJib3NlKSB7CiAgICByZXMucHVzaCgiVCIpLCAodGhpcy5ob3VycyB8fCBvcHRfdmVyYm9zZSkgJiYgcmVzLnB1c2goTWF0aC5hYnModGhpcy5ob3VycykgKyAiSCIpLCAodGhpcy5taW51dGVzIHx8IG9wdF92ZXJib3NlKSAmJiByZXMucHVzaChNYXRoLmFicyh0aGlzLm1pbnV0ZXMpICsgIk0iKSwgKHRoaXMuc2Vjb25kcyB8fCBvcHRfdmVyYm9zZSkgJiYgcmVzLnB1c2goTWF0aC5hYnModGhpcy5zZWNvbmRzKSArICJTIikKICB9CiAgcmV0dXJuIHJlcy5qb2luKCIiKQp9Owpnb29nLmRhdGUuSW50ZXJ2YWwucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkSW50ZXJ2YWwkJGVxdWFscyQob3RoZXIpIHsKICByZXR1cm4gb3RoZXIueWVhcnMgPT0gdGhpcy55ZWFycyAmJiBvdGhlci5tb250aHMgPT0gdGhpcy5tb250aHMgJiYgb3RoZXIuZGF5cyA9PSB0aGlzLmRheXMgJiYgb3RoZXIuaG91cnMgPT0gdGhpcy5ob3VycyAmJiBvdGhlci5taW51dGVzID09IHRoaXMubWludXRlcyAmJiBvdGhlci5zZWNvbmRzID09IHRoaXMuc2Vjb25kcwp9Owpnb29nLmRhdGUuSW50ZXJ2YWwucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSRJbnRlcnZhbCQkY2xvbmUkKCkgewogIHJldHVybiBuZXcgZ29vZy5kYXRlLkludGVydmFsKHRoaXMueWVhcnMsIHRoaXMubW9udGhzLCB0aGlzLmRheXMsIHRoaXMuaG91cnMsIHRoaXMubWludXRlcywgdGhpcy5zZWNvbmRzKQp9Owpnb29nLmRhdGUuSW50ZXJ2YWwuWUVBUlMgPSAieSI7Cmdvb2cuZGF0ZS5JbnRlcnZhbC5NT05USFMgPSAibSI7Cmdvb2cuZGF0ZS5JbnRlcnZhbC5EQVlTID0gImQiOwpnb29nLmRhdGUuSW50ZXJ2YWwuSE9VUlMgPSAiaCI7Cmdvb2cuZGF0ZS5JbnRlcnZhbC5NSU5VVEVTID0gIm4iOwpnb29nLmRhdGUuSW50ZXJ2YWwuU0VDT05EUyA9ICJzIjsKZ29vZy5kYXRlLkludGVydmFsLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJEludGVydmFsJCRhZGQkKGludGVydmFsKSB7CiAgdGhpcy55ZWFycyArPSBpbnRlcnZhbC55ZWFyczsKICB0aGlzLm1vbnRocyArPSBpbnRlcnZhbC5tb250aHM7CiAgdGhpcy5kYXlzICs9IGludGVydmFsLmRheXM7CiAgdGhpcy5ob3VycyArPSBpbnRlcnZhbC5ob3VyczsKICB0aGlzLm1pbnV0ZXMgKz0gaW50ZXJ2YWwubWludXRlczsKICB0aGlzLnNlY29uZHMgKz0gaW50ZXJ2YWwuc2Vjb25kcwp9Owpnb29nLmRhdGUuRGF0ZSA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSQob3B0X3llYXIsIG9wdF9tb250aCwgb3B0X2RhdGUpIHsKICBnb29nLmlzTnVtYmVyKG9wdF95ZWFyKSA/ICh0aGlzLmRhdGVfID0gbmV3IERhdGUob3B0X3llYXIsIG9wdF9tb250aCB8fCAwLCBvcHRfZGF0ZSB8fCAxKSwgdGhpcy5tYXliZUZpeERzdF8ob3B0X2RhdGUgfHwgMSkpIDogZ29vZy5pc09iamVjdChvcHRfeWVhcikgPyAodGhpcy5kYXRlXyA9IG5ldyBEYXRlKG9wdF95ZWFyLmdldEZ1bGxZZWFyKCksIG9wdF95ZWFyLmdldE1vbnRoKCksIG9wdF95ZWFyLmdldERhdGUoKSksIHRoaXMubWF5YmVGaXhEc3RfKG9wdF95ZWFyLmdldERhdGUoKSkpIDogKHRoaXMuZGF0ZV8gPSBuZXcgRGF0ZSwgdGhpcy5kYXRlXy5zZXRIb3VycygwKSwgdGhpcy5kYXRlXy5zZXRNaW51dGVzKDApLCB0aGlzLmRhdGVfLnNldFNlY29uZHMoMCksIHRoaXMuZGF0ZV8uc2V0TWlsbGlzZWNvbmRzKDApKQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuZmlyc3REYXlPZldlZWtfID0gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scy5GSVJTVERBWU9GV0VFSzsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLmZpcnN0V2Vla0N1dE9mZkRheV8gPSBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzLkZJUlNUV0VFS0NVVE9GRkRBWTsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRjbG9uZSQoKSB7CiAgdmFyIGRhdGUgPSBuZXcgZ29vZy5kYXRlLkRhdGUodGhpcy5kYXRlXyk7CiAgZGF0ZS5maXJzdERheU9mV2Vla18gPSB0aGlzLmZpcnN0RGF5T2ZXZWVrXzsKICBkYXRlLmZpcnN0V2Vla0N1dE9mZkRheV8gPSB0aGlzLmZpcnN0V2Vla0N1dE9mZkRheV87CiAgcmV0dXJuIGRhdGUKfTsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLmdldEZ1bGxZZWFyID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRnZXRGdWxsWWVhciQoKSB7CiAgcmV0dXJuIHRoaXMuZGF0ZV8uZ2V0RnVsbFllYXIoKQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuZ2V0WWVhciA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSQkZ2V0WWVhciQoKSB7CiAgcmV0dXJuIHRoaXMuZ2V0RnVsbFllYXIoKQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuZ2V0TW9udGggPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJGdldE1vbnRoJCgpIHsKICByZXR1cm4gdGhpcy5kYXRlXy5nZXRNb250aCgpCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5nZXREYXRlID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRnZXREYXRlJCgpIHsKICByZXR1cm4gdGhpcy5kYXRlXy5nZXREYXRlKCkKfTsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLmdldFRpbWUgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJGdldFRpbWUkKCkgewogIHJldHVybiB0aGlzLmRhdGVfLmdldFRpbWUoKQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuZ2V0RGF5ID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRnZXREYXkkKCkgewogIHJldHVybiB0aGlzLmRhdGVfLmdldERheSgpCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5nZXRVVENGdWxsWWVhciA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSQkZ2V0VVRDRnVsbFllYXIkKCkgewogIHJldHVybiB0aGlzLmRhdGVfLmdldFVUQ0Z1bGxZZWFyKCkKfTsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLmdldFVUQ01vbnRoID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRnZXRVVENNb250aCQoKSB7CiAgcmV0dXJuIHRoaXMuZGF0ZV8uZ2V0VVRDTW9udGgoKQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuZ2V0VVRDRGF0ZSA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSQkZ2V0VVRDRGF0ZSQoKSB7CiAgcmV0dXJuIHRoaXMuZGF0ZV8uZ2V0VVRDRGF0ZSgpCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5nZXRVVENEYXkgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJGdldFVUQ0RheSQoKSB7CiAgcmV0dXJuIHRoaXMuZGF0ZV8uZ2V0RGF5KCkKfTsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLmdldFVUQ0hvdXJzID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRnZXRVVENIb3VycyQoKSB7CiAgcmV0dXJuIHRoaXMuZGF0ZV8uZ2V0VVRDSG91cnMoKQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuZ2V0VVRDTWludXRlcyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSQkZ2V0VVRDTWludXRlcyQoKSB7CiAgcmV0dXJuIHRoaXMuZGF0ZV8uZ2V0VVRDTWludXRlcygpCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5nZXRGaXJzdERheU9mV2VlayA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSQkZ2V0Rmlyc3REYXlPZldlZWskKCkgewogIHJldHVybiB0aGlzLmZpcnN0RGF5T2ZXZWVrXwp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuZ2V0Rmlyc3RXZWVrQ3V0T2ZmRGF5ID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRnZXRGaXJzdFdlZWtDdXRPZmZEYXkkKCkgewogIHJldHVybiB0aGlzLmZpcnN0V2Vla0N1dE9mZkRheV8KfTsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLmdldE51bWJlck9mRGF5c0luTW9udGggPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJGdldE51bWJlck9mRGF5c0luTW9udGgkKCkgewogIHJldHVybiBnb29nLmRhdGUuZ2V0TnVtYmVyT2ZEYXlzSW5Nb250aCh0aGlzLmdldEZ1bGxZZWFyKCksIHRoaXMuZ2V0TW9udGgoKSkKfTsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLmdldFdlZWtOdW1iZXIgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJGdldFdlZWtOdW1iZXIkKCkgewogIHJldHVybiBnb29nLmRhdGUuZ2V0V2Vla051bWJlcih0aGlzLmdldEZ1bGxZZWFyKCksIHRoaXMuZ2V0TW9udGgoKSwgdGhpcy5nZXREYXRlKCksIHRoaXMuZmlyc3RXZWVrQ3V0T2ZmRGF5XywgdGhpcy5maXJzdERheU9mV2Vla18pCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5nZXRUaW1lem9uZU9mZnNldCA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSQkZ2V0VGltZXpvbmVPZmZzZXQkKCkgewogIHJldHVybiB0aGlzLmRhdGVfLmdldFRpbWV6b25lT2Zmc2V0KCkKfTsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLmdldFRpbWV6b25lT2Zmc2V0U3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRnZXRUaW1lem9uZU9mZnNldFN0cmluZyQoKSB7CiAgdmFyIHR6LCBvZmZzZXQgPSB0aGlzLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgaWYoMCA9PSBvZmZzZXQpIHsKICAgIHR6ID0gIloiCiAgfWVsc2UgewogICAgdmFyIG4gPSBNYXRoLmFicyhvZmZzZXQpIC8gNjAsIGggPSBNYXRoLmZsb29yKG4pLCBtID0gNjAgKiAobiAtIGgpOwogICAgdHogPSAoMCA8IG9mZnNldCA/ICItIiA6ICIrIikgKyBnb29nLnN0cmluZy5wYWROdW1iZXIoaCwgMikgKyAiOiIgKyBnb29nLnN0cmluZy5wYWROdW1iZXIobSwgMikKICB9CiAgcmV0dXJuIHR6Cn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJHNldCQoZGF0ZSkgewogIHRoaXMuZGF0ZV8gPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5zZXRGdWxsWWVhciA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSQkc2V0RnVsbFllYXIkKHllYXIpIHsKICB0aGlzLmRhdGVfLnNldEZ1bGxZZWFyKHllYXIpCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5zZXRZZWFyID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRzZXRZZWFyJCh5ZWFyKSB7CiAgdGhpcy5zZXRGdWxsWWVhcih5ZWFyKQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuc2V0TW9udGggPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJHNldE1vbnRoJChtb250aCkgewogIHRoaXMuZGF0ZV8uc2V0TW9udGgobW9udGgpCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5zZXREYXRlID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRzZXREYXRlJChkYXRlKSB7CiAgdGhpcy5kYXRlXy5zZXREYXRlKGRhdGUpCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5zZXRUaW1lID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRzZXRUaW1lJChtcykgewogIHRoaXMuZGF0ZV8uc2V0VGltZShtcykKfTsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLnNldFVUQ0Z1bGxZZWFyID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRzZXRVVENGdWxsWWVhciQoeWVhcikgewogIHRoaXMuZGF0ZV8uc2V0VVRDRnVsbFllYXIoeWVhcikKfTsKZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLnNldFVUQ01vbnRoID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRzZXRVVENNb250aCQobW9udGgpIHsKICB0aGlzLmRhdGVfLnNldFVUQ01vbnRoKG1vbnRoKQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuc2V0VVRDRGF0ZSA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSQkc2V0VVRDRGF0ZSQoZGF0ZSkgewogIHRoaXMuZGF0ZV8uc2V0VVRDRGF0ZShkYXRlKQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuc2V0Rmlyc3REYXlPZldlZWsgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJHNldEZpcnN0RGF5T2ZXZWVrJChkYXkpIHsKICB0aGlzLmZpcnN0RGF5T2ZXZWVrXyA9IGRheQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuc2V0Rmlyc3RXZWVrQ3V0T2ZmRGF5ID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRzZXRGaXJzdFdlZWtDdXRPZmZEYXkkKGRheSkgewogIHRoaXMuZmlyc3RXZWVrQ3V0T2ZmRGF5XyA9IGRheQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCRhZGQkKGludGVydmFsKSB7CiAgaWYoaW50ZXJ2YWwueWVhcnMgfHwgaW50ZXJ2YWwubW9udGhzKSB7CiAgICB2YXIgbW9udGggPSB0aGlzLmdldE1vbnRoKCkgKyBpbnRlcnZhbC5tb250aHMgKyAxMiAqIGludGVydmFsLnllYXJzLCB5ZWFyID0gdGhpcy5nZXRZZWFyKCkgKyBNYXRoLmZsb29yKG1vbnRoIC8gMTIpLCBtb250aCA9IG1vbnRoICUgMTI7CiAgICAwID4gbW9udGggJiYgKG1vbnRoICs9IDEyKTsKICAgIHZhciBkYXlzSW5UYXJnZXRNb250aCA9IGdvb2cuZGF0ZS5nZXROdW1iZXJPZkRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSwgZGF0ZSA9IE1hdGgubWluKGRheXNJblRhcmdldE1vbnRoLCB0aGlzLmdldERhdGUoKSk7CiAgICB0aGlzLnNldERhdGUoMSk7CiAgICB0aGlzLnNldEZ1bGxZZWFyKHllYXIpOwogICAgdGhpcy5zZXRNb250aChtb250aCk7CiAgICB0aGlzLnNldERhdGUoZGF0ZSkKICB9CiAgaWYoaW50ZXJ2YWwuZGF5cykgewogICAgdmFyIG5vb24gPSBuZXcgRGF0ZSh0aGlzLmdldFllYXIoKSwgdGhpcy5nZXRNb250aCgpLCB0aGlzLmdldERhdGUoKSwgMTIpLCByZXN1bHQgPSBuZXcgRGF0ZShub29uLmdldFRpbWUoKSArIDg2NEU1ICogaW50ZXJ2YWwuZGF5cyk7CiAgICB0aGlzLnNldERhdGUoMSk7CiAgICB0aGlzLnNldEZ1bGxZZWFyKHJlc3VsdC5nZXRGdWxsWWVhcigpKTsKICAgIHRoaXMuc2V0TW9udGgocmVzdWx0LmdldE1vbnRoKCkpOwogICAgdGhpcy5zZXREYXRlKHJlc3VsdC5nZXREYXRlKCkpOwogICAgdGhpcy5tYXliZUZpeERzdF8ocmVzdWx0LmdldERhdGUoKSkKICB9Cn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS50b0lzb1N0cmluZyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSQkdG9Jc29TdHJpbmckKG9wdF92ZXJib3NlLCBvcHRfdHopIHsKICB2YXIgc3RyID0gW3RoaXMuZ2V0RnVsbFllYXIoKSwgZ29vZy5zdHJpbmcucGFkTnVtYmVyKHRoaXMuZ2V0TW9udGgoKSArIDEsIDIpLCBnb29nLnN0cmluZy5wYWROdW1iZXIodGhpcy5nZXREYXRlKCksIDIpXTsKICByZXR1cm4gc3RyLmpvaW4ob3B0X3ZlcmJvc2UgPyAiLSIgOiAiIikgKyAob3B0X3R6ID8gdGhpcy5nZXRUaW1lem9uZU9mZnNldFN0cmluZygpIDogIiIpCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJGVxdWFscyQob3RoZXIpIHsKICByZXR1cm4gdGhpcy5nZXRZZWFyKCkgPT0gb3RoZXIuZ2V0WWVhcigpICYmIHRoaXMuZ2V0TW9udGgoKSA9PSBvdGhlci5nZXRNb250aCgpICYmIHRoaXMuZ2V0RGF0ZSgpID09IG90aGVyLmdldERhdGUoKQp9Owpnb29nLmRhdGUuRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJHRvU3RyaW5nJCgpIHsKICByZXR1cm4gdGhpcy50b0lzb1N0cmluZygpCn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5tYXliZUZpeERzdF8gPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGUkJG1heWJlRml4RHN0XyQoZXhwZWN0ZWQpIHsKICBpZih0aGlzLmdldERhdGUoKSAhPSBleHBlY3RlZCkgewogICAgdmFyIGRpciA9IHRoaXMuZ2V0RGF0ZSgpIDwgZXhwZWN0ZWQgPyAxIDogLTE7CiAgICB0aGlzLmRhdGVfLnNldFVUQ0hvdXJzKHRoaXMuZGF0ZV8uZ2V0VVRDSG91cnMoKSArIGRpcikKICB9Cn07Cmdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS52YWx1ZU9mID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlJCR2YWx1ZU9mJCgpIHsKICByZXR1cm4gdGhpcy5kYXRlXy52YWx1ZU9mKCkKfTsKZ29vZy5kYXRlLkRhdGUuY29tcGFyZSA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZSRjb21wYXJlJChkYXRlMSwgZGF0ZTIpIHsKICByZXR1cm4gZGF0ZTEuZ2V0VGltZSgpIC0gZGF0ZTIuZ2V0VGltZSgpCn07Cmdvb2cuZGF0ZS5EYXRlVGltZSA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZVRpbWUkKG9wdF95ZWFyLCBvcHRfbW9udGgsIG9wdF9kYXRlLCBvcHRfaG91cnMsIG9wdF9taW51dGVzLCBvcHRfc2Vjb25kcywgb3B0X21pbGxpc2Vjb25kcykgewogIHRoaXMuZGF0ZV8gPSBnb29nLmlzTnVtYmVyKG9wdF95ZWFyKSA/IG5ldyBEYXRlKG9wdF95ZWFyLCBvcHRfbW9udGggfHwgMCwgb3B0X2RhdGUgfHwgMSwgb3B0X2hvdXJzIHx8IDAsIG9wdF9taW51dGVzIHx8IDAsIG9wdF9zZWNvbmRzIHx8IDAsIG9wdF9taWxsaXNlY29uZHMgfHwgMCkgOiBuZXcgRGF0ZShvcHRfeWVhciA/IG9wdF95ZWFyLmdldFRpbWUoKSA6IGdvb2cubm93KCkpCn07Cmdvb2cuaW5oZXJpdHMoZ29vZy5kYXRlLkRhdGVUaW1lLCBnb29nLmRhdGUuRGF0ZSk7Cmdvb2cuZGF0ZS5EYXRlVGltZS5mcm9tUmZjODIyU3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlVGltZSRmcm9tUmZjODIyU3RyaW5nJChmb3JtYXR0ZWQpIHsKICB2YXIgZGF0ZSA9IG5ldyBEYXRlKGZvcm1hdHRlZCk7CiAgcmV0dXJuIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IG5ldyBnb29nLmRhdGUuRGF0ZVRpbWUoZGF0ZSkgOiBudWxsCn07Cmdvb2cuZGF0ZS5EYXRlVGltZS5wcm90b3R5cGUuZ2V0SG91cnMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCRnZXRIb3VycyQoKSB7CiAgcmV0dXJuIHRoaXMuZGF0ZV8uZ2V0SG91cnMoKQp9Owpnb29nLmRhdGUuRGF0ZVRpbWUucHJvdG90eXBlLmdldE1pbnV0ZXMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCRnZXRNaW51dGVzJCgpIHsKICByZXR1cm4gdGhpcy5kYXRlXy5nZXRNaW51dGVzKCkKfTsKZ29vZy5kYXRlLkRhdGVUaW1lLnByb3RvdHlwZS5nZXRTZWNvbmRzID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlVGltZSQkZ2V0U2Vjb25kcyQoKSB7CiAgcmV0dXJuIHRoaXMuZGF0ZV8uZ2V0U2Vjb25kcygpCn07Cmdvb2cuZGF0ZS5EYXRlVGltZS5wcm90b3R5cGUuZ2V0TWlsbGlzZWNvbmRzID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlVGltZSQkZ2V0TWlsbGlzZWNvbmRzJCgpIHsKICByZXR1cm4gdGhpcy5kYXRlXy5nZXRNaWxsaXNlY29uZHMoKQp9Owpnb29nLmRhdGUuRGF0ZVRpbWUucHJvdG90eXBlLmdldFVUQ0RheSA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZVRpbWUkJGdldFVUQ0RheSQoKSB7CiAgcmV0dXJuIHRoaXMuZGF0ZV8uZ2V0VVRDRGF5KCkKfTsKZ29vZy5kYXRlLkRhdGVUaW1lLnByb3RvdHlwZS5nZXRVVENIb3VycyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZVRpbWUkJGdldFVUQ0hvdXJzJCgpIHsKICByZXR1cm4gdGhpcy5kYXRlXy5nZXRVVENIb3VycygpCn07Cmdvb2cuZGF0ZS5EYXRlVGltZS5wcm90b3R5cGUuZ2V0VVRDTWludXRlcyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZVRpbWUkJGdldFVUQ01pbnV0ZXMkKCkgewogIHJldHVybiB0aGlzLmRhdGVfLmdldFVUQ01pbnV0ZXMoKQp9Owpnb29nLmRhdGUuRGF0ZVRpbWUucHJvdG90eXBlLmdldFVUQ1NlY29uZHMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCRnZXRVVENTZWNvbmRzJCgpIHsKICByZXR1cm4gdGhpcy5kYXRlXy5nZXRVVENTZWNvbmRzKCkKfTsKZ29vZy5kYXRlLkRhdGVUaW1lLnByb3RvdHlwZS5nZXRVVENNaWxsaXNlY29uZHMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCRnZXRVVENNaWxsaXNlY29uZHMkKCkgewogIHJldHVybiB0aGlzLmRhdGVfLmdldFVUQ01pbGxpc2Vjb25kcygpCn07Cmdvb2cuZGF0ZS5EYXRlVGltZS5wcm90b3R5cGUuc2V0SG91cnMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCRzZXRIb3VycyQoaG91cnMpIHsKICB0aGlzLmRhdGVfLnNldEhvdXJzKGhvdXJzKQp9Owpnb29nLmRhdGUuRGF0ZVRpbWUucHJvdG90eXBlLnNldE1pbnV0ZXMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCRzZXRNaW51dGVzJChtaW51dGVzKSB7CiAgdGhpcy5kYXRlXy5zZXRNaW51dGVzKG1pbnV0ZXMpCn07Cmdvb2cuZGF0ZS5EYXRlVGltZS5wcm90b3R5cGUuc2V0U2Vjb25kcyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZVRpbWUkJHNldFNlY29uZHMkKHNlY29uZHMpIHsKICB0aGlzLmRhdGVfLnNldFNlY29uZHMoc2Vjb25kcykKfTsKZ29vZy5kYXRlLkRhdGVUaW1lLnByb3RvdHlwZS5zZXRNaWxsaXNlY29uZHMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCRzZXRNaWxsaXNlY29uZHMkKG1zKSB7CiAgdGhpcy5kYXRlXy5zZXRNaWxsaXNlY29uZHMobXMpCn07Cmdvb2cuZGF0ZS5EYXRlVGltZS5wcm90b3R5cGUuc2V0VVRDSG91cnMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCRzZXRVVENIb3VycyQoaG91cnMpIHsKICB0aGlzLmRhdGVfLnNldFVUQ0hvdXJzKGhvdXJzKQp9Owpnb29nLmRhdGUuRGF0ZVRpbWUucHJvdG90eXBlLnNldFVUQ01pbnV0ZXMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCRzZXRVVENNaW51dGVzJChtaW51dGVzKSB7CiAgdGhpcy5kYXRlXy5zZXRVVENNaW51dGVzKG1pbnV0ZXMpCn07Cmdvb2cuZGF0ZS5EYXRlVGltZS5wcm90b3R5cGUuc2V0VVRDU2Vjb25kcyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZVRpbWUkJHNldFVUQ1NlY29uZHMkKHNlY29uZHMpIHsKICB0aGlzLmRhdGVfLnNldFVUQ1NlY29uZHMoc2Vjb25kcykKfTsKZ29vZy5kYXRlLkRhdGVUaW1lLnByb3RvdHlwZS5zZXRVVENNaWxsaXNlY29uZHMgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCRzZXRVVENNaWxsaXNlY29uZHMkKG1zKSB7CiAgdGhpcy5kYXRlXy5zZXRVVENNaWxsaXNlY29uZHMobXMpCn07Cmdvb2cuZGF0ZS5EYXRlVGltZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlVGltZSQkYWRkJChpbnRlcnZhbCkgewogIGdvb2cuZGF0ZS5EYXRlLnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLCBpbnRlcnZhbCk7CiAgaW50ZXJ2YWwuaG91cnMgJiYgdGhpcy5zZXRIb3Vycyh0aGlzLmRhdGVfLmdldEhvdXJzKCkgKyBpbnRlcnZhbC5ob3Vycyk7CiAgaW50ZXJ2YWwubWludXRlcyAmJiB0aGlzLnNldE1pbnV0ZXModGhpcy5kYXRlXy5nZXRNaW51dGVzKCkgKyBpbnRlcnZhbC5taW51dGVzKTsKICBpbnRlcnZhbC5zZWNvbmRzICYmIHRoaXMuc2V0U2Vjb25kcyh0aGlzLmRhdGVfLmdldFNlY29uZHMoKSArIGludGVydmFsLnNlY29uZHMpCn07Cmdvb2cuZGF0ZS5EYXRlVGltZS5wcm90b3R5cGUudG9Jc29TdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCR0b0lzb1N0cmluZyQob3B0X3ZlcmJvc2UsIG9wdF90eikgewogIHZhciBkYXRlU3RyaW5nID0gZ29vZy5kYXRlLkRhdGUucHJvdG90eXBlLnRvSXNvU3RyaW5nLmNhbGwodGhpcywgb3B0X3ZlcmJvc2UpOwogIHJldHVybiBvcHRfdmVyYm9zZSA/IGRhdGVTdHJpbmcgKyAiICIgKyBnb29nLnN0cmluZy5wYWROdW1iZXIodGhpcy5nZXRIb3VycygpLCAyKSArICI6IiArIGdvb2cuc3RyaW5nLnBhZE51bWJlcih0aGlzLmdldE1pbnV0ZXMoKSwgMikgKyAiOiIgKyBnb29nLnN0cmluZy5wYWROdW1iZXIodGhpcy5nZXRTZWNvbmRzKCksIDIpICsgKG9wdF90eiA/IHRoaXMuZ2V0VGltZXpvbmVPZmZzZXRTdHJpbmcoKSA6ICIiKSA6IGRhdGVTdHJpbmcgKyAiVCIgKyBnb29nLnN0cmluZy5wYWROdW1iZXIodGhpcy5nZXRIb3VycygpLCAyKSArIGdvb2cuc3RyaW5nLnBhZE51bWJlcih0aGlzLmdldE1pbnV0ZXMoKSwgMikgKyBnb29nLnN0cmluZy5wYWROdW1iZXIodGhpcy5nZXRTZWNvbmRzKCksIDIpICsgKG9wdF90eiA/IHRoaXMuZ2V0VGltZXpvbmVPZmZzZXRTdHJpbmcoKSA6ICIiKQp9Owpnb29nLmRhdGUuRGF0ZVRpbWUucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uICRnb29nJGRhdGUkRGF0ZVRpbWUkJGVxdWFscyQob3RoZXIpIHsKICByZXR1cm4gdGhpcy5nZXRUaW1lKCkgPT0gb3RoZXIuZ2V0VGltZSgpCn07Cmdvb2cuZGF0ZS5EYXRlVGltZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRkYXRlJERhdGVUaW1lJCR0b1N0cmluZyQoKSB7CiAgcmV0dXJuIHRoaXMudG9Jc29TdHJpbmcoKQp9Owpnb29nLmRhdGUuRGF0ZVRpbWUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gJGdvb2ckZGF0ZSREYXRlVGltZSQkY2xvbmUkKCkgewogIHZhciBkYXRlID0gbmV3IGdvb2cuZGF0ZS5EYXRlVGltZSh0aGlzLmRhdGVfKTsKICBkYXRlLnNldEZpcnN0RGF5T2ZXZWVrKHRoaXMuZ2V0Rmlyc3REYXlPZldlZWsoKSk7CiAgZGF0ZS5zZXRGaXJzdFdlZWtDdXRPZmZEYXkodGhpcy5nZXRGaXJzdFdlZWtDdXRPZmZEYXkoKSk7CiAgcmV0dXJuIGRhdGUKfTsKZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkSW52ZXJzaW9uTWFwJChyYW5nZUFycmF5LCB2YWx1ZUFycmF5LCBvcHRfZGVsdGEpIHsKICBpZihyYW5nZUFycmF5Lmxlbmd0aCAhPSB2YWx1ZUFycmF5Lmxlbmd0aCkgewogICAgcmV0dXJuIG51bGwKICB9CiAgdGhpcy5zdG9yZUludmVyc2lvbl8ocmFuZ2VBcnJheSwgb3B0X2RlbHRhKTsKICB0aGlzLnZhbHVlcyA9IHZhbHVlQXJyYXkKfTsKZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcC5wcm90b3R5cGUuc3RvcmVJbnZlcnNpb25fID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRJbnZlcnNpb25NYXAkJHN0b3JlSW52ZXJzaW9uXyQocmFuZ2VBcnJheSwgb3B0X2RlbHRhKSB7CiAgdGhpcy5yYW5nZUFycmF5ID0gcmFuZ2VBcnJheTsKICBmb3IodmFyIGkgPSAxO2kgPCByYW5nZUFycmF5Lmxlbmd0aDtpKyspIHsKICAgIG51bGwgPT0gcmFuZ2VBcnJheVtpXSA/IHJhbmdlQXJyYXlbaV0gPSByYW5nZUFycmF5W2kgLSAxXSArIDEgOiBvcHRfZGVsdGEgJiYgKHJhbmdlQXJyYXlbaV0gKz0gcmFuZ2VBcnJheVtpIC0gMV0pCiAgfQp9Owpnb29nLnN0cnVjdHMuSW52ZXJzaW9uTWFwLnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkSW52ZXJzaW9uTWFwJCRhdCQoaW50S2V5KSB7CiAgdmFyIGluZGV4ID0gdGhpcy5nZXRMZWFzdChpbnRLZXkpOwogIHJldHVybiAwID4gaW5kZXggPyBudWxsIDogdGhpcy52YWx1ZXNbaW5kZXhdCn07Cmdvb2cuc3RydWN0cy5JbnZlcnNpb25NYXAucHJvdG90eXBlLmdldExlYXN0ID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRJbnZlcnNpb25NYXAkJGdldExlYXN0JChpbnRLZXkpIHsKICBmb3IodmFyIGFyciA9IHRoaXMucmFuZ2VBcnJheSwgbG93ID0gMCwgaGlnaCA9IGFyci5sZW5ndGg7OCA8IGhpZ2ggLSBsb3c7KSB7CiAgICB2YXIgbWlkID0gaGlnaCArIGxvdyA+PiAxOwogICAgYXJyW21pZF0gPD0gaW50S2V5ID8gbG93ID0gbWlkIDogaGlnaCA9IG1pZAogIH0KICBmb3IoO2xvdyA8IGhpZ2ggJiYgIShpbnRLZXkgPCBhcnJbbG93XSk7Kytsb3cpIHsKICB9CiAgcmV0dXJuIGxvdyAtIDEKfTsKZ29vZy5pMThuLkdyYXBoZW1lQnJlYWsgPSB7fTsKZ29vZy5pMThuLkdyYXBoZW1lQnJlYWsucHJvcGVydHkgPSB7QU5ZOjAsIENPTlRST0w6MSwgRVhURU5EOjIsIFBSRVBFTkQ6MywgU1BBQ0lOR19NQVJLOjQsIEw6NSwgVjo2LCBUOjcsIExWOjgsIExWVDo5LCBDUjoxMCwgTEY6MTF9Owpnb29nLmkxOG4uR3JhcGhlbWVCcmVhay5pbnZlcnNpb25zXyA9IG51bGw7Cmdvb2cuaTE4bi5HcmFwaGVtZUJyZWFrLmFwcGx5TGVnYWN5QnJlYWtSdWxlc18gPSBmdW5jdGlvbiAkZ29vZyRpMThuJEdyYXBoZW1lQnJlYWskYXBwbHlMZWdhY3lCcmVha1J1bGVzXyQocHJvcF9hLCBwcm9wX2IpIHsKICB2YXIgcHJvcCA9IGdvb2cuaTE4bi5HcmFwaGVtZUJyZWFrLnByb3BlcnR5OwogIHJldHVybiBwcm9wX2EgPT0gcHJvcC5DUiAmJiBwcm9wX2IgPT0gcHJvcC5MRiA/ICExIDogcHJvcF9hID09IHByb3AuQ09OVFJPTCB8fCBwcm9wX2EgPT0gcHJvcC5DUiB8fCBwcm9wX2EgPT0gcHJvcC5MRiB8fCBwcm9wX2IgPT0gcHJvcC5DT05UUk9MIHx8IHByb3BfYiA9PSBwcm9wLkNSIHx8IHByb3BfYiA9PSBwcm9wLkxGID8gITAgOiBwcm9wX2EgPT0gcHJvcC5MICYmIChwcm9wX2IgPT0gcHJvcC5MIHx8IHByb3BfYiA9PSBwcm9wLlYgfHwgcHJvcF9iID09IHByb3AuTFYgfHwgcHJvcF9iID09IHByb3AuTFZUKSB8fCAocHJvcF9hID09IHByb3AuTFYgfHwgcHJvcF9hID09IHByb3AuVikgJiYgKHByb3BfYiA9PSBwcm9wLlYgfHwgcHJvcF9iID09IHByb3AuVCkgfHwgKHByb3BfYSA9PSBwcm9wLkxWVCB8fCBwcm9wX2EgPT0gcHJvcC5UKSAmJiBwcm9wX2IgPT0gcHJvcC5UIHx8IHByb3BfYiA9PSBwcm9wLkVYVEVORCA/ICExIDogITAKfTsKZ29vZy5pMThuLkdyYXBoZW1lQnJlYWsuZ2V0QnJlYWtQcm9wXyA9IGZ1bmN0aW9uICRnb29nJGkxOG4kR3JhcGhlbWVCcmVhayRnZXRCcmVha1Byb3BfJChhY29kZSkgewogIGlmKDQ0MDMyIDw9IGFjb2RlICYmIDU1MjAzID49IGFjb2RlKSB7CiAgICB2YXIgcHJvcCA9IGdvb2cuaTE4bi5HcmFwaGVtZUJyZWFrLnByb3BlcnR5OwogICAgcmV0dXJuIDE2ID09IGFjb2RlICUgMjggPyBwcm9wLkxWIDogcHJvcC5MVlQKICB9CiAgZ29vZy5pMThuLkdyYXBoZW1lQnJlYWsuaW52ZXJzaW9uc18gfHwgKGdvb2cuaTE4bi5HcmFwaGVtZUJyZWFrLmludmVyc2lvbnNfID0gbmV3IGdvb2cuc3RydWN0cy5JbnZlcnNpb25NYXAoWzAsIDEwLCAxLCAyLCAxLCAxOCwgOTUsIDMzLCAxMywgMSwgNTk0LCAxMTIsIDI3NSwgNywgMjYzLCA0NSwgMSwgMSwgMSwgMiwgMSwgMiwgMSwgMSwgNTYsIDQsIDEyLCAxMSwgNDgsIDIwLCAxNywgMSwgMTAxLCA3LCAxLCA3LCAyLCAyLCAxLCA0LCAzMywgMSwgMSwgMSwgMzAsIDI3LCA5MSwgMTEsIDU4LCA5LCAyNjksIDIsIDEsIDU2LCAxLCAxLCAzLCA4LCA0LCAxLCAzLCA0LCAxMywgMiwgMjksIDEsIDIsIDU2LCAxLCAxLCAxLCAyLCA2LCA2LCAxLCA5LCAxLCAxMCwgMiwgMjksIDIsIDEsIDU2LCAyLCAzLCAxNywgMzAsIDIsIDMsIDE0LCAxLCA1NiwgMSwgMSwgMywgOCwgNCwgMSwgMjAsIDIsIDI5LCAxLCAyLCA1NiwgMSwgMSwgMiwgMSwgNiwgNiwgMTEsIDEwLCAyLCAzMCwgMSwgCiAgNTksIDEsIDEsIDEsIDEyLCAxLCA5LCAxLCA0MSwgMywgNTgsIDMsIDUsIDE3LCAxMSwgMiwgMzAsIDIsIDU2LCAxLCAxLCAxLCAxLCAyLCAxLCAzLCAxLCA1LCAxMSwgMTEsIDIsIDMwLCAyLCA1OCwgMSwgMiwgNSwgNywgMTEsIDEwLCAyLCAzMCwgMiwgNzAsIDYsIDIsIDYsIDcsIDE5LCAyLCA2MCwgMTEsIDUsIDUsIDEsIDEsIDgsIDk3LCAxMywgMywgNSwgMywgNiwgNzQsIDIsIDI3LCAxLCAxLCAxLCAxLCAxLCA0LCAyLCA0OSwgMTQsIDEsIDUsIDEsIDIsIDgsIDQ1LCA5LCAxLCAxMDAsIDIsIDQsIDEsIDYsIDEsIDIsIDIsIDIsIDIzLCAyLCAyLCA0LCAzLCAxLCAzLCAyLCA3LCAzLCA0LCAxMywgMSwgMiwgMiwgNiwgMSwgMSwgMSwgMTEyLCA5NiwgNzIsIDgyLCAzNTcsIDEsIDk0NiwgMywgMjksIDMsIDI5LCAyLCAzMCwgMiwgNjQsIDIsIDEsIDcsIDgsIDEsIDIsIDExLCA5LCAxLCA0NSwgMywgMTU1LCAxLCAxMTgsIDMsIDQsIDIsIDksIDEsIDYsIDMsIDExNiwgMTcsIAogIDcsIDIsIDc3LCAyLCAzLCAyMjgsIDQsIDEsIDQ3LCAxLCAxLCA1LCAxLCAxLCA1LCAxLCAyLCAzOCwgOSwgMTIsIDIsIDEsIDMwLCAxLCA0LCAyLCAyLCAxLCAxMjEsIDgsIDgsIDIsIDIsIDM5MiwgNjQsIDUyMywgMSwgMiwgMiwgMjQsIDcsIDQ5LCAxNiwgOTYsIDMzLCAzMzExLCAzMiwgNTU0LCA2LCAxMDUsIDIsIDMwMTY0LCA0LCA5LCAyLCAzODgsIDEsIDMsIDEsIDQsIDEsIDIzLCAyLCAyLCAxLCA4OCwgMiwgNTAsIDE2LCAxLCA5NywgOCwgMjUsIDExLCAyLCAyMTMsIDYsIDIsIDIsIDIsIDIsIDEyLCAxLCA4LCAxLCAxLCA0MzQsIDExMTcyLCAxMTE2LCAxMDI0LCA2OTQyLCAxLCA3MzcsIDE2LCAxNiwgNywgMjE2LCAxLCAxNTgsIDIsIDg5LCAzLCA1MTMsIDEsIDIwNTEsIDE1LCA0MCwgOCwgNTA5ODEsIDEsIDEsIDMsIDMsIDEsIDUsIDgsIDgsIDIsIDcsIDMwLCA0LCAxNDgsIDMsIDc5ODE0MCwgMjU1XSwgWzEsIDExLCAxLCAxMCwgMSwgMCwgMSwgMCwgMSwgMCwgMiwgCiAgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMSwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMSwgMiwgMCwgMiwgMCwgMiwgMCwgMSwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgNCwgMCwgMiwgMCwgNCwgMiwgNCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgNCwgMCwgMiwgMCwgMiwgNCwgMiwgNCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgNCwgMCwgMiwgNCwgMiwgMCwgMiwgMCwgMiwgNCwgMCwgMiwgMCwgNCwgMiwgNCwgMiwgMCwgMiwgMCwgMiwgNCwgMCwgMiwgMCwgMiwgNCwgMiwgNCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgNCwgMiwgNCwgMiwgMCwgMiwgMCwgNCwgMCwgMiwgNCwgMiwgMCwgMiwgMCwgNCwgMCwgMiwgMCwgNCwgMiwgNCwgMiwgNCwgMiwgNCwgMiwgMCwgMiwgMCwgNCwgMCwgMiwgNCwgMiwgNCwgMiwgMCwgMiwgMCwgNCwgMCwgMiwgNCwgMiwgNCwgMiwgNCwgMCwgMiwgMCwgMywgMiwgMCwgMiwgMCwgMiwgMCwgMywgMCwgMiwgMCwgCiAgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgNCwgMCwgMiwgNCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgNCwgMiwgNCwgMiwgNCwgMiwgNCwgMiwgMCwgNCwgMiwgMCwgMiwgMCwgNCwgMCwgNCwgMCwgMiwgMCwgMiwgNCwgMiwgNCwgMiwgMCwgNCwgMCwgNSwgNiwgNywgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMSwgNCwgMiwgNCwgMiwgNCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgNCwgMiwgNCwgMiwgNCwgMiwgMCwgNCwgMCwgNCwgMCwgMiwgNCwgMCwgMiwgNCwgMCwgMiwgNCwgMiwgNCwgMiwgNCwgMiwgNCwgMCwgMiwgMCwgMiwgNCwgMCwgNCwgMiwgNCwgMiwgNCwgMCwgNCwgMiwgNCwgMiwgMCwgMiwgMCwgMSwgMiwgMSwgMCwgMSwgMCwgMSwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgNCwgMiwgNCwgMCwgNCwgMCwgNCwgMiwgMCwgMiwgMCwgMiwgNCwgMCwgMiwgNCwgMiwgNCwgMiwgMCwgCiAgMiwgMCwgMiwgNCwgMCwgOSwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgNCwgMiwgMCwgNCwgMiwgMSwgMiwgMCwgMiwgMCwgMiwgMCwgMiwgMCwgMSwgMl0sICEwKSk7CiAgcmV0dXJuIGdvb2cuaTE4bi5HcmFwaGVtZUJyZWFrLmludmVyc2lvbnNfLmF0KGFjb2RlKQp9Owpnb29nLmkxOG4uR3JhcGhlbWVCcmVhay5oYXNHcmFwaGVtZUJyZWFrID0gZnVuY3Rpb24gJGdvb2ckaTE4biRHcmFwaGVtZUJyZWFrJGhhc0dyYXBoZW1lQnJlYWskKGEsIGIsIG9wdF9leHRlbmRlZCkgewogIHZhciBwcm9wX2EgPSBnb29nLmkxOG4uR3JhcGhlbWVCcmVhay5nZXRCcmVha1Byb3BfKGEpLCBwcm9wX2IgPSBnb29nLmkxOG4uR3JhcGhlbWVCcmVhay5nZXRCcmVha1Byb3BfKGIpLCBwcm9wID0gZ29vZy5pMThuLkdyYXBoZW1lQnJlYWsucHJvcGVydHk7CiAgcmV0dXJuIGdvb2cuaTE4bi5HcmFwaGVtZUJyZWFrLmFwcGx5TGVnYWN5QnJlYWtSdWxlc18ocHJvcF9hLCBwcm9wX2IpICYmICEob3B0X2V4dGVuZGVkICYmIChwcm9wX2EgPT0gcHJvcC5QUkVQRU5EIHx8IHByb3BfYiA9PSBwcm9wLlNQQUNJTkdfTUFSSykpCn07Cmdvb2cuZm9ybWF0ID0ge307Cmdvb2cuZm9ybWF0LmZpbGVTaXplID0gZnVuY3Rpb24gJGdvb2ckZm9ybWF0JGZpbGVTaXplJChieXRlcywgb3B0X2RlY2ltYWxzKSB7CiAgcmV0dXJuIGdvb2cuZm9ybWF0Lm51bUJ5dGVzVG9TdHJpbmcoYnl0ZXMsIG9wdF9kZWNpbWFscywgITEpCn07Cmdvb2cuZm9ybWF0LmlzQ29udmVydGFibGVTY2FsZWROdW1iZXIgPSBmdW5jdGlvbiAkZ29vZyRmb3JtYXQkaXNDb252ZXJ0YWJsZVNjYWxlZE51bWJlciQodmFsKSB7CiAgcmV0dXJuIGdvb2cuZm9ybWF0LlNDQUxFRF9OVU1FUklDX1JFXy50ZXN0KHZhbCkKfTsKZ29vZy5mb3JtYXQuc3RyaW5nVG9OdW1lcmljVmFsdWUgPSBmdW5jdGlvbiAkZ29vZyRmb3JtYXQkc3RyaW5nVG9OdW1lcmljVmFsdWUkKHN0cmluZ1ZhbHVlKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLmVuZHNXaXRoKHN0cmluZ1ZhbHVlLCAiQiIpID8gZ29vZy5mb3JtYXQuc3RyaW5nVG9OdW1lcmljVmFsdWVfKHN0cmluZ1ZhbHVlLCBnb29nLmZvcm1hdC5OVU1FUklDX1NDQUxFU19CSU5BUllfKSA6IGdvb2cuZm9ybWF0LnN0cmluZ1RvTnVtZXJpY1ZhbHVlXyhzdHJpbmdWYWx1ZSwgZ29vZy5mb3JtYXQuTlVNRVJJQ19TQ0FMRVNfU0lfKQp9Owpnb29nLmZvcm1hdC5zdHJpbmdUb051bUJ5dGVzID0gZnVuY3Rpb24gJGdvb2ckZm9ybWF0JHN0cmluZ1RvTnVtQnl0ZXMkKHN0cmluZ1ZhbHVlKSB7CiAgcmV0dXJuIGdvb2cuZm9ybWF0LnN0cmluZ1RvTnVtZXJpY1ZhbHVlXyhzdHJpbmdWYWx1ZSwgZ29vZy5mb3JtYXQuTlVNRVJJQ19TQ0FMRVNfQklOQVJZXykKfTsKZ29vZy5mb3JtYXQubnVtZXJpY1ZhbHVlVG9TdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRmb3JtYXQkbnVtZXJpY1ZhbHVlVG9TdHJpbmckKHZhbCwgb3B0X2RlY2ltYWxzKSB7CiAgcmV0dXJuIGdvb2cuZm9ybWF0Lm51bWVyaWNWYWx1ZVRvU3RyaW5nXyh2YWwsIGdvb2cuZm9ybWF0Lk5VTUVSSUNfU0NBTEVTX1NJXywgb3B0X2RlY2ltYWxzKQp9Owpnb29nLmZvcm1hdC5udW1CeXRlc1RvU3RyaW5nID0gZnVuY3Rpb24gJGdvb2ckZm9ybWF0JG51bUJ5dGVzVG9TdHJpbmckKHZhbCwgb3B0X2RlY2ltYWxzLCBvcHRfc3VmZml4KSB7CiAgdmFyIHN1ZmZpeCA9ICIiOwogIGlmKCFnb29nLmlzRGVmKG9wdF9zdWZmaXgpIHx8IG9wdF9zdWZmaXgpIHsKICAgIHN1ZmZpeCA9ICJCIgogIH0KICByZXR1cm4gZ29vZy5mb3JtYXQubnVtZXJpY1ZhbHVlVG9TdHJpbmdfKHZhbCwgZ29vZy5mb3JtYXQuTlVNRVJJQ19TQ0FMRVNfQklOQVJZXywgb3B0X2RlY2ltYWxzLCBzdWZmaXgpCn07Cmdvb2cuZm9ybWF0LnN0cmluZ1RvTnVtZXJpY1ZhbHVlXyA9IGZ1bmN0aW9uICRnb29nJGZvcm1hdCRzdHJpbmdUb051bWVyaWNWYWx1ZV8kKHN0cmluZ1ZhbHVlLCBjb252ZXJzaW9uKSB7CiAgdmFyIG1hdGNoID0gc3RyaW5nVmFsdWUubWF0Y2goZ29vZy5mb3JtYXQuU0NBTEVEX05VTUVSSUNfUkVfKTsKICBpZighbWF0Y2gpIHsKICAgIHJldHVybiBOYU4KICB9CiAgdmFyIHZhbCA9IG1hdGNoWzFdICogY29udmVyc2lvblttYXRjaFsyXV07CiAgcmV0dXJuIHZhbAp9Owpnb29nLmZvcm1hdC5udW1lcmljVmFsdWVUb1N0cmluZ18gPSBmdW5jdGlvbiAkZ29vZyRmb3JtYXQkbnVtZXJpY1ZhbHVlVG9TdHJpbmdfJCh2YWwsIGNvbnZlcnNpb24sIG9wdF9kZWNpbWFscywgb3B0X3N1ZmZpeCkgewogIHZhciBwcmVmaXhlcyA9IGdvb2cuZm9ybWF0Lk5VTUVSSUNfU0NBTEVfUFJFRklYRVNfLCBvcmlnX3ZhbCA9IHZhbCwgc3ltYm9sID0gIiIsIHNjYWxlID0gMTsKICAwID4gdmFsICYmICh2YWwgPSAtdmFsKTsKICBmb3IodmFyIGkgPSAwO2kgPCBwcmVmaXhlcy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgdW5pdCA9IHByZWZpeGVzW2ldLCBzY2FsZSA9IGNvbnZlcnNpb25bdW5pdF07CiAgICBpZih2YWwgPj0gc2NhbGUgfHwgMSA+PSBzY2FsZSAmJiB2YWwgPiAwLjEgKiBzY2FsZSkgewogICAgICBzeW1ib2wgPSB1bml0OwogICAgICBicmVhawogICAgfQogIH0KICBzeW1ib2wgPyBvcHRfc3VmZml4ICYmIChzeW1ib2wgKz0gb3B0X3N1ZmZpeCkgOiBzY2FsZSA9IDE7CiAgdmFyIGV4ID0gTWF0aC5wb3coMTAsIGdvb2cuaXNEZWYob3B0X2RlY2ltYWxzKSA/IG9wdF9kZWNpbWFscyA6IDIpOwogIHJldHVybiBNYXRoLnJvdW5kKG9yaWdfdmFsIC8gc2NhbGUgKiBleCkgLyBleCArIHN5bWJvbAp9Owpnb29nLmZvcm1hdC5TQ0FMRURfTlVNRVJJQ19SRV8gPSAvXihbLV0/XGQrXC4/XGQqKShbSyxNLEcsVCxQLGssbSx1LG5dPylbQl0/JC87Cmdvb2cuZm9ybWF0Lk5VTUVSSUNfU0NBTEVfUFJFRklYRVNfID0gIlAsVCxHLE0sSywsbSx1LG4iLnNwbGl0KCIsIik7Cmdvb2cuZm9ybWF0Lk5VTUVSSUNfU0NBTEVTX1NJXyA9IHsiIjoxLCBuOjEuMEUtOSwgdToxLjBFLTYsIG06MC4wMDEsIGs6MUUzLCBLOjFFMywgTToxRTYsIEc6MUU5LCBUOjFFMTIsIFA6MUUxNX07Cmdvb2cuZm9ybWF0Lk5VTUVSSUNfU0NBTEVTX0JJTkFSWV8gPSB7IiI6MSwgbjpNYXRoLnBvdygxMDI0LCAtMyksIHU6TWF0aC5wb3coMTAyNCwgLTIpLCBtOjEgLyAxMDI0LCBrOjEwMjQsIEs6MTAyNCwgTTpNYXRoLnBvdygxMDI0LCAyKSwgRzpNYXRoLnBvdygxMDI0LCAzKSwgVDpNYXRoLnBvdygxMDI0LCA0KSwgUDpNYXRoLnBvdygxMDI0LCA1KX07Cmdvb2cuZm9ybWF0LkZJUlNUX0dSQVBIRU1FX0VYVEVORF8gPSA3Njg7Cmdvb2cuZm9ybWF0Lmluc2VydFdvcmRCcmVha3NHZW5lcmljXyA9IGZ1bmN0aW9uICRnb29nJGZvcm1hdCRpbnNlcnRXb3JkQnJlYWtzR2VuZXJpY18kKHN0ciwgaGFzR3JhcGhlbWVCcmVhaywgb3B0X21heGxlbikgewogIHZhciBtYXhsZW4gPSBvcHRfbWF4bGVuIHx8IDEwOwogIGlmKG1heGxlbiA+IHN0ci5sZW5ndGgpIHsKICAgIHJldHVybiBzdHIKICB9CiAgZm9yKHZhciBydiA9IFtdLCBuID0gMCwgbmVzdGluZ0NoYXJDb2RlID0gMCwgbGFzdER1bXBQb3NpdGlvbiA9IDAsIGNoYXJDb2RlID0gMCwgaSA9IDA7aSA8IHN0ci5sZW5ndGg7aSsrKSB7CiAgICB2YXIgbGFzdENoYXJDb2RlID0gY2hhckNvZGUsIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSksIGlzUG90ZW50aWFsbHlHcmFwaGVtZUV4dGVuZGluZyA9IGNoYXJDb2RlID49IGdvb2cuZm9ybWF0LkZJUlNUX0dSQVBIRU1FX0VYVEVORF8gJiYgIWhhc0dyYXBoZW1lQnJlYWsobGFzdENoYXJDb2RlLCBjaGFyQ29kZSwgITApOwogICAgbiA+PSBtYXhsZW4gJiYgY2hhckNvZGUgPiBnb29nLmZvcm1hdC5XYnJUb2tlbl8uU1BBQ0UgJiYgIWlzUG90ZW50aWFsbHlHcmFwaGVtZUV4dGVuZGluZyAmJiAocnYucHVzaChzdHIuc3Vic3RyaW5nKGxhc3REdW1wUG9zaXRpb24sIGkpLCBnb29nLmZvcm1hdC5XT1JEX0JSRUFLX0hUTUwpLCBsYXN0RHVtcFBvc2l0aW9uID0gaSwgbiA9IDApOwogICAgbmVzdGluZ0NoYXJDb2RlID8gY2hhckNvZGUgPT0gZ29vZy5mb3JtYXQuV2JyVG9rZW5fLkdUICYmIG5lc3RpbmdDaGFyQ29kZSA9PSBnb29nLmZvcm1hdC5XYnJUb2tlbl8uTFQgPyBuZXN0aW5nQ2hhckNvZGUgPSAwIDogY2hhckNvZGUgPT0gZ29vZy5mb3JtYXQuV2JyVG9rZW5fLlNFTUlfQ09MT04gJiYgbmVzdGluZ0NoYXJDb2RlID09IGdvb2cuZm9ybWF0LldiclRva2VuXy5BTVAgJiYgKG5lc3RpbmdDaGFyQ29kZSA9IDAsIG4rKykgOiBjaGFyQ29kZSA9PSBnb29nLmZvcm1hdC5XYnJUb2tlbl8uTFQgfHwgY2hhckNvZGUgPT0gZ29vZy5mb3JtYXQuV2JyVG9rZW5fLkFNUCA/IG5lc3RpbmdDaGFyQ29kZSA9IGNoYXJDb2RlIDogY2hhckNvZGUgPD0gZ29vZy5mb3JtYXQuV2JyVG9rZW5fLlNQQUNFID8gbiA9IDAgOiBuKysKICB9CiAgcnYucHVzaChzdHIuc3Vic3RyKGxhc3REdW1wUG9zaXRpb24pKTsKICByZXR1cm4gcnYuam9pbigiIikKfTsKZ29vZy5mb3JtYXQuaW5zZXJ0V29yZEJyZWFrcyA9IGZ1bmN0aW9uICRnb29nJGZvcm1hdCRpbnNlcnRXb3JkQnJlYWtzJChzdHIsIG9wdF9tYXhsZW4pIHsKICByZXR1cm4gZ29vZy5mb3JtYXQuaW5zZXJ0V29yZEJyZWFrc0dlbmVyaWNfKHN0ciwgZ29vZy5pMThuLkdyYXBoZW1lQnJlYWsuaGFzR3JhcGhlbWVCcmVhaywgb3B0X21heGxlbikKfTsKZ29vZy5mb3JtYXQuY29uc2VydmF0aXZlbHlIYXNHcmFwaGVtZUJyZWFrXyA9IGZ1bmN0aW9uICRnb29nJGZvcm1hdCRjb25zZXJ2YXRpdmVseUhhc0dyYXBoZW1lQnJlYWtfJChsYXN0Q2hhckNvZGUsIGNoYXJDb2RlKSB7CiAgcmV0dXJuIDEwMjQgPD0gY2hhckNvZGUgJiYgMTMxNSA+IGNoYXJDb2RlCn07Cmdvb2cuZm9ybWF0Lmluc2VydFdvcmRCcmVha3NCYXNpYyA9IGZ1bmN0aW9uICRnb29nJGZvcm1hdCRpbnNlcnRXb3JkQnJlYWtzQmFzaWMkKHN0ciwgb3B0X21heGxlbikgewogIHJldHVybiBnb29nLmZvcm1hdC5pbnNlcnRXb3JkQnJlYWtzR2VuZXJpY18oc3RyLCBnb29nLmZvcm1hdC5jb25zZXJ2YXRpdmVseUhhc0dyYXBoZW1lQnJlYWtfLCBvcHRfbWF4bGVuKQp9Owpnb29nLmZvcm1hdC5JU19JRThfT1JfQUJPVkVfID0gZ29vZy51c2VyQWdlbnQuSUUgJiYgZ29vZy51c2VyQWdlbnQuaXNWZXJzaW9uKDgpOwpnb29nLmZvcm1hdC5XT1JEX0JSRUFLX0hUTUwgPSBnb29nLnVzZXJBZ2VudC5XRUJLSVQgPyAiPHdicj48L3dicj4iIDogZ29vZy51c2VyQWdlbnQuT1BFUkEgPyAiJnNoeTsiIDogZ29vZy5mb3JtYXQuSVNfSUU4X09SX0FCT1ZFXyA/ICImIzgyMDM7IiA6ICI8d2JyPiI7Cmdvb2cuZm9ybWF0LldiclRva2VuXyA9IHtMVDo2MCwgR1Q6NjIsIEFNUDozOCwgU0VNSV9DT0xPTjo1OSwgU1BBQ0U6MzJ9Owpnb29nLmkxOG4uYmlkaSA9IHt9Owpnb29nLmkxOG4uYmlkaS5GT1JDRV9SVEwgPSAhMTsKZ29vZy5pMThuLmJpZGkuSVNfUlRMID0gZ29vZy5pMThuLmJpZGkuRk9SQ0VfUlRMIHx8ICgiYXIiID09IGdvb2cuTE9DQUxFLnN1YnN0cmluZygwLCAyKS50b0xvd2VyQ2FzZSgpIHx8ICJmYSIgPT0gZ29vZy5MT0NBTEUuc3Vic3RyaW5nKDAsIDIpLnRvTG93ZXJDYXNlKCkgfHwgImhlIiA9PSBnb29nLkxPQ0FMRS5zdWJzdHJpbmcoMCwgMikudG9Mb3dlckNhc2UoKSB8fCAiaXciID09IGdvb2cuTE9DQUxFLnN1YnN0cmluZygwLCAyKS50b0xvd2VyQ2FzZSgpIHx8ICJ1ciIgPT0gZ29vZy5MT0NBTEUuc3Vic3RyaW5nKDAsIDIpLnRvTG93ZXJDYXNlKCkgfHwgInlpIiA9PSBnb29nLkxPQ0FMRS5zdWJzdHJpbmcoMCwgMikudG9Mb3dlckNhc2UoKSkgJiYgKDIgPT0gZ29vZy5MT0NBTEUubGVuZ3RoIHx8ICItIiA9PSBnb29nLkxPQ0FMRS5zdWJzdHJpbmcoMiwgMykgfHwgIl8iID09IGdvb2cuTE9DQUxFLnN1YnN0cmluZygyLCAzKSk7Cmdvb2cuaTE4bi5iaWRpLkZvcm1hdCA9IHtMUkU6Ilx1MjAyYSIsIFJMRToiXHUyMDJiIiwgUERGOiJcdTIwMmMiLCBMUk06Ilx1MjAwZSIsIFJMTToiXHUyMDBmIn07Cmdvb2cuaTE4bi5iaWRpLkRpciA9IHtSVEw6LTEsIFVOS05PV046MCwgTFRSOjF9Owpnb29nLmkxOG4uYmlkaS5SSUdIVCA9ICJyaWdodCI7Cmdvb2cuaTE4bi5iaWRpLkxFRlQgPSAibGVmdCI7Cmdvb2cuaTE4bi5iaWRpLkkxOE5fUklHSFQgPSBnb29nLmkxOG4uYmlkaS5JU19SVEwgPyBnb29nLmkxOG4uYmlkaS5MRUZUIDogZ29vZy5pMThuLmJpZGkuUklHSFQ7Cmdvb2cuaTE4bi5iaWRpLkkxOE5fTEVGVCA9IGdvb2cuaTE4bi5iaWRpLklTX1JUTCA/IGdvb2cuaTE4bi5iaWRpLlJJR0hUIDogZ29vZy5pMThuLmJpZGkuTEVGVDsKZ29vZy5pMThuLmJpZGkudG9EaXIgPSBmdW5jdGlvbiAkZ29vZyRpMThuJGJpZGkkdG9EaXIkKGdpdmVuRGlyKSB7CiAgcmV0dXJuIm51bWJlciIgPT0gdHlwZW9mIGdpdmVuRGlyID8gMCA8IGdpdmVuRGlyID8gZ29vZy5pMThuLmJpZGkuRGlyLkxUUiA6IDAgPiBnaXZlbkRpciA/IGdvb2cuaTE4bi5iaWRpLkRpci5SVEwgOiBnb29nLmkxOG4uYmlkaS5EaXIuVU5LTk9XTiA6IGdpdmVuRGlyID8gZ29vZy5pMThuLmJpZGkuRGlyLlJUTCA6IGdvb2cuaTE4bi5iaWRpLkRpci5MVFIKfTsKZ29vZy5pMThuLmJpZGkubHRyQ2hhcnNfID0gIkEtWmEtelx1MDBjMC1cdTAwZDZcdTAwZDgtXHUwMGY2XHUwMGY4LVx1MDJiOFx1MDMwMC1cdTA1OTBcdTA4MDAtXHUxZmZmXHUyYzAwLVx1ZmIxY1x1ZmUwMC1cdWZlNmZcdWZlZmQtXHVmZmZmIjsKZ29vZy5pMThuLmJpZGkucnRsQ2hhcnNfID0gIlx1MDU5MS1cdTA3ZmZcdWZiMWQtXHVmZGZmXHVmZTcwLVx1ZmVmYyI7Cmdvb2cuaTE4bi5iaWRpLmh0bWxTa2lwUmVnXyA9IC88W14+XSo+fCZbXjtdKzsvZzsKZ29vZy5pMThuLmJpZGkuc3RyaXBIdG1sSWZOZWVkZWRfID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJHN0cmlwSHRtbElmTmVlZGVkXyQoc3RyLCBvcHRfaXNTdHJpcE5lZWRlZCkgewogIHJldHVybiBvcHRfaXNTdHJpcE5lZWRlZCA/IHN0ci5yZXBsYWNlKGdvb2cuaTE4bi5iaWRpLmh0bWxTa2lwUmVnXywgIiAiKSA6IHN0cgp9Owpnb29nLmkxOG4uYmlkaS5ydGxDaGFyUmVnXyA9IFJlZ0V4cCgiWyIgKyBnb29nLmkxOG4uYmlkaS5ydGxDaGFyc18gKyAiXSIpOwpnb29nLmkxOG4uYmlkaS5sdHJDaGFyUmVnXyA9IFJlZ0V4cCgiWyIgKyBnb29nLmkxOG4uYmlkaS5sdHJDaGFyc18gKyAiXSIpOwpnb29nLmkxOG4uYmlkaS5oYXNBbnlSdGwgPSBmdW5jdGlvbiAkZ29vZyRpMThuJGJpZGkkaGFzQW55UnRsJChzdHIsIG9wdF9pc0h0bWwpIHsKICByZXR1cm4gZ29vZy5pMThuLmJpZGkucnRsQ2hhclJlZ18udGVzdChnb29nLmkxOG4uYmlkaS5zdHJpcEh0bWxJZk5lZWRlZF8oc3RyLCBvcHRfaXNIdG1sKSkKfTsKZ29vZy5pMThuLmJpZGkuaGFzUnRsQ2hhciA9IGdvb2cuaTE4bi5iaWRpLmhhc0FueVJ0bDsKZ29vZy5pMThuLmJpZGkuaGFzQW55THRyID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJGhhc0FueUx0ciQoc3RyLCBvcHRfaXNIdG1sKSB7CiAgcmV0dXJuIGdvb2cuaTE4bi5iaWRpLmx0ckNoYXJSZWdfLnRlc3QoZ29vZy5pMThuLmJpZGkuc3RyaXBIdG1sSWZOZWVkZWRfKHN0ciwgb3B0X2lzSHRtbCkpCn07Cmdvb2cuaTE4bi5iaWRpLmx0clJlXyA9IFJlZ0V4cCgiXlsiICsgZ29vZy5pMThuLmJpZGkubHRyQ2hhcnNfICsgIl0iKTsKZ29vZy5pMThuLmJpZGkucnRsUmVfID0gUmVnRXhwKCJeWyIgKyBnb29nLmkxOG4uYmlkaS5ydGxDaGFyc18gKyAiXSIpOwpnb29nLmkxOG4uYmlkaS5pc1J0bENoYXIgPSBmdW5jdGlvbiAkZ29vZyRpMThuJGJpZGkkaXNSdGxDaGFyJChzdHIpIHsKICByZXR1cm4gZ29vZy5pMThuLmJpZGkucnRsUmVfLnRlc3Qoc3RyKQp9Owpnb29nLmkxOG4uYmlkaS5pc0x0ckNoYXIgPSBmdW5jdGlvbiAkZ29vZyRpMThuJGJpZGkkaXNMdHJDaGFyJChzdHIpIHsKICByZXR1cm4gZ29vZy5pMThuLmJpZGkubHRyUmVfLnRlc3Qoc3RyKQp9Owpnb29nLmkxOG4uYmlkaS5pc05ldXRyYWxDaGFyID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJGlzTmV1dHJhbENoYXIkKHN0cikgewogIHJldHVybiFnb29nLmkxOG4uYmlkaS5pc0x0ckNoYXIoc3RyKSAmJiAhZ29vZy5pMThuLmJpZGkuaXNSdGxDaGFyKHN0cikKfTsKZ29vZy5pMThuLmJpZGkubHRyRGlyQ2hlY2tSZV8gPSBSZWdFeHAoIl5bXiIgKyBnb29nLmkxOG4uYmlkaS5ydGxDaGFyc18gKyAiXSpbIiArIGdvb2cuaTE4bi5iaWRpLmx0ckNoYXJzXyArICJdIik7Cmdvb2cuaTE4bi5iaWRpLnJ0bERpckNoZWNrUmVfID0gUmVnRXhwKCJeW14iICsgZ29vZy5pMThuLmJpZGkubHRyQ2hhcnNfICsgIl0qWyIgKyBnb29nLmkxOG4uYmlkaS5ydGxDaGFyc18gKyAiXSIpOwpnb29nLmkxOG4uYmlkaS5zdGFydHNXaXRoUnRsID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJHN0YXJ0c1dpdGhSdGwkKHN0ciwgb3B0X2lzSHRtbCkgewogIHJldHVybiBnb29nLmkxOG4uYmlkaS5ydGxEaXJDaGVja1JlXy50ZXN0KGdvb2cuaTE4bi5iaWRpLnN0cmlwSHRtbElmTmVlZGVkXyhzdHIsIG9wdF9pc0h0bWwpKQp9Owpnb29nLmkxOG4uYmlkaS5pc1J0bFRleHQgPSBnb29nLmkxOG4uYmlkaS5zdGFydHNXaXRoUnRsOwpnb29nLmkxOG4uYmlkaS5zdGFydHNXaXRoTHRyID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJHN0YXJ0c1dpdGhMdHIkKHN0ciwgb3B0X2lzSHRtbCkgewogIHJldHVybiBnb29nLmkxOG4uYmlkaS5sdHJEaXJDaGVja1JlXy50ZXN0KGdvb2cuaTE4bi5iaWRpLnN0cmlwSHRtbElmTmVlZGVkXyhzdHIsIG9wdF9pc0h0bWwpKQp9Owpnb29nLmkxOG4uYmlkaS5pc0x0clRleHQgPSBnb29nLmkxOG4uYmlkaS5zdGFydHNXaXRoTHRyOwpnb29nLmkxOG4uYmlkaS5pc1JlcXVpcmVkTHRyUmVfID0gL15odHRwOlwvXC8uKi87Cmdvb2cuaTE4bi5iaWRpLmlzTmV1dHJhbFRleHQgPSBmdW5jdGlvbiAkZ29vZyRpMThuJGJpZGkkaXNOZXV0cmFsVGV4dCQoc3RyLCBvcHRfaXNIdG1sKSB7CiAgc3RyID0gZ29vZy5pMThuLmJpZGkuc3RyaXBIdG1sSWZOZWVkZWRfKHN0ciwgb3B0X2lzSHRtbCk7CiAgcmV0dXJuIGdvb2cuaTE4bi5iaWRpLmlzUmVxdWlyZWRMdHJSZV8udGVzdChzdHIpIHx8ICFnb29nLmkxOG4uYmlkaS5oYXNBbnlMdHIoc3RyKSAmJiAhZ29vZy5pMThuLmJpZGkuaGFzQW55UnRsKHN0cikKfTsKZ29vZy5pMThuLmJpZGkubHRyRXhpdERpckNoZWNrUmVfID0gUmVnRXhwKCJbIiArIGdvb2cuaTE4bi5iaWRpLmx0ckNoYXJzXyArICJdW14iICsgZ29vZy5pMThuLmJpZGkucnRsQ2hhcnNfICsgIl0qJCIpOwpnb29nLmkxOG4uYmlkaS5ydGxFeGl0RGlyQ2hlY2tSZV8gPSBSZWdFeHAoIlsiICsgZ29vZy5pMThuLmJpZGkucnRsQ2hhcnNfICsgIl1bXiIgKyBnb29nLmkxOG4uYmlkaS5sdHJDaGFyc18gKyAiXSokIik7Cmdvb2cuaTE4bi5iaWRpLmVuZHNXaXRoTHRyID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJGVuZHNXaXRoTHRyJChzdHIsIG9wdF9pc0h0bWwpIHsKICByZXR1cm4gZ29vZy5pMThuLmJpZGkubHRyRXhpdERpckNoZWNrUmVfLnRlc3QoZ29vZy5pMThuLmJpZGkuc3RyaXBIdG1sSWZOZWVkZWRfKHN0ciwgb3B0X2lzSHRtbCkpCn07Cmdvb2cuaTE4bi5iaWRpLmlzTHRyRXhpdFRleHQgPSBnb29nLmkxOG4uYmlkaS5lbmRzV2l0aEx0cjsKZ29vZy5pMThuLmJpZGkuZW5kc1dpdGhSdGwgPSBmdW5jdGlvbiAkZ29vZyRpMThuJGJpZGkkZW5kc1dpdGhSdGwkKHN0ciwgb3B0X2lzSHRtbCkgewogIHJldHVybiBnb29nLmkxOG4uYmlkaS5ydGxFeGl0RGlyQ2hlY2tSZV8udGVzdChnb29nLmkxOG4uYmlkaS5zdHJpcEh0bWxJZk5lZWRlZF8oc3RyLCBvcHRfaXNIdG1sKSkKfTsKZ29vZy5pMThuLmJpZGkuaXNSdGxFeGl0VGV4dCA9IGdvb2cuaTE4bi5iaWRpLmVuZHNXaXRoUnRsOwpnb29nLmkxOG4uYmlkaS5ydGxMb2NhbGVzUmVfID0gUmVnRXhwKCJeKGFyfGR2fGhlfGl3fGZhfG5xb3xwc3xzZHx1Z3x1cnx5aXwuKlstX10oQXJhYnxIZWJyfFRoYWF8Tmtvb3xUZm5nKSkoPyEuKlstX10oTGF0bnxDeXJsKSgkfC18XykpKCR8LXxfKSIpOwpnb29nLmkxOG4uYmlkaS5pc1J0bExhbmd1YWdlID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJGlzUnRsTGFuZ3VhZ2UkKGxhbmcpIHsKICByZXR1cm4gZ29vZy5pMThuLmJpZGkucnRsTG9jYWxlc1JlXy50ZXN0KGxhbmcpCn07Cmdvb2cuaTE4bi5iaWRpLmJyYWNrZXRHdWFyZEh0bWxSZV8gPSAvKFwoLio/XCkrKXwoXFsuKj9cXSspfChcey4qP1x9Kyl8KCZsdDsuKj8oJmd0OykrKS9nOwpnb29nLmkxOG4uYmlkaS5icmFja2V0R3VhcmRUZXh0UmVfID0gLyhcKC4qP1wpKyl8KFxbLio/XF0rKXwoXHsuKj9cfSspfCg8Lio/PispL2c7Cmdvb2cuaTE4bi5iaWRpLmd1YXJkQnJhY2tldEluSHRtbCA9IGZ1bmN0aW9uICRnb29nJGkxOG4kYmlkaSRndWFyZEJyYWNrZXRJbkh0bWwkKHMsIG9wdF9pc1J0bENvbnRleHQpIHsKICB2YXIgdXNlUnRsID0gdm9pZCAwID09PSBvcHRfaXNSdGxDb250ZXh0ID8gZ29vZy5pMThuLmJpZGkuaGFzQW55UnRsKHMpIDogb3B0X2lzUnRsQ29udGV4dDsKICByZXR1cm4gdXNlUnRsID8gcy5yZXBsYWNlKGdvb2cuaTE4bi5iaWRpLmJyYWNrZXRHdWFyZEh0bWxSZV8sICI8c3BhbiBkaXI9cnRsPiQmPC9zcGFuPiIpIDogcy5yZXBsYWNlKGdvb2cuaTE4bi5iaWRpLmJyYWNrZXRHdWFyZEh0bWxSZV8sICI8c3BhbiBkaXI9bHRyPiQmPC9zcGFuPiIpCn07Cmdvb2cuaTE4bi5iaWRpLmd1YXJkQnJhY2tldEluVGV4dCA9IGZ1bmN0aW9uICRnb29nJGkxOG4kYmlkaSRndWFyZEJyYWNrZXRJblRleHQkKHMsIG9wdF9pc1J0bENvbnRleHQpIHsKICB2YXIgdXNlUnRsID0gdm9pZCAwID09PSBvcHRfaXNSdGxDb250ZXh0ID8gZ29vZy5pMThuLmJpZGkuaGFzQW55UnRsKHMpIDogb3B0X2lzUnRsQ29udGV4dCwgbWFyayA9IHVzZVJ0bCA/IGdvb2cuaTE4bi5iaWRpLkZvcm1hdC5STE0gOiBnb29nLmkxOG4uYmlkaS5Gb3JtYXQuTFJNOwogIHJldHVybiBzLnJlcGxhY2UoZ29vZy5pMThuLmJpZGkuYnJhY2tldEd1YXJkVGV4dFJlXywgbWFyayArICIkJiIgKyBtYXJrKQp9Owpnb29nLmkxOG4uYmlkaS5lbmZvcmNlUnRsSW5IdG1sID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJGVuZm9yY2VSdGxJbkh0bWwkKGh0bWwpIHsKICByZXR1cm4iPCIgPT0gaHRtbC5jaGFyQXQoMCkgPyBodG1sLnJlcGxhY2UoLzxcdysvLCAiJCYgZGlyPXJ0bCIpIDogIlxuPHNwYW4gZGlyPXJ0bD4iICsgaHRtbCArICI8L3NwYW4+Igp9Owpnb29nLmkxOG4uYmlkaS5lbmZvcmNlUnRsSW5UZXh0ID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJGVuZm9yY2VSdGxJblRleHQkKHRleHQpIHsKICByZXR1cm4gZ29vZy5pMThuLmJpZGkuRm9ybWF0LlJMRSArIHRleHQgKyBnb29nLmkxOG4uYmlkaS5Gb3JtYXQuUERGCn07Cmdvb2cuaTE4bi5iaWRpLmVuZm9yY2VMdHJJbkh0bWwgPSBmdW5jdGlvbiAkZ29vZyRpMThuJGJpZGkkZW5mb3JjZUx0ckluSHRtbCQoaHRtbCkgewogIHJldHVybiI8IiA9PSBodG1sLmNoYXJBdCgwKSA/IGh0bWwucmVwbGFjZSgvPFx3Ky8sICIkJiBkaXI9bHRyIikgOiAiXG48c3BhbiBkaXI9bHRyPiIgKyBodG1sICsgIjwvc3Bhbj4iCn07Cmdvb2cuaTE4bi5iaWRpLmVuZm9yY2VMdHJJblRleHQgPSBmdW5jdGlvbiAkZ29vZyRpMThuJGJpZGkkZW5mb3JjZUx0ckluVGV4dCQodGV4dCkgewogIHJldHVybiBnb29nLmkxOG4uYmlkaS5Gb3JtYXQuTFJFICsgdGV4dCArIGdvb2cuaTE4bi5iaWRpLkZvcm1hdC5QREYKfTsKZ29vZy5pMThuLmJpZGkuZGltZW5zaW9uc1JlXyA9IC86XHMqKFsuXGRdWy5cd10qKVxzKyhbLlxkXVsuXHddKilccysoWy5cZF1bLlx3XSopXHMrKFsuXGRdWy5cd10qKS9nOwpnb29nLmkxOG4uYmlkaS5sZWZ0UmVfID0gL2xlZnQvZ2k7Cmdvb2cuaTE4bi5iaWRpLnJpZ2h0UmVfID0gL3JpZ2h0L2dpOwpnb29nLmkxOG4uYmlkaS50ZW1wUmVfID0gLyUlJSUvZzsKZ29vZy5pMThuLmJpZGkubWlycm9yQ1NTID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJG1pcnJvckNTUyQoY3NzU3RyKSB7CiAgcmV0dXJuIGNzc1N0ci5yZXBsYWNlKGdvb2cuaTE4bi5iaWRpLmRpbWVuc2lvbnNSZV8sICI6JDEgJDQgJDMgJDIiKS5yZXBsYWNlKGdvb2cuaTE4bi5iaWRpLmxlZnRSZV8sICIlJSUlIikucmVwbGFjZShnb29nLmkxOG4uYmlkaS5yaWdodFJlXywgZ29vZy5pMThuLmJpZGkuTEVGVCkucmVwbGFjZShnb29nLmkxOG4uYmlkaS50ZW1wUmVfLCBnb29nLmkxOG4uYmlkaS5SSUdIVCkKfTsKZ29vZy5pMThuLmJpZGkuZG91YmxlUXVvdGVTdWJzdGl0dXRlUmVfID0gLyhbXHUwNTkxLVx1MDVmMl0pIi9nOwpnb29nLmkxOG4uYmlkaS5zaW5nbGVRdW90ZVN1YnN0aXR1dGVSZV8gPSAvKFtcdTA1OTEtXHUwNWYyXSknL2c7Cmdvb2cuaTE4bi5iaWRpLm5vcm1hbGl6ZUhlYnJld1F1b3RlID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJG5vcm1hbGl6ZUhlYnJld1F1b3RlJChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoZ29vZy5pMThuLmJpZGkuZG91YmxlUXVvdGVTdWJzdGl0dXRlUmVfLCAiJDFcdTA1ZjQiKS5yZXBsYWNlKGdvb2cuaTE4bi5iaWRpLnNpbmdsZVF1b3RlU3Vic3RpdHV0ZVJlXywgIiQxXHUwNWYzIikKfTsKZ29vZy5pMThuLmJpZGkud29yZFNlcGFyYXRvclJlXyA9IC9ccysvOwpnb29nLmkxOG4uYmlkaS5oYXNOdW1lcmFsc1JlXyA9IC9cZC87Cmdvb2cuaTE4bi5iaWRpLnJ0bERldGVjdGlvblRocmVzaG9sZF8gPSAwLjQ7Cmdvb2cuaTE4bi5iaWRpLmVzdGltYXRlRGlyZWN0aW9uID0gZnVuY3Rpb24gJGdvb2ckaTE4biRiaWRpJGVzdGltYXRlRGlyZWN0aW9uJChzdHIsIG9wdF9pc0h0bWwpIHsKICBmb3IodmFyIHJ0bENvdW50ID0gMCwgdG90YWxDb3VudCA9IDAsIGhhc1dlYWtseUx0ciA9ICExLCB0b2tlbnMgPSBnb29nLmkxOG4uYmlkaS5zdHJpcEh0bWxJZk5lZWRlZF8oc3RyLCBvcHRfaXNIdG1sKS5zcGxpdChnb29nLmkxOG4uYmlkaS53b3JkU2VwYXJhdG9yUmVfKSwgaSA9IDA7aSA8IHRva2Vucy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07CiAgICBnb29nLmkxOG4uYmlkaS5zdGFydHNXaXRoUnRsKHRva2VuKSA/IChydGxDb3VudCsrLCB0b3RhbENvdW50KyspIDogZ29vZy5pMThuLmJpZGkuaXNSZXF1aXJlZEx0clJlXy50ZXN0KHRva2VuKSA/IGhhc1dlYWtseUx0ciA9ICEwIDogZ29vZy5pMThuLmJpZGkuaGFzQW55THRyKHRva2VuKSA/IHRvdGFsQ291bnQrKyA6IGdvb2cuaTE4bi5iaWRpLmhhc051bWVyYWxzUmVfLnRlc3QodG9rZW4pICYmIChoYXNXZWFrbHlMdHIgPSAhMCkKICB9CiAgcmV0dXJuIDAgPT0gdG90YWxDb3VudCA/IGhhc1dlYWtseUx0ciA/IGdvb2cuaTE4bi5iaWRpLkRpci5MVFIgOiBnb29nLmkxOG4uYmlkaS5EaXIuVU5LTk9XTiA6IHJ0bENvdW50IC8gdG90YWxDb3VudCA+IGdvb2cuaTE4bi5iaWRpLnJ0bERldGVjdGlvblRocmVzaG9sZF8gPyBnb29nLmkxOG4uYmlkaS5EaXIuUlRMIDogZ29vZy5pMThuLmJpZGkuRGlyLkxUUgp9Owpnb29nLmkxOG4uYmlkaS5kZXRlY3RSdGxEaXJlY3Rpb25hbGl0eSA9IGZ1bmN0aW9uICRnb29nJGkxOG4kYmlkaSRkZXRlY3RSdGxEaXJlY3Rpb25hbGl0eSQoc3RyLCBvcHRfaXNIdG1sKSB7CiAgcmV0dXJuIGdvb2cuaTE4bi5iaWRpLmVzdGltYXRlRGlyZWN0aW9uKHN0ciwgb3B0X2lzSHRtbCkgPT0gZ29vZy5pMThuLmJpZGkuRGlyLlJUTAp9Owpnb29nLmkxOG4uYmlkaS5zZXRFbGVtZW50RGlyQW5kQWxpZ24gPSBmdW5jdGlvbiAkZ29vZyRpMThuJGJpZGkkc2V0RWxlbWVudERpckFuZEFsaWduJChlbGVtZW50LCBkaXIpIHsKICBpZihlbGVtZW50ICYmIChkaXIgPSBnb29nLmkxOG4uYmlkaS50b0RpcihkaXIpKSAhPSBnb29nLmkxOG4uYmlkaS5EaXIuVU5LTk9XTikgewogICAgZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSBkaXIgPT0gZ29vZy5pMThuLmJpZGkuRGlyLlJUTCA/ICJyaWdodCIgOiAibGVmdCIsIGVsZW1lbnQuZGlyID0gZGlyID09IGdvb2cuaTE4bi5iaWRpLkRpci5SVEwgPyAicnRsIiA6ICJsdHIiCiAgfQp9Owpnb29nLmkxOG4uQmlkaUZvcm1hdHRlciA9IGZ1bmN0aW9uICRnb29nJGkxOG4kQmlkaUZvcm1hdHRlciQoY29udGV4dERpciwgb3B0X2Fsd2F5c1NwYW4pIHsKICB0aGlzLmNvbnRleHREaXJfID0gZ29vZy5pMThuLmJpZGkudG9EaXIoY29udGV4dERpcik7CiAgdGhpcy5hbHdheXNTcGFuXyA9ICEhb3B0X2Fsd2F5c1NwYW4KfTsKZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXIucHJvdG90eXBlLmVzdGltYXRlRGlyZWN0aW9uID0gZ29vZy5pMThuLmJpZGkuZXN0aW1hdGVEaXJlY3Rpb247Cmdvb2cuaTE4bi5CaWRpRm9ybWF0dGVyLnByb3RvdHlwZS5hcmVEaXJlY3Rpb25hbGl0aWVzT3Bwb3NpdGVfID0gZnVuY3Rpb24gJGdvb2ckaTE4biRCaWRpRm9ybWF0dGVyJCRhcmVEaXJlY3Rpb25hbGl0aWVzT3Bwb3NpdGVfJChkaXIxLCBkaXIyKSB7CiAgcmV0dXJuIDAgPiBkaXIxICogZGlyMgp9Owpnb29nLmkxOG4uQmlkaUZvcm1hdHRlci5wcm90b3R5cGUuZGlyUmVzZXRJZk5lZWRlZF8gPSBmdW5jdGlvbiAkZ29vZyRpMThuJEJpZGlGb3JtYXR0ZXIkJGRpclJlc2V0SWZOZWVkZWRfJChzdHIsIGRpciwgb3B0X2lzSHRtbCwgb3B0X2RpclJlc2V0KSB7CiAgcmV0dXJuIG9wdF9kaXJSZXNldCAmJiAodGhpcy5hcmVEaXJlY3Rpb25hbGl0aWVzT3Bwb3NpdGVfKGRpciwgdGhpcy5jb250ZXh0RGlyXykgfHwgdGhpcy5jb250ZXh0RGlyXyA9PSBnb29nLmkxOG4uYmlkaS5EaXIuTFRSICYmIGdvb2cuaTE4bi5iaWRpLmVuZHNXaXRoUnRsKHN0ciwgb3B0X2lzSHRtbCkgfHwgdGhpcy5jb250ZXh0RGlyXyA9PSBnb29nLmkxOG4uYmlkaS5EaXIuUlRMICYmIGdvb2cuaTE4bi5iaWRpLmVuZHNXaXRoTHRyKHN0ciwgb3B0X2lzSHRtbCkpID8gdGhpcy5jb250ZXh0RGlyXyA9PSBnb29nLmkxOG4uYmlkaS5EaXIuTFRSID8gZ29vZy5pMThuLmJpZGkuRm9ybWF0LkxSTSA6IGdvb2cuaTE4bi5iaWRpLkZvcm1hdC5STE0gOiAiIgp9Owpnb29nLmkxOG4uQmlkaUZvcm1hdHRlci5wcm90b3R5cGUuZGlyQXR0ciA9IGZ1bmN0aW9uICRnb29nJGkxOG4kQmlkaUZvcm1hdHRlciQkZGlyQXR0ciQoc3RyLCBvcHRfaXNIdG1sKSB7CiAgcmV0dXJuIHRoaXMua25vd25EaXJBdHRyKHRoaXMuZXN0aW1hdGVEaXJlY3Rpb24oc3RyLCBvcHRfaXNIdG1sKSkKfTsKZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXIucHJvdG90eXBlLmtub3duRGlyQXR0ciA9IGZ1bmN0aW9uICRnb29nJGkxOG4kQmlkaUZvcm1hdHRlciQka25vd25EaXJBdHRyJChkaXIpIHsKICByZXR1cm4gZGlyICE9IHRoaXMuY29udGV4dERpcl8gPyBkaXIgPT0gZ29vZy5pMThuLmJpZGkuRGlyLlJUTCA/ICJkaXI9cnRsIiA6IGRpciA9PSBnb29nLmkxOG4uYmlkaS5EaXIuTFRSID8gImRpcj1sdHIiIDogIiIgOiAiIgp9Owpnb29nLmkxOG4uQmlkaUZvcm1hdHRlci5wcm90b3R5cGUuc3BhbldyYXAgPSBmdW5jdGlvbiAkZ29vZyRpMThuJEJpZGlGb3JtYXR0ZXIkJHNwYW5XcmFwJChzdHIsIG9wdF9pc0h0bWwsIG9wdF9kaXJSZXNldCkgewogIHZhciBkaXIgPSB0aGlzLmVzdGltYXRlRGlyZWN0aW9uKHN0ciwgb3B0X2lzSHRtbCk7CiAgcmV0dXJuIHRoaXMuc3BhbldyYXBXaXRoS25vd25EaXIoZGlyLCBzdHIsIG9wdF9pc0h0bWwsIG9wdF9kaXJSZXNldCkKfTsKZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXIucHJvdG90eXBlLnNwYW5XcmFwV2l0aEtub3duRGlyID0gZnVuY3Rpb24gJGdvb2ckaTE4biRCaWRpRm9ybWF0dGVyJCRzcGFuV3JhcFdpdGhLbm93bkRpciQoZGlyLCBzdHIsIG9wdF9pc0h0bWwsIG9wdF9kaXJSZXNldCkgewogIHZhciBvcHRfZGlyUmVzZXQgPSBvcHRfZGlyUmVzZXQgfHwgdm9pZCAwID09IG9wdF9kaXJSZXNldCwgZGlyQ29uZGl0aW9uID0gZGlyICE9IGdvb2cuaTE4bi5iaWRpLkRpci5VTktOT1dOICYmIGRpciAhPSB0aGlzLmNvbnRleHREaXJfOwogIG9wdF9pc0h0bWwgfHwgKHN0ciA9IGdvb2cuc3RyaW5nLmh0bWxFc2NhcGUoc3RyKSk7CiAgdmFyIHJlc3VsdCA9IFtdOwogIHRoaXMuYWx3YXlzU3Bhbl8gfHwgZGlyQ29uZGl0aW9uID8gKHJlc3VsdC5wdXNoKCI8c3BhbiIpLCBkaXJDb25kaXRpb24gJiYgcmVzdWx0LnB1c2goZGlyID09IGdvb2cuaTE4bi5iaWRpLkRpci5SVEwgPyAiIGRpcj1ydGwiIDogIiBkaXI9bHRyIiksIHJlc3VsdC5wdXNoKCI+IiArIHN0ciArICI8L3NwYW4+IikpIDogcmVzdWx0LnB1c2goc3RyKTsKICByZXN1bHQucHVzaCh0aGlzLmRpclJlc2V0SWZOZWVkZWRfKHN0ciwgZGlyLCAhMCwgb3B0X2RpclJlc2V0KSk7CiAgcmV0dXJuIHJlc3VsdC5qb2luKCIiKQp9Owpnb29nLmkxOG4uQmlkaUZvcm1hdHRlci5wcm90b3R5cGUudW5pY29kZVdyYXAgPSBmdW5jdGlvbiAkZ29vZyRpMThuJEJpZGlGb3JtYXR0ZXIkJHVuaWNvZGVXcmFwJChzdHIsIG9wdF9pc0h0bWwsIG9wdF9kaXJSZXNldCkgewogIHZhciBkaXIgPSB0aGlzLmVzdGltYXRlRGlyZWN0aW9uKHN0ciwgb3B0X2lzSHRtbCk7CiAgcmV0dXJuIHRoaXMudW5pY29kZVdyYXBXaXRoS25vd25EaXIoZGlyLCBzdHIsIG9wdF9pc0h0bWwsIG9wdF9kaXJSZXNldCkKfTsKZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXIucHJvdG90eXBlLnVuaWNvZGVXcmFwV2l0aEtub3duRGlyID0gZnVuY3Rpb24gJGdvb2ckaTE4biRCaWRpRm9ybWF0dGVyJCR1bmljb2RlV3JhcFdpdGhLbm93bkRpciQoZGlyLCBzdHIsIG9wdF9pc0h0bWwsIG9wdF9kaXJSZXNldCkgewogIHZhciBvcHRfZGlyUmVzZXQgPSBvcHRfZGlyUmVzZXQgfHwgdm9pZCAwID09IG9wdF9kaXJSZXNldCwgcmVzdWx0ID0gW107CiAgZGlyICE9IGdvb2cuaTE4bi5iaWRpLkRpci5VTktOT1dOICYmIGRpciAhPSB0aGlzLmNvbnRleHREaXJfID8gKHJlc3VsdC5wdXNoKGRpciA9PSBnb29nLmkxOG4uYmlkaS5EaXIuUlRMID8gZ29vZy5pMThuLmJpZGkuRm9ybWF0LlJMRSA6IGdvb2cuaTE4bi5iaWRpLkZvcm1hdC5MUkUpLCByZXN1bHQucHVzaChzdHIpLCByZXN1bHQucHVzaChnb29nLmkxOG4uYmlkaS5Gb3JtYXQuUERGKSkgOiByZXN1bHQucHVzaChzdHIpOwogIHJlc3VsdC5wdXNoKHRoaXMuZGlyUmVzZXRJZk5lZWRlZF8oc3RyLCBkaXIsIG9wdF9pc0h0bWwsIG9wdF9kaXJSZXNldCkpOwogIHJldHVybiByZXN1bHQuam9pbigiIikKfTsKZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXIucHJvdG90eXBlLm1hcmtBZnRlciA9IGZ1bmN0aW9uICRnb29nJGkxOG4kQmlkaUZvcm1hdHRlciQkbWFya0FmdGVyJChzdHIsIG9wdF9pc0h0bWwpIHsKICByZXR1cm4gdGhpcy5kaXJSZXNldElmTmVlZGVkXyhzdHIsIHRoaXMuZXN0aW1hdGVEaXJlY3Rpb24oc3RyLCBvcHRfaXNIdG1sKSwgb3B0X2lzSHRtbCwgITApCn07Cmdvb2cuaTE4bi5UaW1lWm9uZSA9IGZ1bmN0aW9uICRnb29nJGkxOG4kVGltZVpvbmUkKCkgewp9Owpnb29nLmkxOG4uVGltZVpvbmUuTUlMTElTRUNPTkRTX1BFUl9IT1VSXyA9IDM2RTU7Cmdvb2cuaTE4bi5UaW1lWm9uZS5OYW1lVHlwZSA9IHtTVERfU0hPUlRfTkFNRTowLCBTVERfTE9OR19OQU1FOjEsIERMVF9TSE9SVF9OQU1FOjIsIERMVF9MT05HX05BTUU6M307Cmdvb2cuaTE4bi5UaW1lWm9uZS5jcmVhdGVUaW1lWm9uZSA9IGZ1bmN0aW9uICRnb29nJGkxOG4kVGltZVpvbmUkY3JlYXRlVGltZVpvbmUkKHRpbWVab25lRGF0YSkgewogIGlmKCJudW1iZXIiID09IHR5cGVvZiB0aW1lWm9uZURhdGEpIHsKICAgIHJldHVybiBnb29nLmkxOG4uVGltZVpvbmUuY3JlYXRlU2ltcGxlVGltZVpvbmVfKHRpbWVab25lRGF0YSkKICB9CiAgdmFyIHR6ID0gbmV3IGdvb2cuaTE4bi5UaW1lWm9uZTsKICB0ei50aW1lWm9uZUlkXyA9IHRpbWVab25lRGF0YS5pZDsKICB0ei5zdGFuZGFyZE9mZnNldF8gPSAtdGltZVpvbmVEYXRhLnN0ZF9vZmZzZXQ7CiAgdHoudHpOYW1lc18gPSB0aW1lWm9uZURhdGEubmFtZXM7CiAgdHoudHJhbnNpdGlvbnNfID0gdGltZVpvbmVEYXRhLnRyYW5zaXRpb25zOwogIHJldHVybiB0egp9Owpnb29nLmkxOG4uVGltZVpvbmUuY3JlYXRlU2ltcGxlVGltZVpvbmVfID0gZnVuY3Rpb24gJGdvb2ckaTE4biRUaW1lWm9uZSRjcmVhdGVTaW1wbGVUaW1lWm9uZV8kKHRpbWVab25lT2Zmc2V0SW5NaW51dGVzKSB7CiAgdmFyIHR6ID0gbmV3IGdvb2cuaTE4bi5UaW1lWm9uZTsKICB0ei5zdGFuZGFyZE9mZnNldF8gPSB0aW1lWm9uZU9mZnNldEluTWludXRlczsKICB0ei50aW1lWm9uZUlkXyA9IGdvb2cuaTE4bi5UaW1lWm9uZS5jb21wb3NlUG9zaXhUaW1lWm9uZUlEXyh0aW1lWm9uZU9mZnNldEluTWludXRlcyk7CiAgdmFyIHN0ciA9IGdvb2cuaTE4bi5UaW1lWm9uZS5jb21wb3NlVVRDU3RyaW5nXyh0aW1lWm9uZU9mZnNldEluTWludXRlcyk7CiAgdHoudHpOYW1lc18gPSBbc3RyLCBzdHJdOwogIHR6LnRyYW5zaXRpb25zXyA9IFtdOwogIHJldHVybiB0egp9Owpnb29nLmkxOG4uVGltZVpvbmUuY29tcG9zZUdNVFN0cmluZ18gPSBmdW5jdGlvbiAkZ29vZyRpMThuJFRpbWVab25lJGNvbXBvc2VHTVRTdHJpbmdfJChvZmZzZXQpIHsKICB2YXIgcGFydHMgPSBbIkdNVCJdOwogIHBhcnRzLnB1c2goMCA+PSBvZmZzZXQgPyAiKyIgOiAiLSIpOwogIG9mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7CiAgcGFydHMucHVzaChnb29nLnN0cmluZy5wYWROdW1iZXIoTWF0aC5mbG9vcihvZmZzZXQgLyA2MCkgJSAxMDAsIDIpLCAiOiIsIGdvb2cuc3RyaW5nLnBhZE51bWJlcihvZmZzZXQgJSA2MCwgMikpOwogIHJldHVybiBwYXJ0cy5qb2luKCIiKQp9Owpnb29nLmkxOG4uVGltZVpvbmUuY29tcG9zZVBvc2l4VGltZVpvbmVJRF8gPSBmdW5jdGlvbiAkZ29vZyRpMThuJFRpbWVab25lJGNvbXBvc2VQb3NpeFRpbWVab25lSURfJChvZmZzZXQpIHsKICBpZigwID09IG9mZnNldCkgewogICAgcmV0dXJuIkV0Yy9HTVQiCiAgfQogIHZhciBwYXJ0cyA9IFsiRXRjL0dNVCIsIDAgPiBvZmZzZXQgPyAiLSIgOiAiKyJdLCBvZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpOwogIHBhcnRzLnB1c2goTWF0aC5mbG9vcihvZmZzZXQgLyA2MCkgJSAxMDApOwogIG9mZnNldCAlPSA2MDsKICAwICE9IG9mZnNldCAmJiBwYXJ0cy5wdXNoKCI6IiwgZ29vZy5zdHJpbmcucGFkTnVtYmVyKG9mZnNldCwgMikpOwogIHJldHVybiBwYXJ0cy5qb2luKCIiKQp9Owpnb29nLmkxOG4uVGltZVpvbmUuY29tcG9zZVVUQ1N0cmluZ18gPSBmdW5jdGlvbiAkZ29vZyRpMThuJFRpbWVab25lJGNvbXBvc2VVVENTdHJpbmdfJChvZmZzZXQpIHsKICBpZigwID09IG9mZnNldCkgewogICAgcmV0dXJuIlVUQyIKICB9CiAgdmFyIHBhcnRzID0gWyJVVEMiLCAwID4gb2Zmc2V0ID8gIisiIDogIi0iXSwgb2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTsKICBwYXJ0cy5wdXNoKE1hdGguZmxvb3Iob2Zmc2V0IC8gNjApICUgMTAwKTsKICBvZmZzZXQgJT0gNjA7CiAgMCAhPSBvZmZzZXQgJiYgcGFydHMucHVzaCgiOiIsIG9mZnNldCk7CiAgcmV0dXJuIHBhcnRzLmpvaW4oIiIpCn07Cmdvb2cuaTE4bi5UaW1lWm9uZS5wcm90b3R5cGUuZ2V0RGF5bGlnaHRBZGp1c3RtZW50ID0gZnVuY3Rpb24gJGdvb2ckaTE4biRUaW1lWm9uZSQkZ2V0RGF5bGlnaHRBZGp1c3RtZW50JChkYXRlKSB7CiAgZm9yKHZhciB0aW1lSW5NcyA9IERhdGUuVVRDKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSwgZGF0ZS5nZXRVVENNb250aCgpLCBkYXRlLmdldFVUQ0RhdGUoKSwgZGF0ZS5nZXRVVENIb3VycygpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKSksIHRpbWVJbkhvdXJzID0gdGltZUluTXMgLyBnb29nLmkxOG4uVGltZVpvbmUuTUlMTElTRUNPTkRTX1BFUl9IT1VSXywgaW5kZXggPSAwO2luZGV4IDwgdGhpcy50cmFuc2l0aW9uc18ubGVuZ3RoICYmIHRpbWVJbkhvdXJzID49IHRoaXMudHJhbnNpdGlvbnNfW2luZGV4XTspIHsKICAgIGluZGV4ICs9IDIKICB9CiAgcmV0dXJuIDAgPT0gaW5kZXggPyAwIDogdGhpcy50cmFuc2l0aW9uc19baW5kZXggLSAxXQp9Owpnb29nLmkxOG4uVGltZVpvbmUucHJvdG90eXBlLmdldEdNVFN0cmluZyA9IGZ1bmN0aW9uICRnb29nJGkxOG4kVGltZVpvbmUkJGdldEdNVFN0cmluZyQoZGF0ZSkgewogIHJldHVybiBnb29nLmkxOG4uVGltZVpvbmUuY29tcG9zZUdNVFN0cmluZ18odGhpcy5nZXRPZmZzZXQoZGF0ZSkpCn07Cmdvb2cuaTE4bi5UaW1lWm9uZS5wcm90b3R5cGUuZ2V0TG9uZ05hbWUgPSBmdW5jdGlvbiAkZ29vZyRpMThuJFRpbWVab25lJCRnZXRMb25nTmFtZSQoZGF0ZSkgewogIHJldHVybiB0aGlzLnR6TmFtZXNfW3RoaXMuaXNEYXlsaWdodFRpbWUoZGF0ZSkgPyBnb29nLmkxOG4uVGltZVpvbmUuTmFtZVR5cGUuRExUX0xPTkdfTkFNRSA6IGdvb2cuaTE4bi5UaW1lWm9uZS5OYW1lVHlwZS5TVERfTE9OR19OQU1FXQp9Owpnb29nLmkxOG4uVGltZVpvbmUucHJvdG90eXBlLmdldE9mZnNldCA9IGZ1bmN0aW9uICRnb29nJGkxOG4kVGltZVpvbmUkJGdldE9mZnNldCQoZGF0ZSkgewogIHJldHVybiB0aGlzLnN0YW5kYXJkT2Zmc2V0XyAtIHRoaXMuZ2V0RGF5bGlnaHRBZGp1c3RtZW50KGRhdGUpCn07Cmdvb2cuaTE4bi5UaW1lWm9uZS5wcm90b3R5cGUuZ2V0UkZDVGltZVpvbmVTdHJpbmcgPSBmdW5jdGlvbiAkZ29vZyRpMThuJFRpbWVab25lJCRnZXRSRkNUaW1lWm9uZVN0cmluZyQoZGF0ZSkgewogIHZhciBvZmZzZXQgPSAtdGhpcy5nZXRPZmZzZXQoZGF0ZSksIHBhcnRzID0gWzAgPiBvZmZzZXQgPyAiLSIgOiAiKyJdLCBvZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpOwogIHBhcnRzLnB1c2goZ29vZy5zdHJpbmcucGFkTnVtYmVyKE1hdGguZmxvb3Iob2Zmc2V0IC8gNjApICUgMTAwLCAyKSwgZ29vZy5zdHJpbmcucGFkTnVtYmVyKG9mZnNldCAlIDYwLCAyKSk7CiAgcmV0dXJuIHBhcnRzLmpvaW4oIiIpCn07Cmdvb2cuaTE4bi5UaW1lWm9uZS5wcm90b3R5cGUuZ2V0U2hvcnROYW1lID0gZnVuY3Rpb24gJGdvb2ckaTE4biRUaW1lWm9uZSQkZ2V0U2hvcnROYW1lJChkYXRlKSB7CiAgcmV0dXJuIHRoaXMudHpOYW1lc19bdGhpcy5pc0RheWxpZ2h0VGltZShkYXRlKSA/IGdvb2cuaTE4bi5UaW1lWm9uZS5OYW1lVHlwZS5ETFRfU0hPUlRfTkFNRSA6IGdvb2cuaTE4bi5UaW1lWm9uZS5OYW1lVHlwZS5TVERfU0hPUlRfTkFNRV0KfTsKZ29vZy5pMThuLlRpbWVab25lLnByb3RvdHlwZS5nZXRUaW1lWm9uZUlkID0gZnVuY3Rpb24gJGdvb2ckaTE4biRUaW1lWm9uZSQkZ2V0VGltZVpvbmVJZCQoKSB7CiAgcmV0dXJuIHRoaXMudGltZVpvbmVJZF8KfTsKZ29vZy5pMThuLlRpbWVab25lLnByb3RvdHlwZS5pc0RheWxpZ2h0VGltZSA9IGZ1bmN0aW9uICRnb29nJGkxOG4kVGltZVpvbmUkJGlzRGF5bGlnaHRUaW1lJChkYXRlKSB7CiAgcmV0dXJuIDAgPCB0aGlzLmdldERheWxpZ2h0QWRqdXN0bWVudChkYXRlKQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQgPSBmdW5jdGlvbiAkZ29vZyRpMThuJERhdGVUaW1lRm9ybWF0JChwYXR0ZXJuKSB7CiAgZ29vZy5hc3NlcnRzLmFzc2VydChnb29nLmlzRGVmKHBhdHRlcm4pLCAiUGF0dGVybiBtdXN0IGJlIGRlZmluZWQiKTsKICB0aGlzLnBhdHRlcm5QYXJ0c18gPSBbXTsKICAibnVtYmVyIiA9PSB0eXBlb2YgcGF0dGVybiA/IHRoaXMuYXBwbHlTdGFuZGFyZFBhdHRlcm5fKHBhdHRlcm4pIDogdGhpcy5hcHBseVBhdHRlcm5fKHBhdHRlcm4pCn07Cmdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5Gb3JtYXQgPSB7RlVMTF9EQVRFOjAsIExPTkdfREFURToxLCBNRURJVU1fREFURToyLCBTSE9SVF9EQVRFOjMsIEZVTExfVElNRTo0LCBMT05HX1RJTUU6NSwgTUVESVVNX1RJTUU6NiwgU0hPUlRfVElNRTo3LCBGVUxMX0RBVEVUSU1FOjgsIExPTkdfREFURVRJTUU6OSwgTUVESVVNX0RBVEVUSU1FOjEwLCBTSE9SVF9EQVRFVElNRToxMX07Cmdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5UT0tFTlNfID0gWy9eXCcoPzpbXlwnXXxcJ1wnKSpcJy8sIC9eKD86Ryt8eSt8TSt8ayt8Uyt8RSt8YSt8aCt8Syt8SCt8Yyt8TCt8USt8ZCt8bSt8cyt8dit8eit8WispLywgL15bXlwnR3lNa1NFYWhLSGNMUWRtc3Z6Wl0rL107Cmdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5QYXJ0VHlwZXNfID0ge1FVT1RFRF9TVFJJTkc6MCwgRklFTEQ6MSwgTElURVJBTDoyfTsKZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZS5hcHBseVBhdHRlcm5fID0gZnVuY3Rpb24gJGdvb2ckaTE4biREYXRlVGltZUZvcm1hdCQkYXBwbHlQYXR0ZXJuXyQocGF0dGVybikgewogIGZvcig7cGF0dGVybjspIHsKICAgIGZvcih2YXIgaSA9IDA7aSA8IGdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5UT0tFTlNfLmxlbmd0aDsrK2kpIHsKICAgICAgdmFyIG0gPSBwYXR0ZXJuLm1hdGNoKGdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5UT0tFTlNfW2ldKTsKICAgICAgaWYobSkgewogICAgICAgIHZhciBwYXJ0ID0gbVswXSwgcGF0dGVybiA9IHBhdHRlcm4uc3Vic3RyaW5nKHBhcnQubGVuZ3RoKTsKICAgICAgICBpID09IGdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5QYXJ0VHlwZXNfLlFVT1RFRF9TVFJJTkcgJiYgKCInJyIgPT0gcGFydCA/IHBhcnQgPSAiJyIgOiAocGFydCA9IHBhcnQuc3Vic3RyaW5nKDEsIHBhcnQubGVuZ3RoIC0gMSksIHBhcnQgPSBwYXJ0LnJlcGxhY2UoL1wnXCcvLCAiJyIpKSk7CiAgICAgICAgdGhpcy5wYXR0ZXJuUGFydHNfLnB1c2goe3RleHQ6cGFydCwgdHlwZTppfSk7CiAgICAgICAgYnJlYWsKICAgICAgfQogICAgfQogIH0KfTsKZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiAkZ29vZyRpMThuJERhdGVUaW1lRm9ybWF0JCRmb3JtYXQkKGRhdGUsIG9wdF90aW1lWm9uZSkgewogIHZhciBkaWZmID0gb3B0X3RpbWVab25lID8gNkU0ICogKGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIG9wdF90aW1lWm9uZS5nZXRPZmZzZXQoZGF0ZSkpIDogMCwgZGF0ZUZvckRhdGUgPSBkaWZmID8gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgKyBkaWZmKSA6IGRhdGUsIGRhdGVGb3JUaW1lID0gZGF0ZUZvckRhdGU7CiAgb3B0X3RpbWVab25lICYmIGRhdGVGb3JEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgIT0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICYmIChkaWZmICs9IDAgPCBkaWZmID8gLTg2NEU1IDogODY0RTUsIGRhdGVGb3JUaW1lID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgKyBkaWZmKSk7CiAgZm9yKHZhciBvdXQgPSBbXSwgaSA9IDA7aSA8IHRoaXMucGF0dGVyblBhcnRzXy5sZW5ndGg7KytpKSB7CiAgICB2YXIgdGV4dCA9IHRoaXMucGF0dGVyblBhcnRzX1tpXS50ZXh0OwogICAgZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0LlBhcnRUeXBlc18uRklFTEQgPT0gdGhpcy5wYXR0ZXJuUGFydHNfW2ldLnR5cGUgPyBvdXQucHVzaCh0aGlzLmZvcm1hdEZpZWxkXyh0ZXh0LCBkYXRlLCBkYXRlRm9yRGF0ZSwgZGF0ZUZvclRpbWUsIG9wdF90aW1lWm9uZSkpIDogb3V0LnB1c2godGV4dCkKICB9CiAgcmV0dXJuIG91dC5qb2luKCIiKQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmFwcGx5U3RhbmRhcmRQYXR0ZXJuXyA9IGZ1bmN0aW9uICRnb29nJGkxOG4kRGF0ZVRpbWVGb3JtYXQkJGFwcGx5U3RhbmRhcmRQYXR0ZXJuXyQoZm9ybWF0VHlwZSkgewogIHZhciBwYXR0ZXJuOwogIGlmKDQgPiBmb3JtYXRUeXBlKSB7CiAgICBwYXR0ZXJuID0gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scy5EQVRFRk9STUFUU1tmb3JtYXRUeXBlXQogIH1lbHNlIHsKICAgIGlmKDggPiBmb3JtYXRUeXBlKSB7CiAgICAgIHBhdHRlcm4gPSBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzLlRJTUVGT1JNQVRTW2Zvcm1hdFR5cGUgLSA0XQogICAgfWVsc2UgewogICAgICBpZigxMiA+IGZvcm1hdFR5cGUpIHsKICAgICAgICBwYXR0ZXJuID0gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scy5EQVRFRk9STUFUU1tmb3JtYXRUeXBlIC0gOF0gKyAiICIgKyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzLlRJTUVGT1JNQVRTW2Zvcm1hdFR5cGUgLSA4XQogICAgICB9ZWxzZSB7CiAgICAgICAgdGhpcy5hcHBseVN0YW5kYXJkUGF0dGVybl8oZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0LkZvcm1hdC5NRURJVU1fREFURVRJTUUpOwogICAgICAgIHJldHVybgogICAgICB9CiAgICB9CiAgfQogIHRoaXMuYXBwbHlQYXR0ZXJuXyhwYXR0ZXJuKQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdEVyYV8gPSBmdW5jdGlvbiAkZ29vZyRpMThuJERhdGVUaW1lRm9ybWF0JCRmb3JtYXRFcmFfJChjb3VudCwgZGF0ZSkgewogIHZhciB2YWx1ZSA9IDAgPCBkYXRlLmdldEZ1bGxZZWFyKCkgPyAxIDogMDsKICByZXR1cm4gNCA8PSBjb3VudCA/IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMuRVJBTkFNRVNbdmFsdWVdIDogZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scy5FUkFTW3ZhbHVlXQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdFllYXJfID0gZnVuY3Rpb24gJGdvb2ckaTE4biREYXRlVGltZUZvcm1hdCQkZm9ybWF0WWVhcl8kKGNvdW50LCBkYXRlKSB7CiAgdmFyIHZhbHVlID0gZGF0ZS5nZXRGdWxsWWVhcigpOwogIDAgPiB2YWx1ZSAmJiAodmFsdWUgPSAtdmFsdWUpOwogIHJldHVybiAyID09IGNvdW50ID8gZ29vZy5zdHJpbmcucGFkTnVtYmVyKHZhbHVlICUgMTAwLCAyKSA6ICIiICsgdmFsdWUKfTsKZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXRNb250aF8gPSBmdW5jdGlvbiAkZ29vZyRpMThuJERhdGVUaW1lRm9ybWF0JCRmb3JtYXRNb250aF8kKGNvdW50LCBkYXRlKSB7CiAgdmFyIHZhbHVlID0gZGF0ZS5nZXRNb250aCgpOwogIHN3aXRjaChjb3VudCkgewogICAgY2FzZSA1OgogICAgICByZXR1cm4gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scy5OQVJST1dNT05USFNbdmFsdWVdOwogICAgY2FzZSA0OgogICAgICByZXR1cm4gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scy5NT05USFNbdmFsdWVdOwogICAgY2FzZSAzOgogICAgICByZXR1cm4gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scy5TSE9SVE1PTlRIU1t2YWx1ZV07CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZ29vZy5zdHJpbmcucGFkTnVtYmVyKHZhbHVlICsgMSwgY291bnQpCiAgfQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdDI0SG91cnNfID0gZnVuY3Rpb24gJGdvb2ckaTE4biREYXRlVGltZUZvcm1hdCQkZm9ybWF0MjRIb3Vyc18kKGNvdW50LCBkYXRlKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnBhZE51bWJlcihkYXRlLmdldEhvdXJzKCkgfHwgMjQsIGNvdW50KQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdEZyYWN0aW9uYWxTZWNvbmRzXyA9IGZ1bmN0aW9uICRnb29nJGkxOG4kRGF0ZVRpbWVGb3JtYXQkJGZvcm1hdEZyYWN0aW9uYWxTZWNvbmRzXyQoY291bnQsIGRhdGUpIHsKICB2YXIgdmFsdWUgPSBkYXRlLmdldFRpbWUoKSAlIDFFMyAvIDFFMzsKICByZXR1cm4gdmFsdWUudG9GaXhlZChNYXRoLm1pbigzLCBjb3VudCkpLnN1YnN0cigyKSArICgzIDwgY291bnQgPyBnb29nLnN0cmluZy5wYWROdW1iZXIoMCwgY291bnQgLSAzKSA6ICIiKQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdERheU9mV2Vla18gPSBmdW5jdGlvbiAkZ29vZyRpMThuJERhdGVUaW1lRm9ybWF0JCRmb3JtYXREYXlPZldlZWtfJChjb3VudCwgZGF0ZSkgewogIHZhciB2YWx1ZSA9IGRhdGUuZ2V0RGF5KCk7CiAgcmV0dXJuIDQgPD0gY291bnQgPyBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzLldFRUtEQVlTW3ZhbHVlXSA6IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMuU0hPUlRXRUVLREFZU1t2YWx1ZV0KfTsKZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXRBbVBtXyA9IGZ1bmN0aW9uICRnb29nJGkxOG4kRGF0ZVRpbWVGb3JtYXQkJGZvcm1hdEFtUG1fJChjb3VudCwgZGF0ZSkgewogIHZhciBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTsKICByZXR1cm4gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scy5BTVBNU1sxMiA8PSBob3VycyAmJiAyNCA+IGhvdXJzID8gMSA6IDBdCn07Cmdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0MVRvMTJIb3Vyc18gPSBmdW5jdGlvbiAkZ29vZyRpMThuJERhdGVUaW1lRm9ybWF0JCRmb3JtYXQxVG8xMkhvdXJzXyQoY291bnQsIGRhdGUpIHsKICByZXR1cm4gZ29vZy5zdHJpbmcucGFkTnVtYmVyKGRhdGUuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBjb3VudCkKfTsKZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXQwVG8xMUhvdXJzXyA9IGZ1bmN0aW9uICRnb29nJGkxOG4kRGF0ZVRpbWVGb3JtYXQkJGZvcm1hdDBUbzExSG91cnNfJChjb3VudCwgZGF0ZSkgewogIHJldHVybiBnb29nLnN0cmluZy5wYWROdW1iZXIoZGF0ZS5nZXRIb3VycygpICUgMTIsIGNvdW50KQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdDBUbzIzSG91cnNfID0gZnVuY3Rpb24gJGdvb2ckaTE4biREYXRlVGltZUZvcm1hdCQkZm9ybWF0MFRvMjNIb3Vyc18kKGNvdW50LCBkYXRlKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnBhZE51bWJlcihkYXRlLmdldEhvdXJzKCksIGNvdW50KQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdFN0YW5kYWxvbmVEYXlfID0gZnVuY3Rpb24gJGdvb2ckaTE4biREYXRlVGltZUZvcm1hdCQkZm9ybWF0U3RhbmRhbG9uZURheV8kKGNvdW50LCBkYXRlKSB7CiAgdmFyIHZhbHVlID0gZGF0ZS5nZXREYXkoKTsKICBzd2l0Y2goY291bnQpIHsKICAgIGNhc2UgNToKICAgICAgcmV0dXJuIGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMuU1RBTkRBTE9ORU5BUlJPV1dFRUtEQVlTW3ZhbHVlXTsKICAgIGNhc2UgNDoKICAgICAgcmV0dXJuIGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMuU1RBTkRBTE9ORVdFRUtEQVlTW3ZhbHVlXTsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMuU1RBTkRBTE9ORVNIT1JUV0VFS0RBWVNbdmFsdWVdOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGdvb2cuc3RyaW5nLnBhZE51bWJlcih2YWx1ZSwgMSkKICB9Cn07Cmdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0U3RhbmRhbG9uZU1vbnRoXyA9IGZ1bmN0aW9uICRnb29nJGkxOG4kRGF0ZVRpbWVGb3JtYXQkJGZvcm1hdFN0YW5kYWxvbmVNb250aF8kKGNvdW50LCBkYXRlKSB7CiAgdmFyIHZhbHVlID0gZGF0ZS5nZXRNb250aCgpOwogIHN3aXRjaChjb3VudCkgewogICAgY2FzZSA1OgogICAgICByZXR1cm4gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scy5TVEFOREFMT05FTkFSUk9XTU9OVEhTW3ZhbHVlXTsKICAgIGNhc2UgNDoKICAgICAgcmV0dXJuIGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMuU1RBTkRBTE9ORU1PTlRIU1t2YWx1ZV07CiAgICBjYXNlIDM6CiAgICAgIHJldHVybiBnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzLlNUQU5EQUxPTkVTSE9SVE1PTlRIU1t2YWx1ZV07CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZ29vZy5zdHJpbmcucGFkTnVtYmVyKHZhbHVlICsgMSwgY291bnQpCiAgfQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdFF1YXJ0ZXJfID0gZnVuY3Rpb24gJGdvb2ckaTE4biREYXRlVGltZUZvcm1hdCQkZm9ybWF0UXVhcnRlcl8kKGNvdW50LCBkYXRlKSB7CiAgdmFyIHZhbHVlID0gTWF0aC5mbG9vcihkYXRlLmdldE1vbnRoKCkgLyAzKTsKICByZXR1cm4gNCA+IGNvdW50ID8gZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scy5TSE9SVFFVQVJURVJTW3ZhbHVlXSA6IGdvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMuUVVBUlRFUlNbdmFsdWVdCn07Cmdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0RGF0ZV8gPSBmdW5jdGlvbiAkZ29vZyRpMThuJERhdGVUaW1lRm9ybWF0JCRmb3JtYXREYXRlXyQoY291bnQsIGRhdGUpIHsKICByZXR1cm4gZ29vZy5zdHJpbmcucGFkTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCBjb3VudCkKfTsKZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXRNaW51dGVzXyA9IGZ1bmN0aW9uICRnb29nJGkxOG4kRGF0ZVRpbWVGb3JtYXQkJGZvcm1hdE1pbnV0ZXNfJChjb3VudCwgZGF0ZSkgewogIHJldHVybiBnb29nLnN0cmluZy5wYWROdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIGNvdW50KQp9Owpnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQucHJvdG90eXBlLmZvcm1hdFNlY29uZHNfID0gZnVuY3Rpb24gJGdvb2ckaTE4biREYXRlVGltZUZvcm1hdCQkZm9ybWF0U2Vjb25kc18kKGNvdW50LCBkYXRlKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnBhZE51bWJlcihkYXRlLmdldFNlY29uZHMoKSwgY291bnQpCn07Cmdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0VGltZVpvbmVSRkNfID0gZnVuY3Rpb24gJGdvb2ckaTE4biREYXRlVGltZUZvcm1hdCQkZm9ybWF0VGltZVpvbmVSRkNfJChjb3VudCwgZGF0ZSwgb3B0X3RpbWVab25lKSB7CiAgb3B0X3RpbWVab25lID0gb3B0X3RpbWVab25lIHx8IGdvb2cuaTE4bi5UaW1lWm9uZS5jcmVhdGVUaW1lWm9uZShkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkpOwogIHJldHVybiA0ID4gY291bnQgPyBvcHRfdGltZVpvbmUuZ2V0UkZDVGltZVpvbmVTdHJpbmcoZGF0ZSkgOiBvcHRfdGltZVpvbmUuZ2V0R01UU3RyaW5nKGRhdGUpCn07Cmdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0VGltZVpvbmVfID0gZnVuY3Rpb24gJGdvb2ckaTE4biREYXRlVGltZUZvcm1hdCQkZm9ybWF0VGltZVpvbmVfJChjb3VudCwgZGF0ZSwgb3B0X3RpbWVab25lKSB7CiAgb3B0X3RpbWVab25lID0gb3B0X3RpbWVab25lIHx8IGdvb2cuaTE4bi5UaW1lWm9uZS5jcmVhdGVUaW1lWm9uZShkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkpOwogIHJldHVybiA0ID4gY291bnQgPyBvcHRfdGltZVpvbmUuZ2V0U2hvcnROYW1lKGRhdGUpIDogb3B0X3RpbWVab25lLmdldExvbmdOYW1lKGRhdGUpCn07Cmdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0VGltZVpvbmVJZF8gPSBmdW5jdGlvbiAkZ29vZyRpMThuJERhdGVUaW1lRm9ybWF0JCRmb3JtYXRUaW1lWm9uZUlkXyQoZGF0ZSwgb3B0X3RpbWVab25lKSB7CiAgb3B0X3RpbWVab25lID0gb3B0X3RpbWVab25lIHx8IGdvb2cuaTE4bi5UaW1lWm9uZS5jcmVhdGVUaW1lWm9uZShkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkpOwogIHJldHVybiBvcHRfdGltZVpvbmUuZ2V0VGltZVpvbmVJZCgpCn07Cmdvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5wcm90b3R5cGUuZm9ybWF0RmllbGRfID0gZnVuY3Rpb24gJGdvb2ckaTE4biREYXRlVGltZUZvcm1hdCQkZm9ybWF0RmllbGRfJChwYXR0ZXJuU3RyLCBkYXRlLCBkYXRlRm9yRGF0ZSwgZGF0ZUZvclRpbWUsIG9wdF90aW1lWm9uZSkgewogIHZhciBjb3VudCA9IHBhdHRlcm5TdHIubGVuZ3RoOwogIHN3aXRjaChwYXR0ZXJuU3RyLmNoYXJBdCgwKSkgewogICAgY2FzZSAiRyI6CiAgICAgIHJldHVybiB0aGlzLmZvcm1hdEVyYV8oY291bnQsIGRhdGVGb3JEYXRlKTsKICAgIGNhc2UgInkiOgogICAgICByZXR1cm4gdGhpcy5mb3JtYXRZZWFyXyhjb3VudCwgZGF0ZUZvckRhdGUpOwogICAgY2FzZSAiTSI6CiAgICAgIHJldHVybiB0aGlzLmZvcm1hdE1vbnRoXyhjb3VudCwgZGF0ZUZvckRhdGUpOwogICAgY2FzZSAiayI6CiAgICAgIHJldHVybiB0aGlzLmZvcm1hdDI0SG91cnNfKGNvdW50LCBkYXRlRm9yVGltZSk7CiAgICBjYXNlICJTIjoKICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RnJhY3Rpb25hbFNlY29uZHNfKGNvdW50LCBkYXRlRm9yVGltZSk7CiAgICBjYXNlICJFIjoKICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF5T2ZXZWVrXyhjb3VudCwgZGF0ZUZvckRhdGUpOwogICAgY2FzZSAiYSI6CiAgICAgIHJldHVybiB0aGlzLmZvcm1hdEFtUG1fKGNvdW50LCBkYXRlRm9yVGltZSk7CiAgICBjYXNlICJoIjoKICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0MVRvMTJIb3Vyc18oY291bnQsIGRhdGVGb3JUaW1lKTsKICAgIGNhc2UgIksiOgogICAgICByZXR1cm4gdGhpcy5mb3JtYXQwVG8xMUhvdXJzXyhjb3VudCwgZGF0ZUZvclRpbWUpOwogICAgY2FzZSAiSCI6CiAgICAgIHJldHVybiB0aGlzLmZvcm1hdDBUbzIzSG91cnNfKGNvdW50LCBkYXRlRm9yVGltZSk7CiAgICBjYXNlICJjIjoKICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0U3RhbmRhbG9uZURheV8oY291bnQsIGRhdGVGb3JEYXRlKTsKICAgIGNhc2UgIkwiOgogICAgICByZXR1cm4gdGhpcy5mb3JtYXRTdGFuZGFsb25lTW9udGhfKGNvdW50LCBkYXRlRm9yRGF0ZSk7CiAgICBjYXNlICJRIjoKICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0UXVhcnRlcl8oY291bnQsIGRhdGVGb3JEYXRlKTsKICAgIGNhc2UgImQiOgogICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlXyhjb3VudCwgZGF0ZUZvckRhdGUpOwogICAgY2FzZSAibSI6CiAgICAgIHJldHVybiB0aGlzLmZvcm1hdE1pbnV0ZXNfKGNvdW50LCBkYXRlRm9yVGltZSk7CiAgICBjYXNlICJzIjoKICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0U2Vjb25kc18oY291bnQsIGRhdGVGb3JUaW1lKTsKICAgIGNhc2UgInYiOgogICAgICByZXR1cm4gdGhpcy5mb3JtYXRUaW1lWm9uZUlkXyhkYXRlLCBvcHRfdGltZVpvbmUpOwogICAgY2FzZSAieiI6CiAgICAgIHJldHVybiB0aGlzLmZvcm1hdFRpbWVab25lXyhjb3VudCwgZGF0ZSwgb3B0X3RpbWVab25lKTsKICAgIGNhc2UgIloiOgogICAgICByZXR1cm4gdGhpcy5mb3JtYXRUaW1lWm9uZVJGQ18oY291bnQsIGRhdGUsIG9wdF90aW1lWm9uZSk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4iIgogIH0KfTsKZ29vZy5zb3kgPSB7fTsKZ29vZy5zb3kucmVuZGVyRWxlbWVudCA9IGZ1bmN0aW9uICRnb29nJHNveSRyZW5kZXJFbGVtZW50JChlbGVtZW50LCB0ZW1wbGF0ZSwgb3B0X3RlbXBsYXRlRGF0YSwgb3B0X2luamVjdGVkRGF0YSkgewogIGVsZW1lbnQuaW5uZXJIVE1MID0gdGVtcGxhdGUob3B0X3RlbXBsYXRlRGF0YSB8fCBnb29nLnNveS5kZWZhdWx0VGVtcGxhdGVEYXRhXywgdm9pZCAwLCBvcHRfaW5qZWN0ZWREYXRhKQp9Owpnb29nLnNveS5yZW5kZXJBc0ZyYWdtZW50ID0gZnVuY3Rpb24gJGdvb2ckc295JHJlbmRlckFzRnJhZ21lbnQkKHRlbXBsYXRlLCBvcHRfdGVtcGxhdGVEYXRhLCBvcHRfaW5qZWN0ZWREYXRhLCBvcHRfZG9tSGVscGVyKSB7CiAgdmFyIGRvbSA9IG9wdF9kb21IZWxwZXIgfHwgZ29vZy5kb20uZ2V0RG9tSGVscGVyKCk7CiAgcmV0dXJuIGRvbS5odG1sVG9Eb2N1bWVudEZyYWdtZW50KHRlbXBsYXRlKG9wdF90ZW1wbGF0ZURhdGEgfHwgZ29vZy5zb3kuZGVmYXVsdFRlbXBsYXRlRGF0YV8sIHZvaWQgMCwgb3B0X2luamVjdGVkRGF0YSkpCn07Cmdvb2cuc295LnJlbmRlckFzRWxlbWVudCA9IGZ1bmN0aW9uICRnb29nJHNveSRyZW5kZXJBc0VsZW1lbnQkKHRlbXBsYXRlLCBvcHRfdGVtcGxhdGVEYXRhLCBvcHRfaW5qZWN0ZWREYXRhLCBvcHRfZG9tSGVscGVyKSB7CiAgdmFyIGRvbSA9IG9wdF9kb21IZWxwZXIgfHwgZ29vZy5kb20uZ2V0RG9tSGVscGVyKCksIHdyYXBwZXIgPSBkb20uY3JlYXRlRWxlbWVudChnb29nLmRvbS5UYWdOYW1lLkRJVik7CiAgd3JhcHBlci5pbm5lckhUTUwgPSB0ZW1wbGF0ZShvcHRfdGVtcGxhdGVEYXRhIHx8IGdvb2cuc295LmRlZmF1bHRUZW1wbGF0ZURhdGFfLCB2b2lkIDAsIG9wdF9pbmplY3RlZERhdGEpOwogIGlmKDEgPT0gd3JhcHBlci5jaGlsZE5vZGVzLmxlbmd0aCkgewogICAgdmFyIGZpcnN0Q2hpbGQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7CiAgICBpZihmaXJzdENoaWxkLm5vZGVUeXBlID09IGdvb2cuZG9tLk5vZGVUeXBlLkVMRU1FTlQpIHsKICAgICAgcmV0dXJuIGZpcnN0Q2hpbGQKICAgIH0KICB9CiAgcmV0dXJuIHdyYXBwZXIKfTsKZ29vZy5zb3kuZGVmYXVsdFRlbXBsYXRlRGF0YV8gPSB7fTsKdmFyIHNveSA9IHtlc2M6e319LCBzb3lkYXRhID0ge307CnNveS5TdHJpbmdCdWlsZGVyID0gZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyOwpzb3lkYXRhLlNhbml0aXplZENvbnRlbnRLaW5kID0ge0hUTUw6MCwgSlNfU1RSX0NIQVJTOjEsIFVSSToyLCBIVE1MX0FUVFJJQlVURTozfTsKc295ZGF0YS5TYW5pdGl6ZWRDb250ZW50ID0gZnVuY3Rpb24gJHNveWRhdGEkU2FuaXRpemVkQ29udGVudCQoY29udGVudCkgewogIHRoaXMuY29udGVudCA9IGNvbnRlbnQKfTsKc295ZGF0YS5TYW5pdGl6ZWRDb250ZW50LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICRzb3lkYXRhJFNhbml0aXplZENvbnRlbnQkJHRvU3RyaW5nJCgpIHsKICByZXR1cm4gdGhpcy5jb250ZW50Cn07CnNveWRhdGEuU2FuaXRpemVkSHRtbCA9IGZ1bmN0aW9uICRzb3lkYXRhJFNhbml0aXplZEh0bWwkKGNvbnRlbnQpIHsKICBzb3lkYXRhLlNhbml0aXplZENvbnRlbnQuY2FsbCh0aGlzLCBjb250ZW50KQp9Owpnb29nLmluaGVyaXRzKHNveWRhdGEuU2FuaXRpemVkSHRtbCwgc295ZGF0YS5TYW5pdGl6ZWRDb250ZW50KTsKc295ZGF0YS5TYW5pdGl6ZWRIdG1sLnByb3RvdHlwZS5jb250ZW50S2luZCA9IHNveWRhdGEuU2FuaXRpemVkQ29udGVudEtpbmQuSFRNTDsKc295ZGF0YS5TYW5pdGl6ZWRKc1N0ckNoYXJzID0gZnVuY3Rpb24gJHNveWRhdGEkU2FuaXRpemVkSnNTdHJDaGFycyQoY29udGVudCkgewogIHNveWRhdGEuU2FuaXRpemVkQ29udGVudC5jYWxsKHRoaXMsIGNvbnRlbnQpCn07Cmdvb2cuaW5oZXJpdHMoc295ZGF0YS5TYW5pdGl6ZWRKc1N0ckNoYXJzLCBzb3lkYXRhLlNhbml0aXplZENvbnRlbnQpOwpzb3lkYXRhLlNhbml0aXplZEpzU3RyQ2hhcnMucHJvdG90eXBlLmNvbnRlbnRLaW5kID0gc295ZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZC5KU19TVFJfQ0hBUlM7CnNveWRhdGEuU2FuaXRpemVkVXJpID0gZnVuY3Rpb24gJHNveWRhdGEkU2FuaXRpemVkVXJpJChjb250ZW50KSB7CiAgc295ZGF0YS5TYW5pdGl6ZWRDb250ZW50LmNhbGwodGhpcywgY29udGVudCkKfTsKZ29vZy5pbmhlcml0cyhzb3lkYXRhLlNhbml0aXplZFVyaSwgc295ZGF0YS5TYW5pdGl6ZWRDb250ZW50KTsKc295ZGF0YS5TYW5pdGl6ZWRVcmkucHJvdG90eXBlLmNvbnRlbnRLaW5kID0gc295ZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZC5VUkk7CnNveWRhdGEuU2FuaXRpemVkSHRtbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICRzb3lkYXRhJFNhbml0aXplZEh0bWxBdHRyaWJ1dGUkKGNvbnRlbnQpIHsKICBzb3lkYXRhLlNhbml0aXplZENvbnRlbnQuY2FsbCh0aGlzLCBjb250ZW50KQp9Owpnb29nLmluaGVyaXRzKHNveWRhdGEuU2FuaXRpemVkSHRtbEF0dHJpYnV0ZSwgc295ZGF0YS5TYW5pdGl6ZWRDb250ZW50KTsKc295ZGF0YS5TYW5pdGl6ZWRIdG1sQXR0cmlidXRlLnByb3RvdHlwZS5jb250ZW50S2luZCA9IHNveWRhdGEuU2FuaXRpemVkQ29udGVudEtpbmQuSFRNTF9BVFRSSUJVVEU7CnNveS5yZW5kZXJFbGVtZW50ID0gZ29vZy5zb3kucmVuZGVyRWxlbWVudDsKc295LnJlbmRlckFzRnJhZ21lbnQgPSBmdW5jdGlvbiAkc295JHJlbmRlckFzRnJhZ21lbnQkKHRlbXBsYXRlLCBvcHRfdGVtcGxhdGVEYXRhLCBvcHRfZG9jdW1lbnQsIG9wdF9pbmplY3RlZERhdGEpIHsKICByZXR1cm4gZ29vZy5zb3kucmVuZGVyQXNGcmFnbWVudCh0ZW1wbGF0ZSwgb3B0X3RlbXBsYXRlRGF0YSwgb3B0X2luamVjdGVkRGF0YSwgbmV3IGdvb2cuZG9tLkRvbUhlbHBlcihvcHRfZG9jdW1lbnQpKQp9Owpzb3kucmVuZGVyQXNFbGVtZW50ID0gZnVuY3Rpb24gJHNveSRyZW5kZXJBc0VsZW1lbnQkKHRlbXBsYXRlLCBvcHRfdGVtcGxhdGVEYXRhLCBvcHRfZG9jdW1lbnQsIG9wdF9pbmplY3RlZERhdGEpIHsKICByZXR1cm4gZ29vZy5zb3kucmVuZGVyQXNFbGVtZW50KHRlbXBsYXRlLCBvcHRfdGVtcGxhdGVEYXRhLCBvcHRfaW5qZWN0ZWREYXRhLCBuZXcgZ29vZy5kb20uRG9tSGVscGVyKG9wdF9kb2N1bWVudCkpCn07CnNveS4kJGF1Z21lbnREYXRhID0gZnVuY3Rpb24gJHNveSQkJGF1Z21lbnREYXRhJChvcmlnRGF0YSwgYWRkaXRpb25hbFBhcmFtcykgewogIGZ1bmN0aW9uIFRlbXBDdG9yKCkgewogIH0KICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBvcmlnRGF0YTsKICB2YXIgbmV3RGF0YSA9IG5ldyBUZW1wQ3Rvciwga2V5OwogIGZvcihrZXkgaW4gYWRkaXRpb25hbFBhcmFtcykgewogICAgbmV3RGF0YVtrZXldID0gYWRkaXRpb25hbFBhcmFtc1trZXldCiAgfQogIHJldHVybiBuZXdEYXRhCn07CnNveS4kJGdldE1hcEtleXMgPSBmdW5jdGlvbiAkc295JCQkZ2V0TWFwS2V5cyQobWFwKSB7CiAgdmFyIG1hcEtleXMgPSBbXSwga2V5OwogIGZvcihrZXkgaW4gbWFwKSB7CiAgICBtYXBLZXlzLnB1c2goa2V5KQogIH0KICByZXR1cm4gbWFwS2V5cwp9Owpzb3kuJCRnZXREZWxlZ2F0ZUlkID0gZnVuY3Rpb24gJHNveSQkJGdldERlbGVnYXRlSWQkKGRlbFRlbXBsYXRlTmFtZSkgewogIHJldHVybiBkZWxUZW1wbGF0ZU5hbWUKfTsKc295LiQkREVMRUdBVEVfUkVHSVNUUllfUFJJT1JJVElFU18gPSB7fTsKc295LiQkREVMRUdBVEVfUkVHSVNUUllfRlVOQ1RJT05TXyA9IHt9Owpzb3kuJCRyZWdpc3RlckRlbGVnYXRlRm4gPSBmdW5jdGlvbiAkc295JCQkcmVnaXN0ZXJEZWxlZ2F0ZUZuJChkZWxUZW1wbGF0ZUlkLCBkZWxQcmlvcml0eSwgZGVsRm4pIHsKICB2YXIgbWFwS2V5ID0gImtleV8iICsgZGVsVGVtcGxhdGVJZCwgY3VyclByaW9yaXR5ID0gc295LiQkREVMRUdBVEVfUkVHSVNUUllfUFJJT1JJVElFU19bbWFwS2V5XTsKICBpZih2b2lkIDAgPT09IGN1cnJQcmlvcml0eSB8fCBkZWxQcmlvcml0eSA+IGN1cnJQcmlvcml0eSkgewogICAgc295LiQkREVMRUdBVEVfUkVHSVNUUllfUFJJT1JJVElFU19bbWFwS2V5XSA9IGRlbFByaW9yaXR5LCBzb3kuJCRERUxFR0FURV9SRUdJU1RSWV9GVU5DVElPTlNfW21hcEtleV0gPSBkZWxGbgogIH1lbHNlIHsKICAgIGlmKGRlbFByaW9yaXR5ID09IGN1cnJQcmlvcml0eSkgewogICAgICB0aHJvdyBFcnJvcignRW5jb3VudGVyZWQgdHdvIGFjdGl2ZSBkZWxlZ2F0ZXMgd2l0aCBzYW1lIHByaW9yaXR5IChpZC9uYW1lICInICsgZGVsVGVtcGxhdGVJZCArICciKS4nKTsKICAgIH0KICB9Cn07CnNveS4kJGdldERlbGVnYXRlRm4gPSBmdW5jdGlvbiAkc295JCQkZ2V0RGVsZWdhdGVGbiQoZGVsVGVtcGxhdGVJZCkgewogIHZhciBkZWxGbiA9IHNveS4kJERFTEVHQVRFX1JFR0lTVFJZX0ZVTkNUSU9OU19bImtleV8iICsgZGVsVGVtcGxhdGVJZF07CiAgcmV0dXJuIGRlbEZuID8gZGVsRm4gOiBzb3kuJCRFTVBUWV9URU1QTEFURV9GTl8KfTsKc295LiQkRU1QVFlfVEVNUExBVEVfRk5fID0gZnVuY3Rpb24gJHNveSQkJEVNUFRZX1RFTVBMQVRFX0ZOXyQoKSB7CiAgcmV0dXJuIiIKfTsKc295LiQkZXNjYXBlSHRtbCA9IGZ1bmN0aW9uICRzb3kkJCRlc2NhcGVIdG1sJCh2YWx1ZSkgewogIHJldHVybiJvYmplY3QiID09PSB0eXBlb2YgdmFsdWUgJiYgdmFsdWUgJiYgdmFsdWUuY29udGVudEtpbmQgPT09IHNveWRhdGEuU2FuaXRpemVkQ29udGVudEtpbmQuSFRNTCA/IHZhbHVlLmNvbnRlbnQgOiBzb3kuZXNjLiQkZXNjYXBlSHRtbEhlbHBlcih2YWx1ZSkKfTsKc295LiQkZXNjYXBlSHRtbFJjZGF0YSA9IGZ1bmN0aW9uICRzb3kkJCRlc2NhcGVIdG1sUmNkYXRhJCh2YWx1ZSkgewogIHJldHVybiJvYmplY3QiID09PSB0eXBlb2YgdmFsdWUgJiYgdmFsdWUgJiYgdmFsdWUuY29udGVudEtpbmQgPT09IHNveWRhdGEuU2FuaXRpemVkQ29udGVudEtpbmQuSFRNTCA/IHNveS5lc2MuJCRub3JtYWxpemVIdG1sSGVscGVyKHZhbHVlLmNvbnRlbnQpIDogc295LmVzYy4kJGVzY2FwZUh0bWxIZWxwZXIodmFsdWUpCn07CnNveS4kJHN0cmlwSHRtbFRhZ3MgPSBmdW5jdGlvbiAkc295JCQkc3RyaXBIdG1sVGFncyQodmFsdWUpIHsKICByZXR1cm4oIiIgKyB2YWx1ZSkucmVwbGFjZShzb3kuZXNjLiQkSFRNTF9UQUdfUkVHRVhfLCAiIikKfTsKc295LiQkZXNjYXBlSHRtbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICRzb3kkJCRlc2NhcGVIdG1sQXR0cmlidXRlJCh2YWx1ZSkgewogIHJldHVybiJvYmplY3QiID09PSB0eXBlb2YgdmFsdWUgJiYgdmFsdWUgJiYgdmFsdWUuY29udGVudEtpbmQgPT09IHNveWRhdGEuU2FuaXRpemVkQ29udGVudEtpbmQuSFRNTCA/IHNveS5lc2MuJCRub3JtYWxpemVIdG1sSGVscGVyKHNveS4kJHN0cmlwSHRtbFRhZ3ModmFsdWUuY29udGVudCkpIDogc295LmVzYy4kJGVzY2FwZUh0bWxIZWxwZXIodmFsdWUpCn07CnNveS4kJGVzY2FwZUh0bWxBdHRyaWJ1dGVOb3NwYWNlID0gZnVuY3Rpb24gJHNveSQkJGVzY2FwZUh0bWxBdHRyaWJ1dGVOb3NwYWNlJCh2YWx1ZSkgewogIHJldHVybiJvYmplY3QiID09PSB0eXBlb2YgdmFsdWUgJiYgdmFsdWUgJiYgdmFsdWUuY29udGVudEtpbmQgPT09IHNveWRhdGEuU2FuaXRpemVkQ29udGVudEtpbmQuSFRNTCA/IHNveS5lc2MuJCRub3JtYWxpemVIdG1sTm9zcGFjZUhlbHBlcihzb3kuJCRzdHJpcEh0bWxUYWdzKHZhbHVlLmNvbnRlbnQpKSA6IHNveS5lc2MuJCRlc2NhcGVIdG1sTm9zcGFjZUhlbHBlcih2YWx1ZSkKfTsKc295LiQkZmlsdGVySHRtbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICRzb3kkJCRmaWx0ZXJIdG1sQXR0cmlidXRlJCh2YWx1ZSkgewogIHJldHVybiJvYmplY3QiID09PSB0eXBlb2YgdmFsdWUgJiYgdmFsdWUgJiYgdmFsdWUuY29udGVudEtpbmQgPT09IHNveWRhdGEuU2FuaXRpemVkQ29udGVudEtpbmQuSFRNTF9BVFRSSUJVVEUgPyB2YWx1ZS5jb250ZW50LnJlcGxhY2UoLz0oW14iJ10qKSQvLCAnPSIkMSInKSA6IHNveS5lc2MuJCRmaWx0ZXJIdG1sQXR0cmlidXRlSGVscGVyKHZhbHVlKQp9Owpzb3kuJCRmaWx0ZXJIdG1sRWxlbWVudE5hbWUgPSBmdW5jdGlvbiAkc295JCQkZmlsdGVySHRtbEVsZW1lbnROYW1lJCh2YWx1ZSkgewogIHJldHVybiBzb3kuZXNjLiQkZmlsdGVySHRtbEVsZW1lbnROYW1lSGVscGVyKHZhbHVlKQp9Owpzb3kuJCRlc2NhcGVKcyA9IGZ1bmN0aW9uICRzb3kkJCRlc2NhcGVKcyQodmFsdWUpIHsKICByZXR1cm4gc295LiQkZXNjYXBlSnNTdHJpbmcodmFsdWUpCn07CnNveS4kJGVzY2FwZUpzU3RyaW5nID0gZnVuY3Rpb24gJHNveSQkJGVzY2FwZUpzU3RyaW5nJCh2YWx1ZSkgewogIHJldHVybiJvYmplY3QiID09PSB0eXBlb2YgdmFsdWUgJiYgdmFsdWUuY29udGVudEtpbmQgPT09IHNveWRhdGEuU2FuaXRpemVkQ29udGVudEtpbmQuSlNfU1RSX0NIQVJTID8gdmFsdWUuY29udGVudCA6IHNveS5lc2MuJCRlc2NhcGVKc1N0cmluZ0hlbHBlcih2YWx1ZSkKfTsKc295LiQkZXNjYXBlSnNWYWx1ZSA9IGZ1bmN0aW9uICRzb3kkJCRlc2NhcGVKc1ZhbHVlJCh2YWx1ZSkgewogIGlmKG51bGwgPT0gdmFsdWUpIHsKICAgIHJldHVybiIgbnVsbCAiCiAgfQogIHN3aXRjaCh0eXBlb2YgdmFsdWUpIHsKICAgIGNhc2UgImJvb2xlYW4iOgogICAgOwogICAgY2FzZSAibnVtYmVyIjoKICAgICAgcmV0dXJuIiAiICsgdmFsdWUgKyAiICI7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4iJyIgKyBzb3kuZXNjLiQkZXNjYXBlSnNTdHJpbmdIZWxwZXIoIiIgKyB2YWx1ZSkgKyAiJyIKICB9Cn07CnNveS4kJGVzY2FwZUpzUmVnZXggPSBmdW5jdGlvbiAkc295JCQkZXNjYXBlSnNSZWdleCQodmFsdWUpIHsKICByZXR1cm4gc295LmVzYy4kJGVzY2FwZUpzUmVnZXhIZWxwZXIodmFsdWUpCn07CnNveS4kJHByb2JsZW1hdGljVXJpTWFya3NfID0gL1snKCldL2c7CnNveS4kJHBjdEVuY29kZV8gPSBmdW5jdGlvbiAkc295JCQkcGN0RW5jb2RlXyQoY2gpIHsKICByZXR1cm4iJSIgKyBjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KQp9Owpzb3kuJCRlc2NhcGVVcmkgPSBmdW5jdGlvbiAkc295JCQkZXNjYXBlVXJpJCh2YWx1ZSkgewogIGlmKCJvYmplY3QiID09PSB0eXBlb2YgdmFsdWUgJiYgdmFsdWUuY29udGVudEtpbmQgPT09IHNveWRhdGEuU2FuaXRpemVkQ29udGVudEtpbmQuVVJJKSB7CiAgICByZXR1cm4gc295LiQkbm9ybWFsaXplVXJpKHZhbHVlKQogIH0KICB2YXIgZW5jb2RlZCA9IHNveS5lc2MuJCRlc2NhcGVVcmlIZWxwZXIodmFsdWUpOwogIHNveS4kJHByb2JsZW1hdGljVXJpTWFya3NfLmxhc3RJbmRleCA9IDA7CiAgcmV0dXJuIHNveS4kJHByb2JsZW1hdGljVXJpTWFya3NfLnRlc3QoZW5jb2RlZCkgPyBlbmNvZGVkLnJlcGxhY2Uoc295LiQkcHJvYmxlbWF0aWNVcmlNYXJrc18sIHNveS4kJHBjdEVuY29kZV8pIDogZW5jb2RlZAp9Owpzb3kuJCRub3JtYWxpemVVcmkgPSBmdW5jdGlvbiAkc295JCQkbm9ybWFsaXplVXJpJCh2YWx1ZSkgewogIHJldHVybiBzb3kuZXNjLiQkbm9ybWFsaXplVXJpSGVscGVyKHZhbHVlKQp9Owpzb3kuJCRmaWx0ZXJOb3JtYWxpemVVcmkgPSBmdW5jdGlvbiAkc295JCQkZmlsdGVyTm9ybWFsaXplVXJpJCh2YWx1ZSkgewogIHJldHVybiBzb3kuZXNjLiQkZmlsdGVyTm9ybWFsaXplVXJpSGVscGVyKHZhbHVlKQp9Owpzb3kuJCRlc2NhcGVDc3NTdHJpbmcgPSBmdW5jdGlvbiAkc295JCQkZXNjYXBlQ3NzU3RyaW5nJCh2YWx1ZSkgewogIHJldHVybiBzb3kuZXNjLiQkZXNjYXBlQ3NzU3RyaW5nSGVscGVyKHZhbHVlKQp9Owpzb3kuJCRmaWx0ZXJDc3NWYWx1ZSA9IGZ1bmN0aW9uICRzb3kkJCRmaWx0ZXJDc3NWYWx1ZSQodmFsdWUpIHsKICByZXR1cm4gbnVsbCA9PSB2YWx1ZSA/ICIiIDogc295LmVzYy4kJGZpbHRlckNzc1ZhbHVlSGVscGVyKHZhbHVlKQp9Owpzb3kuJCRjaGFuZ2VOZXdsaW5lVG9CciA9IGZ1bmN0aW9uICRzb3kkJCRjaGFuZ2VOZXdsaW5lVG9CciQoc3RyKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLm5ld0xpbmVUb0JyKCIiICsgc3RyLCAhMSkKfTsKc295LiQkaW5zZXJ0V29yZEJyZWFrcyA9IGZ1bmN0aW9uICRzb3kkJCRpbnNlcnRXb3JkQnJlYWtzJChzdHIsIG1heENoYXJzQmV0d2VlbldvcmRCcmVha3MpIHsKICByZXR1cm4gZ29vZy5mb3JtYXQuaW5zZXJ0V29yZEJyZWFrcygiIiArIHN0ciwgbWF4Q2hhcnNCZXR3ZWVuV29yZEJyZWFrcykKfTsKc295LiQkdHJ1bmNhdGUgPSBmdW5jdGlvbiAkc295JCQkdHJ1bmNhdGUkKHN0ciwgbWF4TGVuLCBkb0FkZEVsbGlwc2lzKSB7CiAgc3RyID0gIiIgKyBzdHI7CiAgaWYoc3RyLmxlbmd0aCA8PSBtYXhMZW4pIHsKICAgIHJldHVybiBzdHIKICB9CiAgZG9BZGRFbGxpcHNpcyAmJiAoMyA8IG1heExlbiA/IG1heExlbiAtPSAzIDogZG9BZGRFbGxpcHNpcyA9ICExKTsKICBzb3kuJCRpc0hpZ2hTdXJyb2dhdGVfKHN0ci5jaGFyQXQobWF4TGVuIC0gMSkpICYmIHNveS4kJGlzTG93U3Vycm9nYXRlXyhzdHIuY2hhckF0KG1heExlbikpICYmIChtYXhMZW4gLT0gMSk7CiAgc3RyID0gc3RyLnN1YnN0cmluZygwLCBtYXhMZW4pOwogIGRvQWRkRWxsaXBzaXMgJiYgKHN0ciArPSAiLi4uIik7CiAgcmV0dXJuIHN0cgp9Owpzb3kuJCRpc0hpZ2hTdXJyb2dhdGVfID0gZnVuY3Rpb24gJHNveSQkJGlzSGlnaFN1cnJvZ2F0ZV8kKGNoKSB7CiAgcmV0dXJuIDU1Mjk2IDw9IGNoICYmIDU2MzE5ID49IGNoCn07CnNveS4kJGlzTG93U3Vycm9nYXRlXyA9IGZ1bmN0aW9uICRzb3kkJCRpc0xvd1N1cnJvZ2F0ZV8kKGNoKSB7CiAgcmV0dXJuIDU2MzIwIDw9IGNoICYmIDU3MzQzID49IGNoCn07CnNveS4kJGJpZGlGb3JtYXR0ZXJDYWNoZV8gPSB7fTsKc295LiQkZ2V0QmlkaUZvcm1hdHRlckluc3RhbmNlXyA9IGZ1bmN0aW9uICRzb3kkJCRnZXRCaWRpRm9ybWF0dGVySW5zdGFuY2VfJChiaWRpR2xvYmFsRGlyKSB7CiAgcmV0dXJuIHNveS4kJGJpZGlGb3JtYXR0ZXJDYWNoZV9bYmlkaUdsb2JhbERpcl0gfHwgKHNveS4kJGJpZGlGb3JtYXR0ZXJDYWNoZV9bYmlkaUdsb2JhbERpcl0gPSBuZXcgZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXIoYmlkaUdsb2JhbERpcikpCn07CnNveS4kJGJpZGlUZXh0RGlyID0gZnVuY3Rpb24gJHNveSQkJGJpZGlUZXh0RGlyJCh0ZXh0LCBvcHRfaXNIdG1sKSB7CiAgcmV0dXJuIXRleHQgPyAwIDogZ29vZy5pMThuLmJpZGkuZGV0ZWN0UnRsRGlyZWN0aW9uYWxpdHkodGV4dCwgb3B0X2lzSHRtbCkgPyAtMSA6IDEKfTsKc295LiQkYmlkaURpckF0dHIgPSBmdW5jdGlvbiAkc295JCQkYmlkaURpckF0dHIkKGJpZGlHbG9iYWxEaXIsIHRleHQsIG9wdF9pc0h0bWwpIHsKICByZXR1cm4gbmV3IHNveWRhdGEuU2FuaXRpemVkSHRtbEF0dHJpYnV0ZShzb3kuJCRnZXRCaWRpRm9ybWF0dGVySW5zdGFuY2VfKGJpZGlHbG9iYWxEaXIpLmRpckF0dHIodGV4dCwgb3B0X2lzSHRtbCkpCn07CnNveS4kJGJpZGlNYXJrQWZ0ZXIgPSBmdW5jdGlvbiAkc295JCQkYmlkaU1hcmtBZnRlciQoYmlkaUdsb2JhbERpciwgdGV4dCwgb3B0X2lzSHRtbCkgewogIHZhciBmb3JtYXR0ZXIgPSBzb3kuJCRnZXRCaWRpRm9ybWF0dGVySW5zdGFuY2VfKGJpZGlHbG9iYWxEaXIpOwogIHJldHVybiBmb3JtYXR0ZXIubWFya0FmdGVyKHRleHQsIG9wdF9pc0h0bWwpCn07CnNveS4kJGJpZGlTcGFuV3JhcCA9IGZ1bmN0aW9uICRzb3kkJCRiaWRpU3BhbldyYXAkKGJpZGlHbG9iYWxEaXIsIHN0cikgewogIHZhciBmb3JtYXR0ZXIgPSBzb3kuJCRnZXRCaWRpRm9ybWF0dGVySW5zdGFuY2VfKGJpZGlHbG9iYWxEaXIpOwogIHJldHVybiBmb3JtYXR0ZXIuc3BhbldyYXAoc3RyICsgIiIsICEwKQp9Owpzb3kuJCRiaWRpVW5pY29kZVdyYXAgPSBmdW5jdGlvbiAkc295JCQkYmlkaVVuaWNvZGVXcmFwJChiaWRpR2xvYmFsRGlyLCBzdHIpIHsKICB2YXIgZm9ybWF0dGVyID0gc295LiQkZ2V0QmlkaUZvcm1hdHRlckluc3RhbmNlXyhiaWRpR2xvYmFsRGlyKTsKICByZXR1cm4gZm9ybWF0dGVyLnVuaWNvZGVXcmFwKHN0ciArICIiLCAhMCkKfTsKc295LmVzYy4kJGVzY2FwZVVyaUhlbHBlciA9IGZ1bmN0aW9uICRzb3kkZXNjJCQkZXNjYXBlVXJpSGVscGVyJCh2KSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnVybEVuY29kZSgiIiArIHYpCn07CnNveS5lc2MuJCRFU0NBUEVfTUFQX0ZPUl9FU0NBUEVfSFRNTF9fQU5EX19OT1JNQUxJWkVfSFRNTF9fQU5EX19FU0NBUEVfSFRNTF9OT1NQQUNFX19BTkRfX05PUk1BTElaRV9IVE1MX05PU1BBQ0VfID0geyJceDAwIjoiJiMwOyIsICciJzoiJnF1b3Q7IiwgIiYiOiImYW1wOyIsICInIjoiJiMzOTsiLCAiPCI6IiZsdDsiLCAiPiI6IiZndDsiLCAiXHQiOiImIzk7IiwgIlxuIjoiJiMxMDsiLCAiXHgwQiI6IiYjMTE7IiwgIlx1MDAwYyI6IiYjMTI7IiwgIlxyIjoiJiMxMzsiLCAiICI6IiYjMzI7IiwgIi0iOiImIzQ1OyIsICIvIjoiJiM0NzsiLCAiPSI6IiYjNjE7IiwgImAiOiImIzk2OyIsICJcdTAwODUiOiImIzEzMzsiLCAiXHUwMGEwIjoiJiMxNjA7IiwgIlx1MjAyOCI6IiYjODIzMjsiLCAiXHUyMDI5IjoiJiM4MjMzOyJ9Owpzb3kuZXNjLiQkUkVQTEFDRVJfRk9SX0VTQ0FQRV9IVE1MX19BTkRfX05PUk1BTElaRV9IVE1MX19BTkRfX0VTQ0FQRV9IVE1MX05PU1BBQ0VfX0FORF9fTk9STUFMSVpFX0hUTUxfTk9TUEFDRV8gPSBmdW5jdGlvbiAkc295JGVzYyQkJFJFUExBQ0VSX0ZPUl9FU0NBUEVfSFRNTF9fQU5EX19OT1JNQUxJWkVfSFRNTF9fQU5EX19FU0NBUEVfSFRNTF9OT1NQQUNFX19BTkRfX05PUk1BTElaRV9IVE1MX05PU1BBQ0VfJChjaCkgewogIHJldHVybiBzb3kuZXNjLiQkRVNDQVBFX01BUF9GT1JfRVNDQVBFX0hUTUxfX0FORF9fTk9STUFMSVpFX0hUTUxfX0FORF9fRVNDQVBFX0hUTUxfTk9TUEFDRV9fQU5EX19OT1JNQUxJWkVfSFRNTF9OT1NQQUNFX1tjaF0KfTsKc295LmVzYy4kJEVTQ0FQRV9NQVBfRk9SX0VTQ0FQRV9KU19TVFJJTkdfX0FORF9fRVNDQVBFX0pTX1JFR0VYXyA9IHsiXHgwMCI6IlxceDAwIiwgIlx1MDAwOCI6IlxceDA4IiwgIlx0IjoiXFx0IiwgIlxuIjoiXFxuIiwgIlx4MEIiOiJcXHgwYiIsICJcdTAwMGMiOiJcXGYiLCAiXHIiOiJcXHIiLCAnIic6IlxceDIyIiwgIiYiOiJcXHgyNiIsICInIjoiXFx4MjciLCAiLyI6IlxcLyIsICI8IjoiXFx4M2MiLCAiPSI6IlxceDNkIiwgIj4iOiJcXHgzZSIsICJcXCI6IlxcXFwiLCAiXHUwMDg1IjoiXFx4ODUiLCAiXHUyMDI4IjoiXFx1MjAyOCIsICJcdTIwMjkiOiJcXHUyMDI5IiwgJDoiXFx4MjQiLCAiKCI6IlxceDI4IiwgIikiOiJcXHgyOSIsICIqIjoiXFx4MmEiLCAiKyI6IlxceDJiIiwgIiwiOiJcXHgyYyIsICItIjoiXFx4MmQiLCAiLiI6IlxceDJlIiwgIjoiOiJcXHgzYSIsICI/IjoiXFx4M2YiLCAiWyI6IlxceDViIiwgIl0iOiJcXHg1ZCIsICJeIjoiXFx4NWUiLCAieyI6IlxceDdiIiwgCiJ8IjoiXFx4N2MiLCAifSI6IlxceDdkIn07CnNveS5lc2MuJCRSRVBMQUNFUl9GT1JfRVNDQVBFX0pTX1NUUklOR19fQU5EX19FU0NBUEVfSlNfUkVHRVhfID0gZnVuY3Rpb24gJHNveSRlc2MkJCRSRVBMQUNFUl9GT1JfRVNDQVBFX0pTX1NUUklOR19fQU5EX19FU0NBUEVfSlNfUkVHRVhfJChjaCkgewogIHJldHVybiBzb3kuZXNjLiQkRVNDQVBFX01BUF9GT1JfRVNDQVBFX0pTX1NUUklOR19fQU5EX19FU0NBUEVfSlNfUkVHRVhfW2NoXQp9Owpzb3kuZXNjLiQkRVNDQVBFX01BUF9GT1JfRVNDQVBFX0NTU19TVFJJTkdfID0geyJceDAwIjoiXFwwICIsICJcdTAwMDgiOiJcXDggIiwgIlx0IjoiXFw5ICIsICJcbiI6IlxcYSAiLCAiXHgwQiI6IlxcYiAiLCAiXHUwMDBjIjoiXFxjICIsICJcciI6IlxcZCAiLCAnIic6IlxcMjIgIiwgIiYiOiJcXDI2ICIsICInIjoiXFwyNyAiLCAiKCI6IlxcMjggIiwgIikiOiJcXDI5ICIsICIqIjoiXFwyYSAiLCAiLyI6IlxcMmYgIiwgIjoiOiJcXDNhICIsICI7IjoiXFwzYiAiLCAiPCI6IlxcM2MgIiwgIj0iOiJcXDNkICIsICI+IjoiXFwzZSAiLCAiQCI6IlxcNDAgIiwgIlxcIjoiXFw1YyAiLCAieyI6IlxcN2IgIiwgIn0iOiJcXDdkICIsICJcdTAwODUiOiJcXDg1ICIsICJcdTAwYTAiOiJcXGEwICIsICJcdTIwMjgiOiJcXDIwMjggIiwgIlx1MjAyOSI6IlxcMjAyOSAifTsKc295LmVzYy4kJFJFUExBQ0VSX0ZPUl9FU0NBUEVfQ1NTX1NUUklOR18gPSBmdW5jdGlvbiAkc295JGVzYyQkJFJFUExBQ0VSX0ZPUl9FU0NBUEVfQ1NTX1NUUklOR18kKGNoKSB7CiAgcmV0dXJuIHNveS5lc2MuJCRFU0NBUEVfTUFQX0ZPUl9FU0NBUEVfQ1NTX1NUUklOR19bY2hdCn07CnNveS5lc2MuJCRFU0NBUEVfTUFQX0ZPUl9OT1JNQUxJWkVfVVJJX19BTkRfX0ZJTFRFUl9OT1JNQUxJWkVfVVJJXyA9IHsiXHgwMCI6IiUwMCIsICJcdTAwMDEiOiIlMDEiLCAiXHUwMDAyIjoiJTAyIiwgIlx1MDAwMyI6IiUwMyIsICJcdTAwMDQiOiIlMDQiLCAiXHUwMDA1IjoiJTA1IiwgIlx1MDAwNiI6IiUwNiIsICJcdTAwMDciOiIlMDciLCAiXHUwMDA4IjoiJTA4IiwgIlx0IjoiJTA5IiwgIlxuIjoiJTBBIiwgIlx4MEIiOiIlMEIiLCAiXHUwMDBjIjoiJTBDIiwgIlxyIjoiJTBEIiwgIlx1MDAwZSI6IiUwRSIsICJcdTAwMGYiOiIlMEYiLCAiXHUwMDEwIjoiJTEwIiwgIlx1MDAxMSI6IiUxMSIsICJcdTAwMTIiOiIlMTIiLCAiXHUwMDEzIjoiJTEzIiwgIlx1MDAxNCI6IiUxNCIsICJcdTAwMTUiOiIlMTUiLCAiXHUwMDE2IjoiJTE2IiwgIlx1MDAxNyI6IiUxNyIsICJcdTAwMTgiOiIlMTgiLCAiXHUwMDE5IjoiJTE5IiwgIlx1MDAxYSI6IiUxQSIsICJcdTAwMWIiOiIlMUIiLCAKIlx1MDAxYyI6IiUxQyIsICJcdTAwMWQiOiIlMUQiLCAiXHUwMDFlIjoiJTFFIiwgIlx1MDAxZiI6IiUxRiIsICIgIjoiJTIwIiwgJyInOiIlMjIiLCAiJyI6IiUyNyIsICIoIjoiJTI4IiwgIikiOiIlMjkiLCAiPCI6IiUzQyIsICI+IjoiJTNFIiwgIlxcIjoiJTVDIiwgInsiOiIlN0IiLCAifSI6IiU3RCIsICJcdTAwN2YiOiIlN0YiLCAiXHUwMDg1IjoiJUMyJTg1IiwgIlx1MDBhMCI6IiVDMiVBMCIsICJcdTIwMjgiOiIlRTIlODAlQTgiLCAiXHUyMDI5IjoiJUUyJTgwJUE5IiwgIlx1ZmYwMSI6IiVFRiVCQyU4MSIsICJcdWZmMDMiOiIlRUYlQkMlODMiLCAiXHVmZjA0IjoiJUVGJUJDJTg0IiwgIlx1ZmYwNiI6IiVFRiVCQyU4NiIsICJcdWZmMDciOiIlRUYlQkMlODciLCAiXHVmZjA4IjoiJUVGJUJDJTg4IiwgIlx1ZmYwOSI6IiVFRiVCQyU4OSIsICJcdWZmMGEiOiIlRUYlQkMlOEEiLCAiXHVmZjBiIjoiJUVGJUJDJThCIiwgIlx1ZmYwYyI6IiVFRiVCQyU4QyIsICJcdWZmMGYiOiIlRUYlQkMlOEYiLCAKIlx1ZmYxYSI6IiVFRiVCQyU5QSIsICJcdWZmMWIiOiIlRUYlQkMlOUIiLCAiXHVmZjFkIjoiJUVGJUJDJTlEIiwgIlx1ZmYxZiI6IiVFRiVCQyU5RiIsICJcdWZmMjAiOiIlRUYlQkMlQTAiLCAiXHVmZjNiIjoiJUVGJUJDJUJCIiwgIlx1ZmYzZCI6IiVFRiVCQyVCRCJ9Owpzb3kuZXNjLiQkUkVQTEFDRVJfRk9SX05PUk1BTElaRV9VUklfX0FORF9fRklMVEVSX05PUk1BTElaRV9VUklfID0gZnVuY3Rpb24gJHNveSRlc2MkJCRSRVBMQUNFUl9GT1JfTk9STUFMSVpFX1VSSV9fQU5EX19GSUxURVJfTk9STUFMSVpFX1VSSV8kKGNoKSB7CiAgcmV0dXJuIHNveS5lc2MuJCRFU0NBUEVfTUFQX0ZPUl9OT1JNQUxJWkVfVVJJX19BTkRfX0ZJTFRFUl9OT1JNQUxJWkVfVVJJX1tjaF0KfTsKc295LmVzYy4kJE1BVENIRVJfRk9SX0VTQ0FQRV9IVE1MXyA9IC9bXHgwMFx4MjJceDI2XHgyN1x4M2NceDNlXS9nOwpzb3kuZXNjLiQkTUFUQ0hFUl9GT1JfTk9STUFMSVpFX0hUTUxfID0gL1tceDAwXHgyMlx4MjdceDNjXHgzZV0vZzsKc295LmVzYy4kJE1BVENIRVJfRk9SX0VTQ0FQRV9IVE1MX05PU1BBQ0VfID0gL1tceDAwXHgwOS1ceDBkIFx4MjJceDI2XHgyN1x4MmRcL1x4M2MtXHgzZWBceDg1XHhhMFx1MjAyOFx1MjAyOV0vZzsKc295LmVzYy4kJE1BVENIRVJfRk9SX05PUk1BTElaRV9IVE1MX05PU1BBQ0VfID0gL1tceDAwXHgwOS1ceDBkIFx4MjJceDI3XHgyZFwvXHgzYy1ceDNlYFx4ODVceGEwXHUyMDI4XHUyMDI5XS9nOwpzb3kuZXNjLiQkTUFUQ0hFUl9GT1JfRVNDQVBFX0pTX1NUUklOR18gPSAvW1x4MDBceDA4LVx4MGRceDIyXHgyNlx4MjdcL1x4M2MtXHgzZVxcXHg4NVx1MjAyOFx1MjAyOV0vZzsKc295LmVzYy4kJE1BVENIRVJfRk9SX0VTQ0FQRV9KU19SRUdFWF8gPSAvW1x4MDBceDA4LVx4MGRceDIyXHgyNFx4MjYtXC9ceDNhXHgzYy1ceDNmXHg1Yi1ceDVlXHg3Yi1ceDdkXHg4NVx1MjAyOFx1MjAyOV0vZzsKc295LmVzYy4kJE1BVENIRVJfRk9SX0VTQ0FQRV9DU1NfU1RSSU5HXyA9IC9bXHgwMFx4MDgtXHgwZFx4MjJceDI2LVx4MmFcL1x4M2EtXHgzZUBcXFx4N2JceDdkXHg4NVx4YTBcdTIwMjhcdTIwMjldL2c7CnNveS5lc2MuJCRNQVRDSEVSX0ZPUl9OT1JNQUxJWkVfVVJJX19BTkRfX0ZJTFRFUl9OT1JNQUxJWkVfVVJJXyA9IC9bXHgwMC0gXHgyMlx4MjctXHgyOVx4M2NceDNlXFxceDdiXHg3ZFx4N2ZceDg1XHhhMFx1MjAyOFx1MjAyOVx1ZmYwMVx1ZmYwM1x1ZmYwNFx1ZmYwNi1cdWZmMGNcdWZmMGZcdWZmMWFcdWZmMWJcdWZmMWRcdWZmMWZcdWZmMjBcdWZmM2JcdWZmM2RdL2c7CnNveS5lc2MuJCRGSUxURVJfRk9SX0ZJTFRFUl9DU1NfVkFMVUVfID0gL14oPyEtKig/OmV4cHJlc3Npb258KD86bW96LSk/YmluZGluZykpKD86Wy4jXT8tPyg/OltfYS16MC05LV0rKSg/Oi1bX2EtejAtOS1dKykqLT98LT8oPzpbMC05XSsoPzpcLlswLTldKik/fFwuWzAtOV0rKSg/OlthLXpdezEsMn18JSk/fCFpbXBvcnRhbnR8KSQvaTsKc295LmVzYy4kJEZJTFRFUl9GT1JfRklMVEVSX05PUk1BTElaRV9VUklfID0gL14oPzooPzpodHRwcz98bWFpbHRvKTp8W14mOlwvPyNdKig/OltcLz8jXXwkKSkvaTsKc295LmVzYy4kJEZJTFRFUl9GT1JfRklMVEVSX0hUTUxfQVRUUklCVVRFXyA9IC9eKD8hc3R5bGV8b258YWN0aW9ufGFyY2hpdmV8YmFja2dyb3VuZHxjaXRlfGNsYXNzaWR8Y29kZWJhc2V8ZGF0YXxkc3luY3xocmVmfGxvbmdkZXNjfHNyY3x1c2VtYXApKD86W2EtejAtOV8kOi1dKikkL2k7CnNveS5lc2MuJCRGSUxURVJfRk9SX0ZJTFRFUl9IVE1MX0VMRU1FTlRfTkFNRV8gPSAvXig/IXNjcmlwdHxzdHlsZXx0aXRsZXx0ZXh0YXJlYXx4bXB8bm8pW2EtejAtOV8kOi1dKiQvaTsKc295LmVzYy4kJGVzY2FwZUh0bWxIZWxwZXIgPSBmdW5jdGlvbiAkc295JGVzYyQkJGVzY2FwZUh0bWxIZWxwZXIkKHZhbHVlKSB7CiAgdmFyIHN0ciA9ICIiICsgdmFsdWU7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKHNveS5lc2MuJCRNQVRDSEVSX0ZPUl9FU0NBUEVfSFRNTF8sIHNveS5lc2MuJCRSRVBMQUNFUl9GT1JfRVNDQVBFX0hUTUxfX0FORF9fTk9STUFMSVpFX0hUTUxfX0FORF9fRVNDQVBFX0hUTUxfTk9TUEFDRV9fQU5EX19OT1JNQUxJWkVfSFRNTF9OT1NQQUNFXykKfTsKc295LmVzYy4kJG5vcm1hbGl6ZUh0bWxIZWxwZXIgPSBmdW5jdGlvbiAkc295JGVzYyQkJG5vcm1hbGl6ZUh0bWxIZWxwZXIkKHZhbHVlKSB7CiAgdmFyIHN0ciA9ICIiICsgdmFsdWU7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKHNveS5lc2MuJCRNQVRDSEVSX0ZPUl9OT1JNQUxJWkVfSFRNTF8sIHNveS5lc2MuJCRSRVBMQUNFUl9GT1JfRVNDQVBFX0hUTUxfX0FORF9fTk9STUFMSVpFX0hUTUxfX0FORF9fRVNDQVBFX0hUTUxfTk9TUEFDRV9fQU5EX19OT1JNQUxJWkVfSFRNTF9OT1NQQUNFXykKfTsKc295LmVzYy4kJGVzY2FwZUh0bWxOb3NwYWNlSGVscGVyID0gZnVuY3Rpb24gJHNveSRlc2MkJCRlc2NhcGVIdG1sTm9zcGFjZUhlbHBlciQodmFsdWUpIHsKICB2YXIgc3RyID0gIiIgKyB2YWx1ZTsKICByZXR1cm4gc3RyLnJlcGxhY2Uoc295LmVzYy4kJE1BVENIRVJfRk9SX0VTQ0FQRV9IVE1MX05PU1BBQ0VfLCBzb3kuZXNjLiQkUkVQTEFDRVJfRk9SX0VTQ0FQRV9IVE1MX19BTkRfX05PUk1BTElaRV9IVE1MX19BTkRfX0VTQ0FQRV9IVE1MX05PU1BBQ0VfX0FORF9fTk9STUFMSVpFX0hUTUxfTk9TUEFDRV8pCn07CnNveS5lc2MuJCRub3JtYWxpemVIdG1sTm9zcGFjZUhlbHBlciA9IGZ1bmN0aW9uICRzb3kkZXNjJCQkbm9ybWFsaXplSHRtbE5vc3BhY2VIZWxwZXIkKHZhbHVlKSB7CiAgdmFyIHN0ciA9ICIiICsgdmFsdWU7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKHNveS5lc2MuJCRNQVRDSEVSX0ZPUl9OT1JNQUxJWkVfSFRNTF9OT1NQQUNFXywgc295LmVzYy4kJFJFUExBQ0VSX0ZPUl9FU0NBUEVfSFRNTF9fQU5EX19OT1JNQUxJWkVfSFRNTF9fQU5EX19FU0NBUEVfSFRNTF9OT1NQQUNFX19BTkRfX05PUk1BTElaRV9IVE1MX05PU1BBQ0VfKQp9Owpzb3kuZXNjLiQkZXNjYXBlSnNTdHJpbmdIZWxwZXIgPSBmdW5jdGlvbiAkc295JGVzYyQkJGVzY2FwZUpzU3RyaW5nSGVscGVyJCh2YWx1ZSkgewogIHZhciBzdHIgPSAiIiArIHZhbHVlOwogIHJldHVybiBzdHIucmVwbGFjZShzb3kuZXNjLiQkTUFUQ0hFUl9GT1JfRVNDQVBFX0pTX1NUUklOR18sIHNveS5lc2MuJCRSRVBMQUNFUl9GT1JfRVNDQVBFX0pTX1NUUklOR19fQU5EX19FU0NBUEVfSlNfUkVHRVhfKQp9Owpzb3kuZXNjLiQkZXNjYXBlSnNSZWdleEhlbHBlciA9IGZ1bmN0aW9uICRzb3kkZXNjJCQkZXNjYXBlSnNSZWdleEhlbHBlciQodmFsdWUpIHsKICB2YXIgc3RyID0gIiIgKyB2YWx1ZTsKICByZXR1cm4gc3RyLnJlcGxhY2Uoc295LmVzYy4kJE1BVENIRVJfRk9SX0VTQ0FQRV9KU19SRUdFWF8sIHNveS5lc2MuJCRSRVBMQUNFUl9GT1JfRVNDQVBFX0pTX1NUUklOR19fQU5EX19FU0NBUEVfSlNfUkVHRVhfKQp9Owpzb3kuZXNjLiQkZXNjYXBlQ3NzU3RyaW5nSGVscGVyID0gZnVuY3Rpb24gJHNveSRlc2MkJCRlc2NhcGVDc3NTdHJpbmdIZWxwZXIkKHZhbHVlKSB7CiAgdmFyIHN0ciA9ICIiICsgdmFsdWU7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKHNveS5lc2MuJCRNQVRDSEVSX0ZPUl9FU0NBUEVfQ1NTX1NUUklOR18sIHNveS5lc2MuJCRSRVBMQUNFUl9GT1JfRVNDQVBFX0NTU19TVFJJTkdfKQp9Owpzb3kuZXNjLiQkZmlsdGVyQ3NzVmFsdWVIZWxwZXIgPSBmdW5jdGlvbiAkc295JGVzYyQkJGZpbHRlckNzc1ZhbHVlSGVscGVyJCh2YWx1ZSkgewogIHZhciBzdHIgPSAiIiArIHZhbHVlOwogIHJldHVybiFzb3kuZXNjLiQkRklMVEVSX0ZPUl9GSUxURVJfQ1NTX1ZBTFVFXy50ZXN0KHN0cikgPyAoZ29vZy5hc3NlcnRzLmZhaWwoIkJhZCB2YWx1ZSBgJXNgIGZvciB8ZmlsdGVyQ3NzVmFsdWUiLCBbc3RyXSksICJ6U295eiIpIDogc3RyCn07CnNveS5lc2MuJCRub3JtYWxpemVVcmlIZWxwZXIgPSBmdW5jdGlvbiAkc295JGVzYyQkJG5vcm1hbGl6ZVVyaUhlbHBlciQodmFsdWUpIHsKICB2YXIgc3RyID0gIiIgKyB2YWx1ZTsKICByZXR1cm4gc3RyLnJlcGxhY2Uoc295LmVzYy4kJE1BVENIRVJfRk9SX05PUk1BTElaRV9VUklfX0FORF9fRklMVEVSX05PUk1BTElaRV9VUklfLCBzb3kuZXNjLiQkUkVQTEFDRVJfRk9SX05PUk1BTElaRV9VUklfX0FORF9fRklMVEVSX05PUk1BTElaRV9VUklfKQp9Owpzb3kuZXNjLiQkZmlsdGVyTm9ybWFsaXplVXJpSGVscGVyID0gZnVuY3Rpb24gJHNveSRlc2MkJCRmaWx0ZXJOb3JtYWxpemVVcmlIZWxwZXIkKHZhbHVlKSB7CiAgdmFyIHN0ciA9ICIiICsgdmFsdWU7CiAgcmV0dXJuIXNveS5lc2MuJCRGSUxURVJfRk9SX0ZJTFRFUl9OT1JNQUxJWkVfVVJJXy50ZXN0KHN0cikgPyAoZ29vZy5hc3NlcnRzLmZhaWwoIkJhZCB2YWx1ZSBgJXNgIGZvciB8ZmlsdGVyTm9ybWFsaXplVXJpIiwgW3N0cl0pLCAielNveXoiKSA6IHN0ci5yZXBsYWNlKHNveS5lc2MuJCRNQVRDSEVSX0ZPUl9OT1JNQUxJWkVfVVJJX19BTkRfX0ZJTFRFUl9OT1JNQUxJWkVfVVJJXywgc295LmVzYy4kJFJFUExBQ0VSX0ZPUl9OT1JNQUxJWkVfVVJJX19BTkRfX0ZJTFRFUl9OT1JNQUxJWkVfVVJJXykKfTsKc295LmVzYy4kJGZpbHRlckh0bWxBdHRyaWJ1dGVIZWxwZXIgPSBmdW5jdGlvbiAkc295JGVzYyQkJGZpbHRlckh0bWxBdHRyaWJ1dGVIZWxwZXIkKHZhbHVlKSB7CiAgdmFyIHN0ciA9ICIiICsgdmFsdWU7CiAgcmV0dXJuIXNveS5lc2MuJCRGSUxURVJfRk9SX0ZJTFRFUl9IVE1MX0FUVFJJQlVURV8udGVzdChzdHIpID8gKGdvb2cuYXNzZXJ0cy5mYWlsKCJCYWQgdmFsdWUgYCVzYCBmb3IgfGZpbHRlckh0bWxBdHRyaWJ1dGUiLCBbc3RyXSksICJ6U295eiIpIDogc3RyCn07CnNveS5lc2MuJCRmaWx0ZXJIdG1sRWxlbWVudE5hbWVIZWxwZXIgPSBmdW5jdGlvbiAkc295JGVzYyQkJGZpbHRlckh0bWxFbGVtZW50TmFtZUhlbHBlciQodmFsdWUpIHsKICB2YXIgc3RyID0gIiIgKyB2YWx1ZTsKICByZXR1cm4hc295LmVzYy4kJEZJTFRFUl9GT1JfRklMVEVSX0hUTUxfRUxFTUVOVF9OQU1FXy50ZXN0KHN0cikgPyAoZ29vZy5hc3NlcnRzLmZhaWwoIkJhZCB2YWx1ZSBgJXNgIGZvciB8ZmlsdGVySHRtbEVsZW1lbnROYW1lIiwgW3N0cl0pLCAielNveXoiKSA6IHN0cgp9Owpzb3kuZXNjLiQkSFRNTF9UQUdfUkVHRVhfID0gLzwoPzohfFwvP1thLXpBLVpdKSg/OltePiciXXwiW14iXSoifCdbXiddKicpKj4vZzsKY2hhdC51dGlscyA9IHt9OwpjaGF0LnV0aWxzLnNveSA9IHt9OwpjaGF0LnV0aWxzLnNveS5TdHJpbmdVdGlscyA9IHt9OwpjaGF0LnV0aWxzLnNveS5TdHJpbmdVdGlscy5MSU5LX0hUTUwgPSBmdW5jdGlvbiAkY2hhdCR1dGlscyRzb3kkU3RyaW5nVXRpbHMkTElOS19IVE1MJChvcHRfZGF0YSwgb3B0X3NiKSB7CiAgdmFyIG91dHB1dCA9IG9wdF9zYiB8fCBuZXcgc295LlN0cmluZ0J1aWxkZXI7CiAgb3V0cHV0LmFwcGVuZCgnPGEgaHJlZj0iJywgb3B0X2RhdGEuaHJlZiwgJyIgdGFyZ2V0PSJfYmxhbmsiICcsIG9wdF9kYXRhLm5vdGFiID8gJyB0YWJpbmRleD0iLTEiICcgOiAiIiwgJ29uY2xpY2s9ImlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBldmVudC5jYW5jZWxCdWJibGU9dHJ1ZTsgcmV0dXJuIHRydWU7Ij4nLCBvcHRfZGF0YS50ZXh0LCAiPC9hPiIpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CmNoYXQudXRpbHMuc295LlN0cmluZ1V0aWxzLkZSQUdNRU5UX0xJTktfSFRNTCA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJHNveSRTdHJpbmdVdGlscyRGUkFHTUVOVF9MSU5LX0hUTUwkKG9wdF9kYXRhLCBvcHRfc2IpIHsKICB2YXIgb3V0cHV0ID0gb3B0X3NiIHx8IG5ldyBzb3kuU3RyaW5nQnVpbGRlcjsKICBvdXRwdXQuYXBwZW5kKCc8YSBocmVmPSInLCBvcHRfZGF0YS5ocmVmLCAnIiB0YXJnZXQ9Il9ibGFuayIgJywgb3B0X2RhdGEubm90YWIgPyAnIHRhYmluZGV4PSItMSIgJyA6ICIiLCAib25jbGljaz1cImlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBldmVudC5jYW5jZWxCdWJibGU9dHJ1ZTsgdHJ5IHt2YXIgd2luID0gd2luZG93Lm9wZW5lciA/IHdpbmRvdy5vcGVuZXIucGFyZW50IDogd2luZG93LnBhcmVudDsgaWYgKHdpbi5sb2NhdGlvbi5ob3N0LnRvTG93ZXJDYXNlKCkgPT0gJyIsIHNveS4kJGVzY2FwZUpzU3RyaW5nKG9wdF9kYXRhLmhvc3QpLCAiJyAmJiB3aW4ubG9jYXRpb24ucGF0aG5hbWUgPT0gJyIsIHNveS4kJGVzY2FwZUpzU3RyaW5nKG9wdF9kYXRhLnBhdGgpLCAiJykge3dpbi5sb2NhdGlvbi5oYXNoID0gJyIsIHNveS4kJGVzY2FwZUpzU3RyaW5nKG9wdF9kYXRhLmZyYWdtZW50KSwgIic7IHJldHVybiBmYWxzZTt9fSBjYXRjaCAoZSkge31yZXR1cm4gdHJ1ZTtcIj4iLCAKICBvcHRfZGF0YS50ZXh0LCAiPC9hPiIpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CmNoYXQudXRpbHMuc295LlN0cmluZ1V0aWxzLkdVSURFRF9IRUxQX0xJTktfSFRNTCA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJHNveSRTdHJpbmdVdGlscyRHVUlERURfSEVMUF9MSU5LX0hUTUwkKG9wdF9kYXRhLCBvcHRfc2IpIHsKICB2YXIgb3V0cHV0ID0gb3B0X3NiIHx8IG5ldyBzb3kuU3RyaW5nQnVpbGRlcjsKICBvdXRwdXQuYXBwZW5kKCc8YSBjbGFzcz0iJywgImd1aWRlZF9oZWxwX2J1enpfYW5jaG9yIiwgJyIgJywgb3B0X2RhdGEubm90YWIgPyAnIHRhYmluZGV4PSItMSIgJyA6ICIiLCAnc3R5bGU9ImN1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IiBnaGZsb3dpZD0iJywgb3B0X2RhdGEuYW5zd2VySWQsICciIGdoaGVscGhvc3Q9IicsIG9wdF9kYXRhLmhlbHBIb3N0LCAnIiBnaGhlbHBjZW50ZXJ1cmk9IicsIG9wdF9kYXRhLmhlbHBDZW50ZXJVcmksICciIGdobG9jYWxlbmFtZT0iJywgb3B0X2RhdGEubG9jYWxlTmFtZSwgJyIgZ2hwcm9kdWN0PSInLCBvcHRfZGF0YS5wcm9kdWN0LCAnIj4nLCBvcHRfZGF0YS50ZXh0LCAiPC9hPiIpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CmNoYXQudXRpbHMuU3RyaW5nVXRpbHMgPSB7fTsKY2hhdC51dGlscy5TdHJpbmdVdGlscy5pbnNlcnRXb3JkQnJlYWtzID0gZnVuY3Rpb24gJGNoYXQkdXRpbHMkU3RyaW5nVXRpbHMkaW5zZXJ0V29yZEJyZWFrcyQoaW5wdXQsIG9wdF9tYXhDaHVua1NpemUpIHsKICBmb3IodmFyIG1heENodW5rU2l6ZSA9IG9wdF9tYXhDaHVua1NpemUgfHwgMSwgb3V0cHV0QnVmZmVyID0gbmV3IGdvb2cuc3RyaW5nLlN0cmluZ0J1ZmZlciwgd29yZHMgPSBpbnB1dC5zcGxpdCgiICIpLCBpID0gMDtpIDwgd29yZHMubGVuZ3RoO2krKykgewogICAgZm9yKHZhciB3b3JkTGVuZ3RoID0gd29yZHNbaV0ubGVuZ3RoLCBudW1DaHVua3MgPSBNYXRoLmNlaWwod29yZExlbmd0aCAvIG1heENodW5rU2l6ZSksIGNodW5rQmFzaWNTaXplID0gTWF0aC5mbG9vcih3b3JkTGVuZ3RoIC8gbnVtQ2h1bmtzKSwgY2h1bmtzV2l0aE9uZU1vcmVDaGFyID0gd29yZExlbmd0aCAtIGNodW5rQmFzaWNTaXplICogbnVtQ2h1bmtzLCB3b3JkSW5kZXggPSAwLCBqID0gMDtqIDwgbnVtQ2h1bmtzO2orKykgewogICAgICB2YXIgY2h1bmtTaXplID0gaiA8IGNodW5rc1dpdGhPbmVNb3JlQ2hhciA/IGNodW5rQmFzaWNTaXplICsgMSA6IGNodW5rQmFzaWNTaXplOwogICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKHdvcmRzW2ldLnN1YnN0cmluZyh3b3JkSW5kZXgsIHdvcmRJbmRleCArIGNodW5rU2l6ZSkpOwogICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKCI8d2JyPiIpOwogICAgICB3b3JkSW5kZXggKz0gY2h1bmtTaXplCiAgICB9CiAgICBpIDwgd29yZHMubGVuZ3RoIC0gMSAmJiBvdXRwdXRCdWZmZXIuYXBwZW5kKCIgIikKICB9CiAgcmV0dXJuIG91dHB1dEJ1ZmZlci50b1N0cmluZygpCn07CmNoYXQudXRpbHMuU3RyaW5nVXRpbHMuYWRkRW1vdGljb25IdG1sXyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJFN0cmluZ1V0aWxzJGFkZEVtb3RpY29uSHRtbF8kKGJ1ZmZlciwgcGF0dGVybiwgaWNvblNldCwgb3B0X2FuaW1hdGVPbkxvYWQpIHsKICBjaGF0LnV0aWxzLlN0cmluZ1V0aWxzLmVtb3RpY29uSHRtbEdlbmVyYXRvcl8gPyBidWZmZXIuYXBwZW5kKGNoYXQudXRpbHMuU3RyaW5nVXRpbHMuZW1vdGljb25IdG1sR2VuZXJhdG9yXy5nZXRFbW90aWNvbkh0bWwocGF0dGVybiwgaWNvblNldCwgb3B0X2FuaW1hdGVPbkxvYWQpKSA6IGJ1ZmZlci5hcHBlbmQoZ29vZy5zdHJpbmcuaHRtbEVzY2FwZShwYXR0ZXJuKSkKfTsKY2hhdC51dGlscy5TdHJpbmdVdGlscy5hZGRTaW1wbGVFbW90aWNvbkh0bWxfID0gZnVuY3Rpb24gJGNoYXQkdXRpbHMkU3RyaW5nVXRpbHMkYWRkU2ltcGxlRW1vdGljb25IdG1sXyQoYnVmZmVyLCBwYXR0ZXJuLCBpY29uU2V0KSB7CiAgY2hhdC51dGlscy5TdHJpbmdVdGlscy5lbW90aWNvbkh0bWxHZW5lcmF0b3JfID8gYnVmZmVyLmFwcGVuZChjaGF0LnV0aWxzLlN0cmluZ1V0aWxzLmVtb3RpY29uSHRtbEdlbmVyYXRvcl8uZ2V0U2ltcGxlRW1vdGljb25IdG1sKHBhdHRlcm4sIGljb25TZXQpKSA6IGJ1ZmZlci5hcHBlbmQoZ29vZy5zdHJpbmcuaHRtbEVzY2FwZShwYXR0ZXJuKSkKfTsKY2hhdC51dGlscy5TdHJpbmdVdGlscy5hZGRMaW5rSHRtbF8gPSBmdW5jdGlvbiAkY2hhdCR1dGlscyRTdHJpbmdVdGlscyRhZGRMaW5rSHRtbF8kKGJ1ZmZlciwgdXJsLCB0ZXh0LCBub3RhYikgewogIGNoYXQudXRpbHMuc295LlN0cmluZ1V0aWxzLkxJTktfSFRNTCh7aHJlZjp1cmwsIHRleHQ6dGV4dCwgbm90YWI6bm90YWJ9LCBidWZmZXIpCn07CmNoYXQudXRpbHMuU3RyaW5nVXRpbHMuYWRkTGlua1dpdGhVc2VyQ29udGV4dEh0bWxfID0gZnVuY3Rpb24gJGNoYXQkdXRpbHMkU3RyaW5nVXRpbHMkYWRkTGlua1dpdGhVc2VyQ29udGV4dEh0bWxfJChidWZmZXIsIHVybCwgdGV4dCwgbm90YWIsIG9wdF9jb25maWcpIHsKICB2YXIgcGFyc2VkVXJsID0gbmV3IGdvb2cuVXJpKHVybCk7CiAgcGFyc2VkVXJsLnJlbW92ZVBhcmFtZXRlcigiYXV0aHVzZXIiKTsKICBwYXJzZWRVcmwucmVtb3ZlUGFyYW1ldGVyKCJobCIpOwogIGdvb2cuaXNEZWYob3B0X2NvbmZpZykgJiYgKHBhcnNlZFVybC5zZXRQYXJhbWV0ZXJWYWx1ZSgiYXV0aHVzZXIiLCBvcHRfY29uZmlnLmdldFVzZXIoKS5nZXRBdXRoSW5kZXgoKSksIHBhcnNlZFVybC5zZXRQYXJhbWV0ZXJWYWx1ZSgiaGwiLCBvcHRfY29uZmlnLmxvY2FsZSkpOwogIGNoYXQudXRpbHMuc295LlN0cmluZ1V0aWxzLkxJTktfSFRNTCh7aHJlZjpwYXJzZWRVcmwudG9TdHJpbmcoKSwgdGV4dDp0ZXh0LCBub3RhYjpub3RhYn0sIGJ1ZmZlcikKfTsKY2hhdC51dGlscy5TdHJpbmdVdGlscy5hZGRGcmFnbWVudExpbmtIdG1sXyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJFN0cmluZ1V0aWxzJGFkZEZyYWdtZW50TGlua0h0bWxfJChidWZmZXIsIGhyZWYsIGhvc3QsIHBhdGgsIGZyYWdtZW50LCB0ZXh0LCBub3RhYikgewogIGNoYXQudXRpbHMuc295LlN0cmluZ1V0aWxzLkZSQUdNRU5UX0xJTktfSFRNTCh7aHJlZjpocmVmLCBob3N0Omhvc3QsIHBhdGg6cGF0aCwgZnJhZ21lbnQ6ZnJhZ21lbnQsIHRleHQ6dGV4dCwgbm90YWI6bm90YWJ9LCBidWZmZXIpCn07CmNoYXQudXRpbHMuU3RyaW5nVXRpbHMuYWRkR3VpZGVkSGVscExpbmtIdG1sXyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJFN0cmluZ1V0aWxzJGFkZEd1aWRlZEhlbHBMaW5rSHRtbF8kKGJ1ZmZlciwgdGV4dCwgYW5zd2VySWQsIGhlbHBIb3N0LCBoZWxwQ2VudGVyVXJpLCBub3RhYiwgb3B0X2xvY2FsZU5hbWUsIG9wdF9wcm9kdWN0KSB7CiAgY2hhdC51dGlscy5zb3kuU3RyaW5nVXRpbHMuR1VJREVEX0hFTFBfTElOS19IVE1MKHt0ZXh0OnRleHQsIGFuc3dlcklkOmFuc3dlcklkLCBoZWxwSG9zdDpoZWxwSG9zdCwgaGVscENlbnRlclVyaTpoZWxwQ2VudGVyVXJpLCBsb2NhbGVOYW1lOm9wdF9sb2NhbGVOYW1lIHx8ICIiLCBwcm9kdWN0Om9wdF9wcm9kdWN0IHx8ICIiLCBub3RhYjpub3RhYn0sIGJ1ZmZlcikKfTsKY2hhdC51dGlscy5TdHJpbmdVdGlscy5nZW5lcmF0ZVBhcnNlZEh0bWwgPSBmdW5jdGlvbiAkY2hhdCR1dGlscyRTdHJpbmdVdGlscyRnZW5lcmF0ZVBhcnNlZEh0bWwkKHBhcnNlZE1lc3NhZ2UsIHJhd01lc3NhZ2UsIHNjcmlwdEVtb3RpY29ucywgaWNvblNldCwgb3B0X25vdGFiLCBvcHRfYW5pbWF0ZU9uTG9hZCwgb3B0X2NvbmZpZykgewogIHJldHVybiBjaGF0LnV0aWxzLlN0cmluZ1V0aWxzLmdldFBhcnNlZEh0bWxfKHBhcnNlZE1lc3NhZ2UsIHJhd01lc3NhZ2UsIHNjcmlwdEVtb3RpY29ucyA/IGNoYXQudXRpbHMuU3RyaW5nVXRpbHMuYWRkRW1vdGljb25IdG1sXyA6IGNoYXQudXRpbHMuU3RyaW5nVXRpbHMuYWRkU2ltcGxlRW1vdGljb25IdG1sXywgY2hhdC51dGlscy5TdHJpbmdVdGlscy5hZGRMaW5rSHRtbF8sIGNoYXQudXRpbHMuU3RyaW5nVXRpbHMuYWRkRnJhZ21lbnRMaW5rSHRtbF8sIGNoYXQudXRpbHMuU3RyaW5nVXRpbHMuYWRkR3VpZGVkSGVscExpbmtIdG1sXywgY2hhdC51dGlscy5TdHJpbmdVdGlscy5hZGRMaW5rV2l0aFVzZXJDb250ZXh0SHRtbF8sIGljb25TZXQsIG9wdF9ub3RhYiwgb3B0X2FuaW1hdGVPbkxvYWQsIG9wdF9jb25maWcpCn07CmNoYXQudXRpbHMuU3RyaW5nVXRpbHMuZ2V0UGFyc2VkSHRtbF8gPSBmdW5jdGlvbiAkY2hhdCR1dGlscyRTdHJpbmdVdGlscyRnZXRQYXJzZWRIdG1sXyQocGFyc2VkTWVzc2FnZSwgcmF3TWVzc2FnZSwgYWRkRW1vdGljb25IdG1sLCBhZGRMaW5rSHRtbCwgYWRkRnJhZ21lbnRMaW5rSHRtbCwgYWRkR3VpZGVkSGVscExpbmtIdG1sLCBhZGRMaW5rV2l0aFVzZXJDb250ZXh0SHRtbCwgaWNvblNldCwgb3B0X25vdGFiLCBvcHRfYW5pbWF0ZU9uTG9hZCwgb3B0X2NvbmZpZykgewogIGlmKCFwYXJzZWRNZXNzYWdlIHx8IDAgPT0gcGFyc2VkTWVzc2FnZS5sZW5ndGgpIHsKICAgIHJldHVybiBnb29nLnN0cmluZy5odG1sRXNjYXBlKHJhd01lc3NhZ2UpCiAgfQogIHZhciBodG1sQnVmZmVyID0gbmV3IGdvb2cuc3RyaW5nLlN0cmluZ0J1ZmZlcjsKICBnb29nLmlzRGVmQW5kTm90TnVsbChvcHRfbm90YWIpIHx8IChvcHRfbm90YWIgPSAhMSk7CiAgZm9yKHZhciBlbW90aWNvbkNvdW50ZXIgPSAwLCBpID0gMDtpIDwgcGFyc2VkTWVzc2FnZS5sZW5ndGg7aSsrKSB7CiAgICB2YXIgdG9rZW4gPSBwYXJzZWRNZXNzYWdlW2ldOwogICAgaWYoInN0cmluZyIgPT0gdHlwZW9mIHRva2VuKSB7CiAgICAgIGh0bWxCdWZmZXIuYXBwZW5kKHRva2VuKQogICAgfWVsc2UgewogICAgICBzd2l0Y2godG9rZW5bMF0pIHsKICAgICAgICBjYXNlICJsIjoKICAgICAgICAgIGFkZExpbmtIdG1sKGh0bWxCdWZmZXIsIHRva2VuWzFdLCB0b2tlblszXSwgb3B0X25vdGFiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImUiOgogICAgICAgICAgNTAgPiBlbW90aWNvbkNvdW50ZXIgPyAoYWRkRW1vdGljb25IdG1sKGh0bWxCdWZmZXIsIHRva2VuWzFdLCBpY29uU2V0LCBvcHRfYW5pbWF0ZU9uTG9hZCksIGVtb3RpY29uQ291bnRlcisrKSA6IGh0bWxCdWZmZXIuYXBwZW5kKHRva2VuWzFdKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImEiOgogICAgICAgICAgaHRtbEJ1ZmZlci5hcHBlbmQodG9rZW5bMV0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicCI6CiAgICAgICAgICBhZGRMaW5rSHRtbChodG1sQnVmZmVyLCB0b2tlblsxXSwgdG9rZW5bM10sIG9wdF9ub3RhYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJmIjoKICAgICAgICAgIGFkZExpbmtIdG1sKGh0bWxCdWZmZXIsIHRva2VuWzFdLCB0b2tlblszXSwgb3B0X25vdGFiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInYiOgogICAgICAgIDsKICAgICAgICBjYXNlICJ5dCI6CiAgICAgICAgICBhZGRMaW5rSHRtbChodG1sQnVmZmVyLCB0b2tlblsyXSwgdG9rZW5bM10sIG9wdF9ub3RhYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ2bSI6CiAgICAgICAgICBhZGRMaW5rSHRtbChodG1sQnVmZmVyLCB0b2tlblsxXSwgdG9rZW5bM10sIG9wdF9ub3RhYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ2cyI6CiAgICAgICAgICBhZGRMaW5rSHRtbChodG1sQnVmZmVyLCB0b2tlblsyXSwgdG9rZW5bNF0sIG9wdF9ub3RhYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnaCI6CiAgICAgICAgICBhZGRHdWlkZWRIZWxwTGlua0h0bWwoaHRtbEJ1ZmZlciwgdG9rZW5bMV0sIHRva2VuWzJdLCB0b2tlblszXSwgdG9rZW5bNF0sIG9wdF9ub3RhYiwgdG9rZW5bNV0sIHRva2VuWzZdKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImhsIjoKICAgICAgICAgIGFkZExpbmtXaXRoVXNlckNvbnRleHRIdG1sKGh0bWxCdWZmZXIsIHRva2VuWzFdLCB0b2tlblsyXSwgb3B0X25vdGFiLCBvcHRfY29uZmlnKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImh0bWwiOgogICAgICAgICAgaHRtbEJ1ZmZlci5hcHBlbmQodG9rZW5bMV0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBnb29nLnN0cmluZy5odG1sRXNjYXBlKHJhd01lc3NhZ2UpCiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGh0bWxCdWZmZXIudG9TdHJpbmcoKQp9OwpjaGF0LnV0aWxzLlN0cmluZ1V0aWxzLmdlbmVyYXRlUGFyc2VkSHRtbEZyb21QYXJ0cyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJFN0cmluZ1V0aWxzJGdlbmVyYXRlUGFyc2VkSHRtbEZyb21QYXJ0cyQocmF3VGV4dCwgcGFyc2VkUGFydHMsIHNjcmlwdEVtb3RpY29ucywgaWNvblNldCwgb3B0X2NvbmZpZykgewogIGlmKCFwYXJzZWRQYXJ0cyB8fCAxID4gcGFyc2VkUGFydHMubGVuZ3RoKSB7CiAgICByZXR1cm4gZ29vZy5zdHJpbmcubmV3TGluZVRvQnIoZ29vZy5zdHJpbmcuaHRtbEVzY2FwZShyYXdUZXh0KSkKICB9CiAgZm9yKHZhciBwYXJzZWRUZXh0ID0gIiIsIGkgPSAwO2kgPCBwYXJzZWRQYXJ0cy5sZW5ndGg7aSsrKSB7CiAgICBwYXJzZWRUZXh0ICs9IGNoYXQudXRpbHMuU3RyaW5nVXRpbHMuZ2VuZXJhdGVQYXJzZWRIdG1sKHBhcnNlZFBhcnRzW2ldLCByYXdUZXh0LCBzY3JpcHRFbW90aWNvbnMsIGljb25TZXQsIHZvaWQgMCwgdm9pZCAwLCBvcHRfY29uZmlnKQogIH0KICByZXR1cm4gcGFyc2VkVGV4dAp9OwpjaGF0LnV0aWxzLlN0cmluZ1V0aWxzLnNldEVtb3RpY29uSHRtbEdlbmVyYXRvciA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJFN0cmluZ1V0aWxzJHNldEVtb3RpY29uSHRtbEdlbmVyYXRvciQoZ2VuZXJhdG9yKSB7CiAgY2hhdC51dGlscy5TdHJpbmdVdGlscy5lbW90aWNvbkh0bWxHZW5lcmF0b3JfID0gZ2VuZXJhdG9yCn07CmNoYXQudXRpbHMuU3RyaW5nVXRpbHMuZW1vdGljb25IdG1sR2VuZXJhdG9yXyA9IG51bGw7CnByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUHJlc2VuY2UkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFsicCJdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlLCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuUHJlc2VuY2UubWVzc2FnZUlkID0gInAiOwpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZShwcm90by5hcHBzLmNoYXQuUHJlc2VuY2UubWVzc2FnZUlkLCBwcm90by5hcHBzLmNoYXQuUHJlc2VuY2UpOwpwcm90by5hcHBzLmNoYXQuUHJlc2VuY2UucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFByZXNlbmNlJCRnZXRKc1BiTWVzc2FnZUlkJCgpIHsKICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlLm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuUHJlc2VuY2UucHJvdG90eXBlLmdldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUHJlc2VuY2UkJGdldEppZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMV0KfTsKcHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlLnByb3RvdHlwZS5zZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFByZXNlbmNlJCRzZXRKaWQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZS5wcm90b3R5cGUuZ2V0U2hvdyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUHJlc2VuY2UkJGdldFNob3ckKCkgewogIHJldHVybiB0aGlzLmFycmF5WzNdCn07CnByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZS5wcm90b3R5cGUuc2V0U2hvdyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUHJlc2VuY2UkJHNldFNob3ckKHZhbHVlKSB7CiAgdGhpcy5hcnJheVszXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZS5wcm90b3R5cGUuZ2V0U3RhdHVzID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRQcmVzZW5jZSQkZ2V0U3RhdHVzJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs0XQp9Owpwcm90by5hcHBzLmNoYXQuUHJlc2VuY2UucHJvdG90eXBlLnNldFN0YXR1cyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUHJlc2VuY2UkJHNldFN0YXR1cyQodmFsdWUpIHsKICB0aGlzLmFycmF5WzRdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlLnByb3RvdHlwZS5nZXRQYXJzZWRTdGF0dXMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFByZXNlbmNlJCRnZXRQYXJzZWRTdGF0dXMkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzVdCn07CnByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZS5wcm90b3R5cGUuc2V0UGFyc2VkU3RhdHVzID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRQcmVzZW5jZSQkc2V0UGFyc2VkU3RhdHVzJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbNV0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUHJlc2VuY2UucHJvdG90eXBlLmdldENhcGFiaWxpdGllcyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUHJlc2VuY2UkJGdldENhcGFiaWxpdGllcyQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbNl0KfTsKcHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlLnByb3RvdHlwZS5zZXRDYXBhYmlsaXRpZXMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFByZXNlbmNlJCRzZXRDYXBhYmlsaXRpZXMkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs2XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZS5wcm90b3R5cGUuZ2V0U2VydmVyUHJlc2VuY2VDb2RlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRQcmVzZW5jZSQkZ2V0U2VydmVyUHJlc2VuY2VDb2RlJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs3XQp9Owpwcm90by5hcHBzLmNoYXQuUHJlc2VuY2UuU2hvdyA9IHtPRkZMSU5FOjEsIFhBOjIsIEFXQVk6MywgRE5EOjQsIEFWQUlMQUJMRTo1LCBDSEFUOjZ9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFsicnUiXTsKICB0aGlzLmFycmF5WzE1XSA9IHRoaXMuYXJyYXlbMTVdIHx8IFtdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZSwganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5tZXNzYWdlSWQgPSAicnUiOwpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZShwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLm1lc3NhZ2VJZCwgcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZSk7CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclVwZGF0ZSQkZ2V0SnNQYk1lc3NhZ2VJZCQoKSB7CiAgcmV0dXJuIHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUubWVzc2FnZUlkCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLmdldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRnZXRKaWQkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzFdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLnNldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRzZXRKaWQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLmdldE9iZnVzY2F0ZWRHYWlhSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclVwZGF0ZSQkZ2V0T2JmdXNjYXRlZEdhaWFJZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMThdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLnNldE9iZnVzY2F0ZWRHYWlhSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclVwZGF0ZSQkc2V0T2JmdXNjYXRlZEdhaWFJZCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzE4XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLmdldFJvc3Rlck5hbWUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclVwZGF0ZSQkZ2V0Um9zdGVyTmFtZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMl0KfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5wcm90b3R5cGUuZ2V0RXZlcmdyZWVuTmFtZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRnZXRFdmVyZ3JlZW5OYW1lJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxNl0KfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5wcm90b3R5cGUuZ2V0RXZlcmdyZWVuRmlyc3ROYW1lID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkJGdldEV2ZXJncmVlbkZpcnN0TmFtZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMTddCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLmdldEVtYWlsID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkJGdldEVtYWlsJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVszXQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLnByb3RvdHlwZS5zZXRFbWFpbCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRzZXRFbWFpbCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzNdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5wcm90b3R5cGUuc2V0QWltID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkJHNldEFpbSQodmFsdWUpIHsKICB0aGlzLmFycmF5WzRdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5wcm90b3R5cGUuZ2V0Q29tYmluZWRXZWlnaHQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclVwZGF0ZSQkZ2V0Q29tYmluZWRXZWlnaHQkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzVdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLnNldENvbWJpbmVkV2VpZ2h0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkJHNldENvbWJpbmVkV2VpZ2h0JCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbNV0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLnByb3RvdHlwZS5zZXRDaGF0V2VpZ2h0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkJHNldENoYXRXZWlnaHQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs2XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLnNldEVtYWlsV2VpZ2h0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkJHNldEVtYWlsV2VpZ2h0JCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbN10gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLnByb3RvdHlwZS5nZXRGaWx0ZXIgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclVwZGF0ZSQkZ2V0RmlsdGVyJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs4XQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLnByb3RvdHlwZS5zZXRGaWx0ZXIgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclVwZGF0ZSQkc2V0RmlsdGVyJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbOF0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLnByb3RvdHlwZS5zZXRPcmt1dFVpZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRzZXRPcmt1dFVpZCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzldID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5wcm90b3R5cGUuZ2V0T3JrdXRQaWN0dXJlVXJsID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkJGdldE9ya3V0UGljdHVyZVVybCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMTBdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLnNldE9ya3V0UGljdHVyZVVybCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRzZXRPcmt1dFBpY3R1cmVVcmwkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxMF0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLnByb3RvdHlwZS5nZXRQaG9uZUJvb2sgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclVwZGF0ZSQkZ2V0UGhvbmVCb29rJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxMV0KfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5wcm90b3R5cGUuZ2V0U2hvcnRJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRnZXRTaG9ydElkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxMl0KfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5wcm90b3R5cGUuc2V0U2hvcnRJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRzZXRTaG9ydElkJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMTJdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5wcm90b3R5cGUuZ2V0U3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkJGdldFN1YnNjcmlwdGlvbiQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMTNdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLnNldFN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRzZXRTdWJzY3JpcHRpb24kKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxM10gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLnByb3RvdHlwZS5nZXRCdWRkeVBvdW5jZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRnZXRCdWRkeVBvdW5jZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMTRdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLmdldEZvY3VzR3JvdXBzTGlzdCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRnZXRGb2N1c0dyb3Vwc0xpc3QkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzE1XQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLnByb3RvdHlwZS5nZXRSZWplY3RlZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRnZXRSZWplY3RlZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMTldCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLmdldExhc3RDaGF0VGltZXN0YW1wID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkJGdldExhc3RDaGF0VGltZXN0YW1wJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsyMF0KfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5wcm90b3R5cGUuc2V0TGFzdENoYXRUaW1lc3RhbXAgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclVwZGF0ZSQkc2V0TGFzdENoYXRUaW1lc3RhbXAkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsyMF0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLnByb3RvdHlwZS5nZXRQb3J0cmFpdFVybCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRnZXRQb3J0cmFpdFVybCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMjFdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUucHJvdG90eXBlLnNldFBvcnRyYWl0VXJsID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJVcGRhdGUkJHNldFBvcnRyYWl0VXJsJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMjFdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5wcm90b3R5cGUuZ2V0SXNHcGx1cyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyVXBkYXRlJCRnZXRJc0dwbHVzJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsyMl0KfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5GaWx0ZXIgPSB7QkxPQ0tFRDoxLCBISURERU46MiwgTk9STUFMOjMsIFBJTk5FRDo0fTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5TdWJzY3JpcHRpb24gPSB7Tk9ORToxLCBUTzoyLCBGUk9NOjMsIEJPVEg6NH07CnByb3RvLmFwcHMuY2hhdC5Wb2ljZVJhdGVRdWVyeSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkVm9pY2VSYXRlUXVlcnkkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFsidnJxIl07CiAgdGhpcy5hcnJheVsyXSA9IHRoaXMuYXJyYXlbMl0gfHwgW10KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuVm9pY2VSYXRlUXVlcnksIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5Wb2ljZVJhdGVRdWVyeS5tZXNzYWdlSWQgPSAidnJxIjsKanNwYi5NZXNzYWdlLnJlZ2lzdGVyTWVzc2FnZVR5cGUocHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5Lm1lc3NhZ2VJZCwgcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5KTsKcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5LnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRWb2ljZVJhdGVRdWVyeSQkZ2V0SnNQYk1lc3NhZ2VJZCQoKSB7CiAgcmV0dXJuIHByb3RvLmFwcHMuY2hhdC5Wb2ljZVJhdGVRdWVyeS5tZXNzYWdlSWQKfTsKcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5LnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkVm9pY2VSYXRlUXVlcnkkJGdldElkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxXQp9Owpwcm90by5hcHBzLmNoYXQuVm9pY2VSYXRlUXVlcnlSZXNwb25zZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkVm9pY2VSYXRlUXVlcnlSZXNwb25zZSQob3B0X2RhdGEpIHsKICBqc3BiLk1lc3NhZ2UuY2FsbCh0aGlzKTsKICB0aGlzLmFycmF5ID0gb3B0X2RhdGEgfHwgWyJ2cnFyIl07CiAgdGhpcy5hcnJheVsyXSA9IHRoaXMuYXJyYXlbMl0gfHwgW10KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuVm9pY2VSYXRlUXVlcnlSZXNwb25zZSwganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UubWVzc2FnZUlkID0gInZycXIiOwpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZShwcm90by5hcHBzLmNoYXQuVm9pY2VSYXRlUXVlcnlSZXNwb25zZS5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5Wb2ljZVJhdGVRdWVyeVJlc3BvbnNlKTsKcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UkJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuVm9pY2VSYXRlUXVlcnlSZXNwb25zZS5tZXNzYWdlSWQKfTsKcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UucHJvdG90eXBlLmdldElkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRWb2ljZVJhdGVRdWVyeVJlc3BvbnNlJCRnZXRJZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMV0KfTsKcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UucHJvdG90eXBlLmdldFJhdGVMaXN0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRWb2ljZVJhdGVRdWVyeVJlc3BvbnNlJCRnZXRSYXRlTGlzdCQoKSB7CiAgaWYoIXRoaXMucmF0ZV8pIHsKICAgIHRoaXMucmF0ZV8gPSBbXTsKICAgIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuYXJyYXlbMl0ubGVuZ3RoO2krKykgewogICAgICB0aGlzLnJhdGVfW2ldID0gbmV3IHByb3RvLmFwcHMuY2hhdC5Wb2ljZVJhdGVRdWVyeVJlc3BvbnNlLlJhdGUodGhpcy5hcnJheVsyXVtpXSkKICAgIH0KICB9CiAgcmV0dXJuIHRoaXMucmF0ZV8KfTsKcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UuUmF0ZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkVm9pY2VSYXRlUXVlcnlSZXNwb25zZSRSYXRlJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5Wb2ljZVJhdGVRdWVyeVJlc3BvbnNlLlJhdGUsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5Wb2ljZVJhdGVRdWVyeVJlc3BvbnNlLlJhdGUucHJvdG90eXBlLmdldE9yaWdpbmFsTnVtYmVyID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRWb2ljZVJhdGVRdWVyeVJlc3BvbnNlJFJhdGUkJGdldE9yaWdpbmFsTnVtYmVyJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVswXQp9Owpwcm90by5hcHBzLmNoYXQuVm9pY2VSYXRlUXVlcnlSZXNwb25zZS5SYXRlLnByb3RvdHlwZS5nZXRSZXNwb25zZUNvZGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UkUmF0ZSQkZ2V0UmVzcG9uc2VDb2RlJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxXQp9Owpwcm90by5hcHBzLmNoYXQuVm9pY2VSYXRlUXVlcnlSZXNwb25zZS5SYXRlLnByb3RvdHlwZS5nZXREaXNwbGF5Q2FsbFJhdGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UkUmF0ZSQkZ2V0RGlzcGxheUNhbGxSYXRlJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs0XQp9Owpwcm90by5hcHBzLmNoYXQuVm9pY2VSYXRlUXVlcnlSZXNwb25zZS5SYXRlLnByb3RvdHlwZS5nZXREaXNwbGF5U21zUmF0ZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkVm9pY2VSYXRlUXVlcnlSZXNwb25zZSRSYXRlJCRnZXREaXNwbGF5U21zUmF0ZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbNV0KfTsKcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UuUmF0ZS5wcm90b3R5cGUuZ2V0RGlzcGxheVBzdG5PdXRSYXRlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRWb2ljZVJhdGVRdWVyeVJlc3BvbnNlJFJhdGUkJGdldERpc3BsYXlQc3RuT3V0UmF0ZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbNl0KfTsKcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UuUmF0ZS5wcm90b3R5cGUuZ2V0Q2FsbFJhdGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UkUmF0ZSQkZ2V0Q2FsbFJhdGUkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzddCn07CnByb3RvLmFwcHMuY2hhdC5Wb2ljZVJhdGVRdWVyeVJlc3BvbnNlLlJhdGUucHJvdG90eXBlLmdldFNtc1JhdGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UkUmF0ZSQkZ2V0U21zUmF0ZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbOF0KfTsKcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UuUmF0ZS5wcm90b3R5cGUuZ2V0UHN0bk91dFJhdGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UkUmF0ZSQkZ2V0UHN0bk91dFJhdGUkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzldCn07CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMgPSB7fTsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfSE9NRSA9ICJIb21lIjsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfV09SSyA9ICJXb3JrIjsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfT1RIRVIgPSAiT3RoZXIiOwp0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19IT01FX0ZBWCA9ICJIb21lIEZheCI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1dPUktfRkFYID0gIldvcmsgRmF4IjsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfTU9CSUxFID0gIk1vYmlsZSI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1BBR0VSID0gIlBhZ2VyIjsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfT1RIRVJfRkFYID0gIk90aGVyIEZheCI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX0NPTVBBTllfTUFJTiA9ICJDb21wYW55IE1haW4iOwp0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19BU1NJU1RBTlQgPSAiQXNzaXN0YW50IjsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfQ0FSID0gIkNhciI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1JBRElPID0gIlJhZGlvIjsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfSVNETiA9ICJJU0ROIjsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfQ0FMTEJBQ0sgPSAiQ2FsbGJhY2siOwp0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19URUxFWCA9ICJURUxFWCI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1RUWV9UREQgPSAiVFRZIFRERCI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1dPUktfTU9CSUxFID0gIldvcmsgTW9iaWxlIjsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfV09SS19QQUdFUiA9ICJXb3JrIFBhZ2VyIjsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfTUFJTiA9ICJNYWluIjsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfR09PR0xFX1ZPSUNFID0gIkdvb2dsZSBWb2ljZSI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1VOS05PV04gPSAiVW5rbm93biI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1NIT1JUX0hPTUUgPSAiSCI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1NIT1JUX1dPUksgPSAiVyI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1NIT1JUX09USEVSID0gIk8iOwp0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19TSE9SVF9NT0JJTEUgPSAiTSI7CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuU3RhbmRhcmRUYWcgPSB7Q1VTVE9NX1RBRzoxLCBIT01FOjIsIFdPUks6MywgT1RIRVI6NCwgSE9NRV9GQVg6NSwgV09SS19GQVg6NiwgTU9CSUxFOjcsIFBBR0VSOjgsIE9USEVSX0ZBWDo5LCBDT01QQU5ZX01BSU46MTAsIEFTU0lTVEFOVDoxMSwgQ0FSOjEyLCBSQURJTzoxMywgSVNETjoxNCwgQ0FMTEJBQ0s6MTUsIFRFTEVYOjE2LCBUVFlfVEREOjE3LCBXT1JLX01PQklMRToxOCwgV09SS19QQUdFUjoxOSwgTUFJTjoyMCwgR1JBTkRfQ0VOVFJBTDoyMX07CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuaXNWYWxpZFN0YW5kYXJkVGFnID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkUGhvbmVOdW1iZXJDb25zdGFudHMkaXNWYWxpZFN0YW5kYXJkVGFnJCh0YWcpIHsKICByZXR1cm4gMSA8PSB0YWcgJiYgMjEgPj0gdGFnCn07CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuU3RhbmRhcmRUYWdNZXNzYWdlID0gWyIiLCAiIiwgdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfSE9NRSwgdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfV09SSywgdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfT1RIRVIsIHRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX0hPTUVfRkFYLCB0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19XT1JLX0ZBWCwgdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfTU9CSUxFLCB0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19QQUdFUiwgdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfT1RIRVJfRkFYLCB0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19DT01QQU5ZX01BSU4sIAp0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19BU1NJU1RBTlQsIHRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX0NBUiwgdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfUkFESU8sIHRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX0lTRE4sIHRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX0NBTExCQUNLLCB0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19URUxFWCwgdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfVFRZX1RERCwgdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfV09SS19NT0JJTEUsIHRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1dPUktfUEFHRVIsIHRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX01BSU4sIAp0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19HT09HTEVfVk9JQ0VdOwp0YWxrLm1lZGlhLnBob25lLkRlc2NyaXB0aW9uTWFwcGluZ3NfID0gW1t0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLk1TR19NT0JJTEUsIFsiUGVyc29uYWwiLCAibSJdXSwgW3RhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX0hPTUUsIFsiUGVyc29uYWwiLCAicCJdXSwgW3RhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuTVNHX1dPUkssIFsiV29yayIsICJwIl1dLCBbdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5NU0dfT1RIRVIsIG51bGxdXTsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5nZXRQaG9uZURlc2NyaXB0aW9uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkUGhvbmVOdW1iZXJDb25zdGFudHMkZ2V0UGhvbmVEZXNjcmlwdGlvbiQoc2VjdGlvbk5hbWUsIGZpZWxkTmFtZSkgewogIHZhciBpOwogIGZvcihpID0gMDtpIDwgdGFsay5tZWRpYS5waG9uZS5EZXNjcmlwdGlvbk1hcHBpbmdzXy5sZW5ndGggLSAxICYmICEodGFsay5tZWRpYS5waG9uZS5EZXNjcmlwdGlvbk1hcHBpbmdzX1tpXVsxXVswXSA9PSBzZWN0aW9uTmFtZSAmJiB0YWxrLm1lZGlhLnBob25lLkRlc2NyaXB0aW9uTWFwcGluZ3NfW2ldWzFdWzFdID09IGZpZWxkTmFtZSk7aSsrKSB7CiAgfQogIHJldHVybiB0YWxrLm1lZGlhLnBob25lLkRlc2NyaXB0aW9uTWFwcGluZ3NfW2ldWzBdCn07CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuZ2V0RGVmYXVsdFBob25lRGVzY3JpcHRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRQaG9uZU51bWJlckNvbnN0YW50cyRnZXREZWZhdWx0UGhvbmVEZXNjcmlwdGlvbiQoKSB7CiAgcmV0dXJuIHRhbGsubWVkaWEucGhvbmUuRGVzY3JpcHRpb25NYXBwaW5nc19bMF1bMF0KfTsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5waG9uZURlc2NyaXB0aW9uSXNPdGhlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJFBob25lTnVtYmVyQ29uc3RhbnRzJHBob25lRGVzY3JpcHRpb25Jc090aGVyJChwaG9uZURlc2MpIHsKICByZXR1cm4gcGhvbmVEZXNjID09IHRhbGsubWVkaWEucGhvbmUuRGVzY3JpcHRpb25NYXBwaW5nc19bdGFsay5tZWRpYS5waG9uZS5EZXNjcmlwdGlvbk1hcHBpbmdzXy5sZW5ndGggLSAxXVswXQp9Owp0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLmdldFNlY3Rpb25BbmRGaWVsZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJFBob25lTnVtYmVyQ29uc3RhbnRzJGdldFNlY3Rpb25BbmRGaWVsZCQocGhvbmVEZXNjKSB7CiAgdmFyIGk7CiAgZm9yKGkgPSAwO2kgPCB0YWxrLm1lZGlhLnBob25lLkRlc2NyaXB0aW9uTWFwcGluZ3NfLmxlbmd0aCAtIDEgJiYgISh0YWxrLm1lZGlhLnBob25lLkRlc2NyaXB0aW9uTWFwcGluZ3NfW2ldWzBdID09IHBob25lRGVzYyk7aSsrKSB7CiAgfQogIHJldHVybiB0YWxrLm1lZGlhLnBob25lLkRlc2NyaXB0aW9uTWFwcGluZ3NfW2ldWzFdCn07CnRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMucmVzZW1ibGVzUGhvbmVOdW1iZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRQaG9uZU51bWJlckNvbnN0YW50cyRyZXNlbWJsZXNQaG9uZU51bWJlciQoc3RyKSB7CiAgcmV0dXJuIS9bYS16QS1aXS8udGVzdChzdHIpICYmIC9bXGRdLy50ZXN0KHN0cikKfTsKdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5nZXRQaG9uZURlc2NyaXB0aW9ucyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJFBob25lTnVtYmVyQ29uc3RhbnRzJGdldFBob25lRGVzY3JpcHRpb25zJChleGNsdWRlT3RoZXIpIHsKICBmb3IodmFyIHJlc3VsdCA9IFtdLCBjb3VudCA9IGV4Y2x1ZGVPdGhlciA/IHRhbGsubWVkaWEucGhvbmUuRGVzY3JpcHRpb25NYXBwaW5nc18ubGVuZ3RoIC0gMSA6IHRhbGsubWVkaWEucGhvbmUuRGVzY3JpcHRpb25NYXBwaW5nc18ubGVuZ3RoLCBpID0gMDtpIDwgY291bnQ7aSsrKSB7CiAgICByZXN1bHRbaV0gPSB0YWxrLm1lZGlhLnBob25lLkRlc2NyaXB0aW9uTWFwcGluZ3NfW2ldWzBdCiAgfQogIHJldHVybiByZXN1bHQKfTsKY2hhdC5tb2RlbC5QaG9uZU51bWJlciA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJFBob25lTnVtYmVyJChudW1iZXIsIGNhbm9uaWNhbGl6ZWROdW1iZXIpIHsKICB0aGlzLm51bWJlcl8gPSBudW1iZXI7CiAgdGhpcy5jYW5vbmljYWxpemVkTnVtYmVyXyA9IGNhbm9uaWNhbGl6ZWROdW1iZXIKfTsKY2hhdC5tb2RlbC5QaG9uZU51bWJlci5QaG9uZU51bWJlclN0YXRlID0ge05PTkU6Im5vbmUiLCBQRU5ESU5HOiJwZW5kaW5nIiwgU1VCU0NSSUJFRDoic3Vic2NyaWJlZCJ9OwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS5udW1iZXJfID0gIiI7CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLmNhbm9uaWNhbGl6ZWROdW1iZXJfID0gIiI7CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLmN1c3RvbURlc2NyaXB0aW9uXyA9ICIiOwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS50YWdfID0gdGFsay5tZWRpYS5waG9uZS5QaG9uZU51bWJlckNvbnN0YW50cy5TdGFuZGFyZFRhZy5PVEhFUjsKY2hhdC5tb2RlbC5QaG9uZU51bWJlci5wcm90b3R5cGUuZXZlcmdyZWVuXyA9ICExOwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS52YWxpZF8gPSAhMTsKY2hhdC5tb2RlbC5QaG9uZU51bWJlci5wcm90b3R5cGUuc3Vic2NyaXB0aW9uU3RhdGVfID0gY2hhdC5tb2RlbC5QaG9uZU51bWJlci5QaG9uZU51bWJlclN0YXRlLk5PTkU7CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLmRpc3BsYXlTbXNSYXRlXyA9IG51bGw7CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLnZvaWNlUmF0ZV8gPSBudWxsOwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS5zbXNSYXRlXyA9IG51bGw7CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLmdjb21tUHN0bk91dFJhdGVfID0gbnVsbDsKY2hhdC5tb2RlbC5QaG9uZU51bWJlci5wcm90b3R5cGUuZ2V0TnVtYmVyID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkUGhvbmVOdW1iZXIkJGdldE51bWJlciQoKSB7CiAgcmV0dXJuIHRoaXMubnVtYmVyXwp9OwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS5nZXRDYW5vbmljYWxpemVkTnVtYmVyID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkUGhvbmVOdW1iZXIkJGdldENhbm9uaWNhbGl6ZWROdW1iZXIkKCkgewogIHJldHVybiB0aGlzLmNhbm9uaWNhbGl6ZWROdW1iZXJfCn07CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLmdldFN0YXRlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkUGhvbmVOdW1iZXIkJGdldFN0YXRlJCgpIHsKICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25TdGF0ZV8KfTsKY2hhdC5tb2RlbC5QaG9uZU51bWJlci5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRQaG9uZU51bWJlciQkc2V0U3RhdGUkKHN0YXRlKSB7CiAgdmFyIGNoYW5nZSA9IHRoaXMuc3Vic2NyaXB0aW9uU3RhdGVfICE9IHN0YXRlOwogIHRoaXMuc3Vic2NyaXB0aW9uU3RhdGVfID0gc3RhdGU7CiAgcmV0dXJuIGNoYW5nZQp9OwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS5nZXRDdXN0b21EZXNjcmlwdGlvbiA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJFBob25lTnVtYmVyJCRnZXRDdXN0b21EZXNjcmlwdGlvbiQoKSB7CiAgcmV0dXJuIHRoaXMuY3VzdG9tRGVzY3JpcHRpb25fCn07CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLnNldEN1c3RvbURlc2NyaXB0aW9uID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkUGhvbmVOdW1iZXIkJHNldEN1c3RvbURlc2NyaXB0aW9uJChkZXNjcmlwdGlvbikgewogIHZhciBjaGFuZ2UgPSB0aGlzLmN1c3RvbURlc2NyaXB0aW9uXyAhPSBkZXNjcmlwdGlvbjsKICB0aGlzLmN1c3RvbURlc2NyaXB0aW9uXyA9IGRlc2NyaXB0aW9uOwogIHJldHVybiBjaGFuZ2UKfTsKY2hhdC5tb2RlbC5QaG9uZU51bWJlci5wcm90b3R5cGUuZ2V0VGFnID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkUGhvbmVOdW1iZXIkJGdldFRhZyQoKSB7CiAgcmV0dXJuIHRoaXMudGFnXwp9OwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS5zZXRUYWcgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRQaG9uZU51bWJlciQkc2V0VGFnJCh0YWcpIHsKICB2YXIgY2hhbmdlID0gdGhpcy50YWdfICE9IHRhZzsKICB0aGlzLnRhZ18gPSB0YWc7CiAgcmV0dXJuIGNoYW5nZQp9OwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS5zZXRFdmVyZ3JlZW4gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRQaG9uZU51bWJlciQkc2V0RXZlcmdyZWVuJChldmVyZ3JlZW4pIHsKICB2YXIgY2hhbmdlID0gdGhpcy5ldmVyZ3JlZW5fICE9IGV2ZXJncmVlbjsKICB0aGlzLmV2ZXJncmVlbl8gPSBldmVyZ3JlZW47CiAgcmV0dXJuIGNoYW5nZQp9OwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS5pc1ZhbGlkID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkUGhvbmVOdW1iZXIkJGlzVmFsaWQkKCkgewogIHJldHVybiB0aGlzLnZhbGlkXwp9OwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS5zZXRWYWxpZCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJFBob25lTnVtYmVyJCRzZXRWYWxpZCQodmFsaWQpIHsKICB2YXIgY2hhbmdlID0gdGhpcy52YWxpZF8gIT0gdmFsaWQ7CiAgdGhpcy52YWxpZF8gPSB2YWxpZDsKICByZXR1cm4gY2hhbmdlCn07CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLmlzTW9iaWxlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkUGhvbmVOdW1iZXIkJGlzTW9iaWxlJCgpIHsKICByZXR1cm4gdGhpcy50YWdfID09IHRhbGsubWVkaWEucGhvbmUuUGhvbmVOdW1iZXJDb25zdGFudHMuU3RhbmRhcmRUYWcuTU9CSUxFIHx8IHRoaXMudGFnXyA9PSB0YWxrLm1lZGlhLnBob25lLlBob25lTnVtYmVyQ29uc3RhbnRzLlN0YW5kYXJkVGFnLldPUktfTU9CSUxFCn07CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJFBob25lTnVtYmVyJCRlcXVhbHMkKGNvbXBhcmUpIHsKICByZXR1cm4gY29tcGFyZS5nZXRDdXN0b21EZXNjcmlwdGlvbigpICE9IHRoaXMuZ2V0Q3VzdG9tRGVzY3JpcHRpb24oKSB8fCBjb21wYXJlLmdldFRhZygpICE9IHRoaXMuZ2V0VGFnKCkgfHwgY29tcGFyZS5nZXRTdGF0ZSgpICE9IHRoaXMuZ2V0U3RhdGUoKSB8fCBjb21wYXJlLmdldE51bWJlcigpICE9IHRoaXMuZ2V0TnVtYmVyKCkgfHwgY29tcGFyZS5pc01vYmlsZSgpICE9IHRoaXMuaXNNb2JpbGUoKSB8fCBjb21wYXJlLmlzVmFsaWQoKSAhPSB0aGlzLmlzVmFsaWQoKSA/ICExIDogITAKfTsKY2hhdC5tb2RlbC5QaG9uZU51bWJlci5wcm90b3R5cGUuZ2V0SmlkID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkUGhvbmVOdW1iZXIkJGdldEppZCQoKSB7CiAgcmV0dXJuIG5ldyBhcHBzLmNoYXQuY29yZS5KaWQoYXBwcy5jaGF0LmNvcmUuSmlkLlZPSUNFX0RPTUFJTiwgdGhpcy5nZXRDYW5vbmljYWxpemVkTnVtYmVyKCksIG51bGwpCn07CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLnNldFJhdGVzID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkUGhvbmVOdW1iZXIkJHNldFJhdGVzJChkaXNwbGF5Vm9pY2VSYXRlLCBkaXNwbGF5U21zUmF0ZSwgZGlzcGxheUdjb21tUHN0bk91dFJhdGUsIHZvaWNlUmF0ZSwgc21zUmF0ZSwgZ2NvbW1Qc3RuT3V0UmF0ZSkgewogIHZhciBjaGFuZ2VkID0gITE7CiAgdGhpcy5kaXNwbGF5U21zUmF0ZV8gPSBkaXNwbGF5U21zUmF0ZTsKICBpZighZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy52b2ljZVJhdGVfKSB8fCB0aGlzLnZvaWNlUmF0ZV8gIT0gdm9pY2VSYXRlKSB7CiAgICB0aGlzLnZvaWNlUmF0ZV8gPSB2b2ljZVJhdGUsIGNoYW5nZWQgPSAhMAogIH0KICBpZighZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5zbXNSYXRlXykgfHwgdGhpcy5zbXNSYXRlXyAhPSBzbXNSYXRlKSB7CiAgICB0aGlzLnNtc1JhdGVfID0gc21zUmF0ZSwgY2hhbmdlZCA9ICEwCiAgfQogIGlmKCFnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmdjb21tUHN0bk91dFJhdGVfKSB8fCB0aGlzLmdjb21tUHN0bk91dFJhdGVfICE9IGdjb21tUHN0bk91dFJhdGUpIHsKICAgIHRoaXMuZ2NvbW1Qc3RuT3V0UmF0ZV8gPSBnY29tbVBzdG5PdXRSYXRlLCBjaGFuZ2VkID0gITAKICB9CiAgcmV0dXJuIGNoYW5nZWQKfTsKY2hhdC5tb2RlbC5QaG9uZU51bWJlci5wcm90b3R5cGUuZ2V0RGlzcGxheVNtc1JhdGUgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRQaG9uZU51bWJlciQkZ2V0RGlzcGxheVNtc1JhdGUkKCkgewogIHJldHVybiB0aGlzLmRpc3BsYXlTbXNSYXRlXwp9OwpjaGF0Lm1vZGVsLlBob25lTnVtYmVyLnByb3RvdHlwZS5nZXRTbXNSYXRlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkUGhvbmVOdW1iZXIkJGdldFNtc1JhdGUkKCkgewogIHJldHVybiB0aGlzLnNtc1JhdGVfCn07CmNoYXQubW9kZWwuUGhvbmVOdW1iZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRQaG9uZU51bWJlciQkY29tcGFyZSQobnVtYmVyMSwgbnVtYmVyMikgewogIHJldHVybiBnb29nLnN0cmluZy5jYXNlSW5zZW5zaXRpdmVDb21wYXJlKG51bWJlcjEuZ2V0Q2Fub25pY2FsaXplZE51bWJlcigpLCBudW1iZXIyLmdldENhbm9uaWNhbGl6ZWROdW1iZXIoKSkKfTsKY2hhdC5tb2RlbC5Db250YWN0ID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQoYXBwQ29udGV4dCwgamlkLCBvcHRfc2hvcnRJZCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJjaGF0Lm1vZGVsLkNvbnRhY3QiKTsKICB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyXyA9IGNoYXQuY2xpZW50LkV4cGVyaW1lbnRNYW5hZ2VyLmdldChhcHBDb250ZXh0KTsKICB0aGlzLmNvbmZpZ18gPSBjaGF0LmNsaWVudC5SZWFkT25seUNvbmZpZy5nZXQoYXBwQ29udGV4dCk7CiAgdGhpcy5qaWRfID0gYXBwcy5jaGF0LmNvcmUuSmlkLkZyb21TdHJpbmcoamlkKTsKICB0aGlzLnNob3J0SWRfID0gb3B0X3Nob3J0SWQ7CiAgdGhpcy5sYXN0Q2hhdFRpbWVzdGFtcF8gPSB0aGlzLndlaWdodF8gPSAwOwogIHRoaXMucHJlc2VuY2VDb2RlXyA9IG51bGw7CiAgdGhpcy5sb2dnZXJfLmluZm8oIkNyZWF0aW5nIGNvbnRhY3QgZm9yICciICsgamlkICsgIicgKCIgKyBvcHRfc2hvcnRJZCArICIpIik7CiAgdGhpcy5zZXJ2ZXJNZXNzYWdlU2VuZGVyXyA9IGNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VTZW5kZXIuZ2V0KGFwcENvbnRleHQpOwogIHRoaXMuc2VydmVyTWVzc2FnZURpc3BhdGNoZXJfID0gY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXIuZ2V0KGFwcENvbnRleHQpOwogIGdvb2cuZXZlbnRzLmxpc3Rlbih0aGlzLnNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyXywgcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UubWVzc2FnZUlkLCB0aGlzLmhhbmRsZVZvaWNlUmF0ZXNGcm9tU2VydmVyXywgITEsIHRoaXMpCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5tb2RlbC5Db250YWN0LCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CmNoYXQubW9kZWwuQ29udGFjdC5NVUNfU0hPUlRfSUQgPSAiLTIiOwpjaGF0Lm1vZGVsLkNvbnRhY3QuRXZlbnRUeXBlID0ge0FWQVRBUl9VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImF2YXRhcl91cGRhdGUiKSwgQlVERFlfUE9VTkNFX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiYnVkZHlfcG91bmNlX3VwZGF0ZSIpLCBDQVBBQklMSVRJRVNfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJjYXBhYmlsaXRpZXNfdXBkYXRlIiksIENIQVRfU1RBVEVfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJjaGF0X3N0YXRlX3VwZGF0ZSIpLCBFTUFJTF9VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImVtYWlsX3VwZGF0ZSIpLCBGSUxURVJfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJmaWx0ZXJfdXBkYXRlIiksIEZPQ1VTX0dST1VQU19VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImZvY3VzX2dyb3Vwc191cGRhdGUiKSwgR0FJQUlEX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiZ2FpYWlkX3VwZGF0ZSIpLCAKR1BMVVNfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJncGx1c191cGRhdGUiKSwgTEFTVF9DSEFUX1RTX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgibGFzdF9jaGF0X3RzX3VwZGF0ZSIpLCBOQU1FX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgibmFtZV91cGRhdGUiKSwgTkVXX0NIQVRfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJuZXdfY2hhdF91cGRhdGUiKSwgTk9TQVZFX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgibm9zYXZlX3VwZGF0ZSIpLCBPUEVOX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgib3Blbl91cGRhdGUiKSwgT1JLVVRfQVZBVEFSX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgib3JrdXRfYXZhdGFyX3VwZGF0ZSIpLCBQT1JUUkFJVF9VUkxfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJwb3J0cmFpdF91cmxfdXBkYXRlIiksIFBIT05FX05VTUJFUl9SQVRFX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgicGhvbmVfbnVtYmVyX3JhdGVfdXBkYXRlIiksIApQSE9ORV9OVU1CRVJfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJwaG9uZV9udW1iZXJfdXBkYXRlIiksIFJFSkVDVEVEX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgicmVqZWN0ZWRfdXBkYXRlIiksIFNIT1dfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJzaG93X3VwZGF0ZSIpLCBTVEFUVVNfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJzdGF0dXNfdXBkYXRlIiksIFNVQlNDUklQVElPTl9VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInN1YnNjcmlwdGlvbl91cGRhdGUiKSwgV0VJR0hUX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgid2VpZ2h0X3VwZGF0ZSIpfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGNoYXQubW9kZWwuQ29udGFjdC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICBnb29nLmV2ZW50cy51bmxpc3Rlbih0aGlzLnNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyXywgcHJvdG8uYXBwcy5jaGF0LlZvaWNlUmF0ZVF1ZXJ5UmVzcG9uc2UubWVzc2FnZUlkLCB0aGlzLmhhbmRsZVZvaWNlUmF0ZXNGcm9tU2VydmVyXywgITEsIHRoaXMpCn07CmNoYXQubW9kZWwuQ29udGFjdC5Db250YWN0RXZlbnQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JENvbnRhY3RFdmVudCQodHlwZSwgY29udGFjdCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdHlwZSk7CiAgdGhpcy5jb250YWN0ID0gY29udGFjdAp9Owpnb29nLmluaGVyaXRzKGNoYXQubW9kZWwuQ29udGFjdC5Db250YWN0RXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKY2hhdC5tb2RlbC5Db250YWN0LkNoYXRTdGF0ZSA9IHtDT01QT1NJTkc6ImMiLCBQQVVTRUQ6InAiLCBJRExFOiJpIiwgR09ORToiZyIsIEFDVElWRToiYSJ9OwpjaGF0Lm1vZGVsLkNvbnRhY3QuRmlsdGVyID0ge05PUk1BTDoiTiIsIFBJTk5FRDoiUCIsIEhJRERFTjoiSCIsIEJMT0NLRUQ6IkIifTsKY2hhdC5tb2RlbC5Db250YWN0LkNhcGFiaWxpdGllcyA9IHtWT0lDRToxLCBQTVVDOjIsIFZPSUNFTUFJTDo0LCBWSURFTzo4LCBDQU1FUkE6MTYsIFNIQVJFOjMyLCBBUFBNT0xFUzo2NCwgUExVR0lOOjEyOCwgTU9CSUxFOjI1Nn07CmNoYXQubW9kZWwuQ29udGFjdC5ERUZBVUxUX0FWQVRBUl9VUkwgPSAiaW1hZ2VzL25vcGljdHVyZSI7CmNoYXQubW9kZWwuQ29udGFjdC5zdGF0dXNBc0h0bWwgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JHN0YXR1c0FzSHRtbCQocGFyc2VkU3RhdHVzLCBzdGF0dXMsIG9wdF9hbmltYXRlT25Mb2FkLCBvcHRfY29uZmlnKSB7CiAgcmV0dXJuIGNoYXQudXRpbHMuU3RyaW5nVXRpbHMuZ2VuZXJhdGVQYXJzZWRIdG1sKHBhcnNlZFN0YXR1cywgc3RhdHVzLCAhMCwgbnVsbCwgITAsIG9wdF9hbmltYXRlT25Mb2FkLCBvcHRfY29uZmlnKQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3Quc2hhcmVkU3RhdHVzU2hvd1RvSnNwYlNob3cgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JHNoYXJlZFN0YXR1c1Nob3dUb0pzcGJTaG93JChzaG93KSB7CiAgc3dpdGNoKHNob3cpIHsKICAgIGNhc2UgZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuU2hvdy5PRkZMSU5FOgogICAgICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlLlNob3cuT0ZGTElORTsKICAgIGNhc2UgZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuU2hvdy5JRExFOgogICAgICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlLlNob3cuQVdBWTsKICAgIGNhc2UgZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuU2hvdy5CVVNZOgogICAgICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlLlNob3cuRE5EOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZS5TaG93LkFWQUlMQUJMRQogIH0KfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5zaG93XyA9IGdvb2cudGFsay5zaGFyZWRjb25zdGFudHMuU2hhcmVkU3RhdHVzLlNob3cuT0ZGTElORTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5zdGF0dXNfID0gIiI7CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuY2Fwc18gPSBnb29nLnRhbGsuc2hhcmVkY29uc3RhbnRzLlNoYXJlZFN0YXR1cy5DYXBhYmlsaXRpZXMuTk9ORTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5waG9uZU51bWJlcnNfID0gW107CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuZm9jdXNHcm91cHNfID0gW107CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuY2hhdFN0YXRlXyA9IGNoYXQubW9kZWwuQ29udGFjdC5DaGF0U3RhdGUuQUNUSVZFOwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLmlzQnVkZHlQb3VuY2VFbmFibGVkXyA9ICExOwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLmlzUmVqZWN0ZWRfID0gITE7CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuZ2V0SmlkID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkZ2V0SmlkJCgpIHsKICByZXR1cm4gdGhpcy5qaWRfCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuZ2V0U2hvcnRJZCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJGdldFNob3J0SWQkKCkgewogIHJldHVybiB0aGlzLnNob3J0SWRfCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuc2V0U2hvcnRJZCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJHNldFNob3J0SWQkKGlkKSB7CiAgdGhpcy5zaG9ydElkXyA9IGlkCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuZ2V0Q2FwYWJpbGl0aWVzID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkZ2V0Q2FwYWJpbGl0aWVzJCgpIHsKICByZXR1cm4gdGhpcy5jYXBzXwp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLmdldFByZXNlbmNlQ29kZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJGdldFByZXNlbmNlQ29kZSQoKSB7CiAgcmV0dXJuIHRoaXMucHJlc2VuY2VDb2RlXwp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLnNldFByZXNlbmNlQ29kZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJHNldFByZXNlbmNlQ29kZSQoY29kZSkgewogIHRoaXMucHJlc2VuY2VDb2RlXyA9IGNvZGUKfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5nZXRTaG93ID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkZ2V0U2hvdyQoKSB7CiAgcmV0dXJuIHRoaXMuc2hvd18KfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5nZXRKc3BiU2hvdyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJGdldEpzcGJTaG93JCgpIHsKICByZXR1cm4gY2hhdC5tb2RlbC5Db250YWN0LnNoYXJlZFN0YXR1c1Nob3dUb0pzcGJTaG93KHRoaXMuc2hvd18pCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuaXNPbmxpbmUgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRpc09ubGluZSQoKSB7CiAgcmV0dXJuIHRoaXMuc2hvd18gIT0gZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuU2hvdy5PRkZMSU5FICYmIHRoaXMuc2hvd18gIT0gZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuU2hvdy5VTktOT1dOCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJHNldE5hbWUkKG5hbWUpIHsKICB2YXIgY2hhbmdlZCA9IHRoaXMubmFtZV8gIT0gbmFtZTsKICB0aGlzLm5hbWVfID0gbmFtZTsKICBjaGFuZ2VkICYmIChkZWxldGUgdGhpcy5zaG9ydE5hbWVfLCB0aGlzLmRpc3BhdGNoVXBkYXRlRXZlbnRfKGNoYXQubW9kZWwuQ29udGFjdC5FdmVudFR5cGUuTkFNRV9VUERBVEUpKTsKICByZXR1cm4gY2hhbmdlZAp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLmdldEZ1bGxOYW1lID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkZ2V0RnVsbE5hbWUkKCkgewogIHJldHVybiB0aGlzLm5hbWVfCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuZ2V0U2hvcnROYW1lID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkZ2V0U2hvcnROYW1lJCgpIHsKICBpZihnb29nLmlzRGVmKHRoaXMuc2hvcnROYW1lXykpIHsKICAgIHJldHVybiB0aGlzLnNob3J0TmFtZV8KICB9CiAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5uYW1lXykpIHsKICAgIHZhciBmdWxsTmFtZSA9IHRoaXMubmFtZV87CiAgICB0aGlzLnNob3J0TmFtZV8gPSAtMSA8IGZ1bGxOYW1lLmluZGV4T2YoIiAiKSA/IGZ1bGxOYW1lLnNwbGl0KCIgIiwgMSlbMF0gOiAtMSA8IGZ1bGxOYW1lLmluZGV4T2YoIkAiKSA/IGZ1bGxOYW1lLnNwbGl0KCJAIiwgMSlbMF0gOiBmdWxsTmFtZQogIH1lbHNlIHsKICAgIHZhciBub2RlID0gdGhpcy5qaWRfLmdldE5vZGUoKTsKICAgIGdvb2cuaXNEZWZBbmROb3ROdWxsKG5vZGUpID8gdGhpcy5zaG9ydE5hbWVfID0gbm9kZSA6IHRoaXMuamlkXy5tYWtlQmFyZSgpCiAgfQogIHJldHVybiB0aGlzLnNob3J0TmFtZV8KfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5zZXRFbWFpbCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJHNldEVtYWlsJChlbWFpbCkgewogIHZhciBjaGFuZ2VkID0gdGhpcy5lbWFpbF8gIT0gZW1haWw7CiAgdGhpcy5lbWFpbF8gPSBlbWFpbDsKICBjaGFuZ2VkICYmIHRoaXMuZGlzcGF0Y2hVcGRhdGVFdmVudF8oY2hhdC5tb2RlbC5Db250YWN0LkV2ZW50VHlwZS5FTUFJTF9VUERBVEUpOwogIHJldHVybiBjaGFuZ2VkCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuZ2V0RW1haWwgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRnZXRFbWFpbCQoKSB7CiAgdmFyIGppZFN0ciA9IHRoaXMuamlkXy50b1N0cmluZygpOwogIHJldHVybiB0aGlzLmNvbmZpZ18uaGlkZUVtYWlsIHx8IGFwcHMuY2hhdC5jb3JlLkppZC5pc0JvdEppZChqaWRTdHIpIHx8IGFwcHMuY2hhdC5jb3JlLkppZC5Jc1B1YmxpY1Byb2ZpbGVKaWQoamlkU3RyKSB8fCBhcHBzLmNoYXQuY29yZS5KaWQuSXNQaG9uZU9ubHlKaWQoamlkU3RyKSB8fCBhcHBzLmNoYXQuY29yZS5KaWQuSXNWb2ljZU9ubHlKaWQoamlkU3RyKSA/ICIiIDogdGhpcy5lbWFpbF8KfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5jYW5TZW5kRW1haWwgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRjYW5TZW5kRW1haWwkKCkgewogIHJldHVybiB0aGlzLmNvbmZpZ18uaGlkZUVtYWlsID8gITEgOiAhZ29vZy5zdHJpbmcuaXNFbXB0eVNhZmUodGhpcy5lbWFpbF8pICYmIHRoaXMuZW1haWxfICE9IHRoaXMuamlkXyB8fCBhcHBzLmNoYXQuY29yZS5KaWQuY2FuU2VuZEVtYWlsKHRoaXMuamlkXy50b1N0cmluZygpKQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLnNldE9iZnVzY2F0ZWRHYWlhSWQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRzZXRPYmZ1c2NhdGVkR2FpYUlkJChnYWlhSWQpIHsKICB2YXIgY2hhbmdlZCA9IHRoaXMub2JmdXNjYXRlZEdhaWFJZF8gIT0gZ2FpYUlkOwogIHRoaXMub2JmdXNjYXRlZEdhaWFJZF8gPSBnYWlhSWQ7CiAgY2hhbmdlZCAmJiB0aGlzLmRpc3BhdGNoVXBkYXRlRXZlbnRfKGNoYXQubW9kZWwuQ29udGFjdC5FdmVudFR5cGUuR0FJQUlEX1VQREFURSk7CiAgcmV0dXJuIGNoYW5nZWQKfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5nZXRPYmZ1c2NhdGVkR2FpYUlkID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkZ2V0T2JmdXNjYXRlZEdhaWFJZCQoKSB7CiAgcmV0dXJuIGdvb2cuaXNEZWYodGhpcy5vYmZ1c2NhdGVkR2FpYUlkXykgPyB0aGlzLm9iZnVzY2F0ZWRHYWlhSWRfIDogbnVsbAp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLnNldEdQbHVzRW5hYmxlZCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJHNldEdQbHVzRW5hYmxlZCQoc3RhdGUpIHsKICB2YXIgY2hhbmdlZCA9IHRoaXMuaXNHUGx1c18gIT0gc3RhdGU7CiAgdGhpcy5pc0dQbHVzXyA9IHN0YXRlOwogIGNoYW5nZWQgJiYgdGhpcy5kaXNwYXRjaFVwZGF0ZUV2ZW50XyhjaGF0Lm1vZGVsLkNvbnRhY3QuRXZlbnRUeXBlLkdQTFVTX1VQREFURSk7CiAgcmV0dXJuIGNoYW5nZWQKfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5zZXRBdmF0YXJVcmwgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRzZXRBdmF0YXJVcmwkKHVybCkgewogIHZhciBjaGFuZ2VkID0gdGhpcy5hdmF0YXJVcmxfICE9IHVybDsKICB0aGlzLmF2YXRhclVybF8gPSB1cmw7CiAgY2hhbmdlZCAmJiB0aGlzLmRpc3BhdGNoVXBkYXRlRXZlbnRfKGNoYXQubW9kZWwuQ29udGFjdC5FdmVudFR5cGUuQVZBVEFSX1VQREFURSk7CiAgcmV0dXJuIGNoYW5nZWQKfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5nZXRBdmF0YXJVcmwgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRnZXRBdmF0YXJVcmwkKCkgewogIHJldHVybiFnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmF2YXRhclVybF8pID8gY2hhdC5tb2RlbC5Db250YWN0LkRFRkFVTFRfQVZBVEFSX1VSTCArIChnb29nLnVzZXJBZ2VudC5JRSA/ICIuZ2lmIiA6ICIucG5nIikgOiB0aGlzLmF2YXRhclVybF8KfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5zZXRPcmt1dEF2YXRhclVybCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJHNldE9ya3V0QXZhdGFyVXJsJCh1cmwpIHsKICB2YXIgY2hhbmdlZCA9IHRoaXMub3JrdXRBdmF0YXJVcmxfICE9IHVybDsKICB0aGlzLm9ya3V0QXZhdGFyVXJsXyA9IHVybDsKICBjaGFuZ2VkICYmIHRoaXMuZGlzcGF0Y2hVcGRhdGVFdmVudF8oY2hhdC5tb2RlbC5Db250YWN0LkV2ZW50VHlwZS5PUktVVF9BVkFUQVJfVVBEQVRFKTsKICByZXR1cm4gY2hhbmdlZAp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLmdldE9ya3V0QXZhdGFyVXJsID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkZ2V0T3JrdXRBdmF0YXJVcmwkKCkgewogIHJldHVybiB0aGlzLm9ya3V0QXZhdGFyVXJsXwp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLnNldFBvcnRyYWl0VXJsID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkc2V0UG9ydHJhaXRVcmwkKHVybCkgewogIHZhciBjaGFuZ2VkID0gdGhpcy5wb3J0cmFpdFVybF8gIT0gdXJsOwogIHRoaXMucG9ydHJhaXRVcmxfID0gdXJsOwogIGNoYW5nZWQgJiYgdGhpcy5kaXNwYXRjaFVwZGF0ZUV2ZW50XyhjaGF0Lm1vZGVsLkNvbnRhY3QuRXZlbnRUeXBlLlBPUlRSQUlUX1VSTF9VUERBVEUpOwogIHJldHVybiBjaGFuZ2VkCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuZ2V0UG9ydHJhaXRVcmwgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRnZXRQb3J0cmFpdFVybCQoKSB7CiAgcmV0dXJuIHRoaXMucG9ydHJhaXRVcmxfCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuZ2V0V2VpZ2h0ID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkZ2V0V2VpZ2h0JCgpIHsKICByZXR1cm4gdGhpcy53ZWlnaHRfCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuc2V0V2VpZ2h0ID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkc2V0V2VpZ2h0JCh3ZWlnaHQpIHsKICByZXR1cm4gdGhpcy53ZWlnaHRfICE9IHdlaWdodCA/ICh0aGlzLndlaWdodF8gPSB3ZWlnaHQsIHRoaXMuZGlzcGF0Y2hVcGRhdGVFdmVudF8oY2hhdC5tb2RlbC5Db250YWN0LkV2ZW50VHlwZS5XRUlHSFRfVVBEQVRFKSwgITApIDogITEKfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5zZXRGaWx0ZXIgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRzZXRGaWx0ZXIkKGZpbHRlcikgewogIHZhciBjaGFuZ2VkID0gdGhpcy5maWx0ZXJfICE9IGZpbHRlcjsKICB0aGlzLmZpbHRlcl8gPSBmaWx0ZXI7CiAgY2hhbmdlZCAmJiB0aGlzLmRpc3BhdGNoVXBkYXRlRXZlbnRfKGNoYXQubW9kZWwuQ29udGFjdC5FdmVudFR5cGUuRklMVEVSX1VQREFURSk7CiAgcmV0dXJuIGNoYW5nZWQKfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5nZXRGaWx0ZXIgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRnZXRGaWx0ZXIkKCkgewogIHJldHVybiB0aGlzLmZpbHRlcl8KfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5zZXROb1NhdmUgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRzZXROb1NhdmUkKG5vU2F2ZSkgewogIHZhciBjaGFuZ2VkID0gdGhpcy5ub1NhdmVfICE9IG5vU2F2ZTsKICB0aGlzLm5vU2F2ZV8gPSBub1NhdmU7CiAgY2hhbmdlZCAmJiB0aGlzLmRpc3BhdGNoVXBkYXRlRXZlbnRfKGNoYXQubW9kZWwuQ29udGFjdC5FdmVudFR5cGUuTk9TQVZFX1VQREFURSk7CiAgcmV0dXJuIGNoYW5nZWQKfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5nZXROb1NhdmUgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRnZXROb1NhdmUkKCkgewogIHJldHVybiB0aGlzLm5vU2F2ZV8KfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5zZXRTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRzZXRTdWJzY3JpcHRpb24kKHN1YnNjcmlwdGlvbikgewogIHZhciBzdWJzY3JpcHRpb24gPSBnb29nLmlzRGVmQW5kTm90TnVsbChzdWJzY3JpcHRpb24pID8gc3Vic2NyaXB0aW9uIDogcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5TdWJzY3JpcHRpb24uTk9ORSwgY2hhbmdlZCA9IHRoaXMuc3Vic2NyaXB0aW9uXyAhPSBzdWJzY3JpcHRpb247CiAgdGhpcy5zdWJzY3JpcHRpb25fID0gc3Vic2NyaXB0aW9uOwogIGNoYW5nZWQgJiYgdGhpcy5kaXNwYXRjaFVwZGF0ZUV2ZW50XyhjaGF0Lm1vZGVsLkNvbnRhY3QuRXZlbnRUeXBlLlNVQlNDUklQVElPTl9VUERBVEUpOwogIHJldHVybiBjaGFuZ2VkCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuZ2V0U3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkZ2V0U3Vic2NyaXB0aW9uJCgpIHsKICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25fCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuaXNTdWJzY3JpYmVkVG8gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRpc1N1YnNjcmliZWRUbyQoKSB7CiAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyKCkgIT0gY2hhdC5tb2RlbC5Db250YWN0LkZpbHRlci5CTE9DS0VEICYmICh0aGlzLnN1YnNjcmlwdGlvbl8gPT0gcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5TdWJzY3JpcHRpb24uVE8gfHwgdGhpcy5zdWJzY3JpcHRpb25fID09IHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUuU3Vic2NyaXB0aW9uLkJPVEgpCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuc2V0UGhvbmVOdW1iZXJzID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkc2V0UGhvbmVOdW1iZXJzJChwaG9uZU51bWJlcnMpIHsKICBmb3IodmFyIGxpc3RDaGFuZ2VkID0gdGhpcy5waG9uZU51bWJlcnNfLmxlbmd0aCAhPSBwaG9uZU51bWJlcnMubGVuZ3RoLCBpID0gMDtpIDwgcGhvbmVOdW1iZXJzLmxlbmd0aCAmJiAhbGlzdENoYW5nZWQ7aSsrKSB7CiAgICB2YXIgbmV3RW50cnkgPSBwaG9uZU51bWJlcnNbaV0sIG9sZEVudHJ5ID0gdGhpcy5waG9uZU51bWJlcnNfW2ldLCBsaXN0Q2hhbmdlZCA9IG5ld0VudHJ5LmdldE51bWJlcigpID09IG9sZEVudHJ5LmdldE51bWJlcigpID8gIW5ld0VudHJ5LmVxdWFscyhvbGRFbnRyeSkgOiAhMAogIH0KICByZXR1cm4gbGlzdENoYW5nZWQgPyAodGhpcy5waG9uZU51bWJlcnNfID0gcGhvbmVOdW1iZXJzLCB0aGlzLmRpc3BhdGNoVXBkYXRlRXZlbnRfKGNoYXQubW9kZWwuQ29udGFjdC5FdmVudFR5cGUuUEhPTkVfTlVNQkVSX1VQREFURSksICEwKSA6ICExCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuZ2V0UGhvbmVOdW1iZXJzID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkZ2V0UGhvbmVOdW1iZXJzJCgpIHsKICByZXR1cm4gdGhpcy5waG9uZU51bWJlcnNfCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuc2V0Rm9jdXNHcm91cHMgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRzZXRGb2N1c0dyb3VwcyQoZm9jdXNHcm91cHMpIHsKICBmb3IodmFyIGNoYW5nZWQgPSBudWxsID09IGZvY3VzR3JvdXBzIHx8IHRoaXMuZm9jdXNHcm91cHNfLmxlbmd0aCAhPSBmb2N1c0dyb3Vwcy5sZW5ndGgsIGkgPSAwO2kgPCBmb2N1c0dyb3Vwcy5sZW5ndGggJiYgIWNoYW5nZWQ7aSsrKSB7CiAgICBmb2N1c0dyb3Vwc1tpXSAhPSB0aGlzLmZvY3VzR3JvdXBzX1tpXSAmJiAoY2hhbmdlZCA9ICEwKQogIH0KICBjaGFuZ2VkICYmICh0aGlzLmZvY3VzR3JvdXBzXyA9IGZvY3VzR3JvdXBzLCB0aGlzLmRpc3BhdGNoVXBkYXRlRXZlbnRfKGNoYXQubW9kZWwuQ29udGFjdC5FdmVudFR5cGUuRk9DVVNfR1JPVVBTX1VQREFURSkpOwogIHJldHVybiBjaGFuZ2VkCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuc2V0Q2hhdFN0YXRlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkc2V0Q2hhdFN0YXRlJChzdGF0ZSkgewogIHZhciBjaGFuZ2VkID0gdGhpcy5jaGF0U3RhdGVfICE9IHN0YXRlOwogIHRoaXMuY2hhdFN0YXRlXyA9IHN0YXRlOwogIGNoYW5nZWQgJiYgdGhpcy5kaXNwYXRjaFVwZGF0ZUV2ZW50XyhjaGF0Lm1vZGVsLkNvbnRhY3QuRXZlbnRUeXBlLkNIQVRfU1RBVEVfVVBEQVRFKTsKICByZXR1cm4gY2hhbmdlZAp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLmdldENoYXRTdGF0ZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJGdldENoYXRTdGF0ZSQoKSB7CiAgcmV0dXJuIHRoaXMuY2hhdFN0YXRlXwp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLnNldElzQnVkZHlQb3VuY2VFbmFibGVkRnJvbVNlcnZlciA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJHNldElzQnVkZHlQb3VuY2VFbmFibGVkRnJvbVNlcnZlciQoaXNCdWRkeVBvdW5jZUVuYWJsZWQpIHsKICBpc0J1ZGR5UG91bmNlRW5hYmxlZCA9IEJvb2xlYW4oaXNCdWRkeVBvdW5jZUVuYWJsZWQpOwogIHJldHVybiB0aGlzLmlzQnVkZHlQb3VuY2VFbmFibGVkXyAhPSBpc0J1ZGR5UG91bmNlRW5hYmxlZCA/ICh0aGlzLmlzQnVkZHlQb3VuY2VFbmFibGVkXyA9IGlzQnVkZHlQb3VuY2VFbmFibGVkLCB0aGlzLmRpc3BhdGNoVXBkYXRlRXZlbnRfKGNoYXQubW9kZWwuQ29udGFjdC5FdmVudFR5cGUuQlVERFlfUE9VTkNFX1VQREFURSksICEwKSA6ICExCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuc2V0SXNSZWplY3RlZCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJHNldElzUmVqZWN0ZWQkKGlzUmVqZWN0ZWQpIHsKICBpc1JlamVjdGVkID0gQm9vbGVhbihpc1JlamVjdGVkKTsKICByZXR1cm4gdGhpcy5pc1JlamVjdGVkXyAhPSBpc1JlamVjdGVkID8gKHRoaXMuaXNSZWplY3RlZF8gPSBpc1JlamVjdGVkLCB0aGlzLmRpc3BhdGNoVXBkYXRlRXZlbnRfKGNoYXQubW9kZWwuQ29udGFjdC5FdmVudFR5cGUuUkVKRUNURURfVVBEQVRFKSwgITApIDogITEKfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5pc1JlamVjdGVkID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkaXNSZWplY3RlZCQoKSB7CiAgcmV0dXJuIHRoaXMuaXNSZWplY3RlZF8KfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5zZXRMYXN0Q2hhdFRpbWVzdGFtcCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJHNldExhc3RDaGF0VGltZXN0YW1wJChsYXN0Q2hhdFRzKSB7CiAgcmV0dXJuIHRoaXMubGFzdENoYXRUaW1lc3RhbXBfIDwgbGFzdENoYXRUcyA/ICh0aGlzLmxhc3RDaGF0VGltZXN0YW1wXyA9IGxhc3RDaGF0VHMsIHRoaXMuZGlzcGF0Y2hVcGRhdGVFdmVudF8oY2hhdC5tb2RlbC5Db250YWN0LkV2ZW50VHlwZS5MQVNUX0NIQVRfVFNfVVBEQVRFKSwgITApIDogITEKfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5sYXN0Q2hhdFRpbWVzdGFtcCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJGxhc3RDaGF0VGltZXN0YW1wJCgpIHsKICByZXR1cm4gdGhpcy5sYXN0Q2hhdFRpbWVzdGFtcF8KfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5zZXRDaGF0QmVmb3JlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdCQkc2V0Q2hhdEJlZm9yZSQoKSB7Cn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCR0b1N0cmluZyQoKSB7CiAgcmV0dXJuIHRoaXMuamlkXy50b1N0cmluZygpCn07CmNoYXQubW9kZWwuQ29udGFjdC5wcm90b3R5cGUuaXNQaG9uZU9ubHkgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0JCRpc1Bob25lT25seSQoKSB7CiAgcmV0dXJuIGFwcHMuY2hhdC5jb3JlLkppZC5Jc1Bob25lT25seUppZCh0aGlzLmppZF8udG9TdHJpbmcoKSkKfTsKY2hhdC5tb2RlbC5Db250YWN0LnByb3RvdHlwZS5kaXNwYXRjaFVwZGF0ZUV2ZW50XyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJGRpc3BhdGNoVXBkYXRlRXZlbnRfJCh0eXBlKSB7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjaGF0Lm1vZGVsLkNvbnRhY3QuQ29udGFjdEV2ZW50KHR5cGUsIHRoaXMpKQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QucHJvdG90eXBlLmhhbmRsZVZvaWNlUmF0ZXNGcm9tU2VydmVyXyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkJGhhbmRsZVZvaWNlUmF0ZXNGcm9tU2VydmVyXyQoZSkgewogIHZhciByZXNwID0gZS5nZXRKc3BiKCk7CiAgaWYocmVzcC5nZXRJZCgpID09IHRoaXMuamlkXy50b1N0cmluZygpKSB7CiAgICBmb3IodmFyIHZvaWNlUmF0ZXMgPSByZXNwLmdldFJhdGVMaXN0KCksIGlzVXBkYXRlZCA9ICExLCBwaG9uZU51bWJlcnMgPSB0aGlzLmdldFBob25lTnVtYmVycygpLCBpID0gMDtpIDwgdm9pY2VSYXRlcy5sZW5ndGg7aSsrKSB7CiAgICAgIHZhciByYXRlID0gdm9pY2VSYXRlc1tpXSwgcmVzcG9uc2VDb2RlID0gcmF0ZS5nZXRSZXNwb25zZUNvZGUoKTsKICAgICAgaWYoMCA9PSByZXNwb25zZUNvZGUpIHsKICAgICAgICBmb3IodmFyIG51bWJlciA9IHJhdGUuZ2V0T3JpZ2luYWxOdW1iZXIoKSwgZGlzcGxheVZvaWNlUmF0ZSA9IHJhdGUuZ2V0RGlzcGxheUNhbGxSYXRlKCksIGRpc3BsYXlTbXNSYXRlID0gcmF0ZS5nZXREaXNwbGF5U21zUmF0ZSgpLCBkaXNwbGF5R2NvbW1Qc3RuT3V0UmF0ZSA9IHJhdGUuZ2V0RGlzcGxheVBzdG5PdXRSYXRlKCksIHZvaWNlUmF0ZSA9IHJhdGUuZ2V0Q2FsbFJhdGUoKSwgc21zUmF0ZSA9IHJhdGUuZ2V0U21zUmF0ZSgpLCBnY29tbVBzdG5PdXRSYXRlID0gcmF0ZS5nZXRQc3RuT3V0UmF0ZSgpLCBqID0gMDtqIDwgcGhvbmVOdW1iZXJzLmxlbmd0aDtqKyspIHsKICAgICAgICAgIGlmKHBob25lTnVtYmVyc1tqXS5nZXRDYW5vbmljYWxpemVkTnVtYmVyKCkgPT0gbnVtYmVyKSB7CiAgICAgICAgICAgIGlzVXBkYXRlZCB8PSBwaG9uZU51bWJlcnNbal0uc2V0UmF0ZXMoZGlzcGxheVZvaWNlUmF0ZSwgZGlzcGxheVNtc1JhdGUsIGRpc3BsYXlHY29tbVBzdG5PdXRSYXRlLCB2b2ljZVJhdGUsIHNtc1JhdGUsIGdjb21tUHN0bk91dFJhdGUpOwogICAgICAgICAgICBicmVhawogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaXNVcGRhdGVkICYmIHRoaXMuZGlzcGF0Y2hVcGRhdGVFdmVudF8oY2hhdC5tb2RlbC5Db250YWN0LkV2ZW50VHlwZS5QSE9ORV9OVU1CRVJfUkFURV9VUERBVEUpCiAgfQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3QuZ2V0QmxhbmtDb250YWN0U3VtbWFyeSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3QkZ2V0QmxhbmtDb250YWN0U3VtbWFyeSQoKSB7CiAgcmV0dXJue2ppZDoiIiwgZW1haWw6IiIsIHNob3c6Ij8iLCBzdGF0dXM6IiIsIGhhc0F1ZGlvOiExLCBoYXNQbHVnaW46ITEsIGhhc0NhbWVyYTohMX0KfTsKY2hhdC5Nb3N0UG9wdWxhckNvbnRhY3RDb21wYXJhdG9yID0gZnVuY3Rpb24gJGNoYXQkTW9zdFBvcHVsYXJDb250YWN0Q29tcGFyYXRvciQoZXZhbHMpIHsKICB0aGlzLmV2YWxzXyA9IGV2YWxzCn07CmNoYXQuTW9zdFBvcHVsYXJDb250YWN0Q29tcGFyYXRvci5FdmFsdWF0aW9uRGVzYyA9IGZ1bmN0aW9uICRjaGF0JE1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IkRXZhbHVhdGlvbkRlc2MkKGlzQm9vbGVhbiwgd2VpZ2h0cykgewogIHRoaXMuaXNCb29sZWFuID0gaXNCb29sZWFuOwogIHRoaXMud2VpZ2h0cyA9IHdlaWdodHMKfTsKY2hhdC5Nb3N0UG9wdWxhckNvbnRhY3RDb21wYXJhdG9yLkV2YWx1YXRpb25EZXNjLkZpZWxkcyA9IHtGSUVMRF9DT05TVEFOVF9OQU1FOiIxIiwgRklFTERfUElOTkVEX05BTUU6InAiLCBGSUVMRF9ISURERU5fTkFNRToiaCIsIEZJRUxEX0JMT0NLRURfTkFNRToiYiIsIEZJRUxEX1JFSkVDVEVEX05BTUU6ImoiLCBGSUVMRF9OT1NBVkVfTkFNRToibnYiLCBGSUVMRF9TSE9XX09GRkxJTkVfTkFNRToiYW8iLCBGSUVMRF9TSE9XX0FXQVlfTkFNRToiYXciLCBGSUVMRF9TSE9XX0lETEVfTkFNRToiYWkiLCBGSUVMRF9TSE9XX0JVU1lfTkFNRToiYWIiLCBGSUVMRF9TSE9XX0FWQUlMQUJMRV9OQU1FOiJhYSIsIEZJRUxEX1NIT1dfQ0hBVF9OQU1FOiJhYyIsIEZJRUxEX1NVQlNDUklQVElPTl9OT05FX05BTUU6InNuIiwgRklFTERfU1VCU0NSSVBUSU9OX1RPX05BTUU6InN0IiwgRklFTERfU1VCU0NSSVBUSU9OX0ZST01fTkFNRToic2YiLCBGSUVMRF9TVUJTQ1JJUFRJT05fQk9USF9OQU1FOiJzYiIsIApGSUVMRF9XRUlHSFRfQ09NQklORURfTkFNRToid2IiLCBGSUVMRF9CVUREWV9QT1VOQ0VfTkFNRToiYnAiLCBGSUVMRF9QSE9ORV9PTkxZX05BTUU6InBvIiwgRklFTERfTEFTVF9DSEFUX1RTX05BTUU6ImxjdCJ9OwpjaGF0Lk1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IuRXZhbHVhdGlvbkRlc2MucHJvdG90eXBlLmV2YWx1YXRlQ29udGFjdCA9IGZ1bmN0aW9uICRjaGF0JE1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IkRXZhbHVhdGlvbkRlc2MkJGV2YWx1YXRlQ29udGFjdCQoY29udGFjdCkgewogIHZhciBmaWVsZHMgPSBjaGF0Lk1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IuRXZhbHVhdGlvbkRlc2MuRmllbGRzLCB2YWx1ZSA9IHRoaXMud2VpZ2h0cy5nZXQoZmllbGRzLkZJRUxEX0NPTlNUQU5UX05BTUUsIDApOwogIHN3aXRjaChjb250YWN0LmdldEZpbHRlcigpKSB7CiAgICBjYXNlIGNoYXQubW9kZWwuQ29udGFjdC5GaWx0ZXIuUElOTkVEOgogICAgICB2YWx1ZSArPSB0aGlzLndlaWdodHMuZ2V0KGZpZWxkcy5GSUVMRF9QSU5ORURfTkFNRSwgMCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBjaGF0Lm1vZGVsLkNvbnRhY3QuRmlsdGVyLkhJRERFTjoKICAgICAgdmFsdWUgKz0gdGhpcy53ZWlnaHRzLmdldChmaWVsZHMuRklFTERfSElEREVOX05BTUUsIDApOwogICAgICBicmVhazsKICAgIGNhc2UgY2hhdC5tb2RlbC5Db250YWN0LkZpbHRlci5CTE9DS0VEOgogICAgICB2YWx1ZSArPSB0aGlzLndlaWdodHMuZ2V0KGZpZWxkcy5GSUVMRF9CTE9DS0VEX05BTUUsIDApCiAgfQogIGNvbnRhY3QuaXNSZWplY3RlZCgpICYmICh2YWx1ZSArPSB0aGlzLndlaWdodHMuZ2V0KGZpZWxkcy5GSUVMRF9SRUpFQ1RFRF9OQU1FLCAwKSk7CiAgY29udGFjdC5nZXROb1NhdmUoKSAmJiAodmFsdWUgKz0gdGhpcy53ZWlnaHRzLmdldChmaWVsZHMuRklFTERfTk9TQVZFX05BTUUsIDApKTsKICBzd2l0Y2goY29udGFjdC5nZXRTaG93KCkpIHsKICAgIGNhc2UgZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuU2hvdy5PRkZMSU5FOgogICAgICB2YWx1ZSArPSB0aGlzLndlaWdodHMuZ2V0KGZpZWxkcy5GSUVMRF9TSE9XX09GRkxJTkVfTkFNRSwgMCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBnb29nLnRhbGsuc2hhcmVkY29uc3RhbnRzLlNoYXJlZFN0YXR1cy5TaG93LkFXQVk6CiAgICAgIHZhbHVlICs9IHRoaXMud2VpZ2h0cy5nZXQoZmllbGRzLkZJRUxEX1NIT1dfQVdBWV9OQU1FLCAwKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIGdvb2cudGFsay5zaGFyZWRjb25zdGFudHMuU2hhcmVkU3RhdHVzLlNob3cuSURMRToKICAgICAgdmFsdWUgKz0gdGhpcy53ZWlnaHRzLmdldChmaWVsZHMuRklFTERfU0hPV19JRExFX05BTUUsIDApOwogICAgICBicmVhazsKICAgIGNhc2UgZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuU2hvdy5CVVNZOgogICAgICB2YWx1ZSArPSB0aGlzLndlaWdodHMuZ2V0KGZpZWxkcy5GSUVMRF9TSE9XX0JVU1lfTkFNRSwgMCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBnb29nLnRhbGsuc2hhcmVkY29uc3RhbnRzLlNoYXJlZFN0YXR1cy5TaG93LkFWQUlMQUJMRToKICAgICAgdmFsdWUgKz0gdGhpcy53ZWlnaHRzLmdldChmaWVsZHMuRklFTERfU0hPV19BVkFJTEFCTEVfTkFNRSwgMCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBnb29nLnRhbGsuc2hhcmVkY29uc3RhbnRzLlNoYXJlZFN0YXR1cy5TaG93LkNIQVQ6CiAgICAgIHZhbHVlICs9IHRoaXMud2VpZ2h0cy5nZXQoZmllbGRzLkZJRUxEX1NIT1dfQ0hBVF9OQU1FLCAwKQogIH0KICBzd2l0Y2goY29udGFjdC5nZXRTdWJzY3JpcHRpb24oKSkgewogICAgY2FzZSBwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLlN1YnNjcmlwdGlvbi5OT05FOgogICAgICB2YWx1ZSArPSB0aGlzLndlaWdodHMuZ2V0KGZpZWxkcy5GSUVMRF9TVUJTQ1JJUFRJT05fTk9ORV9OQU1FLCAwKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUuU3Vic2NyaXB0aW9uLlRPOgogICAgICB2YWx1ZSArPSB0aGlzLndlaWdodHMuZ2V0KGZpZWxkcy5GSUVMRF9TVUJTQ1JJUFRJT05fVE9fTkFNRSwgMCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLlN1YnNjcmlwdGlvbi5GUk9NOgogICAgICB2YWx1ZSArPSB0aGlzLndlaWdodHMuZ2V0KGZpZWxkcy5GSUVMRF9TVUJTQ1JJUFRJT05fRlJPTV9OQU1FLCAwKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUuU3Vic2NyaXB0aW9uLkJPVEg6CiAgICAgIHZhbHVlICs9IHRoaXMud2VpZ2h0cy5nZXQoZmllbGRzLkZJRUxEX1NVQlNDUklQVElPTl9CT1RIX05BTUUsIDApCiAgfQogIHZhbHVlICs9IGNvbnRhY3QuZ2V0V2VpZ2h0KCkgKiB0aGlzLndlaWdodHMuZ2V0KGZpZWxkcy5GSUVMRF9XRUlHSFRfQ09NQklORURfTkFNRSwgMCk7CiAgdmFsdWUgKz0gY29udGFjdC5sYXN0Q2hhdFRpbWVzdGFtcCgpICogdGhpcy53ZWlnaHRzLmdldChmaWVsZHMuRklFTERfTEFTVF9DSEFUX1RTX05BTUUsIDApOwogIGNvbnRhY3QuaXNQaG9uZU9ubHkoKSAmJiAodmFsdWUgKz0gdGhpcy53ZWlnaHRzLmdldChmaWVsZHMuRklFTERfUEhPTkVfT05MWV9OQU1FLCAwKSk7CiAgcmV0dXJuIHRoaXMuaXNCb29sZWFuID8gMCA8IHZhbHVlID8gMSA6IDAgOiB2YWx1ZQp9OwpjaGF0Lk1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IucGFyc2VDb21wYXJhdG9yU3BlYyA9IGZ1bmN0aW9uICRjaGF0JE1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IkcGFyc2VDb21wYXJhdG9yU3BlYyQoc3BlY1N0cmluZykgewogIGZvcih2YXIgZXZhbFN0cmluZ3MgPSBzcGVjU3RyaW5nLnNwbGl0KCIgIiksIGV2YWxzID0gW10sIGkgPSAwO2kgPCBldmFsU3RyaW5ncy5sZW5ndGg7KytpKSB7CiAgICBpZihnb29nLmlzRGVmQW5kTm90TnVsbChldmFsU3RyaW5nc1tpXSkgJiYgIiIgIT0gZXZhbFN0cmluZ3NbaV0pIHsKICAgICAgdmFyIGlzQm9vbGVhbiwgZXZhbFN0cmluZyA9IGV2YWxTdHJpbmdzW2ldLCBzdGFydCA9IDAsIGVuZCA9IGV2YWxTdHJpbmcubGVuZ3RoIC0gMTsKICAgICAgaWYoIlsiID09IGV2YWxTdHJpbmcuY2hhckF0KHN0YXJ0KSAmJiAiXSIgPT0gZXZhbFN0cmluZy5jaGFyQXQoZW5kKSkgewogICAgICAgIGlzQm9vbGVhbiA9ICEwCiAgICAgIH1lbHNlIHsKICAgICAgICBpZigieyIgPT0gZXZhbFN0cmluZy5jaGFyQXQoc3RhcnQpICYmICJ9IiA9PSBldmFsU3RyaW5nLmNoYXJBdChlbmQpKSB7CiAgICAgICAgICBpc0Jvb2xlYW4gPSAhMQogICAgICAgIH1lbHNlIHsKICAgICAgICAgIHRocm93IEVycm9yKCJldmFsdWF0aW9ucyBtdXN0IHN0YXJ0IHdpdGggJ1snIG9yICd7JywgZW5kIHdpdGggJ10nIG9yICd9JywgYnV0IG5vdyBpdCdzICIgKyBldmFsU3RyaW5nLmNoYXJBdChzdGFydCkgKyAiIGFuZCAiICsgZXZhbFN0cmluZy5jaGFyQXQoZW5kKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvcih2YXIgYXNzaWdubWVudHMgPSBldmFsU3RyaW5nLnNsaWNlKHN0YXJ0ICsgMSwgZW5kKS5zcGxpdCgiLCIpLCB3ZWlnaHRzID0gbmV3IGdvb2cuc3RydWN0cy5NYXAsIGogPSAwO2ogPCBhc3NpZ25tZW50cy5sZW5ndGg7KytqKSB7CiAgICAgICAgdmFyIHBhcnRzID0gYXNzaWdubWVudHNbal0uc3BsaXQoIjoiKTsKICAgICAgICBpZigyICE9IHBhcnRzLmxlbmd0aCkgewogICAgICAgICAgdGhyb3cgRXJyb3IoIm1pc3NpbmcgJzonIGJldHdlZW4gbmFtZSBhbmQgdmFsdWUuIik7CiAgICAgICAgfQogICAgICAgIHZhciBpc1ZhbGlkID0gITEsIGtleTsKICAgICAgICBmb3Ioa2V5IGluIGNoYXQuTW9zdFBvcHVsYXJDb250YWN0Q29tcGFyYXRvci5FdmFsdWF0aW9uRGVzYy5GaWVsZHMpIHsKICAgICAgICAgIGNoYXQuTW9zdFBvcHVsYXJDb250YWN0Q29tcGFyYXRvci5FdmFsdWF0aW9uRGVzYy5GaWVsZHNba2V5XSA9PSBwYXJ0c1swXSAmJiAoaXNWYWxpZCA9ICEwKQogICAgICAgIH0KICAgICAgICBpZighaXNWYWxpZCkgewogICAgICAgICAgdGhyb3cgRXJyb3IoIkludmFpZCBldmFsdWF0aW9uIGZpZWxkOiAiICsgcGFydHNbMF0pOwogICAgICAgIH0KICAgICAgICB2YXIgd2VpZ2h0ID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTsKICAgICAgICBpZihpc05hTih3ZWlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigiSW52YWlkIGV2YWx1YXRpb24gd2VpZ2h0OiAiICsgcGFydHNbMV0pOwogICAgICAgIH0KICAgICAgICB3ZWlnaHRzLnNldChwYXJ0c1swXSwgd2VpZ2h0KQogICAgICB9CiAgICAgIDAgPCB3ZWlnaHRzLmdldENvdW50KCkgJiYgZXZhbHMucHVzaChuZXcgY2hhdC5Nb3N0UG9wdWxhckNvbnRhY3RDb21wYXJhdG9yLkV2YWx1YXRpb25EZXNjKGlzQm9vbGVhbiwgd2VpZ2h0cykpCiAgICB9CiAgfQogIHJldHVybiBuZXcgY2hhdC5Nb3N0UG9wdWxhckNvbnRhY3RDb21wYXJhdG9yKGV2YWxzKQp9OwpjaGF0Lk1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAkY2hhdCRNb3N0UG9wdWxhckNvbnRhY3RDb21wYXJhdG9yJCRjb21wYXJlJChjb250YWN0MSwgY29udGFjdDIpIHsKICBpZihjb250YWN0MSA9PSBjb250YWN0MikgewogICAgcmV0dXJuIDAKICB9CiAgZm9yKHZhciBpID0gMDtpIDwgdGhpcy5ldmFsc18ubGVuZ3RoOysraSkgewogICAgdmFyIGUxID0gdGhpcy5ldmFsc19baV0uZXZhbHVhdGVDb250YWN0KGNvbnRhY3QxKSwgZTIgPSB0aGlzLmV2YWxzX1tpXS5ldmFsdWF0ZUNvbnRhY3QoY29udGFjdDIpOwogICAgaWYoZTEgPiBlMikgewogICAgICByZXR1cm4tMQogICAgfQogICAgaWYoZTEgPCBlMikgewogICAgICByZXR1cm4gMQogICAgfQogIH0KICB2YXIgbmFtZTEgPSBjb250YWN0MS5nZXRGdWxsTmFtZSgpLCBuYW1lMiA9IGNvbnRhY3QyLmdldEZ1bGxOYW1lKCk7CiAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwobmFtZTEpICYmIGdvb2cuaXNEZWZBbmROb3ROdWxsKG5hbWUyKSkgewogICAgdmFyIGUgPSB0aGlzLmNvbXBhcmVTdHJfKGNvbnRhY3QxLmdldEZ1bGxOYW1lKCkudG9Mb3dlckNhc2UoKSwgY29udGFjdDIuZ2V0RnVsbE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKICAgIGlmKDAgIT0gZSkgewogICAgICByZXR1cm4gZQogICAgfQogIH0KICByZXR1cm4gdGhpcy5jb21wYXJlU3RyXyhjb250YWN0MS5nZXRKaWQoKS50b1N0cmluZygpLCBjb250YWN0Mi5nZXRKaWQoKS50b1N0cmluZygpKQp9OwpjaGF0Lk1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IucHJvdG90eXBlLmlzQWxsb3dlZCA9IGZ1bmN0aW9uICRjaGF0JE1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IkJGlzQWxsb3dlZCQoY29udGFjdCkgewogIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuZXZhbHNfLmxlbmd0aDsrK2kpIHsKICAgIGlmKDAgPj0gdGhpcy5ldmFsc19baV0uZXZhbHVhdGVDb250YWN0KGNvbnRhY3QpKSB7CiAgICAgIHJldHVybiExCiAgICB9CiAgfQogIHJldHVybiEwCn07CmNoYXQuTW9zdFBvcHVsYXJDb250YWN0Q29tcGFyYXRvci5wcm90b3R5cGUuY29tcGFyZVN0cl8gPSBmdW5jdGlvbiAkY2hhdCRNb3N0UG9wdWxhckNvbnRhY3RDb21wYXJhdG9yJCRjb21wYXJlU3RyXyQoc3RyMSwgc3RyMikgewogIHJldHVybiBzdHIxID09IHN0cjIgPyAwIDogc3RyMSA+IHN0cjIgPyAxIDogLTEKfTsKY2hhdC5RdWlja0xpc3RHZW5lcmF0b3IgPSBmdW5jdGlvbiAkY2hhdCRRdWlja0xpc3RHZW5lcmF0b3IkKCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5jb250YWN0c1VwZGF0aW5nXyA9ICExCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5RdWlja0xpc3RHZW5lcmF0b3IsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKY2hhdC5RdWlja0xpc3RHZW5lcmF0b3IuRXZlbnRUeXBlID0ge0NIQU5HRTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgicXVpY2tsaXN0X2NoYW5nZWQiKX07CmNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkID0gZnVuY3Rpb24gJGNoYXQkUXVpY2tMaXN0R2VuZXJhdG9yT2xkJChhcHBDb250ZXh0KSB7CiAgY2hhdC5RdWlja0xpc3RHZW5lcmF0b3IuY2FsbCh0aGlzKTsKICB0aGlzLnF1aWNrQ29udGFjdHNfID0gW107CiAgdGhpcy5jb25maWdfID0gY2hhdC5jbGllbnQuUmVhZE9ubHlDb25maWcuZ2V0KGFwcENvbnRleHQpOwogIHRoaXMucXVpY2tDb250YWN0c1NpemVfID0gKHRoaXMuaXNGaXhlZFF1aWNrbGlzdFNpemVfID0gMCA8PSB0aGlzLmNvbmZpZ18uZml4ZWRRdWlja2xpc3RTaXplKSA/IHRoaXMuY29uZmlnXy5maXhlZFF1aWNrbGlzdFNpemUgOiBjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5TSVpFX0RFRkFVTFQ7CiAgdGhpcy5taW5SZXFDb21wYXJhdG9yXyA9IGNoYXQuTW9zdFBvcHVsYXJDb250YWN0Q29tcGFyYXRvci5wYXJzZUNvbXBhcmF0b3JTcGVjKHRoaXMuY29uZmlnXy5nZXRTdXBlcm1vbGUoKS5nZXRRdWlja2xpc3RNaW5SZXF1aXJlbWVudHMoKSk7CiAgdGhpcy5tb3N0UG9wdWxhckNvbXBhcmF0b3JfID0gY2hhdC5Nb3N0UG9wdWxhckNvbnRhY3RDb21wYXJhdG9yLnBhcnNlQ29tcGFyYXRvclNwZWModGhpcy5jb25maWdfLmdldFN1cGVybW9sZSgpLmdldFF1aWNrbGlzdFNvcnRTcGVjKCkpOwogIHRoaXMuYWxwaGFiZXRpY2FsQ29tcGFyYXRvcl8gPSBjaGF0Lk1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IucGFyc2VDb21wYXJhdG9yU3BlYyhjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5BTFBIQUJFVElDQUxfU09SVF9TUEVDKTsKICB0aGlzLnNvcnRDb21wYXJhdG9yXyA9IHRoaXMubW9zdFBvcHVsYXJDb21wYXJhdG9yXzsKICB0aGlzLmJ1Y2tldENvbXBhcmF0b3JzXyA9IFtdOwogIHRoaXMuY29udGFjdFVwZGF0ZVRpbWVySWRfID0gbnVsbDsKICBmb3IodmFyIGJ1Y2tldFNwZWNzID0gdGhpcy5jb25maWdfLmdldFN1cGVybW9sZSgpLmdldFF1aWNrbGlzdEJ1Y2tldENvbXBTcGVjKCkuc3BsaXQoIlxuIiksIGkgPSAwO2kgPCBidWNrZXRTcGVjcy5sZW5ndGg7KytpKSB7CiAgICB0aGlzLmJ1Y2tldENvbXBhcmF0b3JzXy5wdXNoKGNoYXQuTW9zdFBvcHVsYXJDb250YWN0Q29tcGFyYXRvci5wYXJzZUNvbXBhcmF0b3JTcGVjKHRoaXMuY29uZmlnXy5nZXRTdXBlcm1vbGUoKS5nZXRRdWlja2xpc3RNaW5SZXF1aXJlbWVudHMoKSArICIgIiArIGJ1Y2tldFNwZWNzW2ldKSkKICB9CiAgdGhpcy5idWNrZXRDb21wYXJhdG9yc18ucHVzaChjaGF0Lk1vc3RQb3B1bGFyQ29udGFjdENvbXBhcmF0b3IucGFyc2VDb21wYXJhdG9yU3BlYygiIikpOwogIHRoaXMuaXNRdWlja0xpc3REaXJ0eV8gPSAhMTsKICB0aGlzLmNyZWF0ZUJ1Y2tldHNfKCkKfTsKZ29vZy5pbmhlcml0cyhjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZCwgY2hhdC5RdWlja0xpc3RHZW5lcmF0b3IpOwpjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5TSVpFX0RFRkFVTFQgPSAxMDsKY2hhdC5RdWlja0xpc3RHZW5lcmF0b3JPbGQuU0laRV9NQVggPSAyNTA7CmNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkLlVQREFURV9RVUlDS19DT05UQUNUX0RFTEFZID0gNTAwOwpjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5BTFBIQUJFVElDQUxfU09SVF9TUEVDID0gInthYzo1LGFhOjQsYWI6MyxhaToyLGF3OjEsYW86MH0iOwpjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5Tb3J0QWxnb3JpdGhtID0ge01PU1RfUE9QVUxBUjoiTU9TVF9QT1BVTEFSIiwgQUxQSEFCRVRJQ0FMOiJBTFBIQUJFVElDQUwifTsKY2hhdC5RdWlja0xpc3RHZW5lcmF0b3JPbGQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRjaGF0JFF1aWNrTGlzdEdlbmVyYXRvck9sZCQkZGlzcG9zZUludGVybmFsJCgpIHsKICBjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICBnb29nLlRpbWVyLmNsZWFyKHRoaXMuY29udGFjdFVwZGF0ZVRpbWVySWRfKTsKICB0aGlzLmNvbnRhY3RVcGRhdGVUaW1lcklkXyA9IG51bGwKfTsKY2hhdC5RdWlja0xpc3RHZW5lcmF0b3JPbGQucHJvdG90eXBlLnVwZGF0ZVF1aWNrQ29udGFjdHNBc3luYyA9IGZ1bmN0aW9uICRjaGF0JFF1aWNrTGlzdEdlbmVyYXRvck9sZCQkdXBkYXRlUXVpY2tDb250YWN0c0FzeW5jJCgpIHsKICBnb29nLmlzTnVsbCh0aGlzLmNvbnRhY3RVcGRhdGVUaW1lcklkXykgJiYgKHRoaXMuY29udGFjdFVwZGF0ZVRpbWVySWRfID0gZ29vZy5UaW1lci5jYWxsT25jZSh0aGlzLnVwZGF0ZVF1aWNrQ29udGFjdHMsIGNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkLlVQREFURV9RVUlDS19DT05UQUNUX0RFTEFZLCB0aGlzKSkKfTsKY2hhdC5RdWlja0xpc3RHZW5lcmF0b3JPbGQucHJvdG90eXBlLnVwZGF0ZVF1aWNrQ29udGFjdHMgPSBmdW5jdGlvbiAkY2hhdCRRdWlja0xpc3RHZW5lcmF0b3JPbGQkJHVwZGF0ZVF1aWNrQ29udGFjdHMkKCkgewogIGdvb2cuVGltZXIuY2xlYXIodGhpcy5jb250YWN0VXBkYXRlVGltZXJJZF8pOwogIHRoaXMuY29udGFjdFVwZGF0ZVRpbWVySWRfID0gbnVsbDsKICBpZih0aGlzLmlzUXVpY2tMaXN0RGlydHlfKSB7CiAgICBmb3IodmFyIHFDb250YWN0cyA9IFtdLCBpID0gMDtpIDwgdGhpcy5idWNrZXRzXy5sZW5ndGggLSAxOysraSkgewogICAgICB2YXIgc2l6ZUxpbWl0ID0gdGhpcy5idWNrZXRTaXplc19baV0sIGNvdW50ID0gMCwgdGhpc09iaiA9IHRoaXM7CiAgICAgIHRoaXMuYnVja2V0c19baV0uaW5PcmRlclRyYXZlcnNlKGZ1bmN0aW9uKGMpIHsKICAgICAgICArK2NvdW50OwogICAgICAgIHJldHVybiBjb3VudCA8PSBzaXplTGltaXQgJiYgdGhpc09iai5pc0FsbG93ZWRRdWlja0NvbnRhY3RfKGMpICYmIGdvb2cuaXNEZWZBbmROb3ROdWxsKGMuZ2V0U2hvcnRJZCgpKSA/IChxQ29udGFjdHMucHVzaChjKSwgITEpIDogITAKICAgICAgfSkKICAgIH0KICAgIHRoaXMuaXNRdWlja0xpc3REaXJ0eV8gPSAhMTsKICAgIHZhciBzb3J0ZWRRQ29udGFjdHMgPSBxQ29udGFjdHMuc29ydChnb29nLmJpbmQodGhpcy5zb3J0Q29tcGFyYXRvcl8uY29tcGFyZSwgdGhpcy5zb3J0Q29tcGFyYXRvcl8pKTsKICAgIGdvb2cuYXJyYXkuZXF1YWxzKHRoaXMucXVpY2tDb250YWN0c18sIHNvcnRlZFFDb250YWN0cykgfHwgKHRoaXMucXVpY2tDb250YWN0c18gPSBzb3J0ZWRRQ29udGFjdHMsIHRoaXMuZGlzcGF0Y2hFdmVudChjaGF0LlF1aWNrTGlzdEdlbmVyYXRvci5FdmVudFR5cGUuQ0hBTkdFKSkKICB9CiAgcmV0dXJuIHRoaXMucXVpY2tDb250YWN0c18KfTsKY2hhdC5RdWlja0xpc3RHZW5lcmF0b3JPbGQucHJvdG90eXBlLmdldFF1aWNrTGlzdCA9IGZ1bmN0aW9uICRjaGF0JFF1aWNrTGlzdEdlbmVyYXRvck9sZCQkZ2V0UXVpY2tMaXN0JCgpIHsKICBmb3IodmFyIHF1aWNrQ29udGFjdHMgPSB0aGlzLnVwZGF0ZVF1aWNrQ29udGFjdHMoKSwgcXVpY2tMaXN0ID0gW10sIGkgPSAwO2kgPCBxdWlja0NvbnRhY3RzLmxlbmd0aDsrK2kpIHsKICAgIHF1aWNrTGlzdC5wdXNoKHF1aWNrQ29udGFjdHNbaV0uZ2V0U2hvcnRJZCgpKQogIH0KICByZXR1cm4gcXVpY2tMaXN0Cn07CmNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkLnByb3RvdHlwZS5zZXRRdWlja0NvbnRhY3RzU2l6ZSA9IGZ1bmN0aW9uICRjaGF0JFF1aWNrTGlzdEdlbmVyYXRvck9sZCQkc2V0UXVpY2tDb250YWN0c1NpemUkKHNpemUsIGNvbnRhY3RzKSB7CiAgaWYoISh0aGlzLmlzRml4ZWRRdWlja2xpc3RTaXplXyB8fCB0aGlzLnF1aWNrQ29udGFjdHNTaXplXyA9PSBzaXplKSkgewogICAgaWYoMCA+IHNpemUpIHsKICAgICAgdGhyb3cgRXJyb3IoIm5lZ2F0aXZlIHF1aWNrIGxpc3Qgc2l6ZSIpOwogICAgfQogICAgc2l6ZSA+IGNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkLlNJWkVfTUFYICYmIChzaXplID0gY2hhdC5RdWlja0xpc3RHZW5lcmF0b3JPbGQuU0laRV9NQVgpOwogICAgdGhpcy5pc1F1aWNrTGlzdERpcnR5XyA9ICEwOwogICAgdGhpcy5xdWlja0NvbnRhY3RzU2l6ZV8gPSBzaXplOwogICAgdGhpcy5jcmVhdGVCdWNrZXRzXygpOwogICAgdmFyIGNvbnRhY3RzQXJyYXkgPSBbXSwgamlkOwogICAgZm9yKGppZCBpbiBjb250YWN0cykgewogICAgICBjb250YWN0c0FycmF5LnB1c2goY29udGFjdHNbamlkXSkKICAgIH0KICAgIHRoaXMuc2FmZUFkZGluZ0NvbnRhY3RzXyhjb250YWN0c0FycmF5KQogIH0KfTsKY2hhdC5RdWlja0xpc3RHZW5lcmF0b3JPbGQucHJvdG90eXBlLnNhZmVBZGRpbmdDb250YWN0c18gPSBmdW5jdGlvbiAkY2hhdCRRdWlja0xpc3RHZW5lcmF0b3JPbGQkJHNhZmVBZGRpbmdDb250YWN0c18kKGNvbnRhY3RzLCBvcHRfaW5kZXgpIHsKICBmb3IodmFyIGkgPSBvcHRfaW5kZXggPyBvcHRfaW5kZXggOiAwLCBjYXBhY2l0eSA9IDI1O2kgPCBjb250YWN0cy5sZW5ndGg7KytpKSB7CiAgICBpZih0aGlzLmFkZENvbnRhY3RJbkJ1Y2tldHNfKGNvbnRhY3RzW2ldKSwgMCA9PSAoaSArIDEpICUgY2FwYWNpdHkgJiYgaSArIDEgPCBjb250YWN0cy5sZW5ndGgpIHsKICAgICAgZ29vZy5UaW1lci5jYWxsT25jZShnb29nLmJpbmQodGhpcy5zYWZlQWRkaW5nQ29udGFjdHNfLCB0aGlzLCBjb250YWN0cywgaSArIDEpLCAxKTsKICAgICAgcmV0dXJuCiAgICB9CiAgfQogIHRoaXMudXBkYXRlUXVpY2tDb250YWN0cygpCn07CmNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkLnByb3RvdHlwZS51cGRhdGVTb3J0QWxnb3JpdGhtID0gZnVuY3Rpb24gJGNoYXQkUXVpY2tMaXN0R2VuZXJhdG9yT2xkJCR1cGRhdGVTb3J0QWxnb3JpdGhtJChzb3J0T3B0aW9uKSB7CiAgaWYoc29ydE9wdGlvbiA9PSBjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5Tb3J0QWxnb3JpdGhtLk1PU1RfUE9QVUxBUiB8fCBzb3J0T3B0aW9uID09IGNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkLlNvcnRBbGdvcml0aG0uQUxQSEFCRVRJQ0FMKSB7CiAgICB0aGlzLnNvcnRDb21wYXJhdG9yXyA9IHNvcnRPcHRpb24gPT0gY2hhdC5RdWlja0xpc3RHZW5lcmF0b3JPbGQuU29ydEFsZ29yaXRobS5NT1NUX1BPUFVMQVIgPyB0aGlzLm1vc3RQb3B1bGFyQ29tcGFyYXRvcl8gOiB0aGlzLmFscGhhYmV0aWNhbENvbXBhcmF0b3JfLCB0aGlzLmlzUXVpY2tMaXN0RGlydHlfID0gITAsIHRoaXMudXBkYXRlUXVpY2tDb250YWN0cygpCiAgfQp9OwpjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5wcm90b3R5cGUuY29tcHV0ZVNpemVzXyA9IGZ1bmN0aW9uICRjaGF0JFF1aWNrTGlzdEdlbmVyYXRvck9sZCQkY29tcHV0ZVNpemVzXyQoc3BlYywgbikgewogIGZvcih2YXIgcGFydHMgPSBzcGVjLnNwbGl0KCIsIiksIHNpemVzID0gW10sIHRvdGFsID0gMCwgcmVzdCA9IC0xLCBpID0gMDtpIDwgcGFydHMubGVuZ3RoOysraSkgewogICAgaWYoIioiID09IHBhcnRzW2ldKSB7CiAgICAgIGlmKC0xICE9IHJlc3QpIHsKICAgICAgICB0aHJvdyBFcnJvcigibXVsdGlwbGUgJyonIGNvbXBvbmVudHMgZm91bmQgaW4gc3BlYzogIiArIHNwZWMpOwogICAgICB9CiAgICAgIHJlc3QgPSBpOwogICAgICBzaXplcy5wdXNoKDApCiAgICB9ZWxzZSB7CiAgICAgIHZhciB2YWxzID0gcGFydHNbaV0uc3BsaXQoIi8iKTsKICAgICAgaWYoMyAhPSB2YWxzLmxlbmd0aCkgewogICAgICAgIHRocm93IEVycm9yKCJjb21wb25lbnQgc3BlY3MgbXVzdCBiZSAnKicgb3Igb2YgdGhlIGZvcm0gYS9iL2M6ICIgKyBwYXJ0c1tpXSk7CiAgICAgIH0KICAgICAgc2l6ZXMucHVzaChNYXRoLm1heCh0aGlzLnBhcnNlSW50Xyh2YWxzWzBdKSwgTWF0aC5mbG9vcihuICogdGhpcy5wYXJzZUludF8odmFsc1sxXSkgLyB0aGlzLnBhcnNlSW50Xyh2YWxzWzJdKSkpKTsKICAgICAgdG90YWwgKz0gc2l6ZXNbaV0KICAgIH0KICB9CiAgaWYoLTEgPT0gcmVzdCkgewogICAgdGhyb3cgRXJyb3IoIm5vICcqJyBjb21wb25lbnQgZm91bmQgaW4gc3BlYzogIiArIHNwZWMpOwogIH0KICBpZih0b3RhbCA+IG4pIHsKICAgIHRocm93IEVycm9yKCJ0b3RhbCBjb21wb25lbnQgc2l6ZXMgYWRkcyB0byBtb3JlIHRoYW4gMTAwJSIpOwogIH0KICBzaXplc1tyZXN0XSA9IG4gLSB0b3RhbDsKICBzaXplcy5wdXNoKE51bWJlci5NQVhfVkFMVUUpOwogIHJldHVybiBzaXplcwp9OwpjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5wcm90b3R5cGUucGFyc2VJbnRfID0gZnVuY3Rpb24gJGNoYXQkUXVpY2tMaXN0R2VuZXJhdG9yT2xkJCRwYXJzZUludF8kKG51bVN0cikgewogIHZhciBudW0gPSBwYXJzZUludChudW1TdHIsIDEwKTsKICBpZihpc05hTihudW0pKSB7CiAgICB0aHJvdyBFcnJvcigiTm90IGEgbnVtYmVyOiAiICsgbnVtU3RyKTsKICB9CiAgcmV0dXJuIG51bQp9OwpjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5wcm90b3R5cGUuY3JlYXRlQnVja2V0c18gPSBmdW5jdGlvbiAkY2hhdCRRdWlja0xpc3RHZW5lcmF0b3JPbGQkJGNyZWF0ZUJ1Y2tldHNfJCgpIHsKICB0aGlzLmJ1Y2tldFNpemVzXyA9IHRoaXMuY29tcHV0ZVNpemVzXyh0aGlzLmNvbmZpZ18uZ2V0U3VwZXJtb2xlKCkuZ2V0UXVpY2tsaXN0QnVja2V0U2l6ZVNwZWMoKSwgdGhpcy5xdWlja0NvbnRhY3RzU2l6ZV8pOwogIHRoaXMuYnVja2V0c18gPSBbXTsKICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLmJ1Y2tldFNpemVzXy5sZW5ndGg7KytpKSB7CiAgICB0aGlzLmJ1Y2tldHNfLnB1c2gobmV3IGdvb2cuc3RydWN0cy5BdmxUcmVlKGdvb2cuYmluZCh0aGlzLmJ1Y2tldENvbXBhcmF0b3JzX1tpXS5jb21wYXJlLCB0aGlzLmJ1Y2tldENvbXBhcmF0b3JzX1tpXSkpKQogIH0KfTsKY2hhdC5RdWlja0xpc3RHZW5lcmF0b3JPbGQucHJvdG90eXBlLmFkZENvbnRhY3RJbkJ1Y2tldHNfID0gZnVuY3Rpb24gJGNoYXQkUXVpY2tMaXN0R2VuZXJhdG9yT2xkJCRhZGRDb250YWN0SW5CdWNrZXRzXyQoY29udGFjdCkgewogIHRoaXMuaXNRdWlja0xpc3REaXJ0eV8gPSAhMDsKICBmb3IodmFyIGkgPSAwOyEodGhpcy5idWNrZXRzX1tpXS5hZGQoY29udGFjdCksIHRoaXMuYnVja2V0c19baV0uZ2V0Q291bnQoKSA8PSB0aGlzLmJ1Y2tldFNpemVzX1tpXSk7KytpKSB7CiAgICB0aGlzLmluQnVja2V0UXVpY2tMaXN0XyhpLCBjb250YWN0KSAmJiAoY29udGFjdCA9IHRoaXMuZmlyc3ROb3RJblF1aWNrTGlzdF8oaSkpCiAgfQp9OwpjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5wcm90b3R5cGUucmVtb3ZlQ29udGFjdEZyb21CdWNrZXRzXyA9IGZ1bmN0aW9uICRjaGF0JFF1aWNrTGlzdEdlbmVyYXRvck9sZCQkcmVtb3ZlQ29udGFjdEZyb21CdWNrZXRzXyQoY29udGFjdCkgewogIHRoaXMuaXNRdWlja0xpc3REaXJ0eV8gPSAhMDsKICBmb3IodmFyIGkgPSAwOzsrK2kpIHsKICAgIGlmKHRoaXMuYnVja2V0c19baV0uZ2V0Q291bnQoKSA8PSB0aGlzLmJ1Y2tldFNpemVzX1tpXSkgewogICAgICB0aGlzLmJ1Y2tldHNfW2ldLnJlbW92ZShjb250YWN0KTsKICAgICAgYnJlYWsKICAgIH1lbHNlIHsKICAgICAgaWYodGhpcy5pbkJ1Y2tldFF1aWNrTGlzdF8oaSwgY29udGFjdCkpIHsKICAgICAgICB2YXIgbmV3Q29udGFjdCA9IHRoaXMuZmlyc3ROb3RJblF1aWNrTGlzdF8oaSk7CiAgICAgICAgdGhpcy5idWNrZXRzX1tpXS5yZW1vdmUoY29udGFjdCk7CiAgICAgICAgY29udGFjdCA9IG5ld0NvbnRhY3QKICAgICAgfWVsc2UgewogICAgICAgIHRoaXMuYnVja2V0c19baV0ucmVtb3ZlKGNvbnRhY3QpCiAgICAgIH0KICAgIH0KICB9Cn07CmNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkLnByb3RvdHlwZS5pbkJ1Y2tldFF1aWNrTGlzdF8gPSBmdW5jdGlvbiAkY2hhdCRRdWlja0xpc3RHZW5lcmF0b3JPbGQkJGluQnVja2V0UXVpY2tMaXN0XyQoaW5kZXgsIGNvbnRhY3QpIHsKICB2YXIgaW5RdWlja0xpc3QgPSAhMSwgcUxpc3RTaXplID0gdGhpcy5idWNrZXRTaXplc19baW5kZXhdLCBudW0gPSAwOwogIHRoaXMuYnVja2V0c19baW5kZXhdLmluT3JkZXJUcmF2ZXJzZShmdW5jdGlvbihjKSB7CiAgICBpZihudW0gPCBxTGlzdFNpemUgJiYgY29udGFjdCA9PSBjKSB7CiAgICAgIHJldHVybiBpblF1aWNrTGlzdCA9ICEwCiAgICB9CiAgICArK251bTsKICAgIHJldHVybiExCiAgfSk7CiAgcmV0dXJuIGluUXVpY2tMaXN0Cn07CmNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkLnByb3RvdHlwZS5maXJzdE5vdEluUXVpY2tMaXN0XyA9IGZ1bmN0aW9uICRjaGF0JFF1aWNrTGlzdEdlbmVyYXRvck9sZCQkZmlyc3ROb3RJblF1aWNrTGlzdF8kKGluZGV4KSB7CiAgdmFyIGZpcnN0Tm90SW4gPSBudWxsLCBxTGlzdFNpemUgPSB0aGlzLmJ1Y2tldFNpemVzX1tpbmRleF0sIG51bSA9IDA7CiAgdGhpcy5idWNrZXRzX1tpbmRleF0uaW5PcmRlclRyYXZlcnNlKGZ1bmN0aW9uKGMpIHsKICAgIGlmKG51bSA9PSBxTGlzdFNpemUpIHsKICAgICAgcmV0dXJuIGZpcnN0Tm90SW4gPSBjLCAhMAogICAgfQogICAgKytudW07CiAgICByZXR1cm4hMQogIH0pOwogIHJldHVybiBmaXJzdE5vdEluCn07CmNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkLnByb3RvdHlwZS5pc0FsbG93ZWRRdWlja0NvbnRhY3RfID0gZnVuY3Rpb24gJGNoYXQkUXVpY2tMaXN0R2VuZXJhdG9yT2xkJCRpc0FsbG93ZWRRdWlja0NvbnRhY3RfJChjKSB7CiAgcmV0dXJuIHRoaXMubWluUmVxQ29tcGFyYXRvcl8uaXNBbGxvd2VkKGMpCn07CmNoYXQuUXVpY2tMaXN0R2VuZXJhdG9yT2xkLnByb3RvdHlwZS5zdGFydENvbnRhY3RVcGRhdGUgPSBmdW5jdGlvbiAkY2hhdCRRdWlja0xpc3RHZW5lcmF0b3JPbGQkJHN0YXJ0Q29udGFjdFVwZGF0ZSQoY29udGFjdCkgewogIGdvb2cuaXNEZWZBbmROb3ROdWxsKGNvbnRhY3QpICYmIHRoaXMucmVtb3ZlQ29udGFjdEZyb21CdWNrZXRzXyhjb250YWN0KQp9OwpjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZC5wcm90b3R5cGUuZW5kQ29udGFjdFVwZGF0ZSA9IGZ1bmN0aW9uICRjaGF0JFF1aWNrTGlzdEdlbmVyYXRvck9sZCQkZW5kQ29udGFjdFVwZGF0ZSQoY29udGFjdCwgb3B0X3VwZGF0ZVF1aWNrQ29udGFjdHMpIHsKICBnb29nLmlzRGVmQW5kTm90TnVsbChjb250YWN0KSAmJiAodGhpcy5hZGRDb250YWN0SW5CdWNrZXRzXyhjb250YWN0KSwgIXRoaXMuY29udGFjdHNVcGRhdGluZ18gJiYgb3B0X3VwZGF0ZVF1aWNrQ29udGFjdHMgJiYgdGhpcy51cGRhdGVRdWlja0NvbnRhY3RzQXN5bmMoKSkKfTsKY2hhdC5RdWlja0xpc3RHZW5lcmF0b3JPbGQucHJvdG90eXBlLnJlbW92ZUNvbnRhY3QgPSBmdW5jdGlvbiAkY2hhdCRRdWlja0xpc3RHZW5lcmF0b3JPbGQkJHJlbW92ZUNvbnRhY3QkKGNvbnRhY3QpIHsKICBnb29nLmlzRGVmQW5kTm90TnVsbChjb250YWN0KSAmJiAodGhpcy5yZW1vdmVDb250YWN0RnJvbUJ1Y2tldHNfKGNvbnRhY3QpLCB0aGlzLnVwZGF0ZVF1aWNrQ29udGFjdHMoKSkKfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2hhdFN0YXRlVXBkYXRlJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbImNzIl0KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuQ2hhdFN0YXRlVXBkYXRlLCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuQ2hhdFN0YXRlVXBkYXRlLm1lc3NhZ2VJZCA9ICJjcyI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5DaGF0U3RhdGVVcGRhdGUubWVzc2FnZUlkLCBwcm90by5hcHBzLmNoYXQuQ2hhdFN0YXRlVXBkYXRlKTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2hhdFN0YXRlVXBkYXRlJCRnZXRKc1BiTWVzc2FnZUlkJCgpIHsKICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5tZXNzYWdlSWQKfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5wcm90b3R5cGUuZ2V0SmlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDaGF0U3RhdGVVcGRhdGUkJGdldEppZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMV0KfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5wcm90b3R5cGUuc2V0SmlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDaGF0U3RhdGVVcGRhdGUkJHNldEppZCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzFdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5wcm90b3R5cGUuZ2V0Q2hhdFN0YXRlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDaGF0U3RhdGVVcGRhdGUkJGdldENoYXRTdGF0ZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMl0KfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5wcm90b3R5cGUuc2V0Q2hhdFN0YXRlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDaGF0U3RhdGVVcGRhdGUkJHNldENoYXRTdGF0ZSQodmFsdWUpIHsKICB0aGlzLmFycmF5WzJdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5DaGF0U3RhdGUgPSB7QUNUSVZFOjAsIENPTVBPU0lORzoxLCBQQVVTRUQ6MiwgSURMRTozLCBHT05FOjR9Owpwcm90by5hcHBzLmNoYXQuQ2xpZW50RGF0YVF1ZXJ5ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDbGllbnREYXRhUXVlcnkkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFsiY2RzIl0KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuQ2xpZW50RGF0YVF1ZXJ5LCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuQ2xpZW50RGF0YVF1ZXJ5Lm1lc3NhZ2VJZCA9ICJjZHMiOwpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZShwcm90by5hcHBzLmNoYXQuQ2xpZW50RGF0YVF1ZXJ5Lm1lc3NhZ2VJZCwgcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFRdWVyeSk7CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUXVlcnkucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENsaWVudERhdGFRdWVyeSQkZ2V0SnNQYk1lc3NhZ2VJZCQoKSB7CiAgcmV0dXJuIHByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUXVlcnkubWVzc2FnZUlkCn07CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUXVlcnkucHJvdG90eXBlLmdldFF1ZXJ5VGltZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2xpZW50RGF0YVF1ZXJ5JCRnZXRRdWVyeVRpbWUkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzFdCn07CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUXVlcnkucHJvdG90eXBlLnNldFF1ZXJ5VGltZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2xpZW50RGF0YVF1ZXJ5JCRzZXRRdWVyeVRpbWUkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENsaWVudERhdGFSZXNwb25zZSQob3B0X2RhdGEpIHsKICBqc3BiLk1lc3NhZ2UuY2FsbCh0aGlzKTsKICB0aGlzLmFycmF5ID0gb3B0X2RhdGEgfHwgWyJjZHIiXTsKICB0aGlzLmFycmF5WzJdID0gdGhpcy5hcnJheVsyXSB8fCBbXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UubWVzc2FnZUlkID0gImNkciI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UubWVzc2FnZUlkLCBwcm90by5hcHBzLmNoYXQuQ2xpZW50RGF0YVJlc3BvbnNlKTsKcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFSZXNwb25zZS5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2xpZW50RGF0YVJlc3BvbnNlJCRnZXRKc1BiTWVzc2FnZUlkJCgpIHsKICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFSZXNwb25zZS5tZXNzYWdlSWQKfTsKcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFSZXNwb25zZS5wcm90b3R5cGUuZ2V0UXVlcnlUaW1lID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDbGllbnREYXRhUmVzcG9uc2UkJGdldFF1ZXJ5VGltZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMV0KfTsKcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFSZXNwb25zZS5wcm90b3R5cGUuc2V0UXVlcnlUaW1lID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDbGllbnREYXRhUmVzcG9uc2UkJHNldFF1ZXJ5VGltZSQodmFsdWUpIHsKICB0aGlzLmFycmF5WzFdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFSZXNwb25zZS5wcm90b3R5cGUuc2V0Q29udGFjdHNMaXN0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDbGllbnREYXRhUmVzcG9uc2UkJHNldENvbnRhY3RzTGlzdCQodmFsdWUpIHsKICB2YWx1ZSA9IHZhbHVlIHx8IFtdOwogIHRoaXMuYXJyYXlbMl0gPSBbXTsKICBmb3IodmFyIGkgPSAwO2kgPCB2YWx1ZS5sZW5ndGg7aSsrKSB7CiAgICB0aGlzLmFycmF5WzJdW2ldID0gdmFsdWVbaV0udG9BcnJheSgpCiAgfQp9Owpwcm90by5hcHBzLmNoYXQuQ2xpZW50RGF0YVJlc3BvbnNlLnByb3RvdHlwZS5zZXRTZWxmID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDbGllbnREYXRhUmVzcG9uc2UkJHNldFNlbGYkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVszXSA9IHZhbHVlID8gdmFsdWUudG9BcnJheSgpIDogdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFSZXNwb25zZS5Db250YWN0RGF0YSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2xpZW50RGF0YVJlc3BvbnNlJENvbnRhY3REYXRhJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UuQ29udGFjdERhdGEsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UuQ29udGFjdERhdGEucHJvdG90eXBlLmdldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2xpZW50RGF0YVJlc3BvbnNlJENvbnRhY3REYXRhJCRnZXRKaWQkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzBdCn07CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UuQ29udGFjdERhdGEucHJvdG90eXBlLnNldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2xpZW50RGF0YVJlc3BvbnNlJENvbnRhY3REYXRhJCRzZXRKaWQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVswXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UuQ29udGFjdERhdGEucHJvdG90eXBlLmdldFByZXNlbmNlQ29kZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2xpZW50RGF0YVJlc3BvbnNlJENvbnRhY3REYXRhJCRnZXRQcmVzZW5jZUNvZGUkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzFdCn07CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UuQ29udGFjdERhdGEucHJvdG90eXBlLnNldFByZXNlbmNlQ29kZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2xpZW50RGF0YVJlc3BvbnNlJENvbnRhY3REYXRhJCRzZXRQcmVzZW5jZUNvZGUkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UuQ29udGFjdERhdGEucHJvdG90eXBlLmdldFNob3cgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENsaWVudERhdGFSZXNwb25zZSRDb250YWN0RGF0YSQkZ2V0U2hvdyQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMl0KfTsKcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFSZXNwb25zZS5Db250YWN0RGF0YS5wcm90b3R5cGUuc2V0U2hvdyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2xpZW50RGF0YVJlc3BvbnNlJENvbnRhY3REYXRhJCRzZXRTaG93JCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMl0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuQ2xpZW50RGF0YVJlc3BvbnNlLkNvbnRhY3REYXRhLnByb3RvdHlwZS5nZXRDYXBhYmlsaXRpZXMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENsaWVudERhdGFSZXNwb25zZSRDb250YWN0RGF0YSQkZ2V0Q2FwYWJpbGl0aWVzJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVszXQp9Owpwcm90by5hcHBzLmNoYXQuQ2xpZW50RGF0YVJlc3BvbnNlLkNvbnRhY3REYXRhLnByb3RvdHlwZS5zZXRDYXBhYmlsaXRpZXMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENsaWVudERhdGFSZXNwb25zZSRDb250YWN0RGF0YSQkc2V0Q2FwYWJpbGl0aWVzJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbM10gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuQ2xpZW50RGF0YVJlc3BvbnNlLlNlbGZEYXRhID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDbGllbnREYXRhUmVzcG9uc2UkU2VsZkRhdGEkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFtdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFSZXNwb25zZS5TZWxmRGF0YSwganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFSZXNwb25zZS5TZWxmRGF0YS5wcm90b3R5cGUuc2V0VXNlclNob3cgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENsaWVudERhdGFSZXNwb25zZSRTZWxmRGF0YSQkc2V0VXNlclNob3ckKHZhbHVlKSB7CiAgdGhpcy5hcnJheVswXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UuU2VsZkRhdGEucHJvdG90eXBlLnNldFJlc291cmNlU2hvdyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ2xpZW50RGF0YVJlc3BvbnNlJFNlbGZEYXRhJCRzZXRSZXNvdXJjZVNob3ckKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Db250YWN0R2FpYUlkVXBkYXRlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDb250YWN0R2FpYUlkVXBkYXRlJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbImNndSJdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0LkNvbnRhY3RHYWlhSWRVcGRhdGUsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5Db250YWN0R2FpYUlkVXBkYXRlLm1lc3NhZ2VJZCA9ICJjZ3UiOwpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZShwcm90by5hcHBzLmNoYXQuQ29udGFjdEdhaWFJZFVwZGF0ZS5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5Db250YWN0R2FpYUlkVXBkYXRlKTsKcHJvdG8uYXBwcy5jaGF0LkNvbnRhY3RHYWlhSWRVcGRhdGUucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENvbnRhY3RHYWlhSWRVcGRhdGUkJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuQ29udGFjdEdhaWFJZFVwZGF0ZS5tZXNzYWdlSWQKfTsKcHJvdG8uYXBwcy5jaGF0LkNvbnRhY3RHYWlhSWRVcGRhdGUucHJvdG90eXBlLmdldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ29udGFjdEdhaWFJZFVwZGF0ZSQkZ2V0SmlkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxXQp9Owpwcm90by5hcHBzLmNoYXQuQ29udGFjdEdhaWFJZFVwZGF0ZS5wcm90b3R5cGUuc2V0SmlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDb250YWN0R2FpYUlkVXBkYXRlJCRzZXRKaWQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Db250YWN0R2FpYUlkVXBkYXRlLnByb3RvdHlwZS5nZXRPYmZ1c2NhdGVkR2FpYUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRDb250YWN0R2FpYUlkVXBkYXRlJCRnZXRPYmZ1c2NhdGVkR2FpYUlkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsyXQp9Owpwcm90by5hcHBzLmNoYXQuQ29udGFjdEdhaWFJZFVwZGF0ZS5wcm90b3R5cGUuc2V0T2JmdXNjYXRlZEdhaWFJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkQ29udGFjdEdhaWFJZFVwZGF0ZSQkc2V0T2JmdXNjYXRlZEdhaWFJZCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzJdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LkNvbnRhY3RHYWlhSWRVcGRhdGUucHJvdG90eXBlLmdldElzR3BsdXMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JENvbnRhY3RHYWlhSWRVcGRhdGUkJGdldElzR3BsdXMkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzNdCn07CnByb3RvLmFwcHMuY2hhdC5GdWxsUm9zdGVyUmVxdWVzdCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkRnVsbFJvc3RlclJlcXVlc3QkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFsicmYiXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5GdWxsUm9zdGVyUmVxdWVzdCwganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0LkZ1bGxSb3N0ZXJSZXF1ZXN0Lm1lc3NhZ2VJZCA9ICJyZiI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5GdWxsUm9zdGVyUmVxdWVzdC5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5GdWxsUm9zdGVyUmVxdWVzdCk7CnByb3RvLmFwcHMuY2hhdC5GdWxsUm9zdGVyUmVxdWVzdC5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkRnVsbFJvc3RlclJlcXVlc3QkJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuRnVsbFJvc3RlclJlcXVlc3QubWVzc2FnZUlkCn07CnByb3RvLmFwcHMuY2hhdC5PZmZUaGVSZWNvcmQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE9mZlRoZVJlY29yZCQob3B0X2RhdGEpIHsKICBqc3BiLk1lc3NhZ2UuY2FsbCh0aGlzKTsKICB0aGlzLmFycmF5ID0gb3B0X2RhdGEgfHwgWyJvdHIiXTsKICB0aGlzLmFycmF5WzFdID0gdGhpcy5hcnJheVsxXSB8fCBbXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5PZmZUaGVSZWNvcmQsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5PZmZUaGVSZWNvcmQubWVzc2FnZUlkID0gIm90ciI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5PZmZUaGVSZWNvcmQubWVzc2FnZUlkLCBwcm90by5hcHBzLmNoYXQuT2ZmVGhlUmVjb3JkKTsKcHJvdG8uYXBwcy5jaGF0Lk9mZlRoZVJlY29yZC5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkT2ZmVGhlUmVjb3JkJCRnZXRKc1BiTWVzc2FnZUlkJCgpIHsKICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0Lk9mZlRoZVJlY29yZC5tZXNzYWdlSWQKfTsKcHJvdG8uYXBwcy5jaGF0Lk9mZlRoZVJlY29yZC5wcm90b3R5cGUuZ2V0RGF0YUxpc3QgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE9mZlRoZVJlY29yZCQkZ2V0RGF0YUxpc3QkKCkgewogIGlmKCF0aGlzLmRhdGFfKSB7CiAgICB0aGlzLmRhdGFfID0gW107CiAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLmFycmF5WzFdLmxlbmd0aDtpKyspIHsKICAgICAgdGhpcy5kYXRhX1tpXSA9IG5ldyBwcm90by5hcHBzLmNoYXQuT2ZmVGhlUmVjb3JkLkRhdHVtKHRoaXMuYXJyYXlbMV1baV0pCiAgICB9CiAgfQogIHJldHVybiB0aGlzLmRhdGFfCn07CnByb3RvLmFwcHMuY2hhdC5PZmZUaGVSZWNvcmQuRGF0dW0gPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE9mZlRoZVJlY29yZCREYXR1bSQob3B0X2RhdGEpIHsKICBqc3BiLk1lc3NhZ2UuY2FsbCh0aGlzKTsKICB0aGlzLmFycmF5ID0gb3B0X2RhdGEgfHwgW10KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuT2ZmVGhlUmVjb3JkLkRhdHVtLCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuT2ZmVGhlUmVjb3JkLkRhdHVtLnByb3RvdHlwZS5nZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE9mZlRoZVJlY29yZCREYXR1bSQkZ2V0SmlkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVswXQp9Owpwcm90by5hcHBzLmNoYXQuT2ZmVGhlUmVjb3JkLkRhdHVtLnByb3RvdHlwZS5zZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE9mZlRoZVJlY29yZCREYXR1bSQkc2V0SmlkJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMF0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuT2ZmVGhlUmVjb3JkLkRhdHVtLnByb3RvdHlwZS5nZXRPdHIgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE9mZlRoZVJlY29yZCREYXR1bSQkZ2V0T3RyJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxXQp9Owpwcm90by5hcHBzLmNoYXQuUHJlc2VuY2VEZWJ1ZyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUHJlc2VuY2VEZWJ1ZyQob3B0X2RhdGEpIHsKICBqc3BiLk1lc3NhZ2UuY2FsbCh0aGlzKTsKICB0aGlzLmFycmF5ID0gb3B0X2RhdGEgfHwgWyJwZCJdOwogIHRoaXMuYXJyYXlbMV0gPSB0aGlzLmFycmF5WzFdIHx8IFtdOwogIHRoaXMuYXJyYXlbMl0gPSB0aGlzLmFycmF5WzJdIHx8IFtdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlRGVidWcsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZURlYnVnLm1lc3NhZ2VJZCA9ICJwZCI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZURlYnVnLm1lc3NhZ2VJZCwgcHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlRGVidWcpOwpwcm90by5hcHBzLmNoYXQuUHJlc2VuY2VEZWJ1Zy5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUHJlc2VuY2VEZWJ1ZyQkZ2V0SnNQYk1lc3NhZ2VJZCQoKSB7CiAgcmV0dXJuIHByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZURlYnVnLm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyUmVtb3ZlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJSZW1vdmUkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFsicmQiXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJSZW1vdmUsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJSZW1vdmUubWVzc2FnZUlkID0gInJkIjsKanNwYi5NZXNzYWdlLnJlZ2lzdGVyTWVzc2FnZVR5cGUocHJvdG8uYXBwcy5jaGF0LlJvc3RlclJlbW92ZS5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJSZW1vdmUpOwpwcm90by5hcHBzLmNoYXQuUm9zdGVyUmVtb3ZlLnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJSZW1vdmUkJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuUm9zdGVyUmVtb3ZlLm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyUmVtb3ZlLnByb3RvdHlwZS5nZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclJlbW92ZSQkZ2V0SmlkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxXQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyUmVtb3ZlLnByb3RvdHlwZS5zZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlclJlbW92ZSQkc2V0SmlkJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMV0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuVmNhcmQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFZjYXJkJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbInZjIl0KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuVmNhcmQsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5WY2FyZC5tZXNzYWdlSWQgPSAidmMiOwpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZShwcm90by5hcHBzLmNoYXQuVmNhcmQubWVzc2FnZUlkLCBwcm90by5hcHBzLmNoYXQuVmNhcmQpOwpwcm90by5hcHBzLmNoYXQuVmNhcmQucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFZjYXJkJCRnZXRKc1BiTWVzc2FnZUlkJCgpIHsKICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LlZjYXJkLm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuVmNhcmQucHJvdG90eXBlLmdldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkVmNhcmQkJGdldEppZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMV0KfTsKcHJvdG8uYXBwcy5jaGF0LlZjYXJkLnByb3RvdHlwZS5zZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFZjYXJkJCRzZXRKaWQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5WY2FyZC5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkVmNhcmQkJGdldE5hbWUkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzJdCn07CnByb3RvLmFwcHMuY2hhdC5WY2FyZC5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkVmNhcmQkJHNldE5hbWUkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsyXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5WY2FyZC5wcm90b3R5cGUuZ2V0QXZhdGFyID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRWY2FyZCQkZ2V0QXZhdGFyJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVszXQp9Owpwcm90by5hcHBzLmNoYXQuVmNhcmQucHJvdG90eXBlLnNldEF2YXRhciA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkVmNhcmQkJHNldEF2YXRhciQodmFsdWUpIHsKICB0aGlzLmFycmF5WzNdID0gdmFsdWUKfTsKZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJChvcHRfbWF4Q291bnQsIG9wdF9jYWNoZSkgewogIHRoaXMubWF4Q291bnRfID0gb3B0X21heENvdW50IHx8IG51bGw7CiAgdGhpcy5jYWNoZV8gPSAhIW9wdF9jYWNoZTsKICB0aGlzLm1hcF8gPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcDsKICB0aGlzLmhlYWRfID0gbmV3IGdvb2cuc3RydWN0cy5MaW5rZWRNYXAuTm9kZV8oIiIsIHZvaWQgMCk7CiAgdGhpcy5oZWFkXy5uZXh0ID0gdGhpcy5oZWFkXy5wcmV2ID0gdGhpcy5oZWFkXwp9Owpnb29nLnN0cnVjdHMuTGlua2VkTWFwLnByb3RvdHlwZS5maW5kQW5kTW92ZVRvVG9wXyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJCRmaW5kQW5kTW92ZVRvVG9wXyQoa2V5KSB7CiAgdmFyIG5vZGUgPSB0aGlzLm1hcF8uZ2V0KGtleSk7CiAgbm9kZSAmJiB0aGlzLmNhY2hlXyAmJiAobm9kZS5yZW1vdmUoKSwgdGhpcy5pbnNlcnRfKG5vZGUpKTsKICByZXR1cm4gbm9kZQp9Owpnb29nLnN0cnVjdHMuTGlua2VkTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJExpbmtlZE1hcCQkZ2V0JChrZXksIG9wdF92YWwpIHsKICB2YXIgbm9kZSA9IHRoaXMuZmluZEFuZE1vdmVUb1RvcF8oa2V5KTsKICByZXR1cm4gbm9kZSA/IG5vZGUudmFsdWUgOiBvcHRfdmFsCn07Cmdvb2cuc3RydWN0cy5MaW5rZWRNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJCRzZXQkKGtleSwgdmFsdWUpIHsKICB2YXIgbm9kZSA9IHRoaXMuZmluZEFuZE1vdmVUb1RvcF8oa2V5KTsKICBub2RlID8gbm9kZS52YWx1ZSA9IHZhbHVlIDogKG5vZGUgPSBuZXcgZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcC5Ob2RlXyhrZXksIHZhbHVlKSwgdGhpcy5tYXBfLnNldChrZXksIG5vZGUpLCB0aGlzLmluc2VydF8obm9kZSkpCn07Cmdvb2cuc3RydWN0cy5MaW5rZWRNYXAucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJExpbmtlZE1hcCQkcGVlayQoKSB7CiAgcmV0dXJuIHRoaXMuaGVhZF8ubmV4dC52YWx1ZQp9Owpnb29nLnN0cnVjdHMuTGlua2VkTWFwLnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJCRzaGlmdCQoKSB7CiAgcmV0dXJuIHRoaXMucG9wTm9kZV8odGhpcy5oZWFkXy5uZXh0KQp9Owpnb29nLnN0cnVjdHMuTGlua2VkTWFwLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJExpbmtlZE1hcCQkcG9wJCgpIHsKICByZXR1cm4gdGhpcy5wb3BOb2RlXyh0aGlzLmhlYWRfLnByZXYpCn07Cmdvb2cuc3RydWN0cy5MaW5rZWRNYXAucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJCRyZW1vdmUkKGtleSkgewogIHZhciBub2RlID0gdGhpcy5tYXBfLmdldChrZXkpOwogIHJldHVybiBub2RlID8gKHRoaXMucmVtb3ZlTm9kZShub2RlKSwgITApIDogITEKfTsKZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcC5wcm90b3R5cGUucmVtb3ZlTm9kZSA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJCRyZW1vdmVOb2RlJChub2RlKSB7CiAgbm9kZS5yZW1vdmUoKTsKICB0aGlzLm1hcF8ucmVtb3ZlKG5vZGUua2V5KQp9Owpnb29nLnN0cnVjdHMuTGlua2VkTWFwLnByb3RvdHlwZS5nZXRDb3VudCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJCRnZXRDb3VudCQoKSB7CiAgcmV0dXJuIHRoaXMubWFwXy5nZXRDb3VudCgpCn07Cmdvb2cuc3RydWN0cy5MaW5rZWRNYXAucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJExpbmtlZE1hcCQkaXNFbXB0eSQoKSB7CiAgcmV0dXJuIHRoaXMubWFwXy5pc0VtcHR5KCkKfTsKZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcC5wcm90b3R5cGUuZ2V0S2V5cyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJCRnZXRLZXlzJCgpIHsKICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsLCBrZXkpIHsKICAgIHJldHVybiBrZXkKICB9KQp9Owpnb29nLnN0cnVjdHMuTGlua2VkTWFwLnByb3RvdHlwZS5nZXRWYWx1ZXMgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJExpbmtlZE1hcCQkZ2V0VmFsdWVzJCgpIHsKICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsKSB7CiAgICByZXR1cm4gdmFsCiAgfSkKfTsKZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJExpbmtlZE1hcCQkY29udGFpbnMkKHZhbHVlKSB7CiAgcmV0dXJuIHRoaXMuc29tZShmdW5jdGlvbihlbCkgewogICAgcmV0dXJuIGVsID09IHZhbHVlCiAgfSkKfTsKZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcC5wcm90b3R5cGUuY29udGFpbnNLZXkgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJExpbmtlZE1hcCQkY29udGFpbnNLZXkkKGtleSkgewogIHJldHVybiB0aGlzLm1hcF8uY29udGFpbnNLZXkoa2V5KQp9Owpnb29nLnN0cnVjdHMuTGlua2VkTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJCRjbGVhciQoKSB7CiAgdGhpcy50cnVuY2F0ZV8oMCkKfTsKZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJCRmb3JFYWNoJChmLCBvcHRfb2JqKSB7CiAgZm9yKHZhciBuID0gdGhpcy5oZWFkXy5uZXh0O24gIT0gdGhpcy5oZWFkXztuID0gbi5uZXh0KSB7CiAgICBmLmNhbGwob3B0X29iaiwgbi52YWx1ZSwgbi5rZXksIHRoaXMpCiAgfQp9Owpnb29nLnN0cnVjdHMuTGlua2VkTWFwLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJExpbmtlZE1hcCQkbWFwJChmLCBvcHRfb2JqKSB7CiAgZm9yKHZhciBydiA9IFtdLCBuID0gdGhpcy5oZWFkXy5uZXh0O24gIT0gdGhpcy5oZWFkXztuID0gbi5uZXh0KSB7CiAgICBydi5wdXNoKGYuY2FsbChvcHRfb2JqLCBuLnZhbHVlLCBuLmtleSwgdGhpcykpCiAgfQogIHJldHVybiBydgp9Owpnb29nLnN0cnVjdHMuTGlua2VkTWFwLnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRMaW5rZWRNYXAkJHNvbWUkKGYsIG9wdF9vYmopIHsKICBmb3IodmFyIG4gPSB0aGlzLmhlYWRfLm5leHQ7biAhPSB0aGlzLmhlYWRfO24gPSBuLm5leHQpIHsKICAgIGlmKGYuY2FsbChvcHRfb2JqLCBuLnZhbHVlLCBuLmtleSwgdGhpcykpIHsKICAgICAgcmV0dXJuITAKICAgIH0KICB9CiAgcmV0dXJuITEKfTsKZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcC5wcm90b3R5cGUuZXZlcnkgPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJExpbmtlZE1hcCQkZXZlcnkkKGYsIG9wdF9vYmopIHsKICBmb3IodmFyIG4gPSB0aGlzLmhlYWRfLm5leHQ7biAhPSB0aGlzLmhlYWRfO24gPSBuLm5leHQpIHsKICAgIGlmKCFmLmNhbGwob3B0X29iaiwgbi52YWx1ZSwgbi5rZXksIHRoaXMpKSB7CiAgICAgIHJldHVybiExCiAgICB9CiAgfQogIHJldHVybiEwCn07Cmdvb2cuc3RydWN0cy5MaW5rZWRNYXAucHJvdG90eXBlLmluc2VydF8gPSBmdW5jdGlvbiAkZ29vZyRzdHJ1Y3RzJExpbmtlZE1hcCQkaW5zZXJ0XyQobm9kZSkgewogIHRoaXMuY2FjaGVfID8gKG5vZGUubmV4dCA9IHRoaXMuaGVhZF8ubmV4dCwgbm9kZS5wcmV2ID0gdGhpcy5oZWFkXywgdGhpcy5oZWFkXy5uZXh0ID0gbm9kZSwgbm9kZS5uZXh0LnByZXYgPSBub2RlKSA6IChub2RlLnByZXYgPSB0aGlzLmhlYWRfLnByZXYsIG5vZGUubmV4dCA9IHRoaXMuaGVhZF8sIHRoaXMuaGVhZF8ucHJldiA9IG5vZGUsIG5vZGUucHJldi5uZXh0ID0gbm9kZSk7CiAgbnVsbCAhPSB0aGlzLm1heENvdW50XyAmJiB0aGlzLnRydW5jYXRlXyh0aGlzLm1heENvdW50XykKfTsKZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcC5wcm90b3R5cGUudHJ1bmNhdGVfID0gZnVuY3Rpb24gJGdvb2ckc3RydWN0cyRMaW5rZWRNYXAkJHRydW5jYXRlXyQoY291bnQpIHsKICBmb3IodmFyIGkgPSB0aGlzLm1hcF8uZ2V0Q291bnQoKTtpID4gY291bnQ7aS0tKSB7CiAgICB0aGlzLnJlbW92ZU5vZGUodGhpcy5jYWNoZV8gPyB0aGlzLmhlYWRfLnByZXYgOiB0aGlzLmhlYWRfLm5leHQpCiAgfQp9Owpnb29nLnN0cnVjdHMuTGlua2VkTWFwLnByb3RvdHlwZS5wb3BOb2RlXyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJCRwb3BOb2RlXyQobm9kZSkgewogIHRoaXMuaGVhZF8gIT0gbm9kZSAmJiB0aGlzLnJlbW92ZU5vZGUobm9kZSk7CiAgcmV0dXJuIG5vZGUudmFsdWUKfTsKZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcC5Ob2RlXyA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJE5vZGVfJChrZXksIHZhbHVlKSB7CiAgdGhpcy5rZXkgPSBrZXk7CiAgdGhpcy52YWx1ZSA9IHZhbHVlCn07Cmdvb2cuc3RydWN0cy5MaW5rZWRNYXAuTm9kZV8ucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICRnb29nJHN0cnVjdHMkTGlua2VkTWFwJE5vZGVfJCRyZW1vdmUkKCkgewogIHRoaXMucHJldi5uZXh0ID0gdGhpcy5uZXh0OwogIHRoaXMubmV4dC5wcmV2ID0gdGhpcy5wcmV2OwogIGRlbGV0ZSB0aGlzLnByZXY7CiAgZGVsZXRlIHRoaXMubmV4dAp9OwpjaGF0Lm1vZGVsLkZvY3VzR3JvdXBzID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkRm9jdXNHcm91cHMkKCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJjaGF0Lm1vZGVsLkZvY3VzR3JvdXBzIik7CiAgdGhpcy5tYXBfID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdGhpcy5pc0luaXRpYWxpemVkXyA9ICExCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5tb2RlbC5Gb2N1c0dyb3VwcywgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwpjaGF0Lm1vZGVsLkZvY3VzR3JvdXBzLlNFUlZJQ0VfSUQgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJjaGF0Lm1vZGVsLkZvY3VzR3JvdXBzIik7CmNoYXQubW9kZWwuRm9jdXNHcm91cHMuQ0hBVF9DT05UQUNUU19HUk9VUF9JRCA9ICIyIjsKY2hhdC5tb2RlbC5Gb2N1c0dyb3Vwcy5FdmVudFR5cGUgPSB7Rk9DVVNfR1JPVVBTX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiZm9jdXNfZ3JvdXBzX3VwZGF0ZSIpfTsKY2hhdC5tb2RlbC5Gb2N1c0dyb3Vwcy5nZXQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRGb2N1c0dyb3VwcyRnZXQkKGFwcENvbnRleHQpIHsKICByZXR1cm4gYXBwQ29udGV4dC5nZXQoY2hhdC5tb2RlbC5Gb2N1c0dyb3Vwcy5TRVJWSUNFX0lEKQp9OwpjaGF0Lm1vZGVsLkZvY3VzR3JvdXBzLnByb3RvdHlwZS5pc0luaXRpYWxpemVkID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkRm9jdXNHcm91cHMkJGlzSW5pdGlhbGl6ZWQkKCkgewogIHJldHVybiB0aGlzLmlzSW5pdGlhbGl6ZWRfCn07CmNoYXQubW9kZWwuRm9jdXNHcm91cHMucmVnaXN0ZXIgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRGb2N1c0dyb3VwcyRyZWdpc3RlciQoYXBwQ29udGV4dCkgewogIHZhciBmb2N1c0dyb3VwcyA9IG5ldyBjaGF0Lm1vZGVsLkZvY3VzR3JvdXBzOwogIGFwcENvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKGNoYXQubW9kZWwuRm9jdXNHcm91cHMuU0VSVklDRV9JRCwgZm9jdXNHcm91cHMpOwogIHJldHVybiBmb2N1c0dyb3Vwcwp9OwpmYXZhLmNoYXQgPSB7fTsKZmF2YS5jaGF0Lk91dGJvdW5kVm9pY2VTZXJ2aWNlID0gZnVuY3Rpb24gJGZhdmEkY2hhdCRPdXRib3VuZFZvaWNlU2VydmljZSQoKSB7Cn07CnRhbGsubWVkaWEucGhvbmUuQ2FsbEVudHJ5ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQ2FsbEVudHJ5JCgpIHsKfTsKdGFsay5tZWRpYS5waG9uZS5DYWxsRW50cnkucHJvdG90eXBlLm1lc3NhZ2VUZXh0ID0gIiI7CnRhbGsubWVkaWEucGhvbmUuQ2FsbEVudHJ5LnByb3RvdHlwZS50cmFuc2NyaXB0ID0gW107CnRhbGsubWVkaWEucGhvbmUuQ2FsbEVudHJ5Lk1TR19VTktOT1dOX0NBTExFUl8gPSAiVW5rbm93biI7CnRhbGsubWVkaWEucGhvbmUuQ2FsbEVudHJ5LlR5cGUgPSB7TUlTU0VEOjAsIElOQk9VTkQ6MSwgVk9JQ0VNQUlMOjIsIExJU1RFTl9JTjozLCBSRUNPUkRJTkc6NCwgQ0hFQ0tfVk9JQ0VNQUlMOjUsIFNFVFRJTkdTOjYsIENBTExfUkVUVVJOOjcsIENMSUNLMkNBTEw6OCwgV0VCX0NBTEw6OSwgU01TX0lOOjEwLCBTTVNfT1VUOjExLCBNT0JJTEVfRElBTEVSX0NBTExfVEhST1VHSDoxMiwgR09PR0xFX1RBTEs6MTMsIFNJUDoxNCwgU0hBRE9XX05VTUJFUl9DQUxMOjE1LCBVTlJPVVRBQkxFOjk5fTsKdGFsay5tZWRpYS5waG9uZS5DYWxsRW50cnkuU3RhdHVzID0ge1VOUkVBRDowLCBSRUFEOjEsIFVOUFJPQ0VTU0VEOjJ9Owp0YWxrLm1lZGlhLnBob25lLkNhbGxFbnRyeS5mcm9tSnNvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJENhbGxFbnRyeSRmcm9tSnNvbiQobXNnKSB7CiAgZm9yKHZhciB0b2tlbnMgPSBbXSwgdG9rZW5zSnNvbiA9IG1zZ1s4XSwgaSA9IDA7dG9rZW5zSnNvbiAmJiBpIDwgdG9rZW5zSnNvbi5sZW5ndGg7aSsrKSB7CiAgICB2YXIgdG9rZW4gPSB0YWxrLm1lZGlhLnBob25lLkNhbGxFbnRyeS5UcmFuc2NyaXB0VG9rZW4uZnJvbUpzb25fKHRva2Vuc0pzb25baV0pOwogICAgdG9rZW4gJiYgdG9rZW5zLnB1c2godG9rZW4pCiAgfQogIHZhciBlbnRyeSA9IG5ldyB0YWxrLm1lZGlhLnBob25lLkNhbGxFbnRyeTsKICBlbnRyeS5jb252ZXJzYXRpb25JZCA9IG1zZ1swXTsKICBlbnRyeS5jYWxsSWQgPSBtc2dbMV07CiAgZW50cnkudGltZXN0YW1wID0gbXNnWzJdOwogIGVudHJ5LnN0YXR1cyA9IG1zZ1szXTsKICBlbnRyeS5jYWxsVHlwZSA9IG1zZ1s0XTsKICBlbnRyeS5waG9uZSA9IG1zZ1s1XTsKICBlbnRyeS5mb3JtYXR0ZWRQaG9uZV8gPSB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZm9ybWF0TnVtYmVyRm9yRGlzcGxheShlbnRyeS5waG9uZSk7CiAgZW50cnkubWVzc2FnZVRleHQgPSBtc2dbNl0gfHwgIiI7CiAgZW50cnkuZHVyYXRpb24gPSBtc2dbN107CiAgZW50cnkudHJhbnNjcmlwdCA9IHRva2VucyB8fCBbXTsKICByZXR1cm4gZW50cnkKfTsKdGFsay5tZWRpYS5waG9uZS5DYWxsRW50cnkuZnJvbUpzb25NaW5pbWFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQ2FsbEVudHJ5JGZyb21Kc29uTWluaW1hbCQobXNnKSB7CiAgdmFyIGVudHJ5ID0gbmV3IHRhbGsubWVkaWEucGhvbmUuQ2FsbEVudHJ5OwogIGVudHJ5LnBob25lID0gbXNnWzBdOwogIGVudHJ5LmZvcm1hdHRlZFBob25lXyA9IG1zZ1sxXTsKICBlbnRyeS5uYW1lID0gbXNnWzJdOwogIGVudHJ5LnBob25lVHlwZSA9IG1zZ1szXTsKICBlbnRyeS5jYWxsVHlwZSA9IG1zZ1s0XTsKICBlbnRyeS50aW1lc3RhbXAgPSBtc2dbNV07CiAgcmV0dXJuIGVudHJ5Cn07CnRhbGsubWVkaWEucGhvbmUuQ2FsbEVudHJ5LlRyYW5zY3JpcHRUb2tlbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJENhbGxFbnRyeSRUcmFuc2NyaXB0VG9rZW4kKCkgewp9Owp0YWxrLm1lZGlhLnBob25lLkNhbGxFbnRyeS5UcmFuc2NyaXB0VG9rZW4uZnJvbUpzb25fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQ2FsbEVudHJ5JFRyYW5zY3JpcHRUb2tlbiRmcm9tSnNvbl8kKG1zZykgewogIHJldHVybiBuZXcgdGFsay5tZWRpYS5waG9uZS5DYWxsRW50cnkuVHJhbnNjcmlwdFRva2VuKG1zZ1swXSwgbXNnWzFdKQp9Owp0YWxrLm1lZGlhLnBob25lLkNvdW50cnlQcmlvcml0aWVzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQ291bnRyeVByaW9yaXRpZXMkKGFwcENvbnRleHQpIHsKICB0aGlzLmFwcENvbnRleHRfID0gYXBwQ29udGV4dDsKICB0aGlzLmhlYWRfID0gbmV3IHRhbGsubWVkaWEucGhvbmUuQ291bnRyeVByaW9yaXRpZXMuQ291bnRyeUZldGNoZXJOb2RlXyh0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZ2V0RGVmYXVsdENvdW50cnksIHRhbGsubWVkaWEucGhvbmUuQ291bnRyeVByaW9yaXRpZXMuUHJpb3JpdHkuREVGQVVMVF9DT1VOVFJZKQp9Owp0YWxrLm1lZGlhLnBob25lLkNvdW50cnlQcmlvcml0aWVzLnJlZ2lzdGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQ291bnRyeVByaW9yaXRpZXMkcmVnaXN0ZXIkKGFwcENvbnRleHQpIHsKICB2YXIgcHJpb3JpdHkgPSBuZXcgdGFsay5tZWRpYS5waG9uZS5Db3VudHJ5UHJpb3JpdGllcyhhcHBDb250ZXh0KTsKICBhcHBDb250ZXh0LnJlZ2lzdGVyU2VydmljZSh0YWxrLm1lZGlhLnBob25lLnNlcnZpY2VzLkNPVU5UUllfUFJJT1JJVFksIHByaW9yaXR5KTsKICByZXR1cm4gcHJpb3JpdHkKfTsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJ5UHJpb3JpdGllcy5Qcmlvcml0eSA9IHtERUZBVUxUX0NPVU5UUlk6MTAwLCBDVVJSRU5UX0NPVU5UUlk6NTAsIEhJU1RPUlk6MTB9Owp0YWxrLm1lZGlhLnBob25lLkNvdW50cnlQcmlvcml0aWVzLnByb3RvdHlwZS5nZXRDb3VudHJpZXMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRDb3VudHJ5UHJpb3JpdGllcyQkZ2V0Q291bnRyaWVzJCgpIHsKICBmb3IodmFyIG5vZGUgPSB0aGlzLmhlYWRfLCBjb3VudHJpZXMgPSBbXTtub2RlOykgewogICAgY291bnRyaWVzID0gY291bnRyaWVzLmNvbmNhdChub2RlLmNvdW50cnkoKSksIG5vZGUgPSBub2RlLm5leHQKICB9CiAgZ29vZy5hcnJheS5yZW1vdmVEdXBsaWNhdGVzKGNvdW50cmllcyk7CiAgcmV0dXJuIGNvdW50cmllcwp9Owp0YWxrLm1lZGlhLnBob25lLkNvdW50cnlQcmlvcml0aWVzLnByb3RvdHlwZS5hZGRDb3VudHJpZXMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRDb3VudHJ5UHJpb3JpdGllcyQkYWRkQ291bnRyaWVzJChnZXRDb3VudHJpZXMsIHByaW9yaXR5KSB7CiAgdmFyIGNvdW50cnkgPSBuZXcgdGFsay5tZWRpYS5waG9uZS5Db3VudHJ5UHJpb3JpdGllcy5Db3VudHJ5RmV0Y2hlck5vZGVfKGdldENvdW50cmllcywgcHJpb3JpdHkpOwogIHRoaXMuYWRkQ291bnRyeV8oY291bnRyeSkKfTsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJ5UHJpb3JpdGllcy5wcm90b3R5cGUuYWRkQ291bnRyeV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRDb3VudHJ5UHJpb3JpdGllcyQkYWRkQ291bnRyeV8kKGNvdW50cnkpIHsKICBmb3IodmFyIG5vZGUgPSB0aGlzLmhlYWRfO25vZGUubmV4dCAmJiBub2RlLm5leHQucHJpb3JpdHkgPj0gY291bnRyeS5wcmlvcml0eTspIHsKICAgIG5vZGUgPSBub2RlLm5leHQKICB9CiAgY291bnRyeS5uZXh0ID0gbm9kZS5uZXh0OwogIG5vZGUubmV4dCA9IGNvdW50cnkKfTsKdGFsay5tZWRpYS5waG9uZS5Db3VudHJ5UHJpb3JpdGllcy5Db3VudHJ5RmV0Y2hlck5vZGVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQ291bnRyeVByaW9yaXRpZXMkQ291bnRyeUZldGNoZXJOb2RlXyQoZ2V0Q291bnRyaWVzT3JDb3VudHJ5LCBwcmlvcml0eSkgewogIHRoaXMuZ2V0Q291bnRyaWVzXyA9IGdldENvdW50cmllc09yQ291bnRyeTsKICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgdGhpcy5uZXh0ID0gbnVsbAp9Owp0YWxrLm1lZGlhLnBob25lLkNvdW50cnlQcmlvcml0aWVzLkNvdW50cnlGZXRjaGVyTm9kZV8ucHJvdG90eXBlLmNvdW50cnkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRDb3VudHJ5UHJpb3JpdGllcyRDb3VudHJ5RmV0Y2hlck5vZGVfJCRjb3VudHJ5JCgpIHsKICByZXR1cm4gdGhpcy5nZXRDb3VudHJpZXNfKCkKfTsKdGFsay5tZWRpYS5waG9uZS5DYWxsSGlzdG9yeSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJENhbGxIaXN0b3J5JChhcHBDb250ZXh0LCB2b2ljZVNlcnZpY2UpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuc2V0UGFyZW50RXZlbnRUYXJnZXQodm9pY2VTZXJ2aWNlKTsKICB0aGlzLmFwcENvbnRleHRfID0gYXBwQ29udGV4dDsKICB0aGlzLmNhbGxIaXN0b3J5XyA9IFtdOwogIHRoaXMuZXZlbnRIYW5kbGVyID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB2YXIgcHJpb3JpdGllcyA9IGFwcENvbnRleHQuZ2V0KHRhbGsubWVkaWEucGhvbmUuc2VydmljZXMuQ09VTlRSWV9QUklPUklUWSk7CiAgcHJpb3JpdGllcy5hZGRDb3VudHJpZXMoZ29vZy5iaW5kKHRoaXMuZ2V0Q291bnRyaWVzLCB0aGlzKSwgdGFsay5tZWRpYS5waG9uZS5Db3VudHJ5UHJpb3JpdGllcy5Qcmlvcml0eS5ISVNUT1JZKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEucGhvbmUuQ2FsbEhpc3RvcnksIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKdGFsay5tZWRpYS5waG9uZS5DYWxsSGlzdG9yeS5ISVNUT1JZX0RFTEFZX01TXyA9IDJFMzsKdGFsay5tZWRpYS5waG9uZS5DYWxsSGlzdG9yeS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQ2FsbEhpc3RvcnkkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgZ29vZy5kaXNwb3NlKHRoaXMuZXZlbnRIYW5kbGVyKTsKICB0aGlzLmNsZWFySGlzdG9yeVRpbWVyc18oKTsKICB0YWxrLm1lZGlhLnBob25lLkNhbGxIaXN0b3J5LnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpCn07CnRhbGsubWVkaWEucGhvbmUuQ2FsbEhpc3RvcnkucHJvdG90eXBlLmdldENvdW50cmllcyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJENhbGxIaXN0b3J5JCRnZXRDb3VudHJpZXMkKCkgewogIGlmKHRoaXMuY291bnRyaWVzXykgewogICAgcmV0dXJuIHRoaXMuY291bnRyaWVzXwogIH0KICB0aGlzLmNvdW50cmllc18gPSBbXTsKICBnb29nLmFycmF5LmZvckVhY2godGhpcy5jYWxsSGlzdG9yeV8sIGZ1bmN0aW9uKGVudHJ5KSB7CiAgICB2YXIgbnVtYmVyID0gZW50cnkucGhvbmUsIGNvZGUgPSB0YWxrLm1lZGlhLnBob25lLk51bWJlclV0aWwuZ2V0Q2FsbGluZ0NvZGVGcm9tTnVtYmVyKG51bWJlcik7CiAgICBjb2RlICYmIHRoaXMuY291bnRyaWVzXy5wdXNoKHRhbGsubWVkaWEucGhvbmUuTnVtYmVyVXRpbC5nZXRDb3VudHJ5RnJvbUNhbGxpbmdDb2RlKGNvZGUpKQogIH0sIHRoaXMpOwogIHJldHVybiB0aGlzLmNvdW50cmllc18KfTsKdGFsay5tZWRpYS5waG9uZS5DYWxsSGlzdG9yeS5wcm90b3R5cGUuY2xlYXJIaXN0b3J5VGltZXJzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJENhbGxIaXN0b3J5JCRjbGVhckhpc3RvcnlUaW1lcnNfJCgpIHsKICB0aGlzLmNhbGxIaXN0b3J5U2hvcnRUaW1lcklkXyAmJiAoZ29vZy5UaW1lci5jbGVhcih0aGlzLmNhbGxIaXN0b3J5U2hvcnRUaW1lcklkXyksIGRlbGV0ZSB0aGlzLmNhbGxIaXN0b3J5U2hvcnRUaW1lcklkXyk7CiAgdGhpcy5jYWxsSGlzdG9yeUxvbmdUaW1lcklkXyAmJiAoZ29vZy5UaW1lci5jbGVhcih0aGlzLmNhbGxIaXN0b3J5TG9uZ1RpbWVySWRfKSwgZGVsZXRlIHRoaXMuY2FsbEhpc3RvcnlMb25nVGltZXJJZF8pCn07CnRhbGsubWVkaWEucGhvbmUuRm9yd2FyZGluZ1Bob25lID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkRm9yd2FyZGluZ1Bob25lJChhcHBDb250ZXh0LCBpZCwgbmFtZSwgcGhvbmVOdW1iZXIsIHR5cGUpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuYXBwQ29udGV4dF8gPSBhcHBDb250ZXh0OwogIHRoaXMuaWRfID0gaWQ7CiAgdGhpcy5uYW1lXyA9IG5hbWU7CiAgdGhpcy5waG9uZU51bWJlcl8gPSBwaG9uZU51bWJlcjsKICB0aGlzLnBob25lVHlwZV8gPSB0eXBlCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5waG9uZS5Gb3J3YXJkaW5nUGhvbmUsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKdGFsay5tZWRpYS5waG9uZS5Gb3J3YXJkaW5nUGhvbmUuRXZlbnRUeXBlID0ge05BTUVfQ0hBTkdFOiJOQyIsIE5VTUJFUl9DSEFOR0U6IkRDIiwgVkVSSUZJQ0FUSU9OX0NIQU5HRToiVkMifTsKdGFsay5tZWRpYS5waG9uZS5Gb3J3YXJkaW5nUGhvbmUuUGhvbmVUeXBlID0ge1VOS05PV046MCwgSE9NRToxLCBDRUxMOjIsIFdPUks6MywgU0lQOjQsIEdJWk1POjcsIEdPT0dMRV9UQUxLOjksIFFVSUNLX0FERDo5OX07CnRhbGsubWVkaWEucGhvbmUuRm9yd2FyZGluZ1Bob25lLnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJEZvcndhcmRpbmdQaG9uZSQkZ2V0SWQkKCkgewogIHJldHVybiB0aGlzLmlkXwp9Owp0YWxrLm1lZGlhLnBob25lLkZvcndhcmRpbmdQaG9uZS5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJEZvcndhcmRpbmdQaG9uZSQkZ2V0TmFtZSQoKSB7CiAgcmV0dXJuIHRoaXMubmFtZV8KfTsKdGFsay5tZWRpYS5waG9uZS5Gb3J3YXJkaW5nUGhvbmUucHJvdG90eXBlLmdldE51bWJlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJEZvcndhcmRpbmdQaG9uZSQkZ2V0TnVtYmVyJCgpIHsKICByZXR1cm4gdGhpcy5waG9uZU51bWJlcl8KfTsKdGFsay5tZWRpYS5waG9uZS5Gb3J3YXJkaW5nUGhvbmUucHJvdG90eXBlLmdldFR5cGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRGb3J3YXJkaW5nUGhvbmUkJGdldFR5cGUkKCkgewogIHJldHVybiB0aGlzLnBob25lVHlwZV8KfTsKdGFsay5tZWRpYS5waG9uZS5VcGRhdGVhYmxlRm9yd2FyZGluZ1Bob25lID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkVXBkYXRlYWJsZUZvcndhcmRpbmdQaG9uZSQoYXBwQ29udGV4dCwgaWQsIG5hbWUsIHBob25lTnVtYmVyLCB0eXBlLCBsYXN0VXNlLCBpc1ZlcmlmaWVkLCBpc1Ntc0VuYWJsZWQpIHsKICB0YWxrLm1lZGlhLnBob25lLkZvcndhcmRpbmdQaG9uZS5jYWxsKHRoaXMsIGFwcENvbnRleHQsIGlkLCBuYW1lLCBwaG9uZU51bWJlciwgdHlwZSwgbGFzdFVzZSwgaXNWZXJpZmllZCwgaXNTbXNFbmFibGVkKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEucGhvbmUuVXBkYXRlYWJsZUZvcndhcmRpbmdQaG9uZSwgdGFsay5tZWRpYS5waG9uZS5Gb3J3YXJkaW5nUGhvbmUpOwp0YWxrLm1lZGlhLnBob25lLkZvcndhcmRpbmdQaG9uZVNldCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJEZvcndhcmRpbmdQaG9uZVNldCQoYXBwQ29udGV4dCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5hcHBDb250ZXh0XyA9IGFwcENvbnRleHQKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLnBob25lLkZvcndhcmRpbmdQaG9uZVNldCwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwp0YWxrLm1lZGlhLnBob25lLkZvcndhcmRpbmdQaG9uZVNldC5FdmVudHMgPSB7Rk9SV0FSRElOR19QSE9ORVNfQ0hBTkdFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJmb3J3YXJkIil9Owp0YWxrLm1lZGlhLnBob25lLkZvcndhcmRpbmdQaG9uZVNldC5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkRm9yd2FyZGluZ1Bob25lU2V0JCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMuZGlzcG9zZVBob25lc18oKTsKICB0YWxrLm1lZGlhLnBob25lLkZvcndhcmRpbmdQaG9uZVNldC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLnBob25lLkZvcndhcmRpbmdQaG9uZVNldC5wcm90b3R5cGUuZGlzcG9zZVBob25lc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRGb3J3YXJkaW5nUGhvbmVTZXQkJGRpc3Bvc2VQaG9uZXNfJCgpIHsKICBpZih0aGlzLmZvcndhcmRpbmdQaG9uZXNfKSB7CiAgICBmb3IodmFyIHZhbHVlcyA9IHRoaXMuZm9yd2FyZGluZ1Bob25lc18uZ2V0VmFsdWVzKCksIGogPSAwO2ogPCB2YWx1ZXMubGVuZ3RoOysraikgewogICAgICBnb29nLmRpc3Bvc2UodmFsdWVzW2pdKQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5DYW5DYWxsID0ge307CnRhbGsubWVkaWEuQ2FuQ2FsbC5nZXRDYWxsTWFuYWdlckVycm9yID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FuQ2FsbCRnZXRDYWxsTWFuYWdlckVycm9yJChjYWxsTWFuYWdlciwgdHlwZSwgb3B0X2ppZCkgewogIGlmKCFjYWxsTWFuYWdlcikgewogICAgcmV0dXJuIHRhbGsubWVkaWEuQ2FsbGFibGVTdGF0ZS5ESVNBQkxFRF9QT0xJQ1kKICB9CiAgdmFyIGluc3RhbGxFcnJvciA9IGNhbGxNYW5hZ2VyLmdldEluc3RhbGxFcnJvclR5cGUoKTsKICByZXR1cm4gaW5zdGFsbEVycm9yID8gIWNhbGxNYW5hZ2VyLmdldENhbGxpbmdSZXF1aXJlbWVudHMoKS5pc0F2YWlsYWJsZUZvck9zKCkgPyB0YWxrLm1lZGlhLkNhbGxhYmxlU3RhdGUuSElEREVOX1VOQVZBSUxBQkxFIDogdGFsay5tZWRpYS5DYW5DYWxsLmdldEluc3RhbGxUeXBlXyhpbnN0YWxsRXJyb3IpIDogIWNhbGxNYW5hZ2VyLmNhbk1ha2VOZXdDYWxsV2l0aChvcHRfamlkKSA/IG9wdF9qaWQgJiYgY2FsbE1hbmFnZXIuaGFzQ2FsbFdpdGgob3B0X2ppZCkgPyB0YWxrLm1lZGlhLkNhbGxhYmxlU3RhdGUuRElTQUJMRURfSU5fQ0FMTF9KSUQgOiB0YWxrLm1lZGlhLkNhbGxhYmxlU3RhdGUuRElTQUJMRURfSU5fQ0FMTCA6IHR5cGUgIT0gdGFsay5tZWRpYS5DYWxsVHlwZUZvckRpc3BsYXkuVklERU8gJiYgIWNhbGxNYW5hZ2VyLmhhc0F1ZGlvU3BlYWtlckNhcGFiaWxpdGllcygpID8gdGFsay5tZWRpYS5DYWxsYWJsZVN0YXRlLk5PX0FVRElPX1NQRUFLRVJTIDogdHlwZSAhPSAKICB0YWxrLm1lZGlhLkNhbGxUeXBlRm9yRGlzcGxheS5WSURFTyAmJiAhY2FsbE1hbmFnZXIuaGFzQXVkaW9NaWNDYXBhYmlsaXRpZXMoKSA/IHRhbGsubWVkaWEuQ2FsbGFibGVTdGF0ZS5OT19BVURJT19NSUMgOiBudWxsCn07CnRhbGsubWVkaWEuQ2FuQ2FsbC5nZXRJbnN0YWxsVHlwZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYW5DYWxsJGdldEluc3RhbGxUeXBlXyQodHlwZSkgewogIHN3aXRjaCh0eXBlKSB7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuSW5zdGFsbE5lZWRlZFR5cGUuSU5TVEFMTF9QTFVHSU5fTkVFREVEOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5DYWxsYWJsZVN0YXRlLklOU1RBTExBQkxFOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkluc3RhbGxOZWVkZWRUeXBlLklOU1RBTExfRkxBU0hfTkVFREVEOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5DYWxsYWJsZVN0YXRlLklOU1RBTExBQkxFX0ZMQVNIOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkluc3RhbGxOZWVkZWRUeXBlLlVQR1JBREVfRkxBU0hfTkVFREVEOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5DYWxsYWJsZVN0YXRlLlVQR1JBREVfRkxBU0g7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbnVsbAogIH0KfTsKdGFsay5tZWRpYS5DYW5DYWxsLmdldFNpbXBsZUVycm9yTXNnXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbkNhbGwkZ2V0U2ltcGxlRXJyb3JNc2dfJChzdGF0ZSkgewogIHN3aXRjaChzdGF0ZSkgewogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxhYmxlU3RhdGUuTk9fQVVESU9fU1BFQUtFUlM6CiAgICAgIHJldHVybiJXZSBjb3VsZG4ndCBkZXRlY3QgYSBwcm9wZXIgYXVkaW8gc2V0dXAuIFBsZWFzZSBlbnN1cmUgeW91ciBzcGVha2VycyBhcmUgd29ya2luZyBhbmQgdHJ5IGFnYWluLiI7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbGFibGVTdGF0ZS5OT19BVURJT19NSUM6CiAgICAgIHJldHVybiJXZSBjb3VsZG4ndCBkZXRlY3QgYSBwcm9wZXIgYXVkaW8gc2V0dXAuIFBsZWFzZSBlbnN1cmUgeW91ciBtaWNyb3Bob25lIGlzIHdvcmtpbmcgYW5kIHRyeSBhZ2Fpbi4iCiAgfQp9OwpjaGF0LnV0aWxzLkhvc3RlZFVybFV0aWxzID0ge307CmNoYXQudXRpbHMuSG9zdGVkVXJsVXRpbHMuaXNQYWdlSG9zdGVkID0gZnVuY3Rpb24gJGNoYXQkdXRpbHMkSG9zdGVkVXJsVXRpbHMkaXNQYWdlSG9zdGVkJCh1cmwpIHsKICB2YXIgdXJpID0gbmV3IGdvb2cuVXJpKHVybCksIHBhdGggPSB1cmkuZ2V0UGF0aCgpOwogIHJldHVybiAwID09IHBhdGguaW5kZXhPZigiL2EvIikKfTsKY2hhdC51dGlscy5Ib3N0ZWRVcmxVdGlscy5nZXRIb3N0ZWREb21haW4gPSBmdW5jdGlvbiAkY2hhdCR1dGlscyRIb3N0ZWRVcmxVdGlscyRnZXRIb3N0ZWREb21haW4kKHVybCkgewogIGlmKGNoYXQudXRpbHMuSG9zdGVkVXJsVXRpbHMuaXNQYWdlSG9zdGVkKHVybCkpIHsKICAgIHZhciB1cmkgPSBuZXcgZ29vZy5VcmkodXJsKSwgcGF0aCA9IHVyaS5nZXRQYXRoKCksIGVuZFBvcyA9IHBhdGguaW5kZXhPZigiLyIsIDMpOwogICAgcmV0dXJuIDMgPD0gZW5kUG9zID8gcGF0aC5zdWJzdHJpbmcoMywgZW5kUG9zKSA6IHBhdGguc3Vic3RyaW5nKDMsIHBhdGgubGVuZ3RoKQogIH0KICByZXR1cm4iIgp9OwpjaGF0LnV0aWxzLkhvc3RlZFVybFV0aWxzLmhvc3RpZnlSb290UmVsYXRpdmVVUkwgPSBmdW5jdGlvbiAkY2hhdCR1dGlscyRIb3N0ZWRVcmxVdGlscyRob3N0aWZ5Um9vdFJlbGF0aXZlVVJMJChjb250ZXh0VXJsLCBzbmlwcGV0VXJsKSB7CiAgcmV0dXJuIGNoYXQudXRpbHMuSG9zdGVkVXJsVXRpbHMuaXNQYWdlSG9zdGVkKGNvbnRleHRVcmwpID8gIi9hLyIgKyBjaGF0LnV0aWxzLkhvc3RlZFVybFV0aWxzLmdldEhvc3RlZERvbWFpbihjb250ZXh0VXJsKSArICgwID09IHNuaXBwZXRVcmwuaW5kZXhPZigiLyIpID8gc25pcHBldFVybCA6ICIvIiArIHNuaXBwZXRVcmwpIDogc25pcHBldFVybAp9Owpnb29nLmxvY2FsZSA9IHt9Owpnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzID0ge0NPVU5UUlk6e0FEOiJBbmRvcnJhIiwgQUU6Ilx1MDYyN1x1MDY0NFx1MDYyN1x1MDY0NVx1MDYyN1x1MDYzMVx1MDYyN1x1MDYyYSBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjJhXHUwNjJkXHUwNjJmXHUwNjI5IiwgQUY6Ilx1MDYyN1x1MDY0MVx1MDYzYVx1MDYyN1x1MDY0Nlx1MDYzM1x1MDYyYVx1MDYyN1x1MDY0NiIsIEFHOiJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgQUk6IkFuZ3VpbGxhIiwgQUw6IlNocWlwXHUwMGVicmlhIiwgQU06Ilx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2MVx1MDU3ZFx1MDU3Zlx1MDU2MVx1MDU3Nlx1MDU2YiBcdTA1NDBcdTA1NjFcdTA1NzZcdTA1ODBcdTA1NjFcdTA1N2FcdTA1NjVcdTA1N2ZcdTA1NzhcdTA1ODJcdTA1NjlcdTA1NmJcdTA1ODJcdTA1NzYiLCBBTjoiTmVkZXJsYW5kc2UgQW50aWxsZW4iLCBBTzoiQW5nb2xhIiwgCkFROiJBbnRhcmN0aWNhIiwgQVI6IkFyZ2VudGluYSIsIEFTOiJBbWVyaWNhbiBTYW1vYSIsIEFUOiJcdTAwZDZzdGVycmVpY2giLCBBVToiQXVzdHJhbGlhIiwgQVc6IkFydWJhIiwgQVg6Ilx1MDBjNWxhbmQiLCBBWjoiQXpcdTAyNTlyYmF5Y2FuIiwgQkE6IkJvc25hIGkgSGVyY2Vnb3ZpbmEiLCBCQjoiQmFyYmFkb3MiLCBCRDoiXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlXHUwOWE2XHUwOWM3XHUwOWI2IiwgQkU6IkJlbGdpXHUwMGViIiwgQkY6IkJ1cmtpbmEgRmFzbyIsIEJHOiJcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0MzhcdTA0NGYiLCBCSDoiXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjJkXHUwNjMxXHUwNjRhXHUwNjQ2IiwgQkk6IkJ1cnVuZGkiLCBCSjoiQlx1MDBlOW5pbiIsIEJNOiJCZXJtdWRhIiwgQk46IkJydW5laSIsIEJPOiJCb2xpdmlhIiwgQlI6IkJyYXNpbCIsIEJTOiJCYWhhbWFzIiwgQlQ6Ilx1MDkyZFx1MDk0Mlx1MDkxZlx1MDkzZVx1MDkyOCIsIApCVjoiQm91dmV0IElzbGFuZCIsIEJXOiJCb3Rzd2FuYSIsIEJZOiJcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0NGMiLCBCWjoiQmVsaXplIiwgQ0E6IkNhbmFkYSIsIENDOiJDb2NvcyAoS2VlbGluZykgSXNsYW5kcyIsIENEOiJSXHUwMGU5cHVibGlxdWUgZFx1MDBlOW1vY3JhdGlxdWUgZHUgQ29uZ28iLCBDRjoiUlx1MDBlOXB1YmxpcXVlIGNlbnRyYWZyaWNhaW5lIiwgQ0c6IkNvbmdvIiwgQ0g6IlNjaHdlaXoiLCBDSToiQ1x1MDBmNHRlIGRcdTIwMTlJdm9pcmUiLCBDSzoiQ29vayBJc2xhbmRzIiwgQ0w6IkNoaWxlIiwgQ006IkNhbWVyb3VuIiwgQ046Ilx1NGUyZFx1NTZmZCIsIENPOiJDb2xvbWJpYSIsIENSOiJDb3N0YSBSaWNhIiwgQ1M6IlNlcmJpYSBhbmQgTW9udGVuZWdybyIsIENVOiJDdWJhIiwgQ1Y6IkNhYm8gVmVyZGUiLCBDWDoiQ2hyaXN0bWFzIElzbGFuZCIsIENZOiJcdTAzOWFcdTAzY2RcdTAzYzBcdTAzYzFcdTAzYmZcdTAzYzIiLCAKQ1o6Ilx1MDEwY2Vza1x1MDBlMSByZXB1Ymxpa2EiLCBERDoiRWFzdCBHZXJtYW55IiwgREU6IkRldXRzY2hsYW5kIiwgREo6IkphYnV1dGkiLCBESzoiRGFubWFyayIsIERNOiJEb21pbmljYSIsIERPOiJSZXBcdTAwZmFibGljYSBEb21pbmljYW5hIiwgRFo6Ilx1MDYyN1x1MDY0NFx1MDYyY1x1MDYzMlx1MDYyN1x1MDYyNlx1MDYzMSIsIEVDOiJFY3VhZG9yIiwgRUU6IkVlc3RpIiwgRUc6Ilx1MDY0NVx1MDYzNVx1MDYzMSIsIEVIOiJcdTA2MjdcdTA2NDRcdTA2MzVcdTA2MmRcdTA2MzFcdTA2MjdcdTA2MjEgXHUwNjI3XHUwNjQ0XHUwNjNhXHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5IiwgRVI6Ilx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyYVx1MDYzMVx1MDY0YVx1MDYyNyIsIEVTOiJFc3BhXHUwMGYxYSIsIEVUOiJcdTEyYTJcdTEyNzVcdTEyZWVcdTEzMzVcdTEyZWIiLCBGSToiU3VvbWkiLCBGSjoiXHUwOTJiXHUwOTNmXHUwOTFjXHUwOTQwIiwgRks6IkZhbGtsYW5kIElzbGFuZHMiLCAKRk06Ik1pY3JvbmVzaWEiLCBGTzoiRlx1MDBmOHJveWFyIiwgRlI6IkZyYW5jZSIsIEZYOiJNZXRyb3BvbGl0YW4gRnJhbmNlIiwgR0E6IkdhYm9uIiwgR0I6IlVuaXRlZCBLaW5nZG9tIiwgR0Q6IkdyZW5hZGEiLCBHRToiXHUxMGUxXHUxMGQwXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGQ1XHUxMGQ0XHUxMGRhXHUxMGRkIiwgR0Y6Ikd1eWFuZSBmcmFuXHUwMGU3YWlzZSIsIEdHOiJHdWVybnNleSIsIEdIOiJHaGFuYSIsIEdJOiJHaWJyYWx0YXIiLCBHTDoiS2FsYWFsbGl0IE51bmFhdCIsIEdNOiJHYW1iaWEiLCBHTjoiR3Vpblx1MDBlOWUiLCBHUDoiR3VhZGVsb3VwZSIsIEdROiJHdWluXHUwMGU5ZSBcdTAwZTlxdWF0b3JpYWxlIiwgR1I6Ilx1MDM5NVx1MDNiYlx1MDNiYlx1MDNhY1x1MDNiNFx1MDNiMSIsIEdTOiJTb3V0aCBHZW9yZ2lhIGFuZCB0aGUgU291dGggU2FuZHdpY2ggSXNsYW5kcyIsIEdUOiJHdWF0ZW1hbGEiLCBHVToiR3VhbSIsIEdXOiJHdWluXHUwMGU5IEJpc3NhdSIsIApHWToiR3V5YW5hIiwgSEs6Ilx1OTk5OVx1NmUyZiIsIEhNOiJIZWFyZCBJc2xhbmQgYW5kIE1jRG9uYWxkIElzbGFuZHMiLCBITjoiSG9uZHVyYXMiLCBIUjoiSHJ2YXRza2EiLCBIVDoiSGFcdTAwZWZ0aSIsIEhVOiJNYWd5YXJvcnN6XHUwMGUxZyIsIElEOiJJbmRvbmVzaWEiLCBJRToiSXJlbGFuZCIsIElMOiJcdTA1ZDlcdTA1ZTlcdTA1ZThcdTA1ZDBcdTA1ZGMiLCBJTToiSXNsZSBvZiBNYW4iLCBJTjoiXHUwOTJkXHUwOTNlXHUwOTMwXHUwOTI0IiwgSU86IkJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeSIsIElROiJcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjdcdTA2NDIiLCBJUjoiXHUwNjI3XHUwNmNjXHUwNjMxXHUwNjI3XHUwNjQ2IiwgSVM6Ilx1MDBjZHNsYW5kIiwgSVQ6Ikl0YWxpYSIsIEpFOiJKZXJzZXkiLCBKTToiSmFtYWljYSIsIEpPOiJcdTA2MjdcdTA2NDRcdTA2MjNcdTA2MzFcdTA2MmZcdTA2NDYiLCBKUDoiXHU2NWU1XHU2NzJjIiwgS0U6IktlbnlhIiwgCktHOiJcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2QiLCBLSDoiXHUxNzgwXHUxNzk4XHUxN2QyXHUxNzk2XHUxN2JiXHUxNzg3XHUxN2I2IiwgS0k6IktpcmliYXRpIiwgS006Ilx1MDYyY1x1MDYzMlx1MDYzMSBcdTA2MjdcdTA2NDRcdTA2NDJcdTA2NDVcdTA2MzEiLCBLTjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwgS1A6Ilx1Yzg3MFx1YzEyMCBcdWJiZmNcdWM4ZmNcdWM4ZmNcdWM3NTggXHVjNzc4XHViYmZjIFx1YWNmNVx1ZDY1NFx1YWQ2ZCIsIEtSOiJcdWIzMDBcdWQ1NWNcdWJiZmNcdWFkNmQiLCBLVzoiXHUwNjI3XHUwNjQ0XHUwNjQzXHUwNjQ4XHUwNjRhXHUwNjJhIiwgS1k6IkNheW1hbiBJc2xhbmRzIiwgS1o6Ilx1MDQxYVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQ0NVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZCIsIExBOiJcdTBlMjVcdTBlMzJcdTBlMjciLCBMQjoiXHUwNjQ0XHUwNjI4XHUwNjQ2XHUwNjI3XHUwNjQ2IiwgCkxDOiJTYWludCBMdWNpYSIsIExJOiJMaWVjaHRlbnN0ZWluIiwgTEs6Ilx1MGI4N1x1MGJiMlx1MGI5OVx1MGJjZFx1MGI5NVx1MGJjOCIsIExSOiJMaWJlcmlhIiwgTFM6Ikxlc290aG8iLCBMVDoiTGlldHV2YSIsIExVOiJMdXhlbWJvdXJnIiwgTFY6IkxhdHZpamEiLCBMWToiXHUwNjQ0XHUwNjRhXHUwNjI4XHUwNjRhXHUwNjI3IiwgTUE6Ilx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzYVx1MDYzMVx1MDYyOCIsIE1DOiJNb25hY28iLCBNRDoiTW9sZG92YSwgUmVwdWJsaWNhIiwgTUU6Ilx1MDQyNlx1MDQ0MFx1MDQzZFx1MDQzMCBcdTA0MTNcdTA0M2VcdTA0NDBcdTA0MzAiLCBNRzoiTWFkYWdhc2NhciIsIE1IOiJNYXJzaGFsbCBJc2xhbmRzIiwgTUs6Ilx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQzOFx1MDQ1OFx1MDQzMCIsIE1MOiJcdTA2NDVcdTA2MjdcdTA2NDRcdTA2NGEiLCBNTToiTXlhbm1hciIsIE1OOiJcdTg0OTlcdTUzZTQiLCBNTzoiXHU2ZmIzXHU5NWU4IiwgCk1QOiJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiLCBNUToiTWFydGluaXF1ZSIsIE1SOiJcdTA2NDVcdTA2NDhcdTA2MzFcdTA2NGFcdTA2MmFcdTA2MjdcdTA2NDZcdTA2NGFcdTA2MjciLCBNUzoiTW9udHNlcnJhdCIsIE1UOiJNYWx0YSIsIE1VOiJNYXVyaXRpdXMiLCBNVjoiTWFsZGl2ZXMiLCBNVzoiTWFsYXdpIiwgTVg6Ik1cdTAwZTl4aWNvIiwgTVk6Ik1hbGF5c2lhIiwgTVo6Ik1vXHUwMGU3YW1iaXF1ZSIsIE5BOiJOYW1pYmlhIiwgTkM6Ik5vdXZlbGxlLUNhbFx1MDBlOWRvbmllIiwgTkU6Ik5pZ2VyIiwgTkY6Ik5vcmZvbGsgSXNsYW5kIiwgTkc6Ik5pZ2VyaWEiLCBOSToiTmljYXJhZ3VhIiwgTkw6Ik5lZGVybGFuZCIsIE5POiJOb3JnZSIsIE5QOiJcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIiLCBOUjoiTmF1cnUiLCBOVDoiTmV1dHJhbCBab25lIiwgTlU6Ik5pdWUiLCBOWjoiTmV3IFplYWxhbmQiLCBPTToiXHUwNjM5XHUwNjQ1XHUwNjI3XHUwNjQ2IiwgUEE6IlBhbmFtXHUwMGUxIiwgClBFOiJQZXJcdTAwZmEiLCBQRjoiUG9seW5cdTAwZTlzaWUgZnJhblx1MDBlN2Fpc2UiLCBQRzoiUGFwdWEgTmV3IEd1aW5lYSIsIFBIOiJQaGlsaXBwaW5lcyIsIFBLOiJcdTA2N2VcdTA2MjdcdTA2YTlcdTA2MzNcdTA2MmFcdTA2MjdcdTA2NDYiLCBQTDoiUG9sc2thIiwgUE06IlNhaW50LVBpZXJyZS1ldC1NaXF1ZWxvbiIsIFBOOiJQaXRjYWlybiIsIFBSOiJQdWVydG8gUmljbyIsIFBTOiJcdTA2NDFcdTA2NDRcdTA2MzNcdTA2MzdcdTA2NGFcdTA2NDYiLCBQVDoiUG9ydHVnYWwiLCBQVzoiUGFsYXUiLCBQWToiUGFyYWd1YXkiLCBRQToiXHUwNjQyXHUwNjM3XHUwNjMxIiwgUU86Ik91dGx5aW5nIE9jZWFuaWEiLCBRVToiRXVyb3BlYW4gVW5pb24iLCBSRToiUlx1MDBlOXVuaW9uIiwgUk86IlJvbVx1MDBlMm5pYSIsIFJTOiJcdTA0MjFcdTA0NDBcdTA0MzFcdTA0MzhcdTA0NThcdTA0MzAiLCBSVToiXHUwNDIwXHUwNDNlXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDRmIiwgUlc6IlJ3YW5kYSIsIApTQToiXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQ1XHUwNjQ0XHUwNjQzXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MzNcdTA2MzlcdTA2NDhcdTA2MmZcdTA2NGFcdTA2MjkiLCBTQjoiU29sb21vbiBJc2xhbmRzIiwgU0M6IlNleWNoZWxsZXMiLCBTRDoiXHUwNjI3XHUwNjQ0XHUwNjMzXHUwNjQ4XHUwNjJmXHUwNjI3XHUwNjQ2IiwgU0U6IlN2ZXJpZ2UiLCBTRzoiXHU2NWIwXHU1MmEwXHU1NzYxIiwgU0g6IlNhaW50IEhlbGVuYSIsIFNJOiJTbG92ZW5pamEiLCBTSjoiU3ZhbGJhcmQgb2cgSmFuIE1heWVuIiwgU0s6IlNsb3ZlbnNrXHUwMGUxIHJlcHVibGlrYSIsIFNMOiJTaWVycmEgTGVvbmUiLCBTTToiU2FuIE1hcmlubyIsIFNOOiJTXHUwMGU5blx1MDBlOWdhbCIsIFNPOiJTb21hbGkiLCBTUjoiU3VyaW5hbWUiLCBTVDoiU1x1MDBlM28gVG9tXHUwMGU5IGUgUHJcdTAwZWRuY2lwZSIsIFNVOiJVbmlvbiBvZiBTb3ZpZXQgU29jaWFsaXN0IFJlcHVibGljcyIsIApTVjoiRWwgU2FsdmFkb3IiLCBTWToiXHUwNjMzXHUwNjQ4XHUwNjMxXHUwNjRhXHUwNjI3IiwgU1o6IlN3YXppbGFuZCIsIFRDOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLCBURDoiXHUwNjJhXHUwNjM0XHUwNjI3XHUwNjJmIiwgVEY6IkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsIFRHOiJUb2dvIiwgVEg6Ilx1MGUxYlx1MGUyM1x1MGUzMFx1MGU0MFx1MGUxN1x1MGUyOFx1MGU0NFx1MGUxN1x1MGUyMiIsIFRKOiJcdTA2MmFcdTA2MjdcdTA2MmNcdTA2Y2NcdTA2YTlcdTA2MzNcdTA2MmFcdTA2MjdcdTA2NDYiLCBUSzoiVG9rZWxhdSIsIFRMOiJUaW1vciBMZXN0ZSIsIFRNOiJcdTA0MjJcdTA0NDNcdTA0NDBcdTA0M2FcdTA0M2NcdTA0MzVcdTA0M2RcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2QiLCBUTjoiXHUwNjJhXHUwNjQ4XHUwNjQ2XHUwNjMzIiwgVE86IlRvbmdhIiwgVFI6IlRcdTAwZmNya2l5ZSIsIFRUOiJUcmluaWRhZCB5IFRvYmFnbyIsIFRWOiJUdXZhbHUiLCAKVFc6Ilx1NTNmMFx1NmU3ZSIsIFRaOiJUYW56YW5pYSIsIFVBOiJcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0MzAiLCBVRzoiVWdhbmRhIiwgVU06IlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsIFVTOiJVbml0ZWQgU3RhdGVzIiwgVVk6IlVydWd1YXkiLCBVWjoiXHUwNDBlXHUwNDM3XHUwNDMxXHUwNDM1XHUwNDNhXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNlXHUwNDNkIiwgVkE6IlZhdGljYW5vIiwgVkM6IlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwgVkU6IlZlbmV6dWVsYSIsIFZHOiJCcml0aXNoIFZpcmdpbiBJc2xhbmRzIiwgVkk6IlUuUy4gVmlyZ2luIElzbGFuZHMiLCBWTjoiVmlcdTFlYzd0IE5hbSIsIFZVOiJWYW51YXR1IiwgV0Y6IldhbGxpcy1ldC1GdXR1bmEiLCBXUzoiU2Ftb2EiLCBZRDoiUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBZZW1lbiIsIFlFOiJcdTA2MjdcdTA2NDRcdTA2NGFcdTA2NDVcdTA2NDYiLCAKWVQ6Ik1heW90dGUiLCBaQToiU291dGggQWZyaWNhIiwgWk06IlphbWJpYSIsIFpXOiJaaW1iYWJ3ZSIsIFpaOiJVbmtub3duIG9yIEludmFsaWQgUmVnaW9uIiwgYWFfREo6IkphYnV1dGkiLCBhYV9FUjoiXHUwMGM5cnl0aHJcdTAwZTllIiwgYWFfRVJfU0FBSE86Ilx1MDBjOXJ5dGhyXHUwMGU5ZSIsIGFhX0VUOiJJdG9vcGhpeWFhIiwgYWZfTkE6Ik5hbWliaVx1MDBlYiIsIGFmX1pBOiJTdWlkLUFmcmlrYSIsIGFrX0dIOiJHaGFuYSIsIGFtX0VUOiJcdTEyYTJcdTEyNzVcdTEyZWVcdTEzMzVcdTEyZWIiLCBhcl9BRToiXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjQ1XHUwNjI3XHUwNjMxXHUwNjI3XHUwNjJhIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MmFcdTA2MmRcdTA2MmZcdTA2MjkiLCBhcl9CSDoiXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjJkXHUwNjMxXHUwNjRhXHUwNjQ2IiwgYXJfREo6Ilx1MDYyY1x1MDY0YVx1MDYyOFx1MDY0OFx1MDYyYVx1MDY0YSIsIAphcl9EWjoiXHUwNjI3XHUwNjQ0XHUwNjJjXHUwNjMyXHUwNjI3XHUwNjI2XHUwNjMxIiwgYXJfRUc6Ilx1MDY0NVx1MDYzNVx1MDYzMSIsIGFyX0VIOiJcdTA2MjdcdTA2NDRcdTA2MzVcdTA2MmRcdTA2MzFcdTA2MjdcdTA2MjEgXHUwNjI3XHUwNjQ0XHUwNjNhXHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5IiwgYXJfRVI6Ilx1MDYyN1x1MDYzMVx1MDY0YVx1MDYyYVx1MDYzMVx1MDY0YVx1MDYyNyIsIGFyX0lMOiJcdTA2MjdcdTA2MzNcdTA2MzFcdTA2MjdcdTA2MjZcdTA2NGFcdTA2NDQiLCBhcl9JUToiXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI3XHUwNjQyIiwgYXJfSk86Ilx1MDYyN1x1MDY0NFx1MDYyM1x1MDYzMVx1MDYyZlx1MDY0NiIsIGFyX0tNOiJcdTA2MmNcdTA2MzJcdTA2MzEgXHUwNjI3XHUwNjQ0XHUwNjQyXHUwNjQ1XHUwNjMxIiwgYXJfS1c6Ilx1MDYyN1x1MDY0NFx1MDY0M1x1MDY0OFx1MDY0YVx1MDYyYSIsIGFyX0xCOiJcdTA2NDRcdTA2MjhcdTA2NDZcdTA2MjdcdTA2NDYiLCAKYXJfTFk6Ilx1MDY0NFx1MDY0YVx1MDYyOFx1MDY0YVx1MDYyNyIsIGFyX01BOiJcdTA2MjdcdTA2NDRcdTA2NDVcdTA2M2FcdTA2MzFcdTA2MjgiLCBhcl9NUjoiXHUwNjQ1XHUwNjQ4XHUwNjMxXHUwNjRhXHUwNjJhXHUwNjI3XHUwNjQ2XHUwNjRhXHUwNjI3IiwgYXJfT006Ilx1MDYzOVx1MDY0NVx1MDYyN1x1MDY0NiIsIGFyX1BTOiJcdTA2NDFcdTA2NDRcdTA2MzNcdTA2MzdcdTA2NGFcdTA2NDYiLCBhcl9RQToiXHUwNjQyXHUwNjM3XHUwNjMxIiwgYXJfU0E6Ilx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NVx1MDY0NFx1MDY0M1x1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjMzXHUwNjM5XHUwNjQ4XHUwNjJmXHUwNjRhXHUwNjI5IiwgYXJfU0Q6Ilx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0OFx1MDYyZlx1MDYyN1x1MDY0NiIsIGFyX1NZOiJcdTA2MzNcdTA2NDhcdTA2MzFcdTA2NGFcdTA2MjciLCBhcl9URDoiXHUwNjJhXHUwNjM0XHUwNjI3XHUwNjJmIiwgCmFyX1ROOiJcdTA2MmFcdTA2NDhcdTA2NDZcdTA2MzMiLCBhcl9ZRToiXHUwNjI3XHUwNjQ0XHUwNjRhXHUwNjQ1XHUwNjQ2IiwgYXNfSU46Ilx1MDlhZFx1MDliZVx1MDlmMFx1MDlhNCIsIGF5X0JPOiJCb2xpdmlhIiwgYXpfQVo6IkF6XHUwMjU5cmJheWNhbiIsIGF6X0N5cmxfQVo6Ilx1MDQxMFx1MDQzN1x1MDRkOVx1MDQ0MFx1MDQzMVx1MDQzMFx1MDQ1OFx1MDRiOVx1MDQzMFx1MDQzZCIsIGF6X0xhdG5fQVo6IkF6ZXJiYXljYW4iLCBiZV9CWToiXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDRjIiwgYmdfQkc6Ilx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ0ZiIsIGJpX1ZVOiJWYW51YXR1IiwgYm5fQkQ6Ilx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZVx1MDlhNlx1MDljN1x1MDliNiIsIGJuX0lOOiJcdTA5YWRcdTA5YmVcdTA5YjBcdTA5YTQiLCBib19DTjoiXHUwZjYyXHUwZjkyXHUwZmIxXHUwZjBiXHUwZjUzXHUwZjQyIiwgCmJvX0lOOiJcdTBmNjJcdTBmOTJcdTBmYjFcdTBmMGJcdTBmNDJcdTBmNjJcdTBmMGIiLCBic19CQToiQm9zbmEgaSBIZXJjZWdvdmluYSIsIGJ5bl9FUjoiXHUxMmE0XHUxMjJkXHUxMjc1XHUxMjJiIiwgY2FfQUQ6IkFuZG9ycmEiLCBjYV9FUzoiRXNwYW55YSIsIGNjaF9ORzoiTmlnZXJpYSIsIGNoX0dVOiJHdWFtIiwgY2hrX0ZNOiJNaWNyb25lc2lhIiwgY29wX0FyYWJfRUc6Ilx1MDY0NVx1MDYzNVx1MDYzMSIsIGNvcF9BcmFiX1VTOiJcdTA2MjdcdTA2NDRcdTA2NDhcdTA2NDRcdTA2MjdcdTA2NGFcdTA2MjdcdTA2MmEgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjJhXHUwNjJkXHUwNjJmXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0NVx1MDYzMVx1MDY0YVx1MDY0M1x1MDY0YVx1MDYyOSIsIGNvcF9FRzoiXHUwNjQ1XHUwNjM1XHUwNjMxIiwgY29wX1VTOiJcdTA2MjdcdTA2NDRcdTA2NDhcdTA2NDRcdTA2MjdcdTA2NGFcdTA2MjdcdTA2MmEgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjJhXHUwNjJkXHUwNjJmXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0NVx1MDYzMVx1MDY0YVx1MDY0M1x1MDY0YVx1MDYyOSIsIApjc19DWjoiXHUwMTBjZXNrXHUwMGUxIHJlcHVibGlrYSIsIGN5X0dCOiJQcnlkYWluIEZhd3IiLCBkYV9ESzoiRGFubWFyayIsIGRhX0dMOiJHclx1MDBmOG5sYW5kIiwgZGVfQVQ6Ilx1MDBkNnN0ZXJyZWljaCIsIGRlX0JFOiJCZWxnaWVuIiwgZGVfQ0g6IlNjaHdlaXoiLCBkZV9ERToiRGV1dHNjaGxhbmQiLCBkZV9MSToiTGllY2h0ZW5zdGVpbiIsIGRlX0xVOiJMdXhlbWJ1cmciLCBkdl9NVjoiTWFsZGl2ZXMiLCBkel9CVDoiQmh1dGFuIiwgZWVfR0g6IkdoYW5hIiwgZWVfVEc6IlRvZ28iLCBlZmlfTkc6Ik5pZ2VyaWEiLCBlbF9DWToiXHUwMzlhXHUwM2NkXHUwM2MwXHUwM2MxXHUwM2JmXHUwM2MyIiwgZWxfR1I6Ilx1MDM5NVx1MDNiYlx1MDNiYlx1MDNhY1x1MDNiNFx1MDNiMSIsIGVuX0FHOiJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgZW5fQUk6IkFuZ3VpbGxhIiwgZW5fQVM6IkFtZXJpY2FuIFNhbW9hIiwgZW5fQVU6IkF1c3RyYWxpYSIsIGVuX0JCOiJCYXJiYWRvcyIsIGVuX0JFOiJCZWxnaXVtIiwgCmVuX0JNOiJCZXJtdWRhIiwgZW5fQlM6IkJhaGFtYXMiLCBlbl9CVzoiQm90c3dhbmEiLCBlbl9CWjoiQmVsaXplIiwgZW5fQ0E6IkNhbmFkYSIsIGVuX0NDOiJDb2NvcyBJc2xhbmRzIiwgZW5fQ0s6IkNvb2sgSXNsYW5kcyIsIGVuX0NNOiJDYW1lcm9vbiIsIGVuX0NYOiJDaHJpc3RtYXMgSXNsYW5kIiwgZW5fRE06IkRvbWluaWNhIiwgZW5fRko6IkZpamkiLCBlbl9GSzoiRmFsa2xhbmQgSXNsYW5kcyIsIGVuX0ZNOiJNaWNyb25lc2lhIiwgZW5fR0I6IlVuaXRlZCBLaW5nZG9tIiwgZW5fR0Q6IkdyZW5hZGEiLCBlbl9HRzoiR3Vlcm5zZXkiLCBlbl9HSDoiR2hhbmEiLCBlbl9HSToiR2licmFsdGFyIiwgZW5fR006IkdhbWJpYSIsIGVuX0dVOiJHdWFtIiwgZW5fR1k6Ikd1eWFuYSIsIGVuX0hLOiJIb25nIEtvbmciLCBlbl9ITjoiSG9uZHVyYXMiLCBlbl9JRToiSXJlbGFuZCIsIGVuX0lNOiJJc2xlIG9mIE1hbiIsIGVuX0lOOiJJbmRpYSIsIGVuX0pFOiJKZXJzZXkiLCBlbl9KTToiSmFtYWljYSIsIAplbl9LRToiS2VueWEiLCBlbl9LSToiS2lyaWJhdGkiLCBlbl9LTjoiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwgZW5fS1k6IkNheW1hbiBJc2xhbmRzIiwgZW5fTEM6IlNhaW50IEx1Y2lhIiwgZW5fTFI6IkxpYmVyaWEiLCBlbl9MUzoiTGVzb3RobyIsIGVuX01IOiJNYXJzaGFsbCBJc2xhbmRzIiwgZW5fTVA6Ik5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyIsIGVuX01TOiJNb250c2VycmF0IiwgZW5fTVQ6Ik1hbHRhIiwgZW5fTVU6Ik1hdXJpdGl1cyIsIGVuX01XOiJNYWxhd2kiLCBlbl9OQToiTmFtaWJpYSIsIGVuX05GOiJOb3Jmb2xrIElzbGFuZCIsIGVuX05HOiJOaWdlcmlhIiwgZW5fTlI6Ik5hdXJ1IiwgZW5fTlU6Ik5pdWUiLCBlbl9OWjoiTmV3IFplYWxhbmQiLCBlbl9QRzoiUGFwdWEgTmV3IEd1aW5lYSIsIGVuX1BIOiJQaGlsaXBwaW5lcyIsIGVuX1BLOiJQYWtpc3RhbiIsIGVuX1BOOiJQaXRjYWlybiIsIGVuX1BSOiJQdWVydG8gUmljbyIsIGVuX1JXOiJSd2FuZGEiLCAKZW5fU0I6IlNvbG9tb24gSXNsYW5kcyIsIGVuX1NDOiJTZXljaGVsbGVzIiwgZW5fU0c6IlNpbmdhcG9yZSIsIGVuX1NIOiJTYWludCBIZWxlbmEiLCBlbl9TTDoiU2llcnJhIExlb25lIiwgZW5fU1o6IlN3YXppbGFuZCIsIGVuX1RDOiJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLCBlbl9USzoiVG9rZWxhdSIsIGVuX1RPOiJUb25nYSIsIGVuX1RUOiJUcmluaWRhZCBhbmQgVG9iYWdvIiwgZW5fVFY6IlR1dmFsdSIsIGVuX1RaOiJUYW56YW5pYSIsIGVuX1VHOiJVZ2FuZGEiLCBlbl9VTToiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwgZW5fVVM6IlVuaXRlZCBTdGF0ZXMiLCBlbl9VU19QT1NJWDoiVW5pdGVkIFN0YXRlcyIsIGVuX1ZDOiJTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcyIsIGVuX1ZHOiJCcml0aXNoIFZpcmdpbiBJc2xhbmRzIiwgZW5fVkk6IlUuUy4gVmlyZ2luIElzbGFuZHMiLCBlbl9WVToiVmFudWF0dSIsIGVuX1dTOiJTYW1vYSIsIAplbl9aQToiU291dGggQWZyaWNhIiwgZW5fWk06IlphbWJpYSIsIGVuX1pXOiJaaW1iYWJ3ZSIsIGVzX0FSOiJBcmdlbnRpbmEiLCBlc19CTzoiQm9saXZpYSIsIGVzX0NMOiJDaGlsZSIsIGVzX0NPOiJDb2xvbWJpYSIsIGVzX0NSOiJDb3N0YSBSaWNhIiwgZXNfQ1U6IkN1YmEiLCBlc19ETzoiUmVwXHUwMGZhYmxpY2EgRG9taW5pY2FuYSIsIGVzX0VDOiJFY3VhZG9yIiwgZXNfRVM6IkVzcGFcdTAwZjFhIiwgZXNfR1E6Ikd1aW5lYSBFY3VhdG9yaWFsIiwgZXNfR1Q6Ikd1YXRlbWFsYSIsIGVzX0hOOiJIb25kdXJhcyIsIGVzX01YOiJNXHUwMGU5eGljbyIsIGVzX05JOiJOaWNhcmFndWEiLCBlc19QQToiUGFuYW1cdTAwZTEiLCBlc19QRToiUGVyXHUwMGZhIiwgZXNfUEg6IkZpbGlwaW5hcyIsIGVzX1BSOiJQdWVydG8gUmljbyIsIGVzX1BZOiJQYXJhZ3VheSIsIGVzX1NWOiJFbCBTYWx2YWRvciIsIGVzX1VTOiJFc3RhZG9zIFVuaWRvcyIsIGVzX1VZOiJVcnVndWF5IiwgZXNfVkU6IlZlbmV6dWVsYSIsIApldF9FRToiRWVzdGkiLCBldV9FUzoiRXNwYWluaWEiLCBmYV9BRjoiXHUwNjI3XHUwNjQxXHUwNjNhXHUwNjI3XHUwNjQ2XHUwNjMzXHUwNjJhXHUwNjI3XHUwNjQ2IiwgZmFfSVI6Ilx1MDYyN1x1MDZjY1x1MDYzMVx1MDYyN1x1MDY0NiIsIGZpX0ZJOiJTdW9taSIsIGZpbF9QSDoiUGhpbGlwcGluZXMiLCBmal9GSjoiRmlqaSIsIGZvX0ZPOiJGXHUwMGY4cm95YXIiLCBmcl9CRToiQmVsZ2lxdWUiLCBmcl9CRjoiQnVya2luYSBGYXNvIiwgZnJfQkk6IkJ1cnVuZGkiLCBmcl9CSjoiQlx1MDBlOW5pbiIsIGZyX0NBOiJDYW5hZGEiLCBmcl9DRDoiUlx1MDBlOXB1YmxpcXVlIGRcdTAwZTltb2NyYXRpcXVlIGR1IENvbmdvIiwgZnJfQ0Y6IlJcdTAwZTlwdWJsaXF1ZSBjZW50cmFmcmljYWluZSIsIGZyX0NHOiJDb25nbyIsIGZyX0NIOiJTdWlzc2UiLCBmcl9DSToiQ1x1MDBmNHRlIGRcdTIwMTlJdm9pcmUiLCBmcl9DTToiQ2FtZXJvdW4iLCBmcl9ESjoiRGppYm91dGkiLCBmcl9EWjoiQWxnXHUwMGU5cmllIiwgCmZyX0ZSOiJGcmFuY2UiLCBmcl9HQToiR2Fib24iLCBmcl9HRjoiR3V5YW5lIGZyYW5cdTAwZTdhaXNlIiwgZnJfR046Ikd1aW5cdTAwZTllIiwgZnJfR1A6Ikd1YWRlbG91cGUiLCBmcl9HUToiR3Vpblx1MDBlOWUgXHUwMGU5cXVhdG9yaWFsZSIsIGZyX0hUOiJIYVx1MDBlZnRpIiwgZnJfS006IkNvbW9yZXMiLCBmcl9MVToiTHV4ZW1ib3VyZyIsIGZyX01BOiJNYXJvYyIsIGZyX01DOiJNb25hY28iLCBmcl9NRzoiTWFkYWdhc2NhciIsIGZyX01MOiJNYWxpIiwgZnJfTVE6Ik1hcnRpbmlxdWUiLCBmcl9NVToiTWF1cmljZSIsIGZyX05DOiJOb3V2ZWxsZS1DYWxcdTAwZTlkb25pZSIsIGZyX05FOiJOaWdlciIsIGZyX1BGOiJQb2x5blx1MDBlOXNpZSBmcmFuXHUwMGU3YWlzZSIsIGZyX1BNOiJTYWludC1QaWVycmUtZXQtTWlxdWVsb24iLCBmcl9SRToiUlx1MDBlOXVuaW9uIiwgZnJfUlc6IlJ3YW5kYSIsIGZyX1NDOiJTZXljaGVsbGVzIiwgZnJfU046IlNcdTAwZTluXHUwMGU5Z2FsIiwgCmZyX1NZOiJTeXJpZSIsIGZyX1REOiJUY2hhZCIsIGZyX1RHOiJUb2dvIiwgZnJfVE46IlR1bmlzaWUiLCBmcl9WVToiVmFudWF0dSIsIGZyX1dGOiJXYWxsaXMtZXQtRnV0dW5hIiwgZnJfWVQ6Ik1heW90dGUiLCBmdXJfSVQ6Ikl0YWxpYSIsIGdhX0lFOiJcdTAwYzlpcmUiLCBnYWFfR0g6IkdoYW5hIiwgZ2V6X0VSOiJcdTEyYTRcdTEyMmRcdTEyNzVcdTEyMmIiLCBnZXpfRVQ6Ilx1MTJhMlx1MTI3NVx1MTJlZVx1MTMzNVx1MTJlYiIsIGdpbF9LSToiS2lyaWJhdGkiLCBnbF9FUzoiRXNwYVx1MDBmMWEiLCBnbl9QWToiUGFyYWd1YXkiLCBndV9JTjoiXHUwYWFkXHUwYWJlXHUwYWIwXHUwYWE0IiwgZ3ZfR0I6IlJ5d3ZhbmV0aCBVbnlzIiwgaGFfQXJhYl9ORzoiXHUwNjQ2XHUwNjRhXHUwNjJjXHUwNjRhXHUwNjMxXHUwNjRhXHUwNjI3IiwgaGFfR0g6Ilx1MDYzYVx1MDYyN1x1MDY0Nlx1MDYyNyIsIGhhX0xhdG5fR0g6IkdoYW5hIiwgaGFfTGF0bl9ORToiTmlnZXIiLCBoYV9MYXRuX05HOiJOaWdcdTAwZTlyaWEiLCAKaGFfTkU6Ilx1MDYyN1x1MDY0NFx1MDY0Nlx1MDY0YVx1MDYyY1x1MDYzMSIsIGhhX05HOiJcdTA2NDZcdTA2NGFcdTA2MmNcdTA2NGFcdTA2MzFcdTA2NGFcdTA2MjciLCBoYXdfVVM6Ilx1MDJiYkFtZWxpa2EgSHVpIFBcdTAxNmIgXHUwMmJiSWEiLCBoZV9JTDoiXHUwNWQ5XHUwNWU5XHUwNWU4XHUwNWQwXHUwNWRjIiwgaGlfSU46Ilx1MDkyZFx1MDkzZVx1MDkzMFx1MDkyNCIsIGhvX1BHOiJQYXB1YSBOZXcgR3VpbmVhIiwgaHJfQkE6IkJvc25hIGkgSGVyY2Vnb3ZpbmEiLCBocl9IUjoiSHJ2YXRza2EiLCBodF9IVDoiSGFcdTAwZWZ0aSIsIGh1X0hVOiJNYWd5YXJvcnN6XHUwMGUxZyIsIGh5X0FNOiJcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjFcdTA1N2RcdTA1N2ZcdTA1NjFcdTA1NzZcdTA1NmIgXHUwNTQwXHUwNTYxXHUwNTc2XHUwNTgwXHUwNTYxXHUwNTdhXHUwNTY1XHUwNTdmXHUwNTc4XHUwNTgyXHUwNTY5XHUwNTZiXHUwNTgyXHUwNTc2IiwgaHlfQU1fUkVWSVNFRDoiXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTYxXHUwNTdkXHUwNTdmXHUwNTYxXHUwNTc2XHUwNTZiIFx1MDU0MFx1MDU2MVx1MDU3Nlx1MDU4MFx1MDU2MVx1MDU3YVx1MDU2NVx1MDU3Zlx1MDU3OFx1MDU4Mlx1MDU2OVx1MDU2Ylx1MDU4Mlx1MDU3NiIsIAppZF9JRDoiSW5kb25lc2lhIiwgaWdfTkc6Ik5pZ2VyaWEiLCBpaV9DTjoiXHVhMzRmXHVhMWU5IiwgaXNfSVM6Ilx1MDBjZHNsYW5kIiwgaXRfQ0g6IlN2aXp6ZXJhIiwgaXRfSVQ6Ikl0YWxpYSIsIGl0X1NNOiJTYW4gTWFyaW5vIiwgamFfSlA6Ilx1NjVlNVx1NjcyYyIsIGthX0dFOiJcdTEwZTFcdTEwZDBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZDVcdTEwZDRcdTEwZGFcdTEwZGQiLCBrYWpfTkc6Ik5pZ2VyaWEiLCBrYW1fS0U6IktlbnlhIiwga2NnX05HOiJOaWdlcmlhIiwga2ZvX05HOiJOaWdcdTAwZTlyaWEiLCBra19LWjoiXHUwNDlhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDliXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNkIiwga2xfR0w6IkthbGFhbGxpdCBOdW5hYXQiLCBrbV9LSDoiXHUxNzgwXHUxNzk4XHUxN2QyXHUxNzk2XHUxN2JiXHUxNzg3XHUxN2I2Iiwga25fSU46Ilx1MGNhZFx1MGNiZVx1MGNiMFx1MGNhNCIsIGtvX0tQOiJcdWM4NzBcdWMxMjAgXHViYmZjXHVjOGZjXHVjOGZjXHVjNzU4IFx1Yzc3OFx1YmJmYyBcdWFjZjVcdWQ2NTRcdWFkNmQiLCAKa29fS1I6Ilx1YjMwMFx1ZDU1Y1x1YmJmY1x1YWQ2ZCIsIGtva19JTjoiXHUwOTJkXHUwOTNlXHUwOTMwXHUwOTI0Iiwga29zX0ZNOiJNaWNyb25lc2lhIiwga3BlX0dOOiJHdWluXHUwMGU5ZSIsIGtwZV9MUjoiTGliXHUwMGU5cmlhIiwga3NfSU46Ilx1MDkyZFx1MDkzZVx1MDkzMFx1MDkyNCIsIGt1X0lROiJJcmFrIiwga3VfSVI6Ilx1MDEzMHJhbiIsIGt1X0xhdG5fSVE6IklyYWsiLCBrdV9MYXRuX0lSOiJcdTAxMzByYW4iLCBrdV9MYXRuX1NZOiJTdXJpeWUiLCBrdV9MYXRuX1RSOiJUXHUwMGZjcmtpeWUiLCBrdV9TWToiU3VyaXllIiwga3VfVFI6IlRcdTAwZmNya2l5ZSIsIGt3X0dCOiJSeXd2YW5ldGggVW55cyIsIGt5X0N5cmxfS0c6Ilx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZCIsIGt5X0tHOiJLXHUwMTMxcmdcdTAxMzF6aXN0YW4iLCBsYV9WQToiVmF0aWNhbm8iLCBsYl9MVToiTHV4ZW1ib3VyZyIsIGxuX0NEOiJSXHUwMGU5cHVibGlxdWUgZFx1MDBlOW1vY3JhdGlxdWUgZHUgQ29uZ28iLCAKbG5fQ0c6IktvbmdvIiwgbG9fTEE6Ikxhb3MiLCBsdF9MVDoiTGlldHV2YSIsIGx2X0xWOiJMYXR2aWphIiwgbWdfTUc6Ik1hZGFnYXNjYXIiLCBtaF9NSDoiTWFyc2hhbGwgSXNsYW5kcyIsIG1pX05aOiJOZXcgWmVhbGFuZCIsIG1rX01LOiJcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0MzhcdTA0NThcdTA0MzAiLCBtbF9JTjoiXHUwZDA3XHUwZDI4XHUwZDRkXHUwZDI0XHUwZDRkXHUwZDJmIiwgbW5fQ3lybF9NTjoiXHUwNDFjXHUwNDNlXHUwNDNkXHUwNDMzXHUwNDNlXHUwNDNiXHUwNDM4XHUwNDRmIiwgbW5fTU46Ilx1MDQxY1x1MDQzZVx1MDQzZFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQzOFx1MDQ0ZiIsIG1yX0lOOiJcdTA5MmRcdTA5M2VcdTA5MzBcdTA5MjQiLCBtc19CTjoiQnJ1bmVpIiwgbXNfTVk6Ik1hbGF5c2lhIiwgbXNfU0c6IlNpbmdhcHVyYSIsIG10X01UOiJNYWx0YSIsIG15X01NOiJNeWFubWFyIiwgbmFfTlI6Ik5hdXJ1IiwgCm5iX05POiJOb3JnZSIsIG5iX1NKOiJTdmFsYmFyZCBvZyBKYW4gTWF5ZW4iLCBuZV9OUDoiXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIiwgbml1X05VOiJOaXVlIiwgbmxfQU46Ik5lZGVybGFuZHNlIEFudGlsbGVuIiwgbmxfQVc6IkFydWJhIiwgbmxfQkU6IkJlbGdpXHUwMGViIiwgbmxfTkw6Ik5lZGVybGFuZCIsIG5sX1NSOiJTdXJpbmFtZSIsIG5uX05POiJOb3JlZyIsIG5yX1pBOiJTb3V0aCBBZnJpY2EiLCBuc29fWkE6IlNvdXRoIEFmcmljYSIsIG55X01XOiJNYWxhd2kiLCBvbV9FVDoiSXRvb3BoaXlhYSIsIG9tX0tFOiJLZWVuaXlhYSIsIG9yX0lOOiJcdTBiMmRcdTBiM2VcdTBiMzBcdTBiMjQiLCBwYV9BcmFiX1BLOiJcdTA2N2VcdTA2MjdcdTA2YTlcdTA2MzNcdTA2MmFcdTA2MjdcdTA2NDYiLCBwYV9HdXJ1X0lOOiJcdTBhMmRcdTBhM2VcdTBhMzBcdTBhMjQiLCBwYV9JTjoiXHUwYTJkXHUwYTNlXHUwYTMwXHUwYTI0IiwgcGFfUEs6Ilx1MDY3ZVx1MDYyN1x1MDZhOVx1MDYzM1x1MDYyYVx1MDYyN1x1MDY0NiIsIApwYXBfQU46Ik5lZGVybGFuZHNlIEFudGlsbGVuIiwgcGF1X1BXOiJQYWxhdSIsIHBsX1BMOiJQb2xza2EiLCBwb25fRk06Ik1pY3JvbmVzaWEiLCBwc19BRjoiXHUwNjI3XHUwNjQxXHUwNjNhXHUwNjI3XHUwNjQ2XHUwNjMzXHUwNjJhXHUwNjI3XHUwNjQ2IiwgcHRfQU86IkFuZ29sYSIsIHB0X0JSOiJCcmFzaWwiLCBwdF9DVjoiQ2FibyBWZXJkZSIsIHB0X0dXOiJHdWluXHUwMGU5IEJpc3NhdSIsIHB0X01aOiJNb1x1MDBlN2FtYmlxdWUiLCBwdF9QVDoiUG9ydHVnYWwiLCBwdF9TVDoiU1x1MDBlM28gVG9tXHUwMGU5IGUgUHJcdTAwZWRuY2lwZSIsIHB0X1RMOiJUaW1vciBMZXN0ZSIsIHF1X0JPOiJCb2xpdmlhIiwgcXVfUEU6IlBlclx1MDBmYSIsIHJtX0NIOiJTY2h3ZWl6Iiwgcm5fQkk6IkJ1cnVuZGkiLCByb19NRDoiTW9sZG92YSwgUmVwdWJsaWNhIiwgcm9fUk86IlJvbVx1MDBlMm5pYSIsIHJ1X0JZOiJcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0NGMiLCAKcnVfS0c6Ilx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZCIsIHJ1X0taOiJcdTA0MWFcdTA0MzBcdTA0MzdcdTA0MzBcdTA0NDVcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M2QiLCBydV9SVToiXHUwNDIwXHUwNDNlXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDRmIiwgcnVfVUE6Ilx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQzOFx1MDQzZFx1MDQzMCIsIHJ3X1JXOiJSd2FuZGEiLCBzYV9JTjoiXHUwOTJkXHUwOTNlXHUwOTMwXHUwOTI0Iiwgc2RfRGV2YV9JTjoiXHUwOTJkXHUwOTNlXHUwOTMwXHUwOTI0Iiwgc2RfSU46Ilx1MDkyZFx1MDkzZVx1MDkzMFx1MDkyNCIsIHNlX0ZJOiJGaW5sYW5kIiwgc2VfTk86Ik5vcmdlIiwgc2dfQ0Y6IlJcdTAwZTlwdWJsaXF1ZSBjZW50cmFmcmljYWluZSIsIHNoX0JBOiJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwgc2hfQ1M6IlNlcmJpYSBhbmQgTW9udGVuZWdybyIsIHNpX0xLOiJTcmkgTGFua2EiLCAKc2lkX0VUOiJJdG9vcGhpeWFhIiwgc2tfU0s6IlNsb3ZlbnNrXHUwMGUxIHJlcHVibGlrYSIsIHNsX1NJOiJTbG92ZW5pamEiLCBzbV9BUzoiQW1lcmljYW4gU2Ftb2EiLCBzbV9XUzoiU2Ftb2EiLCBzb19ESjoiSmFidXV0aSIsIHNvX0VUOiJJdG9vYml5YSIsIHNvX0tFOiJLaWluaXlhIiwgc29fU086IlNvb21hYWxpeWEiLCBzcV9BTDoiU2hxaXBcdTAwZWJyaWEiLCBzcl9CQToiXHUwNDExXHUwNDNlXHUwNDQxXHUwNDNkXHUwNDMwIFx1MDQzOCBcdTA0MjVcdTA0MzVcdTA0NDBcdTA0NDZcdTA0MzVcdTA0MzNcdTA0M2VcdTA0MzJcdTA0MzhcdTA0M2RcdTA0MzAiLCBzcl9DUzoiXHUwNDIxXHUwNDQwXHUwNDMxXHUwNDM4XHUwNDU4XHUwNDMwIFx1MDQzOCBcdTA0MjZcdTA0NDBcdTA0M2RcdTA0MzAgXHUwNDEzXHUwNDNlXHUwNDQwXHUwNDMwIiwgc3JfQ3lybF9CQToiXHUwNDExXHUwNDNlXHUwNDQxXHUwNDNkXHUwNDM4XHUwNDRmIiwgc3JfQ3lybF9DUzoiXHUwNDIxXHUwNDM1XHUwNDQwXHUwNDMxXHUwNDM4XHUwNDRmIFx1MDQzOCBcdTA0MjdcdTA0MzVcdTA0NDBcdTA0M2RcdTA0M2VcdTA0MzNcdTA0M2VcdTA0NDBcdTA0MzhcdTA0NGYiLCAKc3JfQ3lybF9NRToiXHUwNDI3XHUwNDM1XHUwNDQwXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDNlXHUwNDQwXHUwNDM4XHUwNDRmIiwgc3JfQ3lybF9SUzoiXHUwNDIxXHUwNDM1XHUwNDQwXHUwNDMxXHUwNDM4XHUwNDRmIiwgc3JfTGF0bl9CQToiQm9zbmEgaSBIZXJjZWdvdmluYSIsIHNyX0xhdG5fQ1M6IlNyYmlqYSBpIENybmEgR29yYSIsIHNyX0xhdG5fTUU6IkNybmEgR29yYSIsIHNyX0xhdG5fUlM6IlNyYmlqYSIsIHNyX01FOiJcdTA0MjZcdTA0NDBcdTA0M2RcdTA0MzAgXHUwNDEzXHUwNDNlXHUwNDQwXHUwNDMwIiwgc3JfUlM6Ilx1MDQyMVx1MDQ0MFx1MDQzMVx1MDQzOFx1MDQ1OFx1MDQzMCIsIHNzX1NaOiJTd2F6aWxhbmQiLCBzc19aQToiU291dGggQWZyaWNhIiwgc3RfTFM6Ikxlc290aG8iLCBzdF9aQToiU291dGggQWZyaWNhIiwgc3VfSUQ6IkluZG9uZXNpYSIsIHN2X0FYOiJcdTAwYzVsYW5kIiwgc3ZfRkk6IkZpbmxhbmQiLCBzdl9TRToiU3ZlcmlnZSIsIHN3X0tFOiJLZW55YSIsIApzd19UWjoiVGFuemFuaWEiLCBzd19VRzoiVWdhbmRhIiwgc3diX0tNOiJcdTA2MmNcdTA2MzJcdTA2MzEgXHUwNjI3XHUwNjQ0XHUwNjQyXHUwNjQ1XHUwNjMxIiwgc3lyX1NZOiJTeXJpYSIsIHRhX0lOOiJcdTBiODdcdTBiYThcdTBiY2RcdTBiYTRcdTBiYmZcdTBiYWZcdTBiYmUiLCB0YV9MSzoiXHUwYjg3XHUwYmIyXHUwYjk5XHUwYmNkXHUwYjk1XHUwYmM4IiwgdGFfU0c6Ilx1MGI5YVx1MGJiZlx1MGI5OVx1MGJjZFx1MGI5NVx1MGJhYVx1MGJjZFx1MGJhYVx1MGJjMlx1MGJiMFx1MGJjZCIsIHRlX0lOOiJcdTBjMmRcdTBjM2VcdTBjMzBcdTBjMjQgXHUwYzI2XHUwYzQ3XHUwYzMzXHUwYzAyIiwgdGV0X1RMOiJUaW1vciBMZXN0ZSIsIHRnX0N5cmxfVEo6Ilx1MDQyMlx1MDQzMFx1MDQzNFx1MDQzNlx1MDQzOFx1MDQzYVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzZCIsIHRnX1RKOiJcdTA2MmFcdTA2MjdcdTA2MmNcdTA2YTlcdTA2MzNcdTA2MmFcdTA2MjdcdTA2NDYiLCAKdGhfVEg6Ilx1MGUxYlx1MGUyM1x1MGUzMFx1MGU0MFx1MGUxN1x1MGUyOFx1MGU0NFx1MGUxN1x1MGUyMiIsIHRpX0VSOiJcdTEyYTRcdTEyMmRcdTEyNzVcdTEyMmIiLCB0aV9FVDoiXHUxMmEyXHUxMjc1XHUxMmVlXHUxMzM1XHUxMmViIiwgdGlnX0VSOiJcdTEyYTRcdTEyMmRcdTEyNzVcdTEyMmIiLCB0a19UTToiXHUwNjJhXHUwNjMxXHUwNmE5XHUwNjQ1XHUwNjQ2XHUwNjMzXHUwNjJhXHUwNjI3XHUwNjQ2IiwgdGtsX1RLOiJUb2tlbGF1IiwgdG5fQlc6IkJvdHN3YW5hIiwgdG5fWkE6IlNvdXRoIEFmcmljYSIsIHRvX1RPOiJUb25nYSIsIHRwaV9QRzoiUGFwdWEgTmV3IEd1aW5lYSIsIHRyX0NZOiJHXHUwMGZjbmV5IEtcdTAxMzFiclx1MDEzMXMgUnVtIEtlc2ltaSIsIHRyX1RSOiJUXHUwMGZjcmtpeWUiLCB0c19aQToiU291dGggQWZyaWNhIiwgdHRfUlU6Ilx1MDQyMFx1MDQzZVx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQ0ZiIsIHR2bF9UVjoiVHV2YWx1IiwgdHlfUEY6IlBvbHluXHUwMGU5c2llIGZyYW5cdTAwZTdhaXNlIiwgCnVrX1VBOiJcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0MzAiLCB1bGlfRk06Ik1pY3JvbmVzaWEiLCB1bmRfWlo6IlVua25vd24gb3IgSW52YWxpZCBSZWdpb24iLCB1cl9JTjoiXHUwNjI4XHUwNmJlXHUwNjI3XHUwNjMxXHUwNjJhIiwgdXJfUEs6Ilx1MDY3ZVx1MDYyN1x1MDZhOVx1MDYzM1x1MDYyYVx1MDYyN1x1MDY0NiIsIHV6X0FGOiJBZmdhbmlzdGFuIiwgdXpfQXJhYl9BRjoiXHUwNjI3XHUwNjQxXHUwNjNhXHUwNjI3XHUwNjQ2XHUwNjMzXHUwNjJhXHUwNjI3XHUwNjQ2IiwgdXpfQ3lybF9VWjoiXHUwNDIzXHUwNDM3XHUwNDMxXHUwNDM1XHUwNDNhXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNkIiwgdXpfTGF0bl9VWjoiT1x1MDJiZnpiZWtpc3RvbiIsIHV6X1VaOiJcdTA0MGVcdTA0MzdcdTA0MzFcdTA0MzVcdTA0M2FcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M2VcdTA0M2QiLCB2ZV9aQToiU291dGggQWZyaWNhIiwgdmlfVk46IlZpXHUxZWM3dCBOYW0iLCAKd2FsX0VUOiJcdTEyYTJcdTEyNzVcdTEyZWVcdTEzMzVcdTEyZWIiLCB3b19BcmFiX1NOOiJcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NDZcdTA2M2FcdTA2MjdcdTA2NDQiLCB3b19MYXRuX1NOOiJTXHUwMGU5blx1MDBlOWdhbCIsIHdvX1NOOiJTXHUwMGU5blx1MDBlOWdhbCIsIHhoX1pBOiJTb3V0aCBBZnJpY2EiLCB5YXBfRk06Ik1pY3JvbmVzaWEiLCB5b19ORzoiTmlnZXJpYSIsIHpoX0NOOiJcdTRlMmRcdTU2ZmQiLCB6aF9ISzoiXHU5OTk5XHU2ZTJmIiwgemhfSGFuc19DTjoiXHU0ZTJkXHU1NmZkIiwgemhfSGFuc19TRzoiXHU2NWIwXHU1MmEwXHU1NzYxIiwgemhfSGFudF9ISzoiXHU0ZTJkXHU4M2VmXHU0ZWJhXHU2YzExXHU1MTcxXHU1NDhjXHU1NzBiXHU5OTk5XHU2ZTJmXHU3Mjc5XHU1MjI1XHU4ODRjXHU2NTNmXHU1MzQwIiwgemhfSGFudF9NTzoiXHU2ZmIzXHU5NTgwIiwgemhfSGFudF9UVzoiXHU4MWZhXHU3MDYzIiwgemhfTU86Ilx1NmZiM1x1OTVlOCIsIHpoX1NHOiJcdTY1YjBcdTUyYTBcdTU3NjEiLCAKemhfVFc6Ilx1NTNmMFx1NmU3ZSIsIHp1X1pBOiJTb3V0aCBBZnJpY2EifSwgTEFOR1VBR0U6e2FhOiJhZmFyIiwgYWI6Ilx1MDQzMFx1MDQzMVx1MDQ0NVx1MDQzMFx1MDQzN1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIGFjZToiQWNlaCIsIGFjaDoiQWNvbGkiLCBhZGE6IkFkYW5nbWUiLCBhZHk6Ilx1MDQzMFx1MDQzNFx1MDQ0Ylx1MDQzM1x1MDQzNVx1MDQzOVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIGFlOiJBdmVzdGFuIiwgYWY6IkFmcmlrYWFucyIsIGFmYToiQWZyby1Bc2lhdGljIExhbmd1YWdlIiwgYWZoOiJBZnJpaGlsaSIsIGFpbjoiQWludSIsIGFrOiJBa2FuIiwgYWtrOiJBa2thZGlhbiIsIGFsZToiQWxldXQiLCBhbGc6IkFsZ29ucXVpYW4gTGFuZ3VhZ2UiLCBhbHQ6IlNvdXRoZXJuIEFsdGFpIiwgYW06Ilx1MTJhMFx1MTIxYlx1MTIyZFx1MTI5YiIsIGFuOiJBcmFnb25lc2UiLCBhbmc6Ik9sZCBFbmdsaXNoIiwgYW5wOiJBbmdpa2EiLCBhcGE6IkFwYWNoZSBMYW5ndWFnZSIsIAphcjoiXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5IiwgYXJjOiJBcmFtYWljIiwgYXJuOiJBcmF1Y2FuaWFuIiwgYXJwOiJBcmFwYWhvIiwgYXJ0OiJBcnRpZmljaWFsIExhbmd1YWdlIiwgYXJ3OiJBcmF3YWsiLCBhczoiXHUwOTg1XHUwOWI4XHUwOWFlXHUwOWMwXHUwOWFmXHUwOWJjXHUwOWJlIiwgYXN0OiJhc3R1cmlhbm8iLCBhdGg6IkF0aGFwYXNjYW4gTGFuZ3VhZ2UiLCBhdXM6IkF1c3RyYWxpYW4gTGFuZ3VhZ2UiLCBhdjoiXHUwNDMwXHUwNDMyXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5IiwgYXdhOiJBd2FkaGkiLCBheToiYWltYXJhIiwgYXo6ImF6XHUwMjU5cmJheWNhbmNhIiwgYXpfQXJhYjoiXHUwNjJhXHUwNjMxXHUwNmE5XHUwNmNjIFx1MDYyMlx1MDYzMFx1MDYzMVx1MDYyOFx1MDYyN1x1MDZjY1x1MDYyY1x1MDYyN1x1MDY0Nlx1MDZjYyIsIGF6X0N5cmw6Ilx1MDQxMFx1MDQzN1x1MDRkOVx1MDQ0MFx1MDQzMVx1MDQzMFx1MDQ1OFx1MDRiOVx1MDQzMFx1MDQzZCIsIAphel9MYXRuOiJBemVyaWNlIiwgYmE6Ilx1MDQzMVx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzOFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIGJhZDoiQmFuZGEiLCBiYWk6IkJhbWlsZWtlIExhbmd1YWdlIiwgYmFsOiJcdTA2MjhcdTA2NDRcdTA2NDhcdTA2ODZcdTA2Y2MiLCBiYW46IkJhbGluIiwgYmFzOiJCYXNhIiwgYmF0OiJCYWx0aWMgTGFuZ3VhZ2UiLCBiZToiXHUwNDMxXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIiwgYmVqOiJCZWphIiwgYmVtOiJCZW1iYSIsIGJlcjoiQmVyYmVyIiwgYmc6Ilx1MDQzMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCIsIGJoOiJcdTA5MmNcdTA5M2ZcdTA5MzlcdTA5M2VcdTA5MzBcdTA5NDAiLCBiaG86IkJob2pwdXJpIiwgYmk6ImJpY2hlbGFtYXIgOyBiaXNsYW1hIiwgYmlrOiJCaWtvbCIsIGJpbjoiQmluaSIsIGJsYToiU2lrc2lrYSIsIApibToiYmFtYmFyYSIsIGJuOiJcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUiLCBibnQ6IkJhbnR1IiwgYm86Ilx1MGY1NFx1MGY3Y1x1MGY1MVx1MGYwYlx1MGY2Nlx1MGY5MFx1MGY1MVx1MGYwYiIsIGJyOiJicmV0b24iLCBicmE6IkJyYWoiLCBiczoiQm9zYW5za2kiLCBidGs6IkJhdGFrIiwgYnVhOiJCdXJpYXQiLCBidWc6IkJ1Z2lzIiwgYnluOiJcdTEyNjVcdTEyMGFcdTEyOTUiLCBjYToiY2F0YWxcdTAwZTAiLCBjYWQ6IkNhZGRvIiwgY2FpOiJDZW50cmFsIEFtZXJpY2FuIEluZGlhbiBMYW5ndWFnZSIsIGNhcjoiQ2FyaWIiLCBjYXU6IkNhdWNhc2lhbiBMYW5ndWFnZSIsIGNjaDoiQXRzYW0iLCBjZToiXHUwNDQ3XHUwNDM1XHUwNDQ3XHUwNDM1XHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5IiwgY2ViOiJDZWJ1YW5vIiwgY2VsOiJDZWx0aWMgTGFuZ3VhZ2UiLCBjaDoiQ2hhbW9ycm8iLCBjaGI6IkNoaWJjaGEiLCBjaGc6IkNoYWdhdGFpIiwgY2hrOiJDaHV1a2VzZSIsIApjaG06Ilx1MDQzY1x1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSAoXHUwNDQ3XHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNjXHUwNDM4XHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5KSIsIGNobjoiQ2hpbm9vayBKYXJnb24iLCBjaG86IkNob2N0YXciLCBjaHA6IkNoaXBld3lhbiIsIGNocjoiQ2hlcm9rZWUiLCBjaHk6IkNoZXllbm5lIiwgY21jOiJDaGFtaWMgTGFuZ3VhZ2UiLCBjbzoiY29yc2UiLCBjb3A6Ilx1MDY0Mlx1MDYyOFx1MDYzN1x1MDY0YVx1MDYyOSIsIGNvcF9BcmFiOiJcdTA2NDJcdTA2MjhcdTA2MzdcdTA2NGFcdTA2MjkiLCBjcGU6IkVuZ2xpc2gtYmFzZWQgQ3Jlb2xlIG9yIFBpZGdpbiIsIGNwZjoiRnJlbmNoLWJhc2VkIENyZW9sZSBvciBQaWRnaW4iLCBjcHA6IlBvcnR1Z3Vlc2UtYmFzZWQgQ3Jlb2xlIG9yIFBpZGdpbiIsIGNyOiJDcmVlIiwgY3JoOiJDcmltZWFuIFR1cmtpc2giLCBjcnA6IkNyZW9sZSBvciBQaWRnaW4iLCAKY3M6Ilx1MDEwZGVcdTAxNjF0aW5hIiwgY3NiOiJLYXNodWJpYW4iLCBjdToiQ2h1cmNoIFNsYXZpYyIsIGN1czoiQ3VzaGl0aWMgTGFuZ3VhZ2UiLCBjdjoiXHUwNDQ3XHUwNDQzXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5IiwgY3k6IkN5bXJhZWciLCBkYToiZGFuc2siLCBkYWs6IkRha290YSIsIGRhcjoiXHUwNDM0XHUwNDMwXHUwNDQwXHUwNDMzXHUwNDMyXHUwNDMwIiwgZGF5OiJEYXlhayIsIGRlOiJEZXV0c2NoIiwgZGVsOiJEZWxhd2FyZSIsIGRlbjoiU2xhdmUiLCBkZ3I6IkRvZ3JpYiIsIGRpbjoiRGlua2EiLCBkb2k6Ilx1MDYyN1x1MDY0NFx1MDYyZlx1MDY0OFx1MDYyY1x1MDYzMVx1MDY0OSIsIGRyYToiRHJhdmlkaWFuIExhbmd1YWdlIiwgZHNiOiJMb3dlciBTb3JiaWFuIiwgZHVhOiJEdWFsYSIsIGR1bToiTWlkZGxlIER1dGNoIiwgZHY6IkRpdmVoaSIsIGR5dToiZGlvdWxhIiwgZHo6Ilx1MGY2Mlx1MGZhYlx1MGY3Y1x1MGY0NFx1MGYwYlx1MGY0MSIsIAplZToiRXdlIiwgZWZpOiJFZmlrIiwgZWd5OiJBbmNpZW50IEVneXB0aWFuIiwgZWthOiJFa2FqdWsiLCBlbDoiXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjIiwgZWx4OiJFbGFtaXRlIiwgZW46IkVuZ2xpc2giLCBlbm06Ik1pZGRsZSBFbmdsaXNoIiwgZW86ImVzcGVyYW50byIsIGVzOiJlc3BhXHUwMGYxb2wiLCBldDoiZWVzdGkiLCBldToiZXVza2FyYSIsIGV3bzoiRXdvbmRvIiwgZmE6Ilx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYyIsIGZhbjoiZmFuZyIsIGZhdDoiRmFudGkiLCBmZjoiRnVsYWgiLCBmaToic3VvbWkiLCBmaWw6IkZpbGlwaW5vIiwgZml1OiJGaW5uby1VZ3JpYW4gTGFuZ3VhZ2UiLCBmajoiRmlqaWFuIiwgZm86ImZcdTAwZjhyb3lza3QiLCBmb246IkZvbiIsIGZyOiJmcmFuXHUwMGU3YWlzIiwgZnJtOiJNaWRkbGUgRnJlbmNoIiwgZnJvOiJPbGQgRnJlbmNoIiwgZnJyOiJOb3J0aGVybiBGcmlzaWFuIiwgZnJzOiJFYXN0ZXJuIEZyaXNpYW4iLCAKZnVyOiJmcml1bGFubyIsIGZ5OiJGcmllcyIsIGdhOiJHYWVpbGdlIiwgZ2FhOiJHYSIsIGdheToiR2F5byIsIGdiYToiR2JheWEiLCBnZDoiU2NvdHRpc2ggR2FlbGljIiwgZ2VtOiJHZXJtYW5pYyBMYW5ndWFnZSIsIGdlejoiXHUxMzBkXHUxMmQ1XHUxMmRkXHUxMjliIiwgZ2lsOiJHaWxiZXJ0ZXNlIiwgZ2w6ImdhbGVnbyIsIGdtaDoiTWlkZGxlIEhpZ2ggR2VybWFuIiwgZ246Imd1YXJhblx1MDBlZCIsIGdvaDoiT2xkIEhpZ2ggR2VybWFuIiwgZ29uOiJHb25kaSIsIGdvcjoiR29yb250YWxvIiwgZ290OiJHb3RoaWMiLCBncmI6IkdyZWJvIiwgZ3JjOiJcdTAzOTFcdTAzYzFcdTAzYzdcdTAzYjFcdTAzYWZcdTAzYjEgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjIiwgZ3N3OiJTY2h3ZWl6ZXJkZXV0c2NoIiwgZ3U6Ilx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCIsIGd2OiJHYWVsZyIsIGd3aToiR3dpY2hcdTAyYmNpbiIsIApoYToiXHUwNjI3XHUwNjQ0XHUwNjQ3XHUwNjQ4XHUwNjMzXHUwNjI3IiwgaGFfQXJhYjoiXHUwNjI3XHUwNjQ0XHUwNjQ3XHUwNjQ4XHUwNjMzXHUwNjI3IiwgaGFfTGF0bjoiaGFvdXNzYSIsIGhhaToiSGFpZGEiLCBoYXc6Ilx1MDJiYlx1MDE0ZGxlbG8gSGF3YWlcdTAyYmJpIiwgaGU6Ilx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSIsIGhpOiJcdTA5MzlcdTA5M2ZcdTA5MDJcdTA5MjZcdTA5NDAiLCBoaWw6IkhpbGlnYXlub24iLCBoaW06IkhpbWFjaGFsaSIsIGhpdDoiSGl0dGl0ZSIsIGhtbjoiSG1vbmciLCBobzoiSGlyaSBNb3R1IiwgaHI6ImhydmF0c2tpIiwgaHNiOiJVcHBlciBTb3JiaWFuIiwgaHQ6ImhhXHUwMGVmdGllbiIsIGh1OiJtYWd5YXIiLCBodXA6Ikh1cGEiLCBoeToiXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY3XHUwNTc2IiwgaHo6IkhlcmVybyIsIGlhOiJpbnRlcmxpbmd2YW8iLCBpYmE6IkliYW4iLCBpZDoiQmFoYXNhIEluZG9uZXNpYSIsIAppZToiSW50ZXJsaW5ndWUiLCBpZzoiSWdibyIsIGlpOiJcdWExODhcdWEzMjBcdWEyNTkiLCBpam86IklqbyIsIGlrOiJJbnVwaWFxIiwgaWxvOiJJbG9rbyIsIGluYzoiSW5kaWMgTGFuZ3VhZ2UiLCBpbmU6IkluZG8tRXVyb3BlYW4gTGFuZ3VhZ2UiLCBpbmg6Ilx1MDQzOFx1MDQzZFx1MDQzM1x1MDQ0M1x1MDQ0OFx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIGlvOiJJZG8iLCBpcmE6IklyYW5pYW4gTGFuZ3VhZ2UiLCBpcm86Iklyb3F1b2lhbiBMYW5ndWFnZSIsIGlzOiJcdTAwZWRzbGVuc2thIiwgaXQ6Iml0YWxpYW5vIiwgaXU6IkludWt0aXR1dCIsIGphOiJcdTY1ZTVcdTY3MmNcdThhOWUiLCBqYm86IkxvamJhbiIsIGpwcjoiSnVkZW8tUGVyc2lhbiIsIGpyYjoiSnVkZW8tQXJhYmljIiwganY6Ikphd2EiLCBrYToiXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4Iiwga2FhOiJcdTA0M2FcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M2FcdTA0MzBcdTA0M2JcdTA0M2ZcdTA0MzBcdTA0M2FcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkiLCAKa2FiOiJrYWJ5bGUiLCBrYWM6IkthY2hpbiIsIGthajoiSmp1Iiwga2FtOiJLYW1iYSIsIGthcjoiS2FyZW4iLCBrYXc6Ikthd2kiLCBrYmQ6Ilx1MDQzYVx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0MFx1MDQzNFx1MDQzOFx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIGtjZzoiVHlhcCIsIGtmbzoia29ybyIsIGtnOiJLb25nbyIsIGtoYToiS2hhc2kiLCBraGk6Iktob2lzYW4gTGFuZ3VhZ2UiLCBraG86Iktob3RhbmVzZSIsIGtpOiJLaWt1eXUiLCBrajoiS3VhbnlhbWEiLCBrazoiXHUwNDlhXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDliIiwga2w6ImthbGFhbGxpc3V0Iiwga206Ilx1MTc5N1x1MTdiNlx1MTc5Zlx1MTdiNlx1MTc4MVx1MTdkMlx1MTc5OFx1MTdjMlx1MTc5YSIsIGttYjoicXVpbWJ1bmRvIiwga246Ilx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSIsIGtvOiJcdWQ1NWNcdWFkNmRcdWM1YjQiLCBrb2s6Ilx1MDkxNVx1MDk0Ylx1MDkwMlx1MDkxNVx1MDkyM1x1MDk0MCIsIAprb3M6Iktvc3JhZWFuIiwga3BlOiJrcGVsbFx1MDBlOSIsIGtyOiJLYW51cmkiLCBrcmM6Ilx1MDQzYVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQzMlx1MDQzZS1cdTA0MzFcdTA0MzBcdTA0M2JcdTA0M2FcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkiLCBrcmw6Ilx1MDQzYVx1MDQzMFx1MDQ0MFx1MDQzNVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIGtybzoiS3J1Iiwga3J1OiJLdXJ1a2giLCBrczoiXHUwOTE1XHUwOTNlXHUwOTM2XHUwOTRkXHUwOTJlXHUwOTNmXHUwOTMwXHUwOTQwIiwga3U6IktcdTAwZmNydFx1MDBlN2UiLCBrdV9BcmFiOiJcdTA2MjdcdTA2NDRcdTA2NDNcdTA2MzFcdTA2MmZcdTA2NGFcdTA2MjkiLCBrdV9MYXRuOiJLXHUwMGZjcnRcdTAwZTdlIiwga3VtOiJcdTA0M2FcdTA0NDNcdTA0M2NcdTA0NGJcdTA0M2FcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkiLCBrdXQ6Ikt1dGVuYWkiLCAKa3Y6IktvbWkiLCBrdzoia2VybmV3ZWsiLCBreToiS1x1MDEzMXJnXHUwMTMxemNhIiwga3lfQXJhYjoiXHUwNjI3XHUwNjQ0XHUwNjQyXHUwNjRhXHUwNjMxXHUwNjNhXHUwNjMzXHUwNjJhXHUwNjI3XHUwNjQ2XHUwNjRhXHUwNjI5Iiwga3lfQ3lybDoiXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDMzXHUwNDM4XHUwNDM3XHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5IiwgbGE6ImxhdGlubyIsIGxhZDoiXHUwNWRjXHUwNWQzXHUwNWQ5XHUwNWUwXHUwNWQ1IiwgbGFoOiJcdTA2NDRcdTA2MjdcdTA2NDdcdTA2NDZcdTA2MmZcdTA2MjciLCBsYW06IkxhbWJhIiwgbGI6Imx1eGVtYm91cmdlb2lzIiwgbGV6OiJcdTA0M2JcdTA0MzVcdTA0MzdcdTA0MzNcdTA0MzhcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkiLCBsZzoiR2FuZGEiLCBsaToiTGltYnVyZ3MiLCBsbjoibGluZ2FsYSIsIGxvOiJMYW8iLCBsb2w6Im1vbmdvIiwgbG96OiJMb3ppIiwgbHQ6ImxpZXR1dmlcdTAxNzMiLCBsdToibHViYS1rYXRhbmdhIiwgCmx1YToibHViYS1sdWx1YSIsIGx1aToiTHVpc2VubyIsIGx1bjoiTHVuZGEiLCBsdW86Ikx1byIsIGx1czoiTHVzaGFpIiwgbHY6ImxhdHZpZVx1MDE2MXUiLCBtYWQ6Ik1hZHVyYSIsIG1hZzoiTWFnYWhpIiwgbWFpOiJNYWl0aGlsaSIsIG1hazoiTWFrYXNzYXIiLCBtYW46Ik1hbmRpbmdvIiwgbWFwOiJBdXN0cm9uZXNpYW4iLCBtYXM6Ik1hc2FpIiwgbWRmOiJcdTA0M2NcdTA0M2VcdTA0M2FcdTA0NDhcdTA0MzAiLCBtZHI6Ik1hbmRhciIsIG1lbjoiTWVuZGUiLCBtZzoibWFsZ2FjaGUiLCBtZ2E6Ik1pZGRsZSBJcmlzaCIsIG1oOiJNYXJzaGFsbGVzZSIsIG1pOiJNYW9yaSIsIG1pYzoiTWljbWFjIiwgbWluOiJNaW5hbmdrYWJhdSIsIG1pczoiTWlzY2VsbGFuZW91cyBMYW5ndWFnZSIsIG1rOiJcdTA0M2NcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgiLCBta2g6Ik1vbi1LaG1lciBMYW5ndWFnZSIsIG1sOiJcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIiLCAKbW46Ilx1MDQzY1x1MDQzZVx1MDQzZFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIG1uX0N5cmw6Ilx1MDQzY1x1MDQzZVx1MDQzZFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIG1uX01vbmc6Ilx1MDQzY1x1MDQzZVx1MDQzZFx1MDQzM1x1MDQzZVx1MDQzYlx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIG1uYzoiTWFuY2h1IiwgbW5pOiJNYW5pcHVyaSIsIG1ubzoiTWFub2JvIExhbmd1YWdlIiwgbW86Ik1vbGRhdmlhbiIsIG1vaDoiTW9oYXdrIiwgbW9zOiJtb3JcdTAwZTkgOyBtb3NzaSIsIG1yOiJcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAiLCBtczoiQmFoYXNhIE1lbGF5dSIsIG10OiJNYWx0aSIsIG11bDoiTXVsdGlwbGUgTGFuZ3VhZ2VzIiwgbXVuOiJNdW5kYSBMYW5ndWFnZSIsIG11czoiQ3JlZWsiLCBtd2w6Ik1pcmFuZGVzZSIsIG13cjoiTWFyd2FyaSIsIG15OiJCdXJtZXNlIiwgCm15bjoiTWF5YW4gTGFuZ3VhZ2UiLCBteXY6Ilx1MDQ0ZFx1MDQ0MFx1MDQzN1x1MDQ0ZiIsIG5hOiJOYXVydSIsIG5haDoiTmFodWF0bCIsIG5haToiTm9ydGggQW1lcmljYW4gSW5kaWFuIExhbmd1YWdlIiwgbmFwOiJuYXBvbGV0YW5vIiwgbmI6Im5vcnNrIGJva21cdTAwZTVsIiwgbmQ6Ik5vcnRoIE5kZWJlbGUiLCBuZHM6IkxvdyBHZXJtYW4iLCBuZToiXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyXHUwOTQwIiwgIm5ldyI6Ik5ld2FyaSIsIG5nOiJOZG9uZ2EiLCBuaWE6Ik5pYXMiLCBuaWM6Ik5pZ2VyLUtvcmRvZmFuaWFuIExhbmd1YWdlIiwgbml1OiJOaXVlYW4iLCBubDoiTmVkZXJsYW5kcyIsIG5uOiJueW5vcnNrIiwgbm86Ik5vcndlZ2lhbiIsIG5vZzoiXHUwNDNkXHUwNDNlXHUwNDMzXHUwNDMwXHUwNDM5XHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5Iiwgbm9uOiJPbGQgTm9yc2UiLCBucW86Ik5cdTIwMTlLbyIsIG5yOiJTb3V0aCBOZGViZWxlIiwgbnNvOiJOb3J0aGVybiBTb3RobyIsIApudWI6Ik51YmlhbiBMYW5ndWFnZSIsIG52OiJOYXZham8iLCBud2M6IkNsYXNzaWNhbCBOZXdhcmkiLCBueToibmlhbmphOyBjaGljaGV1YTsgY2hldWEiLCBueW06Ik55YW13ZXppIiwgbnluOiJOeWFua29sZSIsIG55bzoiTnlvcm8iLCBuemk6Ik56aW1hIiwgb2M6Im9jY2l0YW4iLCBvajoiT2ppYndhIiwgb206Ik9yb21vbyIsIG9yOiJcdTBiMTNcdTBiMjFcdTBiM2NcdTBiM2ZcdTBiMDYiLCBvczoiXHUwNDNlXHUwNDQxXHUwNDM1XHUwNDQyXHUwNDM4XHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5Iiwgb3NhOiJPc2FnZSIsIG90YToiT3R0b21hbiBUdXJraXNoIiwgb3RvOiJPdG9taWFuIExhbmd1YWdlIiwgcGE6Ilx1MGEyYVx1MGE3MFx1MGExY1x1MGEzZVx1MGEyY1x1MGE0MCIsIHBhX0FyYWI6Ilx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOCIsIHBhX0d1cnU6Ilx1MGEyYVx1MGE3MFx1MGExY1x1MGEzZVx1MGEyY1x1MGE0MCIsIHBhYToiUGFwdWFuIExhbmd1YWdlIiwgCnBhZzoiUGFuZ2FzaW5hbiIsIHBhbDoiUGFobGF2aSIsIHBhbToiUGFtcGFuZ2EiLCBwYXA6IlBhcGlhbWVudG8iLCBwYXU6IlBhbGF1YW4iLCBwZW86Ik9sZCBQZXJzaWFuIiwgcGhpOiJQaGlsaXBwaW5lIExhbmd1YWdlIiwgcGhuOiJQaG9lbmljaWFuIiwgcGk6Ilx1MGUxYVx1MGUzMlx1MGUyNVx1MGUzNSIsIHBsOiJwb2xza2kiLCBwb246IlBvaG5wZWlhbiIsIHByYToiUHJha3JpdCBMYW5ndWFnZSIsIHBybzoiT2xkIFByb3Zlblx1MDBlN2FsIiwgcHM6Ilx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCIsIHB0OiJwb3J0dWd1XHUwMGVhcyIsIHF1OiJxdWVjaHVhIiwgcmFqOiJSYWphc3RoYW5pIiwgcmFwOiJSYXBhbnVpIiwgcmFyOiJSYXJvdG9uZ2FuIiwgcm06IlJcdTAwZTR0b3JvbWFuaXNjaCIsIHJuOiJyb3VuZGkiLCBybzoicm9tXHUwMGUyblx1MDEwMyIsIHJvYToiUm9tYW5jZSBMYW5ndWFnZSIsIHJvbToiUm9tYW55IiwgcnU6Ilx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIApydXA6IkFyb21hbmlhbiIsIHJ3OiJyd2FuZGEiLCBzYToiXHUwOTM4XHUwOTAyXHUwOTM4XHUwOTRkXHUwOTE1XHUwOTQzXHUwOTI0IFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSIsIHNhZDoiU2FuZGF3ZSIsIHNhaDoiXHUwNDRmXHUwNDNhXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5Iiwgc2FpOiJTb3V0aCBBbWVyaWNhbiBJbmRpYW4gTGFuZ3VhZ2UiLCBzYWw6IlNhbGlzaGFuIExhbmd1YWdlIiwgc2FtOiJcdTA1ZDBcdTA1ZThcdTA1ZGVcdTA1ZDlcdTA1ZWEgXHUwNWU5XHUwNWQ1XHUwNWRlXHUwNWU4XHUwNWQ1XHUwNWUwXHUwNWQ5XHUwNWVhIiwgc2FzOiJTYXNhayIsIHNhdDoiU2FudGFsaSIsIHNjOiJTYXJkaW5pYW4iLCBzY246InNpY2lsaWFubyIsIHNjbzoiU2NvdHMiLCBzZDoiXHUwOTM4XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI3XHUwOTQwIiwgc2RfQXJhYjoiXHUwNjMzXHUwNjQ2XHUwNjJmXHUwNmNjIiwgc2RfRGV2YToiXHUwOTM4XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI3XHUwOTQwIiwgCnNlOiJub3Jkc2FtaXNrYSIsIHNlbDoiXHUwNDQxXHUwNDM1XHUwNDNiXHUwNDRjXHUwNDNhXHUwNDQzXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5Iiwgc2VtOiJTZW1pdGljIExhbmd1YWdlIiwgc2c6InNhbmdobyIsIHNnYToiT2xkIElyaXNoIiwgc2duOiJTaWduIExhbmd1YWdlIiwgc2g6IlNlcmJvLUNyb2F0aWFuIiwgc2huOiJTaGFuIiwgc2k6IlNpbmhhbGVzZSIsIHNpZDoiU2lkYW1vIiwgc2lvOiJTaW91YW4gTGFuZ3VhZ2UiLCBzaXQ6IlNpbm8tVGliZXRhbiBMYW5ndWFnZSIsIHNrOiJzbG92ZW5za1x1MDBmZCIsIHNsOiJzbG92ZW5cdTAxNjFcdTAxMGRpbmEiLCBzbGE6IlNsYXZpYyBMYW5ndWFnZSIsIHNtOiJTYW1vYW4iLCBzbWE6InN5ZHNhbWlza2EiLCBzbWk6IlNhbWkgTGFuZ3VhZ2UiLCBzbWo6Imx1bGVzYW1pc2thIiwgc21uOiJJbmFyaSBTYW1pIiwgc21zOiJTa29sdCBTYW1pIiwgc246IlNob25hIiwgc25rOiJzb25pbmtcdTAwZTkiLCBzbzoiU29vbWFhbGkiLCAKc29nOiJTb2dkaWVuIiwgc29uOiJTb25naGFpIiwgc3E6InNocWlwZSIsIHNyOiJcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzgiLCBzcl9DeXJsOiJcdTA0NDFcdTA0MzVcdTA0NDBcdTA0MzFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkiLCBzcl9MYXRuOiJTcnBza2kiLCBzcm46IlNyYW5hbnRvbmdvIiwgc3JyOiJzXHUwMGU5clx1MDBlOHJlIiwgc3M6IlN3YXRpIiwgc3NhOiJOaWxvLVNhaGFyYW4gTGFuZ3VhZ2UiLCBzdDoiU2Vzb3RobyIsIHN1OiJTdW5kYW4iLCBzdWs6IlN1a3VtYSIsIHN1czoic291c3NvdSIsIHN1eDoiU3VtZXJpYW4iLCBzdjoic3ZlbnNrYSIsIHN3OiJLaXN3YWhpbGkiLCBzeWM6IkNsYXNzaWNhbCBTeXJpYWMiLCBzeXI6IlN5cmlhYyIsIHRhOiJcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QiLCB0YWk6IlRhaSBMYW5ndWFnZSIsIHRlOiJcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEiLCB0ZW06IlRpbW5lIiwgCnRlcjoiVGVyZW5vIiwgdGV0OiJ0XHUwMGU5dHVtIiwgdGc6Ilx1MDYyYVx1MDYyN1x1MDYyY1x1MDZhOSIsIHRnX0FyYWI6Ilx1MDYyYVx1MDYyN1x1MDYyY1x1MDZhOSIsIHRnX0N5cmw6Ilx1MDQ0Mlx1MDQzMFx1MDQzNFx1MDQzNlx1MDQzOFx1MDQzYVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIHRoOiJcdTBlNDRcdTBlMTdcdTBlMjIiLCB0aToiXHUxMjc1XHUxMzBkXHUxMjJkXHUxMjliIiwgdGlnOiJcdTEyNzVcdTEzMGRcdTEyMjgiLCB0aXY6IlRpdiIsIHRrOiJcdTA2MmFcdTA2MzFcdTA2YTlcdTA2NDVcdTA2NDZcdTA2Y2MiLCB0a2w6IlRva2VsYXUiLCB0bDoiVGFnYWxvZyIsIHRsaDoiS2xpbmdvbiIsIHRsaToiVGxpbmdpdCIsIHRtaDoidGFtYWNoZXEiLCB0bjoiVHN3YW5hIiwgdG86IlRvbmdhIiwgdG9nOiJOeWFzYSBUb25nYSIsIHRwaToiVG9rIFBpc2luIiwgdHI6IlRcdTAwZmNya1x1MDBlN2UiLCB0czoiVHNvbmdhIiwgdHNpOiJUc2ltc2hpYW4iLCB0dDoiXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5IiwgCnR1bToiVHVtYnVrYSIsIHR1cDoiVHVwaSBMYW5ndWFnZSIsIHR1dDoiXHUwNDMwXHUwNDNiXHUwNDQyXHUwNDMwXHUwNDM5XHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM1IChcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0MzUpIiwgdHZsOiJUdXZhbHUiLCB0dzoiVHdpIiwgdHk6InRhaGl0aWVuIiwgdHl2OiJcdTA0NDJcdTA0NDNcdTA0MzJcdTA0MzhcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkiLCB1ZG06Ilx1MDQ0M1x1MDQzNFx1MDQzY1x1MDQ0M1x1MDQ0MFx1MDQ0Mlx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIHVnOiJcdTA0NDNcdTA0MzlcdTA0MzNcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzkiLCB1Z2E6IlVnYXJpdGljIiwgdWs6Ilx1MDQ0M1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCIsIHVtYjoidW1idW5kdSIsIHVuZDoiRW5nbGlzaCIsIHVyOiJcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgiLCAKdXo6Ilx1MDQwZVx1MDQzN1x1MDQzMVx1MDQzNVx1MDQzYSIsIHV6X0FyYWI6Ilx1MDYyN1x1MDZjOVx1MDYzMlx1MDYyOFx1MDZkMFx1MDZhOSIsIHV6X0N5cmw6Ilx1MDQ0M1x1MDQzN1x1MDQzMVx1MDQzNVx1MDQzYVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSIsIHV6X0xhdG46Im8nemJla2NoYSIsIHZhaToiVmFpIiwgdmU6IlZlbmRhIiwgdmk6IlRpXHUxZWJmbmcgVmlcdTFlYzd0Iiwgdm86InZvbGFwdWtvIiwgdm90OiJWb3RpYyIsIHdhOiJXYWxsb25pc2NoIiwgd2FrOiJXYWthc2hhbiBMYW5ndWFnZSIsIHdhbDoiV2FsYW1vIiwgd2FyOiJXYXJheSIsIHdhczoiV2FzaG8iLCB3ZW46IlNvcmJpYW4gTGFuZ3VhZ2UiLCB3bzoid29sb2YiLCB3b19BcmFiOiJcdTA2MjdcdTA2NDRcdTA2NDhcdTA2NDRcdTA2NDhcdTA2NDEiLCB3b19MYXRuOiJ3b2xvZiIsIHhhbDoiXHUwNDNhXHUwNDMwXHUwNDNiXHUwNDNjXHUwNDRiXHUwNDQ2XHUwNDNhXHUwNDM4XHUwNDM5IiwgeGg6Ilhob3NhIiwgCnlhbzoiaWFvIiwgeWFwOiJZYXBlc2UiLCB5aToiXHUwNWQ5XHUwNWQ5XHUwNWQzXHUwNWQ5XHUwNWU5IiwgeW86IllvcnViYSIsIHlwazoiWXVwaWsgTGFuZ3VhZ2UiLCB6YToiWmh1YW5nIiwgemFwOiJaYXBvdGVjIiwgemVuOiJaZW5hZ2EiLCB6aDoiXHU0ZTJkXHU2NTg3IiwgemhfSGFuczoiXHU0ZTJkXHU2NTg3IiwgemhfSGFudDoiXHU0ZTJkXHU2NTg3Iiwgem5kOiJaYW5kZSIsIHp1OiJadWx1IiwgenVuOiJadW5pIiwgenh4OiJObyBsaW5ndWlzdGljIGNvbnRlbnQiLCB6emE6IlphemEifX07Cmdvb2cubG9jYWxlLnNldExvY2FsZSA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRzZXRMb2NhbGUkKGxvY2FsZU5hbWUpIHsKICBsb2NhbGVOYW1lID0gbG9jYWxlTmFtZS5yZXBsYWNlKC8tL2csICJfIik7CiAgZ29vZy5sb2NhbGUuYWN0aXZlTG9jYWxlXyA9IGxvY2FsZU5hbWUKfTsKZ29vZy5sb2NhbGUuZ2V0TG9jYWxlID0gZnVuY3Rpb24gJGdvb2ckbG9jYWxlJGdldExvY2FsZSQoKSB7CiAgZ29vZy5sb2NhbGUuYWN0aXZlTG9jYWxlXyB8fCAoZ29vZy5sb2NhbGUuYWN0aXZlTG9jYWxlXyA9ICJlbiIpOwogIHJldHVybiBnb29nLmxvY2FsZS5hY3RpdmVMb2NhbGVfCn07Cmdvb2cubG9jYWxlLlJlc291cmNlID0ge0RBVEVfVElNRV9DT05TVEFOVFM6IkRhdGVUaW1lQ29uc3RhbnRzIiwgTlVNQkVSX0ZPUk1BVF9DT05TVEFOVFM6Ik51bWJlckZvcm1hdENvbnN0YW50cyIsIFRJTUVfWk9ORV9DT05TVEFOVFM6IlRpbWVab25lQ29uc3RhbnRzIiwgTE9DQUxfTkFNRV9DT05TVEFOVFM6IkxvY2FsZU5hbWVDb25zdGFudHMiLCBUSU1FX1pPTkVfU0VMRUNURURfSURTOiJUaW1lWm9uZVNlbGVjdGVkSWRzIiwgVElNRV9aT05FX1NFTEVDVEVEX1NIT1JUX05BTUVTOiJUaW1lWm9uZVNlbGVjdGVkU2hvcnROYW1lcyIsIFRJTUVfWk9ORV9TRUxFQ1RFRF9MT05HX05BTUVTOiJUaW1lWm9uZVNlbGVjdGVkTG9uZ05hbWVzIiwgVElNRV9aT05FX0FMTF9MT05HX05BTUVTOiJUaW1lWm9uZUFsbExvbmdOYW1lcyJ9Owpnb29nLmxvY2FsZS5nZXRMYW5ndWFnZVN1YlRhZyA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRnZXRMYW5ndWFnZVN1YlRhZyQobGFuZ3VhZ2VDb2RlKSB7CiAgdmFyIHJlc3VsdCA9IGxhbmd1YWdlQ29kZS5tYXRjaCgvXlx3ezIsM30oWy1fXXwkKS8pOwogIHJldHVybiByZXN1bHQgPyByZXN1bHRbMF0ucmVwbGFjZSgvW18tXS9nLCAiIikgOiAiIgp9Owpnb29nLmxvY2FsZS5nZXRSZWdpb25TdWJUYWcgPSBmdW5jdGlvbiAkZ29vZyRsb2NhbGUkZ2V0UmVnaW9uU3ViVGFnJChsYW5ndWFnZUNvZGUpIHsKICB2YXIgcmVzdWx0ID0gbGFuZ3VhZ2VDb2RlLm1hdGNoKC9bLV9dKFthLXpBLVpdezJ9fFxkezN9KShbLV9dfCQpLyk7CiAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdFswXS5yZXBsYWNlKC9bXy1dL2csICIiKSA6ICIiCn07Cmdvb2cubG9jYWxlLmdldFNjcmlwdFN1YlRhZyA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRnZXRTY3JpcHRTdWJUYWckKGxhbmd1YWdlQ29kZSkgewogIHZhciByZXN1bHQgPSBsYW5ndWFnZUNvZGUuc3BsaXQoL1stX10vZyk7CiAgcmV0dXJuIDEgPCByZXN1bHQubGVuZ3RoICYmIHJlc3VsdFsxXS5tYXRjaCgvXlthLXpBLVpdezR9JC8pID8gcmVzdWx0WzFdIDogIiIKfTsKZ29vZy5sb2NhbGUuZ2V0VmFyaWFudFN1YlRhZyA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRnZXRWYXJpYW50U3ViVGFnJChsYW5ndWFnZUNvZGUpIHsKICB2YXIgcmVzdWx0ID0gbGFuZ3VhZ2VDb2RlLm1hdGNoKC9bLV9dKFthLXpdezIsfSkvKTsKICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0WzFdIDogIiIKfTsKZ29vZy5sb2NhbGUuZ2V0TmF0aXZlQ291bnRyeU5hbWUgPSBmdW5jdGlvbiAkZ29vZyRsb2NhbGUkZ2V0TmF0aXZlQ291bnRyeU5hbWUkKGNvdW50cnlDb2RlKSB7CiAgdmFyIGtleSA9IGdvb2cubG9jYWxlLmdldExhbmd1YWdlU3ViVGFnKGNvdW50cnlDb2RlKSArICJfIiArIGdvb2cubG9jYWxlLmdldFJlZ2lvblN1YlRhZyhjb3VudHJ5Q29kZSk7CiAgcmV0dXJuIGtleSBpbiBnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzLkNPVU5UUlkgPyBnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzLkNPVU5UUllba2V5XSA6IGNvdW50cnlDb2RlCn07Cmdvb2cubG9jYWxlLmdldExvY2FsaXplZENvdW50cnlOYW1lID0gZnVuY3Rpb24gJGdvb2ckbG9jYWxlJGdldExvY2FsaXplZENvdW50cnlOYW1lJChsYW5ndWFnZUNvZGUsIG9wdF9sb2NhbGVTeW1ib2xzKSB7CiAgb3B0X2xvY2FsZVN5bWJvbHMgfHwgKG9wdF9sb2NhbGVTeW1ib2xzID0gZ29vZy5sb2NhbGUuZ2V0UmVzb3VyY2UoIkxvY2FsZU5hbWVDb25zdGFudHMiLCBnb29nLmxvY2FsZS5nZXRMb2NhbGUoKSkpOwogIHZhciBjb2RlID0gZ29vZy5sb2NhbGUuZ2V0UmVnaW9uU3ViVGFnKGxhbmd1YWdlQ29kZSk7CiAgcmV0dXJuIGNvZGUgaW4gb3B0X2xvY2FsZVN5bWJvbHMuQ09VTlRSWSA/IG9wdF9sb2NhbGVTeW1ib2xzLkNPVU5UUllbY29kZV0gOiBsYW5ndWFnZUNvZGUKfTsKZ29vZy5sb2NhbGUuZ2V0TmF0aXZlTGFuZ3VhZ2VOYW1lID0gZnVuY3Rpb24gJGdvb2ckbG9jYWxlJGdldE5hdGl2ZUxhbmd1YWdlTmFtZSQobGFuZ3VhZ2VDb2RlKSB7CiAgdmFyIGNvZGUgPSBnb29nLmxvY2FsZS5nZXRMYW5ndWFnZVN1YlRhZyhsYW5ndWFnZUNvZGUpOwogIHJldHVybiBjb2RlIGluIGdvb2cubG9jYWxlLm5hdGl2ZU5hbWVDb25zdGFudHMuTEFOR1VBR0UgPyBnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzLkxBTkdVQUdFW2NvZGVdIDogbGFuZ3VhZ2VDb2RlCn07Cmdvb2cubG9jYWxlLmdldExvY2FsaXplZExhbmd1YWdlTmFtZSA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRnZXRMb2NhbGl6ZWRMYW5ndWFnZU5hbWUkKGxhbmd1YWdlQ29kZSwgb3B0X2xvY2FsZVN5bWJvbHMpIHsKICBvcHRfbG9jYWxlU3ltYm9scyB8fCAob3B0X2xvY2FsZVN5bWJvbHMgPSBnb29nLmxvY2FsZS5nZXRSZXNvdXJjZSgiTG9jYWxlTmFtZUNvbnN0YW50cyIsIGdvb2cubG9jYWxlLmdldExvY2FsZSgpKSk7CiAgdmFyIGNvZGUgPSBnb29nLmxvY2FsZS5nZXRMYW5ndWFnZVN1YlRhZyhsYW5ndWFnZUNvZGUpOwogIHJldHVybiBjb2RlIGluIG9wdF9sb2NhbGVTeW1ib2xzLkxBTkdVQUdFID8gb3B0X2xvY2FsZVN5bWJvbHMuTEFOR1VBR0VbY29kZV0gOiBsYW5ndWFnZUNvZGUKfTsKZ29vZy5sb2NhbGUucmVnaXN0ZXJSZXNvdXJjZSA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRyZWdpc3RlclJlc291cmNlJChkYXRhT2JqLCByZXNvdXJjZU5hbWUsIGxvY2FsZU5hbWUpIHsKICBnb29nLmxvY2FsZS5yZXNvdXJjZVJlZ2lzdHJ5X1tyZXNvdXJjZU5hbWVdIHx8IChnb29nLmxvY2FsZS5yZXNvdXJjZVJlZ2lzdHJ5X1tyZXNvdXJjZU5hbWVdID0ge30pOwogIGdvb2cubG9jYWxlLnJlc291cmNlUmVnaXN0cnlfW3Jlc291cmNlTmFtZV1bbG9jYWxlTmFtZV0gPSBkYXRhT2JqOwogIGdvb2cubG9jYWxlLmFjdGl2ZUxvY2FsZV8gfHwgKGdvb2cubG9jYWxlLmFjdGl2ZUxvY2FsZV8gPSBsb2NhbGVOYW1lKQp9Owpnb29nLmxvY2FsZS5pc1Jlc291cmNlUmVnaXN0ZXJlZCA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRpc1Jlc291cmNlUmVnaXN0ZXJlZCQocmVzb3VyY2VOYW1lLCBsb2NhbGVOYW1lKSB7CiAgcmV0dXJuIHJlc291cmNlTmFtZSBpbiBnb29nLmxvY2FsZS5yZXNvdXJjZVJlZ2lzdHJ5XyAmJiBsb2NhbGVOYW1lIGluIGdvb2cubG9jYWxlLnJlc291cmNlUmVnaXN0cnlfW3Jlc291cmNlTmFtZV0KfTsKZ29vZy5sb2NhbGUucmVzb3VyY2VSZWdpc3RyeV8gPSB7fTsKZ29vZy5sb2NhbGUucmVnaXN0ZXJUaW1lWm9uZUNvbnN0YW50cyA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRyZWdpc3RlclRpbWVab25lQ29uc3RhbnRzJChkYXRhT2JqLCBsb2NhbGVOYW1lKSB7CiAgZ29vZy5sb2NhbGUucmVnaXN0ZXJSZXNvdXJjZShkYXRhT2JqLCBnb29nLmxvY2FsZS5SZXNvdXJjZS5USU1FX1pPTkVfQ09OU1RBTlRTLCBsb2NhbGVOYW1lKQp9Owpnb29nLmxvY2FsZS5yZWdpc3RlckxvY2FsZU5hbWVDb25zdGFudHMgPSBmdW5jdGlvbiAkZ29vZyRsb2NhbGUkcmVnaXN0ZXJMb2NhbGVOYW1lQ29uc3RhbnRzJChkYXRhT2JqLCBsb2NhbGVOYW1lKSB7CiAgZ29vZy5sb2NhbGUucmVnaXN0ZXJSZXNvdXJjZShkYXRhT2JqLCBnb29nLmxvY2FsZS5SZXNvdXJjZS5MT0NBTF9OQU1FX0NPTlNUQU5UUywgbG9jYWxlTmFtZSkKfTsKZ29vZy5sb2NhbGUucmVnaXN0ZXJUaW1lWm9uZVNlbGVjdGVkSWRzID0gZnVuY3Rpb24gJGdvb2ckbG9jYWxlJHJlZ2lzdGVyVGltZVpvbmVTZWxlY3RlZElkcyQoZGF0YU9iaiwgbG9jYWxlTmFtZSkgewogIGdvb2cubG9jYWxlLnJlZ2lzdGVyUmVzb3VyY2UoZGF0YU9iaiwgZ29vZy5sb2NhbGUuUmVzb3VyY2UuVElNRV9aT05FX1NFTEVDVEVEX0lEUywgbG9jYWxlTmFtZSkKfTsKZ29vZy5sb2NhbGUucmVnaXN0ZXJUaW1lWm9uZVNlbGVjdGVkU2hvcnROYW1lcyA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRyZWdpc3RlclRpbWVab25lU2VsZWN0ZWRTaG9ydE5hbWVzJChkYXRhT2JqLCBsb2NhbGVOYW1lKSB7CiAgZ29vZy5sb2NhbGUucmVnaXN0ZXJSZXNvdXJjZShkYXRhT2JqLCBnb29nLmxvY2FsZS5SZXNvdXJjZS5USU1FX1pPTkVfU0VMRUNURURfU0hPUlRfTkFNRVMsIGxvY2FsZU5hbWUpCn07Cmdvb2cubG9jYWxlLnJlZ2lzdGVyVGltZVpvbmVTZWxlY3RlZExvbmdOYW1lcyA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRyZWdpc3RlclRpbWVab25lU2VsZWN0ZWRMb25nTmFtZXMkKGRhdGFPYmosIGxvY2FsZU5hbWUpIHsKICBnb29nLmxvY2FsZS5yZWdpc3RlclJlc291cmNlKGRhdGFPYmosIGdvb2cubG9jYWxlLlJlc291cmNlLlRJTUVfWk9ORV9TRUxFQ1RFRF9MT05HX05BTUVTLCBsb2NhbGVOYW1lKQp9Owpnb29nLmxvY2FsZS5yZWdpc3RlclRpbWVab25lQWxsTG9uZ05hbWVzID0gZnVuY3Rpb24gJGdvb2ckbG9jYWxlJHJlZ2lzdGVyVGltZVpvbmVBbGxMb25nTmFtZXMkKGRhdGFPYmosIGxvY2FsZU5hbWUpIHsKICBnb29nLmxvY2FsZS5yZWdpc3RlclJlc291cmNlKGRhdGFPYmosIGdvb2cubG9jYWxlLlJlc291cmNlLlRJTUVfWk9ORV9BTExfTE9OR19OQU1FUywgbG9jYWxlTmFtZSkKfTsKZ29vZy5sb2NhbGUuZ2V0UmVzb3VyY2UgPSBmdW5jdGlvbiAkZ29vZyRsb2NhbGUkZ2V0UmVzb3VyY2UkKHJlc291cmNlTmFtZSwgb3B0X2xvY2FsZSkgewogIHZhciBsb2NhbGUgPSBvcHRfbG9jYWxlID8gb3B0X2xvY2FsZSA6IGdvb2cubG9jYWxlLmdldExvY2FsZSgpOwogIHJldHVybiEocmVzb3VyY2VOYW1lIGluIGdvb2cubG9jYWxlLnJlc291cmNlUmVnaXN0cnlfKSA/IHZvaWQgMCA6IGdvb2cubG9jYWxlLnJlc291cmNlUmVnaXN0cnlfW3Jlc291cmNlTmFtZV1bbG9jYWxlXQp9Owpnb29nLmxvY2FsZS5nZXRSZXNvdXJjZVdpdGhGYWxsYmFjayA9IGZ1bmN0aW9uICRnb29nJGxvY2FsZSRnZXRSZXNvdXJjZVdpdGhGYWxsYmFjayQocmVzb3VyY2VOYW1lLCBvcHRfbG9jYWxlKSB7CiAgdmFyIGxvY2FsZSA9IG9wdF9sb2NhbGUgPyBvcHRfbG9jYWxlIDogZ29vZy5sb2NhbGUuZ2V0TG9jYWxlKCk7CiAgaWYocmVzb3VyY2VOYW1lIGluIGdvb2cubG9jYWxlLnJlc291cmNlUmVnaXN0cnlfKSB7CiAgICBpZihsb2NhbGUgaW4gZ29vZy5sb2NhbGUucmVzb3VyY2VSZWdpc3RyeV9bcmVzb3VyY2VOYW1lXSkgewogICAgICByZXR1cm4gZ29vZy5sb2NhbGUucmVzb3VyY2VSZWdpc3RyeV9bcmVzb3VyY2VOYW1lXVtsb2NhbGVdCiAgICB9CiAgICB2YXIgbG9jYWxlX3BhcnRzID0gbG9jYWxlLnNwbGl0KCJfIik7CiAgICByZXR1cm4gMSA8IGxvY2FsZV9wYXJ0cy5sZW5ndGggJiYgbG9jYWxlX3BhcnRzWzBdIGluIGdvb2cubG9jYWxlLnJlc291cmNlUmVnaXN0cnlfW3Jlc291cmNlTmFtZV0gPyBnb29nLmxvY2FsZS5yZXNvdXJjZVJlZ2lzdHJ5X1tyZXNvdXJjZU5hbWVdW2xvY2FsZV9wYXJ0c1swXV0gOiBnb29nLmxvY2FsZS5yZXNvdXJjZVJlZ2lzdHJ5X1tyZXNvdXJjZU5hbWVdLmVuCiAgfQp9OwpjaGF0LmNvbW1vbi5JbnRlcm5hbEVudmlyb25tZW50ID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsRW52aXJvbm1lbnQkKCkgewogIHRoaXMucHJvcGVydHlfID0gIiIKfTsKY2hhdC5jb21tb24uSW50ZXJuYWxFbnZpcm9ubWVudC5nZXQgPSBmdW5jdGlvbiAkY2hhdCRjb21tb24kSW50ZXJuYWxFbnZpcm9ubWVudCRnZXQkKCkgewogIGdvb2cuaXNEZWZBbmROb3ROdWxsKGNoYXQuY29tbW9uLkludGVybmFsRW52aXJvbm1lbnQuSU5TVEFOQ0VfKSB8fCAoY2hhdC5jb21tb24uSW50ZXJuYWxFbnZpcm9ubWVudC5JTlNUQU5DRV8gPSBuZXcgY2hhdC5jb21tb24uSW50ZXJuYWxFbnZpcm9ubWVudCk7CiAgcmV0dXJuIGNoYXQuY29tbW9uLkludGVybmFsRW52aXJvbm1lbnQuSU5TVEFOQ0VfCn07CmNoYXQuY29tbW9uLkludGVybmFsRW52aXJvbm1lbnQuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsRW52aXJvbm1lbnQkZGlzcG9zZUludGVybmFsJCgpIHsKICBkZWxldGUgY2hhdC5jb21tb24uSW50ZXJuYWxFbnZpcm9ubWVudC5JTlNUQU5DRV8KfTsKY2hhdC5jb21tb24uSW50ZXJuYWxFbnZpcm9ubWVudC5wcm90b3R5cGUuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAkY2hhdCRjb21tb24kSW50ZXJuYWxFbnZpcm9ubWVudCQkc2V0UHJvcGVydHkkKHByb3BlcnR5KSB7CiAgdGhpcy5wcm9wZXJ0eV8gPSBwcm9wZXJ0eQp9OwpjaGF0LmNvbW1vbi5JbnRlcm5hbEVudmlyb25tZW50LnByb3RvdHlwZS5nZXRQcm9wZXJ0eUFuY2hvciA9IGZ1bmN0aW9uICRjaGF0JGNvbW1vbiRJbnRlcm5hbEVudmlyb25tZW50JCRnZXRQcm9wZXJ0eUFuY2hvciQoKSB7CiAgc3dpdGNoKHRoaXMucHJvcGVydHlfLnRvTG93ZXJDYXNlKCkpIHsKICAgIGNhc2UgImlnb29nbGUiOgogICAgICByZXR1cm4iI2lnIjsKICAgIGNhc2UgIm9ya3V0IjoKICAgICAgcmV0dXJuIiNvcmt1dCI7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4iIgogIH0KfTsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMgPSB7fTsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuTWVzc2FnZXMgPSB7U0hPV19DSEFUOiJzaG93Q2hhdCIsIFNUQVJUX1ZJREVPOiJzdGFydFZpZGVvIiwgU1RBUlRfVk9JQ0U6InN0YXJ0Vm9pY2UiLCBFTkRfQ0hBVDoiZW5kQ2hhdCIsIFNFVF9DU1M6InNldENzcyIsIEdFVF9QUkVTRU5DRToiZ2V0UHJlc2VuY2UiLCBET0NLX01PTEVTX1RPX0hPU1Q6ImRtdGgiLCBERUxJVkVSX1RPX1RBTkdPOiJkdHQiLCBERUxJVkVSX1RPX1NJTVVMQVRPUjoiZHRzIiwgVkVSSUZZX0NIQVQ6InZlcmlmeUNoYXQiLCBTSEFSRV9NRVNTQUdFOiJzaGFyZU1lc3NhZ2UiLCBHRVRfU0VMRl9QUkVTRU5DRToiZ2V0U2VsZlByZXNlbmNlIiwgR0VUX0NPTlRBQ1RfQ09VTlQ6ImdldENvbnRhY3RDb3VudCIsIEhPU1RfQ0FMTDoiaCIsIENMSUVOVF9NRVNTQUdFOiJjIiwgQ0xJRU5UX1JFTE9BRDoiY3IifTsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuSE9TVF9JRCA9ICJfR0NfaG9zdCI7CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLkhPVkVSX0ZSQU1FX0lEID0gImd0aC1ob3Zlci1jYXJkIjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuUk9TVEVSX0ZSQU1FX0lEID0gImd0bi1yb3N0ZXItaWZyYW1lLWlkIjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuTUlOSV9ST1NURVJfRlJBTUVfSUQgPSAiZ3RuLW1pbmktcm9zdGVyLWlmcmFtZS1pZCI7CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLlZJREVPX01PTEVfRlJBTUVfSUQgPSAiZ3RoLXZpZGVvLW1vbGUiOwpjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5aSW5kaWNlcyA9IHtNT0xFOjEwMCwgSE9WRVJDQVJEOjFFMywgUkVTSVpFX09WRVJMQVk6MUU0fTsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuZ2V0U3dmVXJsID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGdldFN3ZlVybCQoKSB7CiAgcmV0dXJuIGNoYXQudXRpbHMuSG9zdGVkVXJsVXRpbHMuaG9zdGlmeVJvb3RSZWxhdGl2ZVVSTChkb2N1bWVudC5sb2NhdGlvbi50b1N0cmluZygpLCAiL3RhbGtnYWRnZXQvcmVzb3VyY2VzL21lZGlhLXBsYXllci5zd2YiKQp9OwpjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5tYWtlTG9nTWVzc2FnZSA9IGZ1bmN0aW9uICRjaGF0JGNvbW1vbiRJbnRlcm5hbENvbnN0YW50cyRtYWtlTG9nTWVzc2FnZSQobXNnKSB7CiAgbXNnID0gIkNsaWVudCBTaWRlIExvZ2dpbmcgLSAiICsgbXNnOwogIHJldHVybiBtc2cgPSBtc2cgKyAiICh1c2VyQWdlbnQ6IiArIGdvb2cudXNlckFnZW50LmdldFVzZXJBZ2VudFN0cmluZygpICsgIikiCn07CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLkNIQVRfVVBEQVRFRF9IRUxQX1VSTF8gPSAiaHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvY2hhdC9nby9lc2NoYXQ/aGw9IjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuZ2V0Q2hhdFVwZGF0ZWRIZWxwVXJsID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGdldENoYXRVcGRhdGVkSGVscFVybCQoKSB7CiAgcmV0dXJuIGNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLkNIQVRfVVBEQVRFRF9IRUxQX1VSTF8gKyBnb29nLmxvY2FsZS5nZXRMb2NhbGUoKQp9OwpjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5WSURFT19MRUFSTl9NT1JFX1VSTF8gPSAiaHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvdGFsay9nby92ZXJpZnlzZXR0aW5ncz9obD0iOwpjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5nZXRWaWRlb0xlYXJuTW9yZVVybCA9IGZ1bmN0aW9uICRjaGF0JGNvbW1vbiRJbnRlcm5hbENvbnN0YW50cyRnZXRWaWRlb0xlYXJuTW9yZVVybCQoKSB7CiAgcmV0dXJuIGNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLlZJREVPX0xFQVJOX01PUkVfVVJMXyArIGdvb2cubG9jYWxlLmdldExvY2FsZSgpCn07CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLlZJREVPX1RST1VCTEVTSE9PVF9VUkxfID0gImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L2NoYXQvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTYyMTc0JmhsPSI7CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLmdldFZpZGVvVHJvdWJsZXNob290VXJsID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGdldFZpZGVvVHJvdWJsZXNob290VXJsJCgpIHsKICByZXR1cm4gY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuVklERU9fVFJPVUJMRVNIT09UX1VSTF8gKyBnb29nLmxvY2FsZS5nZXRMb2NhbGUoKQp9OwpjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5WSURFT19VTlNVUFBPUlRFRF9IRUxQX1VSTF8gPSAiaHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvY2hhdC9iaW4vYW5zd2VyLnB5P2Fuc3dlcj0xNjE5ODUmaGw9IjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuZ2V0VmlkZW9VbnN1cHBvcnRlZEhlbHBVcmwgPSBmdW5jdGlvbiAkY2hhdCRjb21tb24kSW50ZXJuYWxDb25zdGFudHMkZ2V0VmlkZW9VbnN1cHBvcnRlZEhlbHBVcmwkKCkgewogIHJldHVybiBjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5WSURFT19VTlNVUFBPUlRFRF9IRUxQX1VSTF8gKyBnb29nLmxvY2FsZS5nZXRMb2NhbGUoKQp9OwpjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5WSURFT19JTlNUQUxMX1VSTF8gPSAiaHR0cDovL3Rvb2xzLmdvb2dsZS5jb20vdG9vbHMvZGxwYWdlL3Jlcy90YWxrdmlkZW8vb3Blbmluc3RhbGxwYWdlLmh0bWw/aGw9IjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuVklERU9fSU5TVEFMTF9VUkxfRk9SX1ZPSUNFXyA9ICJodHRwOi8vd3d3Lmdvb2dsZS5jb20vaW50bC8lcy9jaGF0L3ZvaWNlIjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuZ2V0VmlkZW9JbnN0YWxsVXJsID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGdldFZpZGVvSW5zdGFsbFVybCQoKSB7CiAgcmV0dXJuIGNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLlZJREVPX0lOU1RBTExfVVJMXyArIGdvb2cubG9jYWxlLmdldExvY2FsZSgpICsgY2hhdC5jb21tb24uSW50ZXJuYWxFbnZpcm9ubWVudC5nZXQoKS5nZXRQcm9wZXJ0eUFuY2hvcigpCn07CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLmdldFZpZGVvSW5zdGFsbFVybEZvclZvaWNlID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGdldFZpZGVvSW5zdGFsbFVybEZvclZvaWNlJCgpIHsKICByZXR1cm4gZ29vZy5zdHJpbmcuc3VicyhjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5WSURFT19JTlNUQUxMX1VSTF9GT1JfVk9JQ0VfLCBnb29nLkxPQ0FMRSkKfTsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuZ2V0TGVhcm5Nb3JlTGlua0ZvclZvaWNlID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGdldExlYXJuTW9yZUxpbmtGb3JWb2ljZSQoKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnN1YnMoY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuVklERU9fSU5TVEFMTF9VUkxfRk9SX1ZPSUNFXywgZ29vZy5MT0NBTEUpCn07CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLmdldEltYWdlVXJsID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGdldEltYWdlVXJsJChiYXNlTmFtZSkgewogIHJldHVyblsiaW1hZ2VzLyIsIGJhc2VOYW1lLCBnb29nLnVzZXJBZ2VudC5JRSA/ICIuZ2lmIiA6ICIucG5nIl0uam9pbigiIikKfTsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuVk9JQ0VfUkFURVNfVVJMXyA9ICJodHRwczovL3d3dy5nb29nbGUuY29tL3ZvaWNlL3JhdGVzP2hsPSVzIjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuZ2V0Vm9pY2VSYXRlVXJsID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGdldFZvaWNlUmF0ZVVybCQoKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnN1YnMoY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuVk9JQ0VfUkFURVNfVVJMXywgZ29vZy5MT0NBTEUpCn07CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLlZPSUNFX0xFQVJOX01PUkVfVVJMXyA9ICJodHRwOi8vZ29vZ2xlLmNvbS9zdXBwb3J0L2NoYXQvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTg3NjE0JmhsPSVzIjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuZ2V0Vm9pY2VMZWFybk1vcmVVcmwgPSBmdW5jdGlvbiAkY2hhdCRjb21tb24kSW50ZXJuYWxDb25zdGFudHMkZ2V0Vm9pY2VMZWFybk1vcmVVcmwkKCkgewogIHJldHVybiBnb29nLnN0cmluZy5zdWJzKGNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLlZPSUNFX0xFQVJOX01PUkVfVVJMXywgZ29vZy5MT0NBTEUpCn07CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLlZPSUNFX0JMT0NLRURfV0FSTklOR19IRUxQXyA9ICJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc3VwcG9ydC9jaGF0L2Jpbi9hbnN3ZXIucHk/YW5zd2VyPTEyNjc2NDQmaGw9JXMiOwpjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5nZXRWb2ljZUJsb2NrZWRXYXJuaW5nSGVscFVybCA9IGZ1bmN0aW9uICRjaGF0JGNvbW1vbiRJbnRlcm5hbENvbnN0YW50cyRnZXRWb2ljZUJsb2NrZWRXYXJuaW5nSGVscFVybCQoKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnN1YnMoY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuVk9JQ0VfQkxPQ0tFRF9XQVJOSU5HX0hFTFBfLCBnb29nLkxPQ0FMRSkKfTsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuQUREX0NSRURJVF9MSU5LXyA9ICJodHRwczovL3d3dy5nb29nbGUuY29tL3ZvaWNlJXMvYWNjb3VudC9zaWduaW4/cHJldj0lMjNiaWxsaW5nJTJmIjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuZ2V0Q3JlZGl0TGluayA9IGZ1bmN0aW9uICRjaGF0JGNvbW1vbiRJbnRlcm5hbENvbnN0YW50cyRnZXRDcmVkaXRMaW5rJChhdXRoVXNlcikgewogIHJldHVybiBjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5jcmVhdGVWb2ljZUxpbmtfKGNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLkFERF9DUkVESVRfTElOS18sIGF1dGhVc2VyKQp9OwpjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5WT0lDRV9IRUxQX1VSTF8gPSAiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L2NoYXQ/cD1jYWxscGhvbmVoZWxwJmhsPSVzIjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuZ2V0Vm9pY2VIZWxwVXJsID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGdldFZvaWNlSGVscFVybCQoKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnN1YnMoY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuVk9JQ0VfSEVMUF9VUkxfLCBnb29nLkxPQ0FMRSkKfTsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuSElTVE9SWV9MSU5LXyA9ICJodHRwczovL3d3dy5nb29nbGUuY29tL3ZvaWNlJXMvYWNjb3VudC9zaWduaW4/cHJldj0lMjNoaXN0b3J5JTJmIjsKY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuZ2V0SGlzdG9yeUxpbmsgPSBmdW5jdGlvbiAkY2hhdCRjb21tb24kSW50ZXJuYWxDb25zdGFudHMkZ2V0SGlzdG9yeUxpbmskKGF1dGhVc2VyKSB7CiAgcmV0dXJuIGNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLmNyZWF0ZVZvaWNlTGlua18oY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuSElTVE9SWV9MSU5LXywgYXV0aFVzZXIpCn07CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLlZPSUNFX1NFVFRJTkdTXyA9ICJodHRwczovL3d3dy5nb29nbGUuY29tL3ZvaWNlJXMvYWNjb3VudC9zaWduaW4/cHJldj0lMjNwaG9uZXMlMmYiOwpjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5nZXRWb2ljZVNldHRpbmdzTGluayA9IGZ1bmN0aW9uICRjaGF0JGNvbW1vbiRJbnRlcm5hbENvbnN0YW50cyRnZXRWb2ljZVNldHRpbmdzTGluayQoYXV0aFVzZXIpIHsKICByZXR1cm4gY2hhdC5jb21tb24uSW50ZXJuYWxDb25zdGFudHMuY3JlYXRlVm9pY2VMaW5rXyhjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5WT0lDRV9TRVRUSU5HU18sIGF1dGhVc2VyKQp9OwpjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5jcmVhdGVWb2ljZUxpbmtfID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGNyZWF0ZVZvaWNlTGlua18kKGxpbmssIGF1dGhVc2VyKSB7CiAgdmFyIGF1dGhMaW5rID0gYXV0aFVzZXIgPyAiL2IvIiArIGF1dGhVc2VyIDogIiI7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLnN1YnMobGluaywgYXV0aExpbmspCn07CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLlZPSUNFX0xFR0FMX0xJTktfID0gImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9pbnRsLyVzL2dvb2dsZXZvaWNlL2xlZ2FsLW5vdGljZXMuaHRtbCI7CmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLmdldFZvaWNlTGVnYWxMaW5rID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJEludGVybmFsQ29uc3RhbnRzJGdldFZvaWNlTGVnYWxMaW5rJCgpIHsKICByZXR1cm4gZ29vZy5zdHJpbmcuc3VicyhjaGF0LmNvbW1vbi5JbnRlcm5hbENvbnN0YW50cy5WT0lDRV9MRUdBTF9MSU5LXywgZ29vZy5MT0NBTEUpCn07CnRhbGsubWVkaWEucGhvbmUuc295ID0ge307CnRhbGsubWVkaWEucGhvbmUuc295LlN0YXJ0RXJyb3IgPSB7fTsKdGFsay5tZWRpYS5waG9uZS5zb3kuU3RhcnRFcnJvci5TSUdOX0lOID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkc295JFN0YXJ0RXJyb3IkU0lHTl9JTiQob3B0X2RhdGEsIG9wdF9zYikgewogIHZhciBvdXRwdXQgPSBvcHRfc2IgfHwgbmV3IHNveS5TdHJpbmdCdWlsZGVyLCBNU0dfVU5OQU1FRF83OCA9ICJQbGVhc2UgIiArICgnPHNwYW4gY2xhc3M9IkNTU19ESUFMUEFEX0VSUk9SX0xJTksiIGFjdGlvbj0iJyArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuYWN0aW9uSWQpICsgJyI+c2lnbiBpbnRvIGNoYXQ8L3NwYW4+IHRvIG1ha2UgYSBjYWxsLicpOwogIG91dHB1dC5hcHBlbmQoTVNHX1VOTkFNRURfNzgpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEucGhvbmUuc295LlN0YXJ0RXJyb3IuUExVR0lOID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkc295JFN0YXJ0RXJyb3IkUExVR0lOJChvcHRfZGF0YSwgb3B0X3NiKSB7CiAgdmFyIG91dHB1dCA9IG9wdF9zYiB8fCBuZXcgc295LlN0cmluZ0J1aWxkZXIsIE1TR19VTk5BTUVEXzgwID0gIlBsZWFzZSAiICsgKCc8YSBocmVmPSInICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5saW5rQ2xhc3MpICsgJyIgY2xhc3M9IkNTU19ESUFMUEFEX0VSUk9SX0xJTksiIHRhcmdldD0iX2JsYW5rIj5kb3dubG9hZCB0aGUgdm9pY2UgcGx1Z2luPC9hPiB0byBtYWtlIGEgY2FsbC4nKTsKICBvdXRwdXQuYXBwZW5kKE1TR19VTk5BTUVEXzgwKTsKICByZXR1cm4gb3B0X3NiID8gIiIgOiBvdXRwdXQudG9TdHJpbmcoKQp9Owp0YWxrLm1lZGlhLnBob25lLnNveS5TdGFydEVycm9yLklOU1RBTExfRkxBU0ggPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRzb3kkU3RhcnRFcnJvciRJTlNUQUxMX0ZMQVNIJChvcHRfZGF0YSwgb3B0X3NiKSB7CiAgdmFyIG91dHB1dCA9IG9wdF9zYiB8fCBuZXcgc295LlN0cmluZ0J1aWxkZXIsIE1TR19VTk5BTUVEXzgyID0gIkZsYXNoIGlzIHJlcXVpcmVkIHRvIG1ha2UgYSBjYWxsLiAgIiArICgnPGEgY2xhc3M9IicgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmxpbmtDbGFzcykgKyAnIiB0YXJnZXQ9X2JsYW5rIGhyZWY9Imh0dHA6Ly93d3cuYWRvYmUuY29tL2dvL2dldGZsYXNocGxheWVyIj5DbGljayBoZXJlPC9hPiB0byBpbnN0YWxsIG5vdy4nKTsKICBvdXRwdXQuYXBwZW5kKE1TR19VTk5BTUVEXzgyKTsKICByZXR1cm4gb3B0X3NiID8gIiIgOiBvdXRwdXQudG9TdHJpbmcoKQp9Owp0YWxrLm1lZGlhLnBob25lLnNveS5TdGFydEVycm9yLlVQR1JBREVfRkxBU0ggPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRzb3kkU3RhcnRFcnJvciRVUEdSQURFX0ZMQVNIJChvcHRfZGF0YSwgb3B0X3NiKSB7CiAgdmFyIG91dHB1dCA9IG9wdF9zYiB8fCBuZXcgc295LlN0cmluZ0J1aWxkZXIsIE1TR19VTk5BTUVEXzg0ID0gIllvdSBtdXN0IHVwZ3JhZGUgRmxhc2ggdG8gbWFrZSBhIGNhbGwuICAiICsgKCc8YSBjbGFzcz0iJyArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEubGlua0NsYXNzKSArICciIHRhcmdldD1fYmxhbmsgaHJlZj0iaHR0cDovL3d3dy5hZG9iZS5jb20vZ28vZ2V0Zmxhc2hwbGF5ZXIiPkNsaWNrIGhlcmU8L2E+IHRvIHVwZ3JhZGUgbm93LicpOwogIG91dHB1dC5hcHBlbmQoTVNHX1VOTkFNRURfODQpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEucGhvbmUuU3RhcnRFcnJvciA9IHt9Owp0YWxrLm1lZGlhLnBob25lLlN0YXJ0RXJyb3IuZ2V0Q2FsbE1hbmFnZXJTdGF0ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJFN0YXJ0RXJyb3IkZ2V0Q2FsbE1hbmFnZXJTdGF0ZSQoY2FsbE1hbmFnZXIpIHsKICByZXR1cm4gdGFsay5tZWRpYS5DYW5DYWxsLmdldENhbGxNYW5hZ2VyRXJyb3IoY2FsbE1hbmFnZXIsIHRhbGsubWVkaWEuQ2FsbFR5cGVGb3JEaXNwbGF5LlBIT05FKQp9Owp0YWxrLm1lZGlhLnBob25lLlN0YXJ0RXJyb3IuZ2V0RXJyb3JIdG1sID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkU3RhcnRFcnJvciRnZXRFcnJvckh0bWwkKHN0YXRlKSB7CiAgc3dpdGNoKHN0YXRlKSB7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbGFibGVTdGF0ZS5TSUdORURfT1VUOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5waG9uZS5zb3kuU3RhcnRFcnJvci5TSUdOX0lOKHthY3Rpb25JZDp0YWxrLm1lZGlhLkNhbGxhYmxlU3RhdGUuU0lHTkVEX09VVH0pOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxhYmxlU3RhdGUuSU5TVEFMTEFCTEU6CiAgICAgIHJldHVybiB0YWxrLm1lZGlhLnBob25lLnNveS5TdGFydEVycm9yLlBMVUdJTih7bGlua0NsYXNzOmNoYXQuY29tbW9uLkludGVybmFsQ29uc3RhbnRzLmdldFZpZGVvSW5zdGFsbFVybEZvclZvaWNlKCl9KTsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsYWJsZVN0YXRlLklOU1RBTExBQkxFX0ZMQVNIOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5waG9uZS5zb3kuU3RhcnRFcnJvci5JTlNUQUxMX0ZMQVNIKHtsaW5rQ2xhc3M6IkNTU19ESUFMUEFEX0VSUk9SX0xJTksifSk7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbGFibGVTdGF0ZS5VUEdSQURFX0ZMQVNIOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5waG9uZS5zb3kuU3RhcnRFcnJvci5VUEdSQURFX0ZMQVNIKHtsaW5rQ2xhc3M6IkNTU19ESUFMUEFEX0VSUk9SX0xJTksifSk7CiAgICBjYXNlIHRhbGsubWVkaWEuQ2FsbGFibGVTdGF0ZS5JTlZBTElEX05VTUJFUjoKICAgICAgcmV0dXJuIlBsZWFzZSBlbnRlciBhIHZhbGlkIG51bWJlci4iOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxhYmxlU3RhdGUuRElTQUJMRURfSU5fQ0FMTDoKICAgICAgcmV0dXJuIllvdSBhcmUgYWxyZWFkeSBpbiBhIGNhbGwuIFBsZWFzZSBlbmQgdGhhdCBjYWxsIGJlZm9yZSBwbGFjaW5nIGFub3RoZXIuIjsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsYWJsZVN0YXRlLkRJU0FCTEVEX0lOX0NBTExfSklEOgogICAgICByZXR1cm4iWW91IGFyZSBhbHJlYWR5IGluIGEgY2FsbCB3aXRoIHRoYXQgcGVyc29uLiAgUGxlYXNlIGVuZCB0aGF0IGNhbGwgYmVmb3JlIHBsYWNpbmcgYW5vdGhlci4iOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxhYmxlU3RhdGUuRElTQ09OTkVDVEVEOgogICAgICByZXR1cm4iUGxlYXNlIHdhaXQgZm9yIGNoYXQgdG8gY29ubmVjdCBiZWZvcmUgcGxhY2luZyBjYWxscy4iOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxhYmxlU3RhdGUuUEhPTkVfTk9UX1NFVFVQOgogICAgICByZXR1cm4iUGxlYXNlIHdhaXQgd2hpbGUgd2UgcHJlcGFyZSB5b3VyIGFjY291bnQsIHRoaXMgbWF5IHRha2UgYSBtaW51dGUuIjsKICAgIGNhc2UgdGFsay5tZWRpYS5DYWxsYWJsZVN0YXRlLk5PX0FVRElPX1NQRUFLRVJTOgogICAgOwogICAgY2FzZSB0YWxrLm1lZGlhLkNhbGxhYmxlU3RhdGUuTk9fQVVESU9fTUlDOgogICAgICByZXR1cm4gdGFsay5tZWRpYS5DYW5DYWxsLmdldFNpbXBsZUVycm9yTXNnXyhzdGF0ZSk7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4iIgogIH0KfTsKdGFsay5tZWRpYS5waG9uZS5CYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRCYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UkKGFwcENvbnRleHQpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuYXBwQ29udGV4dCA9IGFwcENvbnRleHQ7CiAgdGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHRoaXMuY2FsbEhpc3RvcnkgPSBuZXcgdGFsay5tZWRpYS5waG9uZS5DYWxsSGlzdG9yeShhcHBDb250ZXh0LCB0aGlzKTsKICB0aGlzLmZvcndhcmRpbmdQaG9uZVNldF8gPSBuZXcgdGFsay5tZWRpYS5waG9uZS5Gb3J3YXJkaW5nUGhvbmVTZXQodGhpcy5hcHBDb250ZXh0KTsKICB0aGlzLmNhbGxiYWNrTWFwXyA9IHt9Cn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5waG9uZS5CYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKdGFsay5tZWRpYS5waG9uZS5CYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UuQWNjb3VudFR5cGUgPSB7Tk9ORTowLCBMSVRFOjEsIEZVTEw6MiwgQ0xJRU5UX09OTFk6M307CnRhbGsubWVkaWEucGhvbmUuQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlLkhpc3RvcnlUeXBlID0ge0FMTF9DQUxMUzoiYWxsIiwgSU5CT1g6ImluYm94IiwgU1RBUlJFRDoic3RhcnJlZCIsIFNQQU06InNwYW0iLCBUUkFTSDoidHJhc2giLCBWT0lDRU1BSUw6InZvaWNlbWFpbCIsIFNNUzoic21zIiwgUkVDT1JERUQ6InJlY29yZGVkIiwgUExBQ0VEOiJwbGFjZWQiLCBSRUNFSVZFRDoicmVjZWl2ZWQiLCBNSVNTRUQ6Im1pc3NlZCIsIFVOUkVBRDoidW5yZWFkIn07CnRhbGsubWVkaWEucGhvbmUuQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlLkZvcndhcmRpbmdDYWxsU3RhdHVzID0ge09LOjAsIEZBSUw6MSwgSU5WQUxJRF9QSE9ORV9OVU1CRVI6MiwgRk9SV0FSRElOR19JTlZBTElEOjMsIFVTRVJfUVVPVEFfRVhDRUVERUQ6NH07CnRhbGsubWVkaWEucGhvbmUuQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlLlNlbmRTbXNNZXNzYWdlUmVzdWx0ID0ge1NVQ0NFU1M6MCwgUlBDX0VSUk9SOjF9Owp0YWxrLm1lZGlhLnBob25lLkJhc2VPdXRib3VuZFZvaWNlU2VydmljZS5FdmVudHMgPSB7Q1JFRElUOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJjcmVkaXQiKSwgSElTVE9SWTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiaGlzdG9yeSIpLCBISVNUT1JZX0NIQU5HRTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiaGlzdG9yeV9jaGFuZ2UiKSwgTlVNQkVSOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJudW1iZXIiKSwgQ09OVEFDVF9VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInVwZGF0ZSIpLCBGT1JXQVJESU5HX0NBTExfU1RBVFVTOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJmb3J3YXJkaW5nX2NhbGxfc3RhdHVzIiksIFVQREFURV9DT1VOVFJJRVM6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInVwZGF0ZV9jb3VudHJpZXMiKSwgVVBEQVRFX1JBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInVwZGF0ZV9yYXRlIil9Owp0YWxrLm1lZGlhLnBob25lLkJhc2VPdXRib3VuZFZvaWNlU2VydmljZS5UYWJJZCA9IHtESUFMUEFEOjAsIENBTExISVNUT1JZOjF9Owp0YWxrLm1lZGlhLnBob25lLkJhc2VPdXRib3VuZFZvaWNlU2VydmljZS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuZGlzcG9zZSh0aGlzLmV2ZW50SGFuZGxlcik7CiAgZGVsZXRlIHRoaXMuY2FsbGJhY2tNYXBfOwogIGdvb2cuZGlzcG9zZSh0aGlzLmNhbGxIaXN0b3J5KTsKICBnb29nLmRpc3Bvc2UodGhpcy5mb3J3YXJkaW5nUGhvbmVTZXRfKTsKICB0YWxrLm1lZGlhLnBob25lLkJhc2VPdXRib3VuZFZvaWNlU2VydmljZS5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLnBob25lLkJhc2VPdXRib3VuZFZvaWNlU2VydmljZS5nZXQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRCYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UkZ2V0JChhcHBDb250ZXh0KSB7CiAgcmV0dXJuIGFwcENvbnRleHQuZ2V0T3JOdWxsKGZhdmEuc2VydmljZXMuT1VUQk9VTkRfVk9JQ0UpCn07CnRhbGsubWVkaWEucGhvbmUuQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlLmlzUGhvbmVKaWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRCYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UkaXNQaG9uZUppZCQoamlkKSB7CiAgcmV0dXJuIGdvb2cuc3RyaW5nLmVuZHNXaXRoKGppZCwgIkB2b2ljZS5nb29nbGUuY29tIikKfTsKdGFsay5tZWRpYS5waG9uZS5CYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UuQ3JlZGl0RXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRwaG9uZSRCYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UkQ3JlZGl0RXZlbnQkKHZvaWNlU2VydmljZSkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5waG9uZS5CYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UuRXZlbnRzLkNSRURJVCwgdm9pY2VTZXJ2aWNlKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEucGhvbmUuQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlLkNyZWRpdEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEucGhvbmUuQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlLk51bWJlckV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlJE51bWJlckV2ZW50JCh2b2ljZVNlcnZpY2UpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEucGhvbmUuQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlLkV2ZW50cy5OVU1CRVIsIHZvaWNlU2VydmljZSkKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLnBob25lLkJhc2VPdXRib3VuZFZvaWNlU2VydmljZS5OdW1iZXJFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLnBob25lLkJhc2VPdXRib3VuZFZvaWNlU2VydmljZS5Gb3J3YXJkaW5nQ2FsbEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlJEZvcndhcmRpbmdDYWxsRXZlbnQkKHZvaWNlU2VydmljZSwgZm9yd2FyZGluZ1R5cGUsIGZvcndhcmRpbmdQaG9uZSwgb3V0Ym91bmRQaG9uZSwgc3RhdHVzKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLnBob25lLkJhc2VPdXRib3VuZFZvaWNlU2VydmljZS5FdmVudHMuRk9SV0FSRElOR19DQUxMX1NUQVRVUywgdm9pY2VTZXJ2aWNlKTsKICB0aGlzLnN0YXR1cyA9IHN0YXR1cwp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEucGhvbmUuQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlLkZvcndhcmRpbmdDYWxsRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5waG9uZS5CYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UuUmF0ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHBob25lJEJhc2VPdXRib3VuZFZvaWNlU2VydmljZSRSYXRlJCgpIHsKfTsKdGFsay5tZWRpYS5waG9uZS5CYXNlT3V0Ym91bmRWb2ljZVNlcnZpY2UuVXBkYXRlUmF0ZUV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcGhvbmUkQmFzZU91dGJvdW5kVm9pY2VTZXJ2aWNlJFVwZGF0ZVJhdGVFdmVudCQodm9pY2VTZXJ2aWNlKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLnBob25lLkJhc2VPdXRib3VuZFZvaWNlU2VydmljZS5FdmVudHMuVVBEQVRFX1JBVEUsIHZvaWNlU2VydmljZSkKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLnBob25lLkJhc2VPdXRib3VuZFZvaWNlU2VydmljZS5VcGRhdGVSYXRlRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKY2hhdC5tb2RlbC5tZSA9IHt9OwpjaGF0Lm1vZGVsLm1lLlNoYXJlZFByZXNlbmNlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkbWUkU2hhcmVkUHJlc2VuY2UkKGFwcENvbnRleHQpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKTsKICB0aGlzLmNvbmZpZ18gPSBjaGF0LmNsaWVudC5SZWFkT25seUNvbmZpZy5nZXQoYXBwQ29udGV4dCk7CiAgdmFyIGluaXRpYWxTaG93ID0gdGhpcy5jb25maWdfLm5vdGlmaWNhdGlvbnNPbmx5ID8gZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuU2hvdy5PRkZMSU5FIDogdGhpcy5jb25maWdfLmluaXRpYWxTaG93OwogIHRoaXMubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigiY2hhdC5tb2RlbC5NZSIpOwogIHRoaXMuc2VydmVyTWVzc2FnZVNlbmRlcl8gPSBjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlU2VuZGVyLmdldChhcHBDb250ZXh0KTsKICB0aGlzLnN0YXRlc0xpc3RfID0gbmV3IGdvb2cuc3RydWN0cy5TZXQ7CiAgdGhpcy5vbmxpbmVTdGF0ZV8gPSB0aGlzLmlzT25saW5lU2hvdyhpbml0aWFsU2hvdykgPyBpbml0aWFsU2hvdyA6IGNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuT25saW5lU3RhdGUuQVZBSUxBQkxFOwogIHRoaXMudXNlclN0YXR1c18gPSAiIjsKICB0aGlzLmluaXRpYWxseU9mZmxpbmVfID0gITAKfTsKZ29vZy5pbmhlcml0cyhjaGF0Lm1vZGVsLm1lLlNoYXJlZFByZXNlbmNlLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuTVNHX1NJR05fSU5fVE9fQ0hBVCA9ICJTaWduIGludG8gY2hhdCI7CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuTVNHX0lOVklTSUJMRV9TVEFUVVNfU1RSSU5HID0gIkludmlzaWJsZSI7CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuTVNHX0RJU0NPTk5FQ1RFRF9TVEFUVVNfU1RSSU5HID0gIkRpc2Nvbm5lY3RlZCI7CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuTVNHX0RFRkFVTFRfU1RBVFVTX1NUUklORyA9ICJTZXQgc3RhdHVzIGhlcmUiOwpjaGF0Lm1vZGVsLm1lLlNoYXJlZFByZXNlbmNlLk1TR19ERUZBVUxUX1FVQVNBUl9TVEFUVVNfU1RSSU5HID0gIlNldCB5b3VyIHN0YXR1cyBoZXJlIjsKY2hhdC5tb2RlbC5tZS5TaGFyZWRQcmVzZW5jZS5FdmVudFR5cGUgPSB7SU5WSVNJQklMSVRZX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiaW52aXNpYmlsaXR5X3VwZGF0ZSIpLCBJU19VU0VSX0NPTk5FQ1RFRF9VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImlzX3VzZXJfY29ubmVjdGVkX3VwZGF0ZSIpLCBTVEFUVVNfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJzdGF0dXNfdXBkYXRlIiksIFNIT1dfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJzaG93X3VwZGF0ZSIpLCBPRkZMSU5FX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgib2ZmbGluZV91cGRhdGUiKX07CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJG1lJFNoYXJlZFByZXNlbmNlJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2Uuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5zdGF0ZXNMaXN0Xy5jbGVhcigpCn07CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuU3RhdGUgPSB7SU5WSVNJQkxFOiJpbnZpc2libGUiLCBPRkZMSU5FOmdvb2cudGFsay5zaGFyZWRjb25zdGFudHMuU2hhcmVkU3RhdHVzLlNob3cuT0ZGTElORSwgRElTQ09OTkVDVEVEOiJkaXNjb25uZWN0ZWQiLCBJRExFOmdvb2cudGFsay5zaGFyZWRjb25zdGFudHMuU2hhcmVkU3RhdHVzLlNob3cuSURMRSwgSU5JVElBTElaRUQ6ImluaXRpYWxpemVkIn07CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuT25saW5lU3RhdGUgPSB7QVZBSUxBQkxFOmdvb2cudGFsay5zaGFyZWRjb25zdGFudHMuU2hhcmVkU3RhdHVzLlNob3cuQVZBSUxBQkxFLCBCVVNZOmdvb2cudGFsay5zaGFyZWRjb25zdGFudHMuU2hhcmVkU3RhdHVzLlNob3cuQlVTWX07CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UucHJvdG90eXBlLnNldFNob3cgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRtZSRTaGFyZWRQcmVzZW5jZSQkc2V0U2hvdyQobmV3U2hvdywgb3B0X3VwZGF0ZVNlcnZlcikgewogIHJldHVybiB0aGlzLmlzT25saW5lU2hvdyhuZXdTaG93KSAmJiB0aGlzLm9ubGluZVN0YXRlXyAhPSBuZXdTaG93ID8gKHRoaXMub25saW5lU3RhdGVfID0gbmV3U2hvdywgdGhpcy5kaXNwYXRjaEV2ZW50KGNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuRXZlbnRUeXBlLlNIT1dfVVBEQVRFKSwgKCFnb29nLmlzRGVmKG9wdF91cGRhdGVTZXJ2ZXIpIHx8IG9wdF91cGRhdGVTZXJ2ZXIpICYmIHRoaXMuc2VuZFVzZXJQcmVzZW5jZV8oKSwgITApIDogITEKfTsKY2hhdC5tb2RlbC5tZS5TaGFyZWRQcmVzZW5jZS5wcm90b3R5cGUuZ2V0VXNlckVudGVyZWRTdGF0dXNNc2cgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRtZSRTaGFyZWRQcmVzZW5jZSQkZ2V0VXNlckVudGVyZWRTdGF0dXNNc2ckKCkgewogIHJldHVybiB0aGlzLnVzZXJTdGF0dXNfCn07CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UucHJvdG90eXBlLmdldFNoYXJlZFNob3cgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRtZSRTaGFyZWRQcmVzZW5jZSQkZ2V0U2hhcmVkU2hvdyQoKSB7CiAgcmV0dXJuIHRoaXMub25saW5lU3RhdGVfCn07CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UucHJvdG90eXBlLmdldFJlc291cmNlUHJlc2VuY2UgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRtZSRTaGFyZWRQcmVzZW5jZSQkZ2V0UmVzb3VyY2VQcmVzZW5jZSQoKSB7CiAgaWYodGhpcy5pc0luaXRpYWxpemVkKCkpIHsKICAgIGlmKHRoaXMuaXNPZmZsaW5lKCkpIHsKICAgICAgcmV0dXJuIGdvb2cudGFsay5zaGFyZWRjb25zdGFudHMuU2hhcmVkU3RhdHVzLlNob3cuT0ZGTElORQogICAgfQogICAgaWYodGhpcy5pc0lkbGUoKSkgewogICAgICByZXR1cm4gZ29vZy50YWxrLnNoYXJlZGNvbnN0YW50cy5TaGFyZWRTdGF0dXMuU2hvdy5JRExFCiAgICB9CiAgfWVsc2UgewogICAgcmV0dXJuIG51bGwKICB9CiAgcmV0dXJuIGdvb2cudGFsay5zaGFyZWRjb25zdGFudHMuU2hhcmVkU3RhdHVzLlNob3cuQVZBSUxBQkxFCn07CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UucHJvdG90eXBlLmlzT25saW5lU2hvdyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJG1lJFNoYXJlZFByZXNlbmNlJCRpc09ubGluZVNob3ckKHNob3cpIHsKICByZXR1cm4gc2hvdyA9PSBnb29nLnRhbGsuc2hhcmVkY29uc3RhbnRzLlNoYXJlZFN0YXR1cy5TaG93LkFWQUlMQUJMRSB8fCBzaG93ID09IGdvb2cudGFsay5zaGFyZWRjb25zdGFudHMuU2hhcmVkU3RhdHVzLlNob3cuQlVTWQp9OwpjaGF0Lm1vZGVsLm1lLlNoYXJlZFByZXNlbmNlLnByb3RvdHlwZS5pc0ludmlzaWJsZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJG1lJFNoYXJlZFByZXNlbmNlJCRpc0ludmlzaWJsZSQoKSB7CiAgcmV0dXJuIHRoaXMuc3RhdGVzTGlzdF8uY29udGFpbnMoY2hhdC5tb2RlbC5tZS5TaGFyZWRQcmVzZW5jZS5TdGF0ZS5JTlZJU0lCTEUpCn07CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UucHJvdG90eXBlLmlzT2ZmbGluZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJG1lJFNoYXJlZFByZXNlbmNlJCRpc09mZmxpbmUkKCkgewogIHJldHVybiB0aGlzLmluaXRpYWxseU9mZmxpbmVfIHx8IHRoaXMuc3RhdGVzTGlzdF8uY29udGFpbnMoY2hhdC5tb2RlbC5tZS5TaGFyZWRQcmVzZW5jZS5TdGF0ZS5PRkZMSU5FKQp9OwpjaGF0Lm1vZGVsLm1lLlNoYXJlZFByZXNlbmNlLnByb3RvdHlwZS5pc0luaXRpYWxpemVkID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkbWUkU2hhcmVkUHJlc2VuY2UkJGlzSW5pdGlhbGl6ZWQkKCkgewogIHJldHVybiB0aGlzLnN0YXRlc0xpc3RfLmNvbnRhaW5zKGNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuU3RhdGUuSU5JVElBTElaRUQpCn07CmNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UucHJvdG90eXBlLmlzSWRsZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJG1lJFNoYXJlZFByZXNlbmNlJCRpc0lkbGUkKCkgewogIHJldHVybiB0aGlzLnN0YXRlc0xpc3RfLmNvbnRhaW5zKGNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuU3RhdGUuSURMRSkKfTsKY2hhdC5tb2RlbC5tZS5TaGFyZWRQcmVzZW5jZS5wcm90b3R5cGUuc2VuZFVzZXJQcmVzZW5jZV8gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRtZSRTaGFyZWRQcmVzZW5jZSQkc2VuZFVzZXJQcmVzZW5jZV8kKCkgewogIHRoaXMuc2VydmVyTWVzc2FnZVNlbmRlcl8uc2VuZFVzZXJQcmVzZW5jZSh0aGlzLmdldFNoYXJlZFNob3coKSwgdGhpcy5nZXRVc2VyRW50ZXJlZFN0YXR1c01zZygpLCB0aGlzLmlzSW52aXNpYmxlKCkpCn07CmNoYXQubW9kZWwubWUuU2VydmVyVXBkYXRhYmxlU2hhcmVkUHJlc2VuY2UgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRtZSRTZXJ2ZXJVcGRhdGFibGVTaGFyZWRQcmVzZW5jZSQoYXBwQ29udGV4dCkgewogIGNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UuY2FsbCh0aGlzLCBhcHBDb250ZXh0KQp9Owpnb29nLmluaGVyaXRzKGNoYXQubW9kZWwubWUuU2VydmVyVXBkYXRhYmxlU2hhcmVkUHJlc2VuY2UsIGNoYXQubW9kZWwubWUuU2hhcmVkUHJlc2VuY2UpOwpwcm90by5hcHBzLmNoYXQuU2V0dGluZ3NVcGRhdGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFNldHRpbmdzVXBkYXRlJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbInN1cyJdOwogIHRoaXMuYXJyYXlbMV0gPSB0aGlzLmFycmF5WzFdIHx8IFtdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0LlNldHRpbmdzVXBkYXRlLCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuU2V0dGluZ3NVcGRhdGUubWVzc2FnZUlkID0gInN1cyI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5TZXR0aW5nc1VwZGF0ZS5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5TZXR0aW5nc1VwZGF0ZSk7CnByb3RvLmFwcHMuY2hhdC5TZXR0aW5nc1VwZGF0ZS5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkU2V0dGluZ3NVcGRhdGUkJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuU2V0dGluZ3NVcGRhdGUubWVzc2FnZUlkCn07CnByb3RvLmFwcHMuY2hhdC5TZXR0aW5nc1VwZGF0ZS5wcm90b3R5cGUuZ2V0U2V0dGluZ0xpc3QgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFNldHRpbmdzVXBkYXRlJCRnZXRTZXR0aW5nTGlzdCQoKSB7CiAgaWYoIXRoaXMuc2V0dGluZ18pIHsKICAgIHRoaXMuc2V0dGluZ18gPSBbXTsKICAgIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuYXJyYXlbMV0ubGVuZ3RoO2krKykgewogICAgICB0aGlzLnNldHRpbmdfW2ldID0gbmV3IHByb3RvLmFwcHMuY2hhdC5TZXR0aW5nc1VwZGF0ZS5TZXR0aW5nKHRoaXMuYXJyYXlbMV1baV0pCiAgICB9CiAgfQogIHJldHVybiB0aGlzLnNldHRpbmdfCn07CnByb3RvLmFwcHMuY2hhdC5TZXR0aW5nc1VwZGF0ZS5TZXR0aW5nID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRTZXR0aW5nc1VwZGF0ZSRTZXR0aW5nJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5TZXR0aW5nc1VwZGF0ZS5TZXR0aW5nLCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuU2V0dGluZ3NVcGRhdGUuU2V0dGluZy5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkU2V0dGluZ3NVcGRhdGUkU2V0dGluZyQkZ2V0TmFtZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMF0KfTsKcHJvdG8uYXBwcy5jaGF0LlNldHRpbmdzVXBkYXRlLlNldHRpbmcucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFNldHRpbmdzVXBkYXRlJFNldHRpbmckJHNldE5hbWUkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVswXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5TZXR0aW5nc1VwZGF0ZS5TZXR0aW5nLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkU2V0dGluZ3NVcGRhdGUkU2V0dGluZyQkZ2V0VmFsdWUkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzFdCn07CnByb3RvLmFwcHMuY2hhdC5TZXR0aW5nc1VwZGF0ZS5TZXR0aW5nLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkU2V0dGluZ3NVcGRhdGUkU2V0dGluZyQkc2V0VmFsdWUkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CmNoYXQubW9kZWwuTWUgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNZSQoYXBwQ29udGV4dCkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJjaGF0Lm1vZGVsLk1lIik7CiAgdGhpcy5zZXJ2ZXJNZXNzYWdlU2VuZGVyXyA9IGNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VTZW5kZXIuZ2V0KGFwcENvbnRleHQpOwogIHRoaXMuc2hhcmVkUHJlc2VuY2VfID0gbmV3IGNoYXQubW9kZWwubWUuU2VydmVyVXBkYXRhYmxlU2hhcmVkUHJlc2VuY2UoYXBwQ29udGV4dCk7CiAgdGhpcy51c2VyU2V0dGluZ3NfID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdmFyIGNvbmZpZyA9IGNoYXQuY2xpZW50LlJlYWRPbmx5Q29uZmlnLmdldChhcHBDb250ZXh0KTsKICB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyXyA9IGNoYXQuY2xpZW50LkV4cGVyaW1lbnRNYW5hZ2VyLmdldChhcHBDb250ZXh0KTsKICB0aGlzLm1lSmlkXyA9IGNvbmZpZy5nZXRVc2VyKCkuZ2V0SmlkKCk7CiAgdGhpcy5vYmZ1c2NhdGVkR2FpYUlkXyA9IGNvbmZpZy5nZXRVc2VyKCkuZ2V0T2JmdXNjYXRlZEdhaWFJZCgpOwogIGNvbmZpZy5nZXRVc2VyKCk7CiAgdGhpcy5hcHBDb250ZXh0XyA9IGFwcENvbnRleHQ7CiAgdGhpcy5leHBlcmltZW50TWFuYWdlcl8uaXNJbkV4cGVyaW1lbnQoY2hhdC5jbGllbnQuRXhwZXJpbWVudE1hbmFnZXIuRXhwZXJpbWVudHMuU01TKTsKICB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyXy5pc0luRXhwZXJpbWVudChjaGF0LmNsaWVudC5FeHBlcmltZW50TWFuYWdlci5FeHBlcmltZW50cy5DSEFUX0hBTkdPVVRfR1BMVVNfT05MWSkKfTsKZ29vZy5pbmhlcml0cyhjaGF0Lm1vZGVsLk1lLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CmNoYXQubW9kZWwuTWUuU0VSVklDRV9JRCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImNoYXQubW9kZWwuTWUiKTsKY2hhdC5tb2RlbC5NZS5nZXQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNZSRnZXQkKGFwcENvbnRleHQpIHsKICByZXR1cm4gYXBwQ29udGV4dC5nZXQoY2hhdC5tb2RlbC5NZS5TRVJWSUNFX0lEKQp9OwpjaGF0Lm1vZGVsLk1lLkV2ZW50VHlwZSA9IHtBQ0xfTU9ERUxfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJhY2xfbW9kZWxfdXBkYXRlIiksIENIQVRfRU5BQkxFRF9VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImNoYXRfZW5hYmxlZF91cGRhdGUiKSwgQ0lSQ0xFX0FDTF9NT0RFTF9VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImNpcmNsZV9hY2xfbW9kZWxfdXBkYXRlIiksIFNNU19RVU9UQV9VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInF1b3RhX3VwZGF0ZSIpLCBVU0VSX1NFVFRJTkdfSU5JVElBTF9EQVRBOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJzZXR0aW5nX2luaXRpYWxfZGF0YSIpLCBVU0VSX1NFVFRJTkdfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJzZXR0aW5nX3VwZGF0ZSIpLCBWSURFT19FTkFCTEVEX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgidmlkZW9fZW5hYmxlZF91cGRhdGUiKX07CmNoYXQubW9kZWwuTWUuU2V0dGluZyA9IHtERUZBVUxUX01VVkNfUk9PTToiZGVmYXVsdE11dmNSb29tIiwgRElTUExBWV9PT0I6ImRpc3BsYXlPb2IiLCBFTU9USUNPTl9TRVQ6ImVtb3RpY29uU2V0IiwgR0NPTU1fVUlfU1RBVEU6Imd1cyIsIEhBTkdPVVRTX09OX0FJUl9URVJNU19BR1JFRUQ6ImhhbmdvdXRzT25BaXJUZXJtc0FncmVlZCIsIEhJR0hfUkVTT0xVVElPTl9FTkFCTEVEOiJoaWdoUmVzb2x1dGlvbkVuYWJsZWQiLCBKTUlfTE9HR0lORzoiam1pUXVhbGl0eSIsIExBU1RfRlJJRU5EX1NVR0dFU1RJT05fUFJPTVBUOiJsYXN0RnJpZW5kU3VnZ2VzdGlvblByb21wdCIsIExBU1RfSEFUU19TVVJWRVk6Imxhc3RIYXRzU3VydmV5IiwgTElDRU5TSU5HOiJsaWNlbnNpbmciLCBNT0xFX0FWQVRBUlM6Im1vbGVBdmF0YXJzIiwgTVVWQ19ST09NX0hJU1RPUlk6Im11dmNSb29tSGlzdG9yeSIsIE5BTUVEX1JPT01fSElTVE9SWToibmFtZWRSb29tSGlzdG9yeSIsIFBMVUdJTl9IRUxQX1BBTkVfU1RBVEU6InBsdWdpbkhlbHBQYW5lU3RhdGUiLCAKUk9TVEVSX1NJWkU6InJvc3RlclNpemUiLCBST1NURVJfU09SVF9PUFRJT046InJvc3RlclNvcnRPcHRpb24iLCBTSE9XX0NIQVRfVVBEQVRFRDoic2hvd0NoYXRVcGRhdGVkIiwgU0hPV19GUklFTkRfU1VHR0VTVElPTl9QUk9NUFRTOiJzaG93RnJpZW5kU3VnZ2VzdGlvblByb21wdHMiLCBTSE9XX1JPU1RFUl9BVkFUQVJTOiJzaG93Um9zdGVyQXZhdGFycyIsIFNJR05FRF9PVVQ6InNpZ25lZE91dCIsIFNLSVBfSEFOR09VVFNfRVhUUkFTX1BST01POiJza2lwSGFuZ291dHNFeHRyYXNQcm9tbyIsIFNPVU5EX0VOQUJMRUQ6InNvdW5kRW5hYmxlZCIsIFNPQ0lBTF9DSVJDTEVfU0VUVElOR1M6InVzZXJDaXJjbGVTZXR0aW5nIiwgU09DSUFMX1VTRV9DSVJDTEVTOiJ1c2VDaGF0Q2lyY2xlcyIsIFRST1VCTEVTSE9PVElOR19DQVNFX0lEOiJ0cm91Ymxlc2hvb3RpbmdDYXNlSWQiLCBUUk9VQkxFU0hPT1RJTkdfSVNTVUVTOiJ0cm91Ymxlc2hvb3RpbmdJc3N1ZXMiLCBUUk9VQkxFU0hPT1RJTkdfU1RBUlRfVElNRToidHJvdWJsZXNob290aW5nU3RhcnRUaW1lIn07CmNoYXQubW9kZWwuTWUuU2V0dGluZy5DaXJjbGVzID0ge0FMTF9DSVJDTEVTOiJvIiwgQ1VTVE9NX0NJUkNMRVM6ImMifTsKY2hhdC5tb2RlbC5NZS5nZXRFdmVudFR5cGUgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNZSRnZXRFdmVudFR5cGUkKHNldHRpbmdOYW1lKSB7CiAgcmV0dXJuW2NoYXQubW9kZWwuTWUuRXZlbnRUeXBlLlVTRVJfU0VUVElOR19VUERBVEUsIHNldHRpbmdOYW1lXS5qb2luKCJfIikKfTsKY2hhdC5tb2RlbC5NZS5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkTWUkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgY2hhdC5tb2RlbC5NZS5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICB0aGlzLnNoYXJlZFByZXNlbmNlXy5kaXNwb3NlKCk7CiAgdGhpcy51c2VyU2V0dGluZ3NfLmNsZWFyKCkKfTsKY2hhdC5tb2RlbC5NZS5wcm90b3R5cGUuZ2V0SmlkID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkTWUkJGdldEppZCQoKSB7CiAgcmV0dXJuIHRoaXMubWVKaWRfCn07CmNoYXQubW9kZWwuTWUucHJvdG90eXBlLmdldE9iZnVzY2F0ZWRHYWlhSWQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNZSQkZ2V0T2JmdXNjYXRlZEdhaWFJZCQoKSB7CiAgcmV0dXJuIHRoaXMub2JmdXNjYXRlZEdhaWFJZF8KfTsKY2hhdC5tb2RlbC5NZS5wcm90b3R5cGUuZ2V0VXNlclNldHRpbmcgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNZSQkZ2V0VXNlclNldHRpbmckKG5hbWUpIHsKICByZXR1cm4gdGhpcy51c2VyU2V0dGluZ3NfLmdldChuYW1lKQp9OwpjaGF0Lm1vZGVsLk1lLnByb3RvdHlwZS5zZXRVc2VyU2V0dGluZ18gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNZSQkc2V0VXNlclNldHRpbmdfJChuYW1lLCB2YWx1ZSwgaXNVc2VyUmVxdWVzdGVkKSB7CiAgdmFyIGlzSW5pdGlhbCA9ICFpc1VzZXJSZXF1ZXN0ZWQgJiYgIXRoaXMudXNlclNldHRpbmdzXy5jb250YWluc0tleShuYW1lKTsKICB2YWx1ZSAhPSB0aGlzLnVzZXJTZXR0aW5nc18uZ2V0KG5hbWUpICYmICh0aGlzLnVzZXJTZXR0aW5nc18uc2V0KG5hbWUsIHZhbHVlKSwgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjaGF0Lm1vZGVsLk1lLlVzZXJTZXR0aW5nRXZlbnQobmFtZSwgdmFsdWUsIGlzVXNlclJlcXVlc3RlZCwgaXNJbml0aWFsKSksIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgY2hhdC5tb2RlbC5NZS5Vc2VyU2V0dGluZ0V2ZW50KG5hbWUsIHZhbHVlLCBpc1VzZXJSZXF1ZXN0ZWQsIGlzSW5pdGlhbCwgY2hhdC5tb2RlbC5NZS5nZXRFdmVudFR5cGUobmFtZSkpKSwgaXNVc2VyUmVxdWVzdGVkICYmIHRoaXMuc2VydmVyTWVzc2FnZVNlbmRlcl8uc2VuZFVzZXJTZXR0aW5nKG5hbWUsIHZhbHVlKSkKfTsKY2hhdC5tb2RlbC5TZXJ2ZXJVcGRhdGFibGVNZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJFNlcnZlclVwZGF0YWJsZU1lJChhcHBDb250ZXh0KSB7CiAgY2hhdC5tb2RlbC5NZS5jYWxsKHRoaXMsIGFwcENvbnRleHQpOwogIHRoaXMuaXNTZXR0aW5nc0xvYWRlZF8gPSAhMTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHZhciBkaXNwYXRjaGVyID0gY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXIuZ2V0KGFwcENvbnRleHQpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oZGlzcGF0Y2hlciwgcHJvdG8uYXBwcy5jaGF0LlNldHRpbmdzVXBkYXRlLm1lc3NhZ2VJZCwgdGhpcy5oYW5kbGVTZXR0aW5nc1VwZGF0ZV8pCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5tb2RlbC5TZXJ2ZXJVcGRhdGFibGVNZSwgY2hhdC5tb2RlbC5NZSk7CmNoYXQubW9kZWwuU2VydmVyVXBkYXRhYmxlTWUucmVnaXN0ZXIgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRTZXJ2ZXJVcGRhdGFibGVNZSRyZWdpc3RlciQoYXBwQ29udGV4dCkgewogIHZhciBtZSA9IG5ldyBjaGF0Lm1vZGVsLlNlcnZlclVwZGF0YWJsZU1lKGFwcENvbnRleHQpOwogIGFwcENvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKGNoYXQubW9kZWwuTWUuU0VSVklDRV9JRCwgbWUpOwogIHJldHVybiBtZQp9OwpjaGF0Lm1vZGVsLlNlcnZlclVwZGF0YWJsZU1lLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRTZXJ2ZXJVcGRhdGFibGVNZSQkZGlzcG9zZUludGVybmFsJCgpIHsKICBnb29nLmRpc3Bvc2UodGhpcy5ldmVudEhhbmRsZXJfLmRpc3Bvc2UoKSk7CiAgY2hhdC5tb2RlbC5TZXJ2ZXJVcGRhdGFibGVNZS5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9OwpjaGF0Lm1vZGVsLlNlcnZlclVwZGF0YWJsZU1lLnByb3RvdHlwZS5nZXRTZXJ2ZXJVcGRhdGFibGVTaGFyZWRQcmVzZW5jZSA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJFNlcnZlclVwZGF0YWJsZU1lJCRnZXRTZXJ2ZXJVcGRhdGFibGVTaGFyZWRQcmVzZW5jZSQoKSB7CiAgcmV0dXJuIHRoaXMuc2hhcmVkUHJlc2VuY2VfCn07CmNoYXQubW9kZWwuU2VydmVyVXBkYXRhYmxlTWUucHJvdG90eXBlLmhhbmRsZVVzZXJTZXR0aW5nID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkU2VydmVyVXBkYXRhYmxlTWUkJGhhbmRsZVVzZXJTZXR0aW5nJChuYW1lLCB2YWx1ZSkgewogIHRoaXMuc2V0VXNlclNldHRpbmdfKG5hbWUsIHZhbHVlLCAhMSkKfTsKY2hhdC5tb2RlbC5TZXJ2ZXJVcGRhdGFibGVNZS5wcm90b3R5cGUuaGFuZGxlU2V0dGluZ3NVcGRhdGVfID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkU2VydmVyVXBkYXRhYmxlTWUkJGhhbmRsZVNldHRpbmdzVXBkYXRlXyQoZXZlbnQpIHsKICBmb3IodmFyIHNldHRpbmdzID0gbmV3IHByb3RvLmFwcHMuY2hhdC5TZXR0aW5nc1VwZGF0ZShldmVudC5tc2cpLCBsaXN0ID0gc2V0dGluZ3MuZ2V0U2V0dGluZ0xpc3QoKSwgaSA9IDA7aSA8IGxpc3QubGVuZ3RoO2krKykgewogICAgdmFyIHNldHRpbmcgPSBsaXN0W2ldOwogICAgdGhpcy5zZXRVc2VyU2V0dGluZ18oc2V0dGluZy5nZXROYW1lKCksIHNldHRpbmcuZ2V0VmFsdWUoKSwgITEpCiAgfQogIHRoaXMuaXNTZXR0aW5nc0xvYWRlZF8gfHwgKHRoaXMuaXNTZXR0aW5nc0xvYWRlZF8gPSAhMCwgdGhpcy5kaXNwYXRjaEV2ZW50KGNoYXQubW9kZWwuTWUuRXZlbnRUeXBlLlVTRVJfU0VUVElOR19JTklUSUFMX0RBVEEpKQp9OwpjaGF0Lm1vZGVsLk1lLlVzZXJTZXR0aW5nRXZlbnQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRNZSRVc2VyU2V0dGluZ0V2ZW50JChuYW1lLCB2YWx1ZSwgaXNVc2VyUmVxdWVzdGVkLCBpc0luaXRpYWwsIG9wdF90eXBlKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCBvcHRfdHlwZSB8fCBjaGF0Lm1vZGVsLk1lLkV2ZW50VHlwZS5VU0VSX1NFVFRJTkdfVVBEQVRFKTsKICB0aGlzLm5hbWUgPSBuYW1lOwogIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB0aGlzLmlzVXNlclJlcXVlc3RlZCA9IGlzVXNlclJlcXVlc3RlZDsKICB0aGlzLmlzSW5pdGlhbCA9IGlzSW5pdGlhbAp9Owpnb29nLmluaGVyaXRzKGNoYXQubW9kZWwuTWUuVXNlclNldHRpbmdFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JChhcHBDb250ZXh0KSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoImNoYXQubW9kZWwuQ29udGFjdFNldCIpOwogIHRoaXMuYXBwQ29udGV4dF8gPSBhcHBDb250ZXh0OwogIHRoaXMuZXhwZXJpbWVudE1hbmFnZXJfID0gY2hhdC5jbGllbnQuRXhwZXJpbWVudE1hbmFnZXIuZ2V0KGFwcENvbnRleHQpOwogIHRoaXMuc2VydmVyTWVzc2FnZVNlbmRlcl8gPSBjaGF0LmNsaWVudC5TZXJ2ZXJNZXNzYWdlU2VuZGVyLmdldChhcHBDb250ZXh0KTsKICB0aGlzLm1lXyA9IGNoYXQubW9kZWwuTWUuZ2V0KGFwcENvbnRleHQpOwogIHRoaXMuY29uZmlnXyA9IGNoYXQuY2xpZW50LlJlYWRPbmx5Q29uZmlnLmdldChhcHBDb250ZXh0KTsKICB0aGlzLmNvbnRhY3RzQnlKaWRfID0ge307CiAgdGhpcy5jb250YWN0c1JlbW92ZWRCeUppZF8gPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcDsKICB0aGlzLm5hbWVzQnlKaWRfID0ge307CiAgdGhpcy5jb250YWN0c0J5U2hvcnRJZF8gPSB7fTsKICB0aGlzLnBlbmRpbmdPdHJzXyA9IG5ldyBnb29nLnN0cnVjdHMuTWFwOwogIHRoaXMuY29udGFjdHNCeU9iZnVzY2F0ZWRHYWlhSWRfID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdGhpcy5ydVByQ291bnRIaXN0XyA9IG5ldyBnb29nLnN0cnVjdHMuTWFwOwogIHRoaXMuY3JlYXRpb25UaW1lXyA9IChuZXcgRGF0ZSkuZ2V0VGltZSgpOwogIHRoaXMuaW5jb21wbGV0ZUNvbnRhY3RzQnlKaWRfID0ge307CiAgdGhpcy5hbGxDb250YWN0c0NvdW50XyA9IDA7CiAgdGhpcy5pbmNvbXBsZXRlT2tKaWRzXyA9IHt9OwogIHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXyA9IG5ldyBjaGF0LlF1aWNrTGlzdEdlbmVyYXRvck9sZChhcHBDb250ZXh0KTsKICB0aGlzLnF1aWNrbGlzdF8gPSBuZXcgZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcDsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHZhciBkaXNwYXRjaGVyID0gY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXIuZ2V0KGFwcENvbnRleHQpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oZGlzcGF0Y2hlciwgcHJvdG8uYXBwcy5jaGF0Lk9mZlRoZVJlY29yZC5tZXNzYWdlSWQsIHRoaXMuaGFuZGxlT2ZmVGhlUmVjb3JkXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3RlbihkaXNwYXRjaGVyLCBwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLm1lc3NhZ2VJZCwgdGhpcy5oYW5kbGVSb3N0ZXJVcGRhdGVfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKGRpc3BhdGNoZXIsIHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJSZW1vdmUubWVzc2FnZUlkLCB0aGlzLmhhbmRsZVJvc3RlclJlbW92ZV8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oZGlzcGF0Y2hlciwgcHJvdG8uYXBwcy5jaGF0LlZjYXJkLm1lc3NhZ2VJZCwgdGhpcy5oYW5kbGVWY2FyZF8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oZGlzcGF0Y2hlciwgcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFRdWVyeS5tZXNzYWdlSWQsIHRoaXMuaGFuZGxlQ2xpZW50RGF0YVF1ZXJ5Xyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3RlbihkaXNwYXRjaGVyLCBwcm90by5hcHBzLmNoYXQuQ29udGFjdEdhaWFJZFVwZGF0ZS5tZXNzYWdlSWQsIHRoaXMuaGFuZGxlQ29udGFjdFVwZGF0ZV8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5xdWlja2xpc3RHZW5lcmF0b3JfLCBjaGF0LlF1aWNrTGlzdEdlbmVyYXRvci5FdmVudFR5cGUuQ0hBTkdFLCB0aGlzLm9uUXVpY2tMaXN0VXBkYXRlXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3RlbihkaXNwYXRjaGVyLCBwcm90by5hcHBzLmNoYXQuQ2hhdFN0YXRlVXBkYXRlLm1lc3NhZ2VJZCwgdGhpcy5oYW5kbGVDaGF0U3RhdGVVcGRhdGVfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMubWVfLCBjaGF0Lm1vZGVsLk1lLmdldEV2ZW50VHlwZShjaGF0Lm1vZGVsLk1lLlNldHRpbmcuUk9TVEVSX1NJWkUpLCB0aGlzLm9uUm9zdGVyU2l6ZVVwZGF0ZV8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5tZV8sIGNoYXQubW9kZWwuTWUuZ2V0RXZlbnRUeXBlKGNoYXQubW9kZWwuTWUuU2V0dGluZy5ST1NURVJfU09SVF9PUFRJT04pLCB0aGlzLm9uUm9zdGVyU29ydFVwZGF0ZV8pOwogIHRoaXMubXNnQ291bnRlclRpbWVyXyA9IG5ldyBnb29nLlRpbWVyKDFFMyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLm1zZ0NvdW50ZXJUaW1lcl8sIGdvb2cuVGltZXIuVElDSywgdGhpcy5vbk1zZ0NvdW50ZXJUaW1lcl8sICExLCB0aGlzKTsKICB0aGlzLm1zZ0NvdW50ZXJUaW1lcl8uc3RhcnQoKQp9Owpnb29nLmluaGVyaXRzKGNoYXQubW9kZWwuQ29udGFjdFNldCwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuTmFtZXNfID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdFNldCROYW1lc18kKGppZCkgewogIHRoaXMuamlkID0gamlkCn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5OYW1lc18ucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JE5hbWVzXyQkZ2V0TmFtZSQoY29uZmlnKSB7CiAgcmV0dXJuImhvbWVwYWdlIiA9PSBjb25maWcucHJvcGVydHkgPyB0aGlzLmV2ZXJncmVlbk5hbWUgfHwgdGhpcy5yb3N0ZXJOYW1lIHx8IHRoaXMudkNhcmROYW1lIHx8IHRoaXMuamlkIDogdGhpcy5yb3N0ZXJOYW1lIHx8IHRoaXMudkNhcmROYW1lIHx8IHRoaXMuZXZlcmdyZWVuTmFtZSB8fCB0aGlzLmppZAp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuREVGQVVMVF9BVkFUQVJfVVJMXyA9ICI3YjhhYzRjM2M1YjQ2OGY5Y2VhYmQ4ZWVhOGE5ZGY2MTU3NGFkOTk3IjsKY2hhdC5tb2RlbC5Db250YWN0U2V0LlNFUlZJQ0VfSUQgPSBmYXZhLnNlcnZpY2VzLmdldFVuaXF1ZUlkKCJjaGF0Lm1vZGVsLkNvbnRhY3RTZXQiKTsKY2hhdC5tb2RlbC5Db250YWN0U2V0LmdldCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkZ2V0JChhcHBDb250ZXh0KSB7CiAgcmV0dXJuIGFwcENvbnRleHQuZ2V0KGNoYXQubW9kZWwuQ29udGFjdFNldC5TRVJWSUNFX0lEKQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucmVnaXN0ZXIgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JHJlZ2lzdGVyJChhcHBDb250ZXh0KSB7CiAgdmFyIGNvbnRhY3RTZXQgPSBuZXcgY2hhdC5tb2RlbC5Db250YWN0U2V0KGFwcENvbnRleHQpOwogIGFwcENvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKGNoYXQubW9kZWwuQ29udGFjdFNldC5TRVJWSUNFX0lELCBjb250YWN0U2V0KTsKICByZXR1cm4gY29udGFjdFNldAp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgY2hhdC5tb2RlbC5Db250YWN0U2V0LnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpOwogIHRoaXMuY2xlYXJBbGxDb250YWN0c18oKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8uZGlzcG9zZSgpOwogIGdvb2cuZGlzcG9zZSh0aGlzLm1zZ0NvdW50ZXJUaW1lcl8pCn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5FdmVudFR5cGUgPSB7Q09OVEFDVF9BRERFRDpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiY29udGFjdF9hZGRlZCIpLCBDT05UQUNUX1JFTU9WRUQ6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImNvbnRhY3RfcmVtb3ZlZCIpLCBBTExDT05UQUNUU19SRU1PVkVEOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJhbGxjb250YWN0c19yZW1vdmVkIiksIENPTlRBQ1RfVVBEQVRFRDpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgiY29udGFjdF91cGRhdGVkIiksIE1FX0pJRF9VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoIm1lX2ppZF91cGRhdGUiKSwgUk9TVEVSX1NIT1dfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJyb3N0ZXJfc2hvd191cGRhdGUiKSwgUk9TVEVSX0NBUEFCSUxJVElFU19VUERBVEU6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoImNhcGFiaWxpdGllc191cGRhdGUiKSwgUk9TVEVSX1NUQVRVU19NRVNTQUdFX1VQREFURTpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgic3RhdHVzX21zZ191cGRhdGUiKSwgClJPU1RFUl9RVUlDS0xJU1RfVVBEQVRFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJyb3N0ZXJfcXVpY2tsaXN0X3VwZGF0ZSIpLCBST1NURVJfU1RBQkxFOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJyb3N0ZXJfc3RhYmxlIil9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuQ29udGFjdEV2ZW50ID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdFNldCRDb250YWN0RXZlbnQkKHR5cGUsIGNvbnRhY3QpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHR5cGUpOwogIHRoaXMuY29udGFjdCA9IGNvbnRhY3QKfTsKZ29vZy5pbmhlcml0cyhjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuQ29udGFjdEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CmNoYXQubW9kZWwuQ29udGFjdFNldC5FdmVudFR5cGVzID0ge0FOWV9TVUJTQ1JJUFRJT05fQ0hBTkdFOiJBUyIsIFJPU1RFUl9FTkQ6IlJFIn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5hbnlTdWJzY3JpcHRpb25DaGFuZ2VFdmVudCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkYW55U3Vic2NyaXB0aW9uQ2hhbmdlRXZlbnQkKGNvbnRhY3QpIHsKICByZXR1cm57dHlwZTpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuRXZlbnRUeXBlcy5BTllfU1VCU0NSSVBUSU9OX0NIQU5HRSwgY29udGFjdDpjb250YWN0fQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLmhhbmRsZUNsaWVudERhdGFRdWVyeV8gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JCRoYW5kbGVDbGllbnREYXRhUXVlcnlfJChlKSB7CiAgdmFyIHF1ZXJ5ID0gbmV3IHByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUXVlcnkoZS5tc2cpOwogIHRoaXMuc2VydmVyTWVzc2FnZVNlbmRlcl8uc2VuZCh0aGlzLmJ1aWxkQ2xpZW50RGF0YVJlc3BvbnNlXyhxdWVyeSkpCn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5wcm90b3R5cGUuYnVpbGRDbGllbnREYXRhUmVzcG9uc2VfID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdFNldCQkYnVpbGRDbGllbnREYXRhUmVzcG9uc2VfJChxdWVyeSkgewogIHZhciBtc2cgPSBuZXcgcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFSZXNwb25zZTsKICBtc2cuc2V0UXVlcnlUaW1lKHF1ZXJ5LmdldFF1ZXJ5VGltZSgpKTsKICB2YXIgY29udGFjdHNEYXRhID0gW10sIGppZDsKICBmb3IoamlkIGluIHRoaXMuY29udGFjdHNCeUppZF8pIHsKICAgIHZhciBjb250YWN0ID0gdGhpcy5jb250YWN0c0J5SmlkX1tqaWRdLCBjb250YWN0RGF0YSA9IG5ldyBwcm90by5hcHBzLmNoYXQuQ2xpZW50RGF0YVJlc3BvbnNlLkNvbnRhY3REYXRhOwogICAgY29udGFjdERhdGEuc2V0SmlkKGNvbnRhY3QuZ2V0SmlkKCkubWFrZUJhcmUoKS50b1N0cmluZygpKTsKICAgIGdvb2cuaXNEZWZBbmROb3ROdWxsKGNvbnRhY3QuZ2V0UHJlc2VuY2VDb2RlKCkpICYmIGNvbnRhY3REYXRhLnNldFByZXNlbmNlQ29kZShjb250YWN0LmdldFByZXNlbmNlQ29kZSgpKTsKICAgIGNvbnRhY3REYXRhLnNldFNob3coY29udGFjdC5nZXRKc3BiU2hvdygpKTsKICAgIGNvbnRhY3REYXRhLnNldENhcGFiaWxpdGllcyhjb250YWN0LmdldENhcGFiaWxpdGllcygpKTsKICAgIGNvbnRhY3RzRGF0YS5wdXNoKGNvbnRhY3REYXRhKQogIH0KICBtc2cuc2V0Q29udGFjdHNMaXN0KGNvbnRhY3RzRGF0YSk7CiAgaWYodGhpcy5leHBlcmltZW50TWFuYWdlcl8uaXNJbkV4cGVyaW1lbnQoY2hhdC5jbGllbnQuRXhwZXJpbWVudE1hbmFnZXIuRXhwZXJpbWVudHMuU1VQRVJNT0xFX0lETEVfRVJST1JfREVURUNUSU9OKSkgewogICAgdmFyIHNlbGZEYXRhID0gbmV3IHByb3RvLmFwcHMuY2hhdC5DbGllbnREYXRhUmVzcG9uc2UuU2VsZkRhdGEsIHNoYXJlZFByZXNlbmNlID0gdGhpcy5tZV8uZ2V0U2VydmVyVXBkYXRhYmxlU2hhcmVkUHJlc2VuY2UoKSwgc2hvdyA9IHNoYXJlZFByZXNlbmNlLmdldFJlc291cmNlUHJlc2VuY2UoKTsKICAgIG51bGwgIT0gc2hvdyAmJiBzZWxmRGF0YS5zZXRSZXNvdXJjZVNob3coY2hhdC5tb2RlbC5Db250YWN0LnNoYXJlZFN0YXR1c1Nob3dUb0pzcGJTaG93KHNob3cpKTsKICAgIHNlbGZEYXRhLnNldFVzZXJTaG93KGNoYXQubW9kZWwuQ29udGFjdC5zaGFyZWRTdGF0dXNTaG93VG9Kc3BiU2hvdyhzaGFyZWRQcmVzZW5jZS5nZXRTaGFyZWRTaG93KCkpKTsKICAgIG1zZy5zZXRTZWxmKHNlbGZEYXRhKQogIH0KICByZXR1cm4gbXNnCn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5wcm90b3R5cGUuZ2V0Q29udGFjdCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJGdldENvbnRhY3QkKGppZE9ySmlkU3RyLCBvcHRfaW5jb21wbGV0ZU9rKSB7CiAgdmFyIGppZFN0ciA9IGppZE9ySmlkU3RyIGluc3RhbmNlb2YgYXBwcy5jaGF0LmNvcmUuSmlkID8gamlkT3JKaWRTdHIudG9TdHJpbmcoKSA6IGppZE9ySmlkU3RyLCBqaWRTdHIyID0gYXBwcy5jaGF0LmNvcmUuSmlkLklzUm9vbUppZChqaWRTdHIpID8gamlkU3RyIDogYXBwcy5jaGF0LmNvcmUuSmlkLmJhcmVQYXJ0KGppZFN0ciksIGluY29tcGxldGVPayA9IG9wdF9pbmNvbXBsZXRlT2sgfHwgdGhpcy5pbmNvbXBsZXRlT2tKaWRzX1tqaWRTdHJdIHx8IHRoaXMuaW5jb21wbGV0ZU9rSmlkc19bamlkU3RyMl0sIGNvbnRhY3QgPSB0aGlzLmNvbnRhY3RzQnlKaWRfW2ppZFN0cl0gfHwgdGhpcy5jb250YWN0c0J5SmlkX1tqaWRTdHIyXTsKICBpZighY29udGFjdCkgewogICAgdmFyIGppZDsKICAgIHRoaXMuY29udGFjdHNSZW1vdmVkQnlKaWRfLmNvbnRhaW5zS2V5KGppZFN0cikgPyBqaWQgPSBqaWRTdHIgOiB0aGlzLmNvbnRhY3RzUmVtb3ZlZEJ5SmlkXy5jb250YWluc0tleShqaWRTdHIyKSAmJiAoamlkID0gamlkU3RyMik7CiAgICBnb29nLmlzRGVmQW5kTm90TnVsbChqaWQpICYmIChjb250YWN0ID0gdGhpcy5jb250YWN0c1JlbW92ZWRCeUppZF8uZ2V0KGppZCksIHRoaXMuY29udGFjdHNSZW1vdmVkQnlKaWRfLnJlbW92ZShqaWQpLCB0aGlzLmNvbnRhY3RzQnlKaWRfW2ppZF0gPSBjb250YWN0LCB0aGlzLmFsbENvbnRhY3RzQ291bnRfKyssIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgY2hhdC5tb2RlbC5Db250YWN0U2V0LkNvbnRhY3RFdmVudChjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuRXZlbnRUeXBlLkNPTlRBQ1RfQURERUQsIGNvbnRhY3QpKSkKICB9CiAgIWNvbnRhY3QgJiYgaW5jb21wbGV0ZU9rICYmIChjb250YWN0ID0gdGhpcy5pbmNvbXBsZXRlQ29udGFjdHNCeUppZF9bamlkU3RyXSB8fCB0aGlzLmluY29tcGxldGVDb250YWN0c0J5SmlkX1tqaWRTdHIyXSwgY29udGFjdCB8fCAoY29udGFjdCA9IG5ldyBjaGF0Lm1vZGVsLkNvbnRhY3QodGhpcy5hcHBDb250ZXh0XywgamlkU3RyKSwgY29udGFjdC5zZXRBdmF0YXJVcmwodGhpcy5yZXNvbHZlQXZhdGFyVXJsXyhjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuREVGQVVMVF9BVkFUQVJfVVJMXykpLCB0aGlzLm5hbWVzQnlKaWRfW2ppZFN0cl0gPSBuZXcgY2hhdC5tb2RlbC5Db250YWN0U2V0Lk5hbWVzXyhqaWRTdHIpLCB0aGlzLmluY29tcGxldGVDb250YWN0c0J5SmlkX1tqaWRTdHJdID0gY29udGFjdCwgdGhpcy5hbGxDb250YWN0c0NvdW50XysrLCB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNoYXQubW9kZWwuQ29udGFjdFNldC5Db250YWN0RXZlbnQoY2hhdC5tb2RlbC5Db250YWN0U2V0LkV2ZW50VHlwZS5DT05UQUNUX0FEREVELCAKICBjb250YWN0KSkpKTsKICByZXR1cm4gY29udGFjdAp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLmdldFF1aWNrbGlzdCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJGdldFF1aWNrbGlzdCQoKSB7CiAgcmV0dXJuIHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXy5nZXRRdWlja0xpc3QoKQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLmdldFF1aWNrbGlzdFNpemVPcHRpb24gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JCRnZXRRdWlja2xpc3RTaXplT3B0aW9uJCgpIHsKICB2YXIgcm9zdGVyRGlzcGxheVNpemUgPSBwYXJzZUludCh0aGlzLm1lXy5nZXRVc2VyU2V0dGluZyhjaGF0Lm1vZGVsLk1lLlNldHRpbmcuUk9TVEVSX1NJWkUpLCAxMCk7CiAgcmV0dXJuIGdvb2cuaXNOdW1iZXIocm9zdGVyRGlzcGxheVNpemUpICYmICFpc05hTihyb3N0ZXJEaXNwbGF5U2l6ZSkgPyByb3N0ZXJEaXNwbGF5U2l6ZSA6IHRoaXMuY29uZmlnXy5kZWZhdWx0UXVpY2tsaXN0U2l6ZU9wdGlvbgp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLnNlbmRRdWlja2xpc3RTaXplXyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJHNlbmRRdWlja2xpc3RTaXplXyQoKSB7CiAgdmFyIHF1aWNrbGlzdFNpemU7CiAgaWYoMCA8PSB0aGlzLmNvbmZpZ18uZml4ZWRRdWlja2xpc3RTaXplKSB7CiAgICBxdWlja2xpc3RTaXplID0gdGhpcy5jb25maWdfLmZpeGVkUXVpY2tsaXN0U2l6ZQogIH1lbHNlIHsKICAgIHZhciBzaXplT3B0aW9uID0gdGhpcy5nZXRRdWlja2xpc3RTaXplT3B0aW9uKCk7CiAgICBxdWlja2xpc3RTaXplID0gY2hhdC5tb2RlbC5Sb3N0ZXJTaXplU2V0dGluZy5RdWlja2xpc3RTaXplVmFsdWVbc2l6ZU9wdGlvbl0KICB9CiAgdGhpcy5zZXJ2ZXJNZXNzYWdlU2VuZGVyXy5zZW5kUXVpY2tsaXN0U2l6ZShxdWlja2xpc3RTaXplKQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLm9uUm9zdGVyU2l6ZVVwZGF0ZV8gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JCRvblJvc3RlclNpemVVcGRhdGVfJChzZXR0aW5nRXZlbnQpIHsKICAoc2V0dGluZ0V2ZW50LmlzVXNlclJlcXVlc3RlZCB8fCBzZXR0aW5nRXZlbnQuaXNJbml0aWFsKSAmJiB0aGlzLnNlbmRRdWlja2xpc3RTaXplXygpOwogIDAgPiB0aGlzLmNvbmZpZ18uZml4ZWRRdWlja2xpc3RTaXplICYmIHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXy5zZXRRdWlja0NvbnRhY3RzU2l6ZShjaGF0Lm1vZGVsLlJvc3RlclNpemVTZXR0aW5nLlF1aWNrbGlzdFNpemVWYWx1ZVt0aGlzLmdldFF1aWNrbGlzdFNpemVPcHRpb24oKV0sIHRoaXMuZ2V0QWxsQ29udGFjdHMoKSkKfTsKY2hhdC5tb2RlbC5Db250YWN0U2V0LnByb3RvdHlwZS5vblJvc3RlclNvcnRVcGRhdGVfID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdFNldCQkb25Sb3N0ZXJTb3J0VXBkYXRlXyQoKSB7CiAgdGhpcy5xdWlja2xpc3RHZW5lcmF0b3JfLnVwZGF0ZVNvcnRBbGdvcml0aG0odGhpcy5tZV8uZ2V0VXNlclNldHRpbmcoY2hhdC5tb2RlbC5NZS5TZXR0aW5nLlJPU1RFUl9TT1JUX09QVElPTikpCn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5wcm90b3R5cGUuZ2V0QWxsQ29udGFjdHMgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JCRnZXRBbGxDb250YWN0cyQoKSB7CiAgcmV0dXJuIHRoaXMuY29udGFjdHNCeUppZF8KfTsKY2hhdC5tb2RlbC5Db250YWN0U2V0LnByb3RvdHlwZS5nZXRDb250YWN0QnlJZCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJGdldENvbnRhY3RCeUlkJChzaG9ydElkKSB7CiAgcmV0dXJuIHRoaXMuY29udGFjdHNCeVNob3J0SWRfW3Nob3J0SWRdCn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5wcm90b3R5cGUudXBkYXRlQ2hhdFN0YXRlID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdFNldCQkdXBkYXRlQ2hhdFN0YXRlJChqaWQsIHN0YXRlKSB7CiAgdmFyIGNvbnRhY3QgPSB0aGlzLmdldENvbnRhY3QoamlkKTsKICBnb29nLmlzRGVmQW5kTm90TnVsbChjb250YWN0KSA/IGNvbnRhY3Quc2V0Q2hhdFN0YXRlKHN0YXRlKSA6IHRoaXMubG9nZ2VyXy53YXJuaW5nKCJSZWNlaXZlZCBjaGF0IHN0YXRlIGZvciBjb250YWN0IHdlIGRvbid0IGhhdmU6ICIgKyBqaWQpCn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5wcm90b3R5cGUucmVmcmVzaFF1aWNrbGlzdCA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJHJlZnJlc2hRdWlja2xpc3QkKCkgewogIHRoaXMuZGlzcGF0Y2hFdmVudChjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuRXZlbnRUeXBlLlJPU1RFUl9RVUlDS0xJU1RfVVBEQVRFKQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLmdldFNlY29uZHNTaW5jZUNyZWF0ZV8gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JCRnZXRTZWNvbmRzU2luY2VDcmVhdGVfJCgpIHsKICByZXR1cm4gTWF0aC5mbG9vcigoKG5ldyBEYXRlKS5nZXRUaW1lKCkgLSB0aGlzLmNyZWF0aW9uVGltZV8pIC8gMUUzKQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLmlzUm9zdGVyU3RhYmxlXyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJGlzUm9zdGVyU3RhYmxlXyQoKSB7CiAgaWYoIWdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMucnVQckNvdW50SGlzdF8pKSB7CiAgICByZXR1cm4hMQogIH0KICBmb3IodmFyIHNlY3NQYXN0ID0gdGhpcy5nZXRTZWNvbmRzU2luY2VDcmVhdGVfKCksIHNlY0N1dG9mZiA9IHNlY3NQYXN0IC0gMywgc2VjcyA9IHRoaXMucnVQckNvdW50SGlzdF8uZ2V0S2V5cygpLCBjb3VudCA9IDAsIGkgPSAwO2kgPCBzZWNzLmxlbmd0aDsrK2kpIHsKICAgIHNlY3NbaV0gPD0gc2VjQ3V0b2ZmID8gdGhpcy5ydVByQ291bnRIaXN0Xy5yZW1vdmUoc2Vjc1tpXSkgOiBjb3VudCArPSB0aGlzLnJ1UHJDb3VudEhpc3RfLmdldChzZWNzW2ldLCAwKQogIH0KICB2YXIgY29udGFjdHNDb3VudCA9IHRoaXMuYWxsQ29udGFjdHNDb3VudF87CiAgdGhpcy5sb2dnZXJfLmluZm8oc2Vjc1Bhc3QgKyAiIHNlY3MgYWZ0ZXIgY3JlYXRpb24sIHRoZSBydS9wciBtZXNzYWdlcyBjb3VudCBpbiB0aGUgcGFzdCAzIHNlY3MgaXMgIiArIHNlY3NQYXN0ICsgIiBmb3IgIiArIGNvbnRhY3RzQ291bnQgKyAiIGNvbnRhY3RzIik7CiAgcmV0dXJuIGNvdW50IDwgMiAqIGNvbnRhY3RzQ291bnQgfHwgMzAgPCBzZWNzUGFzdCA/ICh0aGlzLmxvZ2dlcl8uaW5mbygiU2VuZGluZyBST1NURVJfU1RBQkxFIG1lc3NhZ2UgYXQgIiArIHNlY3NQYXN0KSwgdGhpcy5kaXNwYXRjaEV2ZW50KGNoYXQubW9kZWwuQ29udGFjdFNldC5FdmVudFR5cGUuUk9TVEVSX1NUQUJMRSksIHRoaXMucnVQckNvdW50SGlzdF8gPSBudWxsLCAhMSkgOiAhMAp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLm9uTXNnQ291bnRlclRpbWVyXyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJG9uTXNnQ291bnRlclRpbWVyXyQoKSB7CiAgdGhpcy5pc1Jvc3RlclN0YWJsZV8oKSB8fCBnb29nLmRpc3Bvc2UodGhpcy5tc2dDb3VudGVyVGltZXJfKQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLmluY3JlbWVudE1lc3NhZ2VDb3VudGVyXyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJGluY3JlbWVudE1lc3NhZ2VDb3VudGVyXyQobXNnQ291bnRIaXN0KSB7CiAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwobXNnQ291bnRIaXN0KSkgewogICAgdmFyIHNlYyA9IHRoaXMuZ2V0U2Vjb25kc1NpbmNlQ3JlYXRlXygpLCB2YWwgPSBtc2dDb3VudEhpc3QuZ2V0KHNlYywgMCk7CiAgICBtc2dDb3VudEhpc3Quc2V0KHNlYywgdmFsICsgMSkKICB9Cn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5wcm90b3R5cGUuaGFuZGxlUm9zdGVyVXBkYXRlXyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJGhhbmRsZVJvc3RlclVwZGF0ZV8kKGUpIHsKICB2YXIgdXBkYXRlID0gbmV3IHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUoZS5tc2cpLCBjb250YWN0LCBtdXN0VW5tYXBPbGRTaG9ydElkID0gITEsIHNob3J0SWQgPSAiIiArIHVwZGF0ZS5nZXRTaG9ydElkKCksIGppZCA9IHVwZGF0ZS5nZXRKaWQoKSwgb2xkU2hvcnRJZCA9IC0xOwogIHRoaXMuZ2V0Q29udGFjdChqaWQpICYmIHRoaXMuZ2V0Q29udGFjdChqaWQpLmdldFNob3J0SWQoKSAhPSBzaG9ydElkICYmIChtdXN0VW5tYXBPbGRTaG9ydElkID0gITAsIG9sZFNob3J0SWQgPSB0aGlzLmdldENvbnRhY3QoamlkKS5nZXRTaG9ydElkKCksIHRoaXMubG9nZ2VyXy53YXJuaW5nKCdwcmV2aW91cyBlbnRyeSBmb3IgIicgKyBqaWQgKyAnIiB1bmRlciBzaG9ydElkICcgKyBvbGRTaG9ydElkKSk7CiAgdGhpcy5pbmNyZW1lbnRNZXNzYWdlQ291bnRlcl8odGhpcy5ydVByQ291bnRIaXN0Xyk7CiAgc2hvcnRJZCBpbiB0aGlzLmNvbnRhY3RzQnlTaG9ydElkXyAmJiAoY29udGFjdCA9IHRoaXMuZ2V0Q29udGFjdEJ5SWQoc2hvcnRJZCksIGppZCAhPSBjb250YWN0LmdldEppZCgpLnRvU3RyaW5nKCkgJiYgKHRoaXMubG9nZ2VyXy53YXJuaW5nKCJjb250YWN0IG1pc21hdGNoIGZvciBzaG9ydElkICIgKyBzaG9ydElkICsgIjogIiArIGppZCArICIgIT0gIiArIGNvbnRhY3QuZ2V0SmlkKCkudG9TdHJpbmcoKSksIGRlbGV0ZSB0aGlzLmNvbnRhY3RzQnlTaG9ydElkX1tzaG9ydElkXSwgZGVsZXRlIHRoaXMuY29udGFjdHNCeUppZF9bY29udGFjdC5nZXRKaWQoKS50b1N0cmluZygpXSwgZGVsZXRlIHRoaXMuaW5jb21wbGV0ZU9rSmlkc19bY29udGFjdC5nZXRKaWQoKS50b1N0cmluZygpXSwgdGhpcy5jb250YWN0c0J5T2JmdXNjYXRlZEdhaWFJZF8ucmVtb3ZlKGNvbnRhY3QuZ2V0T2JmdXNjYXRlZEdhaWFJZCgpKSwgdGhpcy5xdWlja2xpc3RHZW5lcmF0b3JfLnJlbW92ZUNvbnRhY3QoY29udGFjdCksIAogIGdvb2cuZGlzcG9zZShjb250YWN0KSwgY29udGFjdCA9IHRoaXMuZ2V0Q29udGFjdChqaWQpLCBnb29nLmlzRGVmKGNvbnRhY3QpID8gKHRoaXMuY29udGFjdHNCeVNob3J0SWRfW3Nob3J0SWRdID0gY29udGFjdCwgZGVsZXRlIHRoaXMuY29udGFjdHNCeVNob3J0SWRfW2NvbnRhY3QuZ2V0U2hvcnRJZCgpXSwgY29udGFjdC5zZXRTaG9ydElkKHNob3J0SWQpKSA6IHRoaXMubG9nZ2VyXy5pbmZvKCJoYW5kbGVSb3N0ZXJVcGRhdGVfOiBubyBjb250YWN0IGZvciBzaG9ydElkIG9yIGppZCAiICsgc2hvcnRJZCArICIgIiArIGppZCkpKTsKICBpZighZ29vZy5pc0RlZihjb250YWN0KSkgewogICAgdGhpcy5pbmNvbXBsZXRlT2tKaWRzX1tqaWRdID0gITA7CiAgICBpZihjb250YWN0ID0gdGhpcy5nZXRDb250YWN0KGppZCwgITApKSB7CiAgICAgIHRoaXMuaW5jb21wbGV0ZUNvbnRhY3RzQnlKaWRfW2NvbnRhY3QuZ2V0SmlkKCkudG9TdHJpbmcoKV0gPSBudWxsOwogICAgICBjb250YWN0LnNldFNob3J0SWQoc2hvcnRJZCk7CiAgICAgIHZhciBiYXJlSmlkID0gYXBwcy5jaGF0LmNvcmUuSmlkLmJhcmVQYXJ0KGppZCk7CiAgICAgIGlmKHRoaXMucGVuZGluZ090cnNfLmNvbnRhaW5zS2V5KGJhcmVKaWQpKSB7CiAgICAgICAgdmFyIG90ciA9IHRoaXMucGVuZGluZ090cnNfLmdldChiYXJlSmlkKTsKICAgICAgICB0aGlzLnByb2Nlc3NPdHJGb3JDb250YWN0Xyhjb250YWN0LCBvdHIsICExKTsKICAgICAgICB0aGlzLnBlbmRpbmdPdHJzXy5yZW1vdmUoYmFyZUppZCkKICAgICAgfQogICAgfQogICAgdGhpcy5jb250YWN0c0J5SmlkX1tqaWRdID0gY29udGFjdDsKICAgIHRoaXMuY29udGFjdHNCeVNob3J0SWRfW3Nob3J0SWRdID0gY29udGFjdAogIH0KICBtdXN0VW5tYXBPbGRTaG9ydElkICYmIGRlbGV0ZSB0aGlzLmNvbnRhY3RzQnlTaG9ydElkX1tvbGRTaG9ydElkXTsKICB2YXIgbmFtZXMgPSB0aGlzLm5hbWVzQnlKaWRfW2ppZF07CiAgbmFtZXMucm9zdGVyTmFtZSA9IHVwZGF0ZS5nZXRSb3N0ZXJOYW1lKCk7CiAgbmFtZXMuZXZlcmdyZWVuTmFtZSA9IHVwZGF0ZS5nZXRFdmVyZ3JlZW5OYW1lKCk7CiAgbmFtZXMuZXZlcmdyZWVuRmlyc3ROYW1lID0gdXBkYXRlLmdldEV2ZXJncmVlbkZpcnN0TmFtZSgpOwogIHRoaXMuZ2V0SmlkRm9yQnJvYWRjYXN0XyhqaWQpOwogIHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXy5zdGFydENvbnRhY3RVcGRhdGUoY29udGFjdCk7CiAgdmFyIGNoYW5nZWQgPSBjb250YWN0LnNldE5hbWUobmFtZXMuZ2V0TmFtZSh0aGlzLmNvbmZpZ18pKSwgY2hhbmdlZCA9IGNoYW5nZWQgfCBjb250YWN0LnNldEVtYWlsKHVwZGF0ZS5nZXRFbWFpbCgpIHx8IHVwZGF0ZS5nZXRKaWQoKSksIGNoYW5nZWQgPSBjaGFuZ2VkIHwgY29udGFjdC5zZXRXZWlnaHQodXBkYXRlLmdldENvbWJpbmVkV2VpZ2h0KCkpLCBvYmZ1c2NhdGVkR2FpYUlkID0gdXBkYXRlLmdldE9iZnVzY2F0ZWRHYWlhSWQoKTsKICBnb29nLmlzRGVmKG9iZnVzY2F0ZWRHYWlhSWQpICYmIChjaGFuZ2VkIHw9IGNvbnRhY3Quc2V0T2JmdXNjYXRlZEdhaWFJZChvYmZ1c2NhdGVkR2FpYUlkKSwgdGhpcy5jb250YWN0c0J5T2JmdXNjYXRlZEdhaWFJZF8uc2V0KG9iZnVzY2F0ZWRHYWlhSWQsIGNvbnRhY3QpKTsKICBmb3IodmFyIGNoYW5nZWQgPSBjaGFuZ2VkIHwgY29udGFjdC5zZXRHUGx1c0VuYWJsZWQodXBkYXRlLmdldElzR3BsdXMoKSB8fCAhMSksIHJhd1Bob25lTnVtYmVycyA9IHVwZGF0ZS5nZXRQaG9uZUJvb2soKSB8fCBbXSwgcGhvbmVOdW1iZXJzID0gW10sIGkgPSAwO2kgPCByYXdQaG9uZU51bWJlcnMubGVuZ3RoO2krKykgewogICAgdmFyIHBob25lRW50cnkgPSByYXdQaG9uZU51bWJlcnNbaV0sIG5ld051bWJlciA9IG5ldyBjaGF0Lm1vZGVsLlBob25lTnVtYmVyKHBob25lRW50cnlbMF0sIHBob25lRW50cnlbMV0pOwogICAgbmV3TnVtYmVyLnNldFN0YXRlKHBob25lRW50cnlbMl0pOwogICAgbmV3TnVtYmVyLnNldEV2ZXJncmVlbihCb29sZWFuKHBob25lRW50cnlbM10pKTsKICAgIG5ld051bWJlci5zZXRWYWxpZChCb29sZWFuKHBob25lRW50cnlbNF0pKTsKICAgIG5ld051bWJlci5zZXRUYWcocGhvbmVFbnRyeVs1XSk7CiAgICBuZXdOdW1iZXIuc2V0Q3VzdG9tRGVzY3JpcHRpb24ocGhvbmVFbnRyeVs2XSk7CiAgICBwaG9uZU51bWJlcnMucHVzaChuZXdOdW1iZXIpCiAgfQogIGNoYW5nZWQgfD0gY29udGFjdC5zZXRQaG9uZU51bWJlcnMocGhvbmVOdW1iZXJzKTsKICBjaGFuZ2VkIHw9IGNvbnRhY3Quc2V0SXNCdWRkeVBvdW5jZUVuYWJsZWRGcm9tU2VydmVyKHVwZGF0ZS5nZXRCdWRkeVBvdW5jZSgpKTsKICBjaGFuZ2VkIHw9IGNvbnRhY3Quc2V0Rm9jdXNHcm91cHModXBkYXRlLmdldEZvY3VzR3JvdXBzTGlzdCgpKTsKICB0aGlzLmxvZ2dlcl8uaW5mbygiQ29udGFjdHNldDogdGhlIGdyb3VwcyBmb3IgIiArIGNvbnRhY3QuZ2V0RW1haWwoKSArICIgYXJlICIgKyB1cGRhdGUuZ2V0Rm9jdXNHcm91cHNMaXN0KCkpOwogIHZhciBjaGFuZ2VkID0gY2hhbmdlZCB8IGNvbnRhY3Quc2V0SXNSZWplY3RlZCh1cGRhdGUuZ2V0UmVqZWN0ZWQoKSksIGNoYW5nZWQgPSBjaGFuZ2VkIHwgY29udGFjdC5zZXRQb3J0cmFpdFVybCh1cGRhdGUuZ2V0UG9ydHJhaXRVcmwoKSB8fCAiIiksIGNoYW5nZWQgPSBjaGFuZ2VkIHwgY29udGFjdC5zZXRPcmt1dEF2YXRhclVybCh1cGRhdGUuZ2V0T3JrdXRQaWN0dXJlVXJsKCkgfHwgIiIpLCBmaWx0ZXIgPSBjaGF0Lm1vZGVsLkNvbnRhY3QuRmlsdGVyLk5PUk1BTDsKICBzd2l0Y2godXBkYXRlLmdldEZpbHRlcigpKSB7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUuRmlsdGVyLkJMT0NLRUQ6CiAgICAgIGZpbHRlciA9IGNoYXQubW9kZWwuQ29udGFjdC5GaWx0ZXIuQkxPQ0tFRDsKICAgICAgYnJlYWs7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJVcGRhdGUuRmlsdGVyLkhJRERFTjoKICAgICAgZmlsdGVyID0gY2hhdC5tb2RlbC5Db250YWN0LkZpbHRlci5ISURERU47CiAgICAgIGJyZWFrOwogICAgY2FzZSBwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLkZpbHRlci5OT1JNQUw6CiAgICAgIGZpbHRlciA9IGNoYXQubW9kZWwuQ29udGFjdC5GaWx0ZXIuTk9STUFMOwogICAgICBicmVhazsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZS5GaWx0ZXIuUElOTkVEOgogICAgICBmaWx0ZXIgPSBjaGF0Lm1vZGVsLkNvbnRhY3QuRmlsdGVyLlBJTk5FRAogIH0KICB2YXIgd2FzQmxvY2tlZCA9IGNvbnRhY3QuZ2V0RmlsdGVyKCkgPT0gY2hhdC5tb2RlbC5Db250YWN0LkZpbHRlci5CTE9DS0VEOwogIGNvbnRhY3Quc2V0RmlsdGVyKGZpbHRlcikgJiYgKHdhc0Jsb2NrZWQgJiYgY29udGFjdC5zZXRTdWJzY3JpcHRpb24odXBkYXRlLmdldFN1YnNjcmlwdGlvbigpKSwgY2hhbmdlZCA9ICEwKTsKICBjb250YWN0LnNldENoYXRCZWZvcmUoMCA8IHVwZGF0ZS5nZXRMYXN0Q2hhdFRpbWVzdGFtcCgpKTsKICB2YXIgY2hhbmdlZCA9IGNoYW5nZWQgfCBjb250YWN0LnNldExhc3RDaGF0VGltZXN0YW1wKHVwZGF0ZS5nZXRMYXN0Q2hhdFRpbWVzdGFtcCgpKSwgbmV3Q29udGFjdCA9ICFnb29nLmlzRGVmKGNvbnRhY3QuZ2V0U3Vic2NyaXB0aW9uKCkpOwogIGNvbnRhY3Quc2V0U3Vic2NyaXB0aW9uKHVwZGF0ZS5nZXRTdWJzY3JpcHRpb24oKSkgJiYgKG5ld0NvbnRhY3QgfHwgdGhpcy5kaXNwYXRjaEV2ZW50KGNoYXQubW9kZWwuQ29udGFjdFNldC5hbnlTdWJzY3JpcHRpb25DaGFuZ2VFdmVudChjb250YWN0KSksIGNoYW5nZWQgPSAhMCk7CiAgdGhpcy5xdWlja2xpc3RHZW5lcmF0b3JfLmVuZENvbnRhY3RVcGRhdGUoY29udGFjdCwgITApOwogIGNoYW5nZWQgJiYgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuQ29udGFjdEV2ZW50KGNoYXQubW9kZWwuQ29udGFjdFNldC5FdmVudFR5cGUuQ09OVEFDVF9VUERBVEVELCBjb250YWN0KSkKfTsKY2hhdC5tb2RlbC5Db250YWN0U2V0LnByb3RvdHlwZS5oYW5kbGVSb3N0ZXJSZW1vdmVfID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdFNldCQkaGFuZGxlUm9zdGVyUmVtb3ZlXyQoZSkgewogIHZhciByZW1vdmUgPSBuZXcgcHJvdG8uYXBwcy5jaGF0LlJvc3RlclJlbW92ZShlLm1zZyksIGNvbnRhY3QgPSB0aGlzLmdldENvbnRhY3QocmVtb3ZlLmdldEppZCgpKSB8fCB0aGlzLmluY29tcGxldGVDb250YWN0c0J5SmlkX1tyZW1vdmUuZ2V0SmlkKCldOwogIGNvbnRhY3QgJiYgKGRlbGV0ZSB0aGlzLmNvbnRhY3RzQnlTaG9ydElkX1tjb250YWN0LmdldFNob3J0SWQoKV0sIGRlbGV0ZSB0aGlzLmNvbnRhY3RzQnlKaWRfW2NvbnRhY3QuZ2V0SmlkKCkudG9TdHJpbmcoKV0sIGRlbGV0ZSB0aGlzLmluY29tcGxldGVDb250YWN0c0J5SmlkX1tjb250YWN0LmdldEppZCgpLnRvU3RyaW5nKCldLCBkZWxldGUgdGhpcy5pbmNvbXBsZXRlT2tKaWRzX1tjb250YWN0LmdldEppZCgpLnRvU3RyaW5nKCldLCB0aGlzLmNvbnRhY3RzUmVtb3ZlZEJ5SmlkXy5zZXQocmVtb3ZlLmdldEppZCgpLCBjb250YWN0KSwgdGhpcy5hbGxDb250YWN0c0NvdW50Xy0tLCB0aGlzLnF1aWNrbGlzdEdlbmVyYXRvcl8ucmVtb3ZlQ29udGFjdChjb250YWN0KSwgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuQ29udGFjdEV2ZW50KGNoYXQubW9kZWwuQ29udGFjdFNldC5FdmVudFR5cGUuQ09OVEFDVF9SRU1PVkVELCBjb250YWN0KSkpCn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5wcm90b3R5cGUuY2xlYXJBbGxDb250YWN0c18gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JCRjbGVhckFsbENvbnRhY3RzXyQoKSB7CiAgZm9yKHZhciBjIGluIHRoaXMuY29udGFjdHNCeUppZF8pIHsKICAgIGdvb2cuZGlzcG9zZSh0aGlzLmNvbnRhY3RzQnlKaWRfW2NdKQogIH0KICBmb3IodmFyIHJlbW92ZWRDb250YWN0cyA9IHRoaXMuY29udGFjdHNSZW1vdmVkQnlKaWRfLmdldFZhbHVlcygpLCBpID0gMDtpIDwgcmVtb3ZlZENvbnRhY3RzLmxlbmd0aDsrK2kpIHsKICAgIGdvb2cuZGlzcG9zZShyZW1vdmVkQ29udGFjdHNbaV0pCiAgfQogIHRoaXMuY29udGFjdHNSZW1vdmVkQnlKaWRfLmNsZWFyKCk7CiAgZm9yKGMgaW4gdGhpcy5pbmNvbXBsZXRlQ29udGFjdHNCeUppZF8pIHsKICAgIGdvb2cuZGlzcG9zZSh0aGlzLmluY29tcGxldGVDb250YWN0c0J5SmlkX1tjXSkKICB9CiAgdGhpcy5jb250YWN0c0J5U2hvcnRJZF8gPSB7fTsKICB0aGlzLmNvbnRhY3RzQnlKaWRfID0ge307CiAgdGhpcy5pbmNvbXBsZXRlQ29udGFjdHNCeUppZF8gPSB7fTsKICB0aGlzLmluY29tcGxldGVPa0ppZHNfID0ge307CiAgZ29vZy5kaXNwb3NlKHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXyk7CiAgdGhpcy5xdWlja2xpc3RHZW5lcmF0b3JfID0gbnVsbDsKICB0aGlzLnF1aWNrbGlzdF8uY2xlYXIoKTsKICB0aGlzLmFsbENvbnRhY3RzQ291bnRfID0gMAp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLmhhbmRsZVZjYXJkXyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJGhhbmRsZVZjYXJkXyQoZSkgewogIHZhciB2Y2FyZCA9IG5ldyBwcm90by5hcHBzLmNoYXQuVmNhcmQoZS5tc2cpLCBjb250YWN0ID0gdGhpcy5nZXRDb250YWN0KHZjYXJkLmdldEppZCgpKTsKICBpZihjb250YWN0KSB7CiAgICB2YXIgbmFtZXMgPSB0aGlzLm5hbWVzQnlKaWRfW3ZjYXJkLmdldEppZCgpXTsKICAgIG5hbWVzLnZDYXJkTmFtZSA9IHZjYXJkLmdldE5hbWUoKTsKICAgIHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXy5zdGFydENvbnRhY3RVcGRhdGUoY29udGFjdCk7CiAgICB2YXIgY2hhbmdlZCA9IGNvbnRhY3Quc2V0TmFtZShuYW1lcy5nZXROYW1lKHRoaXMuY29uZmlnXykpLCB1cmwgPSB2Y2FyZC5nZXRBdmF0YXIoKSwgdXJsID0gdXJsID8gdGhpcy5yZXNvbHZlQXZhdGFyVXJsXyh1cmwpIDogdGhpcy5yZXNvbHZlQXZhdGFyVXJsXyhjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuREVGQVVMVF9BVkFUQVJfVVJMXyksIGNoYW5nZWQgPSBjaGFuZ2VkIHwgY29udGFjdC5zZXRBdmF0YXJVcmwodXJsKTsKICAgIHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXy5lbmRDb250YWN0VXBkYXRlKGNvbnRhY3QpOwogICAgY2hhbmdlZCAmJiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNoYXQubW9kZWwuQ29udGFjdFNldC5Db250YWN0RXZlbnQoY2hhdC5tb2RlbC5Db250YWN0U2V0LkV2ZW50VHlwZS5DT05UQUNUX1VQREFURUQsIGNvbnRhY3QpKQogIH1lbHNlIHsKICAgIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJtaXNzaW5nIGNvbnRhY3Qgb2JqZWN0IGZvciAiICsgdmNhcmQuZ2V0SmlkKCkpCiAgfQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLmhhbmRsZUNvbnRhY3RVcGRhdGVfID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdFNldCQkaGFuZGxlQ29udGFjdFVwZGF0ZV8kKGUpIHsKICB2YXIgdXBkYXRlID0gbmV3IHByb3RvLmFwcHMuY2hhdC5Db250YWN0R2FpYUlkVXBkYXRlKGUubXNnKSwgY29udGFjdCA9IHRoaXMuZ2V0Q29udGFjdCh1cGRhdGUuZ2V0SmlkKCkpOwogIGlmKGNvbnRhY3QpIHsKICAgIHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXy5zdGFydENvbnRhY3RVcGRhdGUoY29udGFjdCk7CiAgICB2YXIgY2hhbmdlZCA9ICExLCBjaGFuZ2VkID0gY2hhbmdlZCB8IGNvbnRhY3Quc2V0T2JmdXNjYXRlZEdhaWFJZCh1cGRhdGUuZ2V0T2JmdXNjYXRlZEdhaWFJZCgpKSwgY2hhbmdlZCA9IGNoYW5nZWQgfCBjb250YWN0LnNldEdQbHVzRW5hYmxlZCh1cGRhdGUuZ2V0SXNHcGx1cygpKTsKICAgIHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXy5lbmRDb250YWN0VXBkYXRlKGNvbnRhY3QpOwogICAgY2hhbmdlZCAmJiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNoYXQubW9kZWwuQ29udGFjdFNldC5Db250YWN0RXZlbnQoY2hhdC5tb2RlbC5Db250YWN0U2V0LkV2ZW50VHlwZS5DT05UQUNUX1VQREFURUQsIGNvbnRhY3QpKQogIH1lbHNlIHsKICAgIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJtaXNzaW5nIGNvbnRhY3Qgb2JqZWN0IGZvciAiICsgdXBkYXRlLmdldEppZCgpKQogIH0KfTsKY2hhdC5tb2RlbC5Db250YWN0U2V0LnByb3RvdHlwZS5yZXNvbHZlQXZhdGFyVXJsXyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJHJlc29sdmVBdmF0YXJVcmxfJCh1cmwpIHsKICB2YXIgdXJpID0gbmV3IGdvb2cuVXJpKHVybCk7CiAgdXJpLmhhc0RvbWFpbigpIHx8ICh1cmkgPSBuZXcgZ29vZy5VcmkodGhpcy5jb25maWdfLmJhc2VVcmwudG9TdHJpbmcoKSArICJpbWFnZT9oPSIgKyB1cmwpLCB1cmkuZ2V0UXVlcnlEYXRhKCkuYWRkKCJhdXRodXNlciIsIHRoaXMuY29uZmlnXy5nZXRVc2VyKCkuZ2V0QXV0aEluZGV4KCkpKTsKICByZXR1cm4gdXJpLnRvU3RyaW5nKCkKfTsKY2hhdC5tb2RlbC5Db250YWN0U2V0LnByb3RvdHlwZS5oYW5kbGVPZmZUaGVSZWNvcmRfID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdFNldCQkaGFuZGxlT2ZmVGhlUmVjb3JkXyQoZSkgewogIGZvcih2YXIgb3RyID0gbmV3IHByb3RvLmFwcHMuY2hhdC5PZmZUaGVSZWNvcmQoZS5tc2cpLCBpID0gMDtpIDwgb3RyLmdldERhdGFMaXN0KCkubGVuZ3RoOysraSkgewogICAgdmFyIGRhdHVtID0gb3RyLmdldERhdGFMaXN0KClbaV0sIGppZCA9IGRhdHVtLmdldEppZCgpLCBjb250YWN0ID0gdGhpcy5nZXRDb250YWN0KGppZCk7CiAgICBjb250YWN0ID8gdGhpcy5wcm9jZXNzT3RyRm9yQ29udGFjdF8oY29udGFjdCwgZGF0dW0sICEwKSA6IHRoaXMucGVuZGluZ090cnNfLnNldChhcHBzLmNoYXQuY29yZS5KaWQuYmFyZVBhcnQoamlkKSwgZGF0dW0pCiAgfQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLnByb2Nlc3NPdHJGb3JDb250YWN0XyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJHByb2Nlc3NPdHJGb3JDb250YWN0XyQoY29udGFjdCwgZGF0dW0sIGJyb2FkY2FzdCkgewogIHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXy5zdGFydENvbnRhY3RVcGRhdGUoY29udGFjdCk7CiAgY29udGFjdC5zZXROb1NhdmUoZGF0dW0uZ2V0T3RyKCkpICYmIGJyb2FkY2FzdCAmJiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNoYXQubW9kZWwuQ29udGFjdFNldC5Db250YWN0RXZlbnQoY2hhdC5tb2RlbC5Db250YWN0U2V0LkV2ZW50VHlwZS5DT05UQUNUX1VQREFURUQsIGNvbnRhY3QpKTsKICB0aGlzLnF1aWNrbGlzdEdlbmVyYXRvcl8uZW5kQ29udGFjdFVwZGF0ZShjb250YWN0KQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLmdldEppZEZvckJyb2FkY2FzdF8gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JCRnZXRKaWRGb3JCcm9hZGNhc3RfJChqaWQpIHsKICByZXR1cm4gYXBwcy5jaGF0LmNvcmUuSmlkLklzUm9vbUppZChqaWQpID8gamlkIDogYXBwcy5jaGF0LmNvcmUuSmlkLmJhcmVQYXJ0KGppZCkKfTsKY2hhdC5tb2RlbC5Db250YWN0U2V0LnByb3RvdHlwZS5vblF1aWNrTGlzdFVwZGF0ZV8gPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JCRvblF1aWNrTGlzdFVwZGF0ZV8kKCkgewogIHZhciBuZXdRbCA9IHRoaXMucXVpY2tsaXN0R2VuZXJhdG9yXy5nZXRRdWlja0xpc3QoKTsKICB0aGlzLmhhbmRsZVF1aWNrbGlzdFVwZGF0ZShuZXdRbCkKfTsKY2hhdC5tb2RlbC5Db250YWN0U2V0LnByb3RvdHlwZS5oYW5kbGVRdWlja2xpc3RVcGRhdGUgPSBmdW5jdGlvbiAkY2hhdCRtb2RlbCRDb250YWN0U2V0JCRoYW5kbGVRdWlja2xpc3RVcGRhdGUkKHNob3J0SWRzKSB7CiAgdGhpcy5xdWlja2xpc3RfLmNsZWFyKCk7CiAgZm9yKHZhciBpID0gMDtpIDwgc2hvcnRJZHMubGVuZ3RoO2krKykgewogICAgdGhpcy5xdWlja2xpc3RfLnNldChzaG9ydElkc1tpXSwgITApCiAgfQogIHRoaXMucmVmcmVzaFF1aWNrbGlzdCgpCn07CmNoYXQubW9kZWwuQ29udGFjdFNldC5wcm90b3R5cGUuaGFuZGxlQ2hhdFN0YXRlVXBkYXRlXyA9IGZ1bmN0aW9uICRjaGF0JG1vZGVsJENvbnRhY3RTZXQkJGhhbmRsZUNoYXRTdGF0ZVVwZGF0ZV8kKGUpIHsKICB2YXIgdXBkYXRlID0gbmV3IHByb3RvLmFwcHMuY2hhdC5DaGF0U3RhdGVVcGRhdGUoZS5tc2cpLCBzdGF0ZTsKICBzd2l0Y2godXBkYXRlLmdldENoYXRTdGF0ZSgpKSB7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5DaGF0U3RhdGVVcGRhdGUuQ2hhdFN0YXRlLkNPTVBPU0lORzoKICAgICAgc3RhdGUgPSBjaGF0Lm1vZGVsLkNvbnRhY3QuQ2hhdFN0YXRlLkNPTVBPU0lORzsKICAgICAgYnJlYWs7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5DaGF0U3RhdGVVcGRhdGUuQ2hhdFN0YXRlLlBBVVNFRDoKICAgICAgc3RhdGUgPSBjaGF0Lm1vZGVsLkNvbnRhY3QuQ2hhdFN0YXRlLlBBVVNFRDsKICAgICAgYnJlYWs7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5DaGF0U3RhdGVVcGRhdGUuQ2hhdFN0YXRlLklETEU6CiAgICAgIHN0YXRlID0gY2hhdC5tb2RlbC5Db250YWN0LkNoYXRTdGF0ZS5JRExFOwogICAgICBicmVhazsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5DaGF0U3RhdGUuR09ORToKICAgICAgc3RhdGUgPSBjaGF0Lm1vZGVsLkNvbnRhY3QuQ2hhdFN0YXRlLkdPTkU7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgc3RhdGUgPSBjaGF0Lm1vZGVsLkNvbnRhY3QuQ2hhdFN0YXRlLkFDVElWRQogIH0KICB0aGlzLnVwZGF0ZUNoYXRTdGF0ZSh1cGRhdGUuZ2V0SmlkKCksIHN0YXRlKQp9OwpjaGF0Lm1vZGVsLkNvbnRhY3RTZXQucHJvdG90eXBlLnVwZGF0ZUxhc3RDaGF0ID0gZnVuY3Rpb24gJGNoYXQkbW9kZWwkQ29udGFjdFNldCQkdXBkYXRlTGFzdENoYXQkKGppZCwgdGltZXN0YW1wTWljcykgewogIHZhciBjb250YWN0ID0gdGhpcy5nZXRDb250YWN0KGppZCksIHRpbWVzdGFtcE1zID0gdGltZXN0YW1wTWljcyAvIDFFMzsKICBjb250YWN0ICYmIGNvbnRhY3QubGFzdENoYXRUaW1lc3RhbXAoKSA8IHRpbWVzdGFtcE1zICYmICh0aGlzLnF1aWNrbGlzdEdlbmVyYXRvcl8uc3RhcnRDb250YWN0VXBkYXRlKGNvbnRhY3QpLCBjb250YWN0LnNldExhc3RDaGF0VGltZXN0YW1wKHRpbWVzdGFtcE1zKSwgdGhpcy5xdWlja2xpc3RHZW5lcmF0b3JfLmVuZENvbnRhY3RVcGRhdGUoY29udGFjdCwgITApKQp9OwpjaGF0LnV0aWxzLkxvZyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJExvZyQoKSB7CiAgdGhyb3cgRXJyb3IoInVzZSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIgaW5zdGVhZCEiKTsKfTsKY2hhdC51dGlscy5Mb2cuZ2V0U3RyaW5nU2FmZSA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJExvZyRnZXRTdHJpbmdTYWZlJChvYmopIHsKICB0cnkgewogICAgaWYoZ29vZy5pc0FycmF5KG9iaikpIHsKICAgICAgZm9yKHZhciBvdXQgPSBbXSwgaSA9IDA7aSA8IG9iai5sZW5ndGg7aSsrKSB7CiAgICAgICAgb3V0LnB1c2goY2hhdC51dGlscy5Mb2cuZ2V0U3RyaW5nU2FmZShvYmpbaV0pKQogICAgICB9CiAgICAgIHJldHVyblsiWyIsIG91dC5qb2luKCIsICIpLCAiXSJdLmpvaW4oIiIpCiAgICB9CiAgICByZXR1cm4iIiArIG9iagogIH1jYXRjaChlKSB7CiAgICByZXR1cm5bIjxPYmplY3Q+ICgiLCBlLm1lc3NhZ2UsICIpIl0uam9pbigiIikKICB9Cn07CmZhdmEuY29yZSA9IHt9OwpmYXZhLmNvcmUuVGltZXIgPSBmdW5jdGlvbiAkZmF2YSRjb3JlJFRpbWVyJChjb21tZW50LCBvcHRfaW50ZXJ2YWwsIG9wdF90aW1lck9iamVjdCkgewogIGdvb2cuVGltZXIuY2FsbCh0aGlzLCBvcHRfaW50ZXJ2YWwsIG9wdF90aW1lck9iamVjdCk7CiAgdGhpcy5jb21tZW50XyA9IGNvbW1lbnQKfTsKZ29vZy5pbmhlcml0cyhmYXZhLmNvcmUuVGltZXIsIGdvb2cuVGltZXIpOwpmYXZhLmNvcmUuVGltZXIubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigiZmF2YS5jb3JlLlRpbWVyIik7CmZhdmEuY29yZS5UaW1lci5wcm90b3R5cGUuZGlzcGF0Y2hUaWNrID0gZnVuY3Rpb24gJGZhdmEkY29yZSRUaW1lciQkZGlzcGF0Y2hUaWNrJCgpIHsKICBmYXZhLmNvcmUuVGltZXIubG9nZ2VyXy5maW5lKCJUaWNrIGZvciAiICsgdGhpcy5jb21tZW50Xyk7CiAgZmF2YS5jb3JlLlRpbWVyLnN1cGVyQ2xhc3NfLmRpc3BhdGNoVGljay5jYWxsKHRoaXMpCn07CmZhdmEuY29yZS5UaW1lci5jYWxsT25jZSA9IGZ1bmN0aW9uICRmYXZhJGNvcmUkVGltZXIkY2FsbE9uY2UkKGNvbW1lbnQsIGxpc3RlbmVyLCBvcHRfaW50ZXJ2YWwsIG9wdF9oYW5kbGVyKSB7CiAgaWYoIShnb29nLmlzRnVuY3Rpb24obGlzdGVuZXIpIHx8IGxpc3RlbmVyICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIGxpc3RlbmVyLmhhbmRsZUV2ZW50KSkgewogICAgdGhyb3cgRXJyb3IoIkludmFsaWQgbGlzdGVuZXIgYXJndW1lbnQiKTsKICB9CiAgdmFyIGhhbmRsZXIgPSBnb29nLmJpbmQoZmF2YS5jb3JlLlRpbWVyLmNhbGxPbmNlSGFuZGxlcl8sIG51bGwsIGNvbW1lbnQsIGxpc3RlbmVyLCBvcHRfaGFuZGxlcik7CiAgcmV0dXJuIGdvb2cuVGltZXIuZGVmYXVsdFRpbWVyT2JqZWN0LnNldFRpbWVvdXQoaGFuZGxlciwgb3B0X2ludGVydmFsIHx8IDApCn07CmZhdmEuY29yZS5UaW1lci5jYWxsT25jZUhhbmRsZXJfID0gZnVuY3Rpb24gJGZhdmEkY29yZSRUaW1lciRjYWxsT25jZUhhbmRsZXJfJChjb21tZW50LCBsaXN0ZW5lciwgb3B0X2hhbmRsZXIpIHsKICBmYXZhLmNvcmUuVGltZXIubG9nZ2VyXy5maW5lKCJDYWxsYmFjayBmb3IgIiArIGNvbW1lbnQpOwogIGdvb2cuaXNGdW5jdGlvbihsaXN0ZW5lcikgPyBsaXN0ZW5lci5jYWxsKG9wdF9oYW5kbGVyKSA6IGxpc3RlbmVyICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIGxpc3RlbmVyLmhhbmRsZUV2ZW50ICYmIGxpc3RlbmVyLmhhbmRsZUV2ZW50LmNhbGwobGlzdGVuZXIpCn07CmZhdmEuY29yZS5UaW1lci5jbGVhciA9IGZ1bmN0aW9uICRmYXZhJGNvcmUkVGltZXIkY2xlYXIkKHRpbWVySWQpIHsKICBnb29nLlRpbWVyLmRlZmF1bHRUaW1lck9iamVjdC5jbGVhclRpbWVvdXQodGltZXJJZCkKfTsKZmF2YS5jb3JlLlRpbWVyLnNldEludGVydmFsID0gZnVuY3Rpb24gJGZhdmEkY29yZSRUaW1lciRzZXRJbnRlcnZhbCQoY29tbWVudCwgaGFuZGxlciwgaW50ZXJ2YWxNcywgb3B0X2hhbmRsZXIpIHsKICBmYXZhLmNvcmUuVGltZXIuaW50ZXJ2YWxUaW1lcnNfIHx8IChmYXZhLmNvcmUuVGltZXIuaW50ZXJ2YWxUaW1lcnNfID0gbmV3IGdvb2cuc3RydWN0cy5NYXApOwogIHZhciB0aW1lciA9IG5ldyBmYXZhLmNvcmUuVGltZXIoY29tbWVudCwgaW50ZXJ2YWxNcyksIHRpbWVySWQgPSBnb29nLmdldFVpZCh0aW1lcik7CiAgZmF2YS5jb3JlLlRpbWVyLmludGVydmFsVGltZXJzXy5zZXQodGltZXJJZCwgdGltZXIpOwogIGdvb2cuZXZlbnRzLmxpc3Rlbih0aW1lciwgZ29vZy5UaW1lci5USUNLLCBoYW5kbGVyLCAhMSwgb3B0X2hhbmRsZXIpOwogIHRpbWVyLnN0YXJ0KCk7CiAgcmV0dXJuIHRpbWVySWQKfTsKZmF2YS5jb3JlLlRpbWVyLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbiAkZmF2YSRjb3JlJFRpbWVyJGNsZWFySW50ZXJ2YWwkKGludGVydmFsSWQpIHsKICB2YXIgdGltZXIgPSBmYXZhLmNvcmUuVGltZXIuaW50ZXJ2YWxUaW1lcnNfLmdldChpbnRlcnZhbElkKTsKICBmYXZhLmNvcmUuVGltZXIuaW50ZXJ2YWxUaW1lcnNfLnJlbW92ZShpbnRlcnZhbElkKTsKICB0aW1lci5kaXNwb3NlKCkKfTsKZmF2YS5kZWJ1ZyA9IHt9OwpmYXZhLmRlYnVnLkVycm9yUmVwb3J0U2VuZGVyID0gZnVuY3Rpb24gJGZhdmEkZGVidWckRXJyb3JSZXBvcnRTZW5kZXIkKCkgewp9OwpmYXZhLmRlYnVnLkVycm9yUmVwb3J0ZXIgPSB7fTsKZmF2YS5kZWJ1Zy5FcnJvclJlcG9ydGVyXyA9IGZ1bmN0aW9uICRmYXZhJGRlYnVnJEVycm9yUmVwb3J0ZXJfJCgpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKQp9Owpnb29nLmluaGVyaXRzKGZhdmEuZGVidWcuRXJyb3JSZXBvcnRlcl8sIGdvb2cuRGlzcG9zYWJsZSk7CmZhdmEuZGVidWcuRXJyb3JSZXBvcnRlcl8ucHJvdG90eXBlLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoImZhdmEuZGVidWcuRXJyb3JSZXBvcnRlciIpOwpmYXZhLmRlYnVnLkVycm9yUmVwb3J0ZXJfLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gJGZhdmEkZGVidWckRXJyb3JSZXBvcnRlcl8kJGluaXQkKCkgewogIHRoaXMuc2F2ZWRFeGNlcHRpb25zXyA9IFtdCn07CmZhdmEuZGVidWcuRXJyb3JSZXBvcnRlcl8ucHJvdG90eXBlLnNldEVycm9yUmVwb3J0U2VuZGVyID0gZnVuY3Rpb24gJGZhdmEkZGVidWckRXJyb3JSZXBvcnRlcl8kJHNldEVycm9yUmVwb3J0U2VuZGVyJChzZW5kZXIpIHsKICB0aGlzLnNlbmRlcl8gJiYgdGhpcy5sb2dnZXJfLndhcm5pbmcoIkVycm9yUmVwb3J0U2VuZGVyIGFscmVhZHkgc2V0LiIpOwogIHRoaXMuc2VuZGVyXyA9IHNlbmRlcjsKICB0aGlzLmxvZ1NhdmVkRXhjZXB0aW9uc18oKQp9OwpmYXZhLmRlYnVnLkVycm9yUmVwb3J0ZXJfLnByb3RvdHlwZS5yZXBvcnRFeGNlcHRpb24gPSBmdW5jdGlvbiAkZmF2YSRkZWJ1ZyRFcnJvclJlcG9ydGVyXyQkcmVwb3J0RXhjZXB0aW9uJChtc2csIGUpIHsKICBpZih0aGlzLmlzRGlzcG9zZWQoKSkgewogICAgdGhpcy5sb2dnZXJfLmluZm8oInJlcG9ydEV4Y2VwdGlvbiB3YXMgY2FsbGVkIGJ1dCBFcnJvclJlcG9ydGVyIGFscmVhZHkgZGlzcG9zZWQuIE1lc3NhZ2U6ICIgKyBtc2csIGUpCiAgfWVsc2UgewogICAgaWYoZSBpbnN0YW5jZW9mIGdvb2cuYXN5bmMuRGVmZXJyZWQuQ2FuY2VsbGVkRXJyb3IpIHsKICAgICAgdGhpcy5sb2dnZXJfLmluZm8obXNnIHx8ICJDYW5jZWxsZWRFcnJvciIsIGUpCiAgICB9ZWxzZSB7CiAgICAgIGlmKHRoaXMubG9nZ2VyXykgewogICAgICAgIHZhciBsb2dSZWNvcmQgPSB0aGlzLmxvZ2dlcl8uZ2V0TG9nUmVjb3JkKGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLlNFVkVSRSwgbXNnIHx8ICJFeGNlcHRpb24iLCBlKTsKICAgICAgICBsb2dSZWNvcmQuZG9udFJlcG9ydCA9ICEwOwogICAgICAgIHRoaXMubG9nZ2VyXy5sb2dSZWNvcmQobG9nUmVjb3JkKQogICAgICB9CiAgICAgIHRoaXMuc2VuZGVyXyB8fCB0aGlzLnNhdmVkRXhjZXB0aW9uc18gJiYgMTAgPiB0aGlzLnNhdmVkRXhjZXB0aW9uc18ubGVuZ3RoICYmIHRoaXMuc2F2ZWRFeGNlcHRpb25zXy5wdXNoKFttc2csIGVdKQogICAgfQogIH0KfTsKZmF2YS5kZWJ1Zy5FcnJvclJlcG9ydGVyXy5wcm90b3R5cGUucmVwb3J0RXhjZXB0aW9uTm9Nc2cgPSBmdW5jdGlvbiAkZmF2YSRkZWJ1ZyRFcnJvclJlcG9ydGVyXyQkcmVwb3J0RXhjZXB0aW9uTm9Nc2ckKGUpIHsKICB0aGlzLnJlcG9ydEV4Y2VwdGlvbihudWxsLCBlKQp9OwpmYXZhLmRlYnVnLkVycm9yUmVwb3J0ZXJfLmdldEdvb2dEZWJ1ZyA9IGZ1bmN0aW9uICRmYXZhJGRlYnVnJEVycm9yUmVwb3J0ZXJfJGdldEdvb2dEZWJ1ZyQoKSB7CiAgcmV0dXJuIGdvb2cuREVCVUcKfTsKZmF2YS5kZWJ1Zy5FcnJvclJlcG9ydGVyXy5wcm90b3R5cGUubG9nU2F2ZWRFeGNlcHRpb25zXyA9IGZ1bmN0aW9uICRmYXZhJGRlYnVnJEVycm9yUmVwb3J0ZXJfJCRsb2dTYXZlZEV4Y2VwdGlvbnNfJCgpIHsKICB0aGlzLnNhdmVkRXhjZXB0aW9uc18gJiYgKGdvb2cuYXJyYXkuZm9yRWFjaCh0aGlzLnNhdmVkRXhjZXB0aW9uc18sIGZ1bmN0aW9uKCkgewogIH0sIHRoaXMpLCB0aGlzLnNhdmVkRXhjZXB0aW9uc18gPSBudWxsKQp9OwpmYXZhLmRlYnVnLkVycm9yUmVwb3J0ZXIuc2luZ2xldG9uXyA9IG5ldyBmYXZhLmRlYnVnLkVycm9yUmVwb3J0ZXJfOwpmYXZhLmRlYnVnLkVycm9yUmVwb3J0ZXIuaW5pdCA9IGZ1bmN0aW9uICRmYXZhJGRlYnVnJEVycm9yUmVwb3J0ZXIkaW5pdCQoKSB7CiAgZmF2YS5kZWJ1Zy5FcnJvclJlcG9ydGVyLnNpbmdsZXRvbl8uaW5pdCgpCn07CmZhdmEuZGVidWcuRXJyb3JSZXBvcnRlci5zZXRFcnJvclJlcG9ydFNlbmRlciA9IGZ1bmN0aW9uICRmYXZhJGRlYnVnJEVycm9yUmVwb3J0ZXIkc2V0RXJyb3JSZXBvcnRTZW5kZXIkKHNlbmRlcikgewogIGZhdmEuZGVidWcuRXJyb3JSZXBvcnRlci5zaW5nbGV0b25fLnNldEVycm9yUmVwb3J0U2VuZGVyKHNlbmRlcikKfTsKZmF2YS5kZWJ1Zy5FcnJvclJlcG9ydGVyLnJlcG9ydEV4Y2VwdGlvbiA9IGZ1bmN0aW9uICRmYXZhJGRlYnVnJEVycm9yUmVwb3J0ZXIkcmVwb3J0RXhjZXB0aW9uJChtc2csIGUpIHsKICBmYXZhLmRlYnVnLkVycm9yUmVwb3J0ZXIuc2luZ2xldG9uXy5yZXBvcnRFeGNlcHRpb24obXNnLCBlKQp9OwpmYXZhLmRlYnVnLkVycm9yUmVwb3J0ZXIucmVwb3J0RXhjZXB0aW9uTm9Nc2cgPSBmdW5jdGlvbiAkZmF2YSRkZWJ1ZyRFcnJvclJlcG9ydGVyJHJlcG9ydEV4Y2VwdGlvbk5vTXNnJChlKSB7CiAgZmF2YS5kZWJ1Zy5FcnJvclJlcG9ydGVyLnNpbmdsZXRvbl8ucmVwb3J0RXhjZXB0aW9uTm9Nc2coZSkKfTsKZmF2YS5kZWJ1Zy5FcnJvclJlcG9ydGVyLmRpc3Bvc2UgPSBmdW5jdGlvbiAkZmF2YSRkZWJ1ZyRFcnJvclJlcG9ydGVyJGRpc3Bvc2UkKCkgewogIGZhdmEuZGVidWcuRXJyb3JSZXBvcnRlci5zaW5nbGV0b25fLmRpc3Bvc2UoKQp9Owpnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyID0gZnVuY3Rpb24gJGdvb2ckZGVidWckUmVsYXRpdmVUaW1lUHJvdmlkZXIkKCkgewogIHRoaXMucmVsYXRpdmVUaW1lU3RhcnRfID0gZ29vZy5ub3coKQp9Owpnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyLmRlZmF1bHRJbnN0YW5jZV8gPSBuZXcgZ29vZy5kZWJ1Zy5SZWxhdGl2ZVRpbWVQcm92aWRlcjsKZ29vZy5kZWJ1Zy5SZWxhdGl2ZVRpbWVQcm92aWRlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gJGdvb2ckZGVidWckUmVsYXRpdmVUaW1lUHJvdmlkZXIkJHNldCQodGltZVN0YW1wKSB7CiAgdGhpcy5yZWxhdGl2ZVRpbWVTdGFydF8gPSB0aW1lU3RhbXAKfTsKZ29vZy5kZWJ1Zy5SZWxhdGl2ZVRpbWVQcm92aWRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRSZWxhdGl2ZVRpbWVQcm92aWRlciQkcmVzZXQkKCkgewogIHRoaXMuc2V0KGdvb2cubm93KCkpCn07Cmdvb2cuZGVidWcuUmVsYXRpdmVUaW1lUHJvdmlkZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFJlbGF0aXZlVGltZVByb3ZpZGVyJCRnZXQkKCkgewogIHJldHVybiB0aGlzLnJlbGF0aXZlVGltZVN0YXJ0Xwp9Owpnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyLmdldERlZmF1bHRJbnN0YW5jZSA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFJlbGF0aXZlVGltZVByb3ZpZGVyJGdldERlZmF1bHRJbnN0YW5jZSQoKSB7CiAgcmV0dXJuIGdvb2cuZGVidWcuUmVsYXRpdmVUaW1lUHJvdmlkZXIuZGVmYXVsdEluc3RhbmNlXwp9Owpnb29nLmRlYnVnLkZvcm1hdHRlciA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJEZvcm1hdHRlciQob3B0X3ByZWZpeCkgewogIHRoaXMucHJlZml4XyA9IG9wdF9wcmVmaXggfHwgIiI7CiAgdGhpcy5zdGFydFRpbWVQcm92aWRlcl8gPSBnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyLmdldERlZmF1bHRJbnN0YW5jZSgpCn07Cmdvb2cuZGVidWcuRm9ybWF0dGVyLnByb3RvdHlwZS5zaG93QWJzb2x1dGVUaW1lID0gITA7Cmdvb2cuZGVidWcuRm9ybWF0dGVyLnByb3RvdHlwZS5zaG93UmVsYXRpdmVUaW1lID0gITA7Cmdvb2cuZGVidWcuRm9ybWF0dGVyLnByb3RvdHlwZS5zaG93TG9nZ2VyTmFtZSA9ICEwOwpnb29nLmRlYnVnLkZvcm1hdHRlci5wcm90b3R5cGUuc2hvd0V4Y2VwdGlvblRleHQgPSAhMTsKZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXIucHJvdG90eXBlLnNob3dTZXZlcml0eUxldmVsID0gITE7Cmdvb2cuZGVidWcuRm9ybWF0dGVyLmdldERhdGVUaW1lU3RhbXBfID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRm9ybWF0dGVyJGdldERhdGVUaW1lU3RhbXBfJChsb2dSZWNvcmQpIHsKICB2YXIgdGltZSA9IG5ldyBEYXRlKGxvZ1JlY29yZC5nZXRNaWxsaXMoKSk7CiAgcmV0dXJuIGdvb2cuZGVidWcuRm9ybWF0dGVyLmdldFR3b0RpZ2l0U3RyaW5nXyh0aW1lLmdldEZ1bGxZZWFyKCkgLSAyRTMpICsgZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXIuZ2V0VHdvRGlnaXRTdHJpbmdfKHRpbWUuZ2V0TW9udGgoKSArIDEpICsgZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXIuZ2V0VHdvRGlnaXRTdHJpbmdfKHRpbWUuZ2V0RGF0ZSgpKSArICIgIiArIGdvb2cuZGVidWcuRm9ybWF0dGVyLmdldFR3b0RpZ2l0U3RyaW5nXyh0aW1lLmdldEhvdXJzKCkpICsgIjoiICsgZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXIuZ2V0VHdvRGlnaXRTdHJpbmdfKHRpbWUuZ2V0TWludXRlcygpKSArICI6IiArIGdvb2cuZGVidWcuRm9ybWF0dGVyLmdldFR3b0RpZ2l0U3RyaW5nXyh0aW1lLmdldFNlY29uZHMoKSkgKyAiLiIgKyBnb29nLmRlYnVnLkZvcm1hdHRlci5nZXRUd29EaWdpdFN0cmluZ18oTWF0aC5mbG9vcih0aW1lLmdldE1pbGxpc2Vjb25kcygpIC8gMTApKQp9Owpnb29nLmRlYnVnLkZvcm1hdHRlci5nZXRUd29EaWdpdFN0cmluZ18gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRGb3JtYXR0ZXIkZ2V0VHdvRGlnaXRTdHJpbmdfJChuKSB7CiAgcmV0dXJuIDEwID4gbiA/ICIwIiArIG4gOiAiIiArIG4KfTsKZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXIuZ2V0UmVsYXRpdmVUaW1lXyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJEZvcm1hdHRlciRnZXRSZWxhdGl2ZVRpbWVfJChsb2dSZWNvcmQsIHJlbGF0aXZlVGltZVN0YXJ0KSB7CiAgdmFyIG1zID0gbG9nUmVjb3JkLmdldE1pbGxpcygpIC0gcmVsYXRpdmVUaW1lU3RhcnQsIHNlYyA9IG1zIC8gMUUzLCBzdHIgPSBzZWMudG9GaXhlZCgzKSwgc3BhY2VzVG9QcmVwZW5kID0gMDsKICBpZigxID4gc2VjKSB7CiAgICBzcGFjZXNUb1ByZXBlbmQgPSAyCiAgfWVsc2UgewogICAgZm9yKDsxMDAgPiBzZWM7KSB7CiAgICAgIHNwYWNlc1RvUHJlcGVuZCsrLCBzZWMgKj0gMTAKICAgIH0KICB9CiAgZm9yKDswIDwgc3BhY2VzVG9QcmVwZW5kLS07KSB7CiAgICBzdHIgPSAiICIgKyBzdHIKICB9CiAgcmV0dXJuIHN0cgp9Owpnb29nLmRlYnVnLkh0bWxGb3JtYXR0ZXIgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRIdG1sRm9ybWF0dGVyJChvcHRfcHJlZml4KSB7CiAgZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXIuY2FsbCh0aGlzLCBvcHRfcHJlZml4KQp9Owpnb29nLmluaGVyaXRzKGdvb2cuZGVidWcuSHRtbEZvcm1hdHRlciwgZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXIpOwpnb29nLmRlYnVnLkh0bWxGb3JtYXR0ZXIucHJvdG90eXBlLnNob3dFeGNlcHRpb25UZXh0ID0gITA7Cmdvb2cuZGVidWcuSHRtbEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0UmVjb3JkID0gZnVuY3Rpb24gJGdvb2ckZGVidWckSHRtbEZvcm1hdHRlciQkZm9ybWF0UmVjb3JkJChsb2dSZWNvcmQpIHsKICB2YXIgY2xhc3NOYW1lOwogIHN3aXRjaChsb2dSZWNvcmQuZ2V0TGV2ZWwoKS52YWx1ZSkgewogICAgY2FzZSBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5TSE9VVC52YWx1ZToKICAgICAgY2xhc3NOYW1lID0gImRiZy1zaCI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5TRVZFUkUudmFsdWU6CiAgICAgIGNsYXNzTmFtZSA9ICJkYmctc2V2IjsKICAgICAgYnJlYWs7CiAgICBjYXNlIGdvb2cuZGVidWcuTG9nZ2VyLkxldmVsLldBUk5JTkcudmFsdWU6CiAgICAgIGNsYXNzTmFtZSA9ICJkYmctdyI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5JTkZPLnZhbHVlOgogICAgICBjbGFzc05hbWUgPSAiZGJnLWkiOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGNsYXNzTmFtZSA9ICJkYmctZiIKICB9CiAgdmFyIHNiID0gW107CiAgc2IucHVzaCh0aGlzLnByZWZpeF8sICIgIik7CiAgdGhpcy5zaG93QWJzb2x1dGVUaW1lICYmIHNiLnB1c2goIlsiLCBnb29nLmRlYnVnLkZvcm1hdHRlci5nZXREYXRlVGltZVN0YW1wXyhsb2dSZWNvcmQpLCAiXSAiKTsKICB0aGlzLnNob3dSZWxhdGl2ZVRpbWUgJiYgc2IucHVzaCgiWyIsIGdvb2cuc3RyaW5nLndoaXRlc3BhY2VFc2NhcGUoZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXIuZ2V0UmVsYXRpdmVUaW1lXyhsb2dSZWNvcmQsIHRoaXMuc3RhcnRUaW1lUHJvdmlkZXJfLmdldCgpKSksICJzXSAiKTsKICB0aGlzLnNob3dMb2dnZXJOYW1lICYmIHNiLnB1c2goIlsiLCBnb29nLnN0cmluZy5odG1sRXNjYXBlKGxvZ1JlY29yZC5nZXRMb2dnZXJOYW1lKCkpLCAiXSAiKTsKICBzYi5wdXNoKCc8c3BhbiBjbGFzcz0iJywgY2xhc3NOYW1lLCAnIj4nLCBnb29nLnN0cmluZy5uZXdMaW5lVG9Ccihnb29nLnN0cmluZy53aGl0ZXNwYWNlRXNjYXBlKGdvb2cuc3RyaW5nLmh0bWxFc2NhcGUobG9nUmVjb3JkLmdldE1lc3NhZ2UoKSkpKSk7CiAgdGhpcy5zaG93RXhjZXB0aW9uVGV4dCAmJiBsb2dSZWNvcmQuZ2V0RXhjZXB0aW9uKCkgJiYgc2IucHVzaCgiPGJyPiIsIGdvb2cuc3RyaW5nLm5ld0xpbmVUb0JyKGdvb2cuc3RyaW5nLndoaXRlc3BhY2VFc2NhcGUobG9nUmVjb3JkLmdldEV4Y2VwdGlvblRleHQoKSB8fCAiIikpKTsKICBzYi5wdXNoKCI8L3NwYW4+PGJyPiIpOwogIHJldHVybiBzYi5qb2luKCIiKQp9Owpnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXIgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyRUZXh0Rm9ybWF0dGVyJChvcHRfcHJlZml4KSB7CiAgZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXIuY2FsbCh0aGlzLCBvcHRfcHJlZml4KQp9Owpnb29nLmluaGVyaXRzKGdvb2cuZGVidWcuVGV4dEZvcm1hdHRlciwgZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXIpOwpnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXIucHJvdG90eXBlLmZvcm1hdFJlY29yZCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJFRleHRGb3JtYXR0ZXIkJGZvcm1hdFJlY29yZCQobG9nUmVjb3JkKSB7CiAgdmFyIHNiID0gW107CiAgc2IucHVzaCh0aGlzLnByZWZpeF8sICIgIik7CiAgdGhpcy5zaG93QWJzb2x1dGVUaW1lICYmIHNiLnB1c2goIlsiLCBnb29nLmRlYnVnLkZvcm1hdHRlci5nZXREYXRlVGltZVN0YW1wXyhsb2dSZWNvcmQpLCAiXSAiKTsKICB0aGlzLnNob3dSZWxhdGl2ZVRpbWUgJiYgc2IucHVzaCgiWyIsIGdvb2cuZGVidWcuRm9ybWF0dGVyLmdldFJlbGF0aXZlVGltZV8obG9nUmVjb3JkLCB0aGlzLnN0YXJ0VGltZVByb3ZpZGVyXy5nZXQoKSksICJzXSAiKTsKICB0aGlzLnNob3dMb2dnZXJOYW1lICYmIHNiLnB1c2goIlsiLCBsb2dSZWNvcmQuZ2V0TG9nZ2VyTmFtZSgpLCAiXSAiKTsKICB0aGlzLnNob3dTZXZlcml0eUxldmVsICYmIHNiLnB1c2goIlsiLCBsb2dSZWNvcmQuZ2V0TGV2ZWwoKS5uYW1lLCAiXSAiKTsKICBzYi5wdXNoKGxvZ1JlY29yZC5nZXRNZXNzYWdlKCksICJcbiIpOwogIHRoaXMuc2hvd0V4Y2VwdGlvblRleHQgJiYgbG9nUmVjb3JkLmdldEV4Y2VwdGlvbigpICYmIHNiLnB1c2gobG9nUmVjb3JkLmdldEV4Y2VwdGlvblRleHQoKSwgIlxuIik7CiAgcmV0dXJuIHNiLmpvaW4oIiIpCn07Cmdvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXIgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkT25saW5lSGFuZGxlciQoKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIGlmKGdvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlLkhBU19OQVZJR0FUT1JfT05MSU5FX1BST1BFUlRZKSB7CiAgICBpZihnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZS5IQVNfSFRNTDVfTkVUV09SS19FVkVOVF9TVVBQT1JUKSB7CiAgICAgIHZhciB0YXJnZXQgPSBnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZS5IVE1MNV9ORVRXT1JLX0VWRU5UU19GSVJFX09OX0JPRFkgPyBkb2N1bWVudC5ib2R5IDogd2luZG93OwogICAgICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRhcmdldCwgWyJvbmxpbmUiLCAib2ZmbGluZSJdLCB0aGlzLmhhbmRsZUNoYW5nZV8pCiAgICB9ZWxzZSB7CiAgICAgIHRoaXMub25saW5lXyA9IHRoaXMuaXNPbmxpbmUoKSwgdGhpcy50aW1lcl8gPSBuZXcgZ29vZy5UaW1lcihnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLlBPTExfSU5URVJWQUxfKSwgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLnRpbWVyXywgZ29vZy5UaW1lci5USUNLLCB0aGlzLmhhbmRsZVRpY2tfKSwgdGhpcy50aW1lcl8uc3RhcnQoKQogICAgfQogIH0KfTsKZ29vZy5pbmhlcml0cyhnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7Cmdvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXIuRXZlbnRUeXBlID0ge09OTElORToib25saW5lIiwgT0ZGTElORToib2ZmbGluZSJ9Owpnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLlBPTExfSU5URVJWQUxfID0gMjUwOwpnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLnByb3RvdHlwZS5pc09ubGluZSA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRPbmxpbmVIYW5kbGVyJCRpc09ubGluZSQoKSB7CiAgcmV0dXJuIGdvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlLkhBU19OQVZJR0FUT1JfT05MSU5FX1BST1BFUlRZID8gbmF2aWdhdG9yLm9uTGluZSA6ICEwCn07Cmdvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZVRpY2tfID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJE9ubGluZUhhbmRsZXIkJGhhbmRsZVRpY2tfJChlKSB7CiAgdmFyIG9ubGluZSA9IHRoaXMuaXNPbmxpbmUoKTsKICBvbmxpbmUgIT0gdGhpcy5vbmxpbmVfICYmICh0aGlzLm9ubGluZV8gPSBvbmxpbmUsIHRoaXMuaGFuZGxlQ2hhbmdlXyhlKSkKfTsKZ29vZy5ldmVudHMuT25saW5lSGFuZGxlci5wcm90b3R5cGUuaGFuZGxlQ2hhbmdlXyA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRPbmxpbmVIYW5kbGVyJCRoYW5kbGVDaGFuZ2VfJCgpIHsKICB2YXIgdHlwZSA9IHRoaXMuaXNPbmxpbmUoKSA/IGdvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXIuRXZlbnRUeXBlLk9OTElORSA6IGdvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXIuRXZlbnRUeXBlLk9GRkxJTkU7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KHR5cGUpCn07Cmdvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRPbmxpbmVIYW5kbGVyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmRpc3Bvc2UoKTsKICBkZWxldGUgdGhpcy5ldmVudEhhbmRsZXJfOwogIHRoaXMudGltZXJfICYmICh0aGlzLnRpbWVyXy5kaXNwb3NlKCksIGRlbGV0ZSB0aGlzLnRpbWVyXykKfTsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkKGNoYW5uZWwsIGNoYW5uZWxEZWJ1Zywgb3B0X3Nlc3Npb25JZCwgb3B0X3JlcXVlc3RJZCwgb3B0X3JldHJ5SWQsIG9wdF9vbmxpbmVIYW5kbGVyKSB7CiAgdGhpcy5jaGFubmVsXyA9IGNoYW5uZWw7CiAgdGhpcy5jaGFubmVsRGVidWdfID0gY2hhbm5lbERlYnVnOwogIHRoaXMuc2lkXyA9IG9wdF9zZXNzaW9uSWQ7CiAgdGhpcy5yaWRfID0gb3B0X3JlcXVlc3RJZDsKICB0aGlzLnJldHJ5SWRfID0gb3B0X3JldHJ5SWQgfHwgMTsKICB0aGlzLnRpbWVvdXRfID0gZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QuVElNRU9VVF9NUzsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHRoaXMub25saW5lSGFuZGxlcl8gPSBvcHRfb25saW5lSGFuZGxlciB8fCBudWxsOwogIHRoaXMucG9sbGluZ1RpbWVyXyA9IG5ldyBnb29nLlRpbWVyOwogIHRoaXMucG9sbGluZ1RpbWVyXy5zZXRJbnRlcnZhbChnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5QT0xMSU5HX0lOVEVSVkFMX01TKQp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUuZXh0cmFIZWFkZXJzXyA9IG51bGw7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5zdWNjZXNzZnVsXyA9ICExOwpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUud2F0Y2hEb2dUaW1lcklkXyA9IG51bGw7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS53YXRjaERvZ1RpbWVvdXRUaW1lXyA9IG51bGw7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5yZXF1ZXN0U3RhcnRUaW1lXyA9IG51bGw7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS50eXBlXyA9IG51bGw7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5iYXNlVXJpXyA9IG51bGw7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5yZXF1ZXN0VXJpXyA9IG51bGw7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5wb3N0RGF0YV8gPSBudWxsOwpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUueG1sSHR0cF8gPSBudWxsOwpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUueG1sSHR0cENodW5rU3RhcnRfID0gMDsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLnRyaWRlbnRfID0gbnVsbDsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLnZlcmJfID0gbnVsbDsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLmxhc3RFcnJvcl8gPSBudWxsOwpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUubGFzdFN0YXR1c0NvZGVfID0gLTE7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5zZW5kQ2xvc2VfID0gITA7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5jYW5jZWxsZWRfID0gITE7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LlRJTUVPVVRfTVMgPSA0NUUzOwpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5QT0xMSU5HX0lOVEVSVkFMX01TID0gMjUwOwpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5NSU5fV0VCS0lUX0ZPUl9JTlRFUkFDVElWRV8gPSAiNDIwKyI7Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LlR5cGVfID0ge1hNTF9IVFRQOjEsIElNRzoyLCBUUklERU5UOjN9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvciA9IHtTVEFUVVM6MCwgTk9fREFUQToxLCBUSU1FT1VUOjIsIFVOS05PV05fU0VTU0lPTl9JRDozLCBCQURfREFUQTo0LCBIQU5ETEVSX0VYQ0VQVElPTjo1LCBCUk9XU0VSX09GRkxJTkU6Nn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LmVycm9yU3RyaW5nRnJvbUNvZGUgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkZXJyb3JTdHJpbmdGcm9tQ29kZSQoZXJyb3JDb2RlLCBzdGF0dXNDb2RlKSB7CiAgc3dpdGNoKGVycm9yQ29kZSkgewogICAgY2FzZSBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5TVEFUVVM6CiAgICAgIHJldHVybiJOb24tMjAwIHJldHVybiBjb2RlICgiICsgc3RhdHVzQ29kZSArICIpIjsKICAgIGNhc2UgZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QuRXJyb3IuTk9fREFUQToKICAgICAgcmV0dXJuIlhNTEhUVFAgZmFpbHVyZSAobm8gZGF0YSkiOwogICAgY2FzZSBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5USU1FT1VUOgogICAgICByZXR1cm4iSHR0cENvbm5lY3Rpb24gdGltZW91dCI7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4iVW5rbm93biBlcnJvciIKICB9Cn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LklOVkFMSURfQ0hVTktfID0ge307Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LklOQ09NUExFVEVfQ0hVTktfID0ge307Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnN1cHBvcnRzWGhyU3RyZWFtaW5nID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JHN1cHBvcnRzWGhyU3RyZWFtaW5nJCgpIHsKICByZXR1cm4hZ29vZy51c2VyQWdlbnQuSUUgfHwgZ29vZy51c2VyQWdlbnQuaXNEb2N1bWVudE1vZGUoMTApCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5zZXRFeHRyYUhlYWRlcnMgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJHNldEV4dHJhSGVhZGVycyQoZXh0cmFIZWFkZXJzKSB7CiAgdGhpcy5leHRyYUhlYWRlcnNfID0gZXh0cmFIZWFkZXJzCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCRzZXRUaW1lb3V0JCh0aW1lb3V0KSB7CiAgdGhpcy50aW1lb3V0XyA9IHRpbWVvdXQKfTsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLnhtbEh0dHBQb3N0ID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCR4bWxIdHRwUG9zdCQodXJpLCBwb3N0RGF0YSwgZGVjb2RlQ2h1bmtzKSB7CiAgdGhpcy50eXBlXyA9IGdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LlR5cGVfLlhNTF9IVFRQOwogIHRoaXMuYmFzZVVyaV8gPSB1cmkuY2xvbmUoKS5tYWtlVW5pcXVlKCk7CiAgdGhpcy5wb3N0RGF0YV8gPSBwb3N0RGF0YTsKICB0aGlzLmRlY29kZUNodW5rc18gPSBkZWNvZGVDaHVua3M7CiAgdGhpcy5zZW5kWG1sSHR0cF8obnVsbCkKfTsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLnhtbEh0dHBHZXQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJHhtbEh0dHBHZXQkKHVyaSwgZGVjb2RlQ2h1bmtzLCBob3N0UHJlZml4LCBvcHRfbm9DbG9zZSkgewogIHRoaXMudHlwZV8gPSBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5UeXBlXy5YTUxfSFRUUDsKICB0aGlzLmJhc2VVcmlfID0gdXJpLmNsb25lKCkubWFrZVVuaXF1ZSgpOwogIHRoaXMucG9zdERhdGFfID0gbnVsbDsKICB0aGlzLmRlY29kZUNodW5rc18gPSBkZWNvZGVDaHVua3M7CiAgb3B0X25vQ2xvc2UgJiYgKHRoaXMuc2VuZENsb3NlXyA9ICExKTsKICB0aGlzLnNlbmRYbWxIdHRwXyhob3N0UHJlZml4KQp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUuc2VuZFhtbEh0dHBfID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCRzZW5kWG1sSHR0cF8kKGhvc3RQcmVmaXgpIHsKICB0aGlzLnJlcXVlc3RTdGFydFRpbWVfID0gZ29vZy5ub3coKTsKICB0aGlzLmVuc3VyZVdhdGNoRG9nVGltZXJfKCk7CiAgdGhpcy5yZXF1ZXN0VXJpXyA9IHRoaXMuYmFzZVVyaV8uY2xvbmUoKTsKICB0aGlzLnJlcXVlc3RVcmlfLnNldFBhcmFtZXRlclZhbHVlcygidCIsIHRoaXMucmV0cnlJZF8pOwogIGlmKHRoaXMuY2hlY2tPbmxpbmVIYW5kbGVyXygpKSB7CiAgICB0aGlzLnhtbEh0dHBDaHVua1N0YXJ0XyA9IDA7CiAgICB2YXIgdXNlU2Vjb25kYXJ5RG9tYWlucyA9IHRoaXMuY2hhbm5lbF8uc2hvdWxkVXNlU2Vjb25kYXJ5RG9tYWlucygpOwogICAgdGhpcy54bWxIdHRwXyA9IHRoaXMuY2hhbm5lbF8uY3JlYXRlWGhySW8odXNlU2Vjb25kYXJ5RG9tYWlucyA/IGhvc3RQcmVmaXggOiBudWxsKTsKICAgIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy54bWxIdHRwXywgZ29vZy5uZXQuRXZlbnRUeXBlLlJFQURZX1NUQVRFX0NIQU5HRSwgdGhpcy54bWxIdHRwSGFuZGxlcl8sICExLCB0aGlzKTsKICAgIHZhciBoZWFkZXJzID0gdGhpcy5leHRyYUhlYWRlcnNfID8gZ29vZy5vYmplY3QuY2xvbmUodGhpcy5leHRyYUhlYWRlcnNfKSA6IHt9OwogICAgdGhpcy5wb3N0RGF0YV8gPyAodGhpcy52ZXJiXyA9ICJQT1NUIiwgaGVhZGVyc1siQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgdGhpcy54bWxIdHRwXy5zZW5kKHRoaXMucmVxdWVzdFVyaV8sIHRoaXMudmVyYl8sIHRoaXMucG9zdERhdGFfLCBoZWFkZXJzKSkgOiAodGhpcy52ZXJiXyA9ICJHRVQiLCB0aGlzLnNlbmRDbG9zZV8gJiYgIWdvb2cudXNlckFnZW50LldFQktJVCAmJiAoaGVhZGVycy5Db25uZWN0aW9uID0gImNsb3NlIiksIHRoaXMueG1sSHR0cF8uc2VuZCh0aGlzLnJlcXVlc3RVcmlfLCB0aGlzLnZlcmJfLCBudWxsLCBoZWFkZXJzKSk7CiAgICB0aGlzLmNoYW5uZWxEZWJ1Z18ueG1sSHR0cENoYW5uZWxSZXF1ZXN0KHRoaXMudmVyYl8sIHRoaXMucmVxdWVzdFVyaV8sIHRoaXMucmlkXywgdGhpcy5yZXRyeUlkXywgdGhpcy5wb3N0RGF0YV8pCiAgfQp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUueG1sSHR0cEhhbmRsZXJfID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCR4bWxIdHRwSGFuZGxlcl8kKGUpIHsKICB2YXIgeG1saHR0cCA9IGUudGFyZ2V0OwogIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLm9uU3RhcnRFeGVjdXRpb24oKTsKICB0cnkgewogICAgaWYoeG1saHR0cCA9PSB0aGlzLnhtbEh0dHBfKSB7CiAgICAgIHRoaXMub25YbWxIdHRwUmVhZHlTdGF0ZUNoYW5nZWRfKCkKICAgIH1lbHNlIHsKICAgICAgdGhpcy5jaGFubmVsRGVidWdfLndhcm5pbmcoIkNhbGxlZCBiYWNrIHdpdGggYW4gdW5leHBlY3RlZCB4bWxodHRwIikKICAgIH0KICB9Y2F0Y2goZXgpIHsKICAgIHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiRmFpbGVkIGNhbGwgdG8gT25YbWxIdHRwUmVhZHlTdGF0ZUNoYW5nZWRfIiksIHRoaXMueG1sSHR0cF8gJiYgdGhpcy54bWxIdHRwXy5nZXRSZXNwb25zZVRleHQoKSA/IHRoaXMuY2hhbm5lbERlYnVnXy5kdW1wRXhjZXB0aW9uKGV4LCAiUmVzcG9uc2VUZXh0OiAiICsgdGhpcy54bWxIdHRwXy5nZXRSZXNwb25zZVRleHQoKSkgOiB0aGlzLmNoYW5uZWxEZWJ1Z18uZHVtcEV4Y2VwdGlvbihleCwgIk5vIHJlc3BvbnNlIHRleHQiKQogIH1maW5hbGx5IHsKICAgIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLm9uRW5kRXhlY3V0aW9uKCkKICB9Cn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5vblhtbEh0dHBSZWFkeVN0YXRlQ2hhbmdlZF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJG9uWG1sSHR0cFJlYWR5U3RhdGVDaGFuZ2VkXyQoKSB7CiAgdmFyIHJlYWR5U3RhdGUgPSB0aGlzLnhtbEh0dHBfLmdldFJlYWR5U3RhdGUoKTsKICBpZighZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3Quc3VwcG9ydHNYaHJTdHJlYW1pbmcoKSB8fCBnb29nLnVzZXJBZ2VudC5XRUJLSVQgJiYgIWdvb2cudXNlckFnZW50LmlzVmVyc2lvbihnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5NSU5fV0VCS0lUX0ZPUl9JTlRFUkFDVElWRV8pKSB7CiAgICBpZihyZWFkeVN0YXRlIDwgZ29vZy5uZXQuWG1sSHR0cC5SZWFkeVN0YXRlLkNPTVBMRVRFKSB7CiAgICAgIHJldHVybgogICAgfQogIH1lbHNlIHsKICAgIGlmKHJlYWR5U3RhdGUgPCBnb29nLm5ldC5YbWxIdHRwLlJlYWR5U3RhdGUuSU5URVJBQ1RJVkUgfHwgcmVhZHlTdGF0ZSA9PSBnb29nLm5ldC5YbWxIdHRwLlJlYWR5U3RhdGUuSU5URVJBQ1RJVkUgJiYgIWdvb2cudXNlckFnZW50Lk9QRVJBICYmICF0aGlzLnhtbEh0dHBfLmdldFJlc3BvbnNlVGV4dCgpKSB7CiAgICAgIHJldHVybgogICAgfQogIH0KICB0aGlzLmNhbmNlbFdhdGNoRG9nVGltZXJfKCk7CiAgdmFyIHN0YXR1cyA9IHRoaXMueG1sSHR0cF8uZ2V0U3RhdHVzKCk7CiAgdGhpcy5sYXN0U3RhdHVzQ29kZV8gPSBzdGF0dXM7CiAgdmFyIHJlc3BvbnNlVGV4dCA9IHRoaXMueG1sSHR0cF8uZ2V0UmVzcG9uc2VUZXh0KCk7CiAgcmVzcG9uc2VUZXh0IHx8IHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiTm8gcmVzcG9uc2UgdGV4dCBmb3IgdXJpICIgKyB0aGlzLnJlcXVlc3RVcmlfICsgIiBzdGF0dXMgIiArIHN0YXR1cyk7CiAgdGhpcy5zdWNjZXNzZnVsXyA9IDIwMCA9PSBzdGF0dXM7CiAgdGhpcy5jaGFubmVsRGVidWdfLnhtbEh0dHBDaGFubmVsUmVzcG9uc2VNZXRhRGF0YSh0aGlzLnZlcmJfLCB0aGlzLnJlcXVlc3RVcmlfLCB0aGlzLnJpZF8sIHRoaXMucmV0cnlJZF8sIHJlYWR5U3RhdGUsIHN0YXR1cyk7CiAgaWYodGhpcy5zdWNjZXNzZnVsXykgewogICAgaWYocmVhZHlTdGF0ZSA9PSBnb29nLm5ldC5YbWxIdHRwLlJlYWR5U3RhdGUuQ09NUExFVEUgJiYgdGhpcy5jbGVhbnVwXygpLCB0aGlzLmRlY29kZUNodW5rc18gPyAodGhpcy5kZWNvZGVOZXh0Q2h1bmtzXyhyZWFkeVN0YXRlLCByZXNwb25zZVRleHQpLCBnb29nLnVzZXJBZ2VudC5PUEVSQSAmJiByZWFkeVN0YXRlID09IGdvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZS5JTlRFUkFDVElWRSAmJiB0aGlzLnN0YXJ0UG9sbGluZ18oKSkgOiAodGhpcy5jaGFubmVsRGVidWdfLnhtbEh0dHBDaGFubmVsUmVzcG9uc2VUZXh0KHRoaXMucmlkXywgcmVzcG9uc2VUZXh0LCBudWxsKSwgdGhpcy5zYWZlT25SZXF1ZXN0RGF0YV8ocmVzcG9uc2VUZXh0KSksIHRoaXMuc3VjY2Vzc2Z1bF8gJiYgIXRoaXMuY2FuY2VsbGVkXykgewogICAgICBpZihyZWFkeVN0YXRlID09IGdvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZS5DT01QTEVURSkgewogICAgICAgIHRoaXMuY2hhbm5lbF8ub25SZXF1ZXN0Q29tcGxldGUodGhpcykKICAgICAgfWVsc2UgewogICAgICAgIHRoaXMuc3VjY2Vzc2Z1bF8gPSAhMSwgdGhpcy5lbnN1cmVXYXRjaERvZ1RpbWVyXygpCiAgICAgIH0KICAgIH0KICB9ZWxzZSB7CiAgICA0MDAgPT0gc3RhdHVzICYmIDAgPCByZXNwb25zZVRleHQuaW5kZXhPZigiVW5rbm93biBTSUQiKSA/ICh0aGlzLmxhc3RFcnJvcl8gPSBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5VTktOT1dOX1NFU1NJT05fSUQsIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLm5vdGlmeVN0YXRFdmVudChnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0LlJFUVVFU1RfVU5LTk9XTl9TRVNTSU9OX0lEKSkgOiAodGhpcy5sYXN0RXJyb3JfID0gZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QuRXJyb3IuU1RBVFVTLCBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5ub3RpZnlTdGF0RXZlbnQoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdC5SRVFVRVNUX0JBRF9TVEFUVVMpKSwgdGhpcy5jaGFubmVsRGVidWdfLnhtbEh0dHBDaGFubmVsUmVzcG9uc2VUZXh0KHRoaXMucmlkXywgcmVzcG9uc2VUZXh0KSwgdGhpcy5jbGVhbnVwXygpLCB0aGlzLmRpc3BhdGNoRmFpbHVyZV8oKQogIH0KfTsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLmRlY29kZU5leHRDaHVua3NfID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCRkZWNvZGVOZXh0Q2h1bmtzXyQocmVhZHlTdGF0ZSwgcmVzcG9uc2VUZXh0KSB7CiAgZm9yKHZhciBkZWNvZGVOZXh0Q2h1bmtzU3VjY2Vzc2Z1bCA9ICEwOyF0aGlzLmNhbmNlbGxlZF8gJiYgdGhpcy54bWxIdHRwQ2h1bmtTdGFydF8gPCByZXNwb25zZVRleHQubGVuZ3RoOykgewogICAgdmFyIGNodW5rVGV4dCA9IHRoaXMuZ2V0TmV4dENodW5rXyhyZXNwb25zZVRleHQpOwogICAgaWYoY2h1bmtUZXh0ID09IGdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LklOQ09NUExFVEVfQ0hVTktfKSB7CiAgICAgIHJlYWR5U3RhdGUgPT0gZ29vZy5uZXQuWG1sSHR0cC5SZWFkeVN0YXRlLkNPTVBMRVRFICYmICh0aGlzLmxhc3RFcnJvcl8gPSBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5CQURfREFUQSwgZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5U3RhdEV2ZW50KGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXQuUkVRVUVTVF9JTkNPTVBMRVRFX0RBVEEpLCBkZWNvZGVOZXh0Q2h1bmtzU3VjY2Vzc2Z1bCA9ICExKTsKICAgICAgdGhpcy5jaGFubmVsRGVidWdfLnhtbEh0dHBDaGFubmVsUmVzcG9uc2VUZXh0KHRoaXMucmlkXywgbnVsbCwgIltJbmNvbXBsZXRlIFJlc3BvbnNlXSIpOwogICAgICBicmVhawogICAgfWVsc2UgewogICAgICBpZihjaHVua1RleHQgPT0gZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QuSU5WQUxJRF9DSFVOS18pIHsKICAgICAgICB0aGlzLmxhc3RFcnJvcl8gPSBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5CQURfREFUQTsKICAgICAgICBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5ub3RpZnlTdGF0RXZlbnQoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdC5SRVFVRVNUX0JBRF9EQVRBKTsKICAgICAgICB0aGlzLmNoYW5uZWxEZWJ1Z18ueG1sSHR0cENoYW5uZWxSZXNwb25zZVRleHQodGhpcy5yaWRfLCByZXNwb25zZVRleHQsICJbSW52YWxpZCBDaHVua10iKTsKICAgICAgICBkZWNvZGVOZXh0Q2h1bmtzU3VjY2Vzc2Z1bCA9ICExOwogICAgICAgIGJyZWFrCiAgICAgIH1lbHNlIHsKICAgICAgICB0aGlzLmNoYW5uZWxEZWJ1Z18ueG1sSHR0cENoYW5uZWxSZXNwb25zZVRleHQodGhpcy5yaWRfLCBjaHVua1RleHQsIG51bGwpLCB0aGlzLnNhZmVPblJlcXVlc3REYXRhXyhjaHVua1RleHQpCiAgICAgIH0KICAgIH0KICB9CiAgcmVhZHlTdGF0ZSA9PSBnb29nLm5ldC5YbWxIdHRwLlJlYWR5U3RhdGUuQ09NUExFVEUgJiYgMCA9PSByZXNwb25zZVRleHQubGVuZ3RoICYmICh0aGlzLmxhc3RFcnJvcl8gPSBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5OT19EQVRBLCBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5ub3RpZnlTdGF0RXZlbnQoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdC5SRVFVRVNUX05PX0RBVEEpLCBkZWNvZGVOZXh0Q2h1bmtzU3VjY2Vzc2Z1bCA9ICExKTsKICB0aGlzLnN1Y2Nlc3NmdWxfID0gdGhpcy5zdWNjZXNzZnVsXyAmJiBkZWNvZGVOZXh0Q2h1bmtzU3VjY2Vzc2Z1bDsKICBkZWNvZGVOZXh0Q2h1bmtzU3VjY2Vzc2Z1bCB8fCAodGhpcy5jaGFubmVsRGVidWdfLnhtbEh0dHBDaGFubmVsUmVzcG9uc2VUZXh0KHRoaXMucmlkXywgcmVzcG9uc2VUZXh0LCAiW0ludmFsaWQgQ2h1bmtlZCBSZXNwb25zZV0iKSwgdGhpcy5jbGVhbnVwXygpLCB0aGlzLmRpc3BhdGNoRmFpbHVyZV8oKSkKfTsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLnBvbGxSZXNwb25zZV8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJHBvbGxSZXNwb25zZV8kKCkgewogIHZhciByZWFkeVN0YXRlID0gdGhpcy54bWxIdHRwXy5nZXRSZWFkeVN0YXRlKCksIHJlc3BvbnNlVGV4dCA9IHRoaXMueG1sSHR0cF8uZ2V0UmVzcG9uc2VUZXh0KCk7CiAgdGhpcy54bWxIdHRwQ2h1bmtTdGFydF8gPCByZXNwb25zZVRleHQubGVuZ3RoICYmICh0aGlzLmNhbmNlbFdhdGNoRG9nVGltZXJfKCksIHRoaXMuZGVjb2RlTmV4dENodW5rc18ocmVhZHlTdGF0ZSwgcmVzcG9uc2VUZXh0KSwgdGhpcy5zdWNjZXNzZnVsXyAmJiByZWFkeVN0YXRlICE9IGdvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZS5DT01QTEVURSAmJiB0aGlzLmVuc3VyZVdhdGNoRG9nVGltZXJfKCkpCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5zdGFydFBvbGxpbmdfID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCRzdGFydFBvbGxpbmdfJCgpIHsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMucG9sbGluZ1RpbWVyXywgZ29vZy5UaW1lci5USUNLLCB0aGlzLnBvbGxSZXNwb25zZV8pOwogIHRoaXMucG9sbGluZ1RpbWVyXy5zdGFydCgpCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5jaGVja09ubGluZUhhbmRsZXJfID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCRjaGVja09ubGluZUhhbmRsZXJfJCgpIHsKICBpZighdGhpcy5vbmxpbmVIYW5kbGVyXykgewogICAgcmV0dXJuITAKICB9CiAgaWYodGhpcy5vbmxpbmVIYW5kbGVyXy5pc09ubGluZSgpKSB7CiAgICByZXR1cm4gdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLm9ubGluZUhhbmRsZXJfLCBnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLkV2ZW50VHlwZS5PRkZMSU5FLCB0aGlzLmNhbmNlbFJlcXVlc3RBc0Jyb3dzZXJJc09mZmxpbmVfKSwgITAKICB9CiAgdGhpcy5jYW5jZWxSZXF1ZXN0QXNCcm93c2VySXNPZmZsaW5lXygpOwogIHJldHVybiExCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5jYW5jZWxSZXF1ZXN0QXNCcm93c2VySXNPZmZsaW5lXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsUmVxdWVzdCQkY2FuY2VsUmVxdWVzdEFzQnJvd3NlcklzT2ZmbGluZV8kKCkgewogIHRoaXMuc3VjY2Vzc2Z1bF8gJiYgdGhpcy5jaGFubmVsRGVidWdfLnNldmVyZSgiUmVjZWl2ZWQgYnJvd3NlciBvZmZsaW5lIGV2ZW50IGV2ZW4gdGhvdWdoIHJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpOwogIHRoaXMuY2hhbm5lbERlYnVnXy5icm93c2VyT2ZmbGluZVJlc3BvbnNlKHRoaXMucmVxdWVzdFVyaV8pOwogIHRoaXMuY2xlYW51cF8oKTsKICB0aGlzLmxhc3RFcnJvcl8gPSBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5CUk9XU0VSX09GRkxJTkU7CiAgZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5U3RhdEV2ZW50KGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXQuQlJPV1NFUl9PRkZMSU5FKTsKICB0aGlzLmRpc3BhdGNoRmFpbHVyZV8oKQp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUuZ2V0TmV4dENodW5rXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsUmVxdWVzdCQkZ2V0TmV4dENodW5rXyQocmVzcG9uc2VUZXh0KSB7CiAgdmFyIHNpemVTdGFydEluZGV4ID0gdGhpcy54bWxIdHRwQ2h1bmtTdGFydF8sIHNpemVFbmRJbmRleCA9IHJlc3BvbnNlVGV4dC5pbmRleE9mKCJcbiIsIHNpemVTdGFydEluZGV4KTsKICBpZigtMSA9PSBzaXplRW5kSW5kZXgpIHsKICAgIHJldHVybiBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5JTkNPTVBMRVRFX0NIVU5LXwogIH0KICB2YXIgc2l6ZUFzU3RyaW5nID0gcmVzcG9uc2VUZXh0LnN1YnN0cmluZyhzaXplU3RhcnRJbmRleCwgc2l6ZUVuZEluZGV4KSwgc2l6ZSA9IE51bWJlcihzaXplQXNTdHJpbmcpOwogIGlmKGlzTmFOKHNpemUpKSB7CiAgICByZXR1cm4gZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QuSU5WQUxJRF9DSFVOS18KICB9CiAgdmFyIGNodW5rU3RhcnRJbmRleCA9IHNpemVFbmRJbmRleCArIDE7CiAgaWYoY2h1bmtTdGFydEluZGV4ICsgc2l6ZSA+IHJlc3BvbnNlVGV4dC5sZW5ndGgpIHsKICAgIHJldHVybiBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5JTkNPTVBMRVRFX0NIVU5LXwogIH0KICB2YXIgY2h1bmtUZXh0ID0gcmVzcG9uc2VUZXh0LnN1YnN0cihjaHVua1N0YXJ0SW5kZXgsIHNpemUpOwogIHRoaXMueG1sSHR0cENodW5rU3RhcnRfID0gY2h1bmtTdGFydEluZGV4ICsgc2l6ZTsKICByZXR1cm4gY2h1bmtUZXh0Cn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS50cmlkZW50R2V0ID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCR0cmlkZW50R2V0JCh1cmksIHVzaW5nU2Vjb25kYXJ5RG9tYWluKSB7CiAgdGhpcy50eXBlXyA9IGdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LlR5cGVfLlRSSURFTlQ7CiAgdGhpcy5iYXNlVXJpXyA9IHVyaS5jbG9uZSgpLm1ha2VVbmlxdWUoKTsKICB0aGlzLnRyaWRlbnRHZXRfKHVzaW5nU2Vjb25kYXJ5RG9tYWluKQp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUudHJpZGVudEdldF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJHRyaWRlbnRHZXRfJCh1c2luZ1NlY29uZGFyeURvbWFpbikgewogIHRoaXMucmVxdWVzdFN0YXJ0VGltZV8gPSBnb29nLm5vdygpOwogIHRoaXMuZW5zdXJlV2F0Y2hEb2dUaW1lcl8oKTsKICB2YXIgaG9zdG5hbWUgPSB1c2luZ1NlY29uZGFyeURvbWFpbiA/IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSA6ICIiOwogIHRoaXMucmVxdWVzdFVyaV8gPSB0aGlzLmJhc2VVcmlfLmNsb25lKCk7CiAgdGhpcy5yZXF1ZXN0VXJpXy5zZXRQYXJhbWV0ZXJWYWx1ZSgiRE9NQUlOIiwgaG9zdG5hbWUpOwogIHRoaXMucmVxdWVzdFVyaV8uc2V0UGFyYW1ldGVyVmFsdWUoInQiLCB0aGlzLnJldHJ5SWRfKTsKICBpZih0aGlzLmNoZWNrT25saW5lSGFuZGxlcl8oKSkgewogICAgdGhpcy50cmlkZW50XyA9IG5ldyBBY3RpdmVYT2JqZWN0KCJodG1sZmlsZSIpOwogICAgdmFyIGJvZHkgPSAiPGh0bWw+PGJvZHk+IjsKICAgIHVzaW5nU2Vjb25kYXJ5RG9tYWluICYmIChib2R5ICs9ICc8c2NyaXB0PmRvY3VtZW50LmRvbWFpbj0iJyArIGhvc3RuYW1lICsgJyI8XC9zY3JpcHQ+Jyk7CiAgICBib2R5ICs9ICI8L2JvZHk+PC9odG1sPiI7CiAgICB0aGlzLnRyaWRlbnRfLm9wZW4oKTsKICAgIHRoaXMudHJpZGVudF8ud3JpdGUoYm9keSk7CiAgICB0aGlzLnRyaWRlbnRfLmNsb3NlKCk7CiAgICB0aGlzLnRyaWRlbnRfLnBhcmVudFdpbmRvdy5tID0gZ29vZy5iaW5kKHRoaXMub25UcmlkZW50UnBjTWVzc2FnZV8sIHRoaXMpOwogICAgdGhpcy50cmlkZW50Xy5wYXJlbnRXaW5kb3cuZCA9IGdvb2cuYmluZCh0aGlzLm9uVHJpZGVudERvbmVfLCB0aGlzLCAhMCk7CiAgICB0aGlzLnRyaWRlbnRfLnBhcmVudFdpbmRvdy5ycGNDbG9zZSA9IGdvb2cuYmluZCh0aGlzLm9uVHJpZGVudERvbmVfLCB0aGlzLCAhMSk7CiAgICB2YXIgZGl2ID0gdGhpcy50cmlkZW50Xy5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHRoaXMudHJpZGVudF8ucGFyZW50V2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKICAgIGRpdi5pbm5lckhUTUwgPSAnPGlmcmFtZSBzcmM9IicgKyB0aGlzLnJlcXVlc3RVcmlfICsgJyI+PC9pZnJhbWU+JzsKICAgIHRoaXMuY2hhbm5lbERlYnVnXy50cmlkZW50Q2hhbm5lbFJlcXVlc3QoIkdFVCIsIHRoaXMucmVxdWVzdFVyaV8sIHRoaXMucmlkXywgdGhpcy5yZXRyeUlkXykKICB9Cn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5vblRyaWRlbnRScGNNZXNzYWdlXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsUmVxdWVzdCQkb25UcmlkZW50UnBjTWVzc2FnZV8kKG1zZykgewogIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnNldFRpbWVvdXQoZ29vZy5iaW5kKHRoaXMub25UcmlkZW50UnBjTWVzc2FnZUFzeW5jXywgdGhpcywgbXNnKSwgMCkKfTsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLm9uVHJpZGVudFJwY01lc3NhZ2VBc3luY18gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJG9uVHJpZGVudFJwY01lc3NhZ2VBc3luY18kKG1zZykgewogIHRoaXMuY2FuY2VsbGVkXyB8fCAodGhpcy5jaGFubmVsRGVidWdfLnRyaWRlbnRDaGFubmVsUmVzcG9uc2VUZXh0KHRoaXMucmlkXywgbXNnKSwgdGhpcy5jYW5jZWxXYXRjaERvZ1RpbWVyXygpLCB0aGlzLnNhZmVPblJlcXVlc3REYXRhXyhtc2cpLCB0aGlzLmVuc3VyZVdhdGNoRG9nVGltZXJfKCkpCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5vblRyaWRlbnREb25lXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsUmVxdWVzdCQkb25UcmlkZW50RG9uZV8kKHN1Y2Nlc3NmdWwpIHsKICBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zZXRUaW1lb3V0KGdvb2cuYmluZCh0aGlzLm9uVHJpZGVudERvbmVBc3luY18sIHRoaXMsIHN1Y2Nlc3NmdWwpLCAwKQp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUub25UcmlkZW50RG9uZUFzeW5jXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsUmVxdWVzdCQkb25UcmlkZW50RG9uZUFzeW5jXyQoc3VjY2Vzc2Z1bCkgewogIHRoaXMuY2FuY2VsbGVkXyB8fCAodGhpcy5jaGFubmVsRGVidWdfLnRyaWRlbnRDaGFubmVsUmVzcG9uc2VEb25lKHRoaXMucmlkXywgc3VjY2Vzc2Z1bCksIHRoaXMuY2xlYW51cF8oKSwgdGhpcy5zdWNjZXNzZnVsXyA9IHN1Y2Nlc3NmdWwsIHRoaXMuY2hhbm5lbF8ub25SZXF1ZXN0Q29tcGxldGUodGhpcykpCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5zZW5kVXNpbmdJbWdUYWcgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJHNlbmRVc2luZ0ltZ1RhZyQodXJpKSB7CiAgdGhpcy50eXBlXyA9IGdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LlR5cGVfLklNRzsKICB0aGlzLmJhc2VVcmlfID0gdXJpLmNsb25lKCkubWFrZVVuaXF1ZSgpOwogIHRoaXMuaW1nVGFnR2V0XygpCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5pbWdUYWdHZXRfID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCRpbWdUYWdHZXRfJCgpIHsKICB2YXIgZWx0SW1nID0gbmV3IEltYWdlOwogIGVsdEltZy5zcmMgPSB0aGlzLmJhc2VVcmlfOwogIHRoaXMucmVxdWVzdFN0YXJ0VGltZV8gPSBnb29nLm5vdygpOwogIHRoaXMuZW5zdXJlV2F0Y2hEb2dUaW1lcl8oKQp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCRjYW5jZWwkKCkgewogIHRoaXMuY2FuY2VsbGVkXyA9ICEwOwogIHRoaXMuY2xlYW51cF8oKQp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUuZW5zdXJlV2F0Y2hEb2dUaW1lcl8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJGVuc3VyZVdhdGNoRG9nVGltZXJfJCgpIHsKICB0aGlzLndhdGNoRG9nVGltZW91dFRpbWVfID0gZ29vZy5ub3coKSArIHRoaXMudGltZW91dF87CiAgdGhpcy5zdGFydFdhdGNoRG9nVGltZXJfKHRoaXMudGltZW91dF8pCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5zdGFydFdhdGNoRG9nVGltZXJfID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCRzdGFydFdhdGNoRG9nVGltZXJfJCh0aW1lKSB7CiAgaWYobnVsbCAhPSB0aGlzLndhdGNoRG9nVGltZXJJZF8pIHsKICAgIHRocm93IEVycm9yKCJXYXRjaERvZyB0aW1lciBub3QgbnVsbCIpOwogIH0KICB0aGlzLndhdGNoRG9nVGltZXJJZF8gPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zZXRUaW1lb3V0KGdvb2cuYmluZCh0aGlzLm9uV2F0Y2hEb2dUaW1lb3V0XywgdGhpcyksIHRpbWUpCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5jYW5jZWxXYXRjaERvZ1RpbWVyXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsUmVxdWVzdCQkY2FuY2VsV2F0Y2hEb2dUaW1lcl8kKCkgewogIHRoaXMud2F0Y2hEb2dUaW1lcklkXyAmJiAoZ29vZy5nbG9iYWwuY2xlYXJUaW1lb3V0KHRoaXMud2F0Y2hEb2dUaW1lcklkXyksIHRoaXMud2F0Y2hEb2dUaW1lcklkXyA9IG51bGwpCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5vbldhdGNoRG9nVGltZW91dF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJG9uV2F0Y2hEb2dUaW1lb3V0XyQoKSB7CiAgdGhpcy53YXRjaERvZ1RpbWVySWRfID0gbnVsbDsKICB2YXIgbm93ID0gZ29vZy5ub3coKTsKICAwIDw9IG5vdyAtIHRoaXMud2F0Y2hEb2dUaW1lb3V0VGltZV8gPyB0aGlzLmhhbmRsZVRpbWVvdXRfKCkgOiAodGhpcy5jaGFubmVsRGVidWdfLndhcm5pbmcoIldhdGNoRG9nIHRpbWVyIGNhbGxlZCB0b28gZWFybHkiKSwgdGhpcy5zdGFydFdhdGNoRG9nVGltZXJfKHRoaXMud2F0Y2hEb2dUaW1lb3V0VGltZV8gLSBub3cpKQp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUuaGFuZGxlVGltZW91dF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJGhhbmRsZVRpbWVvdXRfJCgpIHsKICB0aGlzLnN1Y2Nlc3NmdWxfICYmIHRoaXMuY2hhbm5lbERlYnVnXy5zZXZlcmUoIlJlY2VpdmVkIHdhdGNoZG9nIHRpbWVvdXQgZXZlbiB0aG91Z2ggcmVxdWVzdCBsb2FkZWQgc3VjY2Vzc2Z1bGx5Iik7CiAgdGhpcy5jaGFubmVsRGVidWdfLnRpbWVvdXRSZXNwb25zZSh0aGlzLnJlcXVlc3RVcmlfKTsKICB0aGlzLmNsZWFudXBfKCk7CiAgdGhpcy5sYXN0RXJyb3JfID0gZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QuRXJyb3IuVElNRU9VVDsKICBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5ub3RpZnlTdGF0RXZlbnQoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdC5SRVFVRVNUX1RJTUVPVVQpOwogIHRoaXMuZGlzcGF0Y2hGYWlsdXJlXygpCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5kaXNwYXRjaEZhaWx1cmVfID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxSZXF1ZXN0JCRkaXNwYXRjaEZhaWx1cmVfJCgpIHsKICBpZighdGhpcy5jaGFubmVsXy5pc0Nsb3NlZCgpICYmICF0aGlzLmNhbmNlbGxlZF8pIHsKICAgIHRoaXMuY2hhbm5lbF8ub25SZXF1ZXN0Q29tcGxldGUodGhpcykKICB9Cn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5jbGVhbnVwXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsUmVxdWVzdCQkY2xlYW51cF8kKCkgewogIHRoaXMuY2FuY2VsV2F0Y2hEb2dUaW1lcl8oKTsKICB0aGlzLnBvbGxpbmdUaW1lcl8uc3RvcCgpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5yZW1vdmVBbGwoKTsKICBpZih0aGlzLnhtbEh0dHBfKSB7CiAgICB2YXIgeG1saHR0cCA9IHRoaXMueG1sSHR0cF87CiAgICB0aGlzLnhtbEh0dHBfID0gbnVsbDsKICAgIHhtbGh0dHAuYWJvcnQoKQogIH0KICB0aGlzLnRyaWRlbnRfICYmICh0aGlzLnRyaWRlbnRfID0gbnVsbCk7CiAgdGhpcy5vbmxpbmVIYW5kbGVyXyA9IG51bGwKfTsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLmdldFN1Y2Nlc3MgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJGdldFN1Y2Nlc3MkKCkgewogIHJldHVybiB0aGlzLnN1Y2Nlc3NmdWxfCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5nZXRMYXN0RXJyb3IgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJGdldExhc3RFcnJvciQoKSB7CiAgcmV0dXJuIHRoaXMubGFzdEVycm9yXwp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUuZ2V0TGFzdFN0YXR1c0NvZGUgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJGdldExhc3RTdGF0dXNDb2RlJCgpIHsKICByZXR1cm4gdGhpcy5sYXN0U3RhdHVzQ29kZV8KfTsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLmdldFNlc3Npb25JZCA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsUmVxdWVzdCQkZ2V0U2Vzc2lvbklkJCgpIHsKICByZXR1cm4gdGhpcy5zaWRfCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5nZXRSZXF1ZXN0SWQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJGdldFJlcXVlc3RJZCQoKSB7CiAgcmV0dXJuIHRoaXMucmlkXwp9Owpnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5wcm90b3R5cGUuZ2V0UG9zdERhdGEgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJGdldFBvc3REYXRhJCgpIHsKICByZXR1cm4gdGhpcy5wb3N0RGF0YV8KfTsKZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QucHJvdG90eXBlLmdldFJlcXVlc3RTdGFydFRpbWUgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJGdldFJlcXVlc3RTdGFydFRpbWUkKCkgewogIHJldHVybiB0aGlzLnJlcXVlc3RTdGFydFRpbWVfCn07Cmdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LnByb3RvdHlwZS5zYWZlT25SZXF1ZXN0RGF0YV8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbFJlcXVlc3QkJHNhZmVPblJlcXVlc3REYXRhXyQoZGF0YSkgewogIHRyeSB7CiAgICB0aGlzLmNoYW5uZWxfLm9uUmVxdWVzdERhdGEodGhpcywgZGF0YSkKICB9Y2F0Y2goZSkgewogICAgdGhpcy5jaGFubmVsRGVidWdfLmR1bXBFeGNlcHRpb24oZSwgIkVycm9yIGluIGh0dHByZXF1ZXN0IGNhbGxiYWNrIikKICB9Cn07Cmdvb2cubmV0LkNoYW5uZWxEZWJ1ZyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsRGVidWckKCkgewogIHRoaXMubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigiZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwiKQp9Owpnb29nLm5ldC5DaGFubmVsRGVidWcucHJvdG90eXBlLmdldExvZ2dlciA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsRGVidWckJGdldExvZ2dlciQoKSB7CiAgcmV0dXJuIHRoaXMubG9nZ2VyXwp9Owpnb29nLm5ldC5DaGFubmVsRGVidWcucHJvdG90eXBlLmJyb3dzZXJPZmZsaW5lUmVzcG9uc2UgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbERlYnVnJCRicm93c2VyT2ZmbGluZVJlc3BvbnNlJCh1cmwpIHsKICB0aGlzLmluZm8oIkJST1dTRVJfT0ZGTElORTogIiArIHVybCkKfTsKZ29vZy5uZXQuQ2hhbm5lbERlYnVnLnByb3RvdHlwZS54bWxIdHRwQ2hhbm5lbFJlcXVlc3QgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbERlYnVnJCR4bWxIdHRwQ2hhbm5lbFJlcXVlc3QkKHZlcmIsIHVyaSwgaWQsIGF0dGVtcHQsIHBvc3REYXRhKSB7CiAgdGhpcy5pbmZvKCJYTUxIVFRQIFJFUSAoIiArIGlkICsgIikgW2F0dGVtcHQgIiArIGF0dGVtcHQgKyAiXTogIiArIHZlcmIgKyAiXG4iICsgdXJpICsgIlxuIiArIHRoaXMubWF5YmVSZWRhY3RQb3N0RGF0YV8ocG9zdERhdGEpKQp9Owpnb29nLm5ldC5DaGFubmVsRGVidWcucHJvdG90eXBlLnhtbEh0dHBDaGFubmVsUmVzcG9uc2VNZXRhRGF0YSA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsRGVidWckJHhtbEh0dHBDaGFubmVsUmVzcG9uc2VNZXRhRGF0YSQodmVyYiwgdXJpLCBpZCwgYXR0ZW1wdCwgcmVhZHlTdGF0ZSwgc3RhdHVzQ29kZSkgewogIHRoaXMuaW5mbygiWE1MSFRUUCBSRVNQICgiICsgaWQgKyAiKSBbIGF0dGVtcHQgIiArIGF0dGVtcHQgKyAiXTogIiArIHZlcmIgKyAiXG4iICsgdXJpICsgIlxuIiArIHJlYWR5U3RhdGUgKyAiICIgKyBzdGF0dXNDb2RlKQp9Owpnb29nLm5ldC5DaGFubmVsRGVidWcucHJvdG90eXBlLnhtbEh0dHBDaGFubmVsUmVzcG9uc2VUZXh0ID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxEZWJ1ZyQkeG1sSHR0cENoYW5uZWxSZXNwb25zZVRleHQkKGlkLCByZXNwb25zZVRleHQsIG9wdF9kZXNjKSB7CiAgdGhpcy5pbmZvKCJYTUxIVFRQIFRFWFQgKCIgKyBpZCArICIpOiAiICsgdGhpcy5yZWRhY3RSZXNwb25zZV8ocmVzcG9uc2VUZXh0KSArIChvcHRfZGVzYyA/ICIgIiArIG9wdF9kZXNjIDogIiIpKQp9Owpnb29nLm5ldC5DaGFubmVsRGVidWcucHJvdG90eXBlLnRyaWRlbnRDaGFubmVsUmVxdWVzdCA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsRGVidWckJHRyaWRlbnRDaGFubmVsUmVxdWVzdCQodmVyYiwgdXJpLCBpZCwgYXR0ZW1wdCkgewogIHRoaXMuaW5mbygiVFJJREVOVCBSRVEgKCIgKyBpZCArICIpIFsgYXR0ZW1wdCAiICsgYXR0ZW1wdCArICJdOiAiICsgdmVyYiArICJcbiIgKyB1cmkpCn07Cmdvb2cubmV0LkNoYW5uZWxEZWJ1Zy5wcm90b3R5cGUudHJpZGVudENoYW5uZWxSZXNwb25zZVRleHQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbERlYnVnJCR0cmlkZW50Q2hhbm5lbFJlc3BvbnNlVGV4dCQoaWQsIHJlc3BvbnNlVGV4dCkgewogIHRoaXMuaW5mbygiVFJJREVOVCBURVhUICgiICsgaWQgKyAiKTogIiArIHRoaXMucmVkYWN0UmVzcG9uc2VfKHJlc3BvbnNlVGV4dCkpCn07Cmdvb2cubmV0LkNoYW5uZWxEZWJ1Zy5wcm90b3R5cGUudHJpZGVudENoYW5uZWxSZXNwb25zZURvbmUgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbERlYnVnJCR0cmlkZW50Q2hhbm5lbFJlc3BvbnNlRG9uZSQoaWQsIHN1Y2Nlc3NmdWwpIHsKICB0aGlzLmluZm8oIlRSSURFTlQgVEVYVCAoIiArIGlkICsgIik6ICIgKyBzdWNjZXNzZnVsID8gInN1Y2Nlc3MiIDogImZhaWx1cmUiKQp9Owpnb29nLm5ldC5DaGFubmVsRGVidWcucHJvdG90eXBlLnRpbWVvdXRSZXNwb25zZSA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsRGVidWckJHRpbWVvdXRSZXNwb25zZSQodXJpKSB7CiAgdGhpcy5pbmZvKCJUSU1FT1VUOiAiICsgdXJpKQp9Owpnb29nLm5ldC5DaGFubmVsRGVidWcucHJvdG90eXBlLmRlYnVnID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxEZWJ1ZyQkZGVidWckKHRleHQpIHsKICB0aGlzLmluZm8odGV4dCkKfTsKZ29vZy5uZXQuQ2hhbm5lbERlYnVnLnByb3RvdHlwZS5kdW1wRXhjZXB0aW9uID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxEZWJ1ZyQkZHVtcEV4Y2VwdGlvbiQoZSwgb3B0X21zZykgewogIHRoaXMuc2V2ZXJlKChvcHRfbXNnIHx8ICJFeGNlcHRpb24iKSArIGUpCn07Cmdvb2cubmV0LkNoYW5uZWxEZWJ1Zy5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsRGVidWckJGluZm8kKHRleHQpIHsKICB0aGlzLmxvZ2dlcl8uaW5mbyh0ZXh0KQp9Owpnb29nLm5ldC5DaGFubmVsRGVidWcucHJvdG90eXBlLndhcm5pbmcgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbERlYnVnJCR3YXJuaW5nJCh0ZXh0KSB7CiAgdGhpcy5sb2dnZXJfLndhcm5pbmcodGV4dCkKfTsKZ29vZy5uZXQuQ2hhbm5lbERlYnVnLnByb3RvdHlwZS5zZXZlcmUgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ2hhbm5lbERlYnVnJCRzZXZlcmUkKHRleHQpIHsKICB0aGlzLmxvZ2dlcl8uc2V2ZXJlKHRleHQpCn07Cmdvb2cubmV0LkNoYW5uZWxEZWJ1Zy5wcm90b3R5cGUucmVkYWN0UmVzcG9uc2VfID0gZnVuY3Rpb24gJGdvb2ckbmV0JENoYW5uZWxEZWJ1ZyQkcmVkYWN0UmVzcG9uc2VfJChyZXNwb25zZVRleHQpIHsKICBpZighcmVzcG9uc2VUZXh0IHx8IHJlc3BvbnNlVGV4dCA9PSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5NQUdJQ19SRVNQT05TRV9DT09LSUUpIHsKICAgIHJldHVybiByZXNwb25zZVRleHQKICB9CiAgdHJ5IHsKICAgIGZvcih2YXIgcmVzcG9uc2VBcnJheSA9IGdvb2cuanNvbi51bnNhZmVQYXJzZShyZXNwb25zZVRleHQpLCBpID0gMDtpIDwgcmVzcG9uc2VBcnJheS5sZW5ndGg7aSsrKSB7CiAgICAgIGdvb2cuaXNBcnJheShyZXNwb25zZUFycmF5W2ldKSAmJiB0aGlzLm1heWJlUmVkYWN0QXJyYXlfKHJlc3BvbnNlQXJyYXlbaV0pCiAgICB9CiAgICByZXR1cm4gZ29vZy5qc29uLnNlcmlhbGl6ZShyZXNwb25zZUFycmF5KQogIH1jYXRjaChlKSB7CiAgICByZXR1cm4gdGhpcy5kZWJ1ZygiRXhjZXB0aW9uIHBhcnNpbmcgZXhwZWN0ZWQgSlMgYXJyYXkgLSBwcm9iYWJseSB3YXMgbm90IEpTIiksIHJlc3BvbnNlVGV4dAogIH0KfTsKZ29vZy5uZXQuQ2hhbm5lbERlYnVnLnByb3RvdHlwZS5tYXliZVJlZGFjdEFycmF5XyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsRGVidWckJG1heWJlUmVkYWN0QXJyYXlfJChhcnJheSkgewogIGlmKCEoMiA+IGFycmF5Lmxlbmd0aCkpIHsKICAgIHZhciBkYXRhUGFydCA9IGFycmF5WzFdOwogICAgaWYoZ29vZy5pc0FycmF5KGRhdGFQYXJ0KSAmJiAhKDEgPiBkYXRhUGFydC5sZW5ndGgpKSB7CiAgICAgIHZhciB0eXBlID0gZGF0YVBhcnRbMF07CiAgICAgIGlmKCJub29wIiAhPSB0eXBlICYmICJzdG9wIiAhPSB0eXBlKSB7CiAgICAgICAgZm9yKHZhciBpID0gMTtpIDwgZGF0YVBhcnQubGVuZ3RoO2krKykgewogICAgICAgICAgZGF0YVBhcnRbaV0gPSAiIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKZ29vZy5uZXQuQ2hhbm5lbERlYnVnLnByb3RvdHlwZS5tYXliZVJlZGFjdFBvc3REYXRhXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDaGFubmVsRGVidWckJG1heWJlUmVkYWN0UG9zdERhdGFfJChkYXRhKSB7CiAgaWYoIWRhdGEpIHsKICAgIHJldHVybiBudWxsCiAgfQogIGZvcih2YXIgb3V0ID0gIiIsIHBhcmFtcyA9IGRhdGEuc3BsaXQoIiYiKSwgaSA9IDA7aSA8IHBhcmFtcy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgcGFyYW0gPSBwYXJhbXNbaV0sIGtleVZhbHVlID0gcGFyYW0uc3BsaXQoIj0iKTsKICAgIGlmKDEgPCBrZXlWYWx1ZS5sZW5ndGgpIHsKICAgICAgdmFyIGtleSA9IGtleVZhbHVlWzBdLCB2YWx1ZSA9IGtleVZhbHVlWzFdLCBrZXlQYXJ0cyA9IGtleS5zcGxpdCgiXyIpLCBvdXQgPSAyIDw9IGtleVBhcnRzLmxlbmd0aCAmJiAidHlwZSIgPT0ga2V5UGFydHNbMV0gPyBvdXQgKyAoa2V5ICsgIj0iICsgdmFsdWUgKyAiJiIpIDogb3V0ICsgKGtleSArICI9cmVkYWN0ZWQmIikKICAgIH0KICB9CiAgcmV0dXJuIG91dAp9Owpnb29nLm5ldC50bXBuZXR3b3JrID0ge307Cmdvb2cubmV0LnRtcG5ldHdvcmsuR09PR0xFQ09NX1RJTUVPVVQgPSAxRTQ7Cmdvb2cubmV0LnRtcG5ldHdvcmsudGVzdEdvb2dsZUNvbSA9IGZ1bmN0aW9uICRnb29nJG5ldCR0bXBuZXR3b3JrJHRlc3RHb29nbGVDb20kKGNhbGxiYWNrLCBvcHRfaW1hZ2VVcmkpIHsKICB2YXIgdXJpID0gb3B0X2ltYWdlVXJpOwogIHVyaSB8fCAodXJpID0gbmV3IGdvb2cuVXJpKCIvL3d3dy5nb29nbGUuY29tL2ltYWdlcy9jbGVhcmRvdC5naWYiKSwgdXJpLm1ha2VVbmlxdWUoKSk7CiAgZ29vZy5uZXQudG1wbmV0d29yay50ZXN0TG9hZEltYWdlKHVyaS50b1N0cmluZygpLCBnb29nLm5ldC50bXBuZXR3b3JrLkdPT0dMRUNPTV9USU1FT1VULCBjYWxsYmFjaykKfTsKZ29vZy5uZXQudG1wbmV0d29yay50ZXN0TG9hZEltYWdlV2l0aFJldHJpZXMgPSBmdW5jdGlvbiAkZ29vZyRuZXQkdG1wbmV0d29yayR0ZXN0TG9hZEltYWdlV2l0aFJldHJpZXMkKHVybCwgdGltZW91dCwgY2FsbGJhY2ssIHJldHJpZXMsIG9wdF9wYXVzZUJldHdlZW5SZXRyaWVzTVMpIHsKICB2YXIgY2hhbm5lbERlYnVnID0gbmV3IGdvb2cubmV0LkNoYW5uZWxEZWJ1ZzsKICBjaGFubmVsRGVidWcuZGVidWcoIlRlc3RMb2FkSW1hZ2VXaXRoUmV0cmllczogIiArIG9wdF9wYXVzZUJldHdlZW5SZXRyaWVzTVMpOwogIGlmKDAgPT0gcmV0cmllcykgewogICAgY2FsbGJhY2soITEpCiAgfWVsc2UgewogICAgdmFyIHBhdXNlQmV0d2VlblJldHJpZXMgPSBvcHRfcGF1c2VCZXR3ZWVuUmV0cmllc01TIHx8IDA7CiAgICByZXRyaWVzLS07CiAgICBnb29nLm5ldC50bXBuZXR3b3JrLnRlc3RMb2FkSW1hZ2UodXJsLCB0aW1lb3V0LCBmdW5jdGlvbihzdWNjZWVkZWQpIHsKICAgICAgc3VjY2VlZGVkID8gY2FsbGJhY2soITApIDogZ29vZy5nbG9iYWwuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBnb29nLm5ldC50bXBuZXR3b3JrLnRlc3RMb2FkSW1hZ2VXaXRoUmV0cmllcyh1cmwsIHRpbWVvdXQsIGNhbGxiYWNrLCByZXRyaWVzLCBwYXVzZUJldHdlZW5SZXRyaWVzKQogICAgICB9LCBwYXVzZUJldHdlZW5SZXRyaWVzKQogICAgfSkKICB9Cn07Cmdvb2cubmV0LnRtcG5ldHdvcmsudGVzdExvYWRJbWFnZSA9IGZ1bmN0aW9uICRnb29nJG5ldCR0bXBuZXR3b3JrJHRlc3RMb2FkSW1hZ2UkKHVybCwgdGltZW91dCwgY2FsbGJhY2spIHsKICB2YXIgY2hhbm5lbERlYnVnID0gbmV3IGdvb2cubmV0LkNoYW5uZWxEZWJ1ZzsKICBjaGFubmVsRGVidWcuZGVidWcoIlRlc3RMb2FkSW1hZ2U6IGxvYWRpbmcgIiArIHVybCk7CiAgdmFyIGltZyA9IG5ldyBJbWFnZTsKICBpbWcub25sb2FkID0gZnVuY3Rpb24gJGltZyRvbmxvYWQkKCkgewogICAgdHJ5IHsKICAgICAgY2hhbm5lbERlYnVnLmRlYnVnKCJUZXN0TG9hZEltYWdlOiBsb2FkZWQiKSwgZ29vZy5uZXQudG1wbmV0d29yay5jbGVhckltYWdlQ2FsbGJhY2tzXyhpbWcpLCBjYWxsYmFjayghMCkKICAgIH1jYXRjaChlKSB7CiAgICAgIGNoYW5uZWxEZWJ1Zy5kdW1wRXhjZXB0aW9uKGUpCiAgICB9CiAgfTsKICBpbWcub25lcnJvciA9IGZ1bmN0aW9uICRpbWckb25lcnJvciQoKSB7CiAgICB0cnkgewogICAgICBjaGFubmVsRGVidWcuZGVidWcoIlRlc3RMb2FkSW1hZ2U6IGVycm9yIiksIGdvb2cubmV0LnRtcG5ldHdvcmsuY2xlYXJJbWFnZUNhbGxiYWNrc18oaW1nKSwgY2FsbGJhY2soITEpCiAgICB9Y2F0Y2goZSkgewogICAgICBjaGFubmVsRGVidWcuZHVtcEV4Y2VwdGlvbihlKQogICAgfQogIH07CiAgaW1nLm9uYWJvcnQgPSBmdW5jdGlvbiAkaW1nJG9uYWJvcnQkKCkgewogICAgdHJ5IHsKICAgICAgY2hhbm5lbERlYnVnLmRlYnVnKCJUZXN0TG9hZEltYWdlOiBhYm9ydCIpLCBnb29nLm5ldC50bXBuZXR3b3JrLmNsZWFySW1hZ2VDYWxsYmFja3NfKGltZyksIGNhbGxiYWNrKCExKQogICAgfWNhdGNoKGUpIHsKICAgICAgY2hhbm5lbERlYnVnLmR1bXBFeGNlcHRpb24oZSkKICAgIH0KICB9OwogIGltZy5vbnRpbWVvdXQgPSBmdW5jdGlvbiAkaW1nJG9udGltZW91dCQoKSB7CiAgICB0cnkgewogICAgICBjaGFubmVsRGVidWcuZGVidWcoIlRlc3RMb2FkSW1hZ2U6IHRpbWVvdXQiKSwgZ29vZy5uZXQudG1wbmV0d29yay5jbGVhckltYWdlQ2FsbGJhY2tzXyhpbWcpLCBjYWxsYmFjayghMSkKICAgIH1jYXRjaChlKSB7CiAgICAgIGNoYW5uZWxEZWJ1Zy5kdW1wRXhjZXB0aW9uKGUpCiAgICB9CiAgfTsKICBnb29nLmdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgaWYoaW1nLm9udGltZW91dCkgewogICAgICBpbWcub250aW1lb3V0KCkKICAgIH0KICB9LCB0aW1lb3V0KTsKICBpbWcuc3JjID0gdXJsCn07Cmdvb2cubmV0LnRtcG5ldHdvcmsuY2xlYXJJbWFnZUNhbGxiYWNrc18gPSBmdW5jdGlvbiAkZ29vZyRuZXQkdG1wbmV0d29yayRjbGVhckltYWdlQ2FsbGJhY2tzXyQoaW1nKSB7CiAgaW1nLm9ubG9hZCA9IG51bGw7CiAgaW1nLm9uZXJyb3IgPSBudWxsOwogIGltZy5vbmFib3J0ID0gbnVsbDsKICBpbWcub250aW1lb3V0ID0gbnVsbAp9Owpnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlclRlc3RDaGFubmVsJChjaGFubmVsLCBjaGFubmVsRGVidWcpIHsKICB0aGlzLmNoYW5uZWxfID0gY2hhbm5lbDsKICB0aGlzLmNoYW5uZWxEZWJ1Z18gPSBjaGFubmVsRGVidWcKfTsKZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLnByb3RvdHlwZS5leHRyYUhlYWRlcnNfID0gbnVsbDsKZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLnByb3RvdHlwZS5yZXF1ZXN0XyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUucmVjZWl2ZWRJbnRlcm1lZGlhdGVSZXN1bHRfID0gITE7Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUuc3RhcnRUaW1lXyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUuZmlyc3RUaW1lXyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUubGFzdFRpbWVfID0gbnVsbDsKZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLnByb3RvdHlwZS5wYXRoXyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUuc3RhdGVfID0gbnVsbDsKZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLnByb3RvdHlwZS5sYXN0U3RhdHVzQ29kZV8gPSAtMTsKZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLnByb3RvdHlwZS5ob3N0UHJlZml4XyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUuYmxvY2tlZFByZWZpeF8gPSBudWxsOwpnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwuU3RhdGVfID0ge0lOSVQ6MCwgQ0hFQ0tJTkdfQkxPQ0tFRDoxLCBDT05ORUNUSU9OX1RFU1RJTkc6Mn07Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5CTE9DS0VEX1RJTUVPVVRfID0gNUUzOwpnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwuQkxPQ0tFRF9SRVRSSUVTXyA9IDM7Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5CTE9DS0VEX1BBVVNFX0JFVFdFRU5fUkVUUklFU18gPSAyRTM7Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5NSU5fVElNRV9FWFBFQ1RFRF9CRVRXRUVOX0RBVEFfID0gNTAwOwpnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwucHJvdG90eXBlLnNldEV4dHJhSGVhZGVycyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyVGVzdENoYW5uZWwkJHNldEV4dHJhSGVhZGVycyQoZXh0cmFIZWFkZXJzKSB7CiAgdGhpcy5leHRyYUhlYWRlcnNfID0gZXh0cmFIZWFkZXJzCn07Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyVGVzdENoYW5uZWwkJGNvbm5lY3QkKHBhdGgpIHsKICB0aGlzLnBhdGhfID0gcGF0aDsKICB2YXIgc2VuZERhdGFVcmkgPSB0aGlzLmNoYW5uZWxfLmdldEZvcndhcmRDaGFubmVsVXJpKHRoaXMucGF0aF8pOwogIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLm5vdGlmeVN0YXRFdmVudChnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0LlRFU1RfU1RBR0VfT05FX1NUQVJUKTsKICBzZW5kRGF0YVVyaS5zZXRQYXJhbWV0ZXJWYWx1ZXMoIk1PREUiLCAiaW5pdCIpOwogIHRoaXMucmVxdWVzdF8gPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5jcmVhdGVDaGFubmVsUmVxdWVzdCh0aGlzLCB0aGlzLmNoYW5uZWxEZWJ1Z18sIHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIHRoaXMuY2hhbm5lbF8uZ2V0T25saW5lSGFuZGxlcigpKTsKICB0aGlzLnJlcXVlc3RfLnNldEV4dHJhSGVhZGVycyh0aGlzLmV4dHJhSGVhZGVyc18pOwogIHRoaXMucmVxdWVzdF8ueG1sSHR0cEdldChzZW5kRGF0YVVyaSwgITEsIG51bGwsICEwKTsKICB0aGlzLnN0YXRlXyA9IGdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5TdGF0ZV8uSU5JVDsKICB0aGlzLnN0YXJ0VGltZV8gPSBnb29nLm5vdygpCn07Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUuY2hlY2tCbG9ja2VkXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyVGVzdENoYW5uZWwkJGNoZWNrQmxvY2tlZF8kKCkgewogIHZhciB1cmkgPSB0aGlzLmNoYW5uZWxfLmNyZWF0ZURhdGFVcmkodGhpcy5ibG9ja2VkUHJlZml4XywgIi9tYWlsL2ltYWdlcy9jbGVhcmRvdC5naWYiKTsKICB1cmkubWFrZVVuaXF1ZSgpOwogIGdvb2cubmV0LnRtcG5ldHdvcmsudGVzdExvYWRJbWFnZVdpdGhSZXRyaWVzKHVyaS50b1N0cmluZygpLCBnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwuQkxPQ0tFRF9USU1FT1VUXywgZ29vZy5iaW5kKHRoaXMuY2hlY2tCbG9ja2VkQ2FsbGJhY2tfLCB0aGlzKSwgZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLkJMT0NLRURfUkVUUklFU18sIGdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5CTE9DS0VEX1BBVVNFX0JFVFdFRU5fUkVUUklFU18pCn07Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUuY2hlY2tCbG9ja2VkQ2FsbGJhY2tfID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJUZXN0Q2hhbm5lbCQkY2hlY2tCbG9ja2VkQ2FsbGJhY2tfJChzdWNjZWVkZWQpIHsKICBzdWNjZWVkZWQgPyAodGhpcy5zdGF0ZV8gPSBnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwuU3RhdGVfLkNPTk5FQ1RJT05fVEVTVElORywgdGhpcy5jb25uZWN0U3RhZ2UyXygpKSA6IChnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5ub3RpZnlTdGF0RXZlbnQoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdC5DSEFOTkVMX0JMT0NLRUQpLCB0aGlzLmNoYW5uZWxfLnRlc3RDb25uZWN0aW9uQmxvY2tlZCh0aGlzKSkKfTsKZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLnByb3RvdHlwZS5jb25uZWN0U3RhZ2UyXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyVGVzdENoYW5uZWwkJGNvbm5lY3RTdGFnZTJfJCgpIHsKICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoIlRlc3RDb25uZWN0aW9uOiBzdGFydGluZyBzdGFnZSAyIik7CiAgdGhpcy5yZXF1ZXN0XyA9IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLmNyZWF0ZUNoYW5uZWxSZXF1ZXN0KHRoaXMsIHRoaXMuY2hhbm5lbERlYnVnXywgdm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgdGhpcy5jaGFubmVsXy5nZXRPbmxpbmVIYW5kbGVyKCkpOwogIHRoaXMucmVxdWVzdF8uc2V0RXh0cmFIZWFkZXJzKHRoaXMuZXh0cmFIZWFkZXJzXyk7CiAgdmFyIHJlY3ZEYXRhVXJpID0gdGhpcy5jaGFubmVsXy5nZXRCYWNrQ2hhbm5lbFVyaSh0aGlzLmhvc3RQcmVmaXhfLCB0aGlzLnBhdGhfKTsKICBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5ub3RpZnlTdGF0RXZlbnQoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdC5URVNUX1NUQUdFX1RXT19TVEFSVCk7CiAgZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3Quc3VwcG9ydHNYaHJTdHJlYW1pbmcoKSA/IChyZWN2RGF0YVVyaS5zZXRQYXJhbWV0ZXJWYWx1ZXMoIlRZUEUiLCAieG1saHR0cCIpLCB0aGlzLnJlcXVlc3RfLnhtbEh0dHBHZXQocmVjdkRhdGFVcmksICExLCB0aGlzLmhvc3RQcmVmaXhfLCAhMSkpIDogKHJlY3ZEYXRhVXJpLnNldFBhcmFtZXRlclZhbHVlcygiVFlQRSIsICJodG1sIiksIHRoaXMucmVxdWVzdF8udHJpZGVudEdldChyZWN2RGF0YVVyaSwgQm9vbGVhbih0aGlzLmhvc3RQcmVmaXhfKSkpCn07Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUuY3JlYXRlWGhySW8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlclRlc3RDaGFubmVsJCRjcmVhdGVYaHJJbyQoaG9zdFByZWZpeCkgewogIHJldHVybiB0aGlzLmNoYW5uZWxfLmNyZWF0ZVhocklvKGhvc3RQcmVmaXgpCn07Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlclRlc3RDaGFubmVsJCRhYm9ydCQoKSB7CiAgdGhpcy5yZXF1ZXN0XyAmJiAodGhpcy5yZXF1ZXN0Xy5jYW5jZWwoKSwgdGhpcy5yZXF1ZXN0XyA9IG51bGwpOwogIHRoaXMubGFzdFN0YXR1c0NvZGVfID0gLTEKfTsKZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLnByb3RvdHlwZS5pc0Nsb3NlZCA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyVGVzdENoYW5uZWwkJGlzQ2xvc2VkJCgpIHsKICByZXR1cm4hMQp9Owpnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwucHJvdG90eXBlLm9uUmVxdWVzdERhdGEgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlclRlc3RDaGFubmVsJCRvblJlcXVlc3REYXRhJChyZXEsIHJlc3BvbnNlVGV4dCkgewogIHRoaXMubGFzdFN0YXR1c0NvZGVfID0gcmVxLmdldExhc3RTdGF0dXNDb2RlKCk7CiAgaWYodGhpcy5zdGF0ZV8gPT0gZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLlN0YXRlXy5JTklUKSB7CiAgICBpZih0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoIlRlc3RDb25uZWN0aW9uOiBHb3QgZGF0YSBmb3Igc3RhZ2UgMSIpLCByZXNwb25zZVRleHQpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmVzcEFycmF5ID0gZ29vZy5qc29uLnVuc2FmZVBhcnNlKHJlc3BvbnNlVGV4dCkKICAgICAgfWNhdGNoKGUpIHsKICAgICAgICB0aGlzLmNoYW5uZWxEZWJ1Z18uZHVtcEV4Y2VwdGlvbihlKTsKICAgICAgICB0aGlzLmNoYW5uZWxfLnRlc3RDb25uZWN0aW9uRmFpbHVyZSh0aGlzLCBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5CQURfREFUQSk7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgdGhpcy5ob3N0UHJlZml4XyA9IHRoaXMuY2hhbm5lbF8uY29ycmVjdEhvc3RQcmVmaXgocmVzcEFycmF5WzBdKTsKICAgICAgdGhpcy5ibG9ja2VkUHJlZml4XyA9IHJlc3BBcnJheVsxXQogICAgfWVsc2UgewogICAgICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoIlRlc3RDb25uZWN0aW9uOiBOdWxsIHJlc3BvbnNlVGV4dCIpLCB0aGlzLmNoYW5uZWxfLnRlc3RDb25uZWN0aW9uRmFpbHVyZSh0aGlzLCBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5CQURfREFUQSkKICAgIH0KICB9ZWxzZSB7CiAgICB0aGlzLnN0YXRlXyA9PSBnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwuU3RhdGVfLkNPTk5FQ1RJT05fVEVTVElORyAmJiAodGhpcy5yZWNlaXZlZEludGVybWVkaWF0ZVJlc3VsdF8gPyAoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5U3RhdEV2ZW50KGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXQuVEVTVF9TVEFHRV9UV09fREFUQV9UV08pLCB0aGlzLmxhc3RUaW1lXyA9IGdvb2cubm93KCkpIDogIjExMTExIiA9PSByZXNwb25zZVRleHQgPyAoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5U3RhdEV2ZW50KGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXQuVEVTVF9TVEFHRV9UV09fREFUQV9PTkUpLCB0aGlzLnJlY2VpdmVkSW50ZXJtZWRpYXRlUmVzdWx0XyA9ICEwLCB0aGlzLmZpcnN0VGltZV8gPSBnb29nLm5vdygpLCB0aGlzLmNoZWNrRm9yRWFybHlOb25CdWZmZXJlZF8oKSAmJiAodGhpcy5sYXN0U3RhdHVzQ29kZV8gPSAyMDAsIHRoaXMucmVxdWVzdF8uY2FuY2VsKCksIAogICAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJUZXN0IGNvbm5lY3Rpb24gc3VjY2VlZGVkOyB1c2luZyBzdHJlYW1pbmcgY29ubmVjdGlvbiIpLCBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5ub3RpZnlTdGF0RXZlbnQoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdC5OT1BST1hZKSwgdGhpcy5jaGFubmVsXy50ZXN0Q29ubmVjdGlvbkZpbmlzaGVkKHRoaXMsICEwKSkpIDogKGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLm5vdGlmeVN0YXRFdmVudChnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0LlRFU1RfU1RBR0VfVFdPX0RBVEFfQk9USCksIHRoaXMuZmlyc3RUaW1lXyA9IHRoaXMubGFzdFRpbWVfID0gZ29vZy5ub3coKSwgdGhpcy5yZWNlaXZlZEludGVybWVkaWF0ZVJlc3VsdF8gPSAhMSkpCiAgfQp9Owpnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwucHJvdG90eXBlLm9uUmVxdWVzdENvbXBsZXRlID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJUZXN0Q2hhbm5lbCQkb25SZXF1ZXN0Q29tcGxldGUkKCkgewogIHRoaXMubGFzdFN0YXR1c0NvZGVfID0gdGhpcy5yZXF1ZXN0Xy5nZXRMYXN0U3RhdHVzQ29kZSgpOwogIGlmKHRoaXMucmVxdWVzdF8uZ2V0U3VjY2VzcygpKSB7CiAgICBpZih0aGlzLnN0YXRlXyA9PSBnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwuU3RhdGVfLklOSVQpIHsKICAgICAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJUZXN0Q29ubmVjdGlvbjogcmVxdWVzdCBjb21wbGV0ZSBmb3IgaW5pdGlhbCBjaGVjayIpLCB0aGlzLmJsb2NrZWRQcmVmaXhfID8gKHRoaXMuc3RhdGVfID0gZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLlN0YXRlXy5DSEVDS0lOR19CTE9DS0VELCB0aGlzLmNoZWNrQmxvY2tlZF8oKSkgOiAodGhpcy5zdGF0ZV8gPSBnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwuU3RhdGVfLkNPTk5FQ1RJT05fVEVTVElORywgdGhpcy5jb25uZWN0U3RhZ2UyXygpKQogICAgfWVsc2UgewogICAgICBpZih0aGlzLnN0YXRlXyA9PSBnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwuU3RhdGVfLkNPTk5FQ1RJT05fVEVTVElORykgewogICAgICAgIHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiVGVzdENvbm5lY3Rpb246IHJlcXVlc3QgY29tcGxldGUgZm9yIHN0YWdlIDIiKTsKICAgICAgICB2YXIgZ29vZENvbm4gPSAhMTsKICAgICAgICBpZihnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5zdXBwb3J0c1hoclN0cmVhbWluZygpKSB7CiAgICAgICAgICBnb29kQ29ubiA9IHRoaXMucmVjZWl2ZWRJbnRlcm1lZGlhdGVSZXN1bHRfCiAgICAgICAgfWVsc2UgewogICAgICAgICAgdmFyIG1zID0gdGhpcy5sYXN0VGltZV8gLSB0aGlzLmZpcnN0VGltZV8sIGdvb2RDb25uID0gMjAwID4gbXMgPyAhMSA6ICEwCiAgICAgICAgfQogICAgICAgIGdvb2RDb25uID8gKHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiVGVzdCBjb25uZWN0aW9uIHN1Y2NlZWRlZDsgdXNpbmcgc3RyZWFtaW5nIGNvbm5lY3Rpb24iKSwgZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5U3RhdEV2ZW50KGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXQuTk9QUk9YWSksIHRoaXMuY2hhbm5lbF8udGVzdENvbm5lY3Rpb25GaW5pc2hlZCh0aGlzLCAhMCkpIDogKHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiVGVzdCBjb25uZWN0aW9uIGZhaWxlZDsgbm90IHVzaW5nIHN0cmVhbWluZyIpLCBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5ub3RpZnlTdGF0RXZlbnQoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdC5QUk9YWSksIHRoaXMuY2hhbm5lbF8udGVzdENvbm5lY3Rpb25GaW5pc2hlZCh0aGlzLCAhMSkpCiAgICAgIH0KICAgIH0KICB9ZWxzZSB7CiAgICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoIlRlc3RDb25uZWN0aW9uOiByZXF1ZXN0IGZhaWxlZCwgaW4gc3RhdGUgIiArIHRoaXMuc3RhdGVfKSwgdGhpcy5zdGF0ZV8gPT0gZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLlN0YXRlXy5JTklUID8gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5U3RhdEV2ZW50KGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXQuVEVTVF9TVEFHRV9PTkVfRkFJTEVEKSA6IHRoaXMuc3RhdGVfID09IGdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5TdGF0ZV8uQ09OTkVDVElPTl9URVNUSU5HICYmIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLm5vdGlmeVN0YXRFdmVudChnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0LlRFU1RfU1RBR0VfVFdPX0ZBSUxFRCksIHRoaXMuY2hhbm5lbF8udGVzdENvbm5lY3Rpb25GYWlsdXJlKHRoaXMsIHRoaXMucmVxdWVzdF8uZ2V0TGFzdEVycm9yKCkpCiAgfQp9Owpnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwucHJvdG90eXBlLmdldExhc3RTdGF0dXNDb2RlID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJUZXN0Q2hhbm5lbCQkZ2V0TGFzdFN0YXR1c0NvZGUkKCkgewogIHJldHVybiB0aGlzLmxhc3RTdGF0dXNDb2RlXwp9Owpnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwucHJvdG90eXBlLnNob3VsZFVzZVNlY29uZGFyeURvbWFpbnMgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlclRlc3RDaGFubmVsJCRzaG91bGRVc2VTZWNvbmRhcnlEb21haW5zJCgpIHsKICByZXR1cm4gdGhpcy5jaGFubmVsXy5zaG91bGRVc2VTZWNvbmRhcnlEb21haW5zKCkKfTsKZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyVGVzdENoYW5uZWwkJGlzQWN0aXZlJCgpIHsKICByZXR1cm4gdGhpcy5jaGFubmVsXy5pc0FjdGl2ZSgpCn07Cmdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5wcm90b3R5cGUuY2hlY2tGb3JFYXJseU5vbkJ1ZmZlcmVkXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyVGVzdENoYW5uZWwkJGNoZWNrRm9yRWFybHlOb25CdWZmZXJlZF8kKCkgewogIHZhciBtcyA9IHRoaXMuZmlyc3RUaW1lXyAtIHRoaXMuc3RhcnRUaW1lXzsKICByZXR1cm4gZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3Quc3VwcG9ydHNYaHJTdHJlYW1pbmcoKSB8fCBtcyA8IGdvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbC5NSU5fVElNRV9FWFBFQ1RFRF9CRVRXRUVOX0RBVEFfCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJChjbGllbnRWZXJzaW9uKSB7CiAgdGhpcy5jbGllbnRWZXJzaW9uXyA9IGNsaWVudFZlcnNpb247CiAgdGhpcy5zdGF0ZV8gPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZS5JTklUOwogIHRoaXMub3V0Z29pbmdNYXBzXyA9IFtdOwogIHRoaXMucGVuZGluZ01hcHNfID0gW107CiAgdGhpcy5jaGFubmVsRGVidWdfID0gbmV3IGdvb2cubmV0LkNoYW5uZWxEZWJ1Zwp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5RdWV1ZWRNYXAgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkUXVldWVkTWFwJChtYXBJZCwgbWFwKSB7CiAgdGhpcy5tYXBJZCA9IG1hcElkOwogIHRoaXMubWFwID0gbWFwCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5leHRyYUhlYWRlcnNfID0gbnVsbDsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmV4dHJhUGFyYW1zXyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5mb3J3YXJkQ2hhbm5lbFJlcXVlc3RfID0gbnVsbDsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmJhY2tDaGFubmVsUmVxdWVzdF8gPSBudWxsOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUucGF0aF8gPSBudWxsOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuZm9yd2FyZENoYW5uZWxVcmlfID0gbnVsbDsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmJhY2tDaGFubmVsVXJpXyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5ob3N0UHJlZml4XyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5vbmxpbmVIYW5kbGVyXyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5hbGxvd0hvc3RQcmVmaXhfID0gITA7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5uZXh0UmlkXyA9IDA7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5uZXh0TWFwSWRfID0gMDsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmZhaWxGYXN0XyA9ICExOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuaGFuZGxlcl8gPSBudWxsOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuZm9yd2FyZENoYW5uZWxUaW1lcklkXyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5iYWNrQ2hhbm5lbFRpbWVySWRfID0gbnVsbDsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmRlYWRCYWNrQ2hhbm5lbFRpbWVySWRfID0gbnVsbDsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmNvbm5lY3Rpb25UZXN0XyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS51c2VDaHVua2VkXyA9IG51bGw7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5hbGxvd0NodW5rZWRNb2RlXyA9ICEwOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUubGFzdEFycmF5SWRfID0gLTE7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5sYXN0UG9zdFJlc3BvbnNlQXJyYXlJZF8gPSAtMTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmxhc3RTdGF0dXNDb2RlXyA9IC0xOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuZm9yd2FyZENoYW5uZWxSZXRyeUNvdW50XyA9IDA7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5iYWNrQ2hhbm5lbFJldHJ5Q291bnRfID0gMDsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuTEFURVNUX0NIQU5ORUxfVkVSU0lPTiA9IDg7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5jaGFubmVsVmVyc2lvbl8gPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5MQVRFU1RfQ0hBTk5FTF9WRVJTSU9OOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZSA9IHtDTE9TRUQ6MCwgSU5JVDoxLCBPUEVOSU5HOjIsIE9QRU5FRDozfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRk9SV0FSRF9DSEFOTkVMX01BWF9SRVRSSUVTID0gMjsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRk9SV0FSRF9DSEFOTkVMX1JFVFJZX1RJTUVPVVQgPSAyRTQ7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkJBQ0tfQ0hBTk5FTF9NQVhfUkVUUklFUyA9IDM7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlJFVFJZX0RFTEFZX01TID0gNUUzOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5SRVRSWV9ERUxBWV9TRUVEID0gMUU0Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5SVFRfRVNUSU1BVEUgPSAzRTM7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLklOQUNUSVZFX0NIQU5ORUxfUkVUUllfRkFDVE9SID0gMjsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXJyb3IgPSB7T0s6MCwgUkVRVUVTVF9GQUlMRUQ6MiwgTE9HR0VEX09VVDo0LCBOT19EQVRBOjUsIFVOS05PV05fU0VTU0lPTl9JRDo2LCBTVE9QOjcsIE5FVFdPUks6OCwgQkxPQ0tFRDo5LCBCQURfREFUQToxMCwgQkFEX1JFU1BPTlNFOjExfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuQ2hhbm5lbFR5cGVfID0ge0ZPUldBUkRfQ0hBTk5FTDoxLCBCQUNLX0NIQU5ORUw6Mn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLk1BWF9NQVBTX1BFUl9SRVFVRVNUXyA9IDFFMzsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuc3RhdEV2ZW50VGFyZ2V0XyA9IG5ldyBnb29nLmV2ZW50cy5FdmVudFRhcmdldDsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXZlbnQgPSB7fTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXZlbnQuU1RBVF9FVkVOVCA9ICJzdGF0ZXZlbnQiOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0RXZlbnQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkU3RhdEV2ZW50JChldmVudFRhcmdldCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXZlbnQuU1RBVF9FVkVOVCwgZXZlbnRUYXJnZXQpCn07Cmdvb2cuaW5oZXJpdHMoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkV2ZW50LlRJTUlOR19FVkVOVCA9ICJ0aW1pbmdldmVudCI7Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlRpbWluZ0V2ZW50ID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJFRpbWluZ0V2ZW50JCh0YXJnZXQsIHNpemUsIHJ0dCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXZlbnQuVElNSU5HX0VWRU5ULCB0YXJnZXQpOwogIHRoaXMuc2l6ZSA9IHNpemU7CiAgdGhpcy5ydHQgPSBydHQKfTsKZ29vZy5pbmhlcml0cyhnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5UaW1pbmdFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ID0ge0NPTk5FQ1RfQVRURU1QVDowLCBFUlJPUl9ORVRXT1JLOjEsIEVSUk9SX09USEVSOjIsIFRFU1RfU1RBR0VfT05FX1NUQVJUOjMsIENIQU5ORUxfQkxPQ0tFRDo0LCBURVNUX1NUQUdFX1RXT19TVEFSVDo1LCBURVNUX1NUQUdFX1RXT19EQVRBX09ORTo2LCBURVNUX1NUQUdFX1RXT19EQVRBX1RXTzo3LCBURVNUX1NUQUdFX1RXT19EQVRBX0JPVEg6OCwgVEVTVF9TVEFHRV9PTkVfRkFJTEVEOjksIFRFU1RfU1RBR0VfVFdPX0ZBSUxFRDoxMCwgUFJPWFk6MTEsIE5PUFJPWFk6MTIsIFJFUVVFU1RfVU5LTk9XTl9TRVNTSU9OX0lEOjEzLCBSRVFVRVNUX0JBRF9TVEFUVVM6MTQsIFJFUVVFU1RfSU5DT01QTEVURV9EQVRBOjE1LCBSRVFVRVNUX0JBRF9EQVRBOjE2LCBSRVFVRVNUX05PX0RBVEE6MTcsIFJFUVVFU1RfVElNRU9VVDoxOCwgQkFDS0NIQU5ORUxfTUlTU0lORzoxOSwgQkFDS0NIQU5ORUxfREVBRDoyMCwgQlJPV1NFUl9PRkZMSU5FOjIxfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuTUFHSUNfUkVTUE9OU0VfQ09PS0lFID0gInkyZiUiOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5PVVRTVEFORElOR19EQVRBX0JBQ0tDSEFOTkVMX1JFVFJZX0NVVE9GRiA9IDM3NTAwOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuc2V0Q2hhbm5lbERlYnVnID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRzZXRDaGFubmVsRGVidWckKGNoYW5uZWxEZWJ1ZykgewogIHRoaXMuY2hhbm5lbERlYnVnXyA9IGNoYW5uZWxEZWJ1Zwp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zZXRTdGFydFRocmVhZEV4ZWN1dGlvbkhvb2sgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkc2V0U3RhcnRUaHJlYWRFeGVjdXRpb25Ib29rJChzdGFydEhvb2spIHsKICBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zdGFydEV4ZWN1dGlvbkhvb2tfID0gc3RhcnRIb29rCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnNldEVuZFRocmVhZEV4ZWN1dGlvbkhvb2sgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkc2V0RW5kVGhyZWFkRXhlY3V0aW9uSG9vayQoZW5kSG9vaykgewogIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLmVuZEV4ZWN1dGlvbkhvb2tfID0gZW5kSG9vawp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zdGFydEV4ZWN1dGlvbkhvb2tfID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJHN0YXJ0RXhlY3V0aW9uSG9va18kKCkgewp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5lbmRFeGVjdXRpb25Ib29rXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCRlbmRFeGVjdXRpb25Ib29rXyQoKSB7Cn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLmNyZWF0ZUNoYW5uZWxSZXF1ZXN0ID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJGNyZWF0ZUNoYW5uZWxSZXF1ZXN0JChjaGFubmVsLCBjaGFubmVsRGVidWcsIG9wdF9zZXNzaW9uSWQsIG9wdF9yZXF1ZXN0SWQsIG9wdF9yZXRyeUlkLCBvcHRfb25saW5lSGFuZGxlcikgewogIHJldHVybiBuZXcgZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QoY2hhbm5lbCwgY2hhbm5lbERlYnVnLCBvcHRfc2Vzc2lvbklkLCBvcHRfcmVxdWVzdElkLCBvcHRfcmV0cnlJZCwgb3B0X29ubGluZUhhbmRsZXIpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRjb25uZWN0JCh0ZXN0UGF0aCwgY2hhbm5lbFBhdGgsIGV4dHJhUGFyYW1zLCBvcHRfb2xkU2Vzc2lvbklkLCBvcHRfb2xkQXJyYXlJZCkgewogIHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiY29ubmVjdCgpIik7CiAgZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5U3RhdEV2ZW50KGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXQuQ09OTkVDVF9BVFRFTVBUKTsKICB0aGlzLnBhdGhfID0gY2hhbm5lbFBhdGg7CiAgdGhpcy5leHRyYVBhcmFtc18gPSBleHRyYVBhcmFtcyB8fCB7fTsKICBvcHRfb2xkU2Vzc2lvbklkICYmIGdvb2cuaXNEZWYob3B0X29sZEFycmF5SWQpICYmICh0aGlzLmV4dHJhUGFyYW1zXy5PU0lEID0gb3B0X29sZFNlc3Npb25JZCwgdGhpcy5leHRyYVBhcmFtc18uT0FJRCA9IG9wdF9vbGRBcnJheUlkKTsKICB0aGlzLmNvbm5lY3RUZXN0Xyh0ZXN0UGF0aCkKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGRpc2Nvbm5lY3QkKCkgewogIHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiZGlzY29ubmVjdCgpIik7CiAgdGhpcy5jYW5jZWxSZXF1ZXN0c18oKTsKICBpZih0aGlzLnN0YXRlXyA9PSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZS5PUEVORUQpIHsKICAgIHZhciByaWQgPSB0aGlzLm5leHRSaWRfKyssIHVyaSA9IHRoaXMuZm9yd2FyZENoYW5uZWxVcmlfLmNsb25lKCk7CiAgICB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoIlNJRCIsIHRoaXMuc2lkXyk7CiAgICB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoIlJJRCIsIHJpZCk7CiAgICB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoIlRZUEUiLCAidGVybWluYXRlIik7CiAgICB0aGlzLmFkZEFkZGl0aW9uYWxQYXJhbXNfKHVyaSk7CiAgICB2YXIgcmVxdWVzdCA9IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLmNyZWF0ZUNoYW5uZWxSZXF1ZXN0KHRoaXMsIHRoaXMuY2hhbm5lbERlYnVnXywgdGhpcy5zaWRfLCByaWQsIHZvaWQgMCwgdGhpcy5vbmxpbmVIYW5kbGVyXyk7CiAgICByZXF1ZXN0LnNlbmRVc2luZ0ltZ1RhZyh1cmkpOwogICAgdGhpcy5vbkNsb3NlXygpCiAgfQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuZ2V0U2Vzc2lvbklkID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRnZXRTZXNzaW9uSWQkKCkgewogIHJldHVybiB0aGlzLnNpZF8KfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmNvbm5lY3RUZXN0XyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkY29ubmVjdFRlc3RfJCh0ZXN0UGF0aCkgewogIHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiY29ubmVjdFRlc3RfKCkiKTsKICB0aGlzLm9rVG9NYWtlUmVxdWVzdF8oKSAmJiAodGhpcy5jb25uZWN0aW9uVGVzdF8gPSBuZXcgZ29vZy5uZXQuQnJvd3NlclRlc3RDaGFubmVsKHRoaXMsIHRoaXMuY2hhbm5lbERlYnVnXyksIHRoaXMuY29ubmVjdGlvblRlc3RfLnNldEV4dHJhSGVhZGVycyh0aGlzLmV4dHJhSGVhZGVyc18pLCB0aGlzLmNvbm5lY3Rpb25UZXN0Xy5jb25uZWN0KHRlc3RQYXRoKSkKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmNvbm5lY3RDaGFubmVsXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkY29ubmVjdENoYW5uZWxfJCgpIHsKICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoImNvbm5lY3RDaGFubmVsXygpIik7CiAgdGhpcy5lbnN1cmVJblN0YXRlXyhnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZS5JTklULCBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZS5DTE9TRUQpOwogIHRoaXMuZm9yd2FyZENoYW5uZWxVcmlfID0gdGhpcy5nZXRGb3J3YXJkQ2hhbm5lbFVyaSh0aGlzLnBhdGhfKTsKICB0aGlzLmVuc3VyZUZvcndhcmRDaGFubmVsXygpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5jYW5jZWxSZXF1ZXN0c18gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGNhbmNlbFJlcXVlc3RzXyQoKSB7CiAgdGhpcy5jb25uZWN0aW9uVGVzdF8gJiYgKHRoaXMuY29ubmVjdGlvblRlc3RfLmFib3J0KCksIHRoaXMuY29ubmVjdGlvblRlc3RfID0gbnVsbCk7CiAgdGhpcy5iYWNrQ2hhbm5lbFJlcXVlc3RfICYmICh0aGlzLmJhY2tDaGFubmVsUmVxdWVzdF8uY2FuY2VsKCksIHRoaXMuYmFja0NoYW5uZWxSZXF1ZXN0XyA9IG51bGwpOwogIHRoaXMuYmFja0NoYW5uZWxUaW1lcklkXyAmJiAoZ29vZy5nbG9iYWwuY2xlYXJUaW1lb3V0KHRoaXMuYmFja0NoYW5uZWxUaW1lcklkXyksIHRoaXMuYmFja0NoYW5uZWxUaW1lcklkXyA9IG51bGwpOwogIHRoaXMuY2xlYXJEZWFkQmFja2NoYW5uZWxUaW1lcl8oKTsKICB0aGlzLmZvcndhcmRDaGFubmVsUmVxdWVzdF8gJiYgKHRoaXMuZm9yd2FyZENoYW5uZWxSZXF1ZXN0Xy5jYW5jZWwoKSwgdGhpcy5mb3J3YXJkQ2hhbm5lbFJlcXVlc3RfID0gbnVsbCk7CiAgdGhpcy5mb3J3YXJkQ2hhbm5lbFRpbWVySWRfICYmIChnb29nLmdsb2JhbC5jbGVhclRpbWVvdXQodGhpcy5mb3J3YXJkQ2hhbm5lbFRpbWVySWRfKSwgdGhpcy5mb3J3YXJkQ2hhbm5lbFRpbWVySWRfID0gbnVsbCkKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLnNldEV4dHJhSGVhZGVycyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkc2V0RXh0cmFIZWFkZXJzJChleHRyYUhlYWRlcnMpIHsKICB0aGlzLmV4dHJhSGVhZGVyc18gPSBleHRyYUhlYWRlcnMKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmdldEhhbmRsZXIgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGdldEhhbmRsZXIkKCkgewogIHJldHVybiB0aGlzLmhhbmRsZXJfCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5zZXRIYW5kbGVyID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRzZXRIYW5kbGVyJChoYW5kbGVyKSB7CiAgdGhpcy5oYW5kbGVyXyA9IGhhbmRsZXIKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmlzQnVmZmVyZWQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGlzQnVmZmVyZWQkKCkgewogIHJldHVybiF0aGlzLnVzZUNodW5rZWRfCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5zZW5kTWFwID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRzZW5kTWFwJChtYXApIHsKICBpZih0aGlzLnN0YXRlXyA9PSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZS5DTE9TRUQpIHsKICAgIHRocm93IEVycm9yKCJJbnZhbGlkIG9wZXJhdGlvbjogc2VuZGluZyBtYXAgd2hlbiBzdGF0ZSBpcyBjbG9zZWQiKTsKICB9CiAgdGhpcy5vdXRnb2luZ01hcHNfLmxlbmd0aCA9PSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5NQVhfTUFQU19QRVJfUkVRVUVTVF8gJiYgdGhpcy5jaGFubmVsRGVidWdfLnNldmVyZSgiQWxyZWFkeSBoYXZlICIgKyBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5NQVhfTUFQU19QRVJfUkVRVUVTVF8gKyAiIHF1ZXVlZCBtYXBzIHVwb24gcXVldWVpbmcgIiArIGdvb2cuanNvbi5zZXJpYWxpemUobWFwKSk7CiAgdGhpcy5vdXRnb2luZ01hcHNfLnB1c2gobmV3IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlF1ZXVlZE1hcCh0aGlzLm5leHRNYXBJZF8rKywgbWFwKSk7CiAgKHRoaXMuc3RhdGVfID09IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXRlLk9QRU5JTkcgfHwgdGhpcy5zdGF0ZV8gPT0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUuT1BFTkVEKSAmJiB0aGlzLmVuc3VyZUZvcndhcmRDaGFubmVsXygpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5nZXRGb3J3YXJkQ2hhbm5lbE1heFJldHJpZXMgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGdldEZvcndhcmRDaGFubmVsTWF4UmV0cmllcyQoKSB7CiAgcmV0dXJuIHRoaXMuZmFpbEZhc3RfID8gMCA6IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkZPUldBUkRfQ0hBTk5FTF9NQVhfUkVUUklFUwp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuZ2V0QmFja0NoYW5uZWxNYXhSZXRyaWVzID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRnZXRCYWNrQ2hhbm5lbE1heFJldHJpZXMkKCkgewogIHJldHVybiBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5CQUNLX0NIQU5ORUxfTUFYX1JFVFJJRVMKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmlzQ2xvc2VkID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRpc0Nsb3NlZCQoKSB7CiAgcmV0dXJuIHRoaXMuc3RhdGVfID09IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXRlLkNMT1NFRAp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGdldFN0YXRlJCgpIHsKICByZXR1cm4gdGhpcy5zdGF0ZV8KfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmdldExhc3RTdGF0dXNDb2RlID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRnZXRMYXN0U3RhdHVzQ29kZSQoKSB7CiAgcmV0dXJuIHRoaXMubGFzdFN0YXR1c0NvZGVfCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5nZXRMYXN0QXJyYXlJZCA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkZ2V0TGFzdEFycmF5SWQkKCkgewogIHJldHVybiB0aGlzLmxhc3RBcnJheUlkXwp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuaGFzT3V0c3RhbmRpbmdSZXF1ZXN0cyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkaGFzT3V0c3RhbmRpbmdSZXF1ZXN0cyQoKSB7CiAgcmV0dXJuIDAgIT0gdGhpcy5vdXRzdGFuZGluZ1JlcXVlc3RzXygpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5vdXRzdGFuZGluZ1JlcXVlc3RzXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkb3V0c3RhbmRpbmdSZXF1ZXN0c18kKCkgewogIHZhciBjb3VudCA9IDA7CiAgdGhpcy5iYWNrQ2hhbm5lbFJlcXVlc3RfICYmIGNvdW50Kys7CiAgdGhpcy5mb3J3YXJkQ2hhbm5lbFJlcXVlc3RfICYmIGNvdW50Kys7CiAgcmV0dXJuIGNvdW50Cn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5lbnN1cmVGb3J3YXJkQ2hhbm5lbF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGVuc3VyZUZvcndhcmRDaGFubmVsXyQoKSB7CiAgIXRoaXMuZm9yd2FyZENoYW5uZWxSZXF1ZXN0XyAmJiAhdGhpcy5mb3J3YXJkQ2hhbm5lbFRpbWVySWRfICYmICh0aGlzLmZvcndhcmRDaGFubmVsVGltZXJJZF8gPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zZXRUaW1lb3V0KGdvb2cuYmluZCh0aGlzLm9uU3RhcnRGb3J3YXJkQ2hhbm5lbFRpbWVyXywgdGhpcyksIDApLCB0aGlzLmZvcndhcmRDaGFubmVsUmV0cnlDb3VudF8gPSAwKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUubWF5YmVSZXRyeUZvcndhcmRDaGFubmVsXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkbWF5YmVSZXRyeUZvcndhcmRDaGFubmVsXyQocmVxdWVzdCkgewogIGlmKHRoaXMuZm9yd2FyZENoYW5uZWxSZXF1ZXN0XyB8fCB0aGlzLmZvcndhcmRDaGFubmVsVGltZXJJZF8pIHsKICAgIHJldHVybiB0aGlzLmNoYW5uZWxEZWJ1Z18uc2V2ZXJlKCJSZXF1ZXN0IGFscmVhZHkgaW4gcHJvZ3Jlc3MiKSwgITEKICB9CiAgaWYodGhpcy5zdGF0ZV8gPT0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUuSU5JVCB8fCB0aGlzLmZvcndhcmRDaGFubmVsUmV0cnlDb3VudF8gPj0gdGhpcy5nZXRGb3J3YXJkQ2hhbm5lbE1heFJldHJpZXMoKSkgewogICAgcmV0dXJuITEKICB9CiAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJHb2luZyB0byByZXRyeSBQT1NUIik7CiAgdGhpcy5mb3J3YXJkQ2hhbm5lbFRpbWVySWRfID0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuc2V0VGltZW91dChnb29nLmJpbmQodGhpcy5vblN0YXJ0Rm9yd2FyZENoYW5uZWxUaW1lcl8sIHRoaXMsIHJlcXVlc3QpLCB0aGlzLmdldFJldHJ5VGltZV8odGhpcy5mb3J3YXJkQ2hhbm5lbFJldHJ5Q291bnRfKSk7CiAgdGhpcy5mb3J3YXJkQ2hhbm5lbFJldHJ5Q291bnRfKys7CiAgcmV0dXJuITAKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLm9uU3RhcnRGb3J3YXJkQ2hhbm5lbFRpbWVyXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkb25TdGFydEZvcndhcmRDaGFubmVsVGltZXJfJChvcHRfcmV0cnlSZXF1ZXN0KSB7CiAgdGhpcy5mb3J3YXJkQ2hhbm5lbFRpbWVySWRfID0gbnVsbDsKICB0aGlzLnN0YXJ0Rm9yd2FyZENoYW5uZWxfKG9wdF9yZXRyeVJlcXVlc3QpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5zdGFydEZvcndhcmRDaGFubmVsXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkc3RhcnRGb3J3YXJkQ2hhbm5lbF8kKG9wdF9yZXRyeVJlcXVlc3QpIHsKICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoInN0YXJ0Rm9yd2FyZENoYW5uZWxfIik7CiAgdGhpcy5va1RvTWFrZVJlcXVlc3RfKCkgJiYgKHRoaXMuc3RhdGVfID09IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXRlLklOSVQgPyBvcHRfcmV0cnlSZXF1ZXN0ID8gdGhpcy5jaGFubmVsRGVidWdfLnNldmVyZSgiTm90IHN1cHBvc2VkIHRvIHJldHJ5IHRoZSBvcGVuIikgOiAodGhpcy5vcGVuXygpLCB0aGlzLnN0YXRlXyA9IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXRlLk9QRU5JTkcpIDogdGhpcy5zdGF0ZV8gPT0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUuT1BFTkVEICYmIChvcHRfcmV0cnlSZXF1ZXN0ID8gdGhpcy5tYWtlRm9yd2FyZENoYW5uZWxSZXF1ZXN0XyhvcHRfcmV0cnlSZXF1ZXN0KSA6IDAgPT0gdGhpcy5vdXRnb2luZ01hcHNfLmxlbmd0aCA/IHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1Zygic3RhcnRGb3J3YXJkQ2hhbm5lbF8gcmV0dXJuZWQ6IG5vdGhpbmcgdG8gc2VuZCIpIDogdGhpcy5mb3J3YXJkQ2hhbm5lbFJlcXVlc3RfID8gdGhpcy5jaGFubmVsRGVidWdfLnNldmVyZSgic3RhcnRGb3J3YXJkQ2hhbm5lbF8gcmV0dXJuZWQ6IGNvbm5lY3Rpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIpIDogCiAgKHRoaXMubWFrZUZvcndhcmRDaGFubmVsUmVxdWVzdF8oKSwgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJzdGFydEZvcndhcmRDaGFubmVsXyBmaW5pc2hlZCwgc2VudCByZXF1ZXN0IikpKSkKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLm9wZW5fID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRvcGVuXyQoKSB7CiAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJvcGVuXygpIik7CiAgdGhpcy5uZXh0UmlkXyA9IE1hdGguZmxvb3IoMUU1ICogTWF0aC5yYW5kb20oKSk7CiAgdmFyIHJpZCA9IHRoaXMubmV4dFJpZF8rKywgcmVxdWVzdCA9IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLmNyZWF0ZUNoYW5uZWxSZXF1ZXN0KHRoaXMsIHRoaXMuY2hhbm5lbERlYnVnXywgIiIsIHJpZCwgdm9pZCAwLCB0aGlzLm9ubGluZUhhbmRsZXJfKTsKICByZXF1ZXN0LnNldEV4dHJhSGVhZGVycyh0aGlzLmV4dHJhSGVhZGVyc18pOwogIHZhciByZXF1ZXN0VGV4dCA9IHRoaXMuZGVxdWV1ZU91dGdvaW5nTWFwc18oKSwgdXJpID0gdGhpcy5mb3J3YXJkQ2hhbm5lbFVyaV8uY2xvbmUoKTsKICB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoIlJJRCIsIHJpZCk7CiAgdGhpcy5jbGllbnRWZXJzaW9uXyAmJiB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoIkNWRVIiLCB0aGlzLmNsaWVudFZlcnNpb25fKTsKICB0aGlzLmFkZEFkZGl0aW9uYWxQYXJhbXNfKHVyaSk7CiAgcmVxdWVzdC54bWxIdHRwUG9zdCh1cmksIHJlcXVlc3RUZXh0LCAhMCk7CiAgdGhpcy5mb3J3YXJkQ2hhbm5lbFJlcXVlc3RfID0gcmVxdWVzdAp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUubWFrZUZvcndhcmRDaGFubmVsUmVxdWVzdF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJG1ha2VGb3J3YXJkQ2hhbm5lbFJlcXVlc3RfJChvcHRfcmV0cnlSZXF1ZXN0KSB7CiAgdmFyIHJpZCwgcmVxdWVzdFRleHQ7CiAgb3B0X3JldHJ5UmVxdWVzdCA/IDYgPCB0aGlzLmNoYW5uZWxWZXJzaW9uXyA/ICh0aGlzLnJlcXVldWVQZW5kaW5nTWFwc18oKSwgcmlkID0gdGhpcy5uZXh0UmlkXyAtIDEsIHJlcXVlc3RUZXh0ID0gdGhpcy5kZXF1ZXVlT3V0Z29pbmdNYXBzXygpKSA6IChyaWQgPSBvcHRfcmV0cnlSZXF1ZXN0LmdldFJlcXVlc3RJZCgpLCByZXF1ZXN0VGV4dCA9IG9wdF9yZXRyeVJlcXVlc3QuZ2V0UG9zdERhdGEoKSkgOiAocmlkID0gdGhpcy5uZXh0UmlkXysrLCByZXF1ZXN0VGV4dCA9IHRoaXMuZGVxdWV1ZU91dGdvaW5nTWFwc18oKSk7CiAgdmFyIHVyaSA9IHRoaXMuZm9yd2FyZENoYW5uZWxVcmlfLmNsb25lKCk7CiAgdXJpLnNldFBhcmFtZXRlclZhbHVlKCJTSUQiLCB0aGlzLnNpZF8pOwogIHVyaS5zZXRQYXJhbWV0ZXJWYWx1ZSgiUklEIiwgcmlkKTsKICB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoIkFJRCIsIHRoaXMubGFzdEFycmF5SWRfKTsKICB0aGlzLmFkZEFkZGl0aW9uYWxQYXJhbXNfKHVyaSk7CiAgdmFyIHJlcXVlc3QgPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5jcmVhdGVDaGFubmVsUmVxdWVzdCh0aGlzLCB0aGlzLmNoYW5uZWxEZWJ1Z18sIHRoaXMuc2lkXywgcmlkLCB0aGlzLmZvcndhcmRDaGFubmVsUmV0cnlDb3VudF8gKyAxLCB0aGlzLm9ubGluZUhhbmRsZXJfKTsKICByZXF1ZXN0LnNldEV4dHJhSGVhZGVycyh0aGlzLmV4dHJhSGVhZGVyc18pOwogIHJlcXVlc3Quc2V0VGltZW91dChNYXRoLnJvdW5kKDAuNSAqIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkZPUldBUkRfQ0hBTk5FTF9SRVRSWV9USU1FT1VUKSArIE1hdGgucm91bmQoMC41ICogZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRk9SV0FSRF9DSEFOTkVMX1JFVFJZX1RJTUVPVVQgKiBNYXRoLnJhbmRvbSgpKSk7CiAgdGhpcy5mb3J3YXJkQ2hhbm5lbFJlcXVlc3RfID0gcmVxdWVzdDsKICByZXF1ZXN0LnhtbEh0dHBQb3N0KHVyaSwgcmVxdWVzdFRleHQsICEwKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuYWRkQWRkaXRpb25hbFBhcmFtc18gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGFkZEFkZGl0aW9uYWxQYXJhbXNfJCh1cmkpIHsKICBpZih0aGlzLmhhbmRsZXJfKSB7CiAgICB2YXIgcGFyYW1zID0gdGhpcy5oYW5kbGVyXy5nZXRBZGRpdGlvbmFsUGFyYW1zKHRoaXMpOwogICAgcGFyYW1zICYmIGdvb2cuc3RydWN0cy5mb3JFYWNoKHBhcmFtcywgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoa2V5LCB2YWx1ZSkKICAgIH0pCiAgfQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuZGVxdWV1ZU91dGdvaW5nTWFwc18gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGRlcXVldWVPdXRnb2luZ01hcHNfJCgpIHsKICB2YXIgY291bnQgPSBNYXRoLm1pbih0aGlzLm91dGdvaW5nTWFwc18ubGVuZ3RoLCBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5NQVhfTUFQU19QRVJfUkVRVUVTVF8pLCBzYiA9IFsiY291bnQ9IiArIGNvdW50XSwgb2Zmc2V0OwogIDYgPCB0aGlzLmNoYW5uZWxWZXJzaW9uXyAmJiAwIDwgY291bnQgPyAob2Zmc2V0ID0gdGhpcy5vdXRnb2luZ01hcHNfWzBdLm1hcElkLCBzYi5wdXNoKCJvZnM9IiArIG9mZnNldCkpIDogb2Zmc2V0ID0gMDsKICBmb3IodmFyIGkgPSAwO2kgPCBjb3VudDtpKyspIHsKICAgIHZhciBtYXBJZCA9IHRoaXMub3V0Z29pbmdNYXBzX1tpXS5tYXBJZCwgbWFwID0gdGhpcy5vdXRnb2luZ01hcHNfW2ldLm1hcCwgbWFwSWQgPSA2ID49IHRoaXMuY2hhbm5lbFZlcnNpb25fID8gaSA6IG1hcElkIC0gb2Zmc2V0OwogICAgdHJ5IHsKICAgICAgZ29vZy5zdHJ1Y3RzLmZvckVhY2gobWFwLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgICAgc2IucHVzaCgicmVxIiArIG1hcElkICsgIl8iICsga2V5ICsgIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSkKICAgICAgfSkKICAgIH1jYXRjaChleCkgewogICAgICBzYi5wdXNoKCJyZXEiICsgbWFwSWQgKyAiX3R5cGU9IiArIGVuY29kZVVSSUNvbXBvbmVudCgiX2JhZG1hcCIpKQogICAgfQogIH0KICB0aGlzLnBlbmRpbmdNYXBzXyA9IHRoaXMucGVuZGluZ01hcHNfLmNvbmNhdCh0aGlzLm91dGdvaW5nTWFwc18uc3BsaWNlKDAsIGNvdW50KSk7CiAgcmV0dXJuIHNiLmpvaW4oIiYiKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUucmVxdWV1ZVBlbmRpbmdNYXBzXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkcmVxdWV1ZVBlbmRpbmdNYXBzXyQoKSB7CiAgdGhpcy5vdXRnb2luZ01hcHNfID0gdGhpcy5wZW5kaW5nTWFwc18uY29uY2F0KHRoaXMub3V0Z29pbmdNYXBzXyk7CiAgdGhpcy5wZW5kaW5nTWFwc18ubGVuZ3RoID0gMAp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuZW5zdXJlQmFja0NoYW5uZWxfID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRlbnN1cmVCYWNrQ2hhbm5lbF8kKCkgewogICF0aGlzLmJhY2tDaGFubmVsUmVxdWVzdF8gJiYgIXRoaXMuYmFja0NoYW5uZWxUaW1lcklkXyAmJiAodGhpcy5iYWNrQ2hhbm5lbEF0dGVtcHRJZF8gPSAxLCB0aGlzLmJhY2tDaGFubmVsVGltZXJJZF8gPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zZXRUaW1lb3V0KGdvb2cuYmluZCh0aGlzLm9uU3RhcnRCYWNrQ2hhbm5lbFRpbWVyXywgdGhpcyksIDApLCB0aGlzLmJhY2tDaGFubmVsUmV0cnlDb3VudF8gPSAwKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuaXNCcm93c2VyT25saW5lXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkaXNCcm93c2VyT25saW5lXyQoKSB7CiAgcmV0dXJuIHRoaXMub25saW5lSGFuZGxlcl8gPyB0aGlzLm9ubGluZUhhbmRsZXJfLmlzT25saW5lKCkgOiAhMAp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUubWF5YmVSZXRyeUJhY2tDaGFubmVsXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkbWF5YmVSZXRyeUJhY2tDaGFubmVsXyQoKSB7CiAgaWYodGhpcy5iYWNrQ2hhbm5lbFJlcXVlc3RfIHx8IHRoaXMuYmFja0NoYW5uZWxUaW1lcklkXykgewogICAgcmV0dXJuIHRoaXMuY2hhbm5lbERlYnVnXy5zZXZlcmUoIlJlcXVlc3QgYWxyZWFkeSBpbiBwcm9ncmVzcyIpLCAhMQogIH0KICBpZih0aGlzLmJhY2tDaGFubmVsUmV0cnlDb3VudF8gPj0gdGhpcy5nZXRCYWNrQ2hhbm5lbE1heFJldHJpZXMoKSB8fCAhdGhpcy5pc0Jyb3dzZXJPbmxpbmVfKCkpIHsKICAgIHJldHVybiExCiAgfQogIHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiR29pbmcgdG8gcmV0cnkgR0VUIik7CiAgdGhpcy5iYWNrQ2hhbm5lbEF0dGVtcHRJZF8rKzsKICB0aGlzLmJhY2tDaGFubmVsVGltZXJJZF8gPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zZXRUaW1lb3V0KGdvb2cuYmluZCh0aGlzLm9uU3RhcnRCYWNrQ2hhbm5lbFRpbWVyXywgdGhpcyksIHRoaXMuZ2V0UmV0cnlUaW1lXyh0aGlzLmJhY2tDaGFubmVsUmV0cnlDb3VudF8pKTsKICB0aGlzLmJhY2tDaGFubmVsUmV0cnlDb3VudF8rKzsKICByZXR1cm4hMAp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUub25TdGFydEJhY2tDaGFubmVsVGltZXJfID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRvblN0YXJ0QmFja0NoYW5uZWxUaW1lcl8kKCkgewogIHRoaXMuYmFja0NoYW5uZWxUaW1lcklkXyA9IG51bGw7CiAgdGhpcy5zdGFydEJhY2tDaGFubmVsXygpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5zdGFydEJhY2tDaGFubmVsXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkc3RhcnRCYWNrQ2hhbm5lbF8kKCkgewogIGlmKHRoaXMub2tUb01ha2VSZXF1ZXN0XygpKSB7CiAgICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoIkNyZWF0aW5nIG5ldyBIdHRwUmVxdWVzdCIpOwogICAgdGhpcy5iYWNrQ2hhbm5lbFJlcXVlc3RfID0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuY3JlYXRlQ2hhbm5lbFJlcXVlc3QodGhpcywgdGhpcy5jaGFubmVsRGVidWdfLCB0aGlzLnNpZF8sICJycGMiLCB0aGlzLmJhY2tDaGFubmVsQXR0ZW1wdElkXywgdGhpcy5vbmxpbmVIYW5kbGVyXyk7CiAgICB0aGlzLmJhY2tDaGFubmVsUmVxdWVzdF8uc2V0RXh0cmFIZWFkZXJzKHRoaXMuZXh0cmFIZWFkZXJzXyk7CiAgICB2YXIgdXJpID0gdGhpcy5iYWNrQ2hhbm5lbFVyaV8uY2xvbmUoKTsKICAgIHVyaS5zZXRQYXJhbWV0ZXJWYWx1ZSgiUklEIiwgInJwYyIpOwogICAgdXJpLnNldFBhcmFtZXRlclZhbHVlKCJTSUQiLCB0aGlzLnNpZF8pOwogICAgdXJpLnNldFBhcmFtZXRlclZhbHVlKCJDSSIsIHRoaXMudXNlQ2h1bmtlZF8gPyAiMCIgOiAiMSIpOwogICAgdXJpLnNldFBhcmFtZXRlclZhbHVlKCJBSUQiLCB0aGlzLmxhc3RBcnJheUlkXyk7CiAgICB0aGlzLmFkZEFkZGl0aW9uYWxQYXJhbXNfKHVyaSk7CiAgICBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5zdXBwb3J0c1hoclN0cmVhbWluZygpID8gKHVyaS5zZXRQYXJhbWV0ZXJWYWx1ZSgiVFlQRSIsICJ4bWxodHRwIiksIHRoaXMuYmFja0NoYW5uZWxSZXF1ZXN0Xy54bWxIdHRwR2V0KHVyaSwgITAsIHRoaXMuaG9zdFByZWZpeF8sICExKSkgOiAodXJpLnNldFBhcmFtZXRlclZhbHVlKCJUWVBFIiwgImh0bWwiKSwgdGhpcy5iYWNrQ2hhbm5lbFJlcXVlc3RfLnRyaWRlbnRHZXQodXJpLCBCb29sZWFuKHRoaXMuaG9zdFByZWZpeF8pKSk7CiAgICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoIk5ldyBSZXF1ZXN0IGNyZWF0ZWQiKQogIH0KfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLm9rVG9NYWtlUmVxdWVzdF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJG9rVG9NYWtlUmVxdWVzdF8kKCkgewogIGlmKHRoaXMuaGFuZGxlcl8pIHsKICAgIHZhciByZXN1bHQgPSB0aGlzLmhhbmRsZXJfLm9rVG9NYWtlUmVxdWVzdCh0aGlzKTsKICAgIGlmKHJlc3VsdCAhPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvci5PSykgewogICAgICByZXR1cm4gdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJIYW5kbGVyIHJldHVybmVkIGVycm9yIGNvZGUgZnJvbSBva1RvTWFrZVJlcXVlc3QiKSwgdGhpcy5zaWduYWxFcnJvcl8ocmVzdWx0KSwgITEKICAgIH0KICB9CiAgcmV0dXJuITAKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmdldE9ubGluZUhhbmRsZXIgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGdldE9ubGluZUhhbmRsZXIkKCkgewogIHJldHVybiB0aGlzLm9ubGluZUhhbmRsZXJfCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5zZXRPbmxpbmVIYW5kbGVyID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRzZXRPbmxpbmVIYW5kbGVyJChvbmxpbmVIYW5kbGVyKSB7CiAgdGhpcy5vbmxpbmVIYW5kbGVyXyA9IG9ubGluZUhhbmRsZXIKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLnRlc3RDb25uZWN0aW9uRmluaXNoZWQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJHRlc3RDb25uZWN0aW9uRmluaXNoZWQkKHRlc3RDaGFubmVsLCB1c2VDaHVua2VkKSB7CiAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJUZXN0IENvbm5lY3Rpb24gRmluaXNoZWQiKTsKICB0aGlzLnVzZUNodW5rZWRfID0gdGhpcy5hbGxvd0NodW5rZWRNb2RlXyAmJiB1c2VDaHVua2VkOwogIHRoaXMubGFzdFN0YXR1c0NvZGVfID0gdGVzdENoYW5uZWwuZ2V0TGFzdFN0YXR1c0NvZGUoKTsKICB0aGlzLmNvbm5lY3RDaGFubmVsXygpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS50ZXN0Q29ubmVjdGlvbkZhaWx1cmUgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJHRlc3RDb25uZWN0aW9uRmFpbHVyZSQodGVzdENoYW5uZWwpIHsKICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoIlRlc3QgQ29ubmVjdGlvbiBGYWlsZWQiKTsKICB0aGlzLmxhc3RTdGF0dXNDb2RlXyA9IHRlc3RDaGFubmVsLmdldExhc3RTdGF0dXNDb2RlKCk7CiAgdGhpcy5zaWduYWxFcnJvcl8oZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXJyb3IuUkVRVUVTVF9GQUlMRUQpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS50ZXN0Q29ubmVjdGlvbkJsb2NrZWQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJHRlc3RDb25uZWN0aW9uQmxvY2tlZCQoKSB7CiAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJUZXN0IENvbm5lY3Rpb24gQmxvY2tlZCIpOwogIHRoaXMubGFzdFN0YXR1c0NvZGVfID0gdGhpcy5jb25uZWN0aW9uVGVzdF8uZ2V0TGFzdFN0YXR1c0NvZGUoKTsKICB0aGlzLnNpZ25hbEVycm9yXyhnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvci5CTE9DS0VEKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUub25SZXF1ZXN0RGF0YSA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkb25SZXF1ZXN0RGF0YSQocmVxdWVzdCwgcmVzcG9uc2VUZXh0KSB7CiAgaWYoISh0aGlzLnN0YXRlXyA9PSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZS5DTE9TRUQgfHwgdGhpcy5iYWNrQ2hhbm5lbFJlcXVlc3RfICE9IHJlcXVlc3QgJiYgdGhpcy5mb3J3YXJkQ2hhbm5lbFJlcXVlc3RfICE9IHJlcXVlc3QpKSB7CiAgICBpZih0aGlzLmxhc3RTdGF0dXNDb2RlXyA9IHJlcXVlc3QuZ2V0TGFzdFN0YXR1c0NvZGUoKSwgdGhpcy5mb3J3YXJkQ2hhbm5lbFJlcXVlc3RfID09IHJlcXVlc3QgJiYgdGhpcy5zdGF0ZV8gPT0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUuT1BFTkVEKSB7CiAgICAgIGlmKDcgPCB0aGlzLmNoYW5uZWxWZXJzaW9uXykgewogICAgICAgIHZhciByZXNwb25zZTsKICAgICAgICB0cnkgewogICAgICAgICAgcmVzcG9uc2UgPSBnb29nLmpzb24udW5zYWZlUGFyc2UocmVzcG9uc2VUZXh0KQogICAgICAgIH1jYXRjaChleCkgewogICAgICAgICAgcmVzcG9uc2UgPSBudWxsCiAgICAgICAgfQogICAgICAgIGdvb2cuaXNBcnJheShyZXNwb25zZSkgJiYgMyA9PSByZXNwb25zZS5sZW5ndGggPyB0aGlzLmhhbmRsZVBvc3RSZXNwb25zZV8ocmVzcG9uc2UpIDogKHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiQmFkIFBPU1QgcmVzcG9uc2UgZGF0YSByZXR1cm5lZCIpLCB0aGlzLnNpZ25hbEVycm9yXyhnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvci5CQURfUkVTUE9OU0UpKQogICAgICB9ZWxzZSB7CiAgICAgICAgcmVzcG9uc2VUZXh0ICE9IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLk1BR0lDX1JFU1BPTlNFX0NPT0tJRSAmJiAodGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJCYWQgZGF0YSByZXR1cm5lZCAtIG1pc3NpbmcvaW52YWxkIG1hZ2ljIGNvb2tpZSIpLCB0aGlzLnNpZ25hbEVycm9yXyhnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvci5CQURfUkVTUE9OU0UpKQogICAgICB9CiAgICB9ZWxzZSB7CiAgICAgIGlmKHRoaXMuYmFja0NoYW5uZWxSZXF1ZXN0XyA9PSByZXF1ZXN0ICYmIHRoaXMuY2xlYXJEZWFkQmFja2NoYW5uZWxUaW1lcl8oKSwgIWdvb2cuc3RyaW5nLmlzRW1wdHkocmVzcG9uc2VUZXh0KSkgewogICAgICAgIHRoaXMub25JbnB1dF8oZ29vZy5qc29uLnVuc2FmZVBhcnNlKHJlc3BvbnNlVGV4dCkpCiAgICAgIH0KICAgIH0KICB9Cn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5oYW5kbGVQb3N0UmVzcG9uc2VfID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRoYW5kbGVQb3N0UmVzcG9uc2VfJChyZXNwb25zZVZhbHVlcykgewogIGlmKDAgPT0gcmVzcG9uc2VWYWx1ZXNbMF0pIHsKICAgIHRoaXMuaGFuZGxlQmFja2NoYW5uZWxNaXNzaW5nXygpCiAgfWVsc2UgewogICAgdGhpcy5sYXN0UG9zdFJlc3BvbnNlQXJyYXlJZF8gPSByZXNwb25zZVZhbHVlc1sxXTsKICAgIHZhciBvdXRzdGFuZGluZ0FycmF5cyA9IHRoaXMubGFzdFBvc3RSZXNwb25zZUFycmF5SWRfIC0gdGhpcy5sYXN0QXJyYXlJZF87CiAgICBpZigwIDwgb3V0c3RhbmRpbmdBcnJheXMpIHsKICAgICAgdmFyIG51bU91dHN0YW5kaW5nQmFja2NoYW5uZWxCeXRlcyA9IHJlc3BvbnNlVmFsdWVzWzJdOwogICAgICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcobnVtT3V0c3RhbmRpbmdCYWNrY2hhbm5lbEJ5dGVzICsgIiBieXRlcyAoaW4gIiArIG91dHN0YW5kaW5nQXJyYXlzICsgIiBhcnJheXMpIGFyZSBvdXRzdGFuZGluZyBvbiB0aGUgQmFja0NoYW5uZWwiKTsKICAgICAgdGhpcy5zaG91bGRSZXRyeUJhY2tDaGFubmVsXyhudW1PdXRzdGFuZGluZ0JhY2tjaGFubmVsQnl0ZXMpICYmICF0aGlzLmRlYWRCYWNrQ2hhbm5lbFRpbWVySWRfICYmICh0aGlzLmRlYWRCYWNrQ2hhbm5lbFRpbWVySWRfID0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuc2V0VGltZW91dChnb29nLmJpbmQodGhpcy5vbkJhY2tDaGFubmVsRGVhZF8sIHRoaXMpLCAyICogZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuUlRUX0VTVElNQVRFKSkKICAgIH0KICB9Cn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5oYW5kbGVCYWNrY2hhbm5lbE1pc3NpbmdfID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRoYW5kbGVCYWNrY2hhbm5lbE1pc3NpbmdfJCgpIHsKICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoIlNlcnZlciBjbGFpbXMgb3VyIGJhY2tjaGFubmVsIGlzIG1pc3NpbmcuIik7CiAgaWYodGhpcy5iYWNrQ2hhbm5lbFRpbWVySWRfKSB7CiAgICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoIkJ1dCB3ZSBhcmUgY3VycmVudGx5IHN0YXJ0aW5nIHRoZSByZXF1ZXN0LiIpCiAgfWVsc2UgewogICAgaWYodGhpcy5iYWNrQ2hhbm5lbFJlcXVlc3RfKSB7CiAgICAgIGlmKHRoaXMuYmFja0NoYW5uZWxSZXF1ZXN0Xy5nZXRSZXF1ZXN0U3RhcnRUaW1lKCkgKyBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5SVFRfRVNUSU1BVEUgPCB0aGlzLmZvcndhcmRDaGFubmVsUmVxdWVzdF8uZ2V0UmVxdWVzdFN0YXJ0VGltZSgpKSB7CiAgICAgICAgdGhpcy5jbGVhckRlYWRCYWNrY2hhbm5lbFRpbWVyXygpLCB0aGlzLmJhY2tDaGFubmVsUmVxdWVzdF8uY2FuY2VsKCksIHRoaXMuYmFja0NoYW5uZWxSZXF1ZXN0XyA9IG51bGwKICAgICAgfWVsc2UgewogICAgICAgIHJldHVybgogICAgICB9CiAgICB9ZWxzZSB7CiAgICAgIHRoaXMuY2hhbm5lbERlYnVnXy53YXJuaW5nKCJXZSBkbyBub3QgaGF2ZSBhIEJhY2tDaGFubmVsIGVzdGFibGlzaGVkIikKICAgIH0KICAgIHRoaXMubWF5YmVSZXRyeUJhY2tDaGFubmVsXygpOwogICAgZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5U3RhdEV2ZW50KGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXQuQkFDS0NIQU5ORUxfTUlTU0lORykKICB9Cn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5zaG91bGRSZXRyeUJhY2tDaGFubmVsXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkc2hvdWxkUmV0cnlCYWNrQ2hhbm5lbF8kKG91dHN0YW5kaW5nQnl0ZXMpIHsKICByZXR1cm4gb3V0c3RhbmRpbmdCeXRlcyA8IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLk9VVFNUQU5ESU5HX0RBVEFfQkFDS0NIQU5ORUxfUkVUUllfQ1VUT0ZGICYmICF0aGlzLmlzQnVmZmVyZWQoKSAmJiAwID09IHRoaXMuYmFja0NoYW5uZWxSZXRyeUNvdW50Xwp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuY29ycmVjdEhvc3RQcmVmaXggPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGNvcnJlY3RIb3N0UHJlZml4JChzZXJ2ZXJIb3N0UHJlZml4KSB7CiAgcmV0dXJuIHRoaXMuYWxsb3dIb3N0UHJlZml4XyA/IHRoaXMuaGFuZGxlcl8gPyB0aGlzLmhhbmRsZXJfLmNvcnJlY3RIb3N0UHJlZml4KHNlcnZlckhvc3RQcmVmaXgpIDogc2VydmVySG9zdFByZWZpeCA6IG51bGwKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLm9uQmFja0NoYW5uZWxEZWFkXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkb25CYWNrQ2hhbm5lbERlYWRfJCgpIHsKICBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmRlYWRCYWNrQ2hhbm5lbFRpbWVySWRfKSAmJiAodGhpcy5kZWFkQmFja0NoYW5uZWxUaW1lcklkXyA9IG51bGwsIHRoaXMuYmFja0NoYW5uZWxSZXF1ZXN0Xy5jYW5jZWwoKSwgdGhpcy5iYWNrQ2hhbm5lbFJlcXVlc3RfID0gbnVsbCwgdGhpcy5tYXliZVJldHJ5QmFja0NoYW5uZWxfKCksIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLm5vdGlmeVN0YXRFdmVudChnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0LkJBQ0tDSEFOTkVMX0RFQUQpKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuY2xlYXJEZWFkQmFja2NoYW5uZWxUaW1lcl8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGNsZWFyRGVhZEJhY2tjaGFubmVsVGltZXJfJCgpIHsKICBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmRlYWRCYWNrQ2hhbm5lbFRpbWVySWRfKSAmJiAoZ29vZy5nbG9iYWwuY2xlYXJUaW1lb3V0KHRoaXMuZGVhZEJhY2tDaGFubmVsVGltZXJJZF8pLCB0aGlzLmRlYWRCYWNrQ2hhbm5lbFRpbWVySWRfID0gbnVsbCkKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuaXNGYXRhbEVycm9yXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCRpc0ZhdGFsRXJyb3JfJChlcnJvciwgc3RhdHVzQ29kZSkgewogIHJldHVybiBlcnJvciA9PSBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5VTktOT1dOX1NFU1NJT05fSUQgfHwgZXJyb3IgPT0gZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QuRXJyb3IuU1RBVFVTICYmIDAgPCBzdGF0dXNDb2RlCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5vblJlcXVlc3RDb21wbGV0ZSA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkb25SZXF1ZXN0Q29tcGxldGUkKHJlcXVlc3QpIHsKICB0aGlzLmNoYW5uZWxEZWJ1Z18uZGVidWcoIlJlcXVlc3QgY29tcGxldGUiKTsKICB2YXIgdHlwZTsKICBpZih0aGlzLmJhY2tDaGFubmVsUmVxdWVzdF8gPT0gcmVxdWVzdCkgewogICAgdGhpcy5jbGVhckRlYWRCYWNrY2hhbm5lbFRpbWVyXygpLCB0aGlzLmJhY2tDaGFubmVsUmVxdWVzdF8gPSBudWxsLCB0eXBlID0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuQ2hhbm5lbFR5cGVfLkJBQ0tfQ0hBTk5FTAogIH1lbHNlIHsKICAgIGlmKHRoaXMuZm9yd2FyZENoYW5uZWxSZXF1ZXN0XyA9PSByZXF1ZXN0KSB7CiAgICAgIHRoaXMuZm9yd2FyZENoYW5uZWxSZXF1ZXN0XyA9IG51bGwsIHR5cGUgPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5DaGFubmVsVHlwZV8uRk9SV0FSRF9DSEFOTkVMCiAgICB9ZWxzZSB7CiAgICAgIHJldHVybgogICAgfQogIH0KICB0aGlzLmxhc3RTdGF0dXNDb2RlXyA9IHJlcXVlc3QuZ2V0TGFzdFN0YXR1c0NvZGUoKTsKICBpZih0aGlzLnN0YXRlXyAhPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZS5DTE9TRUQpIHsKICAgIGlmKHJlcXVlc3QuZ2V0U3VjY2VzcygpKSB7CiAgICAgIGlmKHR5cGUgPT0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuQ2hhbm5lbFR5cGVfLkZPUldBUkRfQ0hBTk5FTCkgewogICAgICAgIHZhciBzaXplID0gcmVxdWVzdC5nZXRQb3N0RGF0YSgpID8gcmVxdWVzdC5nZXRQb3N0RGF0YSgpLmxlbmd0aCA6IDA7CiAgICAgICAgZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5VGltaW5nRXZlbnQoc2l6ZSwgZ29vZy5ub3coKSAtIHJlcXVlc3QuZ2V0UmVxdWVzdFN0YXJ0VGltZSgpLCB0aGlzLmZvcndhcmRDaGFubmVsUmV0cnlDb3VudF8pOwogICAgICAgIHRoaXMuZW5zdXJlRm9yd2FyZENoYW5uZWxfKCk7CiAgICAgICAgdGhpcy5wZW5kaW5nTWFwc18ubGVuZ3RoID0gMAogICAgICB9ZWxzZSB7CiAgICAgICAgdGhpcy5lbnN1cmVCYWNrQ2hhbm5lbF8oKQogICAgICB9CiAgICB9ZWxzZSB7CiAgICAgIHZhciBsYXN0RXJyb3IgPSByZXF1ZXN0LmdldExhc3RFcnJvcigpOwogICAgICBpZihnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5pc0ZhdGFsRXJyb3JfKGxhc3RFcnJvciwgdGhpcy5sYXN0U3RhdHVzQ29kZV8pKSB7CiAgICAgICAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJOb3QgcmV0cnlpbmcgZHVlIHRvIGVycm9yIHR5cGUiKQogICAgICB9ZWxzZSB7CiAgICAgICAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJNYXliZSByZXRyeWluZywgbGFzdCBlcnJvcjogIiArIGdvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LmVycm9yU3RyaW5nRnJvbUNvZGUobGFzdEVycm9yLCB0aGlzLmxhc3RTdGF0dXNDb2RlXykpOwogICAgICAgIGlmKHR5cGUgPT0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuQ2hhbm5lbFR5cGVfLkZPUldBUkRfQ0hBTk5FTCAmJiB0aGlzLm1heWJlUmV0cnlGb3J3YXJkQ2hhbm5lbF8ocmVxdWVzdCkgfHwgdHlwZSA9PSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5DaGFubmVsVHlwZV8uQkFDS19DSEFOTkVMICYmIHRoaXMubWF5YmVSZXRyeUJhY2tDaGFubmVsXygpKSB7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJFeGNlZWRlZCBtYXggbnVtYmVyIG9mIHJldHJpZXMiKQogICAgICB9CiAgICAgIHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiRXJyb3I6IEhUVFAgcmVxdWVzdCBmYWlsZWQiKTsKICAgICAgc3dpdGNoKGxhc3RFcnJvcikgewogICAgICAgIGNhc2UgZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QuRXJyb3IuTk9fREFUQToKICAgICAgICAgIHRoaXMuc2lnbmFsRXJyb3JfKGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkVycm9yLk5PX0RBVEEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvci5CQURfREFUQToKICAgICAgICAgIHRoaXMuc2lnbmFsRXJyb3JfKGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkVycm9yLkJBRF9EQVRBKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QuRXJyb3IuVU5LTk9XTl9TRVNTSU9OX0lEOgogICAgICAgICAgdGhpcy5zaWduYWxFcnJvcl8oZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXJyb3IuVU5LTk9XTl9TRVNTSU9OX0lEKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aGlzLnNpZ25hbEVycm9yXyhnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvci5SRVFVRVNUX0ZBSUxFRCkKICAgICAgfQogICAgfQogIH0KfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmdldFJldHJ5VGltZV8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGdldFJldHJ5VGltZV8kKHJldHJ5Q291bnQpIHsKICB2YXIgcmV0cnlUaW1lID0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuUkVUUllfREVMQVlfTVMgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5SRVRSWV9ERUxBWV9TRUVEKTsKICB0aGlzLmlzQWN0aXZlKCkgfHwgKHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiSW5hY3RpdmUgY2hhbm5lbCIpLCByZXRyeVRpbWUgKj0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuSU5BQ1RJVkVfQ0hBTk5FTF9SRVRSWV9GQUNUT1IpOwogIHJldHVybiByZXRyeVRpbWUgKj0gcmV0cnlDb3VudAp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUub25JbnB1dF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJG9uSW5wdXRfJChyZXNwQXJyYXkpIHsKICBmb3IodmFyIGJhdGNoID0gdGhpcy5oYW5kbGVyXyAmJiB0aGlzLmhhbmRsZXJfLmNoYW5uZWxIYW5kbGVNdWx0aXBsZUFycmF5cyA/IFtdIDogbnVsbCwgaSA9IDA7aSA8IHJlc3BBcnJheS5sZW5ndGg7aSsrKSB7CiAgICB2YXIgbmV4dEFycmF5ID0gcmVzcEFycmF5W2ldOwogICAgdGhpcy5sYXN0QXJyYXlJZF8gPSBuZXh0QXJyYXlbMF07CiAgICBuZXh0QXJyYXkgPSBuZXh0QXJyYXlbMV07CiAgICBpZih0aGlzLnN0YXRlXyA9PSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZS5PUEVOSU5HKSB7CiAgICAgIGlmKCJjIiA9PSBuZXh0QXJyYXlbMF0pIHsKICAgICAgICB0aGlzLnNpZF8gPSBuZXh0QXJyYXlbMV07CiAgICAgICAgdGhpcy5ob3N0UHJlZml4XyA9IHRoaXMuY29ycmVjdEhvc3RQcmVmaXgobmV4dEFycmF5WzJdKTsKICAgICAgICB2YXIgbmVnb3RpYXRlZFZlcnNpb24gPSBuZXh0QXJyYXlbM107CiAgICAgICAgdGhpcy5jaGFubmVsVmVyc2lvbl8gPSBnb29nLmlzRGVmQW5kTm90TnVsbChuZWdvdGlhdGVkVmVyc2lvbikgPyBuZWdvdGlhdGVkVmVyc2lvbiA6IDY7CiAgICAgICAgdGhpcy5zdGF0ZV8gPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZS5PUEVORUQ7CiAgICAgICAgdGhpcy5oYW5kbGVyXyAmJiB0aGlzLmhhbmRsZXJfLmNoYW5uZWxPcGVuZWQodGhpcyk7CiAgICAgICAgdGhpcy5iYWNrQ2hhbm5lbFVyaV8gPSB0aGlzLmdldEJhY2tDaGFubmVsVXJpKHRoaXMuaG9zdFByZWZpeF8sIHRoaXMucGF0aF8pOwogICAgICAgIHRoaXMuZW5zdXJlQmFja0NoYW5uZWxfKCkKICAgICAgfWVsc2UgewogICAgICAgICJzdG9wIiA9PSBuZXh0QXJyYXlbMF0gJiYgdGhpcy5zaWduYWxFcnJvcl8oZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXJyb3IuU1RPUCkKICAgICAgfQogICAgfWVsc2UgewogICAgICB0aGlzLnN0YXRlXyA9PSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0ZS5PUEVORUQgJiYgKCJzdG9wIiA9PSBuZXh0QXJyYXlbMF0gPyAoYmF0Y2ggJiYgYmF0Y2gubGVuZ3RoICYmICh0aGlzLmhhbmRsZXJfLmNoYW5uZWxIYW5kbGVNdWx0aXBsZUFycmF5cyh0aGlzLCBiYXRjaCksIGJhdGNoLmxlbmd0aCA9IDApLCB0aGlzLnNpZ25hbEVycm9yXyhnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvci5TVE9QKSkgOiAibm9vcCIgIT0gbmV4dEFycmF5WzBdICYmIGJhdGNoICYmIGJhdGNoLnB1c2gobmV4dEFycmF5KSwgdGhpcy5iYWNrQ2hhbm5lbFJldHJ5Q291bnRfID0gMCkKICAgIH0KICB9CiAgYmF0Y2ggJiYgYmF0Y2gubGVuZ3RoICYmIHRoaXMuaGFuZGxlcl8uY2hhbm5lbEhhbmRsZU11bHRpcGxlQXJyYXlzKHRoaXMsIGJhdGNoKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuZW5zdXJlSW5TdGF0ZV8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGVuc3VyZUluU3RhdGVfJCh2YXJfYXJncykgewogIGlmKCFnb29nLmFycmF5LmNvbnRhaW5zKGFyZ3VtZW50cywgdGhpcy5zdGF0ZV8pKSB7CiAgICB0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBjaGFubmVsIHN0YXRlOiAiICsgdGhpcy5zdGF0ZV8pOwogIH0KfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLnNpZ25hbEVycm9yXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkc2lnbmFsRXJyb3JfJChlcnJvcikgewogIHRoaXMuY2hhbm5lbERlYnVnXy5pbmZvKCJFcnJvciBjb2RlICIgKyBlcnJvcik7CiAgaWYoZXJyb3IgPT0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXJyb3IuUkVRVUVTVF9GQUlMRUQgfHwgZXJyb3IgPT0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXJyb3IuQkxPQ0tFRCkgewogICAgdmFyIGltYWdlVXJpID0gbnVsbDsKICAgIHRoaXMuaGFuZGxlcl8gJiYgKGltYWdlVXJpID0gdGhpcy5oYW5kbGVyXy5nZXROZXR3b3JrVGVzdEltYWdlVXJpKHRoaXMpKTsKICAgIGdvb2cubmV0LnRtcG5ldHdvcmsudGVzdEdvb2dsZUNvbShnb29nLmJpbmQodGhpcy50ZXN0R29vZ2xlQ29tQ2FsbGJhY2tfLCB0aGlzKSwgaW1hZ2VVcmkpCiAgfWVsc2UgewogICAgZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5U3RhdEV2ZW50KGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXQuRVJST1JfT1RIRVIpCiAgfQogIHRoaXMub25FcnJvcl8oZXJyb3IpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS50ZXN0R29vZ2xlQ29tQ2FsbGJhY2tfID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCR0ZXN0R29vZ2xlQ29tQ2FsbGJhY2tfJChuZXR3b3JrVXApIHsKICBuZXR3b3JrVXAgPyAodGhpcy5jaGFubmVsRGVidWdfLmluZm8oIlN1Y2Nlc3NmdWxseSBwaW5nZWQgZ29vZ2xlLmNvbSIpLCBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5ub3RpZnlTdGF0RXZlbnQoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdC5FUlJPUl9PVEhFUikpIDogKHRoaXMuY2hhbm5lbERlYnVnXy5pbmZvKCJGYWlsZWQgdG8gcGluZyBnb29nbGUuY29tIiksIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLm5vdGlmeVN0YXRFdmVudChnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0LkVSUk9SX05FVFdPUkspLCB0aGlzLm9uRXJyb3JfKGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkVycm9yLk5FVFdPUkspKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUub25FcnJvcl8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJG9uRXJyb3JfJChlcnJvcikgewogIHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiSHR0cENoYW5uZWw6IGVycm9yIC0gIiArIGVycm9yKTsKICB0aGlzLnN0YXRlXyA9IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXRlLkNMT1NFRDsKICB0aGlzLmhhbmRsZXJfICYmIHRoaXMuaGFuZGxlcl8uY2hhbm5lbEVycm9yKHRoaXMsIGVycm9yKTsKICB0aGlzLm9uQ2xvc2VfKCk7CiAgdGhpcy5jYW5jZWxSZXF1ZXN0c18oKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUub25DbG9zZV8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJG9uQ2xvc2VfJCgpIHsKICB0aGlzLnN0YXRlXyA9IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXRlLkNMT1NFRDsKICB0aGlzLmxhc3RTdGF0dXNDb2RlXyA9IC0xOwogIGlmKHRoaXMuaGFuZGxlcl8pIHsKICAgIGlmKDAgPT0gdGhpcy5wZW5kaW5nTWFwc18ubGVuZ3RoICYmIDAgPT0gdGhpcy5vdXRnb2luZ01hcHNfLmxlbmd0aCkgewogICAgICB0aGlzLmhhbmRsZXJfLmNoYW5uZWxDbG9zZWQodGhpcykKICAgIH1lbHNlIHsKICAgICAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJOdW1iZXIgb2YgdW5kZWxpdmVyZWQgbWFwcywgcGVuZGluZzogIiArIHRoaXMucGVuZGluZ01hcHNfLmxlbmd0aCArICIsIG91dGdvaW5nOiAiICsgdGhpcy5vdXRnb2luZ01hcHNfLmxlbmd0aCk7CiAgICAgIHZhciBjb3B5T2ZQZW5kaW5nTWFwcyA9IGdvb2cuYXJyYXkuY2xvbmUodGhpcy5wZW5kaW5nTWFwc18pLCBjb3B5T2ZVbmRlbGl2ZXJlZE1hcHMgPSBnb29nLmFycmF5LmNsb25lKHRoaXMub3V0Z29pbmdNYXBzXyk7CiAgICAgIHRoaXMucGVuZGluZ01hcHNfLmxlbmd0aCA9IDA7CiAgICAgIHRoaXMub3V0Z29pbmdNYXBzXy5sZW5ndGggPSAwOwogICAgICB0aGlzLmhhbmRsZXJfLmNoYW5uZWxDbG9zZWQodGhpcywgY29weU9mUGVuZGluZ01hcHMsIGNvcHlPZlVuZGVsaXZlcmVkTWFwcykKICAgIH0KICB9Cn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5nZXRGb3J3YXJkQ2hhbm5lbFVyaSA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkZ2V0Rm9yd2FyZENoYW5uZWxVcmkkKHBhdGgpIHsKICB2YXIgdXJpID0gdGhpcy5jcmVhdGVEYXRhVXJpKG51bGwsIHBhdGgpOwogIHRoaXMuY2hhbm5lbERlYnVnXy5kZWJ1ZygiR2V0Rm9yd2FyZENoYW5uZWxVcmk6ICIgKyB1cmkpOwogIHJldHVybiB1cmkKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwucHJvdG90eXBlLmdldEJhY2tDaGFubmVsVXJpID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRnZXRCYWNrQ2hhbm5lbFVyaSQoaG9zdFByZWZpeCwgcGF0aCkgewogIHZhciB1cmkgPSB0aGlzLmNyZWF0ZURhdGFVcmkodGhpcy5zaG91bGRVc2VTZWNvbmRhcnlEb21haW5zKCkgPyBob3N0UHJlZml4IDogbnVsbCwgcGF0aCk7CiAgdGhpcy5jaGFubmVsRGVidWdfLmRlYnVnKCJHZXRCYWNrQ2hhbm5lbFVyaTogIiArIHVyaSk7CiAgcmV0dXJuIHVyaQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuY3JlYXRlRGF0YVVyaSA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkY3JlYXRlRGF0YVVyaSQoaG9zdFByZWZpeCwgcGF0aCwgb3B0X292ZXJyaWRlUG9ydCkgewogIHZhciB1cmkgPSBnb29nLlVyaS5wYXJzZShwYXRoKSwgdXJpQWJzb2x1dGUgPSAiIiAhPSB1cmkuZ2V0RG9tYWluKCk7CiAgaWYodXJpQWJzb2x1dGUpIHsKICAgIGhvc3RQcmVmaXggJiYgdXJpLnNldERvbWFpbihob3N0UHJlZml4ICsgIi4iICsgdXJpLmdldERvbWFpbigpKSwgdXJpLnNldFBvcnQob3B0X292ZXJyaWRlUG9ydCB8fCB1cmkuZ2V0UG9ydCgpKQogIH1lbHNlIHsKICAgIHZhciBsb2NhdGlvblBhZ2UgPSB3aW5kb3cubG9jYXRpb24sIGhvc3ROYW1lOwogICAgaG9zdE5hbWUgPSBob3N0UHJlZml4ID8gaG9zdFByZWZpeCArICIuIiArIGxvY2F0aW9uUGFnZS5ob3N0bmFtZSA6IGxvY2F0aW9uUGFnZS5ob3N0bmFtZTsKICAgIHZhciBwb3J0ID0gb3B0X292ZXJyaWRlUG9ydCB8fCBsb2NhdGlvblBhZ2UucG9ydCwgdXJpID0gZ29vZy5VcmkuY3JlYXRlKGxvY2F0aW9uUGFnZS5wcm90b2NvbCwgbnVsbCwgaG9zdE5hbWUsIHBvcnQsIHBhdGgpCiAgfQogIHRoaXMuZXh0cmFQYXJhbXNfICYmIGdvb2cuc3RydWN0cy5mb3JFYWNoKHRoaXMuZXh0cmFQYXJhbXNfLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoa2V5LCB2YWx1ZSkKICB9KTsKICB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoIlZFUiIsIHRoaXMuY2hhbm5lbFZlcnNpb25fKTsKICB0aGlzLmFkZEFkZGl0aW9uYWxQYXJhbXNfKHVyaSk7CiAgcmV0dXJuIHVyaQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5wcm90b3R5cGUuY3JlYXRlWGhySW8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkJGNyZWF0ZVhocklvJChob3N0UHJlZml4KSB7CiAgaWYoaG9zdFByZWZpeCkgewogICAgdGhyb3cgRXJyb3IoIkNhbid0IGNyZWF0ZSBzZWNvbmRhcnkgZG9tYWluIGNhcGFibGUgWGhySW8gb2JqZWN0LiIpOwogIH0KICByZXR1cm4gbmV3IGdvb2cubmV0LlhocklvCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCQkaXNBY3RpdmUkKCkgewogIHJldHVybiEhdGhpcy5oYW5kbGVyXyAmJiB0aGlzLmhhbmRsZXJfLmlzQWN0aXZlKHRoaXMpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkc2V0VGltZW91dCQoZm4sIG1zKSB7CiAgaWYoIWdvb2cuaXNGdW5jdGlvbihmbikpIHsKICAgIHRocm93IEVycm9yKCJGbiBtdXN0IG5vdCBiZSBudWxsIGFuZCBtdXN0IGJlIGEgZnVuY3Rpb24iKTsKICB9CiAgcmV0dXJuIGdvb2cuZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5vblN0YXJ0RXhlY3V0aW9uKCk7CiAgICB0cnkgewogICAgICBmbigpCiAgICB9ZmluYWxseSB7CiAgICAgIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLm9uRW5kRXhlY3V0aW9uKCkKICAgIH0KICB9LCBtcykKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwub25TdGFydEV4ZWN1dGlvbiA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCRvblN0YXJ0RXhlY3V0aW9uJCgpIHsKICBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zdGFydEV4ZWN1dGlvbkhvb2tfKCkKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwub25FbmRFeGVjdXRpb24gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkb25FbmRFeGVjdXRpb24kKCkgewogIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLmVuZEV4ZWN1dGlvbkhvb2tfKCkKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuZ2V0U3RhdEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJGdldFN0YXRFdmVudFRhcmdldCQoKSB7CiAgcmV0dXJuIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnN0YXRFdmVudFRhcmdldF8KfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5U3RhdEV2ZW50ID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJG5vdGlmeVN0YXRFdmVudCQoc3RhdCkgewogIHZhciB0YXJnZXQgPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zdGF0RXZlbnRUYXJnZXRfOwogIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0RXZlbnQodGFyZ2V0LCBzdGF0KSkKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwubm90aWZ5VGltaW5nRXZlbnQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkbm90aWZ5VGltaW5nRXZlbnQkKHNpemUsIHJ0dCwgcmV0cmllcykgewogIHZhciB0YXJnZXQgPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5zdGF0RXZlbnRUYXJnZXRfOwogIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5UaW1pbmdFdmVudCh0YXJnZXQsIHNpemUsIHJ0dCwgcmV0cmllcykpCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLnByb3RvdHlwZS5zaG91bGRVc2VTZWNvbmRhcnlEb21haW5zID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJCRzaG91bGRVc2VTZWNvbmRhcnlEb21haW5zJCgpIHsKICByZXR1cm4hZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3Quc3VwcG9ydHNYaHJTdHJlYW1pbmcoKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5Mb2dTYXZlciA9IHt9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5Mb2dTYXZlci5idWZmZXJfID0gbmV3IGdvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcigxRTMpOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5Mb2dTYXZlci5lbmFibGVkXyA9ICExOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5Mb2dTYXZlci5mb3JtYXR0ZXJfID0gbmV3IGdvb2cuZGVidWcuVGV4dEZvcm1hdHRlcjsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuTG9nU2F2ZXIuaXNFbmFibGVkID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJExvZ1NhdmVyJGlzRW5hYmxlZCQoKSB7CiAgcmV0dXJuIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyLmVuYWJsZWRfCn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyLnNldEVuYWJsZWQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkTG9nU2F2ZXIkc2V0RW5hYmxlZCQoZW5hYmxlKSB7CiAgaWYoZW5hYmxlICE9IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyLmVuYWJsZWRfKSB7CiAgICB2YXIgZm4gPSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5Mb2dTYXZlci5hZGRMb2dSZWNvcmQsIGxvZ2dlciA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigiZ29vZy5uZXQiKTsKICAgIGVuYWJsZSA/IGxvZ2dlci5hZGRIYW5kbGVyKGZuKSA6IGxvZ2dlci5yZW1vdmVIYW5kbGVyKGZuKQogIH0KfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuTG9nU2F2ZXIuYWRkTG9nUmVjb3JkID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJExvZ1NhdmVyJGFkZExvZ1JlY29yZCQobG9nUmVjb3JkKSB7CiAgZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuTG9nU2F2ZXIuYnVmZmVyXy5hZGQoZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuTG9nU2F2ZXIuZm9ybWF0dGVyXy5mb3JtYXRSZWNvcmQobG9nUmVjb3JkKSkKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuTG9nU2F2ZXIuZ2V0QnVmZmVyID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJExvZ1NhdmVyJGdldEJ1ZmZlciQoKSB7CiAgcmV0dXJuIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyLmJ1ZmZlcl8uZ2V0VmFsdWVzKCkuam9pbigiIikKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuTG9nU2F2ZXIuY2xlYXJCdWZmZXIgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkTG9nU2F2ZXIkY2xlYXJCdWZmZXIkKCkgewogIGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyLmJ1ZmZlcl8uY2xlYXIoKQp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJEhhbmRsZXIkKCkgewp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyLnByb3RvdHlwZS5jaGFubmVsSGFuZGxlTXVsdGlwbGVBcnJheXMgPSBudWxsOwpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyLnByb3RvdHlwZS5va1RvTWFrZVJlcXVlc3QgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkSGFuZGxlciQkb2tUb01ha2VSZXF1ZXN0JCgpIHsKICByZXR1cm4gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXJyb3IuT0sKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuSGFuZGxlci5wcm90b3R5cGUuY2hhbm5lbE9wZW5lZCA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCRIYW5kbGVyJCRjaGFubmVsT3BlbmVkJCgpIHsKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuSGFuZGxlci5wcm90b3R5cGUuY2hhbm5lbEVycm9yID0gZnVuY3Rpb24gJGdvb2ckbmV0JEJyb3dzZXJDaGFubmVsJEhhbmRsZXIkJGNoYW5uZWxFcnJvciQoKSB7Cn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkhhbmRsZXIucHJvdG90eXBlLmNoYW5uZWxDbG9zZWQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkSGFuZGxlciQkY2hhbm5lbENsb3NlZCQoKSB7Cn07Cmdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkhhbmRsZXIucHJvdG90eXBlLmdldEFkZGl0aW9uYWxQYXJhbXMgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkSGFuZGxlciQkZ2V0QWRkaXRpb25hbFBhcmFtcyQoKSB7CiAgcmV0dXJue30KfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuSGFuZGxlci5wcm90b3R5cGUuZ2V0TmV0d29ya1Rlc3RJbWFnZVVyaSA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCRIYW5kbGVyJCRnZXROZXR3b3JrVGVzdEltYWdlVXJpJCgpIHsKICByZXR1cm4gbnVsbAp9Owpnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uICRnb29nJG5ldCRCcm93c2VyQ2hhbm5lbCRIYW5kbGVyJCRpc0FjdGl2ZSQoKSB7CiAgcmV0dXJuITAKfTsKZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuSGFuZGxlci5wcm90b3R5cGUuY29ycmVjdEhvc3RQcmVmaXggPSBmdW5jdGlvbiAkZ29vZyRuZXQkQnJvd3NlckNoYW5uZWwkSGFuZGxlciQkY29ycmVjdEhvc3RQcmVmaXgkKHNlcnZlckhvc3RQcmVmaXgpIHsKICByZXR1cm4gc2VydmVySG9zdFByZWZpeAp9OwpmYXZhLm5ldCA9IHt9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJChjaGFubmVsU2VydmljZSwgYmFzZVBhdGgsIGNsaWVudFZlcnNpb24sIG9wdF9jb25uZWN0aXZpdHlUZXN0VXJsLCBvcHRfYnJvd3NlckNoYW5uZWxGYWN0b3J5LCBvcHRfc2hvdWxkSGFuZGxlU2VydmVyRmxpcHMsIG9wdF9leHRyYUhlYWRlcnMpIHsKICB0aGlzLmNoYW5uZWxTZXJ2aWNlXyA9IGNoYW5uZWxTZXJ2aWNlOwogIHRoaXMuYmFzZVBhdGhfID0gYmFzZVBhdGg7CiAgdGhpcy5jb25uZWN0aXZpdHlUZXN0VXJsXyA9IG9wdF9jb25uZWN0aXZpdHlUZXN0VXJsIHx8IG51bGw7CiAgdGhpcy5wZW5kaW5nQXJyYXlzXyA9IG5ldyBnb29nLnN0cnVjdHMuUXVldWU7CiAgdGhpcy5xdWV1ZWRNYXBzXyA9IG5ldyBnb29nLnN0cnVjdHMuUXVldWU7CiAgdGhpcy5icm93c2VyQ2hhbm5lbEZhY3RvcnlfID0gb3B0X2Jyb3dzZXJDaGFubmVsRmFjdG9yeSB8fCBudWxsOwogIHRoaXMuY2hhbm5lbERlYnVnXyA9IG51bGw7CiAgdGhpcy5jbGllbnRWZXJzaW9uXyA9IGNsaWVudFZlcnNpb247CiAgdGhpcy5zdGF0ZV8gPSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLklOSVQ7CiAgdGhpcy5sYXN0RXJyb3JfID0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5FcnJvci5OT05FOwogIHRoaXMuY2hhbm5lbF8gPSB0aGlzLmNyZWF0ZUNoYW5uZWxfKHRoaXMuY2xpZW50VmVyc2lvbl8pOwogIHRoaXMuc2hvdWxkSGFuZGxlU2VydmVyRmxpcHNfID0gISFvcHRfc2hvdWxkSGFuZGxlU2VydmVyRmxpcHM7CiAgdGhpcy5leHRyYUhlYWRlcnNfID0gb3B0X2V4dHJhSGVhZGVycyA/IGdvb2cub2JqZWN0LmNsb25lKG9wdF9leHRyYUhlYWRlcnMpIDoge307CiAgdGhpcy5oZWFydEJlYXRUaW1lcl8gPSBuZXcgZmF2YS5jb3JlLlRpbWVyKCJCcm93c2VyQ2hhbm5lbCBoZWFydGJlYXQiLCBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIuSEVBUlRCRUFUX0lOVEVSVkFMX01TKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5oZWFydEJlYXRUaW1lcl8sIGdvb2cuVGltZXIuVElDSywgdGhpcy5kb0hlYXJ0YmVhdF8pOwogIHRoaXMuaGVhcnRCZWF0VGltZXJfLnN0YXJ0KCk7CiAgdGhpcy5yZXNldFJldHJ5VGltZV8oKTsKICB0aGlzLmNoYW5uZWxfLnNldEV4dHJhSGVhZGVycyh0aGlzLmV4dHJhSGVhZGVyc18pCn07Cmdvb2cuaW5oZXJpdHMoZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLCBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyKTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLkJJTkRfTUVTU0FHRSA9ICJiIjsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLkNMSUVOVF9WRVJTSU9OID0gIjgiOwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIuSU1NRURJQVRFX1JFVFJZX01TID0gNTAwOwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIuTUlOX1JFVFJZX01TID0gNUUzOwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIuUkVUUllfU0VFRCA9IDJFNDsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLk1BWF9SRVRSWV9NUyA9IDI0RTQ7CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5IRUFSVEJFQVRfSU5URVJWQUxfTVMgPSAxRTM7CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5XT0tFX0ZST01fU0xFRVBfVEhSRVNIT0xEX01TID0gMzAgKiBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIuSEVBUlRCRUFUX0lOVEVSVkFMX01TOwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIuTUFYX1RJTUVfUFJPQyA9IDUwMDsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLk1BWF9RVUVVRV9TSVpFID0gNUUzOwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoImZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlciIpOwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLm5leHRSZXRyeVRpbWVfID0gbnVsbDsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5sYXN0QXdha2VIZWFydEJlYXRUaW1lXyA9IDA7CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5wcm90b3R5cGUuaW1tZWRpYXRlUmV0cnlDaGFubmVsXyA9ICExOwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLnBhcmFtZXRlclByb3ZpZGVyc18gPSBbXTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsV3JhcHBlciQkZGlzcG9zZSQoKSB7CiAgZ29vZy5kaXNwb3NlKHRoaXMuZXZlbnRIYW5kbGVyXyk7CiAgdGhpcy5zdGF0ZV8gIT0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5JTklUICYmIHRoaXMuY2hhbm5lbF8uZGlzY29ubmVjdCgpOwogIHRoaXMuc3RhdGVfID0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5ESVNDT05ORUNURUQ7CiAgdGhpcy5wZW5kaW5nQXJyYXlzXy5jbGVhcigpOwogIHRoaXMuY2xlYXJSZXRyeVRpbWVyXygpOwogIHRoaXMuY2xlYXJQZW5kaW5nQXJyYXlzVGltZXJfKCk7CiAgdGhpcy5oZWFydEJlYXRUaW1lcl8uZGlzcG9zZSgpCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRnZXRTdGF0ZSQoKSB7CiAgcmV0dXJuIHRoaXMuZmFraW5nT25saW5lXyA/IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3RhdGUuQk9VTkQgOiB0aGlzLnN0YXRlXwp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmdldEVycm9yID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsV3JhcHBlciQkZ2V0RXJyb3IkKCkgewogIHJldHVybiB0aGlzLmxhc3RFcnJvcl8KfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5nZXROZXh0UmV0cnlUaW1lID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsV3JhcHBlciQkZ2V0TmV4dFJldHJ5VGltZSQoKSB7CiAgcmV0dXJuIHRoaXMubmV4dFJldHJ5VGltZV8KfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5jaGFubmVsSGFuZGxlTXVsdGlwbGVBcnJheXMgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRjaGFubmVsSGFuZGxlTXVsdGlwbGVBcnJheXMkKGNoYW5uZWwsIHJlc3BBcnJheXMpIHsKICBpZihjaGFubmVsID09IHRoaXMuY2hhbm5lbF8pIHsKICAgIGZvcih2YXIgaSA9IDA7aSA8IHJlc3BBcnJheXMubGVuZ3RoO2krKykgewogICAgICB0aGlzLnBlbmRpbmdBcnJheXNfLmVucXVldWUocmVzcEFycmF5c1tpXSkKICAgIH0KICAgIHRoaXMucHJvY2Vzc0FycmF5c18oKQogIH0KfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5wcm9jZXNzQXJyYXlzXyA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFdyYXBwZXIkJHByb2Nlc3NBcnJheXNfJCgpIHsKICB0aGlzLmNsZWFyUGVuZGluZ0FycmF5c1RpbWVyXygpOwogIGZvcih2YXIgc3RhcnRUaW1lID0gZ29vZy5ub3coKSwgYXJyYXlJbmZvcyA9IFtdOyF0aGlzLnBlbmRpbmdBcnJheXNfLmlzRW1wdHkoKTspIHsKICAgIHZhciByZXNwQXJyYXkgPSB0aGlzLnBlbmRpbmdBcnJheXNfLmRlcXVldWUoKSwgYXJyYXlUaW1lID0gZ29vZy5ub3coKSwgYXJyYXlJbmZvID0gdGhpcy5oYW5kbGVBcnJheV8ocmVzcEFycmF5KSwgY3VycmVudFRpbWUgPSBnb29nLm5vdygpOwogICAgYXJyYXlJbmZvcy5wdXNoKFthcnJheUluZm8gKyAiOiIgKyAoY3VycmVudFRpbWUgLSBhcnJheVRpbWUpXSk7CiAgICBpZihjdXJyZW50VGltZSAtIHN0YXJ0VGltZSA+IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5NQVhfVElNRV9QUk9DKSB7CiAgICAgIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJUb29rIHRvbyBsb25nIGhhbmRsaW5nIGFycmF5czogIiArIGdvb2cuc3RyaW5nLnRydW5jYXRlKGFycmF5SW5mb3Muam9pbigiLCIpLCAxMDI0KSk7CiAgICAgIGJyZWFrCiAgICB9CiAgfQogIHRoaXMucGVuZGluZ0FycmF5c18uaXNFbXB0eSgpIHx8ICh0aGlzLmxvZ2dlcl8uaW5mbygiRGVsYXlpbmcgYXJyYXkgaGFuZGxpbmciKSwgdGhpcy5wZW5kaW5nQXJyYXlzVGltZXJJZF8gPSBmYXZhLmNvcmUuVGltZXIuY2FsbE9uY2UoImZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlciIsIHRoaXMucHJvY2Vzc0FycmF5c18sIDAsIHRoaXMpKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmhhbmRsZUFycmF5XyA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFdyYXBwZXIkJGhhbmRsZUFycmF5XyQocmVzcEFycmF5KSB7CiAgdmFyIGRlYnVnU3RyaW5nID0gcmVzcEFycmF5WzBdLCB0cmFjZXIgPSBnb29nLmRlYnVnLlRyYWNlLnN0YXJ0VHJhY2VyKCJCcm93c2VyQ2hhbm5lbFNlcnZpY2VzLmhhbmRsZUFycmF5XyIpOwogIGlmKDAgPj0gcmVzcEFycmF5Lmxlbmd0aCkgewogICAgdGhpcy5sb2dnZXJfLndhcm5pbmcoIkdvdCBlbXB0eSBhcnJheSIpCiAgfWVsc2UgewogICAgaWYodGhpcy5zdGF0ZV8gPT0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5DT05ORUNURUQgJiYgcmVzcEFycmF5WzBdID09IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5CSU5EX01FU1NBR0UpIHsKICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkJPVU5EKQogICAgfWVsc2UgewogICAgICBpZih0aGlzLnN0YXRlXyA9PSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkJPVU5EKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBzdWJDaGFubmVsVHlwZSA9IHJlc3BBcnJheVswXSwgc3ViQ2hhbm5lbCA9IHRoaXMuY2hhbm5lbFNlcnZpY2VfLmdldFN1YkNoYW5uZWxPck51bGwoc3ViQ2hhbm5lbFR5cGUpOwogICAgICAgICAgaWYoc3ViQ2hhbm5lbCAmJiBnb29nLmlzQXJyYXkocmVzcEFycmF5WzFdKSkgewogICAgICAgICAgICB2YXIgZGF0YUFycmF5ID0gcmVzcEFycmF5WzFdOwogICAgICAgICAgICBzdWJDaGFubmVsLmRpc3BhdGNoRXZlbnQobmV3IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3ViQ2hhbm5lbC5SZXNwb25zZVJlY2VpdmVkRXZlbnQoZGF0YUFycmF5KSk7CiAgICAgICAgICAgIGRlYnVnU3RyaW5nICs9ICItIiArIGRhdGFBcnJheVswXQogICAgICAgICAgfWVsc2UgewogICAgICAgICAgICB0aGlzLmxvZ2dlcl8ud2FybmluZygiVW5leHBlY3RlZCByZXNwb25zZSBhcnJheTogIiArIHJlc3BBcnJheSkKICAgICAgICAgIH0KICAgICAgICB9Y2F0Y2goZSkgewogICAgICAgICAgZmF2YS5kZWJ1Zy5FcnJvclJlcG9ydGVyLnJlcG9ydEV4Y2VwdGlvbigiQkMgZXJyb3IgaGFuZGxpbmcgYXJyYXkiLCBlKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnb29nLmRlYnVnLlRyYWNlLnN0b3BUcmFjZXIodHJhY2VyKTsKICByZXR1cm4gZGVidWdTdHJpbmcKfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5va1RvTWFrZVJlcXVlc3QgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRva1RvTWFrZVJlcXVlc3QkKCkgewogIHJldHVybiBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvci5PSwp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmNoYW5uZWxPcGVuZWQgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRjaGFubmVsT3BlbmVkJChjaGFubmVsKSB7CiAgY2hhbm5lbCA9PSB0aGlzLmNoYW5uZWxfICYmICh0aGlzLnJlc2V0UmV0cnlUaW1lXygpLCB0aGlzLmNoYW5nZVN0YXRlKGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3RhdGUuQ09OTkVDVEVEKSkKfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5jaGFubmVsRXJyb3IgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRjaGFubmVsRXJyb3IkKGNoYW5uZWwsIGVycm9yKSB7CiAgY2hhbm5lbCA9PSB0aGlzLmNoYW5uZWxfICYmICh0aGlzLmZha2luZ09ubGluZV8gPSAhMSwgZXJyb3IgPT0gZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuRXJyb3IuTE9HR0VEX09VVCA/IHRoaXMubGFzdEVycm9yXyA9IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuRXJyb3IuTE9HR0VEX09VVCA6IGVycm9yID09IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkVycm9yLlJFUVVFU1RfRkFJTEVEID8gdGhpcy5sYXN0RXJyb3JfID0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5FcnJvci5SRVFVRVNUX0ZBSUxFRCA6IGVycm9yID09IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkVycm9yLlVOS05PV05fU0VTU0lPTl9JRCA/IHRoaXMuc2hvdWxkSGFuZGxlU2VydmVyRmxpcHNfID8gKHRoaXMuc3RhdGVfID09IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3RhdGUuQk9VTkQgJiYgIXRoaXMuY2hlY2tKdXN0V29rZUZyb21TbGVlcF8oITApICYmICh0aGlzLmZha2luZ09ubGluZV8gPSAKICAhMCksIHRoaXMubGFzdEVycm9yXyA9IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuRXJyb3IuTk9ORSwgdGhpcy5pbW1lZGlhdGVSZXRyeUNoYW5uZWxfID0gITApIDogdGhpcy5sYXN0RXJyb3JfID0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5FcnJvci5SRVFVRVNUX0ZBSUxFRCA6IGVycm9yID09IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkVycm9yLk5FVFdPUksgPyB0aGlzLmxhc3RFcnJvcl8gPSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLkVycm9yLk5FVFdPUksgOiBlcnJvciA9PSBnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvci5TVE9QID8gdGhpcy5sYXN0RXJyb3JfID0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5FcnJvci5SRVFVRVNUX0ZBSUxFRCA6IGVycm9yID09IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLkVycm9yLkJMT0NLRUQgJiYgKHRoaXMubGFzdEVycm9yXyA9IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuRXJyb3IuQkxPQ0tFRCksIAogIHRoaXMuY2hlY2tKdXN0V29rZUZyb21TbGVlcF8oITApLCB0aGlzLmNoYW5nZVN0YXRlKGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3RhdGUuRVJST1IpKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmNoYW5uZWxDbG9zZWQgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRjaGFubmVsQ2xvc2VkJChjaGFubmVsLCBvcHRfcGVuZGluZ01hcHMsIG9wdF91bmRlbGl2ZXJlZE1hcHMpIHsKICBpZihjaGFubmVsID09IHRoaXMuY2hhbm5lbF8gJiYgdGhpcy5zdGF0ZV8gIT0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5FUlJPUiAmJiB0aGlzLnN0YXRlXyAhPSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLk9GRkxJTkUgJiYgKHRoaXMuZmFraW5nT25saW5lXyA9ICExLCB0aGlzLmNoYW5nZVN0YXRlKGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3RhdGUuRElTQ09OTkVDVEVEKSwgb3B0X3BlbmRpbmdNYXBzIHx8IG9wdF91bmRlbGl2ZXJlZE1hcHMpKSB7CiAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlXy5kaXNwYXRjaEV2ZW50KG5ldyBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlVuZGVsaXZlcmVkTWFwc0V2ZW50KG9wdF9wZW5kaW5nTWFwcyB8fCBudWxsLCBvcHRfdW5kZWxpdmVyZWRNYXBzIHx8IG51bGwpKQogIH0KfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5nZXRBZGRpdGlvbmFsUGFyYW1zID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsV3JhcHBlciQkZ2V0QWRkaXRpb25hbFBhcmFtcyQoY2hhbm5lbCkgewogIGlmKGNoYW5uZWwgIT0gdGhpcy5jaGFubmVsXykgewogICAgcmV0dXJue30KICB9CiAgZm9yKHZhciBwYXJhbXMgPSB7fSwgaSA9IDA7aSA8IHRoaXMucGFyYW1ldGVyUHJvdmlkZXJzXy5sZW5ndGg7aSsrKSB7CiAgICBwYXJhbXMgPSB0aGlzLnBhcmFtZXRlclByb3ZpZGVyc19baV0uYWRkQ2hhbm5lbFBhcmFtZXRlcnMocGFyYW1zKQogIH0KICByZXR1cm4gcGFyYW1zCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5wcm90b3R5cGUuZ2V0TmV0d29ya1Rlc3RJbWFnZVVyaSA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFdyYXBwZXIkJGdldE5ldHdvcmtUZXN0SW1hZ2VVcmkkKGNoYW5uZWwpIHsKICBpZihjaGFubmVsICE9IHRoaXMuY2hhbm5lbF8pIHsKICAgIHJldHVybiBudWxsCiAgfQogIGlmKHRoaXMuY29ubmVjdGl2aXR5VGVzdFVybF8pIHsKICAgIHZhciB1cmkgPSBuZXcgZ29vZy5VcmkodGhpcy5jb25uZWN0aXZpdHlUZXN0VXJsXyk7CiAgICB1cmkubWFrZVVuaXF1ZSgpOwogICAgcmV0dXJuIHVyaQogIH0KICByZXR1cm4gbnVsbAp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsV3JhcHBlciQkaXNBY3RpdmUkKCkgewogIHJldHVybiEwCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5wcm90b3R5cGUuY29ubmVjdE5vdyA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFdyYXBwZXIkJGNvbm5lY3ROb3ckKCkgewogIHRoaXMuY2xlYXJSZXRyeVRpbWVyXygpOwogIGlmKCF0aGlzLmJhc2VQYXRoXykgewogICAgdGhyb3cgRXJyb3IoIkJyb3dzZXJDaGFubmVsU2VydmljZXMuQ2hhbm5lbDogYmFzZSBwYXRoIG5vdCBzZXQiKTsKICB9CiAgdmFyIHRlc3RQYXRoID0gdGhpcy5iYXNlUGF0aF8gKyAidGVzdCIsIGNoYW5uZWxQYXRoID0gdGhpcy5iYXNlUGF0aF8gKyAiYmluZCI7CiAgaWYodGhpcy5zdGF0ZV8gIT0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5JTklUKSB7CiAgICAodGhpcy5jaGFubmVsXy5nZXRTdGF0ZSgpID09IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsLlN0YXRlLk9QRU5FRCB8fCB0aGlzLmNoYW5uZWxfLmhhc091dHN0YW5kaW5nUmVxdWVzdHMoKSkgJiYgdGhpcy5sb2dnZXJfLnNldmVyZSgiQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5DaGFubmVsOiB1bmV4cGVjdGVkIHJlY29ubmVjdCBzdGF0ZTogIiArIHRoaXMuY2hhbm5lbF8uZ2V0U3RhdGUoKSk7CiAgICB2YXIgb2xkU2Vzc2lvbklkID0gdGhpcy5jaGFubmVsXy5nZXRTZXNzaW9uSWQoKSwgb2xkQXJyYXlJZCA9IHRoaXMuY2hhbm5lbF8uZ2V0TGFzdEFycmF5SWQoKTsKICAgIHRoaXMuY2hhbm5lbF8gPSB0aGlzLmNyZWF0ZUNoYW5uZWxfKHRoaXMuY2xpZW50VmVyc2lvbl8pOwogICAgdGhpcy5jaGFubmVsXy5zZXRFeHRyYUhlYWRlcnModGhpcy5leHRyYUhlYWRlcnNfKTsKICAgIHRoaXMuY2hhbm5lbF8uY29ubmVjdCh0ZXN0UGF0aCwgY2hhbm5lbFBhdGgsIHt9LCBvbGRTZXNzaW9uSWQsIG9sZEFycmF5SWQpCiAgfWVsc2UgewogICAgdGhpcy5jaGFubmVsXy5jb25uZWN0KHRlc3RQYXRoLCBjaGFubmVsUGF0aCwge30pCiAgfQogIHRoaXMuY2hhbmdlU3RhdGUoZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5DT05ORUNUSU5HKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmNhblNlbmRNYXAgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRjYW5TZW5kTWFwJCgpIHsKICBzd2l0Y2godGhpcy5nZXRTdGF0ZSgpKSB7CiAgICBjYXNlIGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3RhdGUuSU5JVDoKICAgIDsKICAgIGNhc2UgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5DT05ORUNUSU5HOgogICAgOwogICAgY2FzZSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkNPTk5FQ1RFRDoKICAgIDsKICAgIGNhc2UgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5CT1VORDoKICAgICAgcmV0dXJuITA7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5uZXh0UmV0cnlUaW1lcklkXykKICB9Cn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5wcm90b3R5cGUuc2VuZE1hcCA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFdyYXBwZXIkJHNlbmRNYXAkKG1hcCwgb3B0X3ByaW9yaXR5KSB7CiAgaWYoIXRoaXMuY2FuU2VuZE1hcCgpKSB7CiAgICB0aHJvdyBFcnJvcigiQnJvd3NlckNoYW5uZWxTZXJ2aWNlczogVHJ5aW5nIHRvIHNlbmQgYSBtYXAgd2hpbGUgd2UgYXJlIGRpc2Nvbm5lY3RlZDogIiArIG1hcC50eXBlKTsKICB9CiAgdmFyIHByaW9yaXR5ID0gb3B0X3ByaW9yaXR5IHx8IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU2VuZFByaW9yaXR5Lk5PUk1BTDsKICBnb29nLmlzRGVmQW5kTm90TnVsbChtYXApICYmICh0aGlzLnF1ZXVlZE1hcHNfLmVucXVldWUobWFwKSwgdGhpcy5xdWV1ZWRNYXBzXy5nZXRDb3VudCgpID49IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5NQVhfUVVFVUVfU0laRSAmJiAodGhpcy5sb2dnZXJfLndhcm5pbmcoIkhpdCBtYXggcXVldWUgc2l6ZS4gRHJvcHBpbmcgQkMgbWVzc2FnZS4iKSwgdGhpcy5xdWV1ZWRNYXBzXy5kZXF1ZXVlKCkpKTsKICBpZih0aGlzLnN0YXRlXyA9PSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkJPVU5EICYmIHByaW9yaXR5ID09IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU2VuZFByaW9yaXR5Lk5PUk1BTCkgewogICAgZm9yKDshdGhpcy5xdWV1ZWRNYXBzXy5pc0VtcHR5KCk7KSB7CiAgICAgIHRoaXMuY2hhbm5lbF8uc2VuZE1hcCh0aGlzLnF1ZXVlZE1hcHNfLmRlcXVldWUoKSkKICAgIH0KICB9Cn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5wcm90b3R5cGUuY2hhbmdlU3RhdGUgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRjaGFuZ2VTdGF0ZSQobmV3U3RhdGUpIHsKICB2YXIgb2xkU3RhdGUgPSB0aGlzLnN0YXRlXzsKICBpZihuZXdTdGF0ZSA9PSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkVSUk9SKSB7CiAgICBvbGRTdGF0ZSAhPSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkVSUk9SICYmIHRoaXMuc2NoZWR1bGVSZXRyeUFmdGVyRXJyb3JfKCksIHRoaXMuc3RhdGVfID0gbmV3U3RhdGUKICB9ZWxzZSB7CiAgICBpZihvbGRTdGF0ZSAhPSBuZXdTdGF0ZSkgewogICAgICBzd2l0Y2godGhpcy5zdGF0ZV8gPSBuZXdTdGF0ZSwgbmV3U3RhdGUpIHsKICAgICAgICBjYXNlIGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3RhdGUuQk9VTkQ6CiAgICAgICAgICB0aGlzLmxhc3RFcnJvcl8gPSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLkVycm9yLk5PTkUsIHRoaXMuZmFraW5nT25saW5lXyA9ICExLCB0aGlzLnNlbmRNYXAobnVsbCksIHRoaXMuY2hhbm5lbFNlcnZpY2VfLmRpc3BhdGNoRXZlbnQoZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5FdmVudFR5cGUuU0VTU0lPTl9FU1RBQkxJU0hFRCkKICAgICAgfQogICAgfWVsc2UgewogICAgICByZXR1cm4KICAgIH0KICB9CiAgdGhpcy5mYWtpbmdPbmxpbmVfIHx8IHRoaXMuY2hhbm5lbFNlcnZpY2VfLmRpc3BhdGNoRXZlbnQobmV3IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3RhdGVDaGFuZ2VkRXZlbnQob2xkU3RhdGUsIG5ld1N0YXRlLCB0aGlzLmxhc3RFcnJvcl8pKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmNyZWF0ZUNoYW5uZWxfID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsV3JhcHBlciQkY3JlYXRlQ2hhbm5lbF8kKGNsaWVudFZlcnNpb24pIHsKICB2YXIgY2hhbm5lbDsKICBjaGFubmVsID0gdGhpcy5icm93c2VyQ2hhbm5lbEZhY3RvcnlfID8gdGhpcy5icm93c2VyQ2hhbm5lbEZhY3RvcnlfKGNsaWVudFZlcnNpb24pIDogbmV3IGdvb2cubmV0LkJyb3dzZXJDaGFubmVsKGNsaWVudFZlcnNpb24pOwogIHRoaXMuY2hhbm5lbERlYnVnXyAmJiB0aGlzLnNldENoYW5uZWxEZWJ1Zyh0aGlzLmNoYW5uZWxEZWJ1Z18pOwogIHRoaXMub25saW5lSGFuZGxlcl8gJiYgY2hhbm5lbC5zZXRPbmxpbmVIYW5kbGVyKHRoaXMub25saW5lSGFuZGxlcl8pOwogIGNoYW5uZWwuc2V0SGFuZGxlcih0aGlzKTsKICByZXR1cm4gY2hhbm5lbAp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmNsZWFyUmV0cnlUaW1lcl8gPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRjbGVhclJldHJ5VGltZXJfJCgpIHsKICBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLm5leHRSZXRyeVRpbWVySWRfKSAmJiAoZmF2YS5jb3JlLlRpbWVyLmNsZWFyKHRoaXMubmV4dFJldHJ5VGltZXJJZF8pLCB0aGlzLm5leHRSZXRyeVRpbWVySWRfID0gbnVsbCkKfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5jbGVhclBlbmRpbmdBcnJheXNUaW1lcl8gPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRjbGVhclBlbmRpbmdBcnJheXNUaW1lcl8kKCkgewogIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMucGVuZGluZ0FycmF5c1RpbWVySWRfKSAmJiAoZmF2YS5jb3JlLlRpbWVyLmNsZWFyKHRoaXMucGVuZGluZ0FycmF5c1RpbWVySWRfKSwgdGhpcy5wZW5kaW5nQXJyYXlzVGltZXJJZF8gPSBudWxsKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLnNjaGVkdWxlUmV0cnlBZnRlckVycm9yXyA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFdyYXBwZXIkJHNjaGVkdWxlUmV0cnlBZnRlckVycm9yXyQoKSB7CiAgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5FcnJvci5pc0F1dG9SZXRyeUVycm9yKHRoaXMubGFzdEVycm9yXykgJiYgKCF0aGlzLmltbWVkaWF0ZVJldHJ5Q2hhbm5lbF8gJiYgMiAqIHRoaXMucmV0cnlUaW1lXyA8IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5NQVhfUkVUUllfTVMgJiYgKHRoaXMucmV0cnlUaW1lXyAqPSAyKSwgdGhpcy5pbW1lZGlhdGVSZXRyeUNoYW5uZWxfICYmICh0aGlzLnJldHJ5VGltZV8gPSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIuSU1NRURJQVRFX1JFVFJZX01TKSwgdGhpcy5sb2dnZXJfLmluZm8oIlJldHJ5aW5nIGNvbm5lY3Rpb24gaW4gIiArIHRoaXMucmV0cnlUaW1lXyArICJtcyIpLCB0aGlzLm5leHRSZXRyeVRpbWVfID0gZ29vZy5ub3coKSArIHRoaXMucmV0cnlUaW1lXywgdGhpcy5jbGVhclJldHJ5VGltZXJfKCksIHRoaXMubmV4dFJldHJ5VGltZXJJZF8gPSBmYXZhLmNvcmUuVGltZXIuY2FsbE9uY2UoImZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMiLCAKICB0aGlzLnJldHJ5QWZ0ZXJFcnJvciwgdGhpcy5yZXRyeVRpbWVfLCB0aGlzKSkKfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5yZXRyeUFmdGVyRXJyb3IgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRyZXRyeUFmdGVyRXJyb3IkKCkgewogIHRoaXMubmV4dFJldHJ5VGltZV8gPSBudWxsOwogIGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3RhdGUuaXNSZWFkeUZvclJldHJ5KHRoaXMuc3RhdGVfKSAmJiAodGhpcy5pbW1lZGlhdGVSZXRyeUNoYW5uZWxfID0gITEsIHRoaXMuY2hhbm5lbF8gJiYgIXRoaXMuY2hhbm5lbF8uaGFzT3V0c3RhbmRpbmdSZXF1ZXN0cygpID8gdGhpcy5jb25uZWN0Tm93KCkgOiB0aGlzLnNjaGVkdWxlUmV0cnlBZnRlckVycm9yXygpKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLnJlc2V0UmV0cnlUaW1lXyA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFdyYXBwZXIkJHJlc2V0UmV0cnlUaW1lXyQoKSB7CiAgdGhpcy5yZXRyeVRpbWVfID0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLk1JTl9SRVRSWV9NUyArIE1hdGgucmFuZG9tKCkgKiBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIuUkVUUllfU0VFRAp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmRvSGVhcnRiZWF0XyA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFdyYXBwZXIkJGRvSGVhcnRiZWF0XyQoKSB7CiAgdGhpcy5jaGVja0p1c3RXb2tlRnJvbVNsZWVwXyghMSkgfHwgKHRoaXMubGFzdEF3YWtlSGVhcnRCZWF0VGltZV8gPSBnb29nLm5vdygpKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmNoZWNrSnVzdFdva2VGcm9tU2xlZXBfID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsV3JhcHBlciQkY2hlY2tKdXN0V29rZUZyb21TbGVlcF8kKGNsZWFyKSB7CiAgdmFyIGN1cnJUaW1lID0gZ29vZy5ub3coKSwganVzdFdva2VGcm9tU2xlZXAgPSAwIDwgdGhpcy5sYXN0QXdha2VIZWFydEJlYXRUaW1lXyAmJiBjdXJyVGltZSAtIHRoaXMubGFzdEF3YWtlSGVhcnRCZWF0VGltZV8gPiBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIuV09LRV9GUk9NX1NMRUVQX1RIUkVTSE9MRF9NUzsKICBjbGVhciAmJiAodGhpcy5sYXN0QXdha2VIZWFydEJlYXRUaW1lXyA9IGN1cnJUaW1lKTsKICByZXR1cm4ganVzdFdva2VGcm9tU2xlZXAKfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5hZGRQYXJhbWV0ZXJQcm92aWRlciA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFdyYXBwZXIkJGFkZFBhcmFtZXRlclByb3ZpZGVyJChwcm92aWRlcikgewogIGdvb2cuYXJyYXkuaW5zZXJ0KHRoaXMucGFyYW1ldGVyUHJvdmlkZXJzXywgcHJvdmlkZXIpCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsV3JhcHBlci5wcm90b3R5cGUucmVtb3ZlUGFyYW1ldGVyUHJvdmlkZXIgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRyZW1vdmVQYXJhbWV0ZXJQcm92aWRlciQocHJvdmlkZXIpIHsKICBnb29nLmFycmF5LnJlbW92ZSh0aGlzLnBhcmFtZXRlclByb3ZpZGVyc18sIHByb3ZpZGVyKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLmdldENoYW5uZWwgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxXcmFwcGVyJCRnZXRDaGFubmVsJCgpIHsKICByZXR1cm4gdGhpcy5jaGFubmVsXwp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIucHJvdG90eXBlLnNldENoYW5uZWxEZWJ1ZyA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFdyYXBwZXIkJHNldENoYW5uZWxEZWJ1ZyQoY2hhbm5lbERlYnVnKSB7CiAgdGhpcy5jaGFubmVsRGVidWdfID0gY2hhbm5lbERlYnVnOwogIHRoaXMuY2hhbm5lbF8gJiYgKGNoYW5uZWxEZWJ1ZyA/IHRoaXMuY2hhbm5lbF8uc2V0Q2hhbm5lbERlYnVnKGNoYW5uZWxEZWJ1ZykgOiB0aGlzLmNoYW5uZWxfLnNldENoYW5uZWxEZWJ1ZyhuZXcgZ29vZy5uZXQuQ2hhbm5lbERlYnVnKSkKfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxXcmFwcGVyLnByb3RvdHlwZS5zZXRPbmxpbmVIYW5kbGVyID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsV3JhcHBlciQkc2V0T25saW5lSGFuZGxlciQob25saW5lSGFuZGxlcikgewogIHRoaXMuY2hhbm5lbF8gJiYgdGhpcy5jaGFubmVsXy5zZXRPbmxpbmVIYW5kbGVyKG9ubGluZUhhbmRsZXIpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4ob25saW5lSGFuZGxlciwgZ29vZy5ldmVudHMuT25saW5lSGFuZGxlci5FdmVudFR5cGUuT05MSU5FLCB0aGlzLnJldHJ5QWZ0ZXJFcnJvcikKfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFNlcnZpY2VzJChiYXNlUGF0aCwgY2xpZW50VmVyc2lvbiwgb3B0X2Nvbm5lY3Rpdml0eVRlc3RVcmwsIG9wdF9icm93c2VyQ2hhbm5lbEZhY3RvcnksIG9wdF9zaG91bGRIYW5kbGVTZXJ2ZXJGbGlwcywgb3B0X2V4dHJhSGVhZGVycykgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5zdWJDaGFubmVsc18gPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcDsKICB0aGlzLmNoYW5uZWxXcmFwcGVyXyA9IG5ldyBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFdyYXBwZXIodGhpcywgYmFzZVBhdGgsIGNsaWVudFZlcnNpb24sIG9wdF9jb25uZWN0aXZpdHlUZXN0VXJsLCBvcHRfYnJvd3NlckNoYW5uZWxGYWN0b3J5LCBvcHRfc2hvdWxkSGFuZGxlU2VydmVyRmxpcHMsIG9wdF9leHRyYUhlYWRlcnMpCn07Cmdvb2cuaW5oZXJpdHMoZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcywgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlBhcmFtZXRlclByb3ZpZGVyID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsU2VydmljZXMkUGFyYW1ldGVyUHJvdmlkZXIkKCkgewp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlBhcmFtZXRlclByb3ZpZGVyLnByb3RvdHlwZS5hZGRDaGFubmVsUGFyYW1ldGVycyA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFNlcnZpY2VzJFBhcmFtZXRlclByb3ZpZGVyJCRhZGRDaGFubmVsUGFyYW1ldGVycyQoKSB7Cn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3ViQ2hhbm5lbCA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFNlcnZpY2VzJFN1YkNoYW5uZWwkKGNoYW5uZWxTZXJ2aWNlLCB0eXBlKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLnR5cGVfID0gdHlwZTsKICB0aGlzLmNoYW5uZWxTZXJ2aWNlXyA9IGNoYW5uZWxTZXJ2aWNlCn07Cmdvb2cuaW5oZXJpdHMoZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdWJDaGFubmVsLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3ViQ2hhbm5lbC5FdmVudFR5cGUgPSB7UkVTUE9OU0VfUkVDRUlWRUQ6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInJlc3BvbnNlcmVjZWl2ZWQiKX07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3ViQ2hhbm5lbC5SZXNwb25zZVJlY2VpdmVkRXZlbnQgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyRTdWJDaGFubmVsJFJlc3BvbnNlUmVjZWl2ZWRFdmVudCQocmVzcG9uc2VBcnJheSkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdWJDaGFubmVsLkV2ZW50VHlwZS5SRVNQT05TRV9SRUNFSVZFRCk7CiAgdGhpcy5yZXNwb25zZUFycmF5ID0gcmVzcG9uc2VBcnJheQp9Owpnb29nLmluaGVyaXRzKGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU3ViQ2hhbm5lbC5SZXNwb25zZVJlY2VpdmVkRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdWJDaGFubmVsLnByb3RvdHlwZS5nZXRUeXBlID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsU2VydmljZXMkU3ViQ2hhbm5lbCQkZ2V0VHlwZSQoKSB7CiAgcmV0dXJuIHRoaXMudHlwZV8KfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdWJDaGFubmVsLnByb3RvdHlwZS5jYW5TZW5kTWFwID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsU2VydmljZXMkU3ViQ2hhbm5lbCQkY2FuU2VuZE1hcCQoKSB7CiAgcmV0dXJuIHRoaXMuY2hhbm5lbFNlcnZpY2VfLmNhblNlbmRNYXAoKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN1YkNoYW5uZWwucHJvdG90eXBlLnNlbmRNYXAgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyRTdWJDaGFubmVsJCRzZW5kTWFwJChtYXAsIG9wdF9wcmlvcml0eSkgewogIHRoaXMuY2hhbm5lbFNlcnZpY2VfLnNlbmRNYXAodGhpcywgbWFwLCBvcHRfcHJpb3JpdHkpCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuRXZlbnRUeXBlID0ge1NUQVRFX0NIQU5HRUQ6Z29vZy5ldmVudHMuZ2V0VW5pcXVlSWQoInN0YXRlY2hhbmdlZCIpLCBTRVNTSU9OX0VTVEFCTElTSEVEOmdvb2cuZXZlbnRzLmdldFVuaXF1ZUlkKCJzZXNzaW9uZXN0YWJsaXNoZWQiKSwgVU5ERUxJVkVSRURfTUFQUzpnb29nLmV2ZW50cy5nZXRVbmlxdWVJZCgidW5kZWxpdmVyZWRtYXBzIil9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlID0ge0lOSVQ6LTEsIERJU0NPTk5FQ1RFRDoxLCBDT05ORUNUSU5HOjIsIENPTk5FQ1RFRDozLCBCT1VORDo0LCBFUlJPUjo1LCBPRkZMSU5FOjZ9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLmdldE5hbWUgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyRTdGF0ZSRnZXROYW1lJChzdGF0ZSkgewogIHN3aXRjaChzdGF0ZSkgewogICAgY2FzZSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLklOSVQ6CiAgICAgIHJldHVybiJJTklUIjsKICAgIGNhc2UgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5ESVNDT05ORUNURUQ6CiAgICAgIHJldHVybiJESVNDT05ORUNURUQiOwogICAgY2FzZSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkNPTk5FQ1RJTkc6CiAgICAgIHJldHVybiJDT05ORUNUSU5HIjsKICAgIGNhc2UgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5DT05ORUNURUQ6CiAgICAgIHJldHVybiJDT05ORUNURUQiOwogICAgY2FzZSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkJPVU5EOgogICAgICByZXR1cm4iQk9VTkQiOwogICAgY2FzZSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkVSUk9SOgogICAgICByZXR1cm4iRVJST1IiOwogICAgY2FzZSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLk9GRkxJTkU6CiAgICAgIHJldHVybiJPRkZMSU5FIjsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiJVTkRFRklORUQiCiAgfQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLmlzUmVhZHlGb3JSZXRyeSA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFNlcnZpY2VzJFN0YXRlJGlzUmVhZHlGb3JSZXRyeSQoc3RhdGUpIHsKICByZXR1cm4gc3RhdGUgPT0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5ESVNDT05ORUNURUQgfHwgc3RhdGUgPT0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5FUlJPUiB8fCBzdGF0ZSA9PSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLk9GRkxJTkUKfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5FcnJvciA9IHtOT05FOjAsIExPR0dFRF9PVVQ6MSwgUkVRVUVTVF9GQUlMRUQ6MiwgTkVUV09SSzozLCBCTE9DS0VEOjR9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLkVycm9yLmlzQXV0b1JldHJ5RXJyb3IgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyRFcnJvciRpc0F1dG9SZXRyeUVycm9yJChlcnJvcikgewogIHJldHVybiBlcnJvciAhPSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLkVycm9yLkxPR0dFRF9PVVQgJiYgZXJyb3IgIT0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5FcnJvci5CTE9DS0VECn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuRXJyb3IuaXNQZXJtYW5lbnRFcnJvciA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFNlcnZpY2VzJEVycm9yJGlzUGVybWFuZW50RXJyb3IkKGVycm9yKSB7CiAgcmV0dXJuIGVycm9yID09IGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuRXJyb3IuTE9HR0VEX09VVAp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlNlbmRQcmlvcml0eSA9IHtOT1JNQUw6MSwgTE9XOjJ9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlQ2hhbmdlZEV2ZW50ID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsU2VydmljZXMkU3RhdGVDaGFuZ2VkRXZlbnQkKG9sZFN0YXRlLCBuZXdTdGF0ZSwgZXJyb3IpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuRXZlbnRUeXBlLlNUQVRFX0NIQU5HRUQpOwogIHRoaXMub2xkU3RhdGUgPSBvbGRTdGF0ZTsKICB0aGlzLm5ld1N0YXRlID0gbmV3U3RhdGU7CiAgdGhpcy5lcnJvciA9IGVycm9yCn07Cmdvb2cuaW5oZXJpdHMoZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZUNoYW5nZWRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlVuZGVsaXZlcmVkTWFwc0V2ZW50ID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsU2VydmljZXMkVW5kZWxpdmVyZWRNYXBzRXZlbnQkKCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5FdmVudFR5cGUuVU5ERUxJVkVSRURfTUFQUykKfTsKZ29vZy5pbmhlcml0cyhmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlVuZGVsaXZlcmVkTWFwc0V2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU1VCQ0hBTk5FTF9UWVBFX0tFWSA9ICJfc2MiOwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzIik7CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuZ2V0ID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsU2VydmljZXMkZ2V0JChhcHBDb250ZXh0KSB7CiAgcmV0dXJuIGFwcENvbnRleHQuZ2V0KGZhdmEuc2VydmljZXMuQlJPV1NFUl9DSEFOTkVMKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLnJlZ2lzdGVyID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsU2VydmljZXMkcmVnaXN0ZXIkKGFwcENvbnRleHQsIGJhc2VQYXRoLCBjbGllbnRWZXJzaW9uLCBvcHRfY29ubmVjdGl2aXR5VGVzdFVybCwgb3B0X2Jyb3dzZXJDaGFubmVsRmFjdG9yeSwgb3B0X3Nob3VsZEhhbmRsZVNlcnZlckZsaXBzLCBvcHRfZXh0cmFIZWFkZXJzKSB7CiAgdmFyIHNlcnZpY2UgPSBuZXcgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyhiYXNlUGF0aCwgY2xpZW50VmVyc2lvbiwgb3B0X2Nvbm5lY3Rpdml0eVRlc3RVcmwsIG9wdF9icm93c2VyQ2hhbm5lbEZhY3RvcnksIG9wdF9zaG91bGRIYW5kbGVTZXJ2ZXJGbGlwcywgb3B0X2V4dHJhSGVhZGVycyk7CiAgYXBwQ29udGV4dC5yZWdpc3RlclNlcnZpY2UoZmF2YS5zZXJ2aWNlcy5CUk9XU0VSX0NIQU5ORUwsIHNlcnZpY2UpOwogIHJldHVybiBzZXJ2aWNlCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFNlcnZpY2VzJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5jaGFubmVsV3JhcHBlcl8uZGlzcG9zZSgpOwogIGZvcih2YXIgc3ViQ2hhbm5lbHMgPSB0aGlzLnN1YkNoYW5uZWxzXy5nZXRWYWx1ZXMoKSwgaSA9IDA7aSA8IHN1YkNoYW5uZWxzLmxlbmd0aDtpKyspIHsKICAgIHN1YkNoYW5uZWxzW2ldLmRpc3Bvc2UoKQogIH0KICB0aGlzLnN1YkNoYW5uZWxzXy5jbGVhcigpCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMucHJvdG90eXBlLmdldFN1YkNoYW5uZWwgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyQkZ2V0U3ViQ2hhbm5lbCQodHlwZSkgewogIHZhciBzdWJDaGFubmVsID0gdGhpcy5zdWJDaGFubmVsc18uZ2V0KHR5cGUpOwogIHN1YkNoYW5uZWwgfHwgKHN1YkNoYW5uZWwgPSBuZXcgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdWJDaGFubmVsKHRoaXMsIHR5cGUpLCB0aGlzLnN1YkNoYW5uZWxzXy5zZXQodHlwZSwgc3ViQ2hhbm5lbCkpOwogIHJldHVybiBzdWJDaGFubmVsCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMucHJvdG90eXBlLmdldFN1YkNoYW5uZWxPck51bGwgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyQkZ2V0U3ViQ2hhbm5lbE9yTnVsbCQodHlwZSkgewogIHJldHVybiB0aGlzLnN1YkNoYW5uZWxzXy5nZXQodHlwZSkKfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5wcm90b3R5cGUuYWRkUGFyYW1ldGVyUHJvdmlkZXIgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyQkYWRkUGFyYW1ldGVyUHJvdmlkZXIkKHByb3ZpZGVyKSB7CiAgdGhpcy5jaGFubmVsV3JhcHBlcl8uYWRkUGFyYW1ldGVyUHJvdmlkZXIocHJvdmlkZXIpCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMucHJvdG90eXBlLnJlbW92ZVBhcmFtZXRlclByb3ZpZGVyID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsU2VydmljZXMkJHJlbW92ZVBhcmFtZXRlclByb3ZpZGVyJChwcm92aWRlcikgewogIHRoaXMuY2hhbm5lbFdyYXBwZXJfLnJlbW92ZVBhcmFtZXRlclByb3ZpZGVyKHByb3ZpZGVyKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsU2VydmljZXMkJGNvbm5lY3QkKCkgewogIHRoaXMuZ2V0U3RhdGUoKSA9PSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLklOSVQgJiYgdGhpcy5jaGFubmVsV3JhcHBlcl8uY29ubmVjdE5vdygpCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyQkZGlzY29ubmVjdCQoKSB7CiAgdGhpcy5jaGFubmVsV3JhcHBlcl8uZ2V0Q2hhbm5lbCgpLmRpc2Nvbm5lY3QoKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLnByb3RvdHlwZS5nZXRTZXNzaW9uSWQgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyQkZ2V0U2Vzc2lvbklkJCgpIHsKICByZXR1cm4gdGhpcy5jaGFubmVsV3JhcHBlcl8uZ2V0Q2hhbm5lbCgpLmdldFNlc3Npb25JZCgpCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMucHJvdG90eXBlLmNhblNlbmRNYXAgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyQkY2FuU2VuZE1hcCQoKSB7CiAgcmV0dXJuIHRoaXMuY2hhbm5lbFdyYXBwZXJfLmNhblNlbmRNYXAoKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLnByb3RvdHlwZS5zZW5kTWFwID0gZnVuY3Rpb24gJGZhdmEkbmV0JEJyb3dzZXJDaGFubmVsU2VydmljZXMkJHNlbmRNYXAkKHN1YkNoYW5uZWwsIG1hcCwgb3B0X3ByaW9yaXR5KSB7CiAgaWYoZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TVUJDSEFOTkVMX1RZUEVfS0VZIGluIG1hcCkgewogICAgdGhyb3cgRXJyb3IoInNlbmRNYXAgY2FsbGVkIHdpdGggcmVzZXJ2ZWQga2V5OiAiICsgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TVUJDSEFOTkVMX1RZUEVfS0VZKTsKICB9CiAgbWFwW2ZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuU1VCQ0hBTk5FTF9UWVBFX0tFWV0gPSBzdWJDaGFubmVsLmdldFR5cGUoKTsKICB0aGlzLmNoYW5uZWxXcmFwcGVyXy5zZW5kTWFwKG1hcCwgb3B0X3ByaW9yaXR5KQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFNlcnZpY2VzJCRnZXRTdGF0ZSQoKSB7CiAgcmV0dXJuIHRoaXMuY2hhbm5lbFdyYXBwZXJfLmdldFN0YXRlKCkKfTsKZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5wcm90b3R5cGUuZ2V0RXJyb3IgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyQkZ2V0RXJyb3IkKCkgewogIHJldHVybiB0aGlzLmNoYW5uZWxXcmFwcGVyXy5nZXRFcnJvcigpCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMucHJvdG90eXBlLmdldE5leHRSZXRyeVRpbWUgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyQkZ2V0TmV4dFJldHJ5VGltZSQoKSB7CiAgcmV0dXJuIHRoaXMuY2hhbm5lbFdyYXBwZXJfLmdldE5leHRSZXRyeVRpbWUoKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLnByb3RvdHlwZS5zZXRDaGFubmVsRGVidWcgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyQkc2V0Q2hhbm5lbERlYnVnJChjaGFubmVsRGVidWcpIHsKICB0aGlzLmNoYW5uZWxXcmFwcGVyXy5zZXRDaGFubmVsRGVidWcoY2hhbm5lbERlYnVnKQp9OwpmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLnByb3RvdHlwZS5nZXRMYXN0U3RhdHVzQ29kZSA9IGZ1bmN0aW9uICRmYXZhJG5ldCRCcm93c2VyQ2hhbm5lbFNlcnZpY2VzJCRnZXRMYXN0U3RhdHVzQ29kZSQoKSB7CiAgcmV0dXJuIHRoaXMuY2hhbm5lbFdyYXBwZXJfLmdldENoYW5uZWwoKS5nZXRMYXN0U3RhdHVzQ29kZSgpCn07CmZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMucHJvdG90eXBlLnNldE9ubGluZUhhbmRsZXIgPSBmdW5jdGlvbiAkZmF2YSRuZXQkQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyQkc2V0T25saW5lSGFuZGxlciQob25saW5lSGFuZGxlcikgewogIHRoaXMuY2hhbm5lbFdyYXBwZXJfLnNldE9ubGluZUhhbmRsZXIob25saW5lSGFuZGxlcikKfTsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJERlYnVnV2luZG93JChvcHRfaWRlbnRpZmllciwgb3B0X3ByZWZpeCkgewogIHRoaXMuaWRlbnRpZmllcl8gPSBvcHRfaWRlbnRpZmllciB8fCAiIjsKICB0aGlzLnByZWZpeF8gPSBvcHRfcHJlZml4IHx8ICIiOwogIHRoaXMub3V0cHV0QnVmZmVyXyA9IFtdOwogIHRoaXMuc2F2ZWRNZXNzYWdlc18gPSBuZXcgZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyKGdvb2cuZGVidWcuRGVidWdXaW5kb3cuTUFYX1NBVkVEKTsKICB0aGlzLnB1Ymxpc2hIYW5kbGVyXyA9IGdvb2cuYmluZCh0aGlzLmFkZExvZ1JlY29yZCwgdGhpcyk7CiAgdGhpcy5mb3JtYXR0ZXJfID0gbmV3IGdvb2cuZGVidWcuSHRtbEZvcm1hdHRlcih0aGlzLnByZWZpeF8pOwogIHRoaXMuZmlsdGVyZWRMb2dnZXJzXyA9IHt9OwogIHRoaXMuc2V0Q2FwdHVyaW5nKCEwKTsKICB0aGlzLmVuYWJsZWRfID0gZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5pc0VuYWJsZWQodGhpcy5pZGVudGlmaWVyXyk7CiAgZ29vZy5nbG9iYWwuc2V0SW50ZXJ2YWwoZ29vZy5iaW5kKHRoaXMuc2F2ZVdpbmRvd1Bvc2l0aW9uU2l6ZV8sIHRoaXMpLCA3NTAwKQp9Owpnb29nLmRlYnVnLkRlYnVnV2luZG93Lk1BWF9TQVZFRCA9IDUwMDsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5DT09LSUVfVElNRSA9IDI1OTJFNjsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5wcm90b3R5cGUud2VsY29tZU1lc3NhZ2UgPSAiTE9HR0lORyI7Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cucHJvdG90eXBlLmVuYWJsZU9uU2V2ZXJlXyA9ICExOwpnb29nLmRlYnVnLkRlYnVnV2luZG93LnByb3RvdHlwZS53aW5fID0gbnVsbDsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5wcm90b3R5cGUud2luT3BlbmluZ18gPSAhMTsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5wcm90b3R5cGUuaXNDYXB0dXJpbmdfID0gITE7Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cuc2hvd2VkQmxvY2tlZEFsZXJ0XyA9ICExOwpnb29nLmRlYnVnLkRlYnVnV2luZG93LnByb3RvdHlwZS5idWZmZXJUaW1lb3V0XyA9IG51bGw7Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cucHJvdG90eXBlLmxhc3RDYWxsXyA9IGdvb2cubm93KCk7Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyREZWJ1Z1dpbmRvdyQkaW5pdCQoKSB7CiAgdGhpcy5lbmFibGVkXyAmJiB0aGlzLm9wZW5XaW5kb3dfKCkKfTsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRGVidWdXaW5kb3ckJGlzRW5hYmxlZCQoKSB7CiAgcmV0dXJuIHRoaXMuZW5hYmxlZF8KfTsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5wcm90b3R5cGUuc2V0RW5hYmxlZCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJERlYnVnV2luZG93JCRzZXRFbmFibGVkJChlbmFibGUpIHsKICBpZih0aGlzLmVuYWJsZWRfID0gZW5hYmxlKSB7CiAgICB0aGlzLm9wZW5XaW5kb3dfKCksIHRoaXMud2luXyAmJiB0aGlzLndyaXRlSW5pdGlhbERvY3VtZW50XygpCiAgfQogIHRoaXMuc2V0Q29va2llXygiZW5hYmxlZCIsIGVuYWJsZSA/ICIxIiA6ICIwIikKfTsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5wcm90b3R5cGUuc2V0Q2FwdHVyaW5nID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRGVidWdXaW5kb3ckJHNldENhcHR1cmluZyQoY2FwdHVyaW5nKSB7CiAgaWYoY2FwdHVyaW5nICE9IHRoaXMuaXNDYXB0dXJpbmdfKSB7CiAgICB0aGlzLmlzQ2FwdHVyaW5nXyA9IGNhcHR1cmluZzsKICAgIHZhciByb290TG9nZ2VyID0gZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyLmdldFJvb3QoKTsKICAgIGNhcHR1cmluZyA/IHJvb3RMb2dnZXIuYWRkSGFuZGxlcih0aGlzLnB1Ymxpc2hIYW5kbGVyXykgOiByb290TG9nZ2VyLnJlbW92ZUhhbmRsZXIodGhpcy5wdWJsaXNoSGFuZGxlcl8pCiAgfQp9Owpnb29nLmRlYnVnLkRlYnVnV2luZG93LnByb3RvdHlwZS5oYXNBY3RpdmVXaW5kb3cgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyREZWJ1Z1dpbmRvdyQkaGFzQWN0aXZlV2luZG93JCgpIHsKICByZXR1cm4hIXRoaXMud2luXyAmJiAhdGhpcy53aW5fLmNsb3NlZAp9Owpnb29nLmRlYnVnLkRlYnVnV2luZG93LnByb3RvdHlwZS5jbGVhcl8gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyREZWJ1Z1dpbmRvdyQkY2xlYXJfJCgpIHsKICB0aGlzLnNhdmVkTWVzc2FnZXNfLmNsZWFyKCk7CiAgdGhpcy5oYXNBY3RpdmVXaW5kb3coKSAmJiB0aGlzLndyaXRlSW5pdGlhbERvY3VtZW50XygpCn07Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cucHJvdG90eXBlLmFkZExvZ1JlY29yZCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJERlYnVnV2luZG93JCRhZGRMb2dSZWNvcmQkKGxvZ1JlY29yZCkgewogIGlmKCF0aGlzLmZpbHRlcmVkTG9nZ2Vyc19bbG9nUmVjb3JkLmdldExvZ2dlck5hbWUoKV0pIHsKICAgIHZhciBodG1sID0gdGhpcy5mb3JtYXR0ZXJfLmZvcm1hdFJlY29yZChsb2dSZWNvcmQpOwogICAgdGhpcy53cml0ZV8oaHRtbCk7CiAgICB0aGlzLmVuYWJsZU9uU2V2ZXJlXyAmJiBsb2dSZWNvcmQuZ2V0TGV2ZWwoKS52YWx1ZSA+PSBnb29nLmRlYnVnLkxvZ2dlci5MZXZlbC5TRVZFUkUudmFsdWUgJiYgdGhpcy5zZXRFbmFibGVkKCEwKQogIH0KfTsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5wcm90b3R5cGUud3JpdGVfID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRGVidWdXaW5kb3ckJHdyaXRlXyQoaHRtbCkgewogIHRoaXMuZW5hYmxlZF8gPyAodGhpcy5vcGVuV2luZG93XygpLCB0aGlzLnNhdmVkTWVzc2FnZXNfLmFkZChodG1sKSwgdGhpcy53cml0ZVRvTG9nXyhodG1sKSkgOiB0aGlzLnNhdmVkTWVzc2FnZXNfLmFkZChodG1sKQp9Owpnb29nLmRlYnVnLkRlYnVnV2luZG93LnByb3RvdHlwZS53cml0ZVRvTG9nXyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJERlYnVnV2luZG93JCR3cml0ZVRvTG9nXyQoaHRtbCkgewogIHRoaXMub3V0cHV0QnVmZmVyXy5wdXNoKGh0bWwpOwogIGdvb2cuZ2xvYmFsLmNsZWFyVGltZW91dCh0aGlzLmJ1ZmZlclRpbWVvdXRfKTsKICA3NTAgPCBnb29nLm5vdygpIC0gdGhpcy5sYXN0Q2FsbF8gPyB0aGlzLndyaXRlQnVmZmVyVG9Mb2dfKCkgOiB0aGlzLmJ1ZmZlclRpbWVvdXRfID0gZ29vZy5nbG9iYWwuc2V0VGltZW91dChnb29nLmJpbmQodGhpcy53cml0ZUJ1ZmZlclRvTG9nXywgdGhpcyksIDI1MCkKfTsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5wcm90b3R5cGUud3JpdGVCdWZmZXJUb0xvZ18gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyREZWJ1Z1dpbmRvdyQkd3JpdGVCdWZmZXJUb0xvZ18kKCkgewogIHRoaXMubGFzdENhbGxfID0gZ29vZy5ub3coKTsKICBpZih0aGlzLmhhc0FjdGl2ZVdpbmRvdygpKSB7CiAgICB2YXIgYm9keSA9IHRoaXMud2luXy5kb2N1bWVudC5ib2R5LCBzY3JvbGwgPSBib2R5ICYmIDEwMCA+PSBib2R5LnNjcm9sbEhlaWdodCAtIChib2R5LnNjcm9sbFRvcCArIGJvZHkuY2xpZW50SGVpZ2h0KTsKICAgIHRoaXMud2luXy5kb2N1bWVudC53cml0ZSh0aGlzLm91dHB1dEJ1ZmZlcl8uam9pbigiIikpOwogICAgdGhpcy5vdXRwdXRCdWZmZXJfLmxlbmd0aCA9IDA7CiAgICBzY3JvbGwgJiYgdGhpcy53aW5fLnNjcm9sbFRvKDAsIDFFNikKICB9Cn07Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cucHJvdG90eXBlLndyaXRlU2F2ZWRNZXNzYWdlc18gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyREZWJ1Z1dpbmRvdyQkd3JpdGVTYXZlZE1lc3NhZ2VzXyQoKSB7CiAgZm9yKHZhciBtZXNzYWdlcyA9IHRoaXMuc2F2ZWRNZXNzYWdlc18uZ2V0VmFsdWVzKCksIGkgPSAwO2kgPCBtZXNzYWdlcy5sZW5ndGg7aSsrKSB7CiAgICB0aGlzLndyaXRlVG9Mb2dfKG1lc3NhZ2VzW2ldKQogIH0KfTsKZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdy5wcm90b3R5cGUub3BlbldpbmRvd18gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyREZWJ1Z1dpbmRvdyQkb3BlbldpbmRvd18kKCkgewogIGlmKCF0aGlzLmhhc0FjdGl2ZVdpbmRvdygpICYmICF0aGlzLndpbk9wZW5pbmdfKSB7CiAgICB2YXIgd2lucG9zID0gdGhpcy5nZXRDb29raWVfKCJkYmciLCAiMCwwLDgwMCw1MDAiKS5zcGxpdCgiLCIpLCB4ID0gTnVtYmVyKHdpbnBvc1swXSksIHkgPSBOdW1iZXIod2lucG9zWzFdKSwgdyA9IE51bWJlcih3aW5wb3NbMl0pLCBoID0gTnVtYmVyKHdpbnBvc1szXSk7CiAgICB0aGlzLndpbk9wZW5pbmdfID0gITA7CiAgICB0aGlzLndpbl8gPSB3aW5kb3cub3BlbigiIiwgdGhpcy5nZXRXaW5kb3dOYW1lXygpLCAid2lkdGg9IiArIHcgKyAiLGhlaWdodD0iICsgaCArICIsdG9vbGJhcj1ubyxyZXNpemFibGU9eWVzLHNjcm9sbGJhcnM9eWVzLGxlZnQ9IiArIHggKyAiLHRvcD0iICsgeSArICIsc3RhdHVzPW5vLHNjcmVlbng9IiArIHggKyAiLHNjcmVlbnk9IiArIHkpOwogICAgIXRoaXMud2luXyAmJiAhdGhpcy5zaG93ZWRCbG9ja2VkQWxlcnRfICYmIChhbGVydCgiTG9nZ2VyIHBvcHVwIHdhcyBibG9ja2VkIiksIHRoaXMuc2hvd2VkQmxvY2tlZEFsZXJ0XyA9ICEwKTsKICAgIHRoaXMud2luT3BlbmluZ18gPSAhMTsKICAgIHRoaXMud2luXyAmJiB0aGlzLndyaXRlSW5pdGlhbERvY3VtZW50XygpCiAgfQp9Owpnb29nLmRlYnVnLkRlYnVnV2luZG93LnByb3RvdHlwZS5nZXRXaW5kb3dOYW1lXyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJERlYnVnV2luZG93JCRnZXRXaW5kb3dOYW1lXyQoKSB7CiAgcmV0dXJuIGdvb2cudXNlckFnZW50LklFID8gdGhpcy5pZGVudGlmaWVyXy5yZXBsYWNlKC9bXHNcLVwuXCxdL2csICJfIikgOiB0aGlzLmlkZW50aWZpZXJfCn07Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cucHJvdG90eXBlLmdldFN0eWxlUnVsZXMgPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyREZWJ1Z1dpbmRvdyQkZ2V0U3R5bGVSdWxlcyQoKSB7CiAgcmV0dXJuIip7Zm9udDpub3JtYWwgMTRweCBtb25vc3BhY2U7fS5kYmctc2V2e2NvbG9yOiNGMDB9LmRiZy13e2NvbG9yOiNFOTJ9LmRiZy1zaHtiYWNrZ3JvdW5kLWNvbG9yOiNmZDQ7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojMDAwfS5kYmctaXtjb2xvcjojNjY2fS5kYmctZntjb2xvcjojOTk5fS5kYmctZXZ7Y29sb3I6IzBBMH0uZGJnLW17Y29sb3I6Izk5MH0iCn07Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cucHJvdG90eXBlLndyaXRlSW5pdGlhbERvY3VtZW50XyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJERlYnVnV2luZG93JCR3cml0ZUluaXRpYWxEb2N1bWVudF8kKCkgewogIGlmKCF0aGlzLmhhc0FjdGl2ZVdpbmRvdygpKSB7CiAgICB0aGlzLndpbl8uZG9jdW1lbnQub3BlbigpOwogICAgdmFyIGh0bWwgPSAiPHN0eWxlPiIgKyB0aGlzLmdldFN0eWxlUnVsZXMoKSArICc8L3N0eWxlPjxocj48ZGl2IGNsYXNzPSJkYmctZXYiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+JyArIHRoaXMud2VsY29tZU1lc3NhZ2UgKyAiPGJyPjxzbWFsbD5Mb2dnZXI6ICIgKyB0aGlzLmlkZW50aWZpZXJfICsgIjwvc21hbGw+PC9kaXY+PGhyPiI7CiAgICB0aGlzLndyaXRlVG9Mb2dfKGh0bWwpOwogICAgdGhpcy53cml0ZVNhdmVkTWVzc2FnZXNfKCkKICB9Cn07Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cucHJvdG90eXBlLnNldENvb2tpZV8gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyREZWJ1Z1dpbmRvdyQkc2V0Q29va2llXyQoa2V5LCB2YWx1ZSkgewogIGtleSArPSB0aGlzLmlkZW50aWZpZXJfOwogIGRvY3VtZW50LmNvb2tpZSA9IGtleSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgKyAiO3BhdGg9LztleHBpcmVzPSIgKyAobmV3IERhdGUoZ29vZy5ub3coKSArIGdvb2cuZGVidWcuRGVidWdXaW5kb3cuQ09PS0lFX1RJTUUpKS50b1VUQ1N0cmluZygpCn07Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cucHJvdG90eXBlLmdldENvb2tpZV8gPSBmdW5jdGlvbiAkZ29vZyRkZWJ1ZyREZWJ1Z1dpbmRvdyQkZ2V0Q29va2llXyQoa2V5LCBvcHRfZGVmYXVsdCkgewogIHJldHVybiBnb29nLmRlYnVnLkRlYnVnV2luZG93LmdldENvb2tpZVZhbHVlXyh0aGlzLmlkZW50aWZpZXJfLCBrZXksIG9wdF9kZWZhdWx0KQp9Owpnb29nLmRlYnVnLkRlYnVnV2luZG93LmdldENvb2tpZVZhbHVlXyA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJERlYnVnV2luZG93JGdldENvb2tpZVZhbHVlXyQoaWRlbnRpZmllciwga2V5LCBvcHRfZGVmYXVsdCkgewogIHZhciBmdWxsS2V5ID0ga2V5ICsgaWRlbnRpZmllciwgY29va2llID0gIiIgKyBkb2N1bWVudC5jb29raWUsIHN0YXJ0ID0gY29va2llLmluZGV4T2YoZnVsbEtleSArICI9Iik7CiAgaWYoLTEgIT0gc3RhcnQpIHsKICAgIHZhciBlbmQgPSBjb29raWUuaW5kZXhPZigiOyIsIHN0YXJ0KTsKICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoY29va2llLnN1YnN0cmluZyhzdGFydCArIGZ1bGxLZXkubGVuZ3RoICsgMSwgLTEgPT0gZW5kID8gY29va2llLmxlbmd0aCA6IGVuZCkpCiAgfQogIHJldHVybiBvcHRfZGVmYXVsdCB8fCAiIgp9Owpnb29nLmRlYnVnLkRlYnVnV2luZG93LmlzRW5hYmxlZCA9IGZ1bmN0aW9uICRnb29nJGRlYnVnJERlYnVnV2luZG93JGlzRW5hYmxlZCQoaWRlbnRpZmllcikgewogIHJldHVybiIxIiA9PSBnb29nLmRlYnVnLkRlYnVnV2luZG93LmdldENvb2tpZVZhbHVlXyhpZGVudGlmaWVyLCAiZW5hYmxlZCIpCn07Cmdvb2cuZGVidWcuRGVidWdXaW5kb3cucHJvdG90eXBlLnNhdmVXaW5kb3dQb3NpdGlvblNpemVfID0gZnVuY3Rpb24gJGdvb2ckZGVidWckRGVidWdXaW5kb3ckJHNhdmVXaW5kb3dQb3NpdGlvblNpemVfJCgpIHsKICBpZih0aGlzLmhhc0FjdGl2ZVdpbmRvdygpKSB7CiAgICB2YXIgeCA9IHRoaXMud2luXy5zY3JlZW5YIHx8IHRoaXMud2luXy5zY3JlZW5MZWZ0IHx8IDAsIHkgPSB0aGlzLndpbl8uc2NyZWVuWSB8fCB0aGlzLndpbl8uc2NyZWVuVG9wIHx8IDAsIHcgPSB0aGlzLndpbl8ub3V0ZXJXaWR0aCB8fCA4MDAsIGggPSB0aGlzLndpbl8ub3V0ZXJIZWlnaHQgfHwgNTAwOwogICAgdGhpcy5zZXRDb29raWVfKCJkYmciLCB4ICsgIiwiICsgeSArICIsIiArIHcgKyAiLCIgKyBoKQogIH0KfTsKZ29vZy5uZXQuWGhyTGl0ZSA9IGdvb2cubmV0LlhocklvOwpnb29nLm5ldC5YaHJMaXRlLnNlbmQgPSBnb29nLm5ldC5YaHJJby5zZW5kOwpnb29nLm5ldC5YaHJMaXRlLmNsZWFudXAgPSBnb29nLm5ldC5YaHJJby5jbGVhbnVwOwpnb29nLm5ldC5YaHJMaXRlLnByb3RlY3RFbnRyeVBvaW50cyA9IGdvb2cubmV0LlhocklvLnByb3RlY3RFbnRyeVBvaW50czsKZ29vZy5uZXQuWGhyTGl0ZS5jbGVhbnVwU2VuZF8gPSBnb29nLm5ldC5YaHJJby5jbGVhbnVwU2VuZF87Cmdvb2cubmV0LlhockxpdGUuQ09OVEVOVF9UWVBFX0hFQURFUiA9IGdvb2cubmV0LlhocklvLkNPTlRFTlRfVFlQRV9IRUFERVI7Cmdvb2cubmV0LlhockxpdGUuRk9STV9DT05URU5UX1RZUEUgPSBnb29nLm5ldC5YaHJJby5GT1JNX0NPTlRFTlRfVFlQRTsKZ29vZy5uZXQuWGhyTGl0ZS5zZW5kSW5zdGFuY2VzXyA9IGdvb2cubmV0LlhocklvLnNlbmRJbnN0YW5jZXNfOwpwcm90by5hcHBzLmNoYXQuTWVzc2FnZVN0YXRlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRNZXNzYWdlU3RhdGUkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFsibXMiXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5NZXNzYWdlU3RhdGUsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5NZXNzYWdlU3RhdGUubWVzc2FnZUlkID0gIm1zIjsKanNwYi5NZXNzYWdlLnJlZ2lzdGVyTWVzc2FnZVR5cGUocHJvdG8uYXBwcy5jaGF0Lk1lc3NhZ2VTdGF0ZS5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5NZXNzYWdlU3RhdGUpOwpwcm90by5hcHBzLmNoYXQuTWVzc2FnZVN0YXRlLnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRNZXNzYWdlU3RhdGUkJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuTWVzc2FnZVN0YXRlLm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuTWVzc2FnZVN0YXRlLnByb3RvdHlwZS5nZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE1lc3NhZ2VTdGF0ZSQkZ2V0SmlkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxXQp9Owpwcm90by5hcHBzLmNoYXQuTWVzc2FnZVN0YXRlLnByb3RvdHlwZS5zZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE1lc3NhZ2VTdGF0ZSQkc2V0SmlkJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMV0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuTWVzc2FnZVN0YXRlLnByb3RvdHlwZS5nZXRDaGF0U3RhdGVDb2RlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRNZXNzYWdlU3RhdGUkJGdldENoYXRTdGF0ZUNvZGUkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzJdCn07CnByb3RvLmFwcHMuY2hhdC5NZXNzYWdlU3RhdGUucHJvdG90eXBlLnNldENoYXRTdGF0ZUNvZGUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE1lc3NhZ2VTdGF0ZSQkc2V0Q2hhdFN0YXRlQ29kZSQodmFsdWUpIHsKICB0aGlzLmFycmF5WzJdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkTmV3UXVlcnlSZXN1bHRzJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbIm5xciJdOwogIHRoaXMuYXJyYXlbNV0gPSB0aGlzLmFycmF5WzVdIHx8IFtdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cywganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5tZXNzYWdlSWQgPSAibnFyIjsKanNwYi5NZXNzYWdlLnJlZ2lzdGVyTWVzc2FnZVR5cGUocHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5OZXdRdWVyeVJlc3VsdHMpOwpwcm90by5hcHBzLmNoYXQuTmV3UXVlcnlSZXN1bHRzLnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCROZXdRdWVyeVJlc3VsdHMkJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuTmV3UXVlcnlSZXN1bHRzLm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuTmV3UXVlcnlSZXN1bHRzLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkTmV3UXVlcnlSZXN1bHRzJCRnZXRRdWVyeSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMV0KfTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5wcm90b3R5cGUuc2V0UXVlcnkgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE5ld1F1ZXJ5UmVzdWx0cyQkc2V0UXVlcnkkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5OZXdRdWVyeVJlc3VsdHMucHJvdG90eXBlLmdldFN0YXJ0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCROZXdRdWVyeVJlc3VsdHMkJGdldFN0YXJ0JCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsyXQp9Owpwcm90by5hcHBzLmNoYXQuTmV3UXVlcnlSZXN1bHRzLnByb3RvdHlwZS5zZXRTdGFydCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkTmV3UXVlcnlSZXN1bHRzJCRzZXRTdGFydCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzJdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5wcm90b3R5cGUuZ2V0RW5kID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCROZXdRdWVyeVJlc3VsdHMkJGdldEVuZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbM10KfTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5wcm90b3R5cGUuc2V0RW5kID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCROZXdRdWVyeVJlc3VsdHMkJHNldEVuZCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzNdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5wcm90b3R5cGUuZ2V0U2l6ZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkTmV3UXVlcnlSZXN1bHRzJCRnZXRTaXplJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs0XQp9Owpwcm90by5hcHBzLmNoYXQuTmV3UXVlcnlSZXN1bHRzLnByb3RvdHlwZS5zZXRTaXplID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCROZXdRdWVyeVJlc3VsdHMkJHNldFNpemUkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs0XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5OZXdRdWVyeVJlc3VsdHMucHJvdG90eXBlLmdldFJlc3VsdHNMaXN0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCROZXdRdWVyeVJlc3VsdHMkJGdldFJlc3VsdHNMaXN0JCgpIHsKICBpZighdGhpcy5yZXN1bHRzXykgewogICAgdGhpcy5yZXN1bHRzXyA9IFtdOwogICAgZm9yKHZhciBpID0gMDtpIDwgdGhpcy5hcnJheVs1XS5sZW5ndGg7aSsrKSB7CiAgICAgIHRoaXMucmVzdWx0c19baV0gPSBuZXcgcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5SZXN1bHQodGhpcy5hcnJheVs1XVtpXSkKICAgIH0KICB9CiAgcmV0dXJuIHRoaXMucmVzdWx0c18KfTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5SZXN1bHQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE5ld1F1ZXJ5UmVzdWx0cyRSZXN1bHQkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFtdOwogIHRoaXMuYXJyYXlbMV0gPSB0aGlzLmFycmF5WzFdIHx8IFtdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5SZXN1bHQsIGpzcGIuTWVzc2FnZSk7CnByb3RvLmFwcHMuY2hhdC5OZXdRdWVyeVJlc3VsdHMuUmVzdWx0LnByb3RvdHlwZS5nZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE5ld1F1ZXJ5UmVzdWx0cyRSZXN1bHQkJGdldEppZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMF0KfTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5SZXN1bHQucHJvdG90eXBlLnNldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkTmV3UXVlcnlSZXN1bHRzJFJlc3VsdCQkc2V0SmlkJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMF0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuTmV3UXVlcnlSZXN1bHRzLlJlc3VsdC5wcm90b3R5cGUuZ2V0RmllbGRzTGlzdCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkTmV3UXVlcnlSZXN1bHRzJFJlc3VsdCQkZ2V0RmllbGRzTGlzdCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMV0KfTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5SZXN1bHQucHJvdG90eXBlLnNldEZpZWxkc0xpc3QgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE5ld1F1ZXJ5UmVzdWx0cyRSZXN1bHQkJHNldEZpZWxkc0xpc3QkKHZhbHVlKSB7CiAgdmFsdWUgPSB2YWx1ZSB8fCBbXTsKICB0aGlzLmFycmF5WzFdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5SZXN1bHQucHJvdG90eXBlLmdldFByZXNlbmNlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCROZXdRdWVyeVJlc3VsdHMkUmVzdWx0JCRnZXRQcmVzZW5jZSQoKSB7CiAgIXRoaXMucHJlc2VuY2VfICYmIHRoaXMuYXJyYXlbMl0gJiYgKHRoaXMucHJlc2VuY2VfID0gbmV3IHByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZSh0aGlzLmFycmF5WzJdKSk7CiAgcmV0dXJuIHRoaXMucHJlc2VuY2VfCn07CnByb3RvLmFwcHMuY2hhdC5OZXdRdWVyeVJlc3VsdHMuUmVzdWx0LnByb3RvdHlwZS5zZXRQcmVzZW5jZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkTmV3UXVlcnlSZXN1bHRzJFJlc3VsdCQkc2V0UHJlc2VuY2UkKHZhbHVlKSB7CiAgdGhpcy5wcmVzZW5jZV8gPSB2YWx1ZTsKICB0aGlzLmFycmF5WzJdID0gdmFsdWUgPyB2YWx1ZS50b0FycmF5KCkgOiB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuTmV3UXVlcnlSZXN1bHRzLlJlc3VsdC5wcm90b3R5cGUuZ2V0Um9zdGVyVXBkYXRlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCROZXdRdWVyeVJlc3VsdHMkUmVzdWx0JCRnZXRSb3N0ZXJVcGRhdGUkKCkgewogICF0aGlzLnJvc3Rlcl91cGRhdGVfICYmIHRoaXMuYXJyYXlbM10gJiYgKHRoaXMucm9zdGVyX3VwZGF0ZV8gPSBuZXcgcHJvdG8uYXBwcy5jaGF0LlJvc3RlclVwZGF0ZSh0aGlzLmFycmF5WzNdKSk7CiAgcmV0dXJuIHRoaXMucm9zdGVyX3VwZGF0ZV8KfTsKcHJvdG8uYXBwcy5jaGF0Lk5ld1F1ZXJ5UmVzdWx0cy5SZXN1bHQucHJvdG90eXBlLmdldFZjYXJkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCROZXdRdWVyeVJlc3VsdHMkUmVzdWx0JCRnZXRWY2FyZCQoKSB7CiAgIXRoaXMudmNhcmRfICYmIHRoaXMuYXJyYXlbNF0gJiYgKHRoaXMudmNhcmRfID0gbmV3IHByb3RvLmFwcHMuY2hhdC5WY2FyZCh0aGlzLmFycmF5WzRdKSk7CiAgcmV0dXJuIHRoaXMudmNhcmRfCn07CnByb3RvLmFwcHMuY2hhdC5PbGRQcmVzZW5jZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkT2xkUHJlc2VuY2UkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFsicCJdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0Lk9sZFByZXNlbmNlLCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuT2xkUHJlc2VuY2UubWVzc2FnZUlkID0gInAiOwpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZShwcm90by5hcHBzLmNoYXQuT2xkUHJlc2VuY2UubWVzc2FnZUlkLCBwcm90by5hcHBzLmNoYXQuT2xkUHJlc2VuY2UpOwpwcm90by5hcHBzLmNoYXQuT2xkUHJlc2VuY2UucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE9sZFByZXNlbmNlJCRnZXRKc1BiTWVzc2FnZUlkJCgpIHsKICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0Lk9sZFByZXNlbmNlLm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuT2xkUHJlc2VuY2UucHJvdG90eXBlLmdldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkT2xkUHJlc2VuY2UkJGdldEppZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMV0KfTsKcHJvdG8uYXBwcy5jaGF0Lk9sZFByZXNlbmNlLnByb3RvdHlwZS5zZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE9sZFByZXNlbmNlJCRzZXRKaWQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5PbGRQcmVzZW5jZS5wcm90b3R5cGUuZ2V0U2hvdyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkT2xkUHJlc2VuY2UkJGdldFNob3ckKCkgewogIHJldHVybiB0aGlzLmFycmF5WzJdCn07CnByb3RvLmFwcHMuY2hhdC5PbGRQcmVzZW5jZS5wcm90b3R5cGUuc2V0U2hvdyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkT2xkUHJlc2VuY2UkJHNldFNob3ckKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsyXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5PbGRQcmVzZW5jZS5wcm90b3R5cGUuZ2V0U3RhdHVzID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRPbGRQcmVzZW5jZSQkZ2V0U3RhdHVzJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVszXQp9Owpwcm90by5hcHBzLmNoYXQuT2xkUHJlc2VuY2UucHJvdG90eXBlLnNldFN0YXR1cyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkT2xkUHJlc2VuY2UkJHNldFN0YXR1cyQodmFsdWUpIHsKICB0aGlzLmFycmF5WzNdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0Lk9sZFByZXNlbmNlLnByb3RvdHlwZS5nZXRQYXJzZWRTdGF0dXMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE9sZFByZXNlbmNlJCRnZXRQYXJzZWRTdGF0dXMkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzRdCn07CnByb3RvLmFwcHMuY2hhdC5PbGRQcmVzZW5jZS5wcm90b3R5cGUuc2V0UGFyc2VkU3RhdHVzID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRPbGRQcmVzZW5jZSQkc2V0UGFyc2VkU3RhdHVzJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbNF0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuT2xkUHJlc2VuY2UucHJvdG90eXBlLmdldENhcGFiaWxpdGllcyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkT2xkUHJlc2VuY2UkJGdldENhcGFiaWxpdGllcyQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbNV0KfTsKcHJvdG8uYXBwcy5jaGF0Lk9sZFByZXNlbmNlLnByb3RvdHlwZS5zZXRDYXBhYmlsaXRpZXMgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE9sZFByZXNlbmNlJCRzZXRDYXBhYmlsaXRpZXMkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs1XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5PdXRib3VuZENoYXQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE91dGJvdW5kQ2hhdCQob3B0X2RhdGEpIHsKICBqc3BiLk1lc3NhZ2UuY2FsbCh0aGlzKTsKICB0aGlzLmFycmF5ID0gb3B0X2RhdGEgfHwgWyJtIl0KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuT3V0Ym91bmRDaGF0LCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuT3V0Ym91bmRDaGF0Lm1lc3NhZ2VJZCA9ICJtIjsKanNwYi5NZXNzYWdlLnJlZ2lzdGVyTWVzc2FnZVR5cGUocHJvdG8uYXBwcy5jaGF0Lk91dGJvdW5kQ2hhdC5tZXNzYWdlSWQsIHByb3RvLmFwcHMuY2hhdC5PdXRib3VuZENoYXQpOwpwcm90by5hcHBzLmNoYXQuT3V0Ym91bmRDaGF0LnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRPdXRib3VuZENoYXQkJGdldEpzUGJNZXNzYWdlSWQkKCkgewogIHJldHVybiBwcm90by5hcHBzLmNoYXQuT3V0Ym91bmRDaGF0Lm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuT3V0Ym91bmRDaGF0LnByb3RvdHlwZS5nZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE91dGJvdW5kQ2hhdCQkZ2V0SmlkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxXQp9Owpwcm90by5hcHBzLmNoYXQuT3V0Ym91bmRDaGF0LnByb3RvdHlwZS5zZXRKaWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JE91dGJvdW5kQ2hhdCQkc2V0SmlkJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMV0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuT3V0Ym91bmRDaGF0LnByb3RvdHlwZS5nZXRCb2R5ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRPdXRib3VuZENoYXQkJGdldEJvZHkkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzJdCn07CnByb3RvLmFwcHMuY2hhdC5PdXRib3VuZENoYXQucHJvdG90eXBlLmdldElkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRPdXRib3VuZENoYXQkJGdldElkJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVszXQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyQWRkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJBZGQkKG9wdF9kYXRhKSB7CiAganNwYi5NZXNzYWdlLmNhbGwodGhpcyk7CiAgdGhpcy5hcnJheSA9IG9wdF9kYXRhIHx8IFsicmEiXTsKICB0aGlzLmFycmF5WzE4XSA9IHRoaXMuYXJyYXlbMThdIHx8IFtdCn07Cmdvb2cuaW5oZXJpdHMocHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZCwganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZC5tZXNzYWdlSWQgPSAicmEiOwpqc3BiLk1lc3NhZ2UucmVnaXN0ZXJNZXNzYWdlVHlwZShwcm90by5hcHBzLmNoYXQuUm9zdGVyQWRkLm1lc3NhZ2VJZCwgcHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZCk7CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlckFkZCQkZ2V0SnNQYk1lc3NhZ2VJZCQoKSB7CiAgcmV0dXJuIHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQubWVzc2FnZUlkCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLmdldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRnZXRKaWQkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzFdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLnNldEppZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRzZXRKaWQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlckFkZCQkZ2V0TmFtZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMl0KfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZC5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRzZXROYW1lJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMl0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyQWRkLnByb3RvdHlwZS5nZXRFbWFpbCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRnZXRFbWFpbCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbM10KfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZC5wcm90b3R5cGUuc2V0RW1haWwgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlckFkZCQkc2V0RW1haWwkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVszXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLmdldEF2YXRhciA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRnZXRBdmF0YXIkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzRdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLnNldEF2YXRhciA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRzZXRBdmF0YXIkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs0XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLnNldEFpbSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRzZXRBaW0kKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs1XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLmdldENvbWJpbmVkV2VpZ2h0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJBZGQkJGdldENvbWJpbmVkV2VpZ2h0JCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVs2XQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyQWRkLnByb3RvdHlwZS5zZXRDb21iaW5lZFdlaWdodCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRzZXRDb21iaW5lZFdlaWdodCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzZdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZC5wcm90b3R5cGUuc2V0Q2hhdFdlaWdodCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRzZXRDaGF0V2VpZ2h0JCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbN10gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyQWRkLnByb3RvdHlwZS5zZXRFbWFpbFdlaWdodCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRzZXRFbWFpbFdlaWdodCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzhdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZC5wcm90b3R5cGUuZ2V0RmlsdGVyID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJBZGQkJGdldEZpbHRlciQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbOV0KfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZC5wcm90b3R5cGUuc2V0RmlsdGVyID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJBZGQkJHNldEZpbHRlciQodmFsdWUpIHsKICB0aGlzLmFycmF5WzldID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZC5wcm90b3R5cGUuc2V0Tm9zYXZlID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJBZGQkJHNldE5vc2F2ZSQodmFsdWUpIHsKICB0aGlzLmFycmF5WzEwXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLnNldFNldE5vc2F2ZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRzZXRTZXROb3NhdmUkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsxMV0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyQWRkLnByb3RvdHlwZS5zZXRPcmt1dFVpZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRzZXRPcmt1dFVpZCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzEyXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLmdldE9ya3V0UGljdHVyZVVybCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRnZXRPcmt1dFBpY3R1cmVVcmwkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzEzXQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyQWRkLnByb3RvdHlwZS5zZXRPcmt1dFBpY3R1cmVVcmwgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlckFkZCQkc2V0T3JrdXRQaWN0dXJlVXJsJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMTNdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZC5wcm90b3R5cGUuZ2V0UGhvbmVCb29rID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRSb3N0ZXJBZGQkJGdldFBob25lQm9vayQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMTRdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLmdldFNob3J0SWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlckFkZCQkZ2V0U2hvcnRJZCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMTVdCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLnNldFNob3J0SWQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlckFkZCQkc2V0U2hvcnRJZCQodmFsdWUpIHsKICB0aGlzLmFycmF5WzE1XSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQucHJvdG90eXBlLmdldFN1YnNjcmliZWRUbyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUm9zdGVyQWRkJCRnZXRTdWJzY3JpYmVkVG8kKCkgewogIHJldHVybiB0aGlzLmFycmF5WzE2XQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyQWRkLnByb3RvdHlwZS5zZXRTdWJzY3JpYmVkVG8gPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlckFkZCQkc2V0U3Vic2NyaWJlZFRvJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMTZdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlJvc3RlckFkZC5wcm90b3R5cGUuZ2V0QnVkZHlQb3VuY2UgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlckFkZCQkZ2V0QnVkZHlQb3VuY2UkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzE3XQp9Owpwcm90by5hcHBzLmNoYXQuUm9zdGVyQWRkLnByb3RvdHlwZS5nZXRGb2N1c0dyb3Vwc0xpc3QgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFJvc3RlckFkZCQkZ2V0Rm9jdXNHcm91cHNMaXN0JCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxOF0KfTsKcHJvdG8uYXBwcy5jaGF0LlF1ZXJ5UmVzdWx0cyA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbInFyIl07CiAgdGhpcy5hcnJheVs1XSA9IHRoaXMuYXJyYXlbNV0gfHwgW10KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuUXVlcnlSZXN1bHRzLCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuUXVlcnlSZXN1bHRzLm1lc3NhZ2VJZCA9ICJxciI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMubWVzc2FnZUlkLCBwcm90by5hcHBzLmNoYXQuUXVlcnlSZXN1bHRzKTsKcHJvdG8uYXBwcy5jaGF0LlF1ZXJ5UmVzdWx0cy5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJCRnZXRKc1BiTWVzc2FnZUlkJCgpIHsKICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LlF1ZXJ5UmVzdWx0cy5tZXNzYWdlSWQKfTsKcHJvdG8uYXBwcy5jaGF0LlF1ZXJ5UmVzdWx0cy5wcm90b3R5cGUuZ2V0UXVlcnkgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFF1ZXJ5UmVzdWx0cyQkZ2V0UXVlcnkkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzFdCn07CnByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMucHJvdG90eXBlLnNldFF1ZXJ5ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRRdWVyeVJlc3VsdHMkJHNldFF1ZXJ5JCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbMV0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUXVlcnlSZXN1bHRzLnByb3RvdHlwZS5nZXRTdGFydCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJCRnZXRTdGFydCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMl0KfTsKcHJvdG8uYXBwcy5jaGF0LlF1ZXJ5UmVzdWx0cy5wcm90b3R5cGUuc2V0U3RhcnQgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFF1ZXJ5UmVzdWx0cyQkc2V0U3RhcnQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVsyXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMucHJvdG90eXBlLmdldEVuZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJCRnZXRFbmQkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzNdCn07CnByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMucHJvdG90eXBlLnNldEVuZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJCRzZXRFbmQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVszXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMucHJvdG90eXBlLmdldFNpemUgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFF1ZXJ5UmVzdWx0cyQkZ2V0U2l6ZSQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbNF0KfTsKcHJvdG8uYXBwcy5jaGF0LlF1ZXJ5UmVzdWx0cy5wcm90b3R5cGUuc2V0U2l6ZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJCRzZXRTaXplJCh2YWx1ZSkgewogIHRoaXMuYXJyYXlbNF0gPSB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUXVlcnlSZXN1bHRzLnByb3RvdHlwZS5nZXRSZXN1bHRzTGlzdCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJCRnZXRSZXN1bHRzTGlzdCQoKSB7CiAgaWYoIXRoaXMucmVzdWx0c18pIHsKICAgIHRoaXMucmVzdWx0c18gPSBbXTsKICAgIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuYXJyYXlbNV0ubGVuZ3RoO2krKykgewogICAgICB0aGlzLnJlc3VsdHNfW2ldID0gbmV3IHByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMuUmVzdWx0KHRoaXMuYXJyYXlbNV1baV0pCiAgICB9CiAgfQogIHJldHVybiB0aGlzLnJlc3VsdHNfCn07CnByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMuUmVzdWx0ID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRRdWVyeVJlc3VsdHMkUmVzdWx0JChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbImMiXTsKICB0aGlzLmFycmF5WzFdID0gdGhpcy5hcnJheVsxXSB8fCBbXQp9Owpnb29nLmluaGVyaXRzKHByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMuUmVzdWx0LCBqc3BiLk1lc3NhZ2UpOwpwcm90by5hcHBzLmNoYXQuUXVlcnlSZXN1bHRzLlJlc3VsdC5tZXNzYWdlSWQgPSAiYyI7CmpzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlKHByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMuUmVzdWx0Lm1lc3NhZ2VJZCwgcHJvdG8uYXBwcy5jaGF0LlF1ZXJ5UmVzdWx0cy5SZXN1bHQpOwpwcm90by5hcHBzLmNoYXQuUXVlcnlSZXN1bHRzLlJlc3VsdC5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJFJlc3VsdCQkZ2V0SnNQYk1lc3NhZ2VJZCQoKSB7CiAgcmV0dXJuIHByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMuUmVzdWx0Lm1lc3NhZ2VJZAp9Owpwcm90by5hcHBzLmNoYXQuUXVlcnlSZXN1bHRzLlJlc3VsdC5wcm90b3R5cGUuZ2V0RmllbGRzTGlzdCA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJFJlc3VsdCQkZ2V0RmllbGRzTGlzdCQoKSB7CiAgcmV0dXJuIHRoaXMuYXJyYXlbMV0KfTsKcHJvdG8uYXBwcy5jaGF0LlF1ZXJ5UmVzdWx0cy5SZXN1bHQucHJvdG90eXBlLnNldEZpZWxkc0xpc3QgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JFF1ZXJ5UmVzdWx0cyRSZXN1bHQkJHNldEZpZWxkc0xpc3QkKHZhbHVlKSB7CiAgdmFsdWUgPSB2YWx1ZSB8fCBbXTsKICB0aGlzLmFycmF5WzFdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LlF1ZXJ5UmVzdWx0cy5SZXN1bHQucHJvdG90eXBlLnNldFJhID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRRdWVyeVJlc3VsdHMkUmVzdWx0JCRzZXRSYSQodmFsdWUpIHsKICB0aGlzLmFycmF5WzJdID0gdmFsdWUgPyB2YWx1ZS50b0FycmF5KCkgOiB2YWx1ZQp9Owpwcm90by5hcHBzLmNoYXQuUXVlcnlSZXN1bHRzLlJlc3VsdC5wcm90b3R5cGUuc2V0SXNTdWJzY3JpYmVkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRRdWVyeVJlc3VsdHMkUmVzdWx0JCRzZXRJc1N1YnNjcmliZWQkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVszXSA9IHZhbHVlCn07CnByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMuUmVzdWx0LnByb3RvdHlwZS5nZXRQcmVzZW5jZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJFJlc3VsdCQkZ2V0UHJlc2VuY2UkKCkgewogIHJldHVybiB0aGlzLmFycmF5WzRdCn07CnByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHMuUmVzdWx0LnByb3RvdHlwZS5zZXRQcmVzZW5jZSA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkUXVlcnlSZXN1bHRzJFJlc3VsdCQkc2V0UHJlc2VuY2UkKHZhbHVlKSB7CiAgdGhpcy5hcnJheVs0XSA9IHZhbHVlCn07CmNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IgPSBmdW5jdGlvbiAkY2hhdCRTZXJ2ZXJNZXNzYWdlVHJhbnNsYXRvciQoYXBwQ29udGV4dCkgewogIGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlci5jYWxsKHRoaXMsIHRoaXMpOwogIHRoaXMuc2VydmVyTWVzc2FnZURpc3BhdGNoZXJfID0gY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZURpc3BhdGNoZXIuZ2V0KGFwcENvbnRleHQpOwogIHRoaXMubWVfID0gY2hhdC5tb2RlbC5NZS5nZXQoYXBwQ29udGV4dCk7CiAgdGhpcy5leHBlcmltZW50TWFuYWdlcl8gPSBjaGF0LmNsaWVudC5FeHBlcmltZW50TWFuYWdlci5nZXQoYXBwQ29udGV4dCk7CiAgdGhpcy5jb250YWN0U2V0XyA9IGNoYXQubW9kZWwuQ29udGFjdFNldC5nZXQoYXBwQ29udGV4dCk7CiAgdGhpcy5wZW5kaW5nTWVzc2FnZXNfID0gW107CiAgdGhpcy5saXN0ZW4oY2hhdC5tb2RlbC5Db250YWN0U2V0LmdldChhcHBDb250ZXh0KSwgY2hhdC5tb2RlbC5Db250YWN0U2V0LkV2ZW50VHlwZS5DT05UQUNUX1VQREFURUQsIHRoaXMuY29udGFjdFVwZGF0ZWRfKTsKICB0aGlzLmxpc3RlbihjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuZ2V0KGFwcENvbnRleHQpLCBjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuRXZlbnRUeXBlLlJPU1RFUl9RVUlDS0xJU1RfVVBEQVRFLCB0aGlzLnF1aWNrbGlzdFVwZGF0ZWRfKQp9Owpnb29nLmluaGVyaXRzKGNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IsIGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcik7CmNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IuU0VSVklDRV9JRCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoImNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IiKTsKY2hhdC5TZXJ2ZXJNZXNzYWdlVHJhbnNsYXRvci5nZXQgPSBmdW5jdGlvbiAkY2hhdCRTZXJ2ZXJNZXNzYWdlVHJhbnNsYXRvciRnZXQkKGFwcENvbnRleHQpIHsKICByZXR1cm4gYXBwQ29udGV4dC5nZXQoY2hhdC5TZXJ2ZXJNZXNzYWdlVHJhbnNsYXRvci5TRVJWSUNFX0lEKQp9OwpjaGF0LlNlcnZlck1lc3NhZ2VUcmFuc2xhdG9yLnJlZ2lzdGVyID0gZnVuY3Rpb24gJGNoYXQkU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IkcmVnaXN0ZXIkKGFwcENvbnRleHQpIHsKICB2YXIgdHJhbnNsYXRvciA9IG5ldyBjaGF0LlNlcnZlck1lc3NhZ2VUcmFuc2xhdG9yKGFwcENvbnRleHQpOwogIGFwcENvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKGNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IuU0VSVklDRV9JRCwgdHJhbnNsYXRvcik7CiAgcmV0dXJuIHRyYW5zbGF0b3IKfTsKY2hhdC5TZXJ2ZXJNZXNzYWdlVHJhbnNsYXRvci5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24gJGNoYXQkU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IkJHRyYW5zbGF0ZSQobXNnKSB7CiAgdmFyIGFycmF5ID0gbXNnOwogIHN3aXRjaChhcnJheVswXSkgewogICAgY2FzZSBwcm90by5hcHBzLmNoYXQuTmV3UXVlcnlSZXN1bHRzLm1lc3NhZ2VJZDoKICAgICAgdGhpcy5oYW5kbGVRcl8obmV3IHByb3RvLmFwcHMuY2hhdC5OZXdRdWVyeVJlc3VsdHMoYXJyYXkpKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZS5tZXNzYWdlSWQ6CiAgICAgIHRoaXMuaGFuZGxlUF8obmV3IHByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZShhcnJheSkpOwogICAgICBicmVhazsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5tZXNzYWdlSWQ6CiAgICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzXy5wdXNoKGFycmF5KTsKICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZXNfLnB1c2godGhpcy5tZXNzYWdlU3RhdGVGcm9tQ2hhdFN0YXRlVXBkYXRlXyhhcnJheSkudG9BcnJheSgpKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5PZmZUaGVSZWNvcmQubWVzc2FnZUlkOgogICAgOwogICAgY2FzZSBwcm90by5hcHBzLmNoYXQuUm9zdGVyVXBkYXRlLm1lc3NhZ2VJZDoKICAgIDsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0LlZjYXJkLm1lc3NhZ2VJZDoKICAgIDsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0LkNsaWVudERhdGFRdWVyeS5tZXNzYWdlSWQ6CiAgICAgIHRoaXMuc2VydmVyTWVzc2FnZURpc3BhdGNoZXJfLmhhbmRsZShhcnJheSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAic2MiOgogICAgOwogICAgY2FzZSAic3UiOgogICAgICBmb3IodmFyIGkgPSAxO2kgPCBtc2cubGVuZ3RoOysraSkgewogICAgICAgIHRoaXMubWVfLmhhbmRsZVVzZXJTZXR0aW5nKG1zZ1tpXVswXSwgbXNnW2ldWzFdKQogICAgICB9CiAgICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzXy5wdXNoKG1zZyk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiY3UiOgogICAgICB0aGlzLmNvbnRhY3RTZXRfLnVwZGF0ZUxhc3RDaGF0KG1zZ1syXSwgbXNnWzFdKTsKICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZXNfLnB1c2gobXNnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJxbCI6CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZXNfLnB1c2gobXNnKQogIH0KICB2YXIgcmV0dXJuZWRNZXNzYWdlcyA9IHRoaXMucGVuZGluZ01lc3NhZ2VzXzsKICB0aGlzLnBlbmRpbmdNZXNzYWdlc18gPSBbXTsKICByZXR1cm4gcmV0dXJuZWRNZXNzYWdlcwp9OwpjaGF0LlNlcnZlck1lc3NhZ2VUcmFuc2xhdG9yLnByb3RvdHlwZS5jb252ZXJ0VG9Kc1BiID0gZnVuY3Rpb24gJGNoYXQkU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IkJGNvbnZlcnRUb0pzUGIkKG1zZykgewogIHN3aXRjaChtc2dbMF0pIHsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0Lk91dGJvdW5kQ2hhdC5tZXNzYWdlSWQ6CiAgICAgIHJldHVybiBuZXcgcHJvdG8uYXBwcy5jaGF0Lk91dGJvdW5kQ2hhdChtc2cpOwogICAgY2FzZSBwcm90by5hcHBzLmNoYXQuTWVzc2FnZVN0YXRlLm1lc3NhZ2VJZDoKICAgICAgcmV0dXJuIHRoaXMuY2hhdFN0YXRlVXBkYXRlRnJvbU1lc3NhZ2VTdGF0ZV8obXNnKTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBudWxsCiAgfQp9OwpjaGF0LlNlcnZlck1lc3NhZ2VUcmFuc2xhdG9yLnByb3RvdHlwZS5jb250YWN0VXBkYXRlZF8gPSBmdW5jdGlvbiAkY2hhdCRTZXJ2ZXJNZXNzYWdlVHJhbnNsYXRvciQkY29udGFjdFVwZGF0ZWRfJChlKSB7CiAgdGhpcy5wdXNoQ29udGFjdF8oZS5jb250YWN0LmdldEppZCgpLnRvU3RyaW5nKCkpCn07CmNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IucHJvdG90eXBlLnF1aWNrbGlzdFVwZGF0ZWRfID0gZnVuY3Rpb24gJGNoYXQkU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IkJHF1aWNrbGlzdFVwZGF0ZWRfJCgpIHsKICB0aGlzLnBlbmRpbmdNZXNzYWdlc18ucHVzaChbInFsIl0uY29uY2F0KHRoaXMuY29udGFjdFNldF8uZ2V0UXVpY2tsaXN0KCkpKQp9OwpjaGF0LlNlcnZlck1lc3NhZ2VUcmFuc2xhdG9yLnByb3RvdHlwZS5wdXNoQ29udGFjdF8gPSBmdW5jdGlvbiAkY2hhdCRTZXJ2ZXJNZXNzYWdlVHJhbnNsYXRvciQkcHVzaENvbnRhY3RfJChqaWQpIHsKICB2YXIgY29udGFjdCA9IHRoaXMuY29udGFjdFNldF8uZ2V0Q29udGFjdChqaWQpLCByYSA9IG5ldyBwcm90by5hcHBzLmNoYXQuUm9zdGVyQWRkOwogIHJhLnNldEppZChjb250YWN0LmdldEppZCgpLnRvU3RyaW5nKCkpOwogIHJhLnNldE5hbWUoY29udGFjdC5nZXRGdWxsTmFtZSgpKTsKICByYS5zZXRFbWFpbChjb250YWN0LmdldEVtYWlsKCkpOwogIHZhciB1cmwgPSBjb250YWN0LmdldEF2YXRhclVybCgpOwogIHJhLnNldEF2YXRhcigiL2ltYWdlP2giICsgdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZigiPSIpKSk7CiAgcmEuc2V0Q29tYmluZWRXZWlnaHQoY29udGFjdC5nZXRXZWlnaHQoKSk7CiAgcmEuc2V0RmlsdGVyKGNvbnRhY3QuZ2V0RmlsdGVyKCkpOwogIHJhLnNldE5vc2F2ZShjb250YWN0LmdldE5vU2F2ZSgpIHx8ICExKTsKICByYS5zZXRPcmt1dFBpY3R1cmVVcmwoY29udGFjdC5nZXRPcmt1dEF2YXRhclVybCgpKTsKICByYS5zZXRTaG9ydElkKHBhcnNlSW50KGNvbnRhY3QuZ2V0U2hvcnRJZCgpLCAxMCkpOwogIHJhLnNldFN1YnNjcmliZWRUbyhjb250YWN0LmlzU3Vic2NyaWJlZFRvKCkpOwogIHJhLnNldEFpbSghMSk7CiAgcmEuc2V0RW1haWxXZWlnaHQoMSk7CiAgcmEuc2V0Q2hhdFdlaWdodCgxKTsKICByYS5zZXRTZXROb3NhdmUoITEpOwogIHJhLnNldE9ya3V0VWlkKCIiKTsKICByYS5hcnJheVsxNF0gPSBbXTsKICB0aGlzLnBlbmRpbmdNZXNzYWdlc18ucHVzaChyYS50b0FycmF5KCkpCn07CmNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IucHJvdG90eXBlLmhhbmRsZVBfID0gZnVuY3Rpb24gJGNoYXQkU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IkJGhhbmRsZVBfJChwKSB7CiAgdmFyIG9sZFAgPSBuZXcgcHJvdG8uYXBwcy5jaGF0Lk9sZFByZXNlbmNlLCBqaWQgPSBwLmdldEppZCgpLCBzbGFzaCA9IGppZC5pbmRleE9mKCIvIik7CiAgMCA8IHNsYXNoICYmIChqaWQgPSBqaWQuc3Vic3RyaW5nKDAsIHNsYXNoKSk7CiAgb2xkUC5zZXRKaWQoamlkKTsKICB2YXIgc2hvdzsKICBzd2l0Y2gocC5nZXRTaG93KCkpIHsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlLlNob3cuT0ZGTElORToKICAgICAgc2hvdyA9ICJ1IjsKICAgICAgYnJlYWs7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5QcmVzZW5jZS5TaG93LlhBOgogICAgOwogICAgY2FzZSBwcm90by5hcHBzLmNoYXQuUHJlc2VuY2UuU2hvdy5BV0FZOgogICAgICBzaG93ID0gImkiOwogICAgICBicmVhazsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0LlByZXNlbmNlLlNob3cuRE5EOgogICAgICBzaG93ID0gImIiOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHNob3cgPSAiYSIKICB9CiAgb2xkUC5zZXRTaG93KHNob3cpOwogIG9sZFAuc2V0U3RhdHVzKHAuZ2V0U3RhdHVzKCkgfHwgIiIpOwogIG9sZFAuc2V0UGFyc2VkU3RhdHVzKHAuZ2V0UGFyc2VkU3RhdHVzKCkpOwogIG9sZFAuc2V0Q2FwYWJpbGl0aWVzKHAuZ2V0Q2FwYWJpbGl0aWVzKCkpOwogIHRoaXMucGVuZGluZ01lc3NhZ2VzXy5wdXNoKG9sZFAudG9BcnJheSgpKTsKICB2YXIgY29udGFjdCA9IHRoaXMuY29udGFjdFNldF8uZ2V0Q29udGFjdChqaWQpOwogIGdvb2cuaXNEZWZBbmROb3ROdWxsKGNvbnRhY3QpICYmIGdvb2cuaXNEZWZBbmROb3ROdWxsKHAuZ2V0U2VydmVyUHJlc2VuY2VDb2RlKCkpICYmIGNvbnRhY3Quc2V0UHJlc2VuY2VDb2RlKHAuZ2V0U2VydmVyUHJlc2VuY2VDb2RlKCkpCn07CmNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IucHJvdG90eXBlLmhhbmRsZVFyXyA9IGZ1bmN0aW9uICRjaGF0JFNlcnZlck1lc3NhZ2VUcmFuc2xhdG9yJCRoYW5kbGVRcl8kKG5ld1FyKSB7CiAgdmFyIHFyID0gbmV3IHByb3RvLmFwcHMuY2hhdC5RdWVyeVJlc3VsdHM7CiAgcXIuc2V0UXVlcnkobmV3UXIuZ2V0UXVlcnkoKSk7CiAgcXIuc2V0U3RhcnQobmV3UXIuZ2V0U3RhcnQoKSk7CiAgcXIuc2V0RW5kKG5ld1FyLmdldEVuZCgpKTsKICBxci5zZXRTaXplKG5ld1FyLmdldFNpemUoKSk7CiAgaWYoMCA8IG5ld1FyLmdldFJlc3VsdHNMaXN0KCkubGVuZ3RoKSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCBuZXdRci5nZXRSZXN1bHRzTGlzdCgpLmxlbmd0aDsrK2kpIHsKICAgICAgdmFyIHJlc3VsdCA9IG5ld1FyLmdldFJlc3VsdHNMaXN0KClbaV0sIG5ld1Jlc3VsdCA9IG5ldyBwcm90by5hcHBzLmNoYXQuUXVlcnlSZXN1bHRzLlJlc3VsdDsKICAgICAgbmV3UmVzdWx0LnNldEZpZWxkc0xpc3QocmVzdWx0LmdldEZpZWxkc0xpc3QoKSk7CiAgICAgIHJlc3VsdC5nZXRSb3N0ZXJVcGRhdGUoKSAmJiB0aGlzLnNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyXy5oYW5kbGUocmVzdWx0LmdldFJvc3RlclVwZGF0ZSgpLnRvQXJyYXkoKSk7CiAgICAgIHJlc3VsdC5nZXRWY2FyZCgpICYmIHRoaXMuc2VydmVyTWVzc2FnZURpc3BhdGNoZXJfLmhhbmRsZShyZXN1bHQuZ2V0VmNhcmQoKS50b0FycmF5KCkpOwogICAgICB2YXIgamlkID0gcmVzdWx0LmdldEppZCgpOwogICAgICBpZih0aGlzLmNvbnRhY3RTZXRfLmdldENvbnRhY3QoamlkKSkgewogICAgICAgIHRoaXMucHVzaENvbnRhY3RfKGppZCk7CiAgICAgICAgdmFyIHJhID0gbmV3IHByb3RvLmFwcHMuY2hhdC5Sb3N0ZXJBZGQodGhpcy5wZW5kaW5nTWVzc2FnZXNfLnBvcCgpKTsKICAgICAgICBuZXdSZXN1bHQuc2V0UmEocmEpOwogICAgICAgIG5ld1Jlc3VsdC5zZXRJc1N1YnNjcmliZWQocmEuZ2V0U3Vic2NyaWJlZFRvKCkpOwogICAgICAgIG5ld1Jlc3VsdC5hcnJheVszXSA9IHJhLmdldFN1YnNjcmliZWRUbygpID8gMSA6IDAKICAgICAgfQogICAgICByZXN1bHQuZ2V0UHJlc2VuY2UoKSAmJiAodGhpcy5oYW5kbGVQXyhyZXN1bHQuZ2V0UHJlc2VuY2UoKSksIG5ld1Jlc3VsdC5zZXRQcmVzZW5jZSh0aGlzLnBlbmRpbmdNZXNzYWdlc18ucG9wKCkpKTsKICAgICAgcXIuYXJyYXlbaSArIDVdID0gbmV3UmVzdWx0LnRvQXJyYXkoKQogICAgfQogICAgdGhpcy5wZW5kaW5nTWVzc2FnZXNfLnB1c2gocXIudG9BcnJheSgpKQogIH1lbHNlIHsKICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzXy5wdXNoKHFyLnRvQXJyYXkoKS5zbGljZSgwLCA1KSkKICB9Cn07CmNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IucHJvdG90eXBlLm1lc3NhZ2VTdGF0ZUZyb21DaGF0U3RhdGVVcGRhdGVfID0gZnVuY3Rpb24gJGNoYXQkU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IkJG1lc3NhZ2VTdGF0ZUZyb21DaGF0U3RhdGVVcGRhdGVfJChtc2cpIHsKICB2YXIgY2hhdFN0YXRlVXBkYXRlID0gbmV3IHByb3RvLmFwcHMuY2hhdC5DaGF0U3RhdGVVcGRhdGUobXNnKSwgbWVzc2FnZVN0YXRlID0gbmV3IHByb3RvLmFwcHMuY2hhdC5NZXNzYWdlU3RhdGU7CiAgbWVzc2FnZVN0YXRlLnNldEppZChjaGF0U3RhdGVVcGRhdGUuZ2V0SmlkKCkpOwogIHZhciBjb2RlOwogIHN3aXRjaChjaGF0U3RhdGVVcGRhdGUuZ2V0Q2hhdFN0YXRlKCkpIHsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5DaGF0U3RhdGUuQ09NUE9TSU5HOgogICAgICBjb2RlID0gImMiOwogICAgICBicmVhazsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5DaGF0U3RhdGUuUEFVU0VEOgogICAgICBjb2RlID0gInAiOwogICAgICBicmVhazsKICAgIGNhc2UgcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5DaGF0U3RhdGUuSURMRToKICAgICAgY29kZSA9ICJpIjsKICAgICAgYnJlYWs7CiAgICBjYXNlIHByb3RvLmFwcHMuY2hhdC5DaGF0U3RhdGVVcGRhdGUuQ2hhdFN0YXRlLkdPTkU6CiAgICAgIGNvZGUgPSAiZyI7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgY29kZSA9ICJhIgogIH0KICBtZXNzYWdlU3RhdGUuc2V0Q2hhdFN0YXRlQ29kZShjb2RlKTsKICByZXR1cm4gbWVzc2FnZVN0YXRlCn07CmNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IucHJvdG90eXBlLmNoYXRTdGF0ZVVwZGF0ZUZyb21NZXNzYWdlU3RhdGVfID0gZnVuY3Rpb24gJGNoYXQkU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IkJGNoYXRTdGF0ZVVwZGF0ZUZyb21NZXNzYWdlU3RhdGVfJChtc2cpIHsKICB2YXIgbWVzc2FnZVN0YXRlID0gbmV3IHByb3RvLmFwcHMuY2hhdC5NZXNzYWdlU3RhdGUobXNnKSwgY2hhdFN0YXRlVXBkYXRlID0gbmV3IHByb3RvLmFwcHMuY2hhdC5DaGF0U3RhdGVVcGRhdGU7CiAgY2hhdFN0YXRlVXBkYXRlLnNldEppZChtZXNzYWdlU3RhdGUuZ2V0SmlkKCkpOwogIHZhciBzdGF0ZTsKICBzd2l0Y2gobWVzc2FnZVN0YXRlLmdldENoYXRTdGF0ZUNvZGUoKSkgewogICAgY2FzZSAiYyI6CiAgICAgIHN0YXRlID0gcHJvdG8uYXBwcy5jaGF0LkNoYXRTdGF0ZVVwZGF0ZS5DaGF0U3RhdGUuQ09NUE9TSU5HOwogICAgICBicmVhazsKICAgIGNhc2UgInAiOgogICAgICBzdGF0ZSA9IHByb3RvLmFwcHMuY2hhdC5DaGF0U3RhdGVVcGRhdGUuQ2hhdFN0YXRlLlBBVVNFRDsKICAgICAgYnJlYWs7CiAgICBjYXNlICJpIjoKICAgICAgc3RhdGUgPSBwcm90by5hcHBzLmNoYXQuQ2hhdFN0YXRlVXBkYXRlLkNoYXRTdGF0ZS5JRExFOwogICAgICBicmVhazsKICAgIGNhc2UgImciOgogICAgICBzdGF0ZSA9IHByb3RvLmFwcHMuY2hhdC5DaGF0U3RhdGVVcGRhdGUuQ2hhdFN0YXRlLkdPTkU7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgc3RhdGUgPSBwcm90by5hcHBzLmNoYXQuQ2hhdFN0YXRlVXBkYXRlLkNoYXRTdGF0ZS5BQ1RJVkUKICB9CiAgY2hhdFN0YXRlVXBkYXRlLnNldENoYXRTdGF0ZShzdGF0ZSk7CiAgcmV0dXJuIGNoYXRTdGF0ZVVwZGF0ZQp9OwpjaGF0Lldjc0NsaWVudCA9IGZ1bmN0aW9uICRjaGF0JFdjc0NsaWVudCQoYmFzZVVybCwgaG9zdGVkRG9tYWluLCBjbGllbnRJZCwgZ3Nlc3Npb25pZCwgdmVyc2lvbiwgY29va2llTmFtZSwgYXBwQ29udGV4dCwgb3B0X2RlYnVnLCBvcHRfcHJvcGVydHksIG9wdF9mb3J3YXJkQ2hhbm5lbFBpbmdJbnRlcnZhbE1zLCBvcHRfY2hhbm5lbFBhdGgsIG9wdF9jb29raWVJbmRleCwgb3B0X3VyaVBhcmFtcywgb3B0X2Jhc2VVcmxJc0Fic29sdXRlLCBvcHRfZXh0cmFIZWFkZXJzKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyLmNhbGwodGhpcyk7CiAgdGhpcy5zZXJ2ZXJNZXNzYWdlRGlzcGF0Y2hlciA9IGFwcENvbnRleHQuZ2V0T3JOdWxsKGNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyLlNFUlZJQ0VfSUQpIHx8IGNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VEaXNwYXRjaGVyLnJlZ2lzdGVyKGFwcENvbnRleHQpOwogIGFwcENvbnRleHQuaXNSZWdpc3RlcmVkKGNoYXQuY2xpZW50LlNlcnZlck1lc3NhZ2VTZW5kZXIuU0VSVklDRV9JRCkgfHwgY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZVNlbmRlci5yZWdpc3RlcihhcHBDb250ZXh0LCBnb29nLmJpbmQodGhpcy5zZW5kVG9TZXJ2ZXIsIHRoaXMpLCBnb29nLmJpbmQodGhpcy5zZW5kTWVzc2FnZVRvU2VydmVyLCB0aGlzKSk7CiAgYXBwQ29udGV4dC5nZXRPck51bGwoY2hhdC5tb2RlbC5NZS5TRVJWSUNFX0lEKSB8fCBjaGF0Lm1vZGVsLlNlcnZlclVwZGF0YWJsZU1lLnJlZ2lzdGVyKGFwcENvbnRleHQpOwogIGFwcENvbnRleHQuZ2V0T3JOdWxsKGNoYXQubW9kZWwuQ2hhdFNldC5TRVJWSUNFX0lEKSB8fCBjaGF0Lm1vZGVsLk11dGFibGVDaGF0U2V0LnJlZ2lzdGVyKGFwcENvbnRleHQpOwogIHRoaXMuY29udGFjdFNldF8gPSBhcHBDb250ZXh0LmdldE9yTnVsbChjaGF0Lm1vZGVsLkNvbnRhY3RTZXQuU0VSVklDRV9JRCkgfHwgY2hhdC5tb2RlbC5Db250YWN0U2V0LnJlZ2lzdGVyKGFwcENvbnRleHQpOwogIHRoaXMuYmFzZVVybF8gPSBuZXcgZ29vZy5VcmkoYmFzZVVybCk7CiAgdGhpcy5jaGFubmVsUGF0aF8gPSBvcHRfY2hhbm5lbFBhdGggfHwgImNoYW5uZWwiOwogIHRoaXMuY2xpZW50SWRfID0gY2xpZW50SWQ7CiAgdGhpcy52ZXJzaW9uXyA9IHZlcnNpb247CiAgdGhpcy5jb29raWVOYW1lXyA9IGNvb2tpZU5hbWU7CiAgdGhpcy5jb29raWVJbmRleF8gPSBvcHRfY29va2llSW5kZXggPyBvcHRfY29va2llSW5kZXggOiAwOwogIHRoaXMucHJvcGVydHlfID0gb3B0X3Byb3BlcnR5IHx8IGNoYXQuV2NzQ2xpZW50LkRFRkFVTFRfUFJPUEVSVFk7CiAgdGhpcy5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJjaGF0Lldjc0NsaWVudCIpOwogIHRoaXMudXJpUGFyYW1zXyA9IHt9OwogIGdvb2cub2JqZWN0LmFkZCh0aGlzLnVyaVBhcmFtc18sIGNoYXQuV2NzQ2xpZW50LlVybFBhcmFtZXRlcnMuQ0xJRU5UX0lELCBjbGllbnRJZCk7CiAgZ29vZy5vYmplY3QuYWRkKHRoaXMudXJpUGFyYW1zXywgY2hhdC5XY3NDbGllbnQuVXJsUGFyYW1ldGVycy5HT09HTEVfU0VTU0lPTl9JRCwgZ3Nlc3Npb25pZCk7CiAgZ29vZy5vYmplY3QuYWRkKHRoaXMudXJpUGFyYW1zXywgY2hhdC5XY3NDbGllbnQuVXJsUGFyYW1ldGVycy5QUk9QRVJUWSwgdGhpcy5wcm9wZXJ0eV8pOwogIDAgIT0gdGhpcy5jb29raWVJbmRleF8gJiYgZ29vZy5vYmplY3QuYWRkKHRoaXMudXJpUGFyYW1zXywgY2hhdC5XY3NDbGllbnQuVXJsUGFyYW1ldGVycy5BVVRIX1VTRVJfSU5ERVgsIHRoaXMuY29va2llSW5kZXhfKTsKICBvcHRfdXJpUGFyYW1zICYmIGdvb2cub2JqZWN0LmV4dGVuZCh0aGlzLnVyaVBhcmFtc18sIG9wdF91cmlQYXJhbXMpOwogIGdvb2cudXNlckFnZW50LklFIHx8IHRoaXMubGlzdGVuT25jZSh3aW5kb3csICJiZWZvcmV1bmxvYWQiLCB0aGlzLm9uVW5sb2FkXywgITApOwogIHRoaXMubGlzdGVuT25jZSh3aW5kb3csIGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5VTkxPQUQsIHRoaXMub25VbmxvYWRfLCAhMCk7CiAgdGhpcy5pbml0aWFsaXplZF8gPSAhMTsKICB0aGlzLmNoYXJUb0ludF8gPSB7fTsKICBmb3IodmFyIGkgPSAwOzI1NiA+IGk7KytpKSB7CiAgICB2YXIgaCA9IGkudG9TdHJpbmcoMTYpOwogICAgMSA9PSBoLmxlbmd0aCAmJiAoaCA9ICIwIiArIGgpOwogICAgaCA9ICIlIiArIGg7CiAgICB0aGlzLmNoYXJUb0ludF9bdW5lc2NhcGUoaCldID0gaQogIH0KICB0aGlzLmNvb2tpZV8gPSB0aGlzLmdldENvb2tpZV8oKTsKICB0aGlzLmNvb2tpZUhhc2hUaW1lcl8gPSBuZXcgZ29vZy5UaW1lcig1RTMpOwogIHRoaXMubGlzdGVuKHRoaXMuY29va2llSGFzaFRpbWVyXywgZ29vZy5UaW1lci5USUNLLCB0aGlzLm9uQ29va2llSGFzaFRpbWVyXywgITEsIHRoaXMpOwogIHRoaXMuY29va2llSGFzaFRpbWVyXy5zdGFydCgpOwogIGlmKHRoaXMuZm9yd2FyZENoYW5uZWxQaW5nVGltZXJfID0gb3B0X2ZvcndhcmRDaGFubmVsUGluZ0ludGVydmFsTXMgJiYgMCA8IG9wdF9mb3J3YXJkQ2hhbm5lbFBpbmdJbnRlcnZhbE1zID8gbmV3IGdvb2cuVGltZXIob3B0X2ZvcndhcmRDaGFubmVsUGluZ0ludGVydmFsTXMpIDogbnVsbCkgewogICAgdGhpcy5saXN0ZW4odGhpcy5mb3J3YXJkQ2hhbm5lbFBpbmdUaW1lcl8sIGdvb2cuVGltZXIuVElDSywgdGhpcy5zZW5kRm9yd2FyZENoYW5uZWxQaW5nXywgITEsIHRoaXMpLCB0aGlzLmZvcndhcmRDaGFubmVsUGluZ1RpbWVyXy5zdGFydCgpCiAgfQogIHRoaXMudHJhbnNsYXRvcl8gPSBhcHBDb250ZXh0LmdldE9yTnVsbChjaGF0LlNlcnZlck1lc3NhZ2VUcmFuc2xhdG9yLlNFUlZJQ0VfSUQpIHx8IGNoYXQuU2VydmVyTWVzc2FnZVRyYW5zbGF0b3IucmVnaXN0ZXIoYXBwQ29udGV4dCk7CiAgaWYoZ29vZy5pc051bGwoYXBwQ29udGV4dC5nZXRPck51bGwoZmF2YS5zZXJ2aWNlcy5CUk9XU0VSX0NIQU5ORUwpKSkgewogICAgdmFyIHVyaSA9IGdvb2cuVXJpLnJlc29sdmUodGhpcy5iYXNlVXJsXywgdGhpcy5jaGFubmVsUGF0aF8gKyAiLyIpOwogICAgdGhpcy5jaGFubmVsU2VydmljZV8gPSBuZXcgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcyhvcHRfYmFzZVVybElzQWJzb2x1dGUgPyB1cmkudG9TdHJpbmcoKSA6IHVyaS5nZXRQYXRoKCksIGNoYXQuV2NzQ2xpZW50LkNMSUVOVF9WRVJTSU9OLCB2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBvcHRfZXh0cmFIZWFkZXJzKQogIH1lbHNlIHsKICAgIHRoaXMuY2hhbm5lbFNlcnZpY2VfID0gZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5nZXQoYXBwQ29udGV4dCkKICB9CiAgdGhpcy5jaGFubmVsU2VydmljZV8uYWRkUGFyYW1ldGVyUHJvdmlkZXIodGhpcyk7CiAgdGhpcy5hcHBDb250ZXh0XyA9IGFwcENvbnRleHQ7CiAgdGhpcy5jaGF0Q2hhbm5lbF8gPSB0aGlzLmNoYW5uZWxTZXJ2aWNlXy5nZXRTdWJDaGFubmVsKGNoYXQuV2NzQ2xpZW50LkNIQVRfU1VCQ0hBTk5FTCk7CiAgdGhpcy5saXN0ZW4odGhpcy5jaGFubmVsU2VydmljZV8sIGZhdmEubmV0LkJyb3dzZXJDaGFubmVsU2VydmljZXMuRXZlbnRUeXBlLlNUQVRFX0NIQU5HRUQsIHRoaXMub25DaGFubmVsU3RhdGVDaGFuZ2VkXywgITAsIHRoaXMpOwogIHRoaXMubGlzdGVuKHRoaXMuY2hhdENoYW5uZWxfLCBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN1YkNoYW5uZWwuRXZlbnRUeXBlLlJFU1BPTlNFX1JFQ0VJVkVELCB0aGlzLm9uUmVzcG9uc2VSZWNlaXZlZF8sICEwLCB0aGlzKQp9Owpnb29nLmluaGVyaXRzKGNoYXQuV2NzQ2xpZW50LCBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIpOwpjaGF0Lldjc0NsaWVudC5VcmxQYXJhbWV0ZXJzID0ge0FVVEhfVVNFUl9JTkRFWDoiYXV0aHVzZXIiLCBDTElFTlRfSUQ6ImNsaWQiLCBHT09HTEVfU0VTU0lPTl9JRDoiZ3Nlc3Npb25pZCIsIFBST1BFUlRZOiJwcm9wIiwgVVNFUl9KSURfUkVTT1VSQ0U6InVqaWRyIiwgRU5USVRZX0lEOiJlaWQifTsKY2hhdC5XY3NDbGllbnQuQ0xJRU5UX1ZFUlNJT04gPSAiMSI7CmNoYXQuV2NzQ2xpZW50LkNIQVRfU1VCQ0hBTk5FTCA9ICJjIjsKY2hhdC5XY3NDbGllbnQuU1RJQ0tZX1BBUkFNID0gImdzZXNzaW9uaWQiOwpjaGF0Lldjc0NsaWVudC5QUkVGX05PVElGSUNBVElPTlNfT05MWV9QQVJBTSA9ICJubyI7CmNoYXQuV2NzQ2xpZW50LkRFRkFVTFRfUFJPUEVSVFkgPSAid2NzIjsKY2hhdC5XY3NDbGllbnQucHJvdG90eXBlLm9uVW5sb2FkQmVmb3JlRGlzcG9zZSA9IGdvb2cubnVsbEZ1bmN0aW9uOwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUub25VbmxvYWRfID0gZnVuY3Rpb24gJGNoYXQkV2NzQ2xpZW50JCRvblVubG9hZF8kKCkgewogIHRoaXMudW5sb2FkZWRfIHx8ICh0aGlzLnVubG9hZGVkXyA9ICEwLCB0aGlzLm9uVW5sb2FkQmVmb3JlRGlzcG9zZSgpLCBnb29nLmRpc3Bvc2UodGhpcykpCn07CmNoYXQuV2NzQ2xpZW50LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgY2hhdC5XY3NDbGllbnQuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgZ29vZy5kaXNwb3NlKHRoaXMuc2VydmVyTWVzc2FnZURpc3BhdGNoZXIpOwogIGdvb2cuZGlzcG9zZSh0aGlzLnRyYW5zbGF0b3JfKTsKICB0aGlzLmNoYW5uZWxTZXJ2aWNlXy5yZW1vdmVQYXJhbWV0ZXJQcm92aWRlcih0aGlzKTsKICB0aGlzLmNoYW5uZWxTZXJ2aWNlXy5kaXNwb3NlKCk7CiAgdGhpcy5jb29raWVIYXNoVGltZXJfICYmICh0aGlzLmNvb2tpZUhhc2hUaW1lcl8uZGlzcG9zZSgpLCB0aGlzLmNvb2tpZUhhc2hUaW1lcl8gPSBudWxsKTsKICB0aGlzLmZvcndhcmRDaGFubmVsUGluZ1RpbWVyXyAmJiAodGhpcy5mb3J3YXJkQ2hhbm5lbFBpbmdUaW1lcl8uZGlzcG9zZSgpLCB0aGlzLmZvcndhcmRDaGFubmVsUGluZ1RpbWVyXyA9IG51bGwpOwogIGdvb2cubmV0LlhocklvLmNsZWFudXAoKTsKICBnb29nLmdsb2JhbC5vbmVycm9yID0gbnVsbAp9OwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICRjaGF0JFdjc0NsaWVudCQkZ2V0Q29udGV4dCQoKSB7CiAgcmV0dXJuIHRoaXMuYXBwQ29udGV4dF8KfTsKY2hhdC5XY3NDbGllbnQucHJvdG90eXBlLmJlZm9yZVJlbG9hZF8gPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJGJlZm9yZVJlbG9hZF8kKHNhbWVVc2VyLCBvbkZpbmlzaCkgewogIG9uRmluaXNoKCkKfTsKY2hhdC5XY3NDbGllbnQucHJvdG90eXBlLmlzSW5pdGlhbGl6ZWQgPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJGlzSW5pdGlhbGl6ZWQkKCkgewogIHJldHVybiB0aGlzLmluaXRpYWxpemVkXwp9OwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUuYWRkQ2hhbm5lbFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJGFkZENoYW5uZWxQYXJhbWV0ZXJzJChwYXJhbXMpIHsKICBnb29nLm9iamVjdC5leHRlbmQocGFyYW1zLCB0aGlzLnVyaVBhcmFtc18pOwogIHJldHVybiBwYXJhbXMKfTsKY2hhdC5XY3NDbGllbnQucHJvdG90eXBlLmdldENvb2tpZV8gPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJGdldENvb2tpZV8kKG9wdF9jb29raWVOYW1lKSB7CiAgdmFyIG5hbWU7CiAgaWYob3B0X2Nvb2tpZU5hbWUpIHsKICAgIG5hbWUgPSBvcHRfY29va2llTmFtZSArICI9IgogIH1lbHNlIHsKICAgIGlmKCJXQ1giID09IHRoaXMuY29va2llTmFtZV8pIHsKICAgICAgdmFyIG11bHRpQXV0aENvb2tpZSA9IHRoaXMuZ2V0Q29va2llXygiV0NNIik7CiAgICAgIGlmKG51bGwgIT0gbXVsdGlBdXRoQ29va2llKSB7CiAgICAgICAgcmV0dXJuIG11bHRpQXV0aENvb2tpZQogICAgICB9CiAgICB9CiAgICBuYW1lID0gdGhpcy5jb29raWVOYW1lXyArICI9IgogIH0KICBmb3IodmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKSwgaSA9IDA7aSA8IGNvb2tpZXMubGVuZ3RoOysraSkgewogICAgdmFyIGNvb2tpZSA9IGNvb2tpZXNbaV0sIGluZGV4ID0gY29va2llLmluZGV4T2YobmFtZSk7CiAgICBpZigtMSA8IGluZGV4KSB7CiAgICAgIHJldHVybiBjb29raWUuc3Vic3RyaW5nKGluZGV4ICsgbmFtZS5sZW5ndGgpCiAgICB9CiAgfQogIHJldHVybiBudWxsCn07CmNoYXQuV2NzQ2xpZW50LnByb3RvdHlwZS5vbkNvb2tpZUhhc2hUaW1lcl8gPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJG9uQ29va2llSGFzaFRpbWVyXyQoKSB7CiAgdmFyIGNvb2tpZSA9IHRoaXMuZ2V0Q29va2llXygpOwogIHRoaXMuY29va2llXyAhPSBjb29raWUgJiYgKHRoaXMuY29va2llXyA9IGNvb2tpZSkKfTsKY2hhdC5XY3NDbGllbnQucHJvdG90eXBlLnNlbmRGb3J3YXJkQ2hhbm5lbFBpbmdfID0gZnVuY3Rpb24gJGNoYXQkV2NzQ2xpZW50JCRzZW5kRm9yd2FyZENoYW5uZWxQaW5nXyQoKSB7CiAgdGhpcy5pc0NoYW5uZWxCb3VuZCgpICYmIHRoaXMuc2VuZFRvU2VydmVyKFsibm9vcCJdKQp9OwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUucmVzZXRGb3J3YXJkQ2hhbm5lbFBpbmdUaW1lcl8gPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJHJlc2V0Rm9yd2FyZENoYW5uZWxQaW5nVGltZXJfJCgpIHsKICB0aGlzLmZvcndhcmRDaGFubmVsUGluZ1RpbWVyXyAmJiAodGhpcy5mb3J3YXJkQ2hhbm5lbFBpbmdUaW1lcl8uc3RvcCgpLCB0aGlzLmZvcndhcmRDaGFubmVsUGluZ1RpbWVyXy5zdGFydCgpKQp9OwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUucmVsb2FkXyA9IGZ1bmN0aW9uICRjaGF0JFdjc0NsaWVudCQkcmVsb2FkXyQoc2FtZVVzZXIpIHsKICB0aGlzLmJlZm9yZVJlbG9hZF8oc2FtZVVzZXIsIGdvb2cuYmluZCh0aGlzLmFmdGVyUmVsb2FkXywgdGhpcywgc2FtZVVzZXIpKQp9OwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUuYWZ0ZXJSZWxvYWRfID0gZnVuY3Rpb24gJGNoYXQkV2NzQ2xpZW50JCRhZnRlclJlbG9hZF8kKHNhbWVVc2VyKSB7CiAgKHdpbmRvdy5wYXJlbnQgPT09IHdpbmRvdy5zZWxmIHx8ICF0aGlzLnRyeVJlbG9hZF8od2luZG93LnBhcmVudCwgc2FtZVVzZXIpKSAmJiB0aGlzLnRyeVJlbG9hZF8od2luZG93LnNlbGYsIHNhbWVVc2VyKQp9OwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUudHJ5UmVsb2FkXyA9IGZ1bmN0aW9uICRjaGF0JFdjc0NsaWVudCQkdHJ5UmVsb2FkXyQod2luLCBzYW1lVXNlcikgewogIHRyeSB7CiAgICB2YXIgbG9jID0gIiIgKyB3aW4ubG9jYXRpb247CiAgICBpZihsb2MpIHsKICAgICAgdmFyIHVyaSA9IG5ldyBnb29nLlVyaShsb2MpOwogICAgICB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoInYiLCB0aGlzLnZlcnNpb25fKTsKICAgICAgc2FtZVVzZXIgPyB1cmkuc2V0UGFyYW1ldGVyVmFsdWUoImNsaWQiLCB0aGlzLmNsaWVudElkXykgOiB1cmkuZ2V0UXVlcnlEYXRhKCkucmVtb3ZlKCJjbGlkIik7CiAgICAgIHRoaXMubG9nZ2VyXy5pbmZvKCJSZWxvYWRpbmc6ICAiICsgdXJpLnRvU3RyaW5nKCkpOwogICAgICB3aW4ubG9jYXRpb24gPSB1cmkudG9TdHJpbmcoKTsKICAgICAgcmV0dXJuITAKICAgIH0KICB9Y2F0Y2goZSkgewogICAgdGhpcy5sb2dnZXJfLndhcm5pbmcoInRyeVJlbG9hZCBlcnJvcjogIiArIGUubWVzc2FnZSksIGNoYXQuY29tbW9uLkVycm9ySGFuZGxlci5yZXBvcnRFcnJvcihlKQogIH0KICByZXR1cm4hMQp9OwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUuc2VuZE1lc3NhZ2VUb1NlcnZlciA9IGZ1bmN0aW9uICRjaGF0JFdjc0NsaWVudCQkc2VuZE1lc3NhZ2VUb1NlcnZlciQobWVzc2FnZSwgb3B0X3F1ZXVlLCBvcHRfY2xpZW50SWQpIHsKICB2YXIgc2VyaWFsaXplZEFycmF5OwogIHRyeSB7CiAgICBzZXJpYWxpemVkQXJyYXkgPSBnb29nLmpzb24uc2VyaWFsaXplKG1lc3NhZ2UudG9BcnJheSgpLnNsaWNlKDEpKQogIH1jYXRjaChlKSB7CiAgICByZXR1cm4gdGhpcy5sb2dnZXJfLnNldmVyZSgiZXJyb3Igc2VyaWFsaXppbmcgbWVzc2FnZTogIiArIG1lc3NhZ2UudG9BcnJheSgpKSwgY2hhdC5jb21tb24uRXJyb3JIYW5kbGVyLnJlcG9ydEVycm9yKGUpLCAhMQogIH0KICB2YXIgbWFwID0ge3Q6bWVzc2FnZS5nZXRKc1BiTWVzc2FnZUlkKCksIHA6c2VyaWFsaXplZEFycmF5fTsKICByZXR1cm4gdGhpcy5zZW5kTWFwXyhtYXAsIG9wdF9xdWV1ZSwgb3B0X2NsaWVudElkKQp9OwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUuc2VuZFRvU2VydmVyID0gZnVuY3Rpb24gJGNoYXQkV2NzQ2xpZW50JCRzZW5kVG9TZXJ2ZXIkKG1zZywgb3B0X3F1ZXVlLCBvcHRfY2xpZW50SWQpIHsKICBpZihudWxsID09IG1zZyB8fCAhZ29vZy5pc0FycmF5KG1zZykpIHsKICAgIHJldHVybiB0aGlzLmxvZ2dlcl8uc2V2ZXJlKCJzZW5kaW5nIGludmFsaWQgYXJyYXk6ICIgKyBtc2cpLCAhMQogIH0KICB2YXIganNwYk1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0b3JfLmNvbnZlcnRUb0pzUGIobXNnKTsKICBpZihqc3BiTWVzc2FnZSkgewogICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VUb1NlcnZlcihqc3BiTWVzc2FnZSwgb3B0X3F1ZXVlLCBvcHRfY2xpZW50SWQpCiAgfQogIHZhciBzZXJpYWxpemVkQXJyYXk7CiAgdHJ5IHsKICAgIHNlcmlhbGl6ZWRBcnJheSA9IGdvb2cuanNvbi5zZXJpYWxpemUobXNnKQogIH1jYXRjaChlKSB7CiAgICByZXR1cm4gdGhpcy5sb2dnZXJfLnNldmVyZSgiZXJyb3Igc2VyaWFsaXppbmcgYXJyYXk6ICIgKyBtc2cpLCBjaGF0LmNvbW1vbi5FcnJvckhhbmRsZXIucmVwb3J0RXJyb3IoZSksICExCiAgfQogIHZhciBtYXAgPSB7bTpzZXJpYWxpemVkQXJyYXl9OwogIHJldHVybiB0aGlzLnNlbmRNYXBfKG1hcCwgb3B0X3F1ZXVlLCBvcHRfY2xpZW50SWQpCn07CmNoYXQuV2NzQ2xpZW50LnByb3RvdHlwZS5zZW5kTWFwXyA9IGZ1bmN0aW9uICRjaGF0JFdjc0NsaWVudCQkc2VuZE1hcF8kKG1hcCwgb3B0X3F1ZXVlLCBvcHRfY2xpZW50SWQpIHsKICB2YXIgY2xpZW50SWQgPSBvcHRfY2xpZW50SWQgfHwgdGhpcy5jbGllbnRJZF87CiAgbWFwLmMgPSBjbGllbnRJZDsKICBpZih0aGlzLmNoYXRDaGFubmVsXy5jYW5TZW5kTWFwKCkpIHsKICAgIHJldHVybiBvcHRfcXVldWUgPyB0aGlzLmNoYXRDaGFubmVsXy5zZW5kTWFwKG1hcCwgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TZW5kUHJpb3JpdHkuTE9XKSA6ICh0aGlzLmNoYXRDaGFubmVsXy5zZW5kTWFwKG1hcCksIHRoaXMucmVzZXRGb3J3YXJkQ2hhbm5lbFBpbmdUaW1lcl8oKSksICEwCiAgfQogIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJDYW5ub3Qgc2VuZCBtZXNzYWdlOiAiICsgY2xpZW50SWQgKyAiOiAiICsgbWFwKTsKICByZXR1cm4hMQp9OwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUuaXNDaGFubmVsQm91bmQgPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJGlzQ2hhbm5lbEJvdW5kJCgpIHsKICByZXR1cm4gdGhpcy5jaGFubmVsU2VydmljZV8uZ2V0U3RhdGUoKSA9PSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkJPVU5ECn07CmNoYXQuV2NzQ2xpZW50LnByb3RvdHlwZS5jcmVhdGVDaGFubmVsXyA9IGZ1bmN0aW9uICRjaGF0JFdjc0NsaWVudCQkY3JlYXRlQ2hhbm5lbF8kKCkgewogIHRoaXMubG9nZ2VyXy5pbmZvKCJDb25uZWN0aW5nIGJyb3dzZXIgY2hhbm5lbC4iKTsKICB0aGlzLmNoYW5uZWxTZXJ2aWNlXy5jb25uZWN0KCkKfTsKY2hhdC5XY3NDbGllbnQucHJvdG90eXBlLm9uQ2hhbm5lbFN0YXRlQ2hhbmdlZF8gPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJG9uQ2hhbm5lbFN0YXRlQ2hhbmdlZF8kKGUpIHsKICB0aGlzLmxvZ2dlcl8uaW5mbygiQnJvd3NlciBjaGFubmVsIHN0YXRlIGNoYW5nZTogIiArIGUub2xkU3RhdGUgKyAiLT4iICsgZS5uZXdTdGF0ZSk7CiAgc3dpdGNoKGUubmV3U3RhdGUpIHsKICAgIGNhc2UgZmF2YS5uZXQuQnJvd3NlckNoYW5uZWxTZXJ2aWNlcy5TdGF0ZS5CT1VORDoKICAgICAgdGhpcy5vbkNoYW5uZWxPcGVuZWRfKCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkRJU0NPTk5FQ1RFRDoKICAgICAgdGhpcy5vbkNoYW5uZWxDbG9zZWRfKCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBmYXZhLm5ldC5Ccm93c2VyQ2hhbm5lbFNlcnZpY2VzLlN0YXRlLkVSUk9SOgogICAgICB0aGlzLm9uQ2hhbm5lbEVycm9yXyhlLmVycm9yKQogIH0KfTsKY2hhdC5XY3NDbGllbnQucHJvdG90eXBlLm9uQ2hhbm5lbE9wZW5lZF8gPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJG9uQ2hhbm5lbE9wZW5lZF8kKCkgewogIHRoaXMubG9nZ2VyXy5pbmZvKCJCcm93c2VyIGNoYW5uZWwgb3BlbmVkIik7CiAgdGhpcy5zZW5kVG9TZXJ2ZXIoWyJjb25uZWN0LWFkZC1jbGllbnQiXSkKfTsKY2hhdC5XY3NDbGllbnQucHJvdG90eXBlLm9uQ2hhbm5lbEVycm9yXyA9IGZ1bmN0aW9uICRjaGF0JFdjc0NsaWVudCQkb25DaGFubmVsRXJyb3JfJChlcnJvcikgewogIHZhciByZXRyeVRpbWUgPSB0aGlzLmNoYW5uZWxTZXJ2aWNlXy5nZXROZXh0UmV0cnlUaW1lKCk7CiAgZ29vZy5pc051bGwocmV0cnlUaW1lKSB8fCAodGhpcy5sb2dnZXJfLmluZm8oIkJyb3dzZXIgY2hhbm5lbCBlcnJvciBzdGF0ZTogIiArIGVycm9yICsgIi4gUmV0cnkgQCAiICsgcmV0cnlUaW1lKSwgdGhpcy5pbml0aWFsaXplZF8gPSAhMSwgNDAxID09IHRoaXMuY2hhbm5lbFNlcnZpY2VfLmdldExhc3RTdGF0dXNDb2RlKCkgJiYgdGhpcy5yZWxvYWRfKCExKSkKfTsKY2hhdC5XY3NDbGllbnQucHJvdG90eXBlLm9uQ2hhbm5lbENsb3NlZF8gPSBmdW5jdGlvbiAkY2hhdCRXY3NDbGllbnQkJG9uQ2hhbm5lbENsb3NlZF8kKCkgewogIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJCcm93c2VyIGNoYW5uZWwgY2xvc2VkIik7CiAgdGhpcy5pbml0aWFsaXplZF8gPSAhMQp9OwpjaGF0Lldjc0NsaWVudC5wcm90b3R5cGUub25SZXNwb25zZVJlY2VpdmVkXyA9IGZ1bmN0aW9uICRjaGF0JFdjc0NsaWVudCQkb25SZXNwb25zZVJlY2VpdmVkXyQoZSkgewogIHZhciBhcnIgPSBlLnJlc3BvbnNlQXJyYXk7CiAgaWYoMiAhPSBhcnIubGVuZ3RoKSB7CiAgICB0aGlzLmxvZ2dlcl8uc2V2ZXJlKCJBcnJheSBmcm9tIHNlcnZlciBpcyBub3QgbGVuZ3RoIDI6ICIgKyBhcnIpCiAgfWVsc2UgewogICAgaWYoInYiID09IGFyclsxXVswXSkgewogICAgICB0aGlzLmxvZ2dlcl8uaW5mbygiUmVjZWl2ZWQgdmVyc2lvbjogIiArIGFyclsxXSksIHRoaXMudmVyc2lvbl8gIT0gYXJyWzFdWzFdICYmIHRoaXMucmVsb2FkXyghMCkKICAgIH1lbHNlIHsKICAgICAgInB1IiA9PSBhcnJbMV1bMF0gJiYgKHRoaXMuaW5pdGlhbGl6ZWRfID0gITApOwogICAgICBmb3IodmFyIG1zZ3MgPSB0aGlzLnRyYW5zbGF0b3JfLnRyYW5zbGF0ZShhcnJbMV0pLCBpID0gMDtpIDwgbXNncy5sZW5ndGg7KytpKSB7CiAgICAgIH0KICAgIH0KICB9Cn07CnByb3RvLmFwcHMuY2hhdC5Mb2dJbXByZXNzaW9uID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRMb2dJbXByZXNzaW9uJChvcHRfZGF0YSkgewogIGpzcGIuTWVzc2FnZS5jYWxsKHRoaXMpOwogIHRoaXMuYXJyYXkgPSBvcHRfZGF0YSB8fCBbImxpIl07CiAgdGhpcy5hcnJheVsyXSA9IHRoaXMuYXJyYXlbMl0gfHwgW10KfTsKZ29vZy5pbmhlcml0cyhwcm90by5hcHBzLmNoYXQuTG9nSW1wcmVzc2lvbiwganNwYi5NZXNzYWdlKTsKcHJvdG8uYXBwcy5jaGF0LkxvZ0ltcHJlc3Npb24ubWVzc2FnZUlkID0gImxpIjsKanNwYi5NZXNzYWdlLnJlZ2lzdGVyTWVzc2FnZVR5cGUocHJvdG8uYXBwcy5jaGF0LkxvZ0ltcHJlc3Npb24ubWVzc2FnZUlkLCBwcm90by5hcHBzLmNoYXQuTG9nSW1wcmVzc2lvbik7CnByb3RvLmFwcHMuY2hhdC5Mb2dJbXByZXNzaW9uLnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRMb2dJbXByZXNzaW9uJCRnZXRKc1BiTWVzc2FnZUlkJCgpIHsKICByZXR1cm4gcHJvdG8uYXBwcy5jaGF0LkxvZ0ltcHJlc3Npb24ubWVzc2FnZUlkCn07CnByb3RvLmFwcHMuY2hhdC5Mb2dJbXByZXNzaW9uLnByb3RvdHlwZS5nZXRJbXByZXNzaW9uID0gZnVuY3Rpb24gJHByb3RvJGFwcHMkY2hhdCRMb2dJbXByZXNzaW9uJCRnZXRJbXByZXNzaW9uJCgpIHsKICByZXR1cm4gdGhpcy5hcnJheVsxXQp9Owpwcm90by5hcHBzLmNoYXQuTG9nSW1wcmVzc2lvbi5wcm90b3R5cGUuc2V0SW1wcmVzc2lvbiA9IGZ1bmN0aW9uICRwcm90byRhcHBzJGNoYXQkTG9nSW1wcmVzc2lvbiQkc2V0SW1wcmVzc2lvbiQodmFsdWUpIHsKICB0aGlzLmFycmF5WzFdID0gdmFsdWUKfTsKcHJvdG8uYXBwcy5jaGF0LkxvZ0ltcHJlc3Npb24ucHJvdG90eXBlLnNldFBhcmFtZXRlckxpc3QgPSBmdW5jdGlvbiAkcHJvdG8kYXBwcyRjaGF0JExvZ0ltcHJlc3Npb24kJHNldFBhcmFtZXRlckxpc3QkKHZhbHVlKSB7CiAgdmFsdWUgPSB2YWx1ZSB8fCBbXTsKICB0aGlzLmFycmF5WzJdID0gdmFsdWUKfTsKZ29vZy5uZXQuQ29va2llcyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDb29raWVzJChjb250ZXh0KSB7CiAgdGhpcy5kb2N1bWVudF8gPSBjb250ZXh0Cn07Cmdvb2cubmV0LkNvb2tpZXMuTUFYX0NPT0tJRV9MRU5HVEggPSAzOTUwOwpnb29nLm5ldC5Db29raWVzLlNQTElUX1JFXyA9IC9ccyo7XHMqLzsKZ29vZy5uZXQuQ29va2llcy5URVNUX0NPT0tJRV9OQU1FXyA9ICJDT09LSUVTX1RFU1RfIjsKZ29vZy5uZXQuQ29va2llcy5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24gJGdvb2ckbmV0JENvb2tpZXMkJGlzRW5hYmxlZCQoKSB7CiAgdmFyIGlzRW5hYmxlZCA9IHRoaXMuaXNOYXZpZ2F0b3JDb29raWVFbmFibGVkXygpOwogIGlmKGlzRW5hYmxlZCAmJiBnb29nLnVzZXJBZ2VudC5XRUJLSVQpIHsKICAgIHZhciBjb29raWVOYW1lID0gZ29vZy5uZXQuQ29va2llcy5URVNUX0NPT0tJRV9OQU1FXyArIGdvb2cubm93KCk7CiAgICBnb29nLm5ldC5jb29raWVzLnNldChjb29raWVOYW1lLCAiMSIpOwogICAgaWYoIXRoaXMuZ2V0KGNvb2tpZU5hbWUpKSB7CiAgICAgIHJldHVybiExCiAgICB9CiAgICB0aGlzLnJlbW92ZShjb29raWVOYW1lKQogIH0KICByZXR1cm4gaXNFbmFibGVkCn07Cmdvb2cubmV0LkNvb2tpZXMucHJvdG90eXBlLmlzVmFsaWROYW1lID0gZnVuY3Rpb24gJGdvb2ckbmV0JENvb2tpZXMkJGlzVmFsaWROYW1lJChuYW1lKSB7CiAgcmV0dXJuIS9bOz1cc10vLnRlc3QobmFtZSkKfTsKZ29vZy5uZXQuQ29va2llcy5wcm90b3R5cGUuaXNWYWxpZFZhbHVlID0gZnVuY3Rpb24gJGdvb2ckbmV0JENvb2tpZXMkJGlzVmFsaWRWYWx1ZSQodmFsdWUpIHsKICByZXR1cm4hL1s7XHJcbl0vLnRlc3QodmFsdWUpCn07Cmdvb2cubmV0LkNvb2tpZXMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICRnb29nJG5ldCRDb29raWVzJCRzZXQkKG5hbWUsIHZhbHVlLCBvcHRfbWF4QWdlLCBvcHRfcGF0aCwgb3B0X2RvbWFpbiwgb3B0X3NlY3VyZSkgewogIGlmKCF0aGlzLmlzVmFsaWROYW1lKG5hbWUpKSB7CiAgICB0aHJvdyBFcnJvcignSW52YWxpZCBjb29raWUgbmFtZSAiJyArIG5hbWUgKyAnIicpOwogIH0KICBpZighdGhpcy5pc1ZhbGlkVmFsdWUodmFsdWUpKSB7CiAgICB0aHJvdyBFcnJvcignSW52YWxpZCBjb29raWUgdmFsdWUgIicgKyB2YWx1ZSArICciJyk7CiAgfQogIGdvb2cuaXNEZWYob3B0X21heEFnZSkgfHwgKG9wdF9tYXhBZ2UgPSAtMSk7CiAgdmFyIGRvbWFpblN0ciA9IG9wdF9kb21haW4gPyAiO2RvbWFpbj0iICsgb3B0X2RvbWFpbiA6ICIiLCBwYXRoU3RyID0gb3B0X3BhdGggPyAiO3BhdGg9IiArIG9wdF9wYXRoIDogIiIsIHNlY3VyZVN0ciA9IG9wdF9zZWN1cmUgPyAiO3NlY3VyZSIgOiAiIiwgZXhwaXJlc1N0cjsKICBpZigwID4gb3B0X21heEFnZSkgewogICAgZXhwaXJlc1N0ciA9ICIiCiAgfWVsc2UgewogICAgaWYoMCA9PSBvcHRfbWF4QWdlKSB7CiAgICAgIHZhciBwYXN0RGF0ZSA9IG5ldyBEYXRlKDE5NzAsIDEsIDEpOwogICAgICBleHBpcmVzU3RyID0gIjtleHBpcmVzPSIgKyBwYXN0RGF0ZS50b1VUQ1N0cmluZygpCiAgICB9ZWxzZSB7CiAgICAgIHZhciBmdXR1cmVEYXRlID0gbmV3IERhdGUoZ29vZy5ub3coKSArIDFFMyAqIG9wdF9tYXhBZ2UpOwogICAgICBleHBpcmVzU3RyID0gIjtleHBpcmVzPSIgKyBmdXR1cmVEYXRlLnRvVVRDU3RyaW5nKCkKICAgIH0KICB9CiAgdGhpcy5zZXRDb29raWVfKG5hbWUgKyAiPSIgKyB2YWx1ZSArIGRvbWFpblN0ciArIHBhdGhTdHIgKyBleHBpcmVzU3RyICsgc2VjdXJlU3RyKQp9Owpnb29nLm5ldC5Db29raWVzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ29va2llcyQkZ2V0JChuYW1lLCBvcHRfZGVmYXVsdCkgewogIGZvcih2YXIgbmFtZUVxID0gbmFtZSArICI9IiwgcGFydHMgPSB0aGlzLmdldFBhcnRzXygpLCBpID0gMCwgcGFydDtwYXJ0ID0gcGFydHNbaV07aSsrKSB7CiAgICBpZigwID09IHBhcnQuaW5kZXhPZihuYW1lRXEpKSB7CiAgICAgIHJldHVybiBwYXJ0LnN1YnN0cihuYW1lRXEubGVuZ3RoKQogICAgfQogIH0KICByZXR1cm4gb3B0X2RlZmF1bHQKfTsKZ29vZy5uZXQuQ29va2llcy5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gJGdvb2ckbmV0JENvb2tpZXMkJHJlbW92ZSQobmFtZSwgb3B0X3BhdGgsIG9wdF9kb21haW4pIHsKICB2YXIgcnYgPSB0aGlzLmNvbnRhaW5zS2V5KG5hbWUpOwogIHRoaXMuc2V0KG5hbWUsICIiLCAwLCBvcHRfcGF0aCwgb3B0X2RvbWFpbik7CiAgcmV0dXJuIHJ2Cn07Cmdvb2cubmV0LkNvb2tpZXMucHJvdG90eXBlLmdldEtleXMgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ29va2llcyQkZ2V0S2V5cyQoKSB7CiAgcmV0dXJuIHRoaXMuZ2V0S2V5VmFsdWVzXygpLmtleXMKfTsKZ29vZy5uZXQuQ29va2llcy5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24gJGdvb2ckbmV0JENvb2tpZXMkJGdldFZhbHVlcyQoKSB7CiAgcmV0dXJuIHRoaXMuZ2V0S2V5VmFsdWVzXygpLnZhbHVlcwp9Owpnb29nLm5ldC5Db29raWVzLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gJGdvb2ckbmV0JENvb2tpZXMkJGlzRW1wdHkkKCkgewogIHJldHVybiF0aGlzLmdldENvb2tpZV8oKQp9Owpnb29nLm5ldC5Db29raWVzLnByb3RvdHlwZS5nZXRDb3VudCA9IGZ1bmN0aW9uICRnb29nJG5ldCRDb29raWVzJCRnZXRDb3VudCQoKSB7CiAgdmFyIGNvb2tpZSA9IHRoaXMuZ2V0Q29va2llXygpOwogIHJldHVybiFjb29raWUgPyAwIDogdGhpcy5nZXRQYXJ0c18oKS5sZW5ndGgKfTsKZ29vZy5uZXQuQ29va2llcy5wcm90b3R5cGUuY29udGFpbnNLZXkgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ29va2llcyQkY29udGFpbnNLZXkkKGtleSkgewogIHJldHVybiBnb29nLmlzRGVmKHRoaXMuZ2V0KGtleSkpCn07Cmdvb2cubmV0LkNvb2tpZXMucHJvdG90eXBlLmNvbnRhaW5zVmFsdWUgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ29va2llcyQkY29udGFpbnNWYWx1ZSQodmFsdWUpIHsKICBmb3IodmFyIHZhbHVlcyA9IHRoaXMuZ2V0S2V5VmFsdWVzXygpLnZhbHVlcywgaSA9IDA7aSA8IHZhbHVlcy5sZW5ndGg7aSsrKSB7CiAgICBpZih2YWx1ZXNbaV0gPT0gdmFsdWUpIHsKICAgICAgcmV0dXJuITAKICAgIH0KICB9CiAgcmV0dXJuITEKfTsKZ29vZy5uZXQuQ29va2llcy5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ29va2llcyQkY2xlYXIkKCkgewogIGZvcih2YXIga2V5cyA9IHRoaXMuZ2V0S2V5VmFsdWVzXygpLmtleXMsIGkgPSBrZXlzLmxlbmd0aCAtIDE7MCA8PSBpO2ktLSkgewogICAgdGhpcy5yZW1vdmUoa2V5c1tpXSkKICB9Cn07Cmdvb2cubmV0LkNvb2tpZXMucHJvdG90eXBlLnNldENvb2tpZV8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ29va2llcyQkc2V0Q29va2llXyQocykgewogIHRoaXMuZG9jdW1lbnRfLmNvb2tpZSA9IHMKfTsKZ29vZy5uZXQuQ29va2llcy5wcm90b3R5cGUuZ2V0Q29va2llXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDb29raWVzJCRnZXRDb29raWVfJCgpIHsKICByZXR1cm4gdGhpcy5kb2N1bWVudF8uY29va2llCn07Cmdvb2cubmV0LkNvb2tpZXMucHJvdG90eXBlLmdldFBhcnRzXyA9IGZ1bmN0aW9uICRnb29nJG5ldCRDb29raWVzJCRnZXRQYXJ0c18kKCkgewogIHJldHVybih0aGlzLmdldENvb2tpZV8oKSB8fCAiIikuc3BsaXQoZ29vZy5uZXQuQ29va2llcy5TUExJVF9SRV8pCn07Cmdvb2cubmV0LkNvb2tpZXMucHJvdG90eXBlLmlzTmF2aWdhdG9yQ29va2llRW5hYmxlZF8gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ29va2llcyQkaXNOYXZpZ2F0b3JDb29raWVFbmFibGVkXyQoKSB7CiAgcmV0dXJuIG5hdmlnYXRvci5jb29raWVFbmFibGVkCn07Cmdvb2cubmV0LkNvb2tpZXMucHJvdG90eXBlLmdldEtleVZhbHVlc18gPSBmdW5jdGlvbiAkZ29vZyRuZXQkQ29va2llcyQkZ2V0S2V5VmFsdWVzXyQoKSB7CiAgZm9yKHZhciBwYXJ0cyA9IHRoaXMuZ2V0UGFydHNfKCksIGtleXMgPSBbXSwgdmFsdWVzID0gW10sIGluZGV4LCBwYXJ0LCBpID0gMDtwYXJ0ID0gcGFydHNbaV07aSsrKSB7CiAgICBpbmRleCA9IHBhcnQuaW5kZXhPZigiPSIpLCAtMSA9PSBpbmRleCA/IChrZXlzLnB1c2goIiIpLCB2YWx1ZXMucHVzaChwYXJ0KSkgOiAoa2V5cy5wdXNoKHBhcnQuc3Vic3RyaW5nKDAsIGluZGV4KSksIHZhbHVlcy5wdXNoKHBhcnQuc3Vic3RyaW5nKGluZGV4ICsgMSkpKQogIH0KICByZXR1cm57a2V5czprZXlzLCB2YWx1ZXM6dmFsdWVzfQp9Owpnb29nLm5ldC5jb29raWVzID0gbmV3IGdvb2cubmV0LkNvb2tpZXMoZG9jdW1lbnQpOwpnb29nLm5ldC5jb29raWVzLk1BWF9DT09LSUVfTEVOR1RIID0gZ29vZy5uZXQuQ29va2llcy5NQVhfQ09PS0lFX0xFTkdUSDsKY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlciA9IGZ1bmN0aW9uICRjaGF0JGNvbW1vbiRNZXNzYWdlUm91dGVyJCgpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigiY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlciIpOwogIHRoaXMuc2VydmljZU1hcF8gPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcDsKICB0aGlzLmV2ZW50SGFuZGxlcnNfID0gbmV3IGdvb2cuc3RydWN0cy5NYXAKfTsKZ29vZy5pbmhlcml0cyhjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CmNoYXQuY29tbW9uLk1lc3NhZ2VSb3V0ZXIuZ2V0ID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJE1lc3NhZ2VSb3V0ZXIkZ2V0JCgpIHsKICBnb29nLmlzRGVmQW5kTm90TnVsbChjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyLmluc3RhbmNlKSB8fCAoY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlci5pbnN0YW5jZSA9IG5ldyBjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyKTsKICByZXR1cm4gY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlci5pbnN0YW5jZQp9OwpjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyLmV2ZW50VHlwZSA9IGZ1bmN0aW9uICRjaGF0JGNvbW1vbiRNZXNzYWdlUm91dGVyJGV2ZW50VHlwZSQobmFtZSkgewogIHJldHVybiJNUkVfIiArIG5hbWUKfTsKY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJE1lc3NhZ2VSb3V0ZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICBmb3IodmFyIHJlY2VpdmVycyA9IHRoaXMuc2VydmljZU1hcF8uZ2V0VmFsdWVzKCk7MCA8IHJlY2VpdmVycy5sZW5ndGg7KSB7CiAgICB2YXIgcmVjID0gcmVjZWl2ZXJzLnBvcCgpOwogICAgcmVjLmRpc3Bvc2UoKQogIH0KICB0aGlzLmV2ZW50SGFuZGxlcnNfLmNsZWFyKCk7CiAgdGhpcy5zZXJ2aWNlTWFwXy5jbGVhcigpOwogIGRlbGV0ZSBjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyLmluc3RhbmNlCn07CmNoYXQuY29tbW9uLk1lc3NhZ2VSb3V0ZXIucHJvdG90eXBlLmdldE9yQ3JlYXRlUmVjZWl2ZXJfID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJE1lc3NhZ2VSb3V0ZXIkJGdldE9yQ3JlYXRlUmVjZWl2ZXJfJChzZXJ2aWNlTmFtZSkgewogIHZhciBpdGVtID0gdGhpcy5zZXJ2aWNlTWFwXy5nZXQoc2VydmljZU5hbWUpOwogIGdvb2cuaXNEZWYoaXRlbSkgfHwgKGl0ZW0gPSBuZXcgY2hhdC5jb21tb24uTWVzc2FnZVJlY2VpdmVyKHNlcnZpY2VOYW1lKSwgdGhpcy5zZXJ2aWNlTWFwXy5zZXQoc2VydmljZU5hbWUsIGl0ZW0pKTsKICByZXR1cm4gaXRlbQp9OwpjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyLnByb3RvdHlwZS5zZW5kTWVzc2FnZSA9IGZ1bmN0aW9uICRjaGF0JGNvbW1vbiRNZXNzYWdlUm91dGVyJCRzZW5kTWVzc2FnZSQodG8sIG5hbWVPck1zZywgb3B0X21zZywgb3B0X2xvZykgewogIHZhciBuYW1lQW5kTXNnID0gdGhpcy5nZXROYW1lQW5kTWVzc2FnZV8obmFtZU9yTXNnLCBvcHRfbXNnKSwgaXRlbSA9IHRoaXMuZ2V0T3JDcmVhdGVSZWNlaXZlcl8odG8pLCBzZW50ID0gaXRlbS5zZW5kTWVzc2FnZShuYW1lQW5kTXNnWzBdLCBuYW1lQW5kTXNnWzFdLCBvcHRfbG9nKTsKICBzZW50ICYmIHRoaXMuYnJvYWRjYXN0TWVzc2FnZShuYW1lQW5kTXNnWzBdLCBuYW1lQW5kTXNnWzFdLCBvcHRfbG9nKQp9OwpjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyLnByb3RvdHlwZS5icm9hZGNhc3RNZXNzYWdlID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJE1lc3NhZ2VSb3V0ZXIkJGJyb2FkY2FzdE1lc3NhZ2UkKG5hbWVPck1zZywgb3B0X21zZywgb3B0X2xvZykgewogIHZhciBuYW1lQW5kTXNnID0gdGhpcy5nZXROYW1lQW5kTWVzc2FnZV8obmFtZU9yTXNnLCBvcHRfbXNnKTsKICAhMSAhPT0gb3B0X2xvZyAmJiB0aGlzLmxvZ2dlcl8uaW5mbygiY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlcjogQnJvYWRjYXN0aW5nIG1lc3NhZ2UgKCIgKyBuYW1lQW5kTXNnWzBdICsgIikgd2l0aCAoIiArIGNoYXQudXRpbHMuTG9nLmdldFN0cmluZ1NhZmUobmFtZUFuZE1zZ1sxXSkgKyAiKSIpOwogIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlckV2ZW50KG5hbWVBbmRNc2dbMF0sIG5hbWVBbmRNc2dbMV0pKTsKICB2YXIgaGFuZGxlcnMgPSB0aGlzLmV2ZW50SGFuZGxlcnNfLmdldChuYW1lQW5kTXNnWzBdKTsKICBpZihoYW5kbGVycykgewogICAgZm9yKHZhciBpID0gMDtpIDwgaGFuZGxlcnMubGVuZ3RoO2krKykgewogICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzW2ldOwogICAgICB0aGlzLnVubGlzdGVuRm9yRXZlbnQobmFtZUFuZE1zZ1swXSwgaGFuZGxlclswXSwgaGFuZGxlclsxXSkKICAgIH0KICAgIHRoaXMuZXZlbnRIYW5kbGVyc18ucmVtb3ZlKG5hbWVBbmRNc2dbMF0pCiAgfQp9OwpjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyLnByb3RvdHlwZS51bmxpc3RlbkZvckV2ZW50ID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJE1lc3NhZ2VSb3V0ZXIkJHVubGlzdGVuRm9yRXZlbnQkKGV2ZW50TmFtZSwgbGlzdGVuZXIsIGV2ZW50SGFuZGxlcikgewogIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyLmV2ZW50VHlwZShldmVudE5hbWUpLCBldmVudEhhbmRsZXIsICExLCBsaXN0ZW5lcikKfTsKY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlci5wcm90b3R5cGUuZ2V0TmFtZUFuZE1lc3NhZ2VfID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJE1lc3NhZ2VSb3V0ZXIkJGdldE5hbWVBbmRNZXNzYWdlXyQobmFtZU9yTXNnLCBvcHRfbXNnKSB7CiAgcmV0dXJuInN0cmluZyIgPT0gdHlwZW9mIG5hbWVPck1zZyA/IFtuYW1lT3JNc2csIG9wdF9tc2ddIDogW25hbWVPck1zZ1swXSwgbmFtZU9yTXNnLnNsaWNlKDEpXQp9OwpjaGF0LmNvbW1vbi5NZXNzYWdlUmVjZWl2ZXIgPSBmdW5jdGlvbiAkY2hhdCRjb21tb24kTWVzc2FnZVJlY2VpdmVyJChpZCkgewogIGdvb2cuRGlzcG9zYWJsZS5jYWxsKHRoaXMpOwogIHRoaXMubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigiY2hhdC5jb21tb24uTWVzc2FnZVJlY2VpdmVyIik7CiAgdGhpcy5pc0xpc3RlbmVkVG9fID0gITE7CiAgdGhpcy5wZW5kaW5nTWVzc2FnZXNfID0gW107CiAgdGhpcy5oYW5kbGVyXyA9IG51bGw7CiAgdGhpcy5pZF8gPSBpZAp9Owpnb29nLmluaGVyaXRzKGNoYXQuY29tbW9uLk1lc3NhZ2VSZWNlaXZlciwgZ29vZy5EaXNwb3NhYmxlKTsKY2hhdC5jb21tb24uTWVzc2FnZVJlY2VpdmVyLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkY2hhdCRjb21tb24kTWVzc2FnZVJlY2VpdmVyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGNoYXQuY29tbW9uLk1lc3NhZ2VSZWNlaXZlci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICB0aGlzLmhhbmRsZXJfID0gdGhpcy5wZW5kaW5nTWVzc2FnZXNfID0gbnVsbAp9OwpjaGF0LmNvbW1vbi5NZXNzYWdlUmVjZWl2ZXIucHJvdG90eXBlLnNlbmRNZXNzYWdlID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJE1lc3NhZ2VSZWNlaXZlciQkc2VuZE1lc3NhZ2UkKGV2ZW50TmFtZSwgbXNnLCBvcHRfbG9nKSB7CiAgaWYoIXRoaXMuaXNMaXN0ZW5lZFRvXykgewogICAgcmV0dXJuIHRoaXMucGVuZGluZ01lc3NhZ2VzXy5wdXNoKG5ldyBjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyRXZlbnQoZXZlbnROYW1lLCBtc2cpKSwgITEgIT09IG9wdF9sb2cgJiYgdGhpcy5sb2dnZXJfLmluZm8oImNoYXQuY29tbW9uLk1lc3NhZ2VSZWNlaXZlcjogUXVldWluZyBtZXNzYWdlICgiICsgZXZlbnROYW1lICsgIikgd2l0aCAoIiArIGNoYXQudXRpbHMuTG9nLmdldFN0cmluZ1NhZmUobXNnKSArICIpIHRvICgiICsgdGhpcy5pZF8gKyAiKSIpLCAhMQogIH0KICAhMSAhPT0gb3B0X2xvZyAmJiB0aGlzLmxvZ2dlcl8uaW5mbygiY2hhdC5jb21tb24uTWVzc2FnZVJlY2VpdmVyOiBTZW5kaW5nIG1lc3NhZ2UgKCIgKyBldmVudE5hbWUgKyAiKSB3aXRoICgiICsgY2hhdC51dGlscy5Mb2cuZ2V0U3RyaW5nU2FmZShtc2cpICsgIikgdG8gKCIgKyB0aGlzLmlkXyArICIpIik7CiAgdGhpcy5oYW5kbGVyXyhldmVudE5hbWUsIG1zZyk7CiAgcmV0dXJuITAKfTsKY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlckV2ZW50ID0gZnVuY3Rpb24gJGNoYXQkY29tbW9uJE1lc3NhZ2VSb3V0ZXJFdmVudCQoZXZlbnROYW1lLCBtc2cpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIGNoYXQuY29tbW9uLk1lc3NhZ2VSb3V0ZXIuZXZlbnRUeXBlKGV2ZW50TmFtZSkpOwogIHRoaXMubXNnID0gbXNnCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlckV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CmNoYXQuUm91dGVyID0gZnVuY3Rpb24gJGNoYXQkUm91dGVyJCgpIHsKICBjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyLmNhbGwodGhpcyk7CiAgdGhpcy5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJjaGF0LlJvdXRlciIpCn07Cmdvb2cuaW5oZXJpdHMoY2hhdC5Sb3V0ZXIsIGNoYXQuY29tbW9uLk1lc3NhZ2VSb3V0ZXIpOwpjaGF0LlJvdXRlci5TRVJWSUNFX0lEID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiY2hhdC5Sb3V0ZXIiKTsKY2hhdC5Sb3V0ZXIuaW5zdGFsbCA9IGZ1bmN0aW9uICRjaGF0JFJvdXRlciRpbnN0YWxsJChhcHBDb250ZXh0KSB7CiAgYXBwQ29udGV4dC5nZXRPck51bGwoY2hhdC5Sb3V0ZXIuU0VSVklDRV9JRCkgfHwgKGNoYXQuY29tbW9uLk1lc3NhZ2VSb3V0ZXIuaW5zdGFuY2UgPSBuZXcgY2hhdC5Sb3V0ZXIsIGFwcENvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKGNoYXQuUm91dGVyLlNFUlZJQ0VfSUQsIGNoYXQuY29tbW9uLk1lc3NhZ2VSb3V0ZXIuaW5zdGFuY2UpKQp9OwpjaGF0LlJvdXRlci5nZXQgPSBmdW5jdGlvbiAkY2hhdCRSb3V0ZXIkZ2V0JCgpIHsKICBpZighZ29vZy5pc0RlZkFuZE5vdE51bGwoY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlci5pbnN0YW5jZSkpIHsKICAgIHRocm93IEVycm9yKCJNdXN0IHJlZ2lzdGVyIHZpYSBjaGF0LlJvdXRlci5pbnN0YWxsIik7CiAgfQogIHJldHVybiBjaGF0LmNvbW1vbi5NZXNzYWdlUm91dGVyLmluc3RhbmNlCn07CmNoYXQuUm91dGVyLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkY2hhdCRSb3V0ZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgY2hhdC5Sb3V0ZXIuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgY2hhdC5jb21tb24uTWVzc2FnZVJvdXRlci5pbnN0YW5jZSA9IG51bGwKfTsKY2hhdC5Sb3V0ZXIucHJvdG90eXBlLnNlbmRNZXNzYWdlVG9TZXJ2ZXIgPSBmdW5jdGlvbiAkY2hhdCRSb3V0ZXIkJHNlbmRNZXNzYWdlVG9TZXJ2ZXIkKG1zZywgb3B0X2FyZ3MsIG9wdF9xdWV1ZSkgewogIHZhciByZWNlaXZlciA9IG9wdF9xdWV1ZSA/IGNoYXQuUm91dGVyLlJlY2VpdmVycy5TRVJWRVJfUVVFVUUgOiBjaGF0LlJvdXRlci5SZWNlaXZlcnMuU0VSVkVSOwogIHRoaXMuc2VuZE1lc3NhZ2UocmVjZWl2ZXIsIG1zZywgb3B0X2FyZ3MgfHwgW10pCn07CmNoYXQuUm91dGVyLlJlY2VpdmVycyA9IHtCT0RZOiJib2R5IiwgRlJJRU5EX1NVR0dFU1RJT046ImZfc3VnZyIsIEhPU1Q6Imhvc3QiLCBIT1ZFUl9DQVJEOiJob3ZlciIsIE1PTEVfSU5TVFJVTUVOVEFUSU9OOiJtaW5zdCIsIE5PVElGSUVSQ0xJRU5UOiJub3RpZmllcmNsaWVudCIsIE5PVElGSUNBVElPTl9NQU5BR0VSOiJub3RpX21hbiIsIFFVRVJZX0lOU1RSVU1FTlRBVElPTjoicWluc3QiLCBST1NURVI6InJvc3RlciIsIFJPU1RFUl9JTlNUUlVNRU5UQVRJT046InJpbnN0IiwgU0hBUkVEX1NUQVRVUzoic19zdGF0dXMiLCBTRVJWRVI6InNlcnZlciIsIFNFUlZFUl9RVUVVRToic2VydmVyX3EiLCBWSUVXOiJ2aWV3In07CmNoYXQuUm91dGVyLmdldFJlY2VpdmVyRm9yU2VydmljZSA9IGZ1bmN0aW9uICRjaGF0JFJvdXRlciRnZXRSZWNlaXZlckZvclNlcnZpY2UkKHNlcnZpY2VVcmwsIHNlcnZpY2VJZCwgY29tcG9uZW50KSB7CiAgcmV0dXJuW3NlcnZpY2VVcmwsIHNlcnZpY2VJZCwgY29tcG9uZW50XS5qb2luKCJfIikKfTsKY2hhdC5Sb3V0ZXIuZ2V0RXZlbnRGb3JRdWVyeSA9IGZ1bmN0aW9uICRjaGF0JFJvdXRlciRnZXRFdmVudEZvclF1ZXJ5JChxdWVyeSkgewogIHJldHVyblsicV8iLCBxdWVyeV0uam9pbigiXyIpCn07CmNoYXQuUm91dGVyLkV2ZW50cyA9IHtBVFRBQ0hfSURMRToiKmFpIiwgQURKVVNUX1NJWkU6IiphcyIsIEFESlVTVF9TSVpFX0NIUk9NRV9PUzoiKmFzYyIsIFNFVF9CT1RUT01fRUxFTUVOVDoiKmJlcyIsIEJMVVJfU0VBUkNIOiIqYnMiLCBCVUREWV9QT1VOQ0VfTk9USUZJQ0FUSU9OOiIqYnBuIiwgRU5ESU5HX1BPUE9VVDoiKmVwIiwgRkxBU0hfVElUTEU6IipmdCIsIEZJTklTSEVEX0lOSVRJQUxfTVNHUzoiKmZpbSIsIEZBSUxFRF9NT0xFOiIqZm0iLCBGTEFTSDoiKmZtbCIsIElOSVRfQ0hBVDoiKmljIiwgSElERV9IT1ZFUl9NT0xFOiIqaGhtIiwgSE9TVF9MT0dfTUVTU0FHRToiKmhsbSIsIEhPVkVSX0lOVklURV9UT19DSEFUOiIqaGljIiwgSE9WRVJfU1VHR0VTVF9GUklFTkRTOiIqaHNmIiwgSE9WRVJfU01TX0lOVklURToiKmhzaSIsIEhPVkVSX1ZPSUNFX1RPUzoiKmh2dCIsIEhPVkVSX1NFVFRJTkdTOiIqaHNlIiwgSE9WRVJfQ0hBVF9JTlZJVEU6IipoY2kiLCBIT1ZFUl9DSVJDTEVfU0VUVElOR1M6IipoT3MiLCAKS0VZQk9BUkRfU0hPUlRDVVQ6IiprYnMiLCBNT0xFX0NMT1NFRDoiKm1jIiwgTU9MRV9GT0NVU0VEOiIqbWZvIiwgU0VUX01PTEVfTUlOX1NJWkU6IiptbSIsIFNFVF9NT0xFX0ZJWEVEX1RPUDoiKm1mdCIsIE1PTEVfT1BFTkVEOiIqbW8iLCBNT0xFX0ZJTklTSF9SRU5ERVI6IiptZnIiLCBNRU5VX0JBU0lDX0FWQUlMQUJMRToiKm1iYSIsIE1FTlVfQkFTSUNfQlVTWToiKm1iYiIsIE1FTlVfQ0xFQVJfQUxMOiIqbWMiLCBNRU5VX0NVU1RPTToiKm1jbSIsIE1FTlVfQ1VTVE9NX0FWQUlMQUJMRToiKm1jYSIsIE1FTlVfQ1VTVE9NX0JVU1k6IiptY2IiLCBNRU5VX0lOVklTSUJMRToiKm1pIiwgTUlTU0VEX05PVElGSUNBVElPTlNfUFJFU0VOVDoiKm1ucCIsIE1FTlVfU0lHTl9JTjoiKm1zaSIsIE1FTlVfU0lHTl9PVVQ6Iiptc28iLCBNRU5VX1NFVF9TVEFUVVM6Iiptc3MiLCBTRVRfTkVFRFNfQVRURU5USU9OOiIqbmEiLCBPTl9BQ1RJVkVfVVNFUjoiKm9hdSIsIE9OX1ZPSUNFX1RPUzoiKm92dCIsIApPUEVOX0NIQVQ6IipvYyIsIE9QRU5fRU1BSUw6IipvZSIsIE9OX0ZMQVNIX1RJVExFOiIqb2Z0IiwgT1BFTl9WT0lDRV9NT0xFOiIqb3YiLCBQUkVTRU5DRV9NRU5VX0NMT1NFRDoiKnBtYyIsIFBSRVNFTkNFX01FTlVfQ0xPU0VEX0NVU1RPTToiKnBtY2MiLCBSRUNFTlRfQ09OVkVSU0FUSU9OUzoiKnJjIiwgUk9TVEVSX0VYUEFORDoiKnJlIiwgUk9TVEVSX01PVVNFX09VVDoiKnJtbyIsIFJFQ09OTkVDVF9OT1c6IipybiIsIFJFU0laRV9NSU5JX1JPU1RFUjoiKnJtciIsIFJFU0laRV9ST1NURVI6IipyciIsIFNCX05PVElGSUNBVElPTjoiKnNuIiwgU0VUX0NIQVRfSElEREVOOiIqc2NoIiwgU0VUX1NJWkU6IipzcyIsIFNFTkRfQ0hBVF9JTlZJVEVTOiIqc2NpIiwgU1RPUF9GTEFTSF9USVRMRToiKnNmdCIsIFNJR05fSU46IipzaSIsIFNFTkRfTUVTU0FHRV9UT19DSEFUX01PTEU6IipzbW0iLCBTSUdOX09VVDoiKnNvIiwgU1RBUlRJTkdfUE9QT1VUOiIqc3AiLCBTRVRfVElUTEU6IipzdCIsIApTRVRfVEVYVF9BUkVBX0ZPQ1VTOiIqdGFmIiwgVE9HR0xFX1NVUFBSRVNTX01PTEVTOiIqc20iLCBUUllfRkxBU0g6Iip0ZiIsIFVQREFURV9JQ09OOiIqdWkiLCBVUERBVEVfVE9PTEJBUjoiKnV0IiwgUkVUVVJOX0ZPQ1VTX0ZST01fT1BUSU9OU19NRU5VOiIqcmZmb20iLCBSRVRVUk5fRk9DVVNfRlJPTV9TRVRUSU5HU19QQU5FTDoiKnJmZnNwIiwgUkVUVVJOX0ZPQ1VTX0ZST01fSU5WSVRFX0RJQUxPRzoiKnJmZmlkIiwgQlVERFlfUE9VTkNFOiJicCIsIENPTlRBQ1RfRklMVEVSOiJjZiIsIERJUkVDVF9NVUNfSU5WSVRBVElPTjoiZG1pIiwgRElTUExBWV9TTVM6ImRzIiwgU0VUX0ZSSUVORF9TVUdHRVNUSU9OUzoiZnMiLCBBQ0NFUFRfRlJJRU5EX1NVR0dFU1RJT046ImZzYSIsIElHTk9SRV9GUklFTkRfU1VHR0VTVElPTjoiZnNpIiwgU1VHR0VTVF9GUklFTkRfU1VHR0VTVElPTjoiZnNnIiwgUkVRVUVTVF9NT1JFX0ZSSUVORF9TVUdHRVNUSU9OUzoiZnNybSIsIFNIT1dfRlJJRU5EX1NVR0dFU1RJT046ImZzcyIsIApHRVRfTVVDX05BTUU6ImdtbiIsIEdFVF9QUkVTRU5DRToiZ3AiLCBJTlRST19QUk9NT19UT1VDSEVEOiJpcHQiLCBMT0dfVE9fU0VSVkVSOiJsb2ciLCBDSEFUX01FU1NBR0U6Im0iLCBTTVNfTUVTU0FHRToibW0iLCBORVdfQ0hBVDoibmMiLCBORVdfTUFJTF9OT1RJRklDQVRJT046Im5tbiIsIFBSRVNFTkNFOiJwIiwgQ0xFQVJfU1RBVFVTOiJwYyIsIFJFU09VUkNFX1BSRVNFTkNFOiJwciIsIFVTRVJfUFJFU0VOQ0U6InB1IiwgUVVFUlk6InEiLCBRVUlDS19MSVNUOiJxbCIsIFFVRVJZX1JFU1VMVDoicXIiLCBRVUlDS0xJU1RfU0laRToicXMiLCBST1NURVJfQUREOiJyYSIsIFJPU1RFUl9ERVNDUklQVElPTjoicmMiLCBSRUNPTU1FTkRfTVVDUzoicmNtIiwgUk9TVEVSX0VORDoicmUiLCBST1NURVJfR0VUX0ZVTEw6InJmIiwgU1VCU0NSSVBUSU9OOiJzIiwgQUNDRVBUX1NVQlNDUklQVElPTjoic2EiLCBTTVVSRl9TRVRUSU5HUzoic2MiLCBTTVNfSU5WSVRFOiJzaSIsIFNIT1dfSU5WSVRFX0RJQUxPRzoic2lkIiwgClNNU19DT1VOVFJJRVM6InNtc2MiLCBTRUFSQ0hfUFVCTElDX1BST0ZJTEU6InNwIiwgU0VBUkNIX1BVQkxJQ19QUk9GSUxFX1JFU1VMVDoic3ByIiwgU0VUX1NNU19NT0RFOiJzc20iLCBTRU5EX01FU1NBR0VfVE9fSE9TVElOR19QQUdFOiJzZW5kTWVzc2FnZVRvSG9zdCIsIFJFSkVDVF9TVUJTQ1JJUFRJT046InNyIiwgU0hBUkVEX1NUQVRVUzoic3QiLCBVTktOT1dOOiJ1bmtub3duIiwgVklERU9fSU5WSVRFOiJ2aSIsIFZJRVdfUFJPRklMRToidnAiLCBWT0lDRV9TTVNfTUVTU0FHRToidnRtIn07CmNoYXQuUm91dGVyLk5hbWVzID0ge0NPTlRBQ1RfTUFOQUdFUjoiY21fIn07CmNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyID0gZnVuY3Rpb24gJGNoYXQkdXRpbHMkSW1wcmVzc2lvblJlcG9ydGVyJChhcHBDb250ZXh0LCB3Y3NDbGllbnQsIHNlbmRDb29raWVUaW1lb3V0VXJsKSB7CiAgZ29vZy5EaXNwb3NhYmxlLmNhbGwodGhpcyk7CiAgdGhpcy5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlciIpOwogIHRoaXMuY29uZmlnXyA9IGNoYXQuY2xpZW50LlJlYWRPbmx5Q29uZmlnLmdldChhcHBDb250ZXh0KTsKICB0aGlzLnNlcnZlck1lc3NhZ2VTZW5kZXJfID0gY2hhdC5jbGllbnQuU2VydmVyTWVzc2FnZVNlbmRlci5nZXQoYXBwQ29udGV4dCk7CiAgdGhpcy5leHBlcmltZW50TWFuYWdlcl8gPSBjaGF0LmNsaWVudC5FeHBlcmltZW50TWFuYWdlci5nZXQoYXBwQ29udGV4dCk7CiAgdGhpcy5zZW5kQ29va2llVGltZW91dFVybF8gPSAobmV3IGdvb2cuVXJpKHNlbmRDb29raWVUaW1lb3V0VXJsKSkuc2V0UGFyYW1ldGVyVmFsdWUoY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuU0VORF9USU1FT1VUX1VSTF9QQVJBTSwgIiIpOwogIHRoaXMuaW1wcmVzc2lvblRvQ291bnRfID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdGhpcy5jb29raWVzRW5hYmxlZF8gPSBnb29nLm5ldC5jb29raWVzLmlzRW5hYmxlZCgpOwogIHRoaXMuc2VuZENvb2tpZVRpbWVySWRfID0gdGhpcy53cml0ZUNvb2tpZVRpbWVySWRfID0gbnVsbDsKICB0aGlzLmRpc2FibGVkQnlTZW5kQ29va2llVGltZW91dF8gPSAhMTsKICB0aGlzLmxlZ2FjeU1hcHBpbmdfID0ge307CiAgdGhpcy5sZWdhY3lNYXBwaW5nX1tjaGF0LmNvbW1vbi5FbmRwb2ludEltcHJlc3Npb25zLkNIQVRfSU5JVElBVEVfRlJPTV9QUk9GSUxFQ0FSRF0gPSBjaGF0LmNvbW1vbi5FbmRwb2ludEltcHJlc3Npb25zLkxFR0FDWV9DSEFUX0lOSVRJQVRFX0ZST01fUFJPRklMRUNBUkQ7CiAgdGhpcy5sZWdhY3lNYXBwaW5nX1tjaGF0LmNvbW1vbi5FbmRwb2ludEltcHJlc3Npb25zLkNIQVRfSU5JVElBVEVfRlJPTV9ST1NURVJdID0gY2hhdC5jb21tb24uRW5kcG9pbnRJbXByZXNzaW9ucy5MRUdBQ1lfQ0hBVF9JTklUSUFURV9GUk9NX1JPU1RFUgp9Owpnb29nLmluaGVyaXRzKGNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyLCBnb29nLkRpc3Bvc2FibGUpOwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5TRVJWSUNFX0lEID0gZmF2YS5zZXJ2aWNlcy5nZXRVbmlxdWVJZCgiY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIiKTsKY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuQ09PS0lFX05BTUUgPSAiSU1QIjsKY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuU0VORF9USU1FT1VUX1VSTF9QQVJBTSA9ICJpdG8iOwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5XUklURV9DT09LSUVfU0laRV9USFJFU0hPTEQgPSAxMDsKY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuTUFYX0lNUFJFU1NJT05TX0lOX01FTU9SWSA9IDIwOwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5XUklURV9DT09LSUVfVElNRU9VVF9NUyA9IDZFNDsKY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuU0VORF9DT09LSUVfVElNRU9VVF9NUyA9IDNFNTsKY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuV3JpdGVDb29raWVSZWFzb24gPSB7VElNRU9VVDoidCIsIFNJWkVfVEhSRVNIT0xEOiJzIn07CmNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyLnJlZ2lzdGVyID0gZnVuY3Rpb24gJGNoYXQkdXRpbHMkSW1wcmVzc2lvblJlcG9ydGVyJHJlZ2lzdGVyJChhcHBDb250ZXh0LCB3Y3NDbGllbnQsIHNlbmRDb29raWVUaW1lb3V0VXJsKSB7CiAgdmFyIGltcHJlc3Npb25SZXBvcnRlciA9IGFwcENvbnRleHQuZ2V0T3JOdWxsKGNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyLlNFUlZJQ0VfSUQpOwogIGdvb2cuaXNOdWxsKGltcHJlc3Npb25SZXBvcnRlcikgJiYgKGltcHJlc3Npb25SZXBvcnRlciA9IG5ldyBjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlcihhcHBDb250ZXh0LCB3Y3NDbGllbnQsIHNlbmRDb29raWVUaW1lb3V0VXJsKSwgYXBwQ29udGV4dC5yZWdpc3RlclNlcnZpY2UoY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuU0VSVklDRV9JRCwgaW1wcmVzc2lvblJlcG9ydGVyKSk7CiAgcmV0dXJuIGltcHJlc3Npb25SZXBvcnRlcgp9OwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5nZXQgPSBmdW5jdGlvbiAkY2hhdCR1dGlscyRJbXByZXNzaW9uUmVwb3J0ZXIkZ2V0JChhcHBDb250ZXh0KSB7CiAgcmV0dXJuIGFwcENvbnRleHQuZ2V0KGNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyLlNFUlZJQ0VfSUQpCn07CmNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyLmdldE9yTnVsbCA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJEltcHJlc3Npb25SZXBvcnRlciRnZXRPck51bGwkKGFwcENvbnRleHQpIHsKICByZXR1cm4gYXBwQ29udGV4dC5nZXRPck51bGwoY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuU0VSVklDRV9JRCkKfTsKY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIucHJvdG90eXBlLnJlcG9ydENhbGxJbXByZXNzaW9uID0gZnVuY3Rpb24gJGNoYXQkdXRpbHMkSW1wcmVzc2lvblJlcG9ydGVyJCRyZXBvcnRDYWxsSW1wcmVzc2lvbiQoaW1wcmVzc2lvbiwgc2Vzc2lvbklkKSB7CiAgdGhpcy5sb2dJbXByZXNzaW9uVmlhQ2hhbm5lbF8oaW1wcmVzc2lvbiwgc2Vzc2lvbklkKQp9OwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5wcm90b3R5cGUuY29va2llRXhpc3RzXyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJEltcHJlc3Npb25SZXBvcnRlciQkY29va2llRXhpc3RzXyQoKSB7CiAgcmV0dXJuIGdvb2cubmV0LmNvb2tpZXMuY29udGFpbnNLZXkoY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuQ09PS0lFX05BTUUpCn07CmNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyLnByb3RvdHlwZS5lbnN1cmVXcml0ZUNvb2tpZVRpbWVyXyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJEltcHJlc3Npb25SZXBvcnRlciQkZW5zdXJlV3JpdGVDb29raWVUaW1lcl8kKCkgewogIGdvb2cuYXNzZXJ0cy5hc3NlcnQoMCA8IHRoaXMuaW1wcmVzc2lvblRvQ291bnRfLmdldENvdW50KCkpOwogIG51bGwgPT0gdGhpcy53cml0ZUNvb2tpZVRpbWVySWRfICYmICh0aGlzLndyaXRlQ29va2llVGltZXJJZF8gPSBnb29nLlRpbWVyLmNhbGxPbmNlKHRoaXMub25Xcml0ZUNvb2tpZVRpbWVyXywgY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuV1JJVEVfQ09PS0lFX1RJTUVPVVRfTVMsIHRoaXMpKQp9OwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5wcm90b3R5cGUuY2FuY2VsV3JpdGVDb29raWVUaW1lcl8gPSBmdW5jdGlvbiAkY2hhdCR1dGlscyRJbXByZXNzaW9uUmVwb3J0ZXIkJGNhbmNlbFdyaXRlQ29va2llVGltZXJfJCgpIHsKICBudWxsICE9IHRoaXMud3JpdGVDb29raWVUaW1lcklkXyAmJiAoZ29vZy5UaW1lci5jbGVhcih0aGlzLndyaXRlQ29va2llVGltZXJJZF8pLCB0aGlzLndyaXRlQ29va2llVGltZXJJZF8gPSBudWxsKQp9OwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5wcm90b3R5cGUub25Xcml0ZUNvb2tpZVRpbWVyXyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJEltcHJlc3Npb25SZXBvcnRlciQkb25Xcml0ZUNvb2tpZVRpbWVyXyQoKSB7CiAgdGhpcy53cml0ZUNvb2tpZVRpbWVySWRfID0gbnVsbDsKICB0aGlzLmNvb2tpZUV4aXN0c18oKSA/IHRoaXMuZW5zdXJlV3JpdGVDb29raWVUaW1lcl8oKSA6ICh0aGlzLmxvZ2dlcl8uaW5mbygiV3JpdGluZyBpbXByZXNzaW9uIGNvb2tpZSBiZWNhdXNlIG9mIHRpbWVyIiksIHRoaXMud3JpdGVDb29raWVBbmRSZXNldFNlbmRUaW1lcl8oY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuV3JpdGVDb29raWVSZWFzb24uVElNRU9VVCkpCn07CmNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyLnByb3RvdHlwZS5yZXNldFNlbmRDb29raWVUaW1lcl8gPSBmdW5jdGlvbiAkY2hhdCR1dGlscyRJbXByZXNzaW9uUmVwb3J0ZXIkJHJlc2V0U2VuZENvb2tpZVRpbWVyXyQoKSB7CiAgZ29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLmNvb2tpZUV4aXN0c18oKSk7CiAgdGhpcy5jYW5jZWxTZW5kQ29va2llVGltZXJfKCk7CiAgdGhpcy5zZW5kQ29va2llVGltZXJJZF8gPSBnb29nLlRpbWVyLmNhbGxPbmNlKHRoaXMub25TZW5kQ29va2llVGltZXJfLCBjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5TRU5EX0NPT0tJRV9USU1FT1VUX01TLCB0aGlzKQp9OwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5wcm90b3R5cGUuY2FuY2VsU2VuZENvb2tpZVRpbWVyXyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJEltcHJlc3Npb25SZXBvcnRlciQkY2FuY2VsU2VuZENvb2tpZVRpbWVyXyQoKSB7CiAgbnVsbCAhPSB0aGlzLnNlbmRDb29raWVUaW1lcklkXyAmJiAoZ29vZy5UaW1lci5jbGVhcih0aGlzLnNlbmRDb29raWVUaW1lcklkXyksIHRoaXMuc2VuZENvb2tpZVRpbWVySWRfID0gbnVsbCkKfTsKY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIucHJvdG90eXBlLm9uU2VuZENvb2tpZVRpbWVyXyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJEltcHJlc3Npb25SZXBvcnRlciQkb25TZW5kQ29va2llVGltZXJfJCgpIHsKICB0aGlzLnNlbmRDb29raWVUaW1lcklkXyA9IG51bGw7CiAgdGhpcy5jb29raWVFeGlzdHNfKCkgJiYgKChuZXcgSW1hZ2UpLnNyYyA9IHRoaXMuc2VuZENvb2tpZVRpbWVvdXRVcmxfLnRvU3RyaW5nKCksIHRoaXMuZGlzYWJsZWRCeVNlbmRDb29raWVUaW1lb3V0XyA9ICEwLCB0aGlzLmltcHJlc3Npb25Ub0NvdW50Xy5jbGVhcigpLCB0aGlzLmNhbmNlbFdyaXRlQ29va2llVGltZXJfKCkpCn07CmNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyLnByb3RvdHlwZS53cml0ZUNvb2tpZUFuZFJlc2V0U2VuZFRpbWVyXyA9IGZ1bmN0aW9uICRjaGF0JHV0aWxzJEltcHJlc3Npb25SZXBvcnRlciQkd3JpdGVDb29raWVBbmRSZXNldFNlbmRUaW1lcl8kKHJlYXNvbikgewogIGdvb2cuYXNzZXJ0cy5hc3NlcnQoIXRoaXMuY29va2llRXhpc3RzXygpKTsKICB2YXIgY29va2llVmFsdWUgPSBuZXcgZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyKHRoaXMuY29uZmlnXy5wcm9wZXJ0eSArICImIiArIHJlYXNvbiksIGltcHJlc3Npb25Ub0NvdW50ID0gdGhpcy5pbXByZXNzaW9uVG9Db3VudF87CiAgZ29vZy5pdGVyLmZvckVhY2godGhpcy5pbXByZXNzaW9uVG9Db3VudF8uZ2V0S2V5SXRlcmF0b3IoKSwgZnVuY3Rpb24oaW1wcmVzc2lvbikgewogICAgY29va2llVmFsdWUuYXBwZW5kKCImIiArIGltcHJlc3Npb24gKyAiOiIgKyBpbXByZXNzaW9uVG9Db3VudC5nZXQoaW1wcmVzc2lvbikpCiAgfSk7CiAgZ29vZy5uZXQuY29va2llcy5zZXQoY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuQ09PS0lFX05BTUUsIGNvb2tpZVZhbHVlLnRvU3RyaW5nKCksIC0xLCAiLyIpOwogIHRoaXMuaW1wcmVzc2lvblRvQ291bnRfLmNsZWFyKCk7CiAgdGhpcy5yZXNldFNlbmRDb29raWVUaW1lcl8oKQp9OwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGNoYXQkdXRpbHMkSW1wcmVzc2lvblJlcG9ydGVyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRoaXMuY2FuY2VsV3JpdGVDb29raWVUaW1lcl8oKTsKICB0aGlzLmNhbmNlbFNlbmRDb29raWVUaW1lcl8oKTsKICBjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9OwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5wcm90b3R5cGUubG9nSW1wcmVzc2lvblZpYUNoYW5uZWxfID0gZnVuY3Rpb24gJGNoYXQkdXRpbHMkSW1wcmVzc2lvblJlcG9ydGVyJCRsb2dJbXByZXNzaW9uVmlhQ2hhbm5lbF8kKGltcHJlc3Npb24sIHZhcl9hcmdzKSB7CiAgaWYodGhpcy5sZWdhY3lNYXBwaW5nX1tpbXByZXNzaW9uXSkgewogICAgaWYoIXRoaXMuZXhwZXJpbWVudE1hbmFnZXJfLmlzSW5FeHBlcmltZW50KGNoYXQuY2xpZW50LkV4cGVyaW1lbnRNYW5hZ2VyLkV4cGVyaW1lbnRzLkNPT0tJRV9JTVBSRVNTSU9OUykpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICB0aGlzLmxvZ0ltcHJlc3Npb25WaWFDb29raWVfKGltcHJlc3Npb24pOwogICAgaW1wcmVzc2lvbiA9IHRoaXMubGVnYWN5TWFwcGluZ19baW1wcmVzc2lvbl0KICB9CiAgdmFyIG1zZyA9IG5ldyBwcm90by5hcHBzLmNoYXQuTG9nSW1wcmVzc2lvbjsKICBtc2cuc2V0SW1wcmVzc2lvbihpbXByZXNzaW9uKTsKICBmb3IodmFyIHBhcmFtcyA9IFtdLCBpID0gMTtpIDwgYXJndW1lbnRzLmxlbmd0aDtpKyspIHsKICAgIHBhcmFtcy5wdXNoKGFyZ3VtZW50c1tpXSkKICB9CiAgbXNnLnNldFBhcmFtZXRlckxpc3QocGFyYW1zKTsKICB0aGlzLnNlcnZlck1lc3NhZ2VTZW5kZXJfLnNlbmQobXNnKQp9OwpjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5wcm90b3R5cGUubG9nSW1wcmVzc2lvblZpYUNvb2tpZV8gPSBmdW5jdGlvbiAkY2hhdCR1dGlscyRJbXByZXNzaW9uUmVwb3J0ZXIkJGxvZ0ltcHJlc3Npb25WaWFDb29raWVfJChpbXByZXNzaW9uKSB7CiAgaWYodGhpcy5leHBlcmltZW50TWFuYWdlcl8uaXNJbkV4cGVyaW1lbnQoY2hhdC5jbGllbnQuRXhwZXJpbWVudE1hbmFnZXIuRXhwZXJpbWVudHMuQ09PS0lFX0lNUFJFU1NJT05TKSkgewogICAgaWYodGhpcy5kaXNhYmxlZEJ5U2VuZENvb2tpZVRpbWVvdXRfKSB7CiAgICAgIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJJbXByZXNzaW9uIGlnbm9yZWQsIGRpc2FibGVkIGR1ZSB0byBzZW5kIHRpbWVvdXQ6ICIgKyBpbXByZXNzaW9uKQogICAgfWVsc2UgewogICAgICBpZih0aGlzLmNvb2tpZXNFbmFibGVkXykgewogICAgICAgIGlmKHRoaXMuaW1wcmVzc2lvblRvQ291bnRfLmdldENvdW50KCkgPj0gY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuTUFYX0lNUFJFU1NJT05TX0lOX01FTU9SWSkgewogICAgICAgICAgdGhpcy5sb2dnZXJfLndhcm5pbmcoIkltcHJlc3Npb24gaWdub3JlZCwgdG9vIG1hbnkgaW4gbWVtb3J5OiAiICsgaW1wcmVzc2lvbikKICAgICAgICB9ZWxzZSB7CiAgICAgICAgICB0aGlzLmxvZ2dlcl8uaW5mbygiSW1wcmVzc2lvbjogIiArIGltcHJlc3Npb24pOwogICAgICAgICAgdmFyIGN1cnJlbnRDb3VudCA9IHRoaXMuaW1wcmVzc2lvblRvQ291bnRfLmdldChpbXByZXNzaW9uKSB8fCAwOwogICAgICAgICAgdGhpcy5pbXByZXNzaW9uVG9Db3VudF8uc2V0KGltcHJlc3Npb24sIGN1cnJlbnRDb3VudCArIDEpOwogICAgICAgICAgdGhpcy5pbXByZXNzaW9uVG9Db3VudF8uZ2V0Q291bnQoKSA+IGNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyLldSSVRFX0NPT0tJRV9TSVpFX1RIUkVTSE9MRCAmJiAhdGhpcy5jb29raWVFeGlzdHNfKCkgPyAodGhpcy5sb2dnZXJfLmluZm8oIldyaXRpbmcgaW1wcmVzc2lvbiBjb29raWUgYmVjYXVzZSBvZiBzaXplIHRocmVzaG9sZCIpLCB0aGlzLndyaXRlQ29va2llQW5kUmVzZXRTZW5kVGltZXJfKGNoYXQudXRpbHMuSW1wcmVzc2lvblJlcG9ydGVyLldyaXRlQ29va2llUmVhc29uLlNJWkVfVEhSRVNIT0xEKSwgdGhpcy5jYW5jZWxXcml0ZUNvb2tpZVRpbWVyXygpKSA6IHRoaXMuZW5zdXJlV3JpdGVDb29raWVUaW1lcl8oKQogICAgICAgIH0KICAgICAgfWVsc2UgewogICAgICAgIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJJbXByZXNzaW9uIGlnbm9yZWQsIGNvb2tpZXMgZGlzYWJsZWQ6ICIgKyBpbXByZXNzaW9uKQogICAgICB9CiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkgPSB7fTsKdGFsay5tZWRpYS5xdWFsaXR5LlZpZGVvRnJlZXplVHJhY2tlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkVmlkZW9GcmVlemVUcmFja2VyJChhcHBDb250ZXh0KSB7CiAgdGhpcy5pbXByZXNzaW9uUmVwb3J0ZXJfID0gY2hhdC51dGlscy5JbXByZXNzaW9uUmVwb3J0ZXIuZ2V0KGFwcENvbnRleHQpOwogIHRoaXMuc3RyZWFtc18gPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcAp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEucXVhbGl0eS5WaWRlb0ZyZWV6ZVRyYWNrZXIsIGdvb2cuRGlzcG9zYWJsZSk7CnRhbGsubWVkaWEucXVhbGl0eS5WaWRlb0ZyZWV6ZVRyYWNrZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkVmlkZW9GcmVlemVUcmFja2VyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuZGlzcG9zZUFsbCh0aGlzLnN0cmVhbXNfLmdldFZhbHVlcygpKTsKICB0aGlzLnN0cmVhbXNfLmNsZWFyKCk7CiAgdGhpcy5zdHJlYW1zXyA9IG51bGw7CiAgdGFsay5tZWRpYS5xdWFsaXR5LlZpZGVvRnJlZXplVHJhY2tlci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuVmlkZW9GcmVlemVUcmFja2VyLk1JTl9MT05HX0ZSRUVaRV9NU18gPSA1RTM7CnRhbGsubWVkaWEucXVhbGl0eS5WaWRlb0ZyZWV6ZVRyYWNrZXIucHJvdG90eXBlLmFkZEVuZHBvaW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRWaWRlb0ZyZWV6ZVRyYWNrZXIkJGFkZEVuZHBvaW50JChlbmRwb2ludCkgewogIHZhciBrZXkgPSB0aGlzLmdldFN0cmVhbUtleV8oZW5kcG9pbnQpOwogIGlmKG51bGwgIT0ga2V5KSB7CiAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW1zXy5nZXQoa2V5KTsKICAgIHN0cmVhbSB8fCAoc3RyZWFtID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5WaWRlb0ZyZWV6ZVRyYWNrZXIuU3RyZWFtXyh0aGlzLmltcHJlc3Npb25SZXBvcnRlcl8sIGVuZHBvaW50KSwgdGhpcy5zdHJlYW1zXy5zZXQoa2V5LCBzdHJlYW0pKQogIH0KfTsKdGFsay5tZWRpYS5xdWFsaXR5LlZpZGVvRnJlZXplVHJhY2tlci5wcm90b3R5cGUucmVtb3ZlRW5kcG9pbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFZpZGVvRnJlZXplVHJhY2tlciQkcmVtb3ZlRW5kcG9pbnQkKGVuZHBvaW50KSB7CiAgdmFyIGtleSA9IHRoaXMuZ2V0U3RyZWFtS2V5XyhlbmRwb2ludCk7CiAgaWYobnVsbCAhPSBrZXkpIHsKICAgIHZhciBzdHJlYW0gPSB0aGlzLnN0cmVhbXNfLmdldChrZXkpOwogICAgc3RyZWFtICYmICh0aGlzLnN0cmVhbXNfLnJlbW92ZShrZXkpLCBzdHJlYW0uZGlzcG9zZSgpKQogIH0KfTsKdGFsay5tZWRpYS5xdWFsaXR5LlZpZGVvRnJlZXplVHJhY2tlci5wcm90b3R5cGUuZ2V0U3RyZWFtS2V5XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkVmlkZW9GcmVlemVUcmFja2VyJCRnZXRTdHJlYW1LZXlfJChlbmRwb2ludCkgewogIHZhciBzdHJlYW1JZCA9IGVuZHBvaW50LmdldFN0cmVhbUlkKCksIHBhcnRpY2lwYW50ID0gZW5kcG9pbnQuZ2V0UGFydGljaXBhbnQoKSwgc2Vzc2lvbklkID0gcGFydGljaXBhbnQuZ2V0U2Vzc2lvbklkKCksIGlzTG9jYWwgPSBwYXJ0aWNpcGFudC5pc0xvY2FsKCk7CiAgcmV0dXJuIG51bGwgPT0gc3RyZWFtSWQgfHwgbnVsbCA9PSBzZXNzaW9uSWQgfHwgaXNMb2NhbCA/IG51bGwgOiBzZXNzaW9uSWQgKyAiLSIgKyBzdHJlYW1JZAp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuVmlkZW9GcmVlemVUcmFja2VyLlN0cmVhbV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFZpZGVvRnJlZXplVHJhY2tlciRTdHJlYW1fJChpbXByZXNzaW9uUmVwb3J0ZXIsIGVuZHBvaW50KSB7CiAgdGhpcy5pbXByZXNzaW9uUmVwb3J0ZXJfID0gaW1wcmVzc2lvblJlcG9ydGVyOwogIHRoaXMuZW5kcG9pbnRfID0gZW5kcG9pbnQ7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLnN0YXJ0VGltZV8gPSBudWxsOwogIHRoaXMuaW1wcmVzc2lvblNlbnRfID0gITE7CiAgdGhpcy5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLnF1YWxpdHkuVmlkZW9GcmVlemVUcmFja2VyIik7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLmVuZHBvaW50XywgdGFsay5tZWRpYS5jM2QuU3RyZWFtRW5kcG9pbnQuRXZlbnRzLkZSQU1FUkFURV9DSEFOR0VELCB0aGlzLm9uRnJhbWVyYXRlQ2hhbmdlZF8pCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5xdWFsaXR5LlZpZGVvRnJlZXplVHJhY2tlci5TdHJlYW1fLCBnb29nLkRpc3Bvc2FibGUpOwp0YWxrLm1lZGlhLnF1YWxpdHkuVmlkZW9GcmVlemVUcmFja2VyLlN0cmVhbV8ucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkVmlkZW9GcmVlemVUcmFja2VyJFN0cmVhbV8kJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGhpcy51bmZyZWV6ZV8oKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8uZGlzcG9zZSgpOwogIHRoaXMuZXZlbnRIYW5kbGVyXyA9IG51bGw7CiAgdGFsay5tZWRpYS5xdWFsaXR5LlZpZGVvRnJlZXplVHJhY2tlci5TdHJlYW1fLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpCn07CnRhbGsubWVkaWEucXVhbGl0eS5WaWRlb0ZyZWV6ZVRyYWNrZXIuU3RyZWFtXy5wcm90b3R5cGUub25GcmFtZXJhdGVDaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkVmlkZW9GcmVlemVUcmFja2VyJFN0cmVhbV8kJG9uRnJhbWVyYXRlQ2hhbmdlZF8kKGUpIHsKICBlLmVuZHBvaW50ICE9IHRoaXMuZW5kcG9pbnRfID8gdGhpcy5sb2dnZXJfLndhcm5pbmcoIlVuZXhwZWN0ZWQgZW5kcG9pbnQgZm9yIGZyYW1lcmF0ZSBjaGFuZ2VkIGV2ZW50LiIpIDogMCA9PSBlLnJlbmRlckNvdW50ID8gdGhpcy5mcmVlemVfKCkgOiB0aGlzLnVuZnJlZXplXygpCn07CnRhbGsubWVkaWEucXVhbGl0eS5WaWRlb0ZyZWV6ZVRyYWNrZXIuU3RyZWFtXy5wcm90b3R5cGUuZnJlZXplXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkVmlkZW9GcmVlemVUcmFja2VyJFN0cmVhbV8kJGZyZWV6ZV8kKCkgewogIG51bGwgPT0gdGhpcy5zdGFydFRpbWVfID8gdGhpcy5zdGFydFRpbWVfID0gZ29vZy5ub3coKSA6ICF0aGlzLmltcHJlc3Npb25TZW50XyAmJiB0aGlzLmlzTG9uZ0ZyZWV6ZV8oKSAmJiB0aGlzLnJlcG9ydF8oY2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLlZJREVPX1JFTkRFUl9MT05HX0ZSRUVaRSkKfTsKdGFsay5tZWRpYS5xdWFsaXR5LlZpZGVvRnJlZXplVHJhY2tlci5TdHJlYW1fLnByb3RvdHlwZS51bmZyZWV6ZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFZpZGVvRnJlZXplVHJhY2tlciRTdHJlYW1fJCR1bmZyZWV6ZV8kKCkgewogIG51bGwgIT0gdGhpcy5zdGFydFRpbWVfICYmICF0aGlzLmltcHJlc3Npb25TZW50XyAmJiAodGhpcy5pc0xvbmdGcmVlemVfKCkgPyB0aGlzLnJlcG9ydF8oY2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLlZJREVPX1JFTkRFUl9MT05HX0ZSRUVaRSkgOiB0aGlzLnJlcG9ydF8oY2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLlZJREVPX1JFTkRFUl9TSE9SVF9GUkVFWkUpKTsKICB0aGlzLmNsZWFyXygpCn07CnRhbGsubWVkaWEucXVhbGl0eS5WaWRlb0ZyZWV6ZVRyYWNrZXIuU3RyZWFtXy5wcm90b3R5cGUuaXNMb25nRnJlZXplXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkVmlkZW9GcmVlemVUcmFja2VyJFN0cmVhbV8kJGlzTG9uZ0ZyZWV6ZV8kKCkgewogIHZhciBlbGFwc2VkID0gZ29vZy5ub3coKSAtIHRoaXMuc3RhcnRUaW1lXzsKICByZXR1cm4gZWxhcHNlZCA+PSB0YWxrLm1lZGlhLnF1YWxpdHkuVmlkZW9GcmVlemVUcmFja2VyLk1JTl9MT05HX0ZSRUVaRV9NU18KfTsKdGFsay5tZWRpYS5xdWFsaXR5LlZpZGVvRnJlZXplVHJhY2tlci5TdHJlYW1fLnByb3RvdHlwZS5yZXBvcnRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRWaWRlb0ZyZWV6ZVRyYWNrZXIkU3RyZWFtXyQkcmVwb3J0XyQoaW1wcmVzc2lvbikgewogIHZhciBzZXNzaW9uSWQgPSB0aGlzLmVuZHBvaW50Xy5nZXRQYXJ0aWNpcGFudCgpLmdldFNlc3Npb25JZCgpOwogIHRoaXMuaW1wcmVzc2lvblJlcG9ydGVyXy5yZXBvcnRDYWxsSW1wcmVzc2lvbihpbXByZXNzaW9uLCBzZXNzaW9uSWQpOwogIHRoaXMuaW1wcmVzc2lvblNlbnRfID0gITAKfTsKdGFsay5tZWRpYS5xdWFsaXR5LlZpZGVvRnJlZXplVHJhY2tlci5TdHJlYW1fLnByb3RvdHlwZS5jbGVhcl8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFZpZGVvRnJlZXplVHJhY2tlciRTdHJlYW1fJCRjbGVhcl8kKCkgewogIHRoaXMuc3RhcnRUaW1lXyA9IG51bGw7CiAgdGhpcy5pbXByZXNzaW9uU2VudF8gPSAhMQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mb0hhbmRsZXIgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm9IYW5kbGVyJChjYWxsTWFuYWdlciwgdmlkZW9UcmFja2VyKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLmNhbGxNYW5hZ2VyXyA9IGNhbGxNYW5hZ2VyOwogIHRoaXMuc3NyY1RvRW5kcG9pbnRNYXBfID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdGhpcy5wYXJ0aWNpcGFudHNCeVNlc3Npb25fID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLnZpZGVvVHJhY2tlcl8gPSB2aWRlb1RyYWNrZXI7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3RlbihjYWxsTWFuYWdlciwgdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuUFJPQ0VTU0lOR19USU1FLCB0aGlzLmhhbmRsZVBsdWdpbk1lc3NhZ2VQcm9jZXNzaW5nVGltZV8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oY2FsbE1hbmFnZXIsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuSk1JREFUQSwgdGhpcy5oYW5kbGVKbWlkYXRhXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3RlbihjYWxsTWFuYWdlciwgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5BRERfUEFSVElDSVBBTlQsIHRoaXMuaGFuZGxlQWRkUGFydGljaXBhbnRfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKGNhbGxNYW5hZ2VyLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5NRVNTQUdFLCB0aGlzLmhhbmRsZVRhbGtQbHVnaW5NZXNzYWdlXykKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLk1lZGlhSW5mb0hhbmRsZXIsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKdGFsay5tZWRpYS5NZWRpYUluZm9IYW5kbGVyLnByb3RvdHlwZS5tYXhQbHVnaW5NZXNzYWdlUHJvY2Vzc2luZ1RpbWVfID0gMDsKdGFsay5tZWRpYS5NZWRpYUluZm9IYW5kbGVyLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLk1lZGlhSW5mb0hhbmRsZXIiKTsKdGFsay5tZWRpYS5NZWRpYUluZm9IYW5kbGVyLnByb3RvdHlwZS5oYW5kbGVKbWlkYXRhXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mb0hhbmRsZXIkJGhhbmRsZUptaWRhdGFfJChlKSB7CiAgdGhpcy5jYWxsTWFuYWdlcl8uZ2V0QWN0aXZlQ2FsbCgpICYmIHRoaXMuY2FsbE1hbmFnZXJfLmdldEFjdGl2ZUNhbGwoKS5pc011bHRpd2F5KCkgPyB0aGlzLmFkZFN0cmVhbUVuZHBvaW50U3RhdHNNdWx0aXdheV8oZS5kYXRhKSA6IHRoaXMuYWRkU3RyZWFtRW5kcG9pbnRTdGF0c09uZU9uT25lXyhlLmRhdGEpOwogIHRoaXMuYWRkUGFydGljaXBhbnRzXyhlLmRhdGEpOwogIHRoaXMuYWRkUGx1Z2luTWVzc2FnZVByb2Nlc3NpbmdUaW1lXyhlLmRhdGEpOwogIHRoaXMubG9nZ2VyXy5maW5lKCJHZW5lcmF0ZWQgbWVkaWFpbmZvICIgKyBlLmRhdGEudG9TdHJpbmcoKSk7CiAgdGhpcy5jYWxsTWFuYWdlcl8uZ2V0UGFzc1Rocm91Z2hKbWlkYXRhKCkgfHwgdGhpcy5jYWxsTWFuYWdlcl8uc2VuZEppbmdsZU1zZyhlLmRhdGEudG9Kc29uKCkpOwogIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5NZWRpYUluZm8uTWVkaWFJbmZvRXZlbnQoZS5kYXRhKSkKfTsKdGFsay5tZWRpYS5NZWRpYUluZm9IYW5kbGVyLnByb3RvdHlwZS5tb25pdG9yRmx1dGVTdHJlYW1zID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFJbmZvSGFuZGxlciQkbW9uaXRvckZsdXRlU3RyZWFtcyQoZmx1dGVTdHJlYW1zKSB7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3RlbihmbHV0ZVN0cmVhbXMsIHRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5FdmVudC5ORVdfRU5EUE9JTlQsIHRoaXMuaGFuZGxlTmV3RW5kcG9pbnRfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKGZsdXRlU3RyZWFtcywgdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zLkV2ZW50LlJFTU9WRURfRU5EUE9JTlQsIHRoaXMuaGFuZGxlUmVtb3ZlZEVuZHBvaW50XykKfTsKdGFsay5tZWRpYS5NZWRpYUluZm9IYW5kbGVyLnByb3RvdHlwZS51bm1vbml0b3JGbHV0ZVN0cmVhbXMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm9IYW5kbGVyJCR1bm1vbml0b3JGbHV0ZVN0cmVhbXMkKGZsdXRlU3RyZWFtcykgewogIHRoaXMuZXZlbnRIYW5kbGVyXy51bmxpc3RlbihmbHV0ZVN0cmVhbXMsIHRhbGsubWVkaWEuYzNkLkZsdXRlU3RyZWFtcy5FdmVudC5ORVdfRU5EUE9JTlQsIHRoaXMuaGFuZGxlTmV3RW5kcG9pbnRfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8udW5saXN0ZW4oZmx1dGVTdHJlYW1zLCB0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXMuRXZlbnQuUkVNT1ZFRF9FTkRQT0lOVCwgdGhpcy5oYW5kbGVSZW1vdmVkRW5kcG9pbnRfKQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mb0hhbmRsZXIucHJvdG90eXBlLmhhbmRsZU5ld0VuZHBvaW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mb0hhbmRsZXIkJGhhbmRsZU5ld0VuZHBvaW50XyQoZSkgewogIGdvb2cuaXNEZWZBbmROb3ROdWxsKGUuZW5kcG9pbnQuZ2V0U3RyZWFtSWQoKSkgJiYgKHRoaXMubG9nZ2VyXy5maW5lKCJNb25pdG9yaW5nIGVuZHBvaW50ICIgKyBlLmVuZHBvaW50LmdldFN0cmVhbUlkKCkpLCB0aGlzLnNzcmNUb0VuZHBvaW50TWFwXy5zZXQoZS5lbmRwb2ludC5nZXRTdHJlYW1JZCgpLCBlLmVuZHBvaW50KSk7CiAgdGhpcy52aWRlb1RyYWNrZXJfLmFkZEVuZHBvaW50KGUuZW5kcG9pbnQpCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvSGFuZGxlci5wcm90b3R5cGUuaGFuZGxlUmVtb3ZlZEVuZHBvaW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mb0hhbmRsZXIkJGhhbmRsZVJlbW92ZWRFbmRwb2ludF8kKGUpIHsKICBnb29nLmlzRGVmQW5kTm90TnVsbChlLmVuZHBvaW50LmdldFN0cmVhbUlkKCkpICYmICh0aGlzLmxvZ2dlcl8uZmluZSgiU3RvcCBtb25pdG9yaW5nIGVuZHBvaW50ICIgKyBlLmVuZHBvaW50LmdldFN0cmVhbUlkKCkpLCB0aGlzLnNzcmNUb0VuZHBvaW50TWFwXy5yZW1vdmUoZS5lbmRwb2ludC5nZXRTdHJlYW1JZCgpKSk7CiAgdGhpcy52aWRlb1RyYWNrZXJfLnJlbW92ZUVuZHBvaW50KGUuZW5kcG9pbnQpCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvSGFuZGxlci5wcm90b3R5cGUuYWRkU3RyZWFtRW5kcG9pbnRTdGF0c011bHRpd2F5XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mb0hhbmRsZXIkJGFkZFN0cmVhbUVuZHBvaW50U3RhdHNNdWx0aXdheV8kKG1lZGlhSW5mbykgewogIGZvcih2YXIgaSA9IDA7aSA8IG1lZGlhSW5mby52aWRlb1JlY2VpdmVySW5mb3MubGVuZ3RoO2krKykgewogICAgdmFyIHZpZGVvUmVjZWl2ZXIgPSBtZWRpYUluZm8udmlkZW9SZWNlaXZlckluZm9zW2ldLCBzdHJlYW1FbmRwb2ludCA9IHRoaXMuc3NyY1RvRW5kcG9pbnRNYXBfLmdldCh2aWRlb1JlY2VpdmVyLnNzcmMpOwogICAgZ29vZy5pc0RlZkFuZE5vdE51bGwoc3RyZWFtRW5kcG9pbnQpICYmICh2aWRlb1JlY2VpdmVyLmZwc0dyYXBoaWNzSW5wdXQgPSBzdHJlYW1FbmRwb2ludC5nZXRNZWFuSW5wdXRGcmFtZXJhdGUoKSwgdmlkZW9SZWNlaXZlci5mcHNHcmFwaGljc091dHB1dCA9IHN0cmVhbUVuZHBvaW50LmdldE1lYW5PdXRwdXRGcmFtZXJhdGUoKSkKICB9Cn07CnRhbGsubWVkaWEuTWVkaWFJbmZvSGFuZGxlci5wcm90b3R5cGUuYWRkU3RyZWFtRW5kcG9pbnRTdGF0c09uZU9uT25lXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mb0hhbmRsZXIkJGFkZFN0cmVhbUVuZHBvaW50U3RhdHNPbmVPbk9uZV8kKG1lZGlhSW5mbykgewogIGlmKDEgPT0gbWVkaWFJbmZvLnZpZGVvUmVjZWl2ZXJJbmZvcy5sZW5ndGgpIHsKICAgIHZhciB2aWRlb1JlY2VpdmVyID0gbWVkaWFJbmZvLnZpZGVvUmVjZWl2ZXJJbmZvc1swXSwgc3RyZWFtRW5kcG9pbnQgPSB0aGlzLnNzcmNUb0VuZHBvaW50TWFwXy5nZXQodGFsay5tZWRpYS5PTkVfVE9fT05FX1JFTU9URV9WSURFT19TU1JDKTsKICAgIGdvb2cuaXNEZWZBbmROb3ROdWxsKHN0cmVhbUVuZHBvaW50KSAmJiAodmlkZW9SZWNlaXZlci5mcHNHcmFwaGljc0lucHV0ID0gc3RyZWFtRW5kcG9pbnQuZ2V0TWVhbklucHV0RnJhbWVyYXRlKCksIHZpZGVvUmVjZWl2ZXIuZnBzR3JhcGhpY3NPdXRwdXQgPSBzdHJlYW1FbmRwb2ludC5nZXRNZWFuT3V0cHV0RnJhbWVyYXRlKCkpCiAgfQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mb0hhbmRsZXIuU2Vzc2lvblBhcnRpY2lwYW50c18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm9IYW5kbGVyJFNlc3Npb25QYXJ0aWNpcGFudHNfJCgpIHsKICB0aGlzLmhhc0NoYW5nZWQgPSAhMDsKICB0aGlzLnBhcnRpY2lwYW50QnlOaWNrID0gbmV3IGdvb2cuc3RydWN0cy5NYXAKfTsKdGFsay5tZWRpYS5NZWRpYUluZm9IYW5kbGVyLnByb3RvdHlwZS5sb2dQYXJ0aWNpcGFudF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm9IYW5kbGVyJCRsb2dQYXJ0aWNpcGFudF8kKHNlc3Npb25JZCwgcGFydGljaXBhbnQpIHsKICB0aGlzLmxvZ2dlcl8uZmluZSgiaW4gbG9nUGFydGljaXBhbnRfIGZvciBzaWQgIiArIHNlc3Npb25JZCk7CiAgdmFyIHBhcnRpY2lwYW50cyA9IHRoaXMucGFydGljaXBhbnRzQnlTZXNzaW9uXy5nZXQoc2Vzc2lvbklkKTsKICBwYXJ0aWNpcGFudHMgfHwgKHBhcnRpY2lwYW50cyA9IG5ldyB0YWxrLm1lZGlhLk1lZGlhSW5mb0hhbmRsZXIuU2Vzc2lvblBhcnRpY2lwYW50c18sIHRoaXMucGFydGljaXBhbnRzQnlTZXNzaW9uXy5zZXQoc2Vzc2lvbklkLCBwYXJ0aWNpcGFudHMpKTsKICBwYXJ0aWNpcGFudHMuaGFzQ2hhbmdlZCA9ICEwOwogIHRoaXMubG9nZ2VyXy5maW5lKCJTZXQgaGFzQ2hhbmdlZCA9IHRydWUgZm9yIHNpZCAiICsgc2Vzc2lvbklkKTsKICB2YXIgbmljayA9IHBhcnRpY2lwYW50LmdldEppZCgpLCBwYXJ0aWNpcGFudExvZyA9IHBhcnRpY2lwYW50cy5wYXJ0aWNpcGFudEJ5Tmljay5nZXQobmljayk7CiAgcGFydGljaXBhbnRMb2cgfHwgKHBhcnRpY2lwYW50TG9nID0gbmV3IHRhbGsubWVkaWEuTWVkaWFJbmZvLlBhcnRpY2lwYW50TG9nKHtuaWNrOm5pY2t9KSwgcGFydGljaXBhbnRzLnBhcnRpY2lwYW50QnlOaWNrLnNldChuaWNrLCBwYXJ0aWNpcGFudExvZykpOwogIHBhcnRpY2lwYW50TG9nLnBhcnRpY2lwYW50ID0gcGFydGljaXBhbnQuZ2V0TmFtZSgpOwogIHBhcnRpY2lwYW50LmdldEF1ZGlvU1NSQygpICYmIHBhcnRpY2lwYW50TG9nLmF1ZGlvU3NyY3MucHVzaChwYXJ0aWNpcGFudC5nZXRBdWRpb1NTUkMoKSk7CiAgcGFydGljaXBhbnQuZ2V0VmlkZW9TU1JDKCkgJiYgcGFydGljaXBhbnRMb2cudmlkZW9Tc3Jjcy5wdXNoKHBhcnRpY2lwYW50LmdldFZpZGVvU1NSQygpKQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mb0hhbmRsZXIucHJvdG90eXBlLmhhbmRsZVBsdWdpbk1lc3NhZ2VQcm9jZXNzaW5nVGltZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm9IYW5kbGVyJCRoYW5kbGVQbHVnaW5NZXNzYWdlUHJvY2Vzc2luZ1RpbWVfJChlKSB7CiAgdGhpcy5tYXhQbHVnaW5NZXNzYWdlUHJvY2Vzc2luZ1RpbWVfID0gZS5wcm9jZXNzaW5nVGltZQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mb0hhbmRsZXIucHJvdG90eXBlLmhhbmRsZUFkZFBhcnRpY2lwYW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mb0hhbmRsZXIkJGhhbmRsZUFkZFBhcnRpY2lwYW50XyQoZSkgewogIHRoaXMubG9nZ2VyXy5maW5lKCJBZGRlZCBwYXJ0aWNpcGFudCAiICsgZS5wYXJ0aWNpcGFudC50b1N0cmluZygpKTsKICB0aGlzLmxvZ1BhcnRpY2lwYW50XyhlLnNlc3Npb25JZCwgZS5wYXJ0aWNpcGFudCkKfTsKdGFsay5tZWRpYS5NZWRpYUluZm9IYW5kbGVyLnByb3RvdHlwZS5oYW5kbGVUYWxrUGx1Z2luTWVzc2FnZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm9IYW5kbGVyJCRoYW5kbGVUYWxrUGx1Z2luTWVzc2FnZV8kKGUpIHsKICAiam1pZW5kIiA9PSBlLm1zZ1R5cGUgJiYgdGhpcy5oYW5kbGVKbWllbmRfKGUuZ2V0UGFyc2VkTXNnKCkpCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvSGFuZGxlci5wcm90b3R5cGUuaGFuZGxlSm1pZW5kXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mb0hhbmRsZXIkJGhhbmRsZUptaWVuZF8kKGppbmdsZU1zZykgewogIHZhciBzZXNzaW9uSWQgPSBqaW5nbGVNc2dbMl0sIHNlc3Npb25QYXJ0aWNpcGFudHMgPSB0aGlzLnBhcnRpY2lwYW50c0J5U2Vzc2lvbl8uZ2V0KHNlc3Npb25JZCk7CiAgZ29vZy5pc0RlZkFuZE5vdE51bGwoc2Vzc2lvblBhcnRpY2lwYW50cykgJiYgc2Vzc2lvblBhcnRpY2lwYW50cy5wYXJ0aWNpcGFudEJ5Tmljay5jbGVhcigpOwogIHRoaXMubG9nZ2VyXy5maW5lKCJSZW1vdmluZyBzZXNzaW9uICIgKyBzZXNzaW9uSWQpOwogIHRoaXMucGFydGljaXBhbnRzQnlTZXNzaW9uXy5yZW1vdmUoc2Vzc2lvbklkKTsKICB0aGlzLm1heFBsdWdpbk1lc3NhZ2VQcm9jZXNzaW5nVGltZV8gPSAwCn07CnRhbGsubWVkaWEuTWVkaWFJbmZvSGFuZGxlci5wcm90b3R5cGUuYWRkUGFydGljaXBhbnRzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mb0hhbmRsZXIkJGFkZFBhcnRpY2lwYW50c18kKG1lZGlhSW5mbykgewogIHZhciBjYWxsUGFydGljaXBhbnRzID0gdGhpcy5wYXJ0aWNpcGFudHNCeVNlc3Npb25fLmdldChtZWRpYUluZm8uc2Vzc2lvbklkKTsKICBjYWxsUGFydGljaXBhbnRzICYmIGNhbGxQYXJ0aWNpcGFudHMuaGFzQ2hhbmdlZCAmJiAobWVkaWFJbmZvLnBhcnRpY2lwYW50cyA9IGNhbGxQYXJ0aWNpcGFudHMucGFydGljaXBhbnRCeU5pY2suZ2V0VmFsdWVzKCksIGNhbGxQYXJ0aWNpcGFudHMuaGFzQ2hhbmdlZCA9ICExKQp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mb0hhbmRsZXIucHJvdG90eXBlLmFkZFBsdWdpbk1lc3NhZ2VQcm9jZXNzaW5nVGltZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYUluZm9IYW5kbGVyJCRhZGRQbHVnaW5NZXNzYWdlUHJvY2Vzc2luZ1RpbWVfJChtZWRpYUluZm8pIHsKICBtZWRpYUluZm8uZ2xvYmFsSW5mby5wbHVnaW5Nc2dQcm9jVGltZSA9IHRoaXMubWF4UGx1Z2luTWVzc2FnZVByb2Nlc3NpbmdUaW1lXwp9Owp0YWxrLm1lZGlhLk1lZGlhSW5mb0hhbmRsZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhSW5mb0hhbmRsZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgZ29vZy5kaXNwb3NlKHRoaXMuZXZlbnRIYW5kbGVyXyk7CiAgdGhpcy5zc3JjVG9FbmRwb2ludE1hcF8uY2xlYXIoKTsKICB0aGlzLnNzcmNUb0VuZHBvaW50TWFwXyA9IG51bGw7CiAgZm9yKHZhciBwYXJ0aWNpcGFudExvZ3MgPSB0aGlzLnBhcnRpY2lwYW50c0J5U2Vzc2lvbl8uZ2V0VmFsdWVzKCksIGkgPSAwO2kgPCBwYXJ0aWNpcGFudExvZ3MubGVuZ3RoO2krKykgewogICAgcGFydGljaXBhbnRMb2dzW2ldLnBhcnRpY2lwYW50QnlOaWNrLmNsZWFyKCksIHBhcnRpY2lwYW50TG9nc1tpXS5wYXJ0aWNpcGFudEJ5TmljayA9IG51bGwKICB9CiAgdGhpcy5wYXJ0aWNpcGFudHNCeVNlc3Npb25fLmNsZWFyKCk7CiAgdGhpcy5wYXJ0aWNpcGFudHNCeVNlc3Npb25fID0gbnVsbDsKICB0aGlzLm1heFBsdWdpbk1lc3NhZ2VQcm9jZXNzaW5nVGltZV8gPSAwOwogIHRhbGsubWVkaWEuTWVkaWFJbmZvSGFuZGxlci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLlZpZXdRdWFsaXR5Q29udHJvbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFZpZXdRdWFsaXR5Q29udHJvbCQoY2FsbE1hbmFnZXIpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKTsKICB0aGlzLmNhbGxNYW5hZ2VyXyA9IGNhbGxNYW5hZ2VyOwogIHRoaXMuc2NlbmVUb1N0cmVhbVF1YWxpdHlfID0gbmV3IGdvb2cuc3RydWN0cy5NYXAKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLlZpZXdRdWFsaXR5Q29udHJvbCwgZ29vZy5EaXNwb3NhYmxlKTsKdGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wuU0VSVklDRV9JRCA9IGZhdmEuc2VydmljZXMuZ2V0VW5pcXVlSWQoInRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sIik7CnRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sLldBSVRfQkVUV0VFTl9TRU5EX01TXyA9IDUwMDsKdGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wuREVGQVVMVF9WSURFT19GUkFNRVJBVEVfID0gMzA7CnRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sLk1BWF9RVkdBX1dJRFRIXyA9IDMyMDsKdGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wuTUFYX1FWR0FfSEVJR0hUXyA9IDI0MDsKdGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wiKTsKdGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wucHJvdG90eXBlLmlzUVZHQV8gPSAhMTsKdGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wuZ2V0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVmlld1F1YWxpdHlDb250cm9sJGdldCQoYXBwQ29udGV4dCkgewogIHJldHVybiBhcHBDb250ZXh0LmdldCh0YWxrLm1lZGlhLlZpZXdRdWFsaXR5Q29udHJvbC5TRVJWSUNFX0lEKQp9Owp0YWxrLm1lZGlhLlZpZXdRdWFsaXR5Q29udHJvbC5yZWdpc3RlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFZpZXdRdWFsaXR5Q29udHJvbCRyZWdpc3RlciQoYXBwQ29udGV4dCwgY2FsbE1hbmFnZXIpIHsKICB2YXIgY29udHJvbGxlciA9IG5ldyB0YWxrLm1lZGlhLlZpZXdRdWFsaXR5Q29udHJvbChjYWxsTWFuYWdlcik7CiAgYXBwQ29udGV4dC5yZWdpc3RlclNlcnZpY2UodGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wuU0VSVklDRV9JRCwgY29udHJvbGxlcik7CiAgcmV0dXJuIGNvbnRyb2xsZXIKfTsKdGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wucHJvdG90eXBlLmFkanVzdFF1YWxpdHlGb3JWaWV3cyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFZpZXdRdWFsaXR5Q29udHJvbCQkYWRqdXN0UXVhbGl0eUZvclZpZXdzJCh2aWV3cyQkMCwgc2NlbmUpIHsKICB2YXIgY2FsbCA9IHRoaXMuY2FsbE1hbmFnZXJfLmdldEFjdGl2ZUNhbGwoKTsKICBpZihnb29nLmlzRGVmQW5kTm90TnVsbChjYWxsKSAmJiBnb29nLmlzRGVmQW5kTm90TnVsbChjYWxsLnNzcmNNYXApKSB7CiAgICB0aGlzLmFwcGx5Vmlld1NpemVMaW1pdHNfKHZpZXdzJCQwLCBzY2VuZSk7CiAgICBmb3IodmFyIHF1YWxpdHlNYXAgPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcCwgaSA9IDA7aSA8IHZpZXdzJCQwLmxlbmd0aDsrK2kpIHsKICAgICAgdmFyIHYkJDAgPSB2aWV3cyQkMFtpXSwgb3RoZXIkJDAgPSBxdWFsaXR5TWFwLmdldCh2JCQwWzBdKTsKICAgICAgKHZvaWQgMCA9PSBvdGhlciQkMCB8fCB2JCQwWzJdID4gb3RoZXIkJDBbMl0gfHwgdiQkMFsxXSA+IG90aGVyJCQwWzFdKSAmJiBxdWFsaXR5TWFwLnNldCh2JCQwWzBdLCBbdiQkMFswXSwgdiQkMFsxXSwgdiQkMFsyXSwgc2NlbmUuZ2V0TWF4RnBzKCldKQogICAgfQogICAgdGhpcy5zY2VuZVRvU3RyZWFtUXVhbGl0eV8uc2V0KGdvb2cuZ2V0VWlkKHNjZW5lKSwgcXVhbGl0eU1hcCk7CiAgICB2YXIgc3RyZWFtUXVhbGl0eSA9IG5ldyBnb29nLnN0cnVjdHMuTWFwOwogICAgZ29vZy5pdGVyLmZvckVhY2godGhpcy5zY2VuZVRvU3RyZWFtUXVhbGl0eV8uZ2V0S2V5SXRlcmF0b3IoKSwgZnVuY3Rpb24oc291cmNlKSB7CiAgICAgIHZhciB2aWV3cyA9IHRoaXMuc2NlbmVUb1N0cmVhbVF1YWxpdHlfLmdldChzb3VyY2UpOwogICAgICBnb29nLml0ZXIuZm9yRWFjaCh2aWV3cy5nZXRLZXlJdGVyYXRvcigpLCBmdW5jdGlvbihzc3JjKSB7CiAgICAgICAgdmFyIHYgPSB2aWV3cy5nZXQoc3NyYyksIG90aGVyID0gc3RyZWFtUXVhbGl0eS5nZXQoc3NyYyk7CiAgICAgICAgKHZvaWQgMCA9PSBvdGhlciB8fCB2WzJdID4gb3RoZXJbMl0gfHwgdlsxXSA+IG90aGVyWzFdKSAmJiBzdHJlYW1RdWFsaXR5LnNldCh2WzBdLCB0aGlzLmNyZWF0ZVZpZXdRdWFsaXR5Xyh2KSkKICAgICAgfSwgdGhpcykKICAgIH0sIHRoaXMpOwogICAgdGhpcy5yZXF1ZXN0UXVhbGl0eV8oc3RyZWFtUXVhbGl0eSkKICB9Cn07CnRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sLnByb3RvdHlwZS5hcHBseVZpZXdTaXplTGltaXRzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFZpZXdRdWFsaXR5Q29udHJvbCQkYXBwbHlWaWV3U2l6ZUxpbWl0c18kKHZpZXdzLCBzY2VuZSkgewogIHZhciBtYXhWaWV3ID0gc2NlbmUuZ2V0TWF4Vmlld1NpemUoKTsKICBpZihtYXhWaWV3KSB7CiAgICBmb3IodmFyIGkgPSAwO2kgPCB2aWV3cy5sZW5ndGg7aSsrKSB7CiAgICAgIHZpZXdzW2ldWzFdID0gTWF0aC5taW4odmlld3NbaV1bMV0sIG1heFZpZXcud2lkdGgpLCB2aWV3c1tpXVsyXSA9IE1hdGgubWluKHZpZXdzW2ldWzJdLCBtYXhWaWV3LmhlaWdodCkKICAgIH0KICB9Cn07CnRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sLnByb3RvdHlwZS5jcmVhdGVWaWV3UXVhbGl0eV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRWaWV3UXVhbGl0eUNvbnRyb2wkJGNyZWF0ZVZpZXdRdWFsaXR5XyQodmlldykgewogIHZhciB3aWR0aCA9IHZpZXdbMV0sIGhlaWdodCA9IHZpZXdbMl0sIGZwcyA9IHZpZXdbM107CiAgdGhpcy5pc1FWR0FfICYmICh3aWR0aCA9IE1hdGgubWluKHdpZHRoLCB0YWxrLm1lZGlhLlZpZXdRdWFsaXR5Q29udHJvbC5NQVhfUVZHQV9XSURUSF8pLCBoZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIHRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sLk1BWF9RVkdBX0hFSUdIVF8pKTsKICByZXR1cm4gZ29vZy5pc0RlZihmcHMpID8gW3ZpZXdbMF0sIHdpZHRoLCBoZWlnaHQsIGZwc10gOiBbdmlld1swXSwgd2lkdGgsIGhlaWdodF0KfTsKdGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wucHJvdG90eXBlLmRpc3Bvc2VWaWV3cyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFZpZXdRdWFsaXR5Q29udHJvbCQkZGlzcG9zZVZpZXdzJChzY2VuZSkgewogIHRoaXMuc2NlbmVUb1N0cmVhbVF1YWxpdHlfLnJlbW92ZShnb29nLmdldFVpZChzY2VuZSkpCn07CnRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sLnByb3RvdHlwZS5yZXF1ZXN0UXVhbGl0eV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRWaWV3UXVhbGl0eUNvbnRyb2wkJHJlcXVlc3RRdWFsaXR5XyQoc3RyZWFtUXVhbGl0eSkgewogIGZvcih2YXIgY2FsbCA9IHRoaXMuY2FsbE1hbmFnZXJfLmdldEFjdGl2ZUNhbGwoKSwgcmVxdWVzdHMgPSBbXSwganZWaWV3cyA9IFtdLCBuaWNrcyA9IGNhbGwuc3NyY01hcC5nZXRLZXlzKCksIGkgPSAwO2kgPCBuaWNrcy5sZW5ndGg7aSsrKSB7CiAgICBpZighKHRoaXMuY2FsbE1hbmFnZXJfLmdldExvY2FsUHJldmlldygpICYmIG5pY2tzW2ldID09IHRoaXMuY2FsbE1hbmFnZXJfLmdldExvY2FsTmljaygpKSkgewogICAgICB2YXIgZW50cnkgPSBjYWxsLnNzcmNNYXAuZ2V0KG5pY2tzW2ldKTsKICAgICAgaWYoZW50cnkudmlkZW9Tc3JjKSB7CiAgICAgICAgdmFyIHJlc29sdXRpb24gPSBzdHJlYW1RdWFsaXR5LmdldChlbnRyeS52aWRlb1NzcmMpOwogICAgICAgIGlmKHZvaWQgMCAhPSByZXNvbHV0aW9uKSB7CiAgICAgICAgICAodm9pZCAwID09IHJlc29sdXRpb25bMV0gfHwgdm9pZCAwID09IHJlc29sdXRpb25bMl0pICYmIHRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sLmxvZ2dlcl8ud2FybmluZygiQmFkIHJlc29sdXRpb24gKCIgKyByZXNvbHV0aW9uWzFdICsgIiB4ICIgKyByZXNvbHV0aW9uWzJdICsgIikgZm9yIG5pY2s6ICIgKyBuaWNrc1tpXSArICIsIHN0YWNrdHJhY2U6ICIgKyBnb29nLmRlYnVnLmdldFN0YWNrdHJhY2UoKSk7CiAgICAgICAgICB2YXIgd2lkdGggPSBNYXRoLnJvdW5kKHJlc29sdXRpb25bMV0pIHx8IDAsIGhlaWdodCA9IE1hdGgucm91bmQocmVzb2x1dGlvblsyXSkgfHwgMCwgZnBzID0gcmVzb2x1dGlvblszXSB8fCB0YWxrLm1lZGlhLlZpZXdRdWFsaXR5Q29udHJvbC5ERUZBVUxUX1ZJREVPX0ZSQU1FUkFURV87CiAgICAgICAgICByZXF1ZXN0cy5wdXNoKFsic2VsZWN0ZWQiLCBuaWNrc1tpXSwgZW50cnkudmlkZW9Tc3JjLCB3aWR0aCwgaGVpZ2h0LCBmcHNdKTsKICAgICAgICAgIGp2Vmlld3MucHVzaCh7dHlwZToic3RhdGljIiwgc3NyYzpwYXJzZUludChlbnRyeS52aWRlb1NzcmMsIDEwKSwgd2lkdGg6d2lkdGgsIGhlaWdodDpoZWlnaHQsIGZyYW1lcmF0ZTpmcHN9KQogICAgICAgIH1lbHNlIHsKICAgICAgICAgIHRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sLmxvZ2dlcl8uc2V2ZXJlKCdObyB2aWV3IHJlcXVlc3RlZCBmb3IgdmlkZW8gU1NSQzogIicgKyBlbnRyeS52aWRlb1NzcmMgKyAnIi4nKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXF1ZXN0cy5zb3J0KGZ1bmN0aW9uKHRoaXNSZXF1ZXN0LCB0aGF0UmVxdWVzdCkgewogICAgcmV0dXJuIHRoYXRSZXF1ZXN0WzNdIC0gdGhpc1JlcXVlc3RbM10KICB9KTsKICB2YXIgcmVtb3RlSmlkID0gY2FsbC5yZW1vdGVKaWRzWzBdLCBtc2cgPSBbInZpZXciLCByZW1vdGVKaWQsIGNhbGwuc2Vzc2lvbklkLCByZXF1ZXN0c10sIGp2TXNnID0gWyJqdiIsIHJlbW90ZUppZCwgY2FsbC5zZXNzaW9uSWQsIHt2Omp2Vmlld3N9XTsKICB0aGlzLnNlbmRPclNjaGVkdWxlVmlld1JlcXVlc3RfKG1zZywganZNc2cpCn07CnRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sLnByb3RvdHlwZS5zZW5kT3JTY2hlZHVsZVZpZXdSZXF1ZXN0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFZpZXdRdWFsaXR5Q29udHJvbCQkc2VuZE9yU2NoZWR1bGVWaWV3UmVxdWVzdF8kKG1zZywganZNc2cpIHsKICB0aGlzLnJlY2VudFNlbmRUaW1lcl8gPyAodGhpcy5vdXRzdGFuZGluZ01zZ18gPSBtc2csIHRoaXMub3V0c3RhbmRpbmdKdk1zZ18gPSBqdk1zZykgOiAodGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wubG9nZ2VyXy5pbmZvKCJSZXF1ZXN0aW5nIHZpZGVvIHZpZXc6ICIgKyBnb29nLmpzb24uc2VyaWFsaXplKG1zZykpLCB0aGlzLmNhbGxNYW5hZ2VyXy5zZW5kSmluZ2xlTXNnKG1zZyksIHRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sLmxvZ2dlcl8uaW5mbygiUmVxdWVzdGluZyB2aWRlbyB2aWV3OiAiICsgZ29vZy5qc29uLnNlcmlhbGl6ZShqdk1zZykpLCB0aGlzLmNhbGxNYW5hZ2VyXy5zZW5kSmluZ2xlTXNnKGp2TXNnKSwgdGhpcy5yZWNlbnRTZW5kVGltZXJfID0gZ29vZy5UaW1lci5jYWxsT25jZSh0aGlzLm9uUmVhZHlUb1NlbmRfLCB0YWxrLm1lZGlhLlZpZXdRdWFsaXR5Q29udHJvbC5XQUlUX0JFVFdFRU5fU0VORF9NU18sIHRoaXMpKQp9Owp0YWxrLm1lZGlhLlZpZXdRdWFsaXR5Q29udHJvbC5wcm90b3R5cGUub25SZWFkeVRvU2VuZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRWaWV3UXVhbGl0eUNvbnRyb2wkJG9uUmVhZHlUb1NlbmRfJCgpIHsKICB0aGlzLnJlY2VudFNlbmRUaW1lcl8gPSBudWxsOwogIHRoaXMub3V0c3RhbmRpbmdNc2dfICYmICh0aGlzLnNlbmRPclNjaGVkdWxlVmlld1JlcXVlc3RfKHRoaXMub3V0c3RhbmRpbmdNc2dfLCB0aGlzLm91dHN0YW5kaW5nSnZNc2dfKSwgdGhpcy5vdXRzdGFuZGluZ0p2TXNnXyA9IHRoaXMub3V0c3RhbmRpbmdNc2dfID0gbnVsbCkKfTsKdGFsay5tZWRpYS5WaWV3UXVhbGl0eUNvbnRyb2wucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFZpZXdRdWFsaXR5Q29udHJvbCQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0YWxrLm1lZGlhLlZpZXdRdWFsaXR5Q29udHJvbC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICB0aGlzLnJlY2VudFNlbmRUaW1lcl8gJiYgKGdvb2cuVGltZXIuY2xlYXIodGhpcy5yZWNlbnRTZW5kVGltZXJfKSwgdGhpcy5yZWNlbnRTZW5kVGltZXJfID0gbnVsbCk7CiAgdGhpcy5jYWxsTWFuYWdlcl8gPSBudWxsCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXIkKGNhbGxNYW5hZ2VyLCBvcHRpb25zLCBvcHRfbXVsdGlWaWV3LCBvcHRfbXV0ZUhhbmRsZXIsIG9wdF9lbmFibGVOb3RpZmljYXRpb25zLCBvcHRfcmVuZGVyTW9kZSwgb3B0X21lZGlhSW5mb0hhbmRsZXIpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuY2FsbE1hbmFnZXJfID0gY2FsbE1hbmFnZXI7CiAgdGhpcy5wbGF5ZXJPcHRpb25zXyA9IG9wdGlvbnM7CiAgdGhpcy5tdWx0aVZpZXdfID0gb3B0X211bHRpVmlldyB8fCAhMTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHRoaXMubzNkQnVuZGxlXyA9IG5ldyB0YWxrLm1lZGlhLmMzZC5PM2RCdW5kbGU7CiAgdGhpcy5tZWRpYUluZm9IYW5kbGVyXyA9IG9wdF9tZWRpYUluZm9IYW5kbGVyIHx8IG51bGw7CiAgdGhpcy5zY2VuZV8gPSB0aGlzLmNyZWF0ZVNjZW5lXygpOwogIHRoaXMuc3RyZWFtc18gPSB0aGlzLmNyZWF0ZVN0cmVhbXNfKCk7CiAgdGhpcy52aWV3UXVhbGl0eUNvbnRyb2xfID0gbmV3IHRhbGsubWVkaWEuVmlld1F1YWxpdHlDb250cm9sKGNhbGxNYW5hZ2VyKTsKICB0aGlzLm8zZENvbnRleHRfID0gbmV3IHRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQoY2FsbE1hbmFnZXIsIHRoaXMubzNkQnVuZGxlXywgdGhpcy5zY2VuZV8sIHRoaXMuc3RyZWFtc18sIHRoaXMudmlld1F1YWxpdHlDb250cm9sXywgb3B0X3JlbmRlck1vZGUpOwogIG9wdGlvbnMuZ2V0QmFja2dyb3VuZENvbG9yKCkgJiYgdGhpcy5vM2RDb250ZXh0Xy5zZXRCYWNrZ3JvdW5kQ29sb3Iob3B0aW9ucy5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7CiAgdGhpcy5vM2RDb250ZXh0Xy5zZXRQYXJlbnRFdmVudFRhcmdldCh0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMubzNkQ29udGV4dF8sIHRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQuRXZlbnRzLlJFU0laRSwgdGhpcy5vblJlc2l6ZV8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5vM2RDb250ZXh0XywgdGFsay5tZWRpYS5jM2QuTzNkQ29udGV4dC5FdmVudHMuQ0FMTF9BQ0NFUFRFRCwgdGhpcy5vbkNhbGxBY2NlcHRlZF8pOwogIHRoaXMuYzNkRXZlbnRUYXJnZXRfID0gbmV3IHRhbGsubWVkaWEuYzNkLkMzZEV2ZW50VGFyZ2V0OwogIHRoaXMuYzNkRXZlbnRUYXJnZXRfLnNldFBhcmVudEV2ZW50VGFyZ2V0KHRoaXMpOwogIHRoaXMubXV0ZUhhbmRsZXJfID0gb3B0X211dGVIYW5kbGVyIHx8IG51bGw7CiAgdGhpcy5lbmFibGVOb3RpZmljYXRpb25zXyA9IG9wdF9lbmFibGVOb3RpZmljYXRpb25zIHx8ICExOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5jYWxsTWFuYWdlcl8sIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuU1BFQUtFUl9DSEFOR0VELCB0aGlzLmhhbmRsZVNwZWFrZXJDaGFuZ2VkXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLmNhbGxNYW5hZ2VyXywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5BRERfUEFSVElDSVBBTlQsIHRoaXMuaGFuZGxlQWRkUGFydGljaXBhbnRfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuY2FsbE1hbmFnZXJfLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LlJFTU9WRV9QQVJUSUNJUEFOVCwgdGhpcy5oYW5kbGVSZW1vdmVQYXJ0aWNpcGFudF8pOwogIHRoaXMuYm91bmRPbk1vdXNlTW92ZV8gPSBnb29nLmJpbmQodGhpcy5vbk1vdXNlTW92ZV8sIHRoaXMpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5FdmVudHMgPSB7RkFUQUxfRVJST1I6ImMzZGNwLWVycm9yIn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5GYXRhbEVycm9yRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyJEZhdGFsRXJyb3JFdmVudCQoKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIuRXZlbnRzLkZBVEFMX0VSUk9SKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5GYXRhbEVycm9yRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyLlNIT1dfQ09OVFJPTFNfT05fTU9VU0VNT1ZFX01TXyA9IDI1MDA7CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5UUkFOU1BBUkVOQ1lfVklFV19EUkFXX1BSSU9SSVRZXyA9IDI7CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyIik7CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuaW5pdGlhbGl6ZVdhaXRfID0gMDsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5sYXN0TW91c2VYXyA9IDA7CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUubGFzdE1vdXNlWV8gPSAwOwp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLmNyZWF0ZVNjZW5lXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXIkJGNyZWF0ZVNjZW5lXyQoKSB7CiAgdmFyIHNjZW5lOwogIHRoaXMubXVsdGlWaWV3XyA/IChzY2VuZSA9IG5ldyB0YWxrLm1lZGlhLmMzZC5TcGVha2VyU3RyaXBTY2VuZSh0aGlzLnBsYXllck9wdGlvbnNfLmdldE9yZGVyRmVlZHMoKSwgdGhpcy5wbGF5ZXJPcHRpb25zXy5nZXRTY2VuZUxheW91dFR5cGUoKSwgdGhpcy5wbGF5ZXJPcHRpb25zXy5nZXRGaWxtU3RyaXBXaWR0aCgpLCB0aGlzLnBsYXllck9wdGlvbnNfLmdldFN0aWNreVNjcmVlbmNhc3QoKSksIHNjZW5lLnNldE8zZEJ1bmRsZSh0aGlzLm8zZEJ1bmRsZV8pLCB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHNjZW5lLCB0YWxrLm1lZGlhLmMzZC5TY2VuZVNlbGVjdGlvbi5FdmVudC5DSEFOR0VELCB0aGlzLmhhbmRsZVNjZW5lU2VsZWN0aW9uQ2hhbmdlZF8pKSA6IHNjZW5lID0gbmV3IHRhbGsubWVkaWEuYzNkLlBpcFNjZW5lKHRoaXMubzNkQnVuZGxlXywgdGhpcy5wbGF5ZXJPcHRpb25zXy5nZXRQaXAoKSk7CiAgcmV0dXJuIHNjZW5lCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuY3JlYXRlU3RyZWFtc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyJCRjcmVhdGVTdHJlYW1zXyQoKSB7CiAgdmFyIHN0cmVhbXM7CiAgc3RyZWFtcyA9IHRoaXMubXVsdGlWaWV3XyA/IG5ldyB0YWxrLm1lZGlhLmMzZC5GbHV0ZVN0cmVhbXModGhpcy5jYWxsTWFuYWdlcl8sIHRoaXMubzNkQnVuZGxlXykgOiBuZXcgdGFsay5tZWRpYS5jM2QuRmx1dGVTdHJlYW1zMW9uMSh0aGlzLmNhbGxNYW5hZ2VyXywgdGhpcy5vM2RCdW5kbGVfKTsKICBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLm1lZGlhSW5mb0hhbmRsZXJfKSAmJiB0aGlzLm1lZGlhSW5mb0hhbmRsZXJfLm1vbml0b3JGbHV0ZVN0cmVhbXMoc3RyZWFtcyk7CiAgcmV0dXJuIHN0cmVhbXMKfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5pbml0UGxheWVyXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXIkJGluaXRQbGF5ZXJfJChlKSB7CiAgaWYoZS5yZXN1bHQpIHsKICAgIHZhciBjM2QgPSB0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LmdldFBsdWdpbigpOwogICAgdGFsay5tZWRpYS5jM2QuYWRkRXZlbnRDYWxsYmFjayhjM2QsICJtb3VzZW1vdmUiLCB0aGlzLmJvdW5kT25Nb3VzZU1vdmVfKTsKICAgIHRhbGsubWVkaWEuYzNkLmFkZEV2ZW50Q2FsbGJhY2soYzNkLCAibW91c2Vtb3ZlIiwgdGhpcy5ib3VuZE9uTW91c2VNb3ZlXyk7CiAgICB0aGlzLnRyYW5zcGFyZW5jeVZpZXdfID0gdGhpcy5vM2RCdW5kbGVfLnJlbmRlcmluZ0FwaS5jcmVhdGVWaWV3KHRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5UUkFOU1BBUkVOQ1lfVklFV19EUkFXX1BSSU9SSVRZXywgITApOwogICAgdGhpcy5zdHJlYW1zXy5pbml0U2Vzc2lvbih0aGlzLm8zZENvbnRleHRfLmdldFNlc3Npb25JZCgpLCB0aGlzLm8zZENvbnRleHRfLmdldFNlbmRlckppZCgpLCB0aGlzLm8zZENvbnRleHRfLmdldENhbGxUeXBlKCksIHRoaXMucGFydGljaXBhbnRzXyk7CiAgICB0aGlzLmltYWdlT3ZlcmxheV8gPSBuZXcgdGFsay5tZWRpYS5jM2QuSW1hZ2VPdmVybGF5KHRoaXMubzNkQnVuZGxlXywgdGhpcy50cmFuc3BhcmVuY3lWaWV3XywgMTApOwogICAgaWYodGhpcy5lbmFibGVOb3RpZmljYXRpb25zXykgewogICAgICB2YXIgbm90aWZSZW5kZXJlciA9IG5ldyB0YWxrLm1lZGlhLmMzZC5Ob3RpZmljYXRpb25SZW5kZXJlcih0aGlzLm8zZEJ1bmRsZV8ucGFjaywgdGhpcy5vM2RCdW5kbGVfLmMzZE9iamVjdC5nZXRQbHVnaW4oKSwgdGhpcy5vM2RCdW5kbGVfLmMzZE9iamVjdC5nZXRXaWR0aCgpLCA1MCk7CiAgICAgIHRoaXMubm90aWZpZXJfID0gbmV3IHRhbGsubWVkaWEuQzNkTm90aWZpZXIodGhpcy5jYWxsTWFuYWdlcl8sIHRoaXMubzNkQnVuZGxlXy5wYWNrLCB0aGlzLm8zZEJ1bmRsZV8uYzNkRW5naW5lLCB0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LCB0aGlzLmltYWdlT3ZlcmxheV8sIG5vdGlmUmVuZGVyZXIpCiAgICB9CiAgICB0aGlzLm8zZENvbnRleHRfLmdldENhbGxUeXBlKCkgIT0gdGFsay5tZWRpYS5DYWxsVHlwZS5URVNUICYmIHRoaXMubzNkQ29udGV4dF8uaXNBY2NlcHRlZCgpICYmIHRoaXMubzNkQ29udGV4dF8uc2V0Q2FsbEFjY2VwdGVkKCkKICB9ZWxzZSB7CiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5GYXRhbEVycm9yRXZlbnQpCiAgfQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLmhhbmRsZU1pY011dGVOb3RpZmljYXRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyJCRoYW5kbGVNaWNNdXRlTm90aWZpY2F0aW9uJChlKSB7CiAgdGhpcy5vM2RDb250ZXh0Xy5pc1JlYWR5KCkgJiYgKHRoaXMubXV0ZUhhbmRsZXJfICYmIHRoaXMubXV0ZUhhbmRsZXJfLmhhbmRsZU1pY011dGVOb3RpZmljYXRpb24oZSksIHRoaXMubm90aWZpZXJfICYmIChlLm11dGVkID8gKHRoaXMuY2FsbE1hbmFnZXJfLmFkZFRvTG9nKCJNaWMgTXV0ZSBzaG93IiksIHRoaXMubm90aWZpZXJfLnNob3dOb3RpZmljYXRpb24odGhpcy5taWNNdXRlTm90aWZpY2F0aW9uXykpIDogKHRoaXMuY2FsbE1hbmFnZXJfLmFkZFRvTG9nKCJNaWMgVW5tdXRlIHNob3ciKSwgdGhpcy5ub3RpZmllcl8uc2hvd05vdGlmaWNhdGlvbih0aGlzLm1pY1VubXV0ZU5vdGlmaWNhdGlvbl8pKSkpCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUub25SZXNpemVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllciQkb25SZXNpemVfJChlKSB7CiAgdGhpcy5zY2VuZV8uc2V0QXJlYSgwLCAwLCBlLndpZHRoLCBlLmhlaWdodCk7CiAgdGhpcy5sYXN0TW91c2VZXyA9IHRoaXMubGFzdE1vdXNlWF8gPSAwOwogIHRoaXMuc2hvd0NvbnRyb2xzXygpCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUub25Nb3VzZU1vdmVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllciQkb25Nb3VzZU1vdmVfJChlKSB7CiAgdGhpcy5sYXN0TW91c2VYXyA9IGUueDsKICB0aGlzLmxhc3RNb3VzZVlfID0gZS55OwogIHRoaXMuc2hvd0NvbnRyb2xzXygpCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuaW5pdE11dGVIYW5kbGVyXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXIkJGluaXRNdXRlSGFuZGxlcl8kKCkgewogIHRoaXMubXV0ZUhhbmRsZXJfICYmIHRoaXMubXV0ZUhhbmRsZXJfLmluaXQodGhpcy5jYWxsTWFuYWdlcl8sIHRoaXMubzNkQnVuZGxlXy5jM2RFbmdpbmUsIHRoaXMubzNkQnVuZGxlXy5jM2RPYmplY3QsIHRoaXMuaW1hZ2VPdmVybGF5XykKfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5pbml0Tm90aWZpZXJfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllciQkaW5pdE5vdGlmaWVyXyQoKSB7CiAgdGhpcy5ub3RpZmllcl8gJiYgKHRoaXMubWljTXV0ZU5vdGlmaWNhdGlvbl8gPSB0aGlzLm5vdGlmaWVyXy5hZGROb3RpZmljYXRpb24oImltYWdlcy9taWNfZnVsbHNjcmVlbl9tdXRlZC5wbmciLCAiWW91ciBtaWMgaXMgbm93IE9mZiEiKSwgdGhpcy5taWNVbm11dGVOb3RpZmljYXRpb25fID0gdGhpcy5ub3RpZmllcl8uYWRkTm90aWZpY2F0aW9uKCJpbWFnZXMvbWljX2Z1bGxzY3JlZW4ucG5nIiwgIllvdXIgbWljIGlzIG5vdyBPbiEiKSkKfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5oYW5kbGVTcGVha2VyQ2hhbmdlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyJCRoYW5kbGVTcGVha2VyQ2hhbmdlZF8kKGUpIHsKICB2YXIgc3RyZWFtSWQgPSBlLnBhcnRpY2lwYW50LmdldFZpZGVvU1NSQygpOwogIHN0cmVhbUlkIHx8IChzdHJlYW1JZCA9IGUucGFydGljaXBhbnQuZ2V0QXVkaW9TU1JDKCkpOwogIHRoaXMuc2NlbmVfLnNldEN1cnJlbnRTcGVha2VyKHN0cmVhbUlkKQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLnJlbW92ZVBsYXllciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXIkJHJlbW92ZVBsYXllciQoKSB7CiAgdGhpcy5mdWxsc2NyZWVuSGFuZGxlcl8gJiYgKHRoaXMuZnVsbHNjcmVlbkhhbmRsZXJfLmRpc3Bvc2UoKSwgdGhpcy5mdWxsc2NyZWVuSGFuZGxlcl8gPSBudWxsKTsKICB0aGlzLmltYWdlT3ZlcmxheV8gPSBudWxsOwogIHRoaXMubXV0ZUhhbmRsZXJfICYmIHRoaXMubXV0ZUhhbmRsZXJfLmRpc3Bvc2VDM2QoKTsKICB0aGlzLm5vdGlmaWVyXyAmJiB0aGlzLm5vdGlmaWVyXy5kaXNwb3NlQzNkKCk7CiAgdGhpcy50cmFuc3BhcmVuY3lWaWV3XyAmJiAodGhpcy50cmFuc3BhcmVuY3lWaWV3Xy5kaXNwb3NlKCksIHRoaXMudHJhbnNwYXJlbmN5Vmlld18gPSBudWxsKTsKICBpZih0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0ICYmIHRoaXMubzNkQnVuZGxlXy5jM2RPYmplY3QuaXNTY3JpcHRhYmxlKCkpIHsKICAgIHZhciBjM2QgPSB0aGlzLm8zZEJ1bmRsZV8uYzNkT2JqZWN0LmdldFBsdWdpbigpOwogICAgdGFsay5tZWRpYS5jM2QucmVtb3ZlRXZlbnRDYWxsYmFjayhjM2QsICJtb3VzZW1vdmUiLCB0aGlzLmJvdW5kT25Nb3VzZU1vdmVfKQogIH0KICB0aGlzLm8zZENvbnRleHRfLnJlbW92ZVBsYXllcigpCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuZGlzcGxheUNhbGxfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllciQkZGlzcGxheUNhbGxfJChzZXNzaW9uSWQsIHNlbmRlckppZCwgcGFydGljaXBhbnRzLCBjYWxsVHlwZSwgaXNNdWx0aVVzZXIpIHsKICB0aGlzLnNldFBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudHMpOwogIHRoaXMubzNkQ29udGV4dF8uc2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7CiAgdGhpcy5vM2RDb250ZXh0Xy5zZXRTZW5kZXJKaWQoc2VuZGVySmlkKTsKICB0aGlzLm8zZENvbnRleHRfLnNldENhbGxUeXBlKGNhbGxUeXBlKTsKICB0aGlzLm8zZENvbnRleHRfLnJlbW92ZVBsYXllcigpOwogIGlmKHRoaXMubzNkQ29udGV4dF8uZ2V0Q2FsbFR5cGUoKSA9PSB0YWxrLm1lZGlhLkNhbGxUeXBlLlZJREVPIHx8IHRoaXMubzNkQ29udGV4dF8uZ2V0Q2FsbFR5cGUoKSA9PSB0YWxrLm1lZGlhLkNhbGxUeXBlLlRFU1QgfHwgaXNNdWx0aVVzZXIpIHsKICAgIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW5PbmNlKHRoaXMubzNkQ29udGV4dF8sIHRhbGsubWVkaWEuYzNkLk8zZENvbnRleHQuRXZlbnRzLklOSVRfRklOSVNIRUQsIHRoaXMuaW5pdFBsYXllcl8pLCB0aGlzLm8zZENvbnRleHRfLmNyZWF0ZVBsYXllcigpCiAgfQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLm9uTmV3Q2FsbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXIkJG9uTmV3Q2FsbCQoaXNPdXRnb2luZywgc2Vzc2lvbklkLCBzZW5kZXJKaWQsIHBhcnRpY2lwYW50cywgY2FsbFR5cGUsIGlzTXVsdGlVc2VyKSB7CiAgY2FsbFR5cGUgPT0gdGFsay5tZWRpYS5DYWxsVHlwZS5URVNUICYmIHRoaXMuY2FsbE1hbmFnZXJfLnNlbmRGbHV0ZU1zZyhnb29nLmpzb24uc2VyaWFsaXplKFsiam4iLCBzZW5kZXJKaWQsIHNlc3Npb25JZCwgInQiLCAicyJdKSk7CiAgdGhpcy5kaXNwbGF5Q2FsbF8oc2Vzc2lvbklkLCBzZW5kZXJKaWQsIHBhcnRpY2lwYW50cywgY2FsbFR5cGUsIGlzTXVsdGlVc2VyKQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLmRpc3BsYXlDYWxsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllciQkZGlzcGxheUNhbGwkKGppZCwgcGFydGljaXBhbnRzLCBpc011bHRpVXNlcikgewogIHZhciBjYWxsID0gdGhpcy5jYWxsTWFuYWdlcl8uZmluZENhbGwoamlkKTsKICBjYWxsID8gdGhpcy5kaXNwbGF5Q2FsbF8oY2FsbC5zZXNzaW9uSWQsIGNhbGwucmVtb3RlSmlkc1swXSwgcGFydGljaXBhbnRzLCBjYWxsLnR5cGUsIGlzTXVsdGlVc2VyKSA6IHRoaXMubG9nZ2VyXy53YXJuaW5nKCJkaXNwbGF5Q2FsbCBjYWxsZWQgd2l0aCBpbnZhbGlkIGNhbGwgZm9yIEpJRCAiICsgamlkKQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLnNldFBhcnRpY2lwYW50cyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXIkJHNldFBhcnRpY2lwYW50cyQocGFydGljaXBhbnRzKSB7CiAgdGhpcy5sb2dnZXJfLmluZm8oInNldFBhcnRpY2lwYW50cyA6ICIgKyBwYXJ0aWNpcGFudHMpOwogIHRoaXMucGFydGljaXBhbnRzXyA9IHBhcnRpY2lwYW50cwp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLnNob3dDb250cm9sc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyJCRzaG93Q29udHJvbHNfJCgpIHsKICB0aGlzLmNsZWFySGlkZVRpbWVyXygpOwogIHRoaXMuZnVsbHNjcmVlbkhhbmRsZXJfICYmIHRoaXMuZnVsbHNjcmVlbkhhbmRsZXJfLnNob3dDb250cm9sKCk7CiAgdGhpcy5wbGF5ZXJPcHRpb25zXy5nZXRBdXRvSGlkZUNvbnRyb2xzKCkgJiYgKHRoaXMuaGlkZVRpbWVySWRfID0gZ29vZy5UaW1lci5jYWxsT25jZSh0aGlzLmhpZGVDb250cm9sc18sIHRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5TSE9XX0NPTlRST0xTX09OX01PVVNFTU9WRV9NU18sIHRoaXMpKQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLmhpZGVDb250cm9sc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyJCRoaWRlQ29udHJvbHNfJCgpIHsKICB0aGlzLmNsZWFySGlkZVRpbWVyXygpOwogIHRoaXMuZnVsbHNjcmVlbkhhbmRsZXJfICYmICh0aGlzLmZ1bGxzY3JlZW5IYW5kbGVyXy5pc092ZXJDb250cm9sKHRoaXMubGFzdE1vdXNlWF8sIHRoaXMubGFzdE1vdXNlWV8pIHx8IHRoaXMuZnVsbHNjcmVlbkhhbmRsZXJfLmhpZGVDb250cm9sKCkpCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuY2xlYXJIaWRlVGltZXJfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllciQkY2xlYXJIaWRlVGltZXJfJCgpIHsKICB0aGlzLmhpZGVUaW1lcklkXyAmJiAoZ29vZy5UaW1lci5jbGVhcih0aGlzLmhpZGVUaW1lcklkXyksIHRoaXMuaGlkZVRpbWVySWRfID0gbnVsbCkKfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5vbkNhbGxBY2NlcHRlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyJCRvbkNhbGxBY2NlcHRlZF8kKCkgewogIHRoaXMucGxheWVyT3B0aW9uc18uZ2V0SW5jbHVkZUZ1bGxzY3JlZW4oKSAmJiAodGhpcy5mdWxsc2NyZWVuSGFuZGxlcl8gPSBuZXcgdGFsay5tZWRpYS5jM2QuRnVsbHNjcmVlbkhhbmRsZXIodGhpcy5vM2RCdW5kbGVfLCB0aGlzLmltYWdlT3ZlcmxheV8sIHRoaXMucGxheWVyT3B0aW9uc18uZ2V0TG9jYWxlKCkpLCB0aGlzLmZ1bGxzY3JlZW5IYW5kbGVyXy5pbml0KCkpOwogIHRoaXMuaW5pdE11dGVIYW5kbGVyXygpOwogIHRoaXMuaW5pdE5vdGlmaWVyXygpOwogIHRoaXMuc2hvd0NvbnRyb2xzXygpCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuaGFuZGxlU2NlbmVTZWxlY3Rpb25DaGFuZ2VkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXIkJGhhbmRsZVNjZW5lU2VsZWN0aW9uQ2hhbmdlZF8kKGUpIHsKICB0aGlzLmNhbGxNYW5hZ2VyXy5kaXNwYXRjaFNjZW5lU2VsZWN0aW9uQ2hhbmdlRXZlbnQoZS5mZWVkLmdldEVuZHBvaW50KCkuZ2V0UGFydGljaXBhbnQoKS5nZXRKaWQoKSkKfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5oYW5kbGVBZGRQYXJ0aWNpcGFudF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyJCRoYW5kbGVBZGRQYXJ0aWNpcGFudF8kKGUpIHsKICB2YXIgcCA9IGUucGFydGljaXBhbnQ7CiAgcC5zZXRTZXNzaW9uSWQoZS5zZXNzaW9uSWQpOwogIHRoaXMubzNkQ29udGV4dF8uYWRkUGFydGljaXBhbnQocCkKfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5oYW5kbGVSZW1vdmVQYXJ0aWNpcGFudF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyJCRoYW5kbGVSZW1vdmVQYXJ0aWNpcGFudF8kKGUpIHsKICB2YXIgcCA9IGUucGFydGljaXBhbnQ7CiAgcC5zZXRTZXNzaW9uSWQoZS5zZXNzaW9uSWQpOwogIHRoaXMubzNkQ29udGV4dF8ucmVtb3ZlUGFydGljaXBhbnQocCwgZS5zc3JjKQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLnNldENvbnRhaW5lciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXIkJHNldENvbnRhaW5lciQoY29udGFpbmVyKSB7CiAgdGhpcy5vM2RDb250ZXh0Xy5zZXRDb250YWluZXIoY29udGFpbmVyKQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLnNlbmRUb1BsYXllciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXIkJHNlbmRUb1BsYXllciQobXNnLCBhcmdzKSB7CiAgdGhpcy5vM2RDb250ZXh0Xy5zZW5kVG9QbGF5ZXIobXNnLCBhcmdzKQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXIucHJvdG90eXBlLnJlbGF5Q2FsbE1lc3NhZ2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyJCRyZWxheUNhbGxNZXNzYWdlJCh0eXBlLCBtZXNzYWdlKSB7CiAgdGhpcy5vM2RDb250ZXh0Xy5zZW5kVG9QbGF5ZXIodHlwZSwgbWVzc2FnZSkKfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyLnByb3RvdHlwZS5lbmRDYWxsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllciQkZW5kQ2FsbCQob3B0X2NhdXNlLCBvcHRfZGVidWdJbmZvKSB7CiAgdGhpcy5jYWxsTWFuYWdlcl8uZW5kQ2FsbChvcHRfY2F1c2UsIHRoaXMubzNkQ29udGV4dF8uZ2V0U2VuZGVySmlkKCksIHRoaXMubzNkQ29udGV4dF8uZ2V0U2Vzc2lvbklkKCksIG9wdF9kZWJ1Z0luZm8pOwogIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMubWVkaWFJbmZvSGFuZGxlcl8pICYmIHRoaXMubWVkaWFJbmZvSGFuZGxlcl8udW5tb25pdG9yRmx1dGVTdHJlYW1zKHRoaXMuc3RyZWFtc18pCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllciQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0aGlzLnJlbW92ZVBsYXllcigpOwogIGdvb2cuZGlzcG9zZSh0aGlzLm8zZENvbnRleHRfKTsKICB0aGlzLmNsZWFySGlkZVRpbWVyXygpOwogIHRoaXMubXV0ZUhhbmRsZXJfICYmIHRoaXMubXV0ZUhhbmRsZXJfLmRpc3Bvc2UoKTsKICBnb29nLmRpc3Bvc2UodGhpcy5ldmVudEhhbmRsZXJfKTsKICBnb29nLmRpc3Bvc2UodGhpcy5zY2VuZV8pOwogIGdvb2cuZGlzcG9zZSh0aGlzLnN0cmVhbXNfKTsKICBnb29nLmRpc3Bvc2UodGhpcy52aWV3UXVhbGl0eUNvbnRyb2xfKTsKICB0aGlzLnBhcnRpY2lwYW50c18gPSB0aGlzLmNhbGxNYW5hZ2VyXyA9IG51bGw7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllci5FdmVudHMuRElTUE9TRUQpOwogIHRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllcldyYXBwZXIkKGNhbGxNYW5hZ2VyLCBvcHRpb25zLCBvcHRfbXVsdGlWaWV3LCBvcHRfZmxhc2hWYXJzLCBvcHRfc3dmVXJsLCBvcHRfbXV0ZUhhbmRsZXIsIG9wdF9lbmFibGVOb3RpZmljYXRpb25zLCBvcHRfcmVuZGVyTW9kZSwgb3B0X21lZGlhSW5mb0hhbmRsZXIpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuY2FsbE1hbmFnZXJfID0gY2FsbE1hbmFnZXI7CiAgdGhpcy5mbGFzaFZhcnNfID0gb3B0X2ZsYXNoVmFyczsKICB0aGlzLnN3ZlVybF8gPSBvcHRfc3dmVXJsOwogIHRoaXMuY29tbXVuaWNhdGlvblBsYXllcl8gPSBuZXcgdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyKGNhbGxNYW5hZ2VyLCBvcHRpb25zLCBvcHRfbXVsdGlWaWV3LCBvcHRfbXV0ZUhhbmRsZXIsIG9wdF9lbmFibGVOb3RpZmljYXRpb25zLCBvcHRfcmVuZGVyTW9kZSwgb3B0X21lZGlhSW5mb0hhbmRsZXIpOwogIHRoaXMuY29tbXVuaWNhdGlvblBsYXllcl8uc2V0UGFyZW50RXZlbnRUYXJnZXQodGhpcyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuY29tbXVuaWNhdGlvblBsYXllcl8sIHRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5FdmVudHMuRkFUQUxfRVJST1IsIHRoaXMub25GYXRhbE8zZEVycm9yXykKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllcldyYXBwZXIucHJvdG90eXBlLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoInRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllcldyYXBwZXIiKTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyV3JhcHBlci5wcm90b3R5cGUub25GYXRhbE8zZEVycm9yXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyJCRvbkZhdGFsTzNkRXJyb3JfJCgpIHsKICB0cnkgewogICAgdGhpcy5ldmVudEhhbmRsZXJfLnVubGlzdGVuKHRoaXMuY29tbXVuaWNhdGlvblBsYXllcl8sIHRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllci5FdmVudHMuRkFUQUxfRVJST1IsIHRoaXMub25GYXRhbE8zZEVycm9yXyksIHRoaXMuY29tbXVuaWNhdGlvblBsYXllcl8uc2V0UGFyZW50RXZlbnRUYXJnZXQobnVsbCksIHRoaXMuY29tbXVuaWNhdGlvblBsYXllcl8uZGlzcG9zZSgpCiAgfWNhdGNoKGV4Y2VwdCkgewogICAgdGhpcy5sb2dnZXJfLndhcm5pbmcoIklnbm9yaW5nIGV4Y2VwdGlvbiBkdXJpbmcgTzNEIHBsYXllciBkaXNwb3NhbCIsIGV4Y2VwdCkKICB9CiAgdGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXyA9IG51bGw7CiAgaWYodGhpcy5jYWxsTWFuYWdlcl8uY2FuVXNlRmxhc2goKSkgewogICAgaWYodGhpcy5jYWxsTWFuYWdlcl8uYWRkVG9Mb2coIkZhdGFsIE8zRCBlcnJvcjsgZmFsbGluZyBiYWNrIHRvIEZsYXNoIiwgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5Mb2dDb21tZW50U2V2ZXJpdHkuRVJST1IpLCB0aGlzLmNvbW11bmljYXRpb25QbGF5ZXJfID0gbmV3IHRhbGsubWVkaWEuQ29tbXVuaWNhdGlvblBsYXllcih0aGlzLmNhbGxNYW5hZ2VyXywgdGhpcy5mbGFzaFZhcnNfLCB0aGlzLnN3ZlVybF8pLCB0aGlzLmNvbW11bmljYXRpb25QbGF5ZXJfLnNldENvbnRhaW5lcih0aGlzLmNvbnRhaW5lcl8pLCB0aGlzLmNvbW11bmljYXRpb25QbGF5ZXJfLnNldFBhcmVudEV2ZW50VGFyZ2V0KHRoaXMpLCB0aGlzLmNhbGxUeXBlXyAhPSB0YWxrLm1lZGlhLkNhbGxUeXBlLlRFU1QpIHsKICAgICAgdGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXy5kaXNwbGF5Q2FsbCh0aGlzLnNlbmRlckppZF8sIHRoaXMucGFydGljaXBhbnRzXywgdGhpcy5pc011bHRpVXNlcl8pCiAgICB9ZWxzZSB7CiAgICAgIHRoaXMuY29tbXVuaWNhdGlvblBsYXllcl8ub25OZXdDYWxsKHRoaXMuaXNPdXRnb2luZ18sIHRoaXMuc2Vzc2lvbklkXywgdGhpcy5zZW5kZXJKaWRfLCB0aGlzLnBhcnRpY2lwYW50c18sIHRoaXMuY2FsbFR5cGVfLCB0aGlzLmlzTXVsdGlVc2VyXykKICAgIH0KICB9ZWxzZSB7CiAgICB0aGlzLmNhbGxNYW5hZ2VyXy5hZGRUb0xvZygiRmF0YWwgTzNEIGVycm9yIGFuZCBGbGFzaCBub3QgYXZhaWxhYmxlLiBUZXJtaW5hdGluZyBjYWxsLiIsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuTG9nQ29tbWVudFNldmVyaXR5LkVSUk9SKSwgdGhpcy5jYWxsVHlwZV8gIT0gdGFsay5tZWRpYS5DYWxsVHlwZS5URVNUID8gdGhpcy5jYWxsTWFuYWdlcl8uZW5kQ2FsbCh0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkVuZENhdXNlLlBMQVlFUl9FUlJPUikgOiB0aGlzLmNhbGxNYW5hZ2VyXy5nZXRUYWxrUGx1Z2luKCkudGVybWluYXRlQ2FsbCh0aGlzLnNlbmRlckppZF8sIHRoaXMuc2Vzc2lvbklkXywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FbmRDYXVzZS5QTEFZRVJfRVJST1IsICExKQogIH0KfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyV3JhcHBlci5wcm90b3R5cGUuc2VuZFRvUGxheWVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllcldyYXBwZXIkJHNlbmRUb1BsYXllciQobXNnLCBhcmdzKSB7CiAgdGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXyAmJiB0aGlzLmNvbW11bmljYXRpb25QbGF5ZXJfLnNlbmRUb1BsYXllcihtc2csIGFyZ3MpCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllcldyYXBwZXIucHJvdG90eXBlLnJlbW92ZVBsYXllciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyJCRyZW1vdmVQbGF5ZXIkKCkgewogIHRoaXMuY29tbXVuaWNhdGlvblBsYXllcl8gJiYgdGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXy5yZW1vdmVQbGF5ZXIoKQp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyLnByb3RvdHlwZS5vbk5ld0NhbGwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyV3JhcHBlciQkb25OZXdDYWxsJChpc091dGdvaW5nLCBzZXNzaW9uSWQsIHNlbmRlckppZCwgcGFydGljaXBhbnRzLCBjYWxsVHlwZSwgaXNNdWx0aVVzZXIpIHsKICB0aGlzLmNvbW11bmljYXRpb25QbGF5ZXJfLm9uTmV3Q2FsbChpc091dGdvaW5nLCBzZXNzaW9uSWQsIHNlbmRlckppZCwgcGFydGljaXBhbnRzLCBjYWxsVHlwZSwgaXNNdWx0aVVzZXIpOwogIHRoaXMuaXNPdXRnb2luZ18gPSBpc091dGdvaW5nOwogIHRoaXMuc2Vzc2lvbklkXyA9IHNlc3Npb25JZDsKICB0aGlzLnNlbmRlckppZF8gPSBzZW5kZXJKaWQ7CiAgdGhpcy5wYXJ0aWNpcGFudHNfID0gcGFydGljaXBhbnRzOwogIHRoaXMuY2FsbFR5cGVfID0gY2FsbFR5cGU7CiAgdGhpcy5pc011bHRpVXNlcl8gPSBpc011bHRpVXNlcgp9Owp0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyLnByb3RvdHlwZS5kaXNwbGF5Q2FsbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyJCRkaXNwbGF5Q2FsbCQoamlkLCBwYXJ0aWNpcGFudHMsIGlzTXVsdGlVc2VyKSB7CiAgdmFyIGNhbGwgPSB0aGlzLmNhbGxNYW5hZ2VyXy5maW5kQ2FsbChqaWQpOwogIGNhbGwgPyAodGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXy5kaXNwbGF5Q2FsbChqaWQsIHBhcnRpY2lwYW50cywgaXNNdWx0aVVzZXIpLCB0aGlzLmlzT3V0Z29pbmdfID0gbnVsbCwgdGhpcy5zZXNzaW9uSWRfID0gY2FsbC5zZXNzaW9uSWQsIHRoaXMuc2VuZGVySmlkXyA9IGNhbGwucmVtb3RlSmlkc1swXSwgdGhpcy5wYXJ0aWNpcGFudHNfID0gcGFydGljaXBhbnRzLCB0aGlzLmNhbGxUeXBlXyA9IGNhbGwudHlwZSwgdGhpcy5pc011bHRpVXNlcl8gPSBpc011bHRpVXNlcikgOiB0aGlzLmxvZ2dlcl8ud2FybmluZygiZGlzcGxheUNhbGwgY2FsbGVkIHdpdGggaW52YWxpZCBjYWxsIGZvciBKSUQgIiArIGppZCkKfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyV3JhcHBlci5wcm90b3R5cGUucmVsYXlDYWxsTWVzc2FnZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyJCRyZWxheUNhbGxNZXNzYWdlJCh0eXBlLCBtZXNzYWdlKSB7CiAgdGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXyAmJiB0aGlzLmNvbW11bmljYXRpb25QbGF5ZXJfLnJlbGF5Q2FsbE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkKfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyV3JhcHBlci5wcm90b3R5cGUuaGFuZGxlTWljTXV0ZU5vdGlmaWNhdGlvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyJCRoYW5kbGVNaWNNdXRlTm90aWZpY2F0aW9uJChlKSB7CiAgdGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXyAmJiB0aGlzLmNvbW11bmljYXRpb25QbGF5ZXJfLmhhbmRsZU1pY011dGVOb3RpZmljYXRpb24gJiYgdGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXy5oYW5kbGVNaWNNdXRlTm90aWZpY2F0aW9uKGUpCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllcldyYXBwZXIucHJvdG90eXBlLnNldENvbnRhaW5lciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyJCRzZXRDb250YWluZXIkKGNvbnRhaW5lcikgewogIHRoaXMuY29udGFpbmVyXyA9IGNvbnRhaW5lcjsKICB0aGlzLmNvbW11bmljYXRpb25QbGF5ZXJfLnNldENvbnRhaW5lcihjb250YWluZXIpCn07CnRhbGsubWVkaWEuQzNkQ29tbXVuaWNhdGlvblBsYXllcldyYXBwZXIucHJvdG90eXBlLmVuZENhbGwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDM2RDb21tdW5pY2F0aW9uUGxheWVyV3JhcHBlciQkZW5kQ2FsbCQob3B0X2NhdXNlLCBvcHRfZGVidWdJbmZvKSB7CiAgdGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXy5lbmRDYWxsKG9wdF9jYXVzZSwgb3B0X2RlYnVnSW5mbykKfTsKdGFsay5tZWRpYS5DM2RDb21tdW5pY2F0aW9uUGxheWVyV3JhcHBlci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkQ29tbXVuaWNhdGlvblBsYXllcldyYXBwZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgZ29vZy5kaXNwb3NlKHRoaXMuZXZlbnRIYW5kbGVyXyk7CiAgZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXykgPyAodGhpcy5jb21tdW5pY2F0aW9uUGxheWVyXy5kaXNwb3NlKCksIHRoaXMuY29tbXVuaWNhdGlvblBsYXllcl8gPSBudWxsKSA6IHRoaXMuZGlzcGF0Y2hFdmVudCh0YWxrLm1lZGlhLkNvbW11bmljYXRpb25QbGF5ZXIuRXZlbnRzLkRJU1BPU0VEKTsKICB0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpCn07CnRhbGsubWVkaWEuQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyJCgpIHsKICB0YWxrLm1lZGlhLkMzZE11dGVIYW5kbGVyLmNhbGwodGhpcykKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkMzZEZ1bGxzY3JlZW5NdXRlSGFuZGxlciwgdGFsay5tZWRpYS5DM2RNdXRlSGFuZGxlcik7CnRhbGsubWVkaWEuQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyLkRFRkFVTFRfTVVURV9TSE9SVENVVF8gPSAzMjsKdGFsay5tZWRpYS5DM2RGdWxsc2NyZWVuTXV0ZUhhbmRsZXIucHJvdG90eXBlLmZzTG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5DM2RGdWxsc2NyZWVuTXV0ZUhhbmRsZXIiKTsKdGFsay5tZWRpYS5DM2RGdWxsc2NyZWVuTXV0ZUhhbmRsZXIucHJvdG90eXBlLnNldHVwTXV0ZVNob3J0Y3V0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyJCRzZXR1cE11dGVTaG9ydGN1dCQoc2hvcnRjdXRTb3VyY2UsIG9wdF9tdXRlQ2hhckNvZGUpIHsKICB0aGlzLm11dGVDaGFyQ29kZV8gPSBvcHRfbXV0ZUNoYXJDb2RlIHx8IHRhbGsubWVkaWEuQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyLkRFRkFVTFRfTVVURV9TSE9SVENVVF87CiAgdGhpcy5mc0xvZ2dlcl8uaW5mbygiU2V0dXAgbXV0ZSBzaG9ydGN1dCBpbiBmdWxsc2NyZWVuIG1vZGUgZm9yIGNoYXJDb2RlOiAiICsgdGhpcy5tdXRlQ2hhckNvZGVfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oc2hvcnRjdXRTb3VyY2UsIGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5LRVlQUkVTUywgdGhpcy5vbktleVByZXNzXykKfTsKdGFsay5tZWRpYS5DM2RGdWxsc2NyZWVuTXV0ZUhhbmRsZXIucHJvdG90eXBlLmluaXRJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZEZ1bGxzY3JlZW5NdXRlSGFuZGxlciQkaW5pdEludGVybmFsJCgpIHsKICB0YWxrLm1lZGlhLkMzZEZ1bGxzY3JlZW5NdXRlSGFuZGxlci5zdXBlckNsYXNzXy5pbml0SW50ZXJuYWwuY2FsbCh0aGlzLCAhMSkKfTsKdGFsay5tZWRpYS5DM2RGdWxsc2NyZWVuTXV0ZUhhbmRsZXIucHJvdG90eXBlLm9uUmVzaXplID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyJCRvblJlc2l6ZSQoZSkgewogIHRhbGsubWVkaWEuQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyLnN1cGVyQ2xhc3NfLm9uUmVzaXplLmNhbGwodGhpcywgZSk7CiAgdGhpcy5zZXRFbmFibGVkKCEhZS5mdWxsc2NyZWVuKQp9Owp0YWxrLm1lZGlhLkMzZEZ1bGxzY3JlZW5NdXRlSGFuZGxlci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIHRhbGsubWVkaWEuQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpOwogIHRoaXMuZXZlbnRIYW5kbGVyXyAmJiB0aGlzLmV2ZW50SGFuZGxlcl8uZGlzcG9zZSgpCn07CnRhbGsubWVkaWEuQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyLnByb3RvdHlwZS5vbktleVByZXNzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEMzZEZ1bGxzY3JlZW5NdXRlSGFuZGxlciQkb25LZXlQcmVzc18kKGUpIHsKICBpZihlLmNoYXJDb2RlID09IHRoaXMubXV0ZUNoYXJDb2RlXyAmJiB0aGlzLmlzRW5hYmxlZCgpKSB7CiAgICB2YXIgY2FsbE1hbmFnZXIgPSB0aGlzLmdldENhbGxNYW5hZ2VyKCk7CiAgICBpZihjYWxsTWFuYWdlcikgewogICAgICB2YXIgd2FzTXV0ZWQgPSBjYWxsTWFuYWdlci5nZXRNaWNyb3Bob25lTXV0ZSgpOwogICAgICBjYWxsTWFuYWdlci5zZXRNaWNyb3Bob25lTXV0ZSghd2FzTXV0ZWQpCiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLkNhbGxpbmdSZXF1aXJlbWVudHMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsaW5nUmVxdWlyZW1lbnRzJChlbmFibGVPM2QpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKTsKICB0aGlzLnJlbmRlcmVyRGV0ZWN0b3JfID0gbmV3IHRhbGsubWVkaWEuUmVuZGVyZXJEZXRlY3RvcihlbmFibGVPM2QpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5DYWxsaW5nUmVxdWlyZW1lbnRzLCBnb29nLkRpc3Bvc2FibGUpOwp0YWxrLm1lZGlhLkNhbGxpbmdSZXF1aXJlbWVudHMucHJvdG90eXBlLmdldFJlbmRlcmVyRGV0ZWN0b3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsaW5nUmVxdWlyZW1lbnRzJCRnZXRSZW5kZXJlckRldGVjdG9yJCgpIHsKICByZXR1cm4gdGhpcy5yZW5kZXJlckRldGVjdG9yXwp9Owp0YWxrLm1lZGlhLkNhbGxpbmdSZXF1aXJlbWVudHMucHJvdG90eXBlLmdldEZsYXNoRGV0ZWN0b3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsaW5nUmVxdWlyZW1lbnRzJCRnZXRGbGFzaERldGVjdG9yJCgpIHsKICByZXR1cm4gdGhpcy5nZXRSZW5kZXJlckRldGVjdG9yKCkuZ2V0Rmxhc2hEZXRlY3RvcigpCn07CnRhbGsubWVkaWEuQ2FsbGluZ1JlcXVpcmVtZW50cy5wcm90b3R5cGUuaXNBdmFpbGFibGVGb3JPcyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxpbmdSZXF1aXJlbWVudHMkJGlzQXZhaWxhYmxlRm9yT3MkKCkgewogIHZhciBpbnRlbCA9IC0xICE9IGdvb2cudXNlckFnZW50LlBMQVRGT1JNLmluZGV4T2YoIkludGVsIik7CiAgcmV0dXJuIGdvb2cudXNlckFnZW50LldJTkRPV1MgfHwgZ29vZy51c2VyQWdlbnQuTUFDICYmIGludGVsIHx8IGdvb2cudXNlckFnZW50LkxJTlVYICYmIHRoaXMuZ2V0UmVuZGVyZXJEZXRlY3RvcigpLmlzTzNkU3VwcG9ydGVkKCkKfTsKdGFsay5tZWRpYS5DYWxsaW5nUmVxdWlyZW1lbnRzLnByb3RvdHlwZS5jYW5Vc2VDbGllbnQzRCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxpbmdSZXF1aXJlbWVudHMkJGNhblVzZUNsaWVudDNEJCgpIHsKICByZXR1cm4hISh0aGlzLmdldFJlbmRlcmVyRGV0ZWN0b3IoKS5nZXRDYXBhYmlsaXRpZXMoKSAmIHRhbGsubWVkaWEuUmVuZGVyZXJEZXRlY3Rvci5SRU5ERVJfQ0xJRU5UM0RfQ0FQQUJJTElUWSkKfTsKdGFsay5tZWRpYS5DYWxsaW5nUmVxdWlyZW1lbnRzLnByb3RvdHlwZS5jYW5Vc2VGbGFzaCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxpbmdSZXF1aXJlbWVudHMkJGNhblVzZUZsYXNoJCgpIHsKICByZXR1cm4hISh0aGlzLmdldFJlbmRlcmVyRGV0ZWN0b3IoKS5nZXRDYXBhYmlsaXRpZXMoKSAmIHRhbGsubWVkaWEuUmVuZGVyZXJEZXRlY3Rvci5SRU5ERVJfTUFHSUNDQU1fQ0FQQUJJTElUWSkKfTsKdGFsay5tZWRpYS5DYWxsaW5nUmVxdWlyZW1lbnRzLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsaW5nUmVxdWlyZW1lbnRzJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuZGlzcG9zZSh0aGlzLnJlbmRlcmVyRGV0ZWN0b3JfKTsKICB0YWxrLm1lZGlhLkNhbGxpbmdSZXF1aXJlbWVudHMuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKdGFsay5tZWRpYS5QYXJ0aWNpcGFudHMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudHMkKCkgewogIHRoaXMubWFwXyA9IG5ldyBnb29nLnN0cnVjdHMuTWFwCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnRzLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLlBhcnRpY2lwYW50cyIpOwp0YWxrLm1lZGlhLlBhcnRpY2lwYW50cy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGFydGljaXBhbnRzJCRnZXQkKGlkKSB7CiAgcmV0dXJuIXRoaXMubWFwXy5jb250YWluc0tleShpZCkgPyBudWxsIDogdGhpcy5tYXBfLmdldChpZCkKfTsKdGFsay5tZWRpYS5QYXJ0aWNpcGFudHMucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkUGFydGljaXBhbnRzJCRjb250YWlucyQocGFydGljaXBhbnQpIHsKICByZXR1cm4gdGhpcy5tYXBfLmNvbnRhaW5zS2V5KGdvb2cuaXNTdHJpbmcocGFydGljaXBhbnQpID8gcGFydGljaXBhbnQgOiBwYXJ0aWNpcGFudC5nZXRSZXNvdXJjZUlkKCkpCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnRzLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudHMkJGFkZCQocGFydGljaXBhbnQsIG9wdF9sb2NhbCwgb3B0X3Jlc291cmNlSWQpIHsKICBpZihnb29nLmlzU3RyaW5nKHBhcnRpY2lwYW50KSkgewogICAgcmV0dXJuIHRoaXMuYWRkKG5ldyB0YWxrLm1lZGlhLlBhcnRpY2lwYW50KHBhcnRpY2lwYW50LCBvcHRfbG9jYWwsIG9wdF9yZXNvdXJjZUlkKSkKICB9CiAgdGhpcy5jb250YWlucyhwYXJ0aWNpcGFudCkgPyAodGhpcy5sb2dnZXJfLndhcm5pbmcoIlVuZXhwZWN0ZWQ6IE1lcmdpbmcgcGFydGljaXBhbnRzIHNpbmNlICIgKyBwYXJ0aWNpcGFudC5nZXRSZXNvdXJjZUlkKCkgKyAiIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGNvbGxlY3Rpb24iKSwgcGFydGljaXBhbnQgPSB0aGlzLmdldChwYXJ0aWNpcGFudC5nZXRSZXNvdXJjZUlkKCkpLm1lcmdlKHBhcnRpY2lwYW50KSkgOiB0aGlzLm1hcF8uc2V0KHBhcnRpY2lwYW50LmdldFJlc291cmNlSWQoKSwgcGFydGljaXBhbnQpOwogIHRoaXMubG9nZ2VyXy5pbmZvKCJBZGRlZCBwYXJ0aWNpcGFudDogIiArIHBhcnRpY2lwYW50LmdldFJlc291cmNlSWQoKSArICIsIGN1cnJlbnQgY291bnQ6ICIgKyB0aGlzLm1hcF8uZ2V0Q291bnQoKSk7CiAgcmV0dXJuIHBhcnRpY2lwYW50Cn07CnRhbGsubWVkaWEuUGFydGljaXBhbnRzLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudHMkJHJlbW92ZSQoaWQpIHsKICB0aGlzLm1hcF8ucmVtb3ZlKGlkKTsKICB0aGlzLmxvZ2dlcl8uaW5mbygiUmVtb3ZlZCBwYXJ0aWNpcGFudDogIiArIGlkICsgIiwgcmVtYWluaW5nIGNvdW50OiAiICsgdGhpcy5tYXBfLmdldENvdW50KCkpCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnRzLnByb3RvdHlwZS5yZW1vdmVBbGwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRQYXJ0aWNpcGFudHMkJHJlbW92ZUFsbCQoKSB7CiAgdmFyIGNvdW50ID0gdGhpcy5tYXBfLmdldENvdW50KCk7CiAgdGhpcy5tYXBfLmNsZWFyKCk7CiAgdGhpcy5sb2dnZXJfLmluZm8oIlJlbW92ZWQgYWxsICIgKyBjb3VudCArICIgcGFydGljaXBhbnRzLiIpCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnRzLnByb3RvdHlwZS5nZXRDb3VudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBhcnRpY2lwYW50cyQkZ2V0Q291bnQkKCkgewogIHJldHVybiB0aGlzLm1hcF8uZ2V0Q291bnQoKQp9Owp0YWxrLm1lZGlhLlBhcnRpY2lwYW50cy5wcm90b3R5cGUuZ2V0S2V5cyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBhcnRpY2lwYW50cyQkZ2V0S2V5cyQoKSB7CiAgcmV0dXJuIHRoaXMubWFwXy5nZXRLZXlzKCkKfTsKdGFsay5tZWRpYS5QYXJ0aWNpcGFudHMucHJvdG90eXBlLmZpbmRMb2NhbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBhcnRpY2lwYW50cyQkZmluZExvY2FsJCgpIHsKICBmb3IodmFyIGlkcyA9IHRoaXMuZ2V0S2V5cygpLCBpID0gMDtpIDwgaWRzLmxlbmd0aDsrK2kpIHsKICAgIHZhciBwYXJ0aWNpcGFudCA9IHRoaXMuZ2V0KGlkc1tpXSk7CiAgICBpZihwYXJ0aWNpcGFudC5pc0xvY2FsKCkpIHsKICAgICAgcmV0dXJuIHBhcnRpY2lwYW50CiAgICB9CiAgfQogIHJldHVybiBudWxsCn07CnRhbGsubWVkaWEuUGFydGljaXBhbnRzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFBhcnRpY2lwYW50cyQkdG9TdHJpbmckKCkgewogIGZvcih2YXIgcCA9IFtdLCBpZHMgPSB0aGlzLmdldEtleXMoKSwgaSA9IDA7aSA8IGlkcy5sZW5ndGg7aSsrKSB7CiAgICBwLnB1c2godGhpcy5nZXQoaWRzW2ldKS50b1N0cmluZygpKQogIH0KICByZXR1cm4iPCIgKyB0aGlzLm1hcF8uZ2V0Q291bnQoKSArICIgcGFydGljaXBhbnRzOiAiICsgcC5qb2luKCIsICIpICsgIj4iCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUNvbGxlY3RvciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWVDb2xsZWN0b3IkKHNlc3Npb25JZCwgbG9jYWxOaWNrKSB7CiAgZ29vZy5EaXNwb3NhYmxlLmNhbGwodGhpcyk7CiAgdGhpcy5zZXNzaW9uSWRfID0gc2Vzc2lvbklkOwogIHRoaXMubG9jYWxOaWNrXyA9IGxvY2FsTmljazsKICB0aGlzLmFjdGl2ZUlzc3Vlc18gPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcDsKICB0aGlzLmlzc3VlSGlzdG9yeV8gPSBbXQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUNvbGxlY3RvciwgZ29vZy5EaXNwb3NhYmxlKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlQ29sbGVjdG9yLlRSQU5TSUVOVF9JU1NVRV9FWFBJUllfU0VDU18gPSAyODsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlQ29sbGVjdG9yLnByb3RvdHlwZS51cGRhdGVBY3RpdmVJc3N1ZXMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlQ29sbGVjdG9yJCR1cGRhdGVBY3RpdmVJc3N1ZXMkKG5ld0FjdGl2ZUlzc3VlcykgewogIGZvcih2YXIgaSA9IDA7aSA8IG5ld0FjdGl2ZUlzc3Vlcy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgbmV3QWN0aXZlSXNzdWUgPSBuZXdBY3RpdmVJc3N1ZXNbaV0sIGV4aXN0aW5nSXNzdWUgPSB0aGlzLmFjdGl2ZUlzc3Vlc18uZ2V0KG5ld0FjdGl2ZUlzc3VlLmdldElkKCkpOwogICAgZ29vZy5pc0RlZkFuZE5vdE51bGwoZXhpc3RpbmdJc3N1ZSkgPyBleGlzdGluZ0lzc3VlLnVwZGF0ZUZyb20obmV3QWN0aXZlSXNzdWUpIDogKHRoaXMuYWN0aXZlSXNzdWVzXy5zZXQobmV3QWN0aXZlSXNzdWUuZ2V0SWQoKSwgbmV3QWN0aXZlSXNzdWUpLCB0aGlzLmlzc3VlSGlzdG9yeV8ucHVzaChuZXdBY3RpdmVJc3N1ZSkpCiAgfQogIHRoaXMucHJ1bmVFeHBpcmVkSXNzdWVzXygpCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUNvbGxlY3Rvci5wcm90b3R5cGUucHJ1bmVFeHBpcmVkSXNzdWVzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWVDb2xsZWN0b3IkJHBydW5lRXhwaXJlZElzc3Vlc18kKCkgewogIGZvcih2YXIgbWluaW11bUFjdGl2ZVRpbWVNaWxsaXMgPSBnb29nLm5vdygpIC0gMUU2ICogdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlQ29sbGVjdG9yLlRSQU5TSUVOVF9JU1NVRV9FWFBJUllfU0VDU18sIGN1cnJlbnRBY3RpdmVJc3N1ZXMgPSB0aGlzLmFjdGl2ZUlzc3Vlc18uZ2V0VmFsdWVzKCksIGkgPSAwO2kgPCBjdXJyZW50QWN0aXZlSXNzdWVzLmxlbmd0aDtpKyspIHsKICAgIHZhciBjdXJyZW50QWN0aXZlSXNzdWUgPSBjdXJyZW50QWN0aXZlSXNzdWVzW2ldOwogICAgY3VycmVudEFjdGl2ZUlzc3VlLmdldFVwZGF0ZVRpbWVzdGFtcCgpIDwgbWluaW11bUFjdGl2ZVRpbWVNaWxsaXMgJiYgY3VycmVudEFjdGl2ZUlzc3VlLmdldER1cmF0aW9uKCkgPT0gdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uLlRSQU5TSUVOVCAmJiAoY3VycmVudEFjdGl2ZUlzc3VlLnVwZGF0ZVN0YXR1cyh0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuU3RhdHVzLkVYUElSRUQpLCB0aGlzLmFjdGl2ZUlzc3Vlc18ucmVtb3ZlKGN1cnJlbnRBY3RpdmVJc3N1ZS5nZXRJZCgpKSkKICB9Cn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUNvbGxlY3Rvci5wcm90b3R5cGUubWFya0lzc3VlUmVzb2x2ZWRCeVN5c3RlbSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWVDb2xsZWN0b3IkJG1hcmtJc3N1ZVJlc29sdmVkQnlTeXN0ZW0kKGlzc3VlKSB7CiAgdmFyIGFjdGl2ZUlzc3VlID0gdGhpcy5hY3RpdmVJc3N1ZXNfLmdldChpc3N1ZS5nZXRJZCgpKTsKICBnb29nLmlzRGVmQW5kTm90TnVsbChhY3RpdmVJc3N1ZSkgJiYgKGFjdGl2ZUlzc3VlLnVwZGF0ZVN0YXR1cyh0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuU3RhdHVzLlNZU1RFTV9SRVNPTFZFRCksIHRoaXMuYWN0aXZlSXNzdWVzXy5yZW1vdmUoaXNzdWUuZ2V0SWQoKSkpCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUNvbGxlY3Rvci5wcm90b3R5cGUuZ2V0U2Vzc2lvbklkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZUNvbGxlY3RvciQkZ2V0U2Vzc2lvbklkJCgpIHsKICByZXR1cm4gdGhpcy5zZXNzaW9uSWRfCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUNvbGxlY3Rvci5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlQ29sbGVjdG9yJCRpc0FjdGl2ZSQoaXNzdWUpIHsKICByZXR1cm4gdGhpcy5hY3RpdmVJc3N1ZXNfLmNvbnRhaW5zS2V5KGlzc3VlLmdldElkKCkpCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUNvbGxlY3Rvci5wcm90b3R5cGUuZ2V0SXNzdWVIaXN0b3J5ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZUNvbGxlY3RvciQkZ2V0SXNzdWVIaXN0b3J5JCgpIHsKICByZXR1cm4gdGhpcy5pc3N1ZUhpc3RvcnlfCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUNvbGxlY3Rvci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZUNvbGxlY3RvciQkZGlzcG9zZUludGVybmFsJCgpIHsKICB0aGlzLmFjdGl2ZUlzc3Vlc18uY2xlYXIoKTsKICBkZWxldGUgdGhpcy5pc3N1ZUhpc3RvcnlfOwogIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUNvbGxlY3Rvci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkV2FybmluZyQodHlwZSwgY29kZSwgamlkLCBzZXNzaW9uSWQsIHdhcm5pbmdNc2csIGxldmVsLCBpbXByZXNzaW9uKSB7CiAgdGhpcy50eXBlXyA9IHR5cGU7CiAgdGhpcy53YXJuaW5nQ29kZV8gPSBjb2RlOwogIHRoaXMuamlkXyA9IGppZDsKICB0aGlzLnNlc3Npb25JZF8gPSBzZXNzaW9uSWQ7CiAgdGhpcy5tZXNzYWdlXyA9IHdhcm5pbmdNc2cgPyB3YXJuaW5nTXNnIDogIiI7CiAgdGhpcy5zdGFydEltcHJlc3Npb25fID0gaW1wcmVzc2lvbgp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5UeXBlID0ge0FVRElPOiJhIiwgVklERU86InYiLCBKTUlEQVRBOiJqbWlkYXRhIiwgQ09OTkVDVElWSVRZOiJ0cnN0YXRlIn07CnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkxldmVsID0ge0xPVzoxLCBNRURJVU1MT1c6MiwgTUVESVVNSElHSDozLCBISUdIOjR9Owp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5wcm90b3R5cGUuZ2V0VHlwZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkV2FybmluZyQkZ2V0VHlwZSQoKSB7CiAgcmV0dXJuIHRoaXMudHlwZV8KfTsKdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcucHJvdG90eXBlLmdldENvZGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFdhcm5pbmckJGdldENvZGUkKCkgewogIHJldHVybiB0aGlzLndhcm5pbmdDb2RlXwp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5wcm90b3R5cGUuZ2V0SmlkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRXYXJuaW5nJCRnZXRKaWQkKCkgewogIHJldHVybiB0aGlzLmppZF8KfTsKdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcucHJvdG90eXBlLmdldFNlc3Npb25JZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkV2FybmluZyQkZ2V0U2Vzc2lvbklkJCgpIHsKICByZXR1cm4gdGhpcy5zZXNzaW9uSWRfCn07CnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLnByb3RvdHlwZS5nZXRNZXNzYWdlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRXYXJuaW5nJCRnZXRNZXNzYWdlJCgpIHsKICByZXR1cm4gdGhpcy5tZXNzYWdlXwp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5wcm90b3R5cGUuZ2V0RHVyYXRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFdhcm5pbmckJGdldER1cmF0aW9uJCgpIHsKICByZXR1cm4gdGhpcy5kdXJhdGlvbl8KfTsKdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcucHJvdG90eXBlLmdldFN0YXJ0SW1wcmVzc2lvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkV2FybmluZyQkZ2V0U3RhcnRJbXByZXNzaW9uJCgpIHsKICByZXR1cm4gdGhpcy5zdGFydEltcHJlc3Npb25fCn07CnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLnByb3RvdHlwZS5nZXRFbmRJbXByZXNzaW9uID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRXYXJuaW5nJCRnZXRFbmRJbXByZXNzaW9uJCgpIHsKICByZXR1cm4gdGhpcy5lbmRJbXByZXNzaW9uXyB8fCBudWxsCn07CnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLnByb3RvdHlwZS5zZXRUeXBlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRXYXJuaW5nJCRzZXRUeXBlJCh0eXBlKSB7CiAgdGhpcy50eXBlXyA9IHR5cGU7CiAgcmV0dXJuIHRoaXMKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcucHJvdG90eXBlLnNldEppZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkV2FybmluZyQkc2V0SmlkJChqaWQpIHsKICB0aGlzLmppZF8gPSBqaWQ7CiAgcmV0dXJuIHRoaXMKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcucHJvdG90eXBlLnNldFNlc3Npb25JZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkV2FybmluZyQkc2V0U2Vzc2lvbklkJChzZXNzaW9uSWQpIHsKICB0aGlzLnNlc3Npb25JZF8gPSBzZXNzaW9uSWQ7CiAgcmV0dXJuIHRoaXMKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcucHJvdG90eXBlLnNldFNzcmMgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFdhcm5pbmckJHNldFNzcmMkKHNzcmMpIHsKICB0aGlzLnNzcmNfID0gc3NyYzsKICByZXR1cm4gdGhpcwp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5wcm90b3R5cGUuc2V0RHVyYXRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFdhcm5pbmckJHNldER1cmF0aW9uJChkdXJhdGlvbikgewogIHRoaXMuZHVyYXRpb25fID0gZHVyYXRpb247CiAgcmV0dXJuIHRoaXMKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcucHJvdG90eXBlLnNldFNob3dPbmNlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRXYXJuaW5nJCRzZXRTaG93T25jZSQoKSB7CiAgcmV0dXJuIHRoaXMKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcucHJvdG90eXBlLnNldEVuZEltcHJlc3Npb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFdhcm5pbmckJHNldEVuZEltcHJlc3Npb24kKGltcHJlc3Npb24pIHsKICB0aGlzLmVuZEltcHJlc3Npb25fID0gaW1wcmVzc2lvbjsKICByZXR1cm4gdGhpcwp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5wcm90b3R5cGUuZ2V0SnNvbk1lc3NhZ2UgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFdhcm5pbmckJGdldEpzb25NZXNzYWdlJChvcHRfaXNFbmRlZCkgewogIHJldHVyblsianciLCB0aGlzLnNlc3Npb25JZF8sIHRoaXMuamlkXywge3Q6dGhpcy50eXBlXywgYzp0aGlzLndhcm5pbmdDb2RlXywgczpnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLnNzcmNfKSA/IHRoaXMuc3NyY18gOiB2b2lkIDAsIGU6b3B0X2lzRW5kZWR9XQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFdhcm5pbmckJHRvU3RyaW5nJChvcHRfaXNFbmRlZCkgewogIHJldHVybiBnb29nLmpzb24uc2VyaWFsaXplKHRoaXMuZ2V0SnNvbk1lc3NhZ2Uob3B0X2lzRW5kZWQpKQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5FdmVudFR5cGUgPSB7V0FSTklOR19TVEFSVEVEOiJ3cyIsIFdBUk5JTkdfRU5ERUQ6IndlIn07CnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLldhcm5pbmdTdGFydGVkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFdhcm5pbmckV2FybmluZ1N0YXJ0ZWRFdmVudCQod2FybmluZykgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuRXZlbnRUeXBlLldBUk5JTkdfU1RBUlRFRCk7CiAgdGhpcy53YXJuaW5nID0gd2FybmluZwp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLldhcm5pbmdTdGFydGVkRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuV2FybmluZ0VuZGVkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFdhcm5pbmckV2FybmluZ0VuZGVkRXZlbnQkKHdhcm5pbmcpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkV2ZW50VHlwZS5XQVJOSU5HX0VOREVEKTsKICB0aGlzLndhcm5pbmcgPSB3YXJuaW5nCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuV2FybmluZ0VuZGVkRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JENvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IkKGFwcENvbnRleHQsIGNhbGxNYW5hZ2VyKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLmFwcENvbnRleHRfID0gYXBwQ29udGV4dDsKICB0aGlzLmNhbGxNYW5hZ2VyXyA9IGNhbGxNYW5hZ2VyOwogIHRoaXMuaGFzQ29ubmVjdGVkXyA9IHRoaXMudXNpbmdUY3BfID0gITE7CiAgdGhpcy5pc0FsbFdyaXRhYmxlXyA9IHRoaXMuaXNBbnlXcml0YWJsZV8gPSAhMDsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5jYWxsTWFuYWdlcl8sIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuVFJTVEFURSwgdGhpcy5oYW5kbGVUclN0YXRlTXNnXykKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvciwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwp0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvci5wcm90b3R5cGUubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IiKTsKdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IuTVNHX1VTRV9UQ1AgPSAiVENQIGlzIHVzZWQgZm9yIHRyYW5zcG9ydCI7CnRhbGsubWVkaWEucXVhbGl0eS5Db25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yLk1TR19MT1NFX0FMTF9XUklUQUJJTElUWSA9ICJXZSBoYXZlIGxvc3QgdGhlIG1lZGlhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciI7CnRhbGsubWVkaWEucXVhbGl0eS5Db25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yLk1TR19MT1NFX1BBUlRJQUxfV1JJVEFCSUxJVFkgPSAiV2UgaGF2ZSBwYXJ0aWFsbHkgbG9zdCB0aGUgbWVkaWEgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIjsKdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IuTVNHX0RJU0FCTEVfRklMTVNUUklQID0gIllvdXIgYmFuZHdpZHRoIGlzIGxvdy4iOwp0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvci5XYXJuaW5ncyA9IHsxOntNc2c6dGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IuTVNHX1VTRV9UQ1AsIExldmVsOnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkxldmVsLkxPVywgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XQ19VU0VfVENQfSwgMjp7TXNnOnRhbGsubWVkaWEucXVhbGl0eS5Db25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yLk1TR19MT1NFX0FMTF9XUklUQUJJTElUWSwgTGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuSElHSCwgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XQ19MT1NFX0FMTF9XUklUQUJJTElUWX0sIDM6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvci5NU0dfTE9TRV9QQVJUSUFMX1dSSVRBQklMSVRZLCAKTGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuTUVESVVNSElHSCwgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XQ19MT1NFX1BBUlRJQUxfV1JJVEFCSUxJVFl9LCA0OntNc2c6dGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IuTVNHX0RJU0FCTEVfRklMTVNUUklQLCBMZXZlbDp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5MZXZlbC5NRURJVU1ISUdILCBTaG93T25jZTohMCwgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XQ19ESVNBQkxFX0ZJTE1TVFJJUH19Owp0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvci5wcm90b3R5cGUuZ2V0V2FybmluZyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvciQkZ2V0V2FybmluZyQobXNnLCB3YXJuaW5nQ29kZSkgewogIHZhciBpbmZvID0gdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IuV2FybmluZ3Nbd2FybmluZ0NvZGVdOwogIHJldHVybihuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcodGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuVHlwZS5DT05ORUNUSVZJVFksIHdhcm5pbmdDb2RlLCBtc2dbMV0sIG1zZ1syXSwgaW5mby5Nc2csIGluZm8uTGV2ZWwsIGluZm8uU3RhcnRJbXByZXNzaW9uKSkuc2V0U2hvd09uY2UoaW5mby5TaG93T25jZSkKfTsKdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IuTUFJTlNQRUFLRVJfVklFV19SRVFVSVJFRF9CSVRTXyA9IDIwNDgwMDsKdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IuVEhVTUJOQUlMX1ZJRVdfUkVRVUlSRURfQklUU18gPSA1MTIwMDsKdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IuR1JBQ0VGVUxfREVHUkFEQVRJT05fVElNRU9VVF9NU18gPSAxRTQ7CnRhbGsubWVkaWEucXVhbGl0eS5Db25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yLk5hbWUgPSB7QU5ZX1dSSVRBQkxFOiJhbnlXcml0YWJsZSIsIEFMTF9XUklUQUJMRToiYWxsV3JpdGFibGUiLCBBTllfVENQOiJhbnlUY3AiLCBBTllfUkVMQVk6ImFueVJlbGF5IiwgU01PT1RIRURfQldfUkVDVjoic21vb3RoZWRCV1JlY3YiLCBTTU9PVEhFRF9CV19TRU5EOiJzbW9vdGhlZEJXU2VuZCJ9Owp0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvci5wcm90b3R5cGUuc2hvdWxkRGlzYWJsZUZpbG1TdHJpcFZpZXdfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRDb25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yJCRzaG91bGREaXNhYmxlRmlsbVN0cmlwVmlld18kKGJ3KSB7CiAgaWYoIWJ3KSB7CiAgICByZXR1cm4hMQogIH0KICB2YXIgcGFydGljaXBhbnRzID0gdGhpcy5jYWxsTWFuYWdlcl8uZ2V0QWN0aXZlQ2FsbCgpLmdldE51bWJlck9mVmlkZW9TZW5kZXJzKCksIHJlcXVpcmVkQml0cmF0ZSA9IDEgPCBwYXJ0aWNpcGFudHMgPyAocGFydGljaXBhbnRzIC0gMSkgKiB0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvci5USFVNQk5BSUxfVklFV19SRVFVSVJFRF9CSVRTXyArIHRhbGsubWVkaWEucXVhbGl0eS5Db25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yLk1BSU5TUEVBS0VSX1ZJRVdfUkVRVUlSRURfQklUU18gOiAwOwogIHJldHVybiAxIDwgcGFydGljaXBhbnRzICYmIGJ3IDwgcmVxdWlyZWRCaXRyYXRlCn07CnRhbGsubWVkaWEucXVhbGl0eS5Db25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yLnByb3RvdHlwZS5oYW5kbGVUclN0YXRlTXNnXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvciQkaGFuZGxlVHJTdGF0ZU1zZ18kKGUpIHsKICB2YXIgdHJTdGF0ZU1zZyA9IGUubXNnWzNdLCB3YXJuaW5nLCBuYW1lOwogIGZvcihuYW1lIGluIHRyU3RhdGVNc2cpIHsKICAgIHRoaXMubG9nZ2VyXy5pbmZvKG5hbWUgKyAiOiIgKyB0clN0YXRlTXNnW25hbWVdKQogIH0KICB2YXIgaXNBbGxXcml0YWJsZSA9IHRyU3RhdGVNc2dbdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IuTmFtZS5BTExfV1JJVEFCTEVdLCBpc0FueVdyaXRhYmxlID0gdHJTdGF0ZU1zZ1t0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvci5OYW1lLkFOWV9XUklUQUJMRV0sIHVzaW5nVGNwID0gdHJTdGF0ZU1zZ1t0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvci5OYW1lLkFOWV9UQ1BdOwogIGlmKHRoaXMuaGFzQ29ubmVjdGVkXyB8fCBpc0FueVdyaXRhYmxlKSB7CiAgICBpc0FueVdyaXRhYmxlICYmICF0aGlzLmhhc0Nvbm5lY3RlZF8gJiYgKHRoaXMuaGFzQ29ubmVjdGVkXyA9ICEwKSwgdXNpbmdUY3AgIT0gdGhpcy51c2luZ1RjcF8gJiYgKHdhcm5pbmcgPSB0aGlzLmdldFdhcm5pbmcoZS5tc2csIDEpLCB1c2luZ1RjcCA/IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuV2FybmluZ1N0YXJ0ZWRFdmVudCh3YXJuaW5nKSkgOiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLldhcm5pbmdFbmRlZEV2ZW50KHdhcm5pbmcpKSwgdGhpcy51c2luZ1RjcF8gPSB1c2luZ1RjcCksIGlzQW55V3JpdGFibGUgIT0gdGhpcy5pc0FueVdyaXRhYmxlXyA/ICh3YXJuaW5nID0gdGhpcy5nZXRXYXJuaW5nKGUubXNnLCAyKSwgaXNBbnlXcml0YWJsZSA/IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuV2FybmluZ0VuZGVkRXZlbnQod2FybmluZykpIDogCiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLldhcm5pbmdTdGFydGVkRXZlbnQod2FybmluZykpKSA6IGlzQWxsV3JpdGFibGUgIT0gdGhpcy5pc0FsbFdyaXRhYmxlXyAmJiAod2FybmluZyA9IHRoaXMuZ2V0V2FybmluZyhlLm1zZywgMyksIGlzQWxsV3JpdGFibGUgPyB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLldhcm5pbmdFbmRlZEV2ZW50KHdhcm5pbmcpKSA6IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuV2FybmluZ1N0YXJ0ZWRFdmVudCh3YXJuaW5nKSkpLCB0aGlzLmlzQW55V3JpdGFibGVfID0gaXNBbnlXcml0YWJsZSwgdGhpcy5pc0FsbFdyaXRhYmxlXyA9IGlzQWxsV3JpdGFibGUsIHRoaXMuc2hvdWxkRGlzYWJsZUZpbG1TdHJpcFZpZXdfKHRyU3RhdGVNc2dbdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IuTmFtZS5TTU9PVEhFRF9CV19SRUNWXSkgPyAKICAgIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMuc21vb3RoZWRCV1JlY3ZUaW1lcl8pIHx8ICh3YXJuaW5nID0gdGhpcy5nZXRXYXJuaW5nKGUubXNnLCA0KSwgdGhpcy5zbW9vdGhlZEJXUmVjdlRpbWVyXyA9IGdvb2cuVGltZXIuY2FsbE9uY2UoZ29vZy5iaW5kKHRoaXMub25UaW1lb3V0XywgdGhpcywgd2FybmluZyksIHRhbGsubWVkaWEucXVhbGl0eS5Db25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yLkdSQUNFRlVMX0RFR1JBREFUSU9OX1RJTUVPVVRfTVNfKSkgOiAodGhpcy5jbGVhclRpbWVyXygpLCB3YXJuaW5nID0gdGhpcy5nZXRXYXJuaW5nKGUubXNnLCA0KSwgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5XYXJuaW5nRW5kZWRFdmVudCh3YXJuaW5nKSkpCiAgfQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvci5wcm90b3R5cGUub25UaW1lb3V0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvciQkb25UaW1lb3V0XyQod2FybmluZykgewogIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuV2FybmluZ1N0YXJ0ZWRFdmVudCh3YXJuaW5nKSkKfTsKdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3IucHJvdG90eXBlLmNsZWFyVGltZXJfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRDb25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yJCRjbGVhclRpbWVyXyQoKSB7CiAgZ29vZy5UaW1lci5jbGVhcih0aGlzLnNtb290aGVkQldSZWN2VGltZXJfKTsKICBkZWxldGUgdGhpcy5zbW9vdGhlZEJXUmVjdlRpbWVyXwp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuQ29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRDb25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuaXNEZWYodGhpcy5zbW9vdGhlZEJXUmVjdlRpbWVyXykgJiYgdGhpcy5jbGVhclRpbWVyXygpOwogIGdvb2cuZGlzcG9zZSh0aGlzLmV2ZW50SGFuZGxlcl8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXyA9IG51bGw7CiAgdGFsay5tZWRpYS5xdWFsaXR5LkNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3Iuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcykKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZSQoaWQsIGNhdGVnb3J5LCBsZXZlbCwgdmlzaWJpbGl0eSwgZHVyYXRpb24sIG9wdF9tZXNzYWdlLCBvcHRfaW1wcmVzc2lvbiwgb3B0X2FydGljbGVJZCwgb3B0X3VyaSkgewogIHRoaXMuaWRfID0gaWQ7CiAgdGhpcy5jYXRlZ29yeV8gPSBjYXRlZ29yeTsKICB0aGlzLmxldmVsXyA9IGxldmVsOwogIHRoaXMudmlzaWJpbGl0eV8gPSB2aXNpYmlsaXR5OwogIHRoaXMuZHVyYXRpb25fID0gZHVyYXRpb247CiAgdGhpcy5tZXNzYWdlXyA9IG9wdF9tZXNzYWdlIHx8IG51bGw7CiAgdGhpcy5pbXByZXNzaW9uXyA9IG9wdF9pbXByZXNzaW9uIHx8IG51bGw7CiAgdGhpcy51cmlfID0gb3B0X3VyaSB8fCBudWxsOwogIGdvb2cuaXNEZWZBbmROb3ROdWxsKG9wdF9hcnRpY2xlSWQpICYmICh0aGlzLnVyaV8gPSB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUubWFrZUhlbHBDZW50ZXJVcmlfKG9wdF9hcnRpY2xlSWQpKQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkgPSB7QVVESU9fREVWSUNFOjEsIFZJREVPX0RFVklDRToyLCBHUkFQSElDUzozLCBORVRXT1JLOjQsIFNZU1RFTTo1fTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uID0ge1BFUlNJU1RFTlQ6MSwgVFJBTlNJRU5UOjJ9Owp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuU3RhdHVzID0ge1VOS05PV046MCwgQUNUSVZFOjEsIEVYUElSRUQ6MiwgVVNFUl9SRVNPTFZFRDozLCBTWVNURU1fUkVTT0xWRUQ6NH07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5MZXZlbCA9IHtXQVJOSU5HOjEsIFNFVkVSRToyLCBGQVRBTDozfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkgPSB7Tk9USUZZOjEsIFZJU0lCTEU6MiwgUkVDT1JEOjN9Owp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUucHJvdG90eXBlLnN0YXJ0VGltZXN0YW1wXyA9IDA7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUudXBkYXRlVGltZXN0YW1wXyA9IDA7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuc3RhdHVzXyA9IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5TdGF0dXMuVU5LTk9XTjsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUiKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLm1ha2VIZWxwQ2VudGVyVXJpXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWUkbWFrZUhlbHBDZW50ZXJVcmlfJChhcnRpY2xlSWQpIHsKICByZXR1cm4iaHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvdGFsay9iaW4vYW5zd2VyLnB5P2Fuc3dlcj0iICsgYXJ0aWNsZUlkCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZSQkY3JlYXRlJChvcHRfdGltZXN0YW1wKSB7CiAgdmFyIGNsb25lID0gZ29vZy5vYmplY3QuY2xvbmUodGhpcyk7CiAgY2xvbmUuc3RhcnRUaW1lc3RhbXBfID0gZ29vZy5pc0RlZkFuZE5vdE51bGwob3B0X3RpbWVzdGFtcCkgPyBvcHRfdGltZXN0YW1wIDogZ29vZy5ub3coKTsKICBjbG9uZS51cGRhdGVUaW1lc3RhbXBfID0gY2xvbmUuc3RhcnRUaW1lc3RhbXBfOwogIGNsb25lLnN0YXR1c18gPSB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuU3RhdHVzLkFDVElWRTsKICByZXR1cm4gY2xvbmUKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlJCR1cGRhdGUkKG9wdF90aW1lc3RhbXApIHsKICB0aGlzLnVwZGF0ZVRpbWVzdGFtcF8gPSBnb29nLmlzRGVmQW5kTm90TnVsbChvcHRfdGltZXN0YW1wKSA/IG9wdF90aW1lc3RhbXAgOiBnb29nLm5vdygpCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuY2xvc2VfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZSQkY2xvc2VfJCgpIHsKICBnb29nLm5vdygpCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUudXBkYXRlRnJvbSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWUkJHVwZGF0ZUZyb20kKG5ld0lzc3VlKSB7CiAgaWYodGhpcy5nZXRJZCgpICE9IG5ld0lzc3VlLmdldElkKCkpIHsKICAgIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJBdHRlbXB0IHRvIHVwZGF0ZSBtaXNtYXRjaGluZyBpc3N1ZTsgdGhpcyA9ICIgKyB0aGlzLmdldElkKCkgKyAiLCBuZXcgPSAiICsgbmV3SXNzdWUuZ2V0SWQoKSkKICB9ZWxzZSB7CiAgICBpZih0aGlzLmdldFN0YXR1cygpICE9IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5TdGF0dXMuQUNUSVZFKSB7CiAgICAgIHRoaXMubG9nZ2VyXy53YXJuaW5nKCJBdHRlbXB0IHRvIHVwZGF0ZSBjbG9zZWQgaXNzdWUgIiArIHRoaXMudG9TdHJpbmcoKSkKICAgIH1lbHNlIHsKICAgICAgdmFyIHVwZGF0ZVRpbWVzdGFtcCA9IG5ld0lzc3VlLmdldFVwZGF0ZVRpbWVzdGFtcCgpOwogICAgICB1cGRhdGVUaW1lc3RhbXAgJiYgdGhpcy51cGRhdGVUaW1lc3RhbXBfIDwgdXBkYXRlVGltZXN0YW1wICYmICh0aGlzLnVwZGF0ZVRpbWVzdGFtcF8gPSB1cGRhdGVUaW1lc3RhbXApCiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUucHJvdG90eXBlLnVwZGF0ZVN0YXR1cyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWUkJHVwZGF0ZVN0YXR1cyQobmV3U3RhdHVzKSB7CiAgdGhpcy5zdGF0dXNfID0gbmV3U3RhdHVzOwogIChuZXdTdGF0dXMgPT0gdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlN0YXR1cy5VU0VSX1JFU09MVkVEIHx8IG5ld1N0YXR1cyA9PSB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuU3RhdHVzLlNZU1RFTV9SRVNPTFZFRCB8fCBuZXdTdGF0dXMgPT0gdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlN0YXR1cy5FWFBJUkVEKSAmJiB0aGlzLmNsb3NlXygpCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuZ2V0SWQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlJCRnZXRJZCQoKSB7CiAgcmV0dXJuIHRoaXMuaWRfCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuZ2V0U3RhdHVzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZSQkZ2V0U3RhdHVzJCgpIHsKICByZXR1cm4gdGhpcy5zdGF0dXNfCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuZ2V0Q2F0ZWdvcnkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlJCRnZXRDYXRlZ29yeSQoKSB7CiAgcmV0dXJuIHRoaXMuY2F0ZWdvcnlfCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuZ2V0TGV2ZWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlJCRnZXRMZXZlbCQoKSB7CiAgcmV0dXJuIHRoaXMubGV2ZWxfCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuZ2V0VmlzaWJpbGl0eSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWUkJGdldFZpc2liaWxpdHkkKCkgewogIHJldHVybiB0aGlzLnZpc2liaWxpdHlfCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuZ2V0RHVyYXRpb24gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlJCRnZXREdXJhdGlvbiQoKSB7CiAgcmV0dXJuIHRoaXMuZHVyYXRpb25fCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuZ2V0TWVzc2FnZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWUkJGdldE1lc3NhZ2UkKCkgewogIHJldHVybiB0aGlzLm1lc3NhZ2VfCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuZ2V0VXJpID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZSQkZ2V0VXJpJCgpIHsKICByZXR1cm4gdGhpcy51cmlfCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuZ2V0SW1wcmVzc2lvbiA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWUkJGdldEltcHJlc3Npb24kKCkgewogIHJldHVybiB0aGlzLmltcHJlc3Npb25fCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5wcm90b3R5cGUuZ2V0VXBkYXRlVGltZXN0YW1wID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZSQkZ2V0VXBkYXRlVGltZXN0YW1wJCgpIHsKICByZXR1cm4gdGhpcy51cGRhdGVUaW1lc3RhbXBfCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5NSUNST1BIT05FX05PVF9ERVRFQ1RFRCA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoMTAwLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuQVVESU9fREVWSUNFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTGV2ZWwuRkFUQUwsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5WaXNpYmlsaXR5Lk5PVElGWSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uLlBFUlNJU1RFTlQsICJObyBtaWNyb3Bob25lIHdhcyBkZXRlY3RlZC4gPFZlcmlmeSB5b3VyIHNldHRpbmdzPiIpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTUlDUk9QSE9ORV9PU19NVVRFRCA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoMTAxLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuQVVESU9fREVWSUNFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTGV2ZWwuU0VWRVJFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5WSVNJQkxFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uUEVSU0lTVEVOVCwgIkFyZSB5b3Ugc3BlYWtpbmc/IENoYW5nZSB5b3VyIE9TIHNldHRpbmdzIHRvIHVubXV0ZSB5b3VyIG1pY3JvcGhvbmUuIiwgY2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldQX0FVRElPX1JFQ19NVVRFRCk7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5NSUNST1BIT05FX1NPRlRfTVVURUQgPSBuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlKDEwMiwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkNhdGVnb3J5LkFVRElPX0RFVklDRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxldmVsLlNFVkVSRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkuVklTSUJMRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uLlBFUlNJU1RFTlQsICJBcmUgeW91IHNwZWFraW5nPyBZb3VyIG1pY3JvcGhvbmUgaXMgbXV0ZWQuICA8VW5tdXRlPiIpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTUlDUk9QSE9ORV9TSUxFTlQgPSBuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlKDEwMywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkNhdGVnb3J5LkFVRElPX0RFVklDRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxldmVsLlNFVkVSRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkuTk9USUZZLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uVFJBTlNJRU5ULCAiWW91ciBtaWNyb3Bob25lIGlzIG5vdCBjYXB0dXJpbmcgYW55IGF1ZGlvLiAgPFZlcmlmeSB5b3VyIHNldHRpbmdzPiIsIGNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XUF9BVURJT19SRUNfU0lMRU5UKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLk1JQ1JPUEhPTkVfVE9PX0xPVyA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoMTA0LCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuQVVESU9fREVWSUNFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTGV2ZWwuV0FSTklORywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkuVklTSUJMRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uLlRSQU5TSUVOVCwgIk1pY3JvcGhvbmUgaW5wdXQgbGV2ZWwgaXMgdG9vIGxvdy4iKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLk1JQ1JPUEhPTkVfU0FUVVJBVEVEID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZSgxMDUsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5DYXRlZ29yeS5BVURJT19ERVZJQ0UsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5MZXZlbC5XQVJOSU5HLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5WSVNJQkxFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uVFJBTlNJRU5ULCAiTWljcm9waG9uZSBpbnB1dCBsZXZlbCBpcyB0b28gaGlnaC4iLCBjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfQVVESU9fUkVDX1NBVFVSQVRJT04pOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuU1BFQUtFUlNfTk9UX0RFVEVDVEVEID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZSgxMDYsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5DYXRlZ29yeS5BVURJT19ERVZJQ0UsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5MZXZlbC5GQVRBTCwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkuTk9USUZZLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uUEVSU0lTVEVOVCwgIk5vIHNwZWFrZXJzIG9yIGhlYWRwaG9uZXMgd2VyZSBkZXRlY3RlZC4gIDxWZXJpZnkgeW91ciBzZXR0aW5ncz4iKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlRZUElOR19OT0lTRV9ERVRFQ1RFRCA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoMTA3LCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuQVVESU9fREVWSUNFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTGV2ZWwuV0FSTklORywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkuVklTSUJMRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uLlRSQU5TSUVOVCwgIllvdSBhcmUgbm90IHVzaW5nIGFjY2VsZXJhdGVkIGdyYXBoaWNzLiIpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuV0VCQ0FNX05PVF9ERVRFQ1RFRCA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoMjAwLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuVklERU9fREVWSUNFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTGV2ZWwuU0VWRVJFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5WSVNJQkxFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uUEVSU0lTVEVOVCwgIk5vIHdlYmNhbSB3YXMgZGV0ZWN0ZWQuICA8VmVyaWZ5IHlvdXIgc2V0dGluZ3M+IiwgY2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldQX1ZJREVPX1JFQ19OT19ERVZJQ0UpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTk9fVklERU9fQ0FQVFVSRUQgPSBuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlKDIwMSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkNhdGVnb3J5LlZJREVPX0RFVklDRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxldmVsLlNFVkVSRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkuTk9USUZZLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uVFJBTlNJRU5ULCAiV2UgYXJlIG5vdCBhYmxlIHRvIGNhcHR1cmUgdmlkZW8gZnJvbSB5b3VyIHdlYmNhbS4gIDxWZXJpZnkgeW91ciBzZXR0aW5ncz4iKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxPV19DQVBUVVJFX0ZQUyA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoMjAyLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuVklERU9fREVWSUNFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTGV2ZWwuV0FSTklORywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkuVklTSUJMRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uLlRSQU5TSUVOVCwgIllvdXIgd2ViY2FtIGlzIGNhcHR1cmluZyBwb29yIHF1YWxpdHkgdmlkZW8uICA8VmVyaWZ5IHlvdXIgc2V0dGluZ3M+Iik7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5MT1dfQ0FQVFVSRV9SRVNPTFVUSU9OID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZSgyMDMsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5DYXRlZ29yeS5WSURFT19ERVZJQ0UsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5MZXZlbC5XQVJOSU5HLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5WSVNJQkxFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uVFJBTlNJRU5ULCAiWW91ciB3ZWJjYW0gaXMgY2FwdHVyaW5nIHBvb3IgcXVhbGl0eSB2aWRlby4gIDxWZXJpZnkgeW91ciBzZXR0aW5ncz4iKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLk5PX0FDQ0VMRVJBVEVEX0dSQVBISUNTID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZSgzMDAsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5DYXRlZ29yeS5HUkFQSElDUywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxldmVsLldBUk5JTkcsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5WaXNpYmlsaXR5LlZJU0lCTEUsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5EdXJhdGlvbi5QRVJTSVNURU5ULCAiWW91IGFyZSBub3QgdXNpbmcgYWNjZWxlcmF0ZWQgZ3JhcGhpY3MuIik7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5aRVJPX1JFTkRFUl9GUFMgPSBuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlKDMwMSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkNhdGVnb3J5LkdSQVBISUNTLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTGV2ZWwuU0VWRVJFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5OT1RJRlksIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5EdXJhdGlvbi5UUkFOU0lFTlQsICJXZSBhcmUgbm90IGFibGUgdG8gcmVuZGVyIHZpZGVvLiIpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTE9XX1JFTkRFUl9GUFMgPSBuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlKDMwMiwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkNhdGVnb3J5LkdSQVBISUNTLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTGV2ZWwuV0FSTklORywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkuVklTSUJMRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uLlRSQU5TSUVOVCwgIlRoZSByZW5kZXJlZCB2aWRlbyBmcmFtZXJhdGUgaXMgbG93LiIpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTk9fQVVESU9fU0VOVCA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoNDAwLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuTkVUV09SSywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxldmVsLkZBVEFMLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5OT1RJRlksIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5EdXJhdGlvbi5UUkFOU0lFTlQsICJZb3UgYXJlIG5vdCBzZW5kaW5nIGFueSBhdWRpby4iLCBjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV0NfTE9TRV9QQVJUSUFMX1dSSVRBQklMSVRZKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLk5PX0FVRElPX1JFQ0VJVkVEID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZSg0MDEsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5DYXRlZ29yeS5ORVRXT1JLLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTGV2ZWwuRkFUQUwsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5WaXNpYmlsaXR5Lk5PVElGWSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uLlRSQU5TSUVOVCwgIllvdXIgYXJlIG5vdCByZWNlaXZpbmcgYW55IGF1ZGlvLiIsIGNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XTV9BVURJT19SQl9TQU1FKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLk5PX1ZJREVPX1NFTlQgPSBuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlKDQwMiwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkNhdGVnb3J5Lk5FVFdPUkssIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5MZXZlbC5GQVRBTCwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkuTk9USUZZLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uVFJBTlNJRU5ULCAiWW91IGFyZSBub3Qgc2VuZGluZyBhbnkgdmlkZW8uIiwgY2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldDX0xPU0VfUEFSVElBTF9XUklUQUJJTElUWSk7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5OT19WSURFT19SRUNFSVZFRCA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoNDAzLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuTkVUV09SSywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxldmVsLkZBVEFMLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5OT1RJRlksIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5EdXJhdGlvbi5UUkFOU0lFTlQsICJZb3UgYXJlIG5vdCByZWNlaXZpbmcgYW55IHZpZGVvLiIpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTk9fQ09OTkVDVElPTiA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoNDA0LCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuTkVUV09SSywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxldmVsLkZBVEFMLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5OT1RJRlksIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5EdXJhdGlvbi5QRVJTSVNURU5ULCAiV2UgYXJlIG5vdCBhYmxlIHRvIG1ha2UgYSBjb25uZWN0aW9uIHRvIHRoZSBtZWRpYSBzZXJ2ZXJzLiIsIGNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XQ19MT1NFX0FMTF9XUklUQUJJTElUWSk7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5UQ1BfQ09OTkVDVElPTiA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoNDA1LCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuTkVUV09SSywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxldmVsLldBUk5JTkcsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5WaXNpYmlsaXR5LlZJU0lCTEUsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5EdXJhdGlvbi5QRVJTSVNURU5ULCAiWW91ciBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgdXNpbmcgVENQLiIsIGNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XQ19VU0VfVENQKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxPV19CQU5EV0lEVEggPSBuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlKDQwNiwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkNhdGVnb3J5Lk5FVFdPUkssIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5MZXZlbC5XQVJOSU5HLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5WSVNJQkxFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uUEVSU0lTVEVOVCwgIllvdXIgbmV0d29yayBjb25uZWN0aW9uIGhhcyBsb3cgYmFuZHdpZHRoLiIpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuSElHSF9MQVRFTkNZID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZSg0MDcsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5DYXRlZ29yeS5ORVRXT1JLLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTGV2ZWwuV0FSTklORywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkuVklTSUJMRSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uLlRSQU5TSUVOVCwgIllvdXIgbmV0d29yayBjb25uZWN0aW9uIGhhcyBoaWdoIGxhdGVuY3kuIik7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5ISUdIX1BBQ0tFVExPU1MgPSBuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlKDQwOCwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkNhdGVnb3J5Lk5FVFdPUkssIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5MZXZlbC5XQVJOSU5HLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5WSVNJQkxFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uVFJBTlNJRU5ULCAiWW91ciBuZXR3b3JrIGNvbm5lY3Rpb24gaGFzIGhpZ2ggcGFja2V0IGxvc3MuIik7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5BVURJT19WSURFT19PVVRfT0ZfU1lOQyA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUoNDA5LCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkuTkVUV09SSywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxldmVsLldBUk5JTkcsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5WaXNpYmlsaXR5LlZJU0lCTEUsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5EdXJhdGlvbi5UUkFOU0lFTlQsICJZb3VyIGF1ZGlvIGFuZCB2aWRlbyBhcmUgb3V0IG9mIHN5bmMuIik7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5TWVNURU1fQkVMT1dfUkVRVUlSRU1FTlRTID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZSg1MDAsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5DYXRlZ29yeS5TWVNURU0sIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5MZXZlbC5XQVJOSU5HLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVmlzaWJpbGl0eS5WSVNJQkxFLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuRHVyYXRpb24uUEVSU0lTVEVOVCwgIllvdXIgc3lzdGVtIGRvZXMgbm90IG1lZXQgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciBHb29nbGUrIEhhbmdvdXRzLiIpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuUExVR0lOX09VVF9PRl9EQVRFID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZSg1MDEsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5DYXRlZ29yeS5TWVNURU0sIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5MZXZlbC5TRVZFUkUsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5WaXNpYmlsaXR5Lk5PVElGWSwgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkR1cmF0aW9uLlBFUlNJU1RFTlQsICJBbiB1cGdyYWRlIGlzIGF2YWlsYWJsZSBmb3IgeW91ciBHb29nbGUgVGFsayBQbHVnaW4uIDx1cGRhdGU+Iik7CnRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRNZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yJChhcHBDb250ZXh0LCBjYWxsTWFuYWdlcikgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5jYWxsTWFuYWdlcl8gPSBjYWxsTWFuYWdlcjsKICB0aGlzLmlzQ3B1TWF4ZWRPdXRfID0gITE7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuY2FsbE1hbmFnZXJfLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LkpNSURBVEEsIHRoaXMuaGFuZGxlSm1pZGF0YU1zZ18pCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5xdWFsaXR5Lk1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKdGFsay5tZWRpYS5xdWFsaXR5Lk1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IucHJvdG90eXBlLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoInRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yIik7CnRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yLnByb3RvdHlwZS5sYXN0QXVkaW9SYl8gPSAwOwp0YWxrLm1lZGlhLnF1YWxpdHkuTWVkaWFJbmZvV2FybmluZ0dlbmVyYXRvci5XYXJuaW5ncyA9IHsxOntMZXZlbDp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5MZXZlbC5MT1csIER1cmF0aW9uOkluZmluaXR5LCBTdGFydEltcHJlc3Npb246Y2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldNX0NQVV9NQVhFRF9PVVQsIEVuZEltcHJlc3Npb246Y2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldNX0NQVV9OT1JNQUx9LCAyOntMZXZlbDp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5MZXZlbC5MT1csIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV01fUkVDRUlWRURfQVVESU9fSklUVEVSfSwgMzp7TGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuTE9XLCBTdGFydEltcHJlc3Npb246Y2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldNX1NFTlRfQVVESU9fSklUVEVSfSwgNDp7TGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuTE9XLCAKU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XTV9BVURJT19SQl9TQU1FfX07CnRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yLkVycm9yQ29kZSA9IHtDUFVfTUFYRURfT1VUOjEsIFJFQ0VJVkVEX0FVRElPX0pJVFRFUjoyLCBTRU5UX0FVRElPX0pJVFRFUjozLCBBVURJT19SQl9TQU1FOjR9Owp0YWxrLm1lZGlhLnF1YWxpdHkuTWVkaWFJbmZvV2FybmluZ0dlbmVyYXRvci5wcm90b3R5cGUuZ2V0V2FybmluZ01zZ18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JE1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IkJGdldFdhcm5pbmdNc2dfJChjb2RlLCBtZWRpYUluZm8sIGNhbGwsIG9wdF9zc3JjKSB7CiAgaWYoY29kZSA9PSB0YWxrLm1lZGlhLnF1YWxpdHkuTWVkaWFJbmZvV2FybmluZ0dlbmVyYXRvci5FcnJvckNvZGUuQ1BVX01BWEVEX09VVCkgewogICAgcmV0dXJuIllvdXIgc3lzdGVtIENQVSBpcyB1bmRlciBoaWdoIGxvYWQuIgogIH0KICBpZihjb2RlID09IHRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yLkVycm9yQ29kZS5SRUNFSVZFRF9BVURJT19KSVRURVIpIHsKICAgIHZhciBqaWQ7CiAgICBnb29nLmlzRGVmQW5kTm90TnVsbChvcHRfc3NyYykgJiYgZ29vZy5pc0RlZkFuZE5vdE51bGwoY2FsbCkgJiYgKGppZCA9IGNhbGwuZ2V0SmlkRm9yU3NyYyhvcHRfc3NyYywgdGFsay5tZWRpYS5NZWRpYVR5cGUuQVVESU8pKTsKICAgIHZhciBNU0dfSk1JREFUQV9SRUNFSVZFRF9BVURJT19KSVRURVIgPSAoamlkIHx8ICJVbmtub3duIHBlZXIiKSArICIgaXMgc2VuZGluZyBoaWdoIGppdHRlciBhdWRpby4iOwogICAgcmV0dXJuIE1TR19KTUlEQVRBX1JFQ0VJVkVEX0FVRElPX0pJVFRFUgogIH0KICBpZihjb2RlID09IHRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yLkVycm9yQ29kZS5TRU5UX0FVRElPX0pJVFRFUikgewogICAgcmV0dXJuIllvdSBhcmUgc2VuZGluZyBoaWdoIGppdHRlciBhdWRpby4iCiAgfQogIGNvZGUgIT0gdGFsay5tZWRpYS5xdWFsaXR5Lk1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IuRXJyb3JDb2RlLkFVRElPX1JCX1NBTUUgJiYgdGhpcy5sb2dnZXJfLndhcm5pbmcoIlVua25vd24gam1pZGF0YSBlcnJvciBjb2RlOiAiICsgY29kZSk7CiAgcmV0dXJuIG51bGwKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lk1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlV2FybmluZ18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JE1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IkJGdlbmVyYXRlV2FybmluZ18kKG1lZGlhSW5mbywgZXJyb3JDb2RlLCBvcHRfc3NyYywgb3B0X2lzRW5kZWQpIHsKICB2YXIgY2FsbCA9IHRoaXMuY2FsbE1hbmFnZXJfLmdldEFjdGl2ZUNhbGwoKSwgaW5mbyA9IHRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yLldhcm5pbmdzW2Vycm9yQ29kZV0sIHdhcm5pbmcgPSAobmV3IHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nKHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLlR5cGUuSk1JREFUQSwgZXJyb3JDb2RlLCBtZWRpYUluZm8uamlkLCBtZWRpYUluZm8uc2Vzc2lvbklkLCB0aGlzLmdldFdhcm5pbmdNc2dfKGVycm9yQ29kZSwgbWVkaWFJbmZvLCBjYWxsLCBvcHRfc3NyYyksIGluZm8uTGV2ZWwsIGluZm8uU3RhcnRJbXByZXNzaW9uKSkuc2V0RW5kSW1wcmVzc2lvbihpbmZvLkVuZEltcHJlc3Npb24pLnNldFNzcmMob3B0X3NzcmMpLnNldER1cmF0aW9uKGluZm8uRHVyYXRpb24pOwogIG9wdF9pc0VuZGVkID8gdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5XYXJuaW5nRW5kZWRFdmVudCh3YXJuaW5nKSkgOiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLldhcm5pbmdTdGFydGVkRXZlbnQod2FybmluZykpCn07CnRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yLlRDUFVfVEhSRVNIT0xEXyA9IDgwOwp0YWxrLm1lZGlhLnF1YWxpdHkuTWVkaWFJbmZvV2FybmluZ0dlbmVyYXRvci5BVURJT19KSVRURVJfVEhSRVNIT0xEXyA9IDMwOwp0YWxrLm1lZGlhLnF1YWxpdHkuTWVkaWFJbmZvV2FybmluZ0dlbmVyYXRvci5wcm90b3R5cGUuaGFuZGxlSm1pZGF0YU1zZ18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JE1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IkJGhhbmRsZUptaWRhdGFNc2dfJChlKSB7CiAgdmFyIG1lZGlhSW5mbyA9IGUuZGF0YSwgaXNDcHVNYXhlZE91dCA9IG1lZGlhSW5mby5nbG9iYWxJbmZvLnRvdGFsQ3B1IC8gbWVkaWFJbmZvLmdsb2JhbEluZm8uY3B1cyA+IHRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yLlRDUFVfVEhSRVNIT0xEXzsKICBpc0NwdU1heGVkT3V0ID8gdGhpcy5nZW5lcmF0ZVdhcm5pbmdfKG1lZGlhSW5mbywgdGFsay5tZWRpYS5xdWFsaXR5Lk1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IuRXJyb3JDb2RlLkNQVV9NQVhFRF9PVVQpIDogdGhpcy5pc0NwdU1heGVkT3V0XyAmJiB0aGlzLmdlbmVyYXRlV2FybmluZ18obWVkaWFJbmZvLCB0YWxrLm1lZGlhLnF1YWxpdHkuTWVkaWFJbmZvV2FybmluZ0dlbmVyYXRvci5FcnJvckNvZGUuQ1BVX01BWEVEX09VVCwgdm9pZCAwLCAhMCk7CiAgdGhpcy5pc0NwdU1heGVkT3V0XyA9IGlzQ3B1TWF4ZWRPdXQ7CiAgZm9yKHZhciBpID0gMDtpIDwgbWVkaWFJbmZvLmF1ZGlvUmVjZWl2ZXJJbmZvcy5sZW5ndGg7aSsrKSB7CiAgICBtZWRpYUluZm8uYXVkaW9SZWNlaXZlckluZm9zW2ldLmppdHRlciA+IHRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yLkFVRElPX0pJVFRFUl9USFJFU0hPTERfID8gdGhpcy5nZW5lcmF0ZVdhcm5pbmdfKG1lZGlhSW5mbywgdGFsay5tZWRpYS5xdWFsaXR5Lk1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IuRXJyb3JDb2RlLlJFQ0VJVkVEX0FVRElPX0pJVFRFUiwgbWVkaWFJbmZvLmF1ZGlvUmVjZWl2ZXJJbmZvc1tpXS5zc3JjLnRvU3RyaW5nKCkpIDogdGhpcy5nZW5lcmF0ZVdhcm5pbmdfKG1lZGlhSW5mbywgdGFsay5tZWRpYS5xdWFsaXR5Lk1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IuRXJyb3JDb2RlLlJFQ0VJVkVEX0FVRElPX0pJVFRFUiwgbWVkaWFJbmZvLmF1ZGlvUmVjZWl2ZXJJbmZvc1tpXS5zc3JjLnRvU3RyaW5nKCksICEwKQogIH0KICBmb3IoaSA9IDA7aSA8IG1lZGlhSW5mby5hdWRpb1NlbmRlckluZm9zLmxlbmd0aDtpKyspIHsKICAgIG1lZGlhSW5mby5hdWRpb1NlbmRlckluZm9zW2ldLmppdHRlciA+IHRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yLkFVRElPX0pJVFRFUl9USFJFU0hPTERfID8gdGhpcy5nZW5lcmF0ZVdhcm5pbmdfKG1lZGlhSW5mbywgdGFsay5tZWRpYS5xdWFsaXR5Lk1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IuRXJyb3JDb2RlLlNFTlRfQVVESU9fSklUVEVSLCBtZWRpYUluZm8uYXVkaW9TZW5kZXJJbmZvc1tpXS5zc3JjLnRvU3RyaW5nKCkpIDogdGhpcy5nZW5lcmF0ZVdhcm5pbmdfKG1lZGlhSW5mbywgdGFsay5tZWRpYS5xdWFsaXR5Lk1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IuRXJyb3JDb2RlLlNFTlRfQVVESU9fSklUVEVSLCBtZWRpYUluZm8uYXVkaW9TZW5kZXJJbmZvc1tpXS5zc3JjLnRvU3RyaW5nKCksICEwKQogIH0KICB2YXIgcGFydGljaXBhbnRzID0gdGhpcy5jYWxsTWFuYWdlcl8uZ2V0QWN0aXZlQ2FsbCgpLmdldE51bWJlck9mQXVkaW9TZW5kZXJzKCk7CiAgaWYoMSA8IHBhcnRpY2lwYW50cykgewogICAgZm9yKHZhciBpc1JiU2FtZSA9ICEwLCBpID0gMDtpIDwgbWVkaWFJbmZvLmF1ZGlvQ29ubmVjdGlvbkluZm9zLmxlbmd0aDtpKyspIHsKICAgICAgdmFyIGF1ZGlvSW5mbyA9IG1lZGlhSW5mby5hdWRpb0Nvbm5lY3Rpb25JbmZvc1tpXTsKICAgICAgaWYoYXVkaW9JbmZvLmlzQmVzdCgpICYmIGF1ZGlvSW5mby5pc1dyaXRhYmxlKCkgJiYgYXVkaW9JbmZvLmlzUmVhZGFibGUoKSkgewogICAgICAgIHZhciBsYXN0UmIgPSB0aGlzLmxhc3RBdWRpb1JiXzsKICAgICAgICB0aGlzLmxhc3RBdWRpb1JiXyA9IGF1ZGlvSW5mby5yZWN2Qnl0ZXM7CiAgICAgICAgaWYoYXVkaW9JbmZvLnJlY3ZCeXRlcyAhPSBsYXN0UmIpIHsKICAgICAgICAgIGlzUmJTYW1lID0gITE7CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaXNSYlNhbWUgPyB0aGlzLmdlbmVyYXRlV2FybmluZ18obWVkaWFJbmZvLCB0YWxrLm1lZGlhLnF1YWxpdHkuTWVkaWFJbmZvV2FybmluZ0dlbmVyYXRvci5FcnJvckNvZGUuQVVESU9fUkJfU0FNRSkgOiB0aGlzLmdlbmVyYXRlV2FybmluZ18obWVkaWFJbmZvLCB0YWxrLm1lZGlhLnF1YWxpdHkuTWVkaWFJbmZvV2FybmluZ0dlbmVyYXRvci5FcnJvckNvZGUuQVVESU9fUkJfU0FNRSwgdm9pZCAwLCAhMCkKICB9Cn07CnRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JE1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3IkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgZ29vZy5kaXNwb3NlKHRoaXMuZXZlbnRIYW5kbGVyXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbnVsbDsKICB0YWxrLm1lZGlhLnF1YWxpdHkuTWVkaWFJbmZvV2FybmluZ0dlbmVyYXRvci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkUGx1Z2luV2FybmluZ0dlbmVyYXRvciQoYXBwQ29udGV4dCwgY2FsbE1hbmFnZXIpIHsKICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuY2FsbE1hbmFnZXJfID0gY2FsbE1hbmFnZXI7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuY2FsbE1hbmFnZXJfLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50LlBMVUdJTl9XQVJOSU5HLCB0aGlzLmhhbmRsZVBsdWdpbldhcm5pbmdNc2dfKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLCBnb29nLmV2ZW50cy5FdmVudFRhcmdldCk7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLnByb3RvdHlwZS5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvciIpOwp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfQVVESU9fT1RIRVJfID0gIk90aGVyIGF1ZGlvIGVycm9ycy4iOwp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfQVVESU9fUkVDX0RFVklDRV9PUEVOX0ZBSUxFRF8gPSAiQ291bGQgbm90IG9wZW4gbWljLiI7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19BVURJT19SRUNfREVWSUNFX01VVEVEXyA9ICJNaWMgd2FzIG11dGVkIGJ5IE9TLiI7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19BVURJT19SRUNfREVWSUNFX1NJTEVOVF8gPSAiTm8gYmFja2dyb3VuZCBub2lzZSBwaWNrZWQgdXAuIjsKdGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX0FVRElPX1JFQ19ERVZJQ0VfU0FUVVJBVElPTl8gPSAiTWljIGlucHV0IGhhcyBleGNlZWRlZCB0aGUgZGV2aWNlIGxpbWl0LiI7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19BVURJT19SRUNfREVWSUNFX1JFTU9WRURfID0gIk1pYyB3YXMgcmVtb3ZlZCB3aGlsZSBhY3RpdmUuIjsKdGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX0FVRElPX1JFQ19SVU5USU1FX0VSUk9SXyA9ICJQcm9jZXNzaW5nIGlzIGVuY291bnRlcmluZyBlcnJvcnMuIjsKdGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX0FVRElPX1JFQ19TUlRQX0VSUk9SXyA9ICJHZW5lcmljIEF1ZGlvIFNSVFAgZmFpbHVyZS4iOwp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfQVVESU9fUExBWV9ERVZJQ0VfT1BFTl9GQUlMRURfID0gIkNvdWxkIG5vdCBvcGVuIGF1ZGlvIHBsYXlvdXQuIjsKdGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX0FVRElPX1BMQVlfREVWSUNFX01VVEVEXyA9ICJBdWRpbyBwbGF5b3V0IG11dGVkIGJ5IE9TLiI7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19BVURJT19QTEFZX0RFVklDRV9SRU1PVkVEXyA9ICJBdWRpbyBwbGF5b3V0IHJlbW92ZWQgd2hpbGUgYWN0aXZlLiI7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19BVURJT19QTEFZX1JVTlRJTUVfRVJST1JfID0gIkVycm9ycyBpbiB2b2ljZSBwcm9jZXNzaW5nLiI7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19BVURJT19QTEFZX1NSVFBfRVJST1JfID0gIkdlbmVyaWMgYXVkaW8gU1JUUCBmYWlsdXJlLiI7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19BVURJT19QTEFZX1NSVFBfQVVUSF9GQUlMRURfID0gIkZhaWxlZCB0byBhdXRoZW50aWNhdGUgYXVkaW8gcGFja2V0cy4iOwp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5BdWRpb1dhcm5pbmdzID0gezE6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfQVVESU9fT1RIRVJfLCBMZXZlbDp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5MZXZlbC5MT1csIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfQVVESU9fT1RIRVJ9LCAxMDA6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfQVVESU9fUkVDX0RFVklDRV9PUEVOX0ZBSUxFRF8sIExldmVsOnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkxldmVsLkhJR0gsIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfQVVESU9fUkVDX09QRU59LCAxMDE6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfQVVESU9fUkVDX0RFVklDRV9NVVRFRF8sIApMZXZlbDp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5MZXZlbC5MT1csIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfQVVESU9fUkVDX01VVEVEfSwgMTAyOntNc2c6dGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX0FVRElPX1JFQ19ERVZJQ0VfU0lMRU5UXywgTGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuTE9XLCBTdGFydEltcHJlc3Npb246Y2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldQX0FVRElPX1JFQ19TSUxFTlR9LCAxMDM6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfQVVESU9fUkVDX0RFVklDRV9TQVRVUkFUSU9OXywgTGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuTUVESVVNSElHSCwgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XUF9BVURJT19SRUNfU0FUVVJBVElPTn0sIAoxMDQ6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfQVVESU9fUkVDX0RFVklDRV9SRU1PVkVEXywgTGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuSElHSCwgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XUF9BVURJT19SRUNfUkVNT1ZFRH0sIDEwNTp7TXNnOnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19BVURJT19SRUNfUlVOVElNRV9FUlJPUl8sIExldmVsOnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkxldmVsLk1FRElVTUhJR0gsIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfQVVESU9fUkVDX1JVTlRJTUV9LCAxMDY6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfQVVESU9fUkVDX1NSVFBfRVJST1JfLCBMZXZlbDp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5MZXZlbC5NRURJVU1MT1csIApTdGFydEltcHJlc3Npb246Y2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldQX0FVRElPX1JFQ19TUlRQfSwgMjAwOntNc2c6dGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX0FVRElPX1BMQVlfREVWSUNFX09QRU5fRkFJTEVEXywgTGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuSElHSCwgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XUF9BVURJT19QTEFZX09QRU59LCAyMDE6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfQVVESU9fUExBWV9ERVZJQ0VfTVVURURfLCBMZXZlbDp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5MZXZlbC5MT1csIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfQVVESU9fUExBWV9NVVRFRH0sIDIwMjp7TXNnOnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19BVURJT19QTEFZX0RFVklDRV9SRU1PVkVEXywgCkxldmVsOnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkxldmVsLkhJR0gsIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfQVVESU9fUExBWV9SRU1PVkVEfSwgMjAzOntNc2c6dGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX0FVRElPX1BMQVlfUlVOVElNRV9FUlJPUl8sIExldmVsOnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkxldmVsLk1FRElVTUhJR0gsIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfQVVESU9fUExBWV9SVU5USU1FfSwgMjA0OntNc2c6dGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX0FVRElPX1BMQVlfU1JUUF9FUlJPUl8sIExldmVsOnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkxldmVsLk1FRElVTUxPVywgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XUF9BVURJT19QTEFZX1NSVFB9LCAKMjA1OntNc2c6dGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX0FVRElPX1BMQVlfU1JUUF9BVVRIX0ZBSUxFRF8sIExldmVsOnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkxldmVsLk1FRElVTUxPVywgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XUF9BVURJT19QTEFZX1NSVFBfQVVUSH19Owp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfVklERU9fT1RIRVJfID0gIk90aGVyIHZpZGVvIGVycm9ycyI7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19WSURFT19SRUNfREVWSUNFX09QRU5fRkFJTEVEXyA9ICJDb3VsZCBub3Qgb3BlbiBjYW1lcmEiOwp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfVklERU9fUkVDX0RFVklDRV9OT19ERVZJQ0VfID0gIk5vIGNhbWVyYSBkZXRlY3RlZCI7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19WSURFT19SRUNfREVWSUNFX0lOX1VTRV8gPSAiQ2FtZXJhIGlzIGFscmVhZHkgaW4gdXNlIjsKdGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX1ZJREVPX1JFQ19ERVZJQ0VfUkVNT1ZFRF8gPSAiQ2FtZXJhIHdhcyByZW1vdmVkIjsKdGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX1ZJREVPX1JFQ19TUlRQX0VSUk9SXyA9ICJTUlRQIGZhaWx1cmUgc2VuZGluZyB2aWRlbyI7CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19WSURFT19QTEFZX1NSVFBfRVJST1JfID0gIlNSVFAgZmFpbHVyZSBvbiBpbmNvbWluZyB2aWRlbyBzdHJlYW0iOwp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfVklERU9fUExBWV9TUlRQX0FVVEhfRkFJTEVEXyA9ICJGYWlsZWQgdG8gYXV0aGVudGljYXRlIHZpZGVvIHBhY2tldHMiOwp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5WaWRlb1dhcm5pbmdzID0gezE6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfVklERU9fT1RIRVJfLCBMZXZlbDp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5MZXZlbC5MT1csIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfVklERU9fT1RIRVJ9LCAxMDA6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfVklERU9fUkVDX0RFVklDRV9PUEVOX0ZBSUxFRF8sIExldmVsOnRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkxldmVsLkhJR0gsIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfVklERU9fUkVDX09QRU59LCAxMDE6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfVklERU9fUkVDX0RFVklDRV9OT19ERVZJQ0VfLCAKTGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuSElHSCwgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XUF9WSURFT19SRUNfTk9fREVWSUNFfSwgMTAyOntNc2c6dGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuTVNHX1ZJREVPX1JFQ19ERVZJQ0VfSU5fVVNFXywgTGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuTUVESVVNTE9XLCBTdGFydEltcHJlc3Npb246Y2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldQX1ZJREVPX1JFQ19JTl9VU0V9LCAxMDM6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfVklERU9fUkVDX0RFVklDRV9SRU1PVkVEXywgTGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuSElHSCwgU3RhcnRJbXByZXNzaW9uOmNoYXQuY29tbW9uLkNhbGxJbXByZXNzaW9ucy5XUF9WSURFT19SRUNfUkVNT1ZFRH0sIAoxMDQ6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfVklERU9fUkVDX1NSVFBfRVJST1JfLCBMZXZlbDp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5MZXZlbC5NRURJVU1MT1csIFN0YXJ0SW1wcmVzc2lvbjpjaGF0LmNvbW1vbi5DYWxsSW1wcmVzc2lvbnMuV1BfVklERU9fUkVDX1NSVFB9LCAyMDA6e01zZzp0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5NU0dfVklERU9fUExBWV9TUlRQX0VSUk9SXywgTGV2ZWw6dGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuTGV2ZWwuTUVESVVNTE9XLCBTdGFydEltcHJlc3Npb246Y2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldQX1ZJREVPX1BMQVlfU1JUUH0sIDIwMTp7TXNnOnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLk1TR19WSURFT19QTEFZX1NSVFBfQVVUSF9GQUlMRURfLCBMZXZlbDp0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5MZXZlbC5NRURJVU1MT1csIApTdGFydEltcHJlc3Npb246Y2hhdC5jb21tb24uQ2FsbEltcHJlc3Npb25zLldQX1ZJREVPX1BMQVlfU1JUUF9BVVRIfX07CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLnByb3RvdHlwZS5oYW5kbGVQbHVnaW5XYXJuaW5nTXNnXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkUGx1Z2luV2FybmluZ0dlbmVyYXRvciQkaGFuZGxlUGx1Z2luV2FybmluZ01zZ18kKGUpIHsKICB2YXIgd2FybmluZ1R5cGUgPSBlLm1zZ1szXS50LCB3YXJuaW5nQ29kZSA9IGUubXNnWzNdLmMsIGluZm8gPSB3YXJuaW5nVHlwZSA9PSB0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZy5UeXBlLkFVRElPID8gdGFsay5tZWRpYS5xdWFsaXR5LlBsdWdpbldhcm5pbmdHZW5lcmF0b3IuQXVkaW9XYXJuaW5nc1t3YXJuaW5nQ29kZV0gOiB0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5WaWRlb1dhcm5pbmdzW3dhcm5pbmdDb2RlXSwgd2FybmluZyA9IG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuV2FybmluZyh3YXJuaW5nVHlwZSwgd2FybmluZ0NvZGUsIGUubXNnWzFdLCBlLm1zZ1syXSwgaW5mby5Nc2csIGluZm8uTGV2ZWwsIGluZm8uU3RhcnRJbXByZXNzaW9uKTsKICB3YXJuaW5nLnNldFNzcmMoZS5tc2dbM10ucy50b1N0cmluZygpKTsKICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLldhcm5pbmdTdGFydGVkRXZlbnQod2FybmluZykpCn07CnRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JFBsdWdpbldhcm5pbmdHZW5lcmF0b3IkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgZ29vZy5kaXNwb3NlKHRoaXMuZXZlbnRIYW5kbGVyXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbnVsbDsKICB0YWxrLm1lZGlhLnF1YWxpdHkuUGx1Z2luV2FybmluZ0dlbmVyYXRvci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVHZW5lcmF0b3IgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlR2VuZXJhdG9yJChhcHBDb250ZXh0LCBjYWxsTWFuYWdlcikgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5hcHBDb250ZXh0XyA9IGFwcENvbnRleHQ7CiAgdGhpcy5jYWxsTWFuYWdlcl8gPSBjYWxsTWFuYWdlcjsKICB0aGlzLnBsdWdpbldhcm5pbmdHZW5lcmF0b3JfID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5QbHVnaW5XYXJuaW5nR2VuZXJhdG9yKGFwcENvbnRleHQsIGNhbGxNYW5hZ2VyKTsKICB0aGlzLm1lZGlhSW5mb1dhcm5pbmdHZW5lcmF0b3JfID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5NZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yKGFwcENvbnRleHQsIGNhbGxNYW5hZ2VyKTsKICB0aGlzLmNvbm5lY3Rpdml0eVdhcm5pbmdHZW5lcmF0b3JfID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Db25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yKGFwcENvbnRleHQsIGNhbGxNYW5hZ2VyKTsKICB0aGlzLmltcHJlc3Npb25SZXBvcnRlcl8gPSBjaGF0LnV0aWxzLkltcHJlc3Npb25SZXBvcnRlci5nZXQoYXBwQ29udGV4dCk7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMucGx1Z2luV2FybmluZ0dlbmVyYXRvcl8sIHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkV2ZW50VHlwZS5XQVJOSU5HX1NUQVJURUQsIHRoaXMub25XYXJuaW5nU3RhcnRlZF8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5wbHVnaW5XYXJuaW5nR2VuZXJhdG9yXywgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuRXZlbnRUeXBlLldBUk5JTkdfRU5ERUQsIHRoaXMub25XYXJuaW5nRW5kZWRfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMubWVkaWFJbmZvV2FybmluZ0dlbmVyYXRvcl8sIHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkV2ZW50VHlwZS5XQVJOSU5HX1NUQVJURUQsIHRoaXMub25XYXJuaW5nU3RhcnRlZF8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5tZWRpYUluZm9XYXJuaW5nR2VuZXJhdG9yXywgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuRXZlbnRUeXBlLldBUk5JTkdfRU5ERUQsIHRoaXMub25XYXJuaW5nRW5kZWRfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuY29ubmVjdGl2aXR5V2FybmluZ0dlbmVyYXRvcl8sIHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLkV2ZW50VHlwZS5XQVJOSU5HX1NUQVJURUQsIHRoaXMub25XYXJuaW5nU3RhcnRlZF8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5jb25uZWN0aXZpdHlXYXJuaW5nR2VuZXJhdG9yXywgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuRXZlbnRUeXBlLldBUk5JTkdfRU5ERUQsIHRoaXMub25XYXJuaW5nRW5kZWRfKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUdlbmVyYXRvciwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVHZW5lcmF0b3IucHJvdG90eXBlLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoInRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUdlbmVyYXRvciIpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVHZW5lcmF0b3IuRXZlbnRzID0ge0lTU1VFX0dFTkVSQVRFRDoiaWciLCBJU1NVRV9URVJNSU5BVEVEOiJpdCJ9Owp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVHZW5lcmF0b3IuV2FybmluZ1RvSXNzdWVNYXBfID0gZ29vZy5vYmplY3QuY3JlYXRlKHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLlR5cGUuQVVESU8sIHsxMDA6dGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLk1JQ1JPUEhPTkVfTk9UX0RFVEVDVEVELCAxMDE6dGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLk1JQ1JPUEhPTkVfT1NfTVVURUQsIDEwMjp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTUlDUk9QSE9ORV9TSUxFTlQsIDEwMzp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTUlDUk9QSE9ORV9TQVRVUkFURUQsIDEwNDp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTUlDUk9QSE9ORV9OT1RfREVURUNURUQsIDIwMDp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuU1BFQUtFUlNfTk9UX0RFVEVDVEVEfSwgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuVHlwZS5WSURFTywgezEwMDp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuV0VCQ0FNX05PVF9ERVRFQ1RFRCwgCjEwMTp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuV0VCQ0FNX05PVF9ERVRFQ1RFRCwgMTAzOnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZS5XRUJDQU1fTk9UX0RFVEVDVEVEfSwgdGFsay5tZWRpYS5xdWFsaXR5Lldhcm5pbmcuVHlwZS5KTUlEQVRBLCB7NDp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuTk9fQVVESU9fU0VOVH0sIHRhbGsubWVkaWEucXVhbGl0eS5XYXJuaW5nLlR5cGUuQ09OTkVDVElWSVRZLCB7MTp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuVENQX0NPTk5FQ1RJT04sIDI6dGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLk5PX0NPTk5FQ1RJT059KTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlR2VuZXJhdG9yLklzc3VlR2VuZXJhdGVkRXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlR2VuZXJhdG9yJElzc3VlR2VuZXJhdGVkRXZlbnQkKGlzc3VlKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVHZW5lcmF0b3IuRXZlbnRzLklTU1VFX0dFTkVSQVRFRCk7CiAgdGhpcy5pc3N1ZSA9IGlzc3VlCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlR2VuZXJhdG9yLklzc3VlR2VuZXJhdGVkRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlR2VuZXJhdG9yLklzc3VlVGVybWluYXRlZEV2ZW50ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZUdlbmVyYXRvciRJc3N1ZVRlcm1pbmF0ZWRFdmVudCQoaXNzdWUpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUdlbmVyYXRvci5FdmVudHMuSVNTVUVfVEVSTUlOQVRFRCk7CiAgdGhpcy5pc3N1ZSA9IGlzc3VlCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlR2VuZXJhdG9yLklzc3VlVGVybWluYXRlZEV2ZW50LCBnb29nLmV2ZW50cy5FdmVudCk7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUdlbmVyYXRvci5wcm90b3R5cGUuaXNGb3JBY3RpdmVDYWxsXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWVHZW5lcmF0b3IkJGlzRm9yQWN0aXZlQ2FsbF8kKHdhcm5pbmcpIHsKICB2YXIgY2FsbCA9IHRoaXMuY2FsbE1hbmFnZXJfLmdldEFjdGl2ZUNhbGwoKTsKICByZXR1cm4hZ29vZy5pc0RlZkFuZE5vdE51bGwoY2FsbCkgfHwgY2FsbC5zZXNzaW9uSWQgIT0gd2FybmluZy5nZXRTZXNzaW9uSWQoKSA/ICh0aGlzLmxvZ2dlcl8ud2FybmluZygiVGhlIHdhcm5pbmcgcmVjZWl2ZWQgaXMgbm90IGZvciB0aGUgYWN0aXZlIGNhbGwiKSwgITEpIDogITAKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlR2VuZXJhdG9yLnByb3RvdHlwZS5vbldhcm5pbmdTdGFydGVkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWVHZW5lcmF0b3IkJG9uV2FybmluZ1N0YXJ0ZWRfJChlKSB7CiAgaWYodGhpcy5pc0ZvckFjdGl2ZUNhbGxfKGUud2FybmluZykpIHsKICAgIHRoaXMubG9nV2FybmluZ18oZS53YXJuaW5nLCBlLndhcm5pbmcuZ2V0U2Vzc2lvbklkKCkpOwogICAgdmFyIGlzc3VlID0gdGhpcy5nZXRJc3N1ZV8oZS53YXJuaW5nKTsKICAgIGdvb2cuaXNEZWZBbmROb3ROdWxsKGlzc3VlKSAmJiB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUdlbmVyYXRvci5Jc3N1ZUdlbmVyYXRlZEV2ZW50KGlzc3VlLmNyZWF0ZSgpKSkKICB9Cn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUdlbmVyYXRvci5wcm90b3R5cGUub25XYXJuaW5nRW5kZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZUdlbmVyYXRvciQkb25XYXJuaW5nRW5kZWRfJChlKSB7CiAgaWYodGhpcy5pc0ZvckFjdGl2ZUNhbGxfKGUud2FybmluZykpIHsKICAgIHRoaXMubG9nV2FybmluZ18oZS53YXJuaW5nLCBlLndhcm5pbmcuZ2V0U2Vzc2lvbklkKCksICEwKTsKICAgIHZhciBpc3N1ZSA9IHRoaXMuZ2V0SXNzdWVfKGUud2FybmluZyk7CiAgICBnb29nLmlzRGVmQW5kTm90TnVsbChpc3N1ZSkgJiYgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVHZW5lcmF0b3IuSXNzdWVUZXJtaW5hdGVkRXZlbnQoaXNzdWUuY3JlYXRlKCkpKQogIH0KfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlR2VuZXJhdG9yLnByb3RvdHlwZS5sb2dXYXJuaW5nXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWVHZW5lcmF0b3IkJGxvZ1dhcm5pbmdfJCh3YXJuaW5nLCBzZXNzaW9uSWQsIG9wdF9pc1Rlcm1pbmF0ZWQpIHsKICB0aGlzLmNhbGxNYW5hZ2VyXy5hZGRUb0xvZyh3YXJuaW5nLnRvU3RyaW5nKG9wdF9pc1Rlcm1pbmF0ZWQpKTsKICBpZihvcHRfaXNUZXJtaW5hdGVkKSB7CiAgICB2YXIgZW5kSW1wcmVzc2lvbiA9IHdhcm5pbmcuZ2V0RW5kSW1wcmVzc2lvbigpOwogICAgZ29vZy5pc0RlZkFuZE5vdE51bGwoZW5kSW1wcmVzc2lvbikgJiYgdGhpcy5pbXByZXNzaW9uUmVwb3J0ZXJfLnJlcG9ydENhbGxJbXByZXNzaW9uKGVuZEltcHJlc3Npb24sIHNlc3Npb25JZCkKICB9ZWxzZSB7CiAgICB0aGlzLmltcHJlc3Npb25SZXBvcnRlcl8ucmVwb3J0Q2FsbEltcHJlc3Npb24od2FybmluZy5nZXRTdGFydEltcHJlc3Npb24oKSwgc2Vzc2lvbklkKQogIH0KfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlR2VuZXJhdG9yLnByb3RvdHlwZS5nZXRJc3N1ZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlR2VuZXJhdG9yJCRnZXRJc3N1ZV8kKHdhcm5pbmcpIHsKICB2YXIgaXNzdWVzID0gdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlR2VuZXJhdG9yLldhcm5pbmdUb0lzc3VlTWFwX1t3YXJuaW5nLmdldFR5cGUoKV07CiAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwoaXNzdWVzKSkgewogICAgcmV0dXJuIGlzc3Vlc1t3YXJuaW5nLmdldENvZGUoKV0KICB9CiAgdGhpcy5sb2dnZXJfLndhcm5pbmcoIk5vIG1hdGNoaW5nIGlzc3VlIGZvdW5kIGZvciB3YXJuaW5nOiAiICsgd2FybmluZyk7CiAgcmV0dXJuIG51bGwKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlR2VuZXJhdG9yLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlR2VuZXJhdG9yJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cuZGlzcG9zZSh0aGlzLmV2ZW50SGFuZGxlcl8pOwogIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUdlbmVyYXRvci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVNYW5hZ2VyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZU1hbmFnZXIkKGNhbGxNYW5hZ2VyLCBhcHBDb250ZXh0KSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLmNhbGxNYW5hZ2VyXyA9IGNhbGxNYW5hZ2VyOwogIHRoaXMuaXNzdWVHZW5lcmF0b3JfID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUdlbmVyYXRvcihhcHBDb250ZXh0LCBjYWxsTWFuYWdlcik7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLmNvbGxlY3RvcnNfID0gbmV3IGdvb2cuc3RydWN0cy5NYXA7CiAgdGhpcy5zZXNzaW9uSWRzXyA9IG5ldyBnb29nLnN0cnVjdHMuQ2lyY3VsYXJCdWZmZXIodGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlci5NQVhfSVNTVUVfQ09MTEVDVE9SU18pOwogIHRoaXMuYWN0aXZlQ29sbGVjdG9yXyA9IHRoaXMubm9uQ2FsbENvbGxlY3Rvcl8gPSBuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlQ29sbGVjdG9yKG51bGwsIGNhbGxNYW5hZ2VyLmdldExvY2FsTmljaygpLCBudWxsKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKGNhbGxNYW5hZ2VyLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50Lk5FV19DQUxMLCB0aGlzLm9uTmV3Q2FsbF8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oY2FsbE1hbmFnZXIsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuQUNUSVZFX0NBTEwsIHRoaXMub25OZXdDYWxsXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3RlbihjYWxsTWFuYWdlciwgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5GQUlMRURfQ0FMTCwgdGhpcy5vbkNhbGxFbmRlZF8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oY2FsbE1hbmFnZXIsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuQ0FMTF9FTkRFRCwgdGhpcy5vbkNhbGxFbmRlZF8pOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5pc3N1ZUdlbmVyYXRvcl8sIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUdlbmVyYXRvci5FdmVudHMuSVNTVUVfR0VORVJBVEVELCB0aGlzLm9uSXNzdWVHZW5lcmF0ZWRfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuaXNzdWVHZW5lcmF0b3JfLCB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVHZW5lcmF0b3IuRXZlbnRzLklTU1VFX1RFUk1JTkFURUQsIHRoaXMub25Jc3N1ZVRlcm1pbmF0ZWRfKQp9Owpnb29nLmluaGVyaXRzKHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZU1hbmFnZXIsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlci5FdmVudCA9IHtJU1NVRVNfQ0hBTkdFRDoiaWMifTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3Vlc0NoYW5nZWRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWVzQ2hhbmdlZEV2ZW50JChjb2xsZWN0b3IpIHsKICBnb29nLmV2ZW50cy5FdmVudC5jYWxsKHRoaXMsIHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZU1hbmFnZXIuRXZlbnQuSVNTVUVTX0NIQU5HRUQpOwogIHRoaXMuY29sbGVjdG9yID0gY29sbGVjdG9yOwogIHRoaXMuc2Vzc2lvbklkID0gY29sbGVjdG9yLmdldFNlc3Npb25JZCgpCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5xdWFsaXR5Lklzc3Vlc0NoYW5nZWRFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVNYW5hZ2VyLk1BWF9JU1NVRV9DT0xMRUNUT1JTXyA9IDg7CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZU1hbmFnZXIucHJvdG90eXBlLmxvZ2dlcl8gPSBnb29nLmRlYnVnLkxvZ2dlci5nZXRMb2dnZXIoInRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZU1hbmFnZXIiKTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlci5yZWdpc3RlciA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWVNYW5hZ2VyJHJlZ2lzdGVyJChhcHBDb250ZXh0LCBjYWxsTWFuYWdlcikgewogIHZhciBpc3N1ZU1hbmFnZXIgPSBuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlcihjYWxsTWFuYWdlciwgYXBwQ29udGV4dCk7CiAgYXBwQ29udGV4dC5yZWdpc3RlclNlcnZpY2UodGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlci5TRVJWSUNFX0lELCBpc3N1ZU1hbmFnZXIpOwogIHJldHVybiBpc3N1ZU1hbmFnZXIKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlci5nZXQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlTWFuYWdlciRnZXQkKGFwcENvbnRleHQpIHsKICByZXR1cm4gYXBwQ29udGV4dC5nZXRPck51bGwodGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlci5TRVJWSUNFX0lEKQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVNYW5hZ2VyLnByb3RvdHlwZS5vbk5ld0NhbGxfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZU1hbmFnZXIkJG9uTmV3Q2FsbF8kKGUpIHsKICB2YXIgY29sbGVjdG9yID0gdGhpcy5jb2xsZWN0b3JzXy5nZXQoZS5zZXNzaW9uSWQpOwogIGNvbGxlY3RvciB8fCAoY29sbGVjdG9yID0gdGhpcy5jcmVhdGVJc3N1ZUNvbGxlY3Rvcl8oZS5zZXNzaW9uSWQsIHRoaXMuY2FsbE1hbmFnZXJfLmdldExvY2FsTmljaygpLCBlLmppZCksIHRoaXMuY29sbGVjdG9yc18uc2V0KGUuc2Vzc2lvbklkLCBjb2xsZWN0b3IpLCB0aGlzLmxvZ2dlcl8uaW5mbygiUmVnaXN0ZXJlZCBJc3N1ZUNvbGxlY3RvciBmb3IgY2FsbCAiICsgY29sbGVjdG9yLmdldFNlc3Npb25JZCgpKSk7CiAgdGhpcy5hY3RpdmVDb2xsZWN0b3JfID0gY29sbGVjdG9yCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZU1hbmFnZXIucHJvdG90eXBlLmNyZWF0ZUlzc3VlQ29sbGVjdG9yXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWVNYW5hZ2VyJCRjcmVhdGVJc3N1ZUNvbGxlY3Rvcl8kKHNlc3Npb25JZCwgbG9jYWxOaWNrLCByZW1vdGVKaWQpIHsKICB2YXIgbmV3Q29sbGVjdG9yID0gbmV3IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZUNvbGxlY3RvcihzZXNzaW9uSWQsIGxvY2FsTmljaywgcmVtb3RlSmlkKTsKICB0aGlzLm1heWJlUHJ1bmVPbGRlc3RDb2xsZWN0b3JfKCk7CiAgdGhpcy5zZXNzaW9uSWRzXy5hZGQobmV3Q29sbGVjdG9yLmdldFNlc3Npb25JZCgpKTsKICByZXR1cm4gbmV3Q29sbGVjdG9yCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZU1hbmFnZXIucHJvdG90eXBlLm1heWJlUHJ1bmVPbGRlc3RDb2xsZWN0b3JfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZU1hbmFnZXIkJG1heWJlUHJ1bmVPbGRlc3RDb2xsZWN0b3JfJCgpIHsKICBpZighKHRoaXMuc2Vzc2lvbklkc18uZ2V0Q291bnQoKSA8IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZU1hbmFnZXIuTUFYX0lTU1VFX0NPTExFQ1RPUlNfKSkgewogICAgdmFyIG9sZGVzdFNlc3Npb25JZCA9IHRoaXMuc2Vzc2lvbklkc18uZ2V0KDApLCBvbGRlc3RDb2xsZWN0b3IgPSB0aGlzLmNvbGxlY3RvcnNfLmdldChvbGRlc3RTZXNzaW9uSWQpOwogICAgb2xkZXN0Q29sbGVjdG9yID8gKHRoaXMuY29sbGVjdG9yc18ucmVtb3ZlKG9sZGVzdFNlc3Npb25JZCksIGdvb2cuZGlzcG9zZShvbGRlc3RDb2xsZWN0b3IpLCB0aGlzLmxvZ2dlcl8uaW5mbygiUHJ1bmVkIG9sZGVzdCBjb2xsZWN0b3IgZm9yICIgKyBvbGRlc3RTZXNzaW9uSWQpKSA6IHRoaXMubG9nZ2VyXy53YXJuaW5nKCJDb3VsZCBub3QgZmluZCBjb2xsZWN0b3IgZm9yICIgKyBvbGRlc3RTZXNzaW9uSWQgKyAiIT8iKQogIH0KfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlci5wcm90b3R5cGUub25DYWxsRW5kZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkcXVhbGl0eSRJc3N1ZU1hbmFnZXIkJG9uQ2FsbEVuZGVkXyQoZSkgewogIHZhciBjb2xsZWN0b3IgPSB0aGlzLmNvbGxlY3RvcnNfLmdldChlLnNlc3Npb25JZCk7CiAgY29sbGVjdG9yID8gKHRoaXMubG9nZ2VyXy5pbmZvKCJVbnJlZ2lzdGVyZWQgSXNzdWVDb2xsZWN0b3IgZm9yIGNhbGwgIiArIGNvbGxlY3Rvci5nZXRTZXNzaW9uSWQoKSksIHRoaXMuYWN0aXZlQ29sbGVjdG9yXyA9IHRoaXMubm9uQ2FsbENvbGxlY3Rvcl8pIDogdGhpcy5sb2dnZXJfLndhcm5pbmcoIkdvdCBDYWxsRW5kZWRFdmVudCBmb3IgdW5rbm93biBjYWxsICIgKyBlLnNlc3Npb25JZCkKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlci5wcm90b3R5cGUub25Jc3N1ZUdlbmVyYXRlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlTWFuYWdlciQkb25Jc3N1ZUdlbmVyYXRlZF8kKGUpIHsKICB0aGlzLmFjdGl2ZUNvbGxlY3Rvcl8udXBkYXRlQWN0aXZlSXNzdWVzKFtlLmlzc3VlXSk7CiAgdGhpcy5ub3RpZnlJc3N1ZXNDaGFuZ2VkXyh0aGlzLmFjdGl2ZUNvbGxlY3Rvcl8pCn07CnRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZU1hbmFnZXIucHJvdG90eXBlLm9uSXNzdWVUZXJtaW5hdGVkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJHF1YWxpdHkkSXNzdWVNYW5hZ2VyJCRvbklzc3VlVGVybWluYXRlZF8kKGUpIHsKICB0aGlzLmFjdGl2ZUNvbGxlY3Rvcl8ubWFya0lzc3VlUmVzb2x2ZWRCeVN5c3RlbShlLmlzc3VlKTsKICB0aGlzLm5vdGlmeUlzc3Vlc0NoYW5nZWRfKHRoaXMuYWN0aXZlQ29sbGVjdG9yXykKfTsKdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlci5wcm90b3R5cGUubm90aWZ5SXNzdWVzQ2hhbmdlZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlTWFuYWdlciQkbm90aWZ5SXNzdWVzQ2hhbmdlZF8kKGNvbGxlY3RvcikgewogIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3Vlc0NoYW5nZWRFdmVudChjb2xsZWN0b3IpKQp9Owp0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVNYW5hZ2VyLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRxdWFsaXR5JElzc3VlTWFuYWdlciQkZGlzcG9zZUludGVybmFsJCgpIHsKICBnb29nLmRpc3Bvc2UodGhpcy5ldmVudEhhbmRsZXJfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBudWxsOwogIGZvcih2YXIgY29sbGVjdG9ycyA9IHRoaXMuY29sbGVjdG9yc18uZ2V0VmFsdWVzKCksIGkgPSAwO2kgPCBjb2xsZWN0b3JzLmxlbmd0aDtpKyspIHsKICAgIGdvb2cuZGlzcG9zZShjb2xsZWN0b3JzW2ldKQogIH0KICB0aGlzLmNvbGxlY3RvcnNfLmNsZWFyKCk7CiAgdGhpcy5zZXNzaW9uSWRzXy5jbGVhcigpOwogIGdvb2cuZGlzcG9zZSh0aGlzLmlzc3VlR2VuZXJhdG9yXyk7CiAgdGhpcy5pc3N1ZUdlbmVyYXRvcl8gPSBudWxsOwogIGdvb2cuZGlzcG9zZSh0aGlzLm5vbkNhbGxDb2xsZWN0b3JfKTsKICB0aGlzLm5vbkNhbGxDb2xsZWN0b3JfID0gbnVsbDsKICB0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWVNYW5hZ2VyLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpCn07Cmdvb2cudWkgPSB7fTsKZ29vZy51aS5JZEdlbmVyYXRvciA9IGZ1bmN0aW9uICRnb29nJHVpJElkR2VuZXJhdG9yJCgpIHsKfTsKZ29vZy5hZGRTaW5nbGV0b25HZXR0ZXIoZ29vZy51aS5JZEdlbmVyYXRvcik7Cmdvb2cudWkuSWRHZW5lcmF0b3IucHJvdG90eXBlLm5leHRJZF8gPSAwOwpnb29nLnVpLklkR2VuZXJhdG9yLnByb3RvdHlwZS5nZXROZXh0VW5pcXVlSWQgPSBmdW5jdGlvbiAkZ29vZyR1aSRJZEdlbmVyYXRvciQkZ2V0TmV4dFVuaXF1ZUlkJCgpIHsKICByZXR1cm4iOiIgKyAodGhpcy5uZXh0SWRfKyspLnRvU3RyaW5nKDM2KQp9Owpnb29nLnVpLklkR2VuZXJhdG9yLmluc3RhbmNlID0gZ29vZy51aS5JZEdlbmVyYXRvci5nZXRJbnN0YW5jZSgpOwpnb29nLnVpLkNvbXBvbmVudCA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQob3B0X2RvbUhlbHBlcikgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgdGhpcy5kb21fID0gb3B0X2RvbUhlbHBlciB8fCBnb29nLmRvbS5nZXREb21IZWxwZXIoKTsKICB0aGlzLnJpZ2h0VG9MZWZ0XyA9IGdvb2cudWkuQ29tcG9uZW50LmRlZmF1bHRSaWdodFRvTGVmdF8KfTsKZ29vZy5pbmhlcml0cyhnb29nLnVpLkNvbXBvbmVudCwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuaWRHZW5lcmF0b3JfID0gZ29vZy51aS5JZEdlbmVyYXRvci5nZXRJbnN0YW5jZSgpOwpnb29nLnVpLkNvbXBvbmVudC5kZWZhdWx0UmlnaHRUb0xlZnRfID0gbnVsbDsKZ29vZy51aS5Db21wb25lbnQuRXZlbnRUeXBlID0ge0JFRk9SRV9TSE9XOiJiZWZvcmVzaG93IiwgU0hPVzoic2hvdyIsIEhJREU6ImhpZGUiLCBESVNBQkxFOiJkaXNhYmxlIiwgRU5BQkxFOiJlbmFibGUiLCBISUdITElHSFQ6ImhpZ2hsaWdodCIsIFVOSElHSExJR0hUOiJ1bmhpZ2hsaWdodCIsIEFDVElWQVRFOiJhY3RpdmF0ZSIsIERFQUNUSVZBVEU6ImRlYWN0aXZhdGUiLCBTRUxFQ1Q6InNlbGVjdCIsIFVOU0VMRUNUOiJ1bnNlbGVjdCIsIENIRUNLOiJjaGVjayIsIFVOQ0hFQ0s6InVuY2hlY2siLCBGT0NVUzoiZm9jdXMiLCBCTFVSOiJibHVyIiwgT1BFTjoib3BlbiIsIENMT1NFOiJjbG9zZSIsIEVOVEVSOiJlbnRlciIsIExFQVZFOiJsZWF2ZSIsIEFDVElPTjoiYWN0aW9uIiwgQ0hBTkdFOiJjaGFuZ2UifTsKZ29vZy51aS5Db21wb25lbnQuRXJyb3IgPSB7Tk9UX1NVUFBPUlRFRDoiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiLCBERUNPUkFURV9JTlZBTElEOiJJbnZhbGlkIGVsZW1lbnQgdG8gZGVjb3JhdGUiLCBBTFJFQURZX1JFTkRFUkVEOiJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIsIFBBUkVOVF9VTkFCTEVfVE9fQkVfU0VUOiJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiLCBDSElMRF9JTkRFWF9PVVRfT0ZfQk9VTkRTOiJDaGlsZCBjb21wb25lbnQgaW5kZXggb3V0IG9mIGJvdW5kcyIsIE5PVF9PVVJfQ0hJTEQ6IkNoaWxkIGlzIG5vdCBpbiBwYXJlbnQgY29tcG9uZW50IiwgTk9UX0lOX0RPQ1VNRU5UOiJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCB3aGlsZSBjb21wb25lbnQgaXMgbm90IGluIGRvY3VtZW50IiwgU1RBVEVfSU5WQUxJRDoiSW52YWxpZCBjb21wb25lbnQgc3RhdGUifTsKZ29vZy51aS5Db21wb25lbnQuU3RhdGUgPSB7QUxMOjI1NSwgRElTQUJMRUQ6MSwgSE9WRVI6MiwgQUNUSVZFOjQsIFNFTEVDVEVEOjgsIENIRUNLRUQ6MTYsIEZPQ1VTRUQ6MzIsIE9QRU5FRDo2NH07Cmdvb2cudWkuQ29tcG9uZW50LmdldFN0YXRlVHJhbnNpdGlvbkV2ZW50ID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JGdldFN0YXRlVHJhbnNpdGlvbkV2ZW50JChzdGF0ZSwgaXNFbnRlcmluZykgewogIHN3aXRjaChzdGF0ZSkgewogICAgY2FzZSBnb29nLnVpLkNvbXBvbmVudC5TdGF0ZS5ESVNBQkxFRDoKICAgICAgcmV0dXJuIGlzRW50ZXJpbmcgPyBnb29nLnVpLkNvbXBvbmVudC5FdmVudFR5cGUuRElTQUJMRSA6IGdvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZS5FTkFCTEU7CiAgICBjYXNlIGdvb2cudWkuQ29tcG9uZW50LlN0YXRlLkhPVkVSOgogICAgICByZXR1cm4gaXNFbnRlcmluZyA/IGdvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZS5ISUdITElHSFQgOiBnb29nLnVpLkNvbXBvbmVudC5FdmVudFR5cGUuVU5ISUdITElHSFQ7CiAgICBjYXNlIGdvb2cudWkuQ29tcG9uZW50LlN0YXRlLkFDVElWRToKICAgICAgcmV0dXJuIGlzRW50ZXJpbmcgPyBnb29nLnVpLkNvbXBvbmVudC5FdmVudFR5cGUuQUNUSVZBVEUgOiBnb29nLnVpLkNvbXBvbmVudC5FdmVudFR5cGUuREVBQ1RJVkFURTsKICAgIGNhc2UgZ29vZy51aS5Db21wb25lbnQuU3RhdGUuU0VMRUNURUQ6CiAgICAgIHJldHVybiBpc0VudGVyaW5nID8gZ29vZy51aS5Db21wb25lbnQuRXZlbnRUeXBlLlNFTEVDVCA6IGdvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZS5VTlNFTEVDVDsKICAgIGNhc2UgZ29vZy51aS5Db21wb25lbnQuU3RhdGUuQ0hFQ0tFRDoKICAgICAgcmV0dXJuIGlzRW50ZXJpbmcgPyBnb29nLnVpLkNvbXBvbmVudC5FdmVudFR5cGUuQ0hFQ0sgOiBnb29nLnVpLkNvbXBvbmVudC5FdmVudFR5cGUuVU5DSEVDSzsKICAgIGNhc2UgZ29vZy51aS5Db21wb25lbnQuU3RhdGUuRk9DVVNFRDoKICAgICAgcmV0dXJuIGlzRW50ZXJpbmcgPyBnb29nLnVpLkNvbXBvbmVudC5FdmVudFR5cGUuRk9DVVMgOiBnb29nLnVpLkNvbXBvbmVudC5FdmVudFR5cGUuQkxVUjsKICAgIGNhc2UgZ29vZy51aS5Db21wb25lbnQuU3RhdGUuT1BFTkVEOgogICAgICByZXR1cm4gaXNFbnRlcmluZyA/IGdvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZS5PUEVOIDogZ29vZy51aS5Db21wb25lbnQuRXZlbnRUeXBlLkNMT1NFCiAgfQogIHRocm93IEVycm9yKGdvb2cudWkuQ29tcG9uZW50LkVycm9yLlNUQVRFX0lOVkFMSUQpOwp9Owpnb29nLnVpLkNvbXBvbmVudC5zZXREZWZhdWx0UmlnaHRUb0xlZnQgPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkc2V0RGVmYXVsdFJpZ2h0VG9MZWZ0JChyaWdodFRvTGVmdCkgewogIGdvb2cudWkuQ29tcG9uZW50LmRlZmF1bHRSaWdodFRvTGVmdF8gPSByaWdodFRvTGVmdAp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuaWRfID0gbnVsbDsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmluRG9jdW1lbnRfID0gITE7Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5lbGVtZW50XyA9IG51bGw7Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5yaWdodFRvTGVmdF8gPSBudWxsOwpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUucGFyZW50XyA9IG51bGw7Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5jaGlsZHJlbl8gPSBudWxsOwpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuY2hpbGRJbmRleF8gPSBudWxsOwpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUud2FzRGVjb3JhdGVkXyA9ICExOwpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuZ2V0SWQgPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkJGdldElkJCgpIHsKICByZXR1cm4gdGhpcy5pZF8gfHwgKHRoaXMuaWRfID0gdGhpcy5pZEdlbmVyYXRvcl8uZ2V0TmV4dFVuaXF1ZUlkKCkpCn07Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRnZXRFbGVtZW50JCgpIHsKICByZXR1cm4gdGhpcy5lbGVtZW50Xwp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuc2V0RWxlbWVudEludGVybmFsID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRzZXRFbGVtZW50SW50ZXJuYWwkKGVsZW1lbnQpIHsKICB0aGlzLmVsZW1lbnRfID0gZWxlbWVudAp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeUNsYXNzID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRnZXRFbGVtZW50c0J5Q2xhc3MkKGNsYXNzTmFtZSkgewogIHJldHVybiB0aGlzLmVsZW1lbnRfID8gdGhpcy5kb21fLmdldEVsZW1lbnRzQnlDbGFzcyhjbGFzc05hbWUsIHRoaXMuZWxlbWVudF8pIDogW10KfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmdldEVsZW1lbnRCeUNsYXNzID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRnZXRFbGVtZW50QnlDbGFzcyQoY2xhc3NOYW1lKSB7CiAgcmV0dXJuIHRoaXMuZWxlbWVudF8gPyB0aGlzLmRvbV8uZ2V0RWxlbWVudEJ5Q2xhc3MoY2xhc3NOYW1lLCB0aGlzLmVsZW1lbnRfKSA6IG51bGwKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmdldEhhbmRsZXIgPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkJGdldEhhbmRsZXIkKCkgewogIHJldHVybiB0aGlzLmdvb2dVaUNvbXBvbmVudEhhbmRsZXJfIHx8ICh0aGlzLmdvb2dVaUNvbXBvbmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKSkKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkc2V0UGFyZW50JChwYXJlbnQpIHsKICBpZih0aGlzID09IHBhcmVudCkgewogICAgdGhyb3cgRXJyb3IoZ29vZy51aS5Db21wb25lbnQuRXJyb3IuUEFSRU5UX1VOQUJMRV9UT19CRV9TRVQpOwogIH0KICBpZihwYXJlbnQgJiYgdGhpcy5wYXJlbnRfICYmIHRoaXMuaWRfICYmIHRoaXMucGFyZW50Xy5nZXRDaGlsZCh0aGlzLmlkXykgJiYgdGhpcy5wYXJlbnRfICE9IHBhcmVudCkgewogICAgdGhyb3cgRXJyb3IoZ29vZy51aS5Db21wb25lbnQuRXJyb3IuUEFSRU5UX1VOQUJMRV9UT19CRV9TRVQpOwogIH0KICB0aGlzLnBhcmVudF8gPSBwYXJlbnQ7CiAgZ29vZy51aS5Db21wb25lbnQuc3VwZXJDbGFzc18uc2V0UGFyZW50RXZlbnRUYXJnZXQuY2FsbCh0aGlzLCBwYXJlbnQpCn07Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5nZXRQYXJlbnQgPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkJGdldFBhcmVudCQoKSB7CiAgcmV0dXJuIHRoaXMucGFyZW50Xwp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuc2V0UGFyZW50RXZlbnRUYXJnZXQgPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkJHNldFBhcmVudEV2ZW50VGFyZ2V0JChwYXJlbnQpIHsKICBpZih0aGlzLnBhcmVudF8gJiYgdGhpcy5wYXJlbnRfICE9IHBhcmVudCkgewogICAgdGhyb3cgRXJyb3IoZ29vZy51aS5Db21wb25lbnQuRXJyb3IuTk9UX1NVUFBPUlRFRCk7CiAgfQogIGdvb2cudWkuQ29tcG9uZW50LnN1cGVyQ2xhc3NfLnNldFBhcmVudEV2ZW50VGFyZ2V0LmNhbGwodGhpcywgcGFyZW50KQp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuZ2V0RG9tSGVscGVyID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRnZXREb21IZWxwZXIkKCkgewogIHJldHVybiB0aGlzLmRvbV8KfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmlzSW5Eb2N1bWVudCA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkaXNJbkRvY3VtZW50JCgpIHsKICByZXR1cm4gdGhpcy5pbkRvY3VtZW50Xwp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRG9tID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRjcmVhdGVEb20kKCkgewogIHRoaXMuZWxlbWVudF8gPSB0aGlzLmRvbV8uY3JlYXRlRWxlbWVudCgiZGl2IikKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLnJlbmRlcl8gPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkJHJlbmRlcl8kKG9wdF9wYXJlbnRFbGVtZW50LCBvcHRfYmVmb3JlTm9kZSkgewogIGlmKHRoaXMuaW5Eb2N1bWVudF8pIHsKICAgIHRocm93IEVycm9yKGdvb2cudWkuQ29tcG9uZW50LkVycm9yLkFMUkVBRFlfUkVOREVSRUQpOwogIH0KICB0aGlzLmVsZW1lbnRfIHx8IHRoaXMuY3JlYXRlRG9tKCk7CiAgb3B0X3BhcmVudEVsZW1lbnQgPyBvcHRfcGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50Xywgb3B0X2JlZm9yZU5vZGUgfHwgbnVsbCkgOiB0aGlzLmRvbV8uZ2V0RG9jdW1lbnQoKS5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudF8pOwogICghdGhpcy5wYXJlbnRfIHx8IHRoaXMucGFyZW50Xy5pc0luRG9jdW1lbnQoKSkgJiYgdGhpcy5lbnRlckRvY3VtZW50KCkKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmRlY29yYXRlID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRkZWNvcmF0ZSQoZWxlbWVudCkgewogIGlmKHRoaXMuaW5Eb2N1bWVudF8pIHsKICAgIHRocm93IEVycm9yKGdvb2cudWkuQ29tcG9uZW50LkVycm9yLkFMUkVBRFlfUkVOREVSRUQpOwogIH0KICBpZihlbGVtZW50ICYmIHRoaXMuY2FuRGVjb3JhdGUoZWxlbWVudCkpIHsKICAgIHRoaXMud2FzRGVjb3JhdGVkXyA9ICEwOwogICAgaWYoIXRoaXMuZG9tXyB8fCB0aGlzLmRvbV8uZ2V0RG9jdW1lbnQoKSAhPSBnb29nLmRvbS5nZXRPd25lckRvY3VtZW50KGVsZW1lbnQpKSB7CiAgICAgIHRoaXMuZG9tXyA9IGdvb2cuZG9tLmdldERvbUhlbHBlcihlbGVtZW50KQogICAgfQogICAgdGhpcy5kZWNvcmF0ZUludGVybmFsKGVsZW1lbnQpOwogICAgdGhpcy5lbnRlckRvY3VtZW50KCkKICB9ZWxzZSB7CiAgICB0aHJvdyBFcnJvcihnb29nLnVpLkNvbXBvbmVudC5FcnJvci5ERUNPUkFURV9JTlZBTElEKTsKICB9Cn07Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5jYW5EZWNvcmF0ZSA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkY2FuRGVjb3JhdGUkKCkgewogIHJldHVybiEwCn07Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5kZWNvcmF0ZUludGVybmFsID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRkZWNvcmF0ZUludGVybmFsJChlbGVtZW50KSB7CiAgdGhpcy5lbGVtZW50XyA9IGVsZW1lbnQKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmVudGVyRG9jdW1lbnQgPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkJGVudGVyRG9jdW1lbnQkKCkgewogIHRoaXMuaW5Eb2N1bWVudF8gPSAhMDsKICB0aGlzLmZvckVhY2hDaGlsZChmdW5jdGlvbihjaGlsZCkgewogICAgIWNoaWxkLmlzSW5Eb2N1bWVudCgpICYmIGNoaWxkLmdldEVsZW1lbnQoKSAmJiBjaGlsZC5lbnRlckRvY3VtZW50KCkKICB9KQp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuZXhpdERvY3VtZW50ID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRleGl0RG9jdW1lbnQkKCkgewogIHRoaXMuZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGNoaWxkKSB7CiAgICBjaGlsZC5pc0luRG9jdW1lbnQoKSAmJiBjaGlsZC5leGl0RG9jdW1lbnQoKQogIH0pOwogIHRoaXMuZ29vZ1VpQ29tcG9uZW50SGFuZGxlcl8gJiYgdGhpcy5nb29nVWlDb21wb25lbnRIYW5kbGVyXy5yZW1vdmVBbGwoKTsKICB0aGlzLmluRG9jdW1lbnRfID0gITEKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkZGlzcG9zZUludGVybmFsJCgpIHsKICBnb29nLnVpLkNvbXBvbmVudC5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKTsKICB0aGlzLmluRG9jdW1lbnRfICYmIHRoaXMuZXhpdERvY3VtZW50KCk7CiAgdGhpcy5nb29nVWlDb21wb25lbnRIYW5kbGVyXyAmJiAodGhpcy5nb29nVWlDb21wb25lbnRIYW5kbGVyXy5kaXNwb3NlKCksIGRlbGV0ZSB0aGlzLmdvb2dVaUNvbXBvbmVudEhhbmRsZXJfKTsKICB0aGlzLmZvckVhY2hDaGlsZChmdW5jdGlvbihjaGlsZCkgewogICAgY2hpbGQuZGlzcG9zZSgpCiAgfSk7CiAgIXRoaXMud2FzRGVjb3JhdGVkXyAmJiB0aGlzLmVsZW1lbnRfICYmIGdvb2cuZG9tLnJlbW92ZU5vZGUodGhpcy5lbGVtZW50Xyk7CiAgdGhpcy5wYXJlbnRfID0gdGhpcy5lbGVtZW50XyA9IHRoaXMuY2hpbGRJbmRleF8gPSB0aGlzLmNoaWxkcmVuXyA9IG51bGwKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLm1ha2VJZCA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkbWFrZUlkJChpZEZyYWdtZW50KSB7CiAgcmV0dXJuIHRoaXMuZ2V0SWQoKSArICIuIiArIGlkRnJhZ21lbnQKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmdldEVsZW1lbnRCeUZyYWdtZW50ID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRnZXRFbGVtZW50QnlGcmFnbWVudCQoaWRGcmFnbWVudCkgewogIGlmKCF0aGlzLmluRG9jdW1lbnRfKSB7CiAgICB0aHJvdyBFcnJvcihnb29nLnVpLkNvbXBvbmVudC5FcnJvci5OT1RfSU5fRE9DVU1FTlQpOwogIH0KICByZXR1cm4gdGhpcy5kb21fLmdldEVsZW1lbnQodGhpcy5tYWtlSWQoaWRGcmFnbWVudCkpCn07Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5hZGRDaGlsZCA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkYWRkQ2hpbGQkKGNoaWxkLCBvcHRfcmVuZGVyKSB7CiAgdGhpcy5hZGRDaGlsZEF0KGNoaWxkLCB0aGlzLmdldENoaWxkQ291bnQoKSwgb3B0X3JlbmRlcikKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmFkZENoaWxkQXQgPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkJGFkZENoaWxkQXQkKGNoaWxkLCBpbmRleCwgb3B0X3JlbmRlcikgewogIGlmKGNoaWxkLmluRG9jdW1lbnRfICYmIChvcHRfcmVuZGVyIHx8ICF0aGlzLmluRG9jdW1lbnRfKSkgewogICAgdGhyb3cgRXJyb3IoZ29vZy51aS5Db21wb25lbnQuRXJyb3IuQUxSRUFEWV9SRU5ERVJFRCk7CiAgfQogIGlmKDAgPiBpbmRleCB8fCBpbmRleCA+IHRoaXMuZ2V0Q2hpbGRDb3VudCgpKSB7CiAgICB0aHJvdyBFcnJvcihnb29nLnVpLkNvbXBvbmVudC5FcnJvci5DSElMRF9JTkRFWF9PVVRfT0ZfQk9VTkRTKTsKICB9CiAgaWYoIXRoaXMuY2hpbGRJbmRleF8gfHwgIXRoaXMuY2hpbGRyZW5fKSB7CiAgICB0aGlzLmNoaWxkSW5kZXhfID0ge30sIHRoaXMuY2hpbGRyZW5fID0gW10KICB9CiAgY2hpbGQuZ2V0UGFyZW50KCkgPT0gdGhpcyA/IChnb29nLm9iamVjdC5zZXQodGhpcy5jaGlsZEluZGV4XywgY2hpbGQuZ2V0SWQoKSwgY2hpbGQpLCBnb29nLmFycmF5LnJlbW92ZSh0aGlzLmNoaWxkcmVuXywgY2hpbGQpKSA6IGdvb2cub2JqZWN0LmFkZCh0aGlzLmNoaWxkSW5kZXhfLCBjaGlsZC5nZXRJZCgpLCBjaGlsZCk7CiAgY2hpbGQuc2V0UGFyZW50KHRoaXMpOwogIGdvb2cuYXJyYXkuaW5zZXJ0QXQodGhpcy5jaGlsZHJlbl8sIGNoaWxkLCBpbmRleCk7CiAgaWYoY2hpbGQuaW5Eb2N1bWVudF8gJiYgdGhpcy5pbkRvY3VtZW50XyAmJiBjaGlsZC5nZXRQYXJlbnQoKSA9PSB0aGlzKSB7CiAgICB2YXIgY29udGVudEVsZW1lbnQgPSB0aGlzLmdldENvbnRlbnRFbGVtZW50KCk7CiAgICBjb250ZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoY2hpbGQuZ2V0RWxlbWVudCgpLCBjb250ZW50RWxlbWVudC5jaGlsZE5vZGVzW2luZGV4XSB8fCBudWxsKQogIH1lbHNlIHsKICAgIGlmKG9wdF9yZW5kZXIpIHsKICAgICAgdGhpcy5lbGVtZW50XyB8fCB0aGlzLmNyZWF0ZURvbSgpOwogICAgICB2YXIgc2libGluZyA9IHRoaXMuZ2V0Q2hpbGRBdChpbmRleCArIDEpOwogICAgICBjaGlsZC5yZW5kZXJfKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSwgc2libGluZyA/IHNpYmxpbmcuZWxlbWVudF8gOiBudWxsKQogICAgfWVsc2UgewogICAgICB0aGlzLmluRG9jdW1lbnRfICYmICFjaGlsZC5pbkRvY3VtZW50XyAmJiBjaGlsZC5lbGVtZW50XyAmJiBjaGlsZC5lbnRlckRvY3VtZW50KCkKICAgIH0KICB9Cn07Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5nZXRDb250ZW50RWxlbWVudCA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkZ2V0Q29udGVudEVsZW1lbnQkKCkgewogIHJldHVybiB0aGlzLmVsZW1lbnRfCn07Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5pc1JpZ2h0VG9MZWZ0ID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRpc1JpZ2h0VG9MZWZ0JCgpIHsKICBudWxsID09IHRoaXMucmlnaHRUb0xlZnRfICYmICh0aGlzLnJpZ2h0VG9MZWZ0XyA9IGdvb2cuc3R5bGUuaXNSaWdodFRvTGVmdCh0aGlzLmluRG9jdW1lbnRfID8gdGhpcy5lbGVtZW50XyA6IHRoaXMuZG9tXy5nZXREb2N1bWVudCgpLmJvZHkpKTsKICByZXR1cm4gdGhpcy5yaWdodFRvTGVmdF8KfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmhhc0NoaWxkcmVuID0gZnVuY3Rpb24gJGdvb2ckdWkkQ29tcG9uZW50JCRoYXNDaGlsZHJlbiQoKSB7CiAgcmV0dXJuISF0aGlzLmNoaWxkcmVuXyAmJiAwICE9IHRoaXMuY2hpbGRyZW5fLmxlbmd0aAp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuZ2V0Q2hpbGRDb3VudCA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkZ2V0Q2hpbGRDb3VudCQoKSB7CiAgcmV0dXJuIHRoaXMuY2hpbGRyZW5fID8gdGhpcy5jaGlsZHJlbl8ubGVuZ3RoIDogMAp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuZ2V0Q2hpbGQgPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkJGdldENoaWxkJChpZCkgewogIHJldHVybiB0aGlzLmNoaWxkSW5kZXhfICYmIGlkID8gZ29vZy5vYmplY3QuZ2V0KHRoaXMuY2hpbGRJbmRleF8sIGlkKSB8fCBudWxsIDogbnVsbAp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUuZ2V0Q2hpbGRBdCA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkZ2V0Q2hpbGRBdCQoaW5kZXgpIHsKICByZXR1cm4gdGhpcy5jaGlsZHJlbl8gPyB0aGlzLmNoaWxkcmVuX1tpbmRleF0gfHwgbnVsbCA6IG51bGwKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLmZvckVhY2hDaGlsZCA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkZm9yRWFjaENoaWxkJChmLCBvcHRfb2JqKSB7CiAgdGhpcy5jaGlsZHJlbl8gJiYgZ29vZy5hcnJheS5mb3JFYWNoKHRoaXMuY2hpbGRyZW5fLCBmLCBvcHRfb2JqKQp9Owpnb29nLnVpLkNvbXBvbmVudC5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkJHJlbW92ZUNoaWxkJChjaGlsZCwgb3B0X3VucmVuZGVyKSB7CiAgaWYoY2hpbGQpIHsKICAgIHZhciBpZCA9IGdvb2cuaXNTdHJpbmcoY2hpbGQpID8gY2hpbGQgOiBjaGlsZC5nZXRJZCgpLCBjaGlsZCA9IHRoaXMuZ2V0Q2hpbGQoaWQpOwogICAgaWQgJiYgY2hpbGQgJiYgKGdvb2cub2JqZWN0LnJlbW92ZSh0aGlzLmNoaWxkSW5kZXhfLCBpZCksIGdvb2cuYXJyYXkucmVtb3ZlKHRoaXMuY2hpbGRyZW5fLCBjaGlsZCksIG9wdF91bnJlbmRlciAmJiAoY2hpbGQuZXhpdERvY3VtZW50KCksIGNoaWxkLmVsZW1lbnRfICYmIGdvb2cuZG9tLnJlbW92ZU5vZGUoY2hpbGQuZWxlbWVudF8pKSwgY2hpbGQuc2V0UGFyZW50KG51bGwpKQogIH0KICBpZighY2hpbGQpIHsKICAgIHRocm93IEVycm9yKGdvb2cudWkuQ29tcG9uZW50LkVycm9yLk5PVF9PVVJfQ0hJTEQpOwogIH0KICByZXR1cm4gY2hpbGQKfTsKZ29vZy51aS5Db21wb25lbnQucHJvdG90eXBlLnJlbW92ZUNoaWxkQXQgPSBmdW5jdGlvbiAkZ29vZyR1aSRDb21wb25lbnQkJHJlbW92ZUNoaWxkQXQkKGluZGV4LCBvcHRfdW5yZW5kZXIpIHsKICByZXR1cm4gdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmdldENoaWxkQXQoaW5kZXgpLCBvcHRfdW5yZW5kZXIpCn07Cmdvb2cudWkuQ29tcG9uZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZHJlbiA9IGZ1bmN0aW9uICRnb29nJHVpJENvbXBvbmVudCQkcmVtb3ZlQ2hpbGRyZW4kKG9wdF91bnJlbmRlcikgewogIGZvcig7dGhpcy5oYXNDaGlsZHJlbigpOykgewogICAgdGhpcy5yZW1vdmVDaGlsZEF0KDAsIG9wdF91bnJlbmRlcikKICB9Cn07Cmdvb2cuZnggPSB7fTsKZ29vZy5meC5EcmFnZ2VyID0gZnVuY3Rpb24gJGdvb2ckZngkRHJhZ2dlciQodGFyZ2V0LCBvcHRfaGFuZGxlLCBvcHRfbGltaXRzKSB7CiAgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTsKICB0aGlzLnRhcmdldCA9IHRhcmdldDsKICB0aGlzLmhhbmRsZSA9IG9wdF9oYW5kbGUgfHwgdGFyZ2V0OwogIHRoaXMubGltaXRzID0gb3B0X2xpbWl0cyB8fCBuZXcgZ29vZy5tYXRoLlJlY3QoTmFOLCBOYU4sIE5hTiwgTmFOKTsKICB0aGlzLmRvY3VtZW50XyA9IGdvb2cuZG9tLmdldE93bmVyRG9jdW1lbnQodGFyZ2V0KTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIGdvb2cuZXZlbnRzLmxpc3Rlbih0aGlzLmhhbmRsZSwgW2dvb2cuZXZlbnRzLkV2ZW50VHlwZS5UT1VDSFNUQVJULCBnb29nLmV2ZW50cy5FdmVudFR5cGUuTU9VU0VET1dOXSwgdGhpcy5zdGFydERyYWcsICExLCB0aGlzKQp9Owpnb29nLmluaGVyaXRzKGdvb2cuZnguRHJhZ2dlciwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwpnb29nLmZ4LkRyYWdnZXIuSEFTX1NFVF9DQVBUVVJFXyA9IGdvb2cudXNlckFnZW50LklFIHx8IGdvb2cudXNlckFnZW50LkdFQ0tPICYmIGdvb2cudXNlckFnZW50LmlzVmVyc2lvbigiMS45LjMiKTsKZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZSA9IHtFQVJMWV9DQU5DRUw6ImVhcmx5Y2FuY2VsIiwgU1RBUlQ6InN0YXJ0IiwgQkVGT1JFRFJBRzoiYmVmb3JlZHJhZyIsIERSQUc6ImRyYWciLCBFTkQ6ImVuZCJ9Owpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLmNsaWVudFggPSAwOwpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLmNsaWVudFkgPSAwOwpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLnNjcmVlblggPSAwOwpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLnNjcmVlblkgPSAwOwpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLnN0YXJ0WCA9IDA7Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUuc3RhcnRZID0gMDsKZ29vZy5meC5EcmFnZ2VyLnByb3RvdHlwZS5kZWx0YVggPSAwOwpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLmRlbHRhWSA9IDA7Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUuZW5hYmxlZF8gPSAhMDsKZ29vZy5meC5EcmFnZ2VyLnByb3RvdHlwZS5kcmFnZ2luZ18gPSAhMTsKZ29vZy5meC5EcmFnZ2VyLnByb3RvdHlwZS5oeXN0ZXJlc2lzRGlzdGFuY2VTcXVhcmVkXyA9IDA7Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUuaWVEcmFnU3RhcnRDYW5jZWxsaW5nT25fID0gITE7Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUuZ2V0SGFuZGxlciA9IGZ1bmN0aW9uICRnb29nJGZ4JERyYWdnZXIkJGdldEhhbmRsZXIkKCkgewogIHJldHVybiB0aGlzLmV2ZW50SGFuZGxlcl8KfTsKZ29vZy5meC5EcmFnZ2VyLnByb3RvdHlwZS5zZXRMaW1pdHMgPSBmdW5jdGlvbiAkZ29vZyRmeCREcmFnZ2VyJCRzZXRMaW1pdHMkKGxpbWl0cykgewogIHRoaXMubGltaXRzID0gbGltaXRzIHx8IG5ldyBnb29nLm1hdGguUmVjdChOYU4sIE5hTiwgTmFOLCBOYU4pCn07Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUuc2V0RW5hYmxlZCA9IGZ1bmN0aW9uICRnb29nJGZ4JERyYWdnZXIkJHNldEVuYWJsZWQkKGVuYWJsZWQpIHsKICB0aGlzLmVuYWJsZWRfID0gZW5hYmxlZAp9Owpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRnb29nJGZ4JERyYWdnZXIkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgZ29vZy5meC5EcmFnZ2VyLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpOwogIGdvb2cuZXZlbnRzLnVubGlzdGVuKHRoaXMuaGFuZGxlLCBbZ29vZy5ldmVudHMuRXZlbnRUeXBlLlRPVUNIU1RBUlQsIGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5NT1VTRURPV05dLCB0aGlzLnN0YXJ0RHJhZywgITEsIHRoaXMpOwogIHRoaXMuZXZlbnRIYW5kbGVyXy5kaXNwb3NlKCk7CiAgZGVsZXRlIHRoaXMudGFyZ2V0OwogIGRlbGV0ZSB0aGlzLmhhbmRsZTsKICBkZWxldGUgdGhpcy5ldmVudEhhbmRsZXJfCn07Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUuc3RhcnREcmFnID0gZnVuY3Rpb24gJGdvb2ckZngkRHJhZ2dlciQkc3RhcnREcmFnJChlKSB7CiAgdmFyIGlzTW91c2VEb3duID0gZS50eXBlID09IGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5NT1VTRURPV047CiAgaWYodGhpcy5lbmFibGVkXyAmJiAhdGhpcy5kcmFnZ2luZ18gJiYgKCFpc01vdXNlRG93biB8fCBlLmlzTW91c2VBY3Rpb25CdXR0b24oKSkpIHsKICAgIHRoaXMubWF5YmVSZWluaXRUb3VjaEV2ZW50XyhlKTsKICAgIGlmKDAgPT0gdGhpcy5oeXN0ZXJlc2lzRGlzdGFuY2VTcXVhcmVkXykgewogICAgICBpZih0aGlzLmluaXRpYWxpemVEcmFnXyhlKSwgdGhpcy5kcmFnZ2luZ18pIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgfWVsc2UgewogICAgICAgIHJldHVybgogICAgICB9CiAgICB9ZWxzZSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgfQogICAgdGhpcy5zZXR1cERyYWdIYW5kbGVycygpOwogICAgdGhpcy5jbGllbnRYID0gdGhpcy5zdGFydFggPSBlLmNsaWVudFg7CiAgICB0aGlzLmNsaWVudFkgPSB0aGlzLnN0YXJ0WSA9IGUuY2xpZW50WTsKICAgIHRoaXMuc2NyZWVuWCA9IGUuc2NyZWVuWDsKICAgIHRoaXMuc2NyZWVuWSA9IGUuc2NyZWVuWTsKICAgIHRoaXMuZGVsdGFYID0gdGhpcy50YXJnZXQub2Zmc2V0TGVmdDsKICAgIHRoaXMuZGVsdGFZID0gdGhpcy50YXJnZXQub2Zmc2V0VG9wOwogICAgdGhpcy5wYWdlU2Nyb2xsID0gZ29vZy5kb20uZ2V0RG9tSGVscGVyKHRoaXMuZG9jdW1lbnRfKS5nZXREb2N1bWVudFNjcm9sbCgpOwogICAgZ29vZy5ub3coKQogIH1lbHNlIHsKICAgIHRoaXMuZGlzcGF0Y2hFdmVudChnb29nLmZ4LkRyYWdnZXIuRXZlbnRUeXBlLkVBUkxZX0NBTkNFTCkKICB9Cn07Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUuc2V0dXBEcmFnSGFuZGxlcnMgPSBmdW5jdGlvbiAkZ29vZyRmeCREcmFnZ2VyJCRzZXR1cERyYWdIYW5kbGVycyQoKSB7CiAgdmFyIGRvYyA9IHRoaXMuZG9jdW1lbnRfLCBkb2NFbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQsIHVzZUNhcHR1cmUgPSAhZ29vZy5meC5EcmFnZ2VyLkhBU19TRVRfQ0FQVFVSRV87CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbihkb2MsIFtnb29nLmV2ZW50cy5FdmVudFR5cGUuVE9VQ0hNT1ZFLCBnb29nLmV2ZW50cy5FdmVudFR5cGUuTU9VU0VNT1ZFXSwgdGhpcy5oYW5kbGVNb3ZlXywgdXNlQ2FwdHVyZSk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbihkb2MsIFtnb29nLmV2ZW50cy5FdmVudFR5cGUuVE9VQ0hFTkQsIGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5NT1VTRVVQXSwgdGhpcy5lbmREcmFnLCB1c2VDYXB0dXJlKTsKICBnb29nLmZ4LkRyYWdnZXIuSEFTX1NFVF9DQVBUVVJFXyA/IChkb2NFbC5zZXRDYXB0dXJlKCExKSwgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbihkb2NFbCwgZ29vZy5ldmVudHMuRXZlbnRUeXBlLkxPU0VDQVBUVVJFLCB0aGlzLmVuZERyYWcpKSA6IHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oZ29vZy5kb20uZ2V0V2luZG93KGRvYyksIGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5CTFVSLCB0aGlzLmVuZERyYWcpOwogIGdvb2cudXNlckFnZW50LklFICYmIHRoaXMuaWVEcmFnU3RhcnRDYW5jZWxsaW5nT25fICYmIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4oZG9jLCBnb29nLmV2ZW50cy5FdmVudFR5cGUuRFJBR1NUQVJULCBnb29nLmV2ZW50cy5FdmVudC5wcmV2ZW50RGVmYXVsdCk7CiAgdGhpcy5zY3JvbGxUYXJnZXRfICYmIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5zY3JvbGxUYXJnZXRfLCBnb29nLmV2ZW50cy5FdmVudFR5cGUuU0NST0xMLCB0aGlzLm9uU2Nyb2xsXywgdXNlQ2FwdHVyZSkKfTsKZ29vZy5meC5EcmFnZ2VyLnByb3RvdHlwZS5pbml0aWFsaXplRHJhZ18gPSBmdW5jdGlvbiAkZ29vZyRmeCREcmFnZ2VyJCRpbml0aWFsaXplRHJhZ18kKGUpIHsKICB2YXIgcnYgPSB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGdvb2cuZnguRHJhZ0V2ZW50KGdvb2cuZnguRHJhZ2dlci5FdmVudFR5cGUuU1RBUlQsIHRoaXMsIGUuY2xpZW50WCwgZS5jbGllbnRZLCBlKSk7CiAgITEgIT09IHJ2ICYmICh0aGlzLmRyYWdnaW5nXyA9ICEwKQp9Owpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLmVuZERyYWcgPSBmdW5jdGlvbiAkZ29vZyRmeCREcmFnZ2VyJCRlbmREcmFnJChlLCBvcHRfZHJhZ0NhbmNlbGVkKSB7CiAgdGhpcy5ldmVudEhhbmRsZXJfLnJlbW92ZUFsbCgpOwogIGdvb2cuZnguRHJhZ2dlci5IQVNfU0VUX0NBUFRVUkVfICYmIHRoaXMuZG9jdW1lbnRfLnJlbGVhc2VDYXB0dXJlKCk7CiAgdmFyIHggPSB0aGlzLmxpbWl0WCh0aGlzLmRlbHRhWCksIHkgPSB0aGlzLmxpbWl0WSh0aGlzLmRlbHRhWSk7CiAgaWYodGhpcy5kcmFnZ2luZ18pIHsKICAgIHRoaXMubWF5YmVSZWluaXRUb3VjaEV2ZW50XyhlKTsKICAgIHRoaXMuZHJhZ2dpbmdfID0gITE7CiAgICB2YXIgZHJhZ0NhbmNlbGxlZCA9IG9wdF9kcmFnQ2FuY2VsZWQgfHwgZS50eXBlID09IGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5UT1VDSENBTkNFTDsKICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgZ29vZy5meC5EcmFnRXZlbnQoZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZS5FTkQsIHRoaXMsIGUuY2xpZW50WCwgZS5jbGllbnRZLCBlLCB4LCB5LCBkcmFnQ2FuY2VsbGVkKSkKICB9ZWxzZSB7CiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZS5FQVJMWV9DQU5DRUwpCiAgfQogIChlLnR5cGUgPT0gZ29vZy5ldmVudHMuRXZlbnRUeXBlLlRPVUNIRU5EIHx8IGUudHlwZSA9PSBnb29nLmV2ZW50cy5FdmVudFR5cGUuVE9VQ0hDQU5DRUwpICYmIGUucHJldmVudERlZmF1bHQoKQp9Owpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLm1heWJlUmVpbml0VG91Y2hFdmVudF8gPSBmdW5jdGlvbiAkZ29vZyRmeCREcmFnZ2VyJCRtYXliZVJlaW5pdFRvdWNoRXZlbnRfJChlKSB7CiAgdmFyIHR5cGUgPSBlLnR5cGU7CiAgdHlwZSA9PSBnb29nLmV2ZW50cy5FdmVudFR5cGUuVE9VQ0hTVEFSVCB8fCB0eXBlID09IGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5UT1VDSE1PVkUgPyBlLmluaXQoZS5nZXRCcm93c2VyRXZlbnQoKS50YXJnZXRUb3VjaGVzWzBdLCBlLmN1cnJlbnRUYXJnZXQpIDogKHR5cGUgPT0gZ29vZy5ldmVudHMuRXZlbnRUeXBlLlRPVUNIRU5EIHx8IHR5cGUgPT0gZ29vZy5ldmVudHMuRXZlbnRUeXBlLlRPVUNIQ0FOQ0VMKSAmJiBlLmluaXQoZS5nZXRCcm93c2VyRXZlbnQoKS5jaGFuZ2VkVG91Y2hlc1swXSwgZS5jdXJyZW50VGFyZ2V0KQp9Owpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLmhhbmRsZU1vdmVfID0gZnVuY3Rpb24gJGdvb2ckZngkRHJhZ2dlciQkaGFuZGxlTW92ZV8kKGUpIHsKICBpZih0aGlzLmVuYWJsZWRfKSB7CiAgICB0aGlzLm1heWJlUmVpbml0VG91Y2hFdmVudF8oZSk7CiAgICB2YXIgZHggPSBlLmNsaWVudFggLSB0aGlzLmNsaWVudFgsIGR5ID0gZS5jbGllbnRZIC0gdGhpcy5jbGllbnRZOwogICAgdGhpcy5jbGllbnRYID0gZS5jbGllbnRYOwogICAgdGhpcy5jbGllbnRZID0gZS5jbGllbnRZOwogICAgdGhpcy5zY3JlZW5YID0gZS5zY3JlZW5YOwogICAgdGhpcy5zY3JlZW5ZID0gZS5zY3JlZW5ZOwogICAgaWYoIXRoaXMuZHJhZ2dpbmdfKSB7CiAgICAgIHZhciBkaWZmWCA9IHRoaXMuc3RhcnRYIC0gdGhpcy5jbGllbnRYLCBkaWZmWSA9IHRoaXMuc3RhcnRZIC0gdGhpcy5jbGllbnRZLCBkaXN0YW5jZSA9IGRpZmZYICogZGlmZlggKyBkaWZmWSAqIGRpZmZZOwogICAgICBpZihkaXN0YW5jZSA+IHRoaXMuaHlzdGVyZXNpc0Rpc3RhbmNlU3F1YXJlZF8gJiYgKHRoaXMuaW5pdGlhbGl6ZURyYWdfKGUpLCAhdGhpcy5kcmFnZ2luZ18pKSB7CiAgICAgICAgdGhpcy5lbmREcmFnKGUpOwogICAgICAgIHJldHVybgogICAgICB9CiAgICB9CiAgICB2YXIgcG9zID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbl8oZHgsIGR5KSwgeCA9IHBvcy54LCB5ID0gcG9zLnk7CiAgICBpZih0aGlzLmRyYWdnaW5nXykgewogICAgICB2YXIgcnYgPSB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGdvb2cuZnguRHJhZ0V2ZW50KGdvb2cuZnguRHJhZ2dlci5FdmVudFR5cGUuQkVGT1JFRFJBRywgdGhpcywgZS5jbGllbnRYLCBlLmNsaWVudFksIGUsIHgsIHkpKTsKICAgICAgITEgIT09IHJ2ICYmICh0aGlzLmRvRHJhZyhlLCB4LCB5LCAhMSksIGUucHJldmVudERlZmF1bHQoKSkKICAgIH0KICB9Cn07Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUuY2FsY3VsYXRlUG9zaXRpb25fID0gZnVuY3Rpb24gJGdvb2ckZngkRHJhZ2dlciQkY2FsY3VsYXRlUG9zaXRpb25fJChkeCwgZHkpIHsKICB2YXIgcGFnZVNjcm9sbCA9IGdvb2cuZG9tLmdldERvbUhlbHBlcih0aGlzLmRvY3VtZW50XykuZ2V0RG9jdW1lbnRTY3JvbGwoKSwgZHggPSBkeCArIChwYWdlU2Nyb2xsLnggLSB0aGlzLnBhZ2VTY3JvbGwueCksIGR5ID0gZHkgKyAocGFnZVNjcm9sbC55IC0gdGhpcy5wYWdlU2Nyb2xsLnkpOwogIHRoaXMucGFnZVNjcm9sbCA9IHBhZ2VTY3JvbGw7CiAgdGhpcy5kZWx0YVggKz0gZHg7CiAgdGhpcy5kZWx0YVkgKz0gZHk7CiAgdmFyIHggPSB0aGlzLmxpbWl0WCh0aGlzLmRlbHRhWCksIHkgPSB0aGlzLmxpbWl0WSh0aGlzLmRlbHRhWSk7CiAgcmV0dXJuIG5ldyBnb29nLm1hdGguQ29vcmRpbmF0ZSh4LCB5KQp9Owpnb29nLmZ4LkRyYWdnZXIucHJvdG90eXBlLm9uU2Nyb2xsXyA9IGZ1bmN0aW9uICRnb29nJGZ4JERyYWdnZXIkJG9uU2Nyb2xsXyQoZSkgewogIHZhciBwb3MgPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uXygwLCAwKTsKICBlLmNsaWVudFggPSB0aGlzLmNsaWVudFg7CiAgZS5jbGllbnRZID0gdGhpcy5jbGllbnRZOwogIHRoaXMuZG9EcmFnKGUsIHBvcy54LCBwb3MueSwgITApCn07Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUuZG9EcmFnID0gZnVuY3Rpb24gJGdvb2ckZngkRHJhZ2dlciQkZG9EcmFnJChlLCB4LCB5KSB7CiAgdGhpcy5kZWZhdWx0QWN0aW9uKHgsIHkpOwogIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgZ29vZy5meC5EcmFnRXZlbnQoZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZS5EUkFHLCB0aGlzLCBlLmNsaWVudFgsIGUuY2xpZW50WSwgZSwgeCwgeSkpCn07Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUubGltaXRYID0gZnVuY3Rpb24gJGdvb2ckZngkRHJhZ2dlciQkbGltaXRYJCh4KSB7CiAgdmFyIHJlY3QgPSB0aGlzLmxpbWl0cywgbGVmdCA9ICFpc05hTihyZWN0LmxlZnQpID8gcmVjdC5sZWZ0IDogbnVsbCwgd2lkdGggPSAhaXNOYU4ocmVjdC53aWR0aCkgPyByZWN0LndpZHRoIDogMCwgbWF4WCA9IG51bGwgIT0gbGVmdCA/IGxlZnQgKyB3aWR0aCA6IEluZmluaXR5LCBtaW5YID0gbnVsbCAhPSBsZWZ0ID8gbGVmdCA6IC1JbmZpbml0eTsKICByZXR1cm4gTWF0aC5taW4obWF4WCwgTWF0aC5tYXgobWluWCwgeCkpCn07Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUubGltaXRZID0gZnVuY3Rpb24gJGdvb2ckZngkRHJhZ2dlciQkbGltaXRZJCh5KSB7CiAgdmFyIHJlY3QgPSB0aGlzLmxpbWl0cywgdG9wID0gIWlzTmFOKHJlY3QudG9wKSA/IHJlY3QudG9wIDogbnVsbCwgaGVpZ2h0ID0gIWlzTmFOKHJlY3QuaGVpZ2h0KSA/IHJlY3QuaGVpZ2h0IDogMCwgbWF4WSA9IG51bGwgIT0gdG9wID8gdG9wICsgaGVpZ2h0IDogSW5maW5pdHksIG1pblkgPSBudWxsICE9IHRvcCA/IHRvcCA6IC1JbmZpbml0eTsKICByZXR1cm4gTWF0aC5taW4obWF4WSwgTWF0aC5tYXgobWluWSwgeSkpCn07Cmdvb2cuZnguRHJhZ2dlci5wcm90b3R5cGUuZGVmYXVsdEFjdGlvbiA9IGZ1bmN0aW9uICRnb29nJGZ4JERyYWdnZXIkJGRlZmF1bHRBY3Rpb24kKHgsIHkpIHsKICB0aGlzLnRhcmdldC5zdHlsZS5sZWZ0ID0geCArICJweCI7CiAgdGhpcy50YXJnZXQuc3R5bGUudG9wID0geSArICJweCIKfTsKZ29vZy5meC5EcmFnRXZlbnQgPSBmdW5jdGlvbiAkZ29vZyRmeCREcmFnRXZlbnQkKHR5cGUsIGRyYWdvYmosIGNsaWVudFgsIGNsaWVudFksIGJyb3dzZXJFdmVudCwgb3B0X2FjdFgsIG9wdF9hY3RZKSB7CiAgZ29vZy5ldmVudHMuRXZlbnQuY2FsbCh0aGlzLCB0eXBlKTsKICB0aGlzLmNsaWVudFggPSBjbGllbnRYOwogIHRoaXMuY2xpZW50WSA9IGNsaWVudFk7CiAgdGhpcy5sZWZ0ID0gZ29vZy5pc0RlZihvcHRfYWN0WCkgPyBvcHRfYWN0WCA6IGRyYWdvYmouZGVsdGFYOwogIHRoaXMudG9wID0gZ29vZy5pc0RlZihvcHRfYWN0WSkgPyBvcHRfYWN0WSA6IGRyYWdvYmouZGVsdGFZCn07Cmdvb2cuaW5oZXJpdHMoZ29vZy5meC5EcmFnRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKZ29vZy51aS5TcGxpdFBhbmUgPSBmdW5jdGlvbiAkZ29vZyR1aSRTcGxpdFBhbmUkKGZpcnN0Q29tcG9uZW50LCBzZWNvbmRDb21wb25lbnQsIG9yaWVudGF0aW9uLCBvcHRfZG9tSGVscGVyKSB7CiAgZ29vZy51aS5Db21wb25lbnQuY2FsbCh0aGlzLCBvcHRfZG9tSGVscGVyKTsKICB0aGlzLm9yaWVudGF0aW9uXyA9IG9yaWVudGF0aW9uOwogIHRoaXMuZmlyc3RDb21wb25lbnRfID0gZmlyc3RDb21wb25lbnQ7CiAgdGhpcy5hZGRDaGlsZChmaXJzdENvbXBvbmVudCk7CiAgdGhpcy5zZWNvbmRDb21wb25lbnRfID0gc2Vjb25kQ29tcG9uZW50OwogIHRoaXMuYWRkQ2hpbGQoc2Vjb25kQ29tcG9uZW50KQp9Owpnb29nLmluaGVyaXRzKGdvb2cudWkuU3BsaXRQYW5lLCBnb29nLnVpLkNvbXBvbmVudCk7Cmdvb2cudWkuU3BsaXRQYW5lLkV2ZW50VHlwZSA9IHtIQU5ETEVfRFJBR19FTkQ6ImhhbmRsZV9kcmFnX2VuZCJ9Owpnb29nLnVpLlNwbGl0UGFuZS5DTEFTU19OQU1FXyA9ICJnb29nLXNwbGl0cGFuZSI7Cmdvb2cudWkuU3BsaXRQYW5lLkZJUlNUX0NPTlRBSU5FUl9DTEFTU19OQU1FXyA9ICJnb29nLXNwbGl0cGFuZS1maXJzdC1jb250YWluZXIiOwpnb29nLnVpLlNwbGl0UGFuZS5TRUNPTkRfQ09OVEFJTkVSX0NMQVNTX05BTUVfID0gImdvb2ctc3BsaXRwYW5lLXNlY29uZC1jb250YWluZXIiOwpnb29nLnVpLlNwbGl0UGFuZS5IQU5ETEVfQ0xBU1NfTkFNRV8gPSAiZ29vZy1zcGxpdHBhbmUtaGFuZGxlIjsKZ29vZy51aS5TcGxpdFBhbmUuSEFORExFX0NMQVNTX05BTUVfSE9SSVpPTlRBTF8gPSAiZ29vZy1zcGxpdHBhbmUtaGFuZGxlLWhvcml6b250YWwiOwpnb29nLnVpLlNwbGl0UGFuZS5IQU5ETEVfQ0xBU1NfTkFNRV9WRVJUSUNBTF8gPSAiZ29vZy1zcGxpdHBhbmUtaGFuZGxlLXZlcnRpY2FsIjsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLnNwbGl0RHJhZ2dlcl8gPSBudWxsOwpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUuZmlyc3RDb21wb25lbnRDb250YWluZXJfID0gbnVsbDsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLnNlY29uZENvbXBvbmVudENvbnRhaW5lcl8gPSBudWxsOwpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUuaGFuZGxlU2l6ZV8gPSA1Owpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUuaW5pdGlhbFNpemVfID0gbnVsbDsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLnNhdmVkU25hcFNpemVfID0gbnVsbDsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLmZpcnN0Q29tcG9uZW50U2l6ZV8gPSBudWxsOwpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUuY29udGludW91c1Jlc2l6ZV8gPSAhMDsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLmlmcmFtZU92ZXJsYXlfID0gbnVsbDsKZ29vZy51aS5TcGxpdFBhbmUuSWZyYW1lT3ZlcmxheUluZGV4XyA9IHtISURERU46LTEsIE9WRVJMQVk6MSwgU1BMSVRURVJfSEFORExFOjJ9Owpnb29nLnVpLlNwbGl0UGFuZS5PcmllbnRhdGlvbiA9IHtIT1JJWk9OVEFMOiJob3Jpem9udGFsIiwgVkVSVElDQUw6InZlcnRpY2FsIn07Cmdvb2cudWkuU3BsaXRQYW5lLnByb3RvdHlwZS5jcmVhdGVEb20gPSBmdW5jdGlvbiAkZ29vZyR1aSRTcGxpdFBhbmUkJGNyZWF0ZURvbSQoKSB7CiAgdmFyIGRvbSA9IHRoaXMuZ2V0RG9tSGVscGVyKCksIGZpcnN0Q29udGFpbmVyID0gZG9tLmNyZWF0ZURvbSgiZGl2IiwgZ29vZy51aS5TcGxpdFBhbmUuRklSU1RfQ09OVEFJTkVSX0NMQVNTX05BTUVfKSwgc2Vjb25kQ29udGFpbmVyID0gZG9tLmNyZWF0ZURvbSgiZGl2IiwgZ29vZy51aS5TcGxpdFBhbmUuU0VDT05EX0NPTlRBSU5FUl9DTEFTU19OQU1FXyksIHNwbGl0dGVySGFuZGxlID0gZG9tLmNyZWF0ZURvbSgiZGl2IiwgZ29vZy51aS5TcGxpdFBhbmUuSEFORExFX0NMQVNTX05BTUVfKTsKICB0aGlzLnNldEVsZW1lbnRJbnRlcm5hbChkb20uY3JlYXRlRG9tKCJkaXYiLCBnb29nLnVpLlNwbGl0UGFuZS5DTEFTU19OQU1FXywgZmlyc3RDb250YWluZXIsIHNlY29uZENvbnRhaW5lciwgc3BsaXR0ZXJIYW5kbGUpKTsKICB0aGlzLmZpcnN0Q29tcG9uZW50Q29udGFpbmVyXyA9IGZpcnN0Q29udGFpbmVyOwogIHRoaXMuc2Vjb25kQ29tcG9uZW50Q29udGFpbmVyXyA9IHNlY29uZENvbnRhaW5lcjsKICB0aGlzLnNwbGl0cGFuZUhhbmRsZV8gPSBzcGxpdHRlckhhbmRsZTsKICB0aGlzLnNldFVwSGFuZGxlXygpOwogIHRoaXMuZmluaXNoU2V0dXBfKCkKfTsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLmNhbkRlY29yYXRlID0gZnVuY3Rpb24gJGdvb2ckdWkkU3BsaXRQYW5lJCRjYW5EZWNvcmF0ZSQoZWxlbWVudCkgewogIHZhciBjbGFzc05hbWUgPSBnb29nLnVpLlNwbGl0UGFuZS5GSVJTVF9DT05UQUlORVJfQ0xBU1NfTkFNRV8sIGZpcnN0Q29udGFpbmVyID0gZ29vZy5kb20uZ2V0RWxlbWVudHNCeVRhZ05hbWVBbmRDbGFzcyhudWxsLCBjbGFzc05hbWUsIGVsZW1lbnQpWzBdOwogIGlmKCFmaXJzdENvbnRhaW5lcikgewogICAgcmV0dXJuITEKICB9CiAgdGhpcy5maXJzdENvbXBvbmVudENvbnRhaW5lcl8gPSBmaXJzdENvbnRhaW5lcjsKICB2YXIgY2xhc3NOYW1lID0gZ29vZy51aS5TcGxpdFBhbmUuU0VDT05EX0NPTlRBSU5FUl9DTEFTU19OQU1FXywgc2Vjb25kQ29udGFpbmVyID0gZ29vZy5kb20uZ2V0RWxlbWVudHNCeVRhZ05hbWVBbmRDbGFzcyhudWxsLCBjbGFzc05hbWUsIGVsZW1lbnQpWzBdOwogIGlmKCFzZWNvbmRDb250YWluZXIpIHsKICAgIHJldHVybiExCiAgfQogIHRoaXMuc2Vjb25kQ29tcG9uZW50Q29udGFpbmVyXyA9IHNlY29uZENvbnRhaW5lcjsKICB2YXIgY2xhc3NOYW1lID0gZ29vZy51aS5TcGxpdFBhbmUuSEFORExFX0NMQVNTX05BTUVfLCBzcGxpdHBhbmVIYW5kbGUgPSBnb29nLmRvbS5nZXRFbGVtZW50c0J5VGFnTmFtZUFuZENsYXNzKG51bGwsIGNsYXNzTmFtZSwgZWxlbWVudClbMF07CiAgaWYoIXNwbGl0cGFuZUhhbmRsZSkgewogICAgcmV0dXJuITEKICB9CiAgdGhpcy5zcGxpdHBhbmVIYW5kbGVfID0gc3BsaXRwYW5lSGFuZGxlOwogIHJldHVybiEwCn07Cmdvb2cudWkuU3BsaXRQYW5lLnByb3RvdHlwZS5kZWNvcmF0ZUludGVybmFsID0gZnVuY3Rpb24gJGdvb2ckdWkkU3BsaXRQYW5lJCRkZWNvcmF0ZUludGVybmFsJChlbGVtZW50KSB7CiAgZ29vZy51aS5TcGxpdFBhbmUuc3VwZXJDbGFzc18uZGVjb3JhdGVJbnRlcm5hbC5jYWxsKHRoaXMsIGVsZW1lbnQpOwogIHRoaXMuc2V0VXBIYW5kbGVfKCk7CiAgdmFyIGVsU2l6ZSA9IGdvb2cuc3R5bGUuZ2V0Qm9yZGVyQm94U2l6ZShlbGVtZW50KTsKICB0aGlzLnNldFNpemUobmV3IGdvb2cubWF0aC5TaXplKGVsU2l6ZS53aWR0aCwgZWxTaXplLmhlaWdodCkpOwogIHRoaXMuZmluaXNoU2V0dXBfKCkKfTsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLmZpbmlzaFNldHVwXyA9IGZ1bmN0aW9uICRnb29nJHVpJFNwbGl0UGFuZSQkZmluaXNoU2V0dXBfJCgpIHsKICB2YXIgZG9tID0gdGhpcy5nZXREb21IZWxwZXIoKTsKICB0aGlzLmZpcnN0Q29tcG9uZW50Xy5nZXRFbGVtZW50KCkgfHwgdGhpcy5maXJzdENvbXBvbmVudF8uY3JlYXRlRG9tKCk7CiAgZG9tLmFwcGVuZENoaWxkKHRoaXMuZmlyc3RDb21wb25lbnRDb250YWluZXJfLCB0aGlzLmZpcnN0Q29tcG9uZW50Xy5nZXRFbGVtZW50KCkpOwogIHRoaXMuc2Vjb25kQ29tcG9uZW50Xy5nZXRFbGVtZW50KCkgfHwgdGhpcy5zZWNvbmRDb21wb25lbnRfLmNyZWF0ZURvbSgpOwogIGRvbS5hcHBlbmRDaGlsZCh0aGlzLnNlY29uZENvbXBvbmVudENvbnRhaW5lcl8sIHRoaXMuc2Vjb25kQ29tcG9uZW50Xy5nZXRFbGVtZW50KCkpOwogIHRoaXMuc3BsaXREcmFnZ2VyXyA9IG5ldyBnb29nLmZ4LkRyYWdnZXIodGhpcy5zcGxpdHBhbmVIYW5kbGVfLCB0aGlzLnNwbGl0cGFuZUhhbmRsZV8pOwogIHRoaXMuZmlyc3RDb21wb25lbnRDb250YWluZXJfLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICB0aGlzLnNlY29uZENvbXBvbmVudENvbnRhaW5lcl8uc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogIHZhciBoYW5kbGVTdHlsZSA9IHRoaXMuc3BsaXRwYW5lSGFuZGxlXy5zdHlsZTsKICBoYW5kbGVTdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgaGFuZGxlU3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKICBoYW5kbGVTdHlsZS56SW5kZXggPSBnb29nLnVpLlNwbGl0UGFuZS5JZnJhbWVPdmVybGF5SW5kZXhfLlNQTElUVEVSX0hBTkRMRQp9Owpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUuZW50ZXJEb2N1bWVudCA9IGZ1bmN0aW9uICRnb29nJHVpJFNwbGl0UGFuZSQkZW50ZXJEb2N1bWVudCQoKSB7CiAgZ29vZy51aS5TcGxpdFBhbmUuc3VwZXJDbGFzc18uZW50ZXJEb2N1bWVudC5jYWxsKHRoaXMpOwogIHZhciBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KCk7CiAgInN0YXRpYyIgPT0gZ29vZy5zdHlsZS5nZXRDb21wdXRlZFBvc2l0aW9uKGVsZW1lbnQpICYmIChlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIik7CiAgdGhpcy5nZXRIYW5kbGVyKCkubGlzdGVuKHRoaXMuc3BsaXRwYW5lSGFuZGxlXywgZ29vZy5ldmVudHMuRXZlbnRUeXBlLkRCTENMSUNLLCB0aGlzLmhhbmRsZURvdWJsZUNsaWNrXykubGlzdGVuKHRoaXMuc3BsaXREcmFnZ2VyXywgZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZS5TVEFSVCwgdGhpcy5oYW5kbGVEcmFnU3RhcnRfKS5saXN0ZW4odGhpcy5zcGxpdERyYWdnZXJfLCBnb29nLmZ4LkRyYWdnZXIuRXZlbnRUeXBlLkRSQUcsIHRoaXMuaGFuZGxlRHJhZ18pLmxpc3Rlbih0aGlzLnNwbGl0RHJhZ2dlcl8sIGdvb2cuZnguRHJhZ2dlci5FdmVudFR5cGUuRU5ELCB0aGlzLmhhbmRsZURyYWdFbmRfKTsKICB0aGlzLnNldEZpcnN0Q29tcG9uZW50U2l6ZSh0aGlzLmluaXRpYWxTaXplXykKfTsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLnNldEluaXRpYWxTaXplID0gZnVuY3Rpb24gJGdvb2ckdWkkU3BsaXRQYW5lJCRzZXRJbml0aWFsU2l6ZSQoc2l6ZSkgewogIHRoaXMuaW5pdGlhbFNpemVfID0gc2l6ZQp9Owpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUuc2V0SGFuZGxlU2l6ZSA9IGZ1bmN0aW9uICRnb29nJHVpJFNwbGl0UGFuZSQkc2V0SGFuZGxlU2l6ZSQoc2l6ZSkgewogIHRoaXMuaGFuZGxlU2l6ZV8gPSBzaXplCn07Cmdvb2cudWkuU3BsaXRQYW5lLnByb3RvdHlwZS5pc1ZlcnRpY2FsID0gZnVuY3Rpb24gJGdvb2ckdWkkU3BsaXRQYW5lJCRpc1ZlcnRpY2FsJCgpIHsKICByZXR1cm4gdGhpcy5vcmllbnRhdGlvbl8gPT0gZ29vZy51aS5TcGxpdFBhbmUuT3JpZW50YXRpb24uVkVSVElDQUwKfTsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLnNldFVwSGFuZGxlXyA9IGZ1bmN0aW9uICRnb29nJHVpJFNwbGl0UGFuZSQkc2V0VXBIYW5kbGVfJCgpIHsKICB0aGlzLmlzVmVydGljYWwoKSA/ICh0aGlzLnNwbGl0cGFuZUhhbmRsZV8uc3R5bGUuaGVpZ2h0ID0gdGhpcy5oYW5kbGVTaXplXyArICJweCIsIGdvb2cuZG9tLmNsYXNzZXMuYWRkKHRoaXMuc3BsaXRwYW5lSGFuZGxlXywgZ29vZy51aS5TcGxpdFBhbmUuSEFORExFX0NMQVNTX05BTUVfVkVSVElDQUxfKSkgOiAodGhpcy5zcGxpdHBhbmVIYW5kbGVfLnN0eWxlLndpZHRoID0gdGhpcy5oYW5kbGVTaXplXyArICJweCIsIGdvb2cuZG9tLmNsYXNzZXMuYWRkKHRoaXMuc3BsaXRwYW5lSGFuZGxlXywgZ29vZy51aS5TcGxpdFBhbmUuSEFORExFX0NMQVNTX05BTUVfSE9SSVpPTlRBTF8pKQp9Owpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUubW92ZUFuZFNpemVfID0gZnVuY3Rpb24gJGdvb2ckdWkkU3BsaXRQYW5lJCRtb3ZlQW5kU2l6ZV8kKGVsZW1lbnQsIHJlY3QpIHsKICBnb29nLnN0eWxlLnNldFBvc2l0aW9uKGVsZW1lbnQsIHJlY3QubGVmdCwgcmVjdC50b3ApOwogIGdvb2cuc3R5bGUuc2V0Qm9yZGVyQm94U2l6ZShlbGVtZW50LCBuZXcgZ29vZy5tYXRoLlNpemUoTWF0aC5tYXgocmVjdC53aWR0aCwgMCksIE1hdGgubWF4KHJlY3QuaGVpZ2h0LCAwKSkpCn07Cmdvb2cudWkuU3BsaXRQYW5lLnByb3RvdHlwZS5nZXRGaXJzdENvbXBvbmVudFNpemUgPSBmdW5jdGlvbiAkZ29vZyR1aSRTcGxpdFBhbmUkJGdldEZpcnN0Q29tcG9uZW50U2l6ZSQoKSB7CiAgcmV0dXJuIHRoaXMuZmlyc3RDb21wb25lbnRTaXplXwp9Owpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUuc2V0Rmlyc3RDb21wb25lbnRTaXplID0gZnVuY3Rpb24gJGdvb2ckdWkkU3BsaXRQYW5lJCRzZXRGaXJzdENvbXBvbmVudFNpemUkKG9wdF9zaXplKSB7CiAgdmFyIHRvcCA9IDAsIGxlZnQgPSAwLCBzcGxpdHBhbmVTaXplID0gZ29vZy5zdHlsZS5nZXRCb3JkZXJCb3hTaXplKHRoaXMuZ2V0RWxlbWVudCgpKSwgaXNWZXJ0aWNhbCA9IHRoaXMuaXNWZXJ0aWNhbCgpLCBmaXJzdENvbXBvbmVudFNpemUgPSBnb29nLmlzTnVtYmVyKG9wdF9zaXplKSA/IG9wdF9zaXplIDogZ29vZy5pc051bWJlcih0aGlzLmZpcnN0Q29tcG9uZW50U2l6ZV8pID8gdGhpcy5maXJzdENvbXBvbmVudFNpemVfIDogTWF0aC5mbG9vcigoaXNWZXJ0aWNhbCA/IHNwbGl0cGFuZVNpemUuaGVpZ2h0IDogc3BsaXRwYW5lU2l6ZS53aWR0aCkgLyAyKTsKICB0aGlzLmZpcnN0Q29tcG9uZW50U2l6ZV8gPSBmaXJzdENvbXBvbmVudFNpemU7CiAgdmFyIGZpcnN0Q29tcG9uZW50V2lkdGgsIGZpcnN0Q29tcG9uZW50SGVpZ2h0LCBzZWNvbmRDb21wb25lbnRXaWR0aCwgc2Vjb25kQ29tcG9uZW50SGVpZ2h0LCBoYW5kbGVXaWR0aCwgaGFuZGxlSGVpZ2h0LCBzZWNvbmRDb21wb25lbnRMZWZ0LCBzZWNvbmRDb21wb25lbnRUb3AsIGhhbmRsZUxlZnQsIGhhbmRsZVRvcDsKICBpc1ZlcnRpY2FsID8gKGZpcnN0Q29tcG9uZW50SGVpZ2h0ID0gZmlyc3RDb21wb25lbnRTaXplLCBoYW5kbGVXaWR0aCA9IGZpcnN0Q29tcG9uZW50V2lkdGggPSBzcGxpdHBhbmVTaXplLndpZHRoLCBoYW5kbGVIZWlnaHQgPSB0aGlzLmhhbmRsZVNpemVfLCBzZWNvbmRDb21wb25lbnRIZWlnaHQgPSBzcGxpdHBhbmVTaXplLmhlaWdodCAtIGZpcnN0Q29tcG9uZW50SGVpZ2h0IC0gaGFuZGxlSGVpZ2h0LCBzZWNvbmRDb21wb25lbnRXaWR0aCA9IHNwbGl0cGFuZVNpemUud2lkdGgsIGhhbmRsZVRvcCA9IHRvcCArIGZpcnN0Q29tcG9uZW50SGVpZ2h0LCBoYW5kbGVMZWZ0ID0gbGVmdCwgc2Vjb25kQ29tcG9uZW50VG9wID0gaGFuZGxlVG9wICsgaGFuZGxlSGVpZ2h0LCBzZWNvbmRDb21wb25lbnRMZWZ0ID0gbGVmdCkgOiAoZmlyc3RDb21wb25lbnRXaWR0aCA9IGZpcnN0Q29tcG9uZW50U2l6ZSwgZmlyc3RDb21wb25lbnRIZWlnaHQgPSBzcGxpdHBhbmVTaXplLmhlaWdodCwgCiAgaGFuZGxlV2lkdGggPSB0aGlzLmhhbmRsZVNpemVfLCBoYW5kbGVIZWlnaHQgPSBzcGxpdHBhbmVTaXplLmhlaWdodCwgc2Vjb25kQ29tcG9uZW50V2lkdGggPSBzcGxpdHBhbmVTaXplLndpZHRoIC0gZmlyc3RDb21wb25lbnRXaWR0aCAtIGhhbmRsZVdpZHRoLCBzZWNvbmRDb21wb25lbnRIZWlnaHQgPSBzcGxpdHBhbmVTaXplLmhlaWdodCwgaGFuZGxlTGVmdCA9IGxlZnQgKyBmaXJzdENvbXBvbmVudFdpZHRoLCBoYW5kbGVUb3AgPSB0b3AsIHNlY29uZENvbXBvbmVudExlZnQgPSBoYW5kbGVMZWZ0ICsgaGFuZGxlV2lkdGgsIHNlY29uZENvbXBvbmVudFRvcCA9IHRvcCk7CiAgdGhpcy5tb3ZlQW5kU2l6ZV8odGhpcy5maXJzdENvbXBvbmVudENvbnRhaW5lcl8sIG5ldyBnb29nLm1hdGguUmVjdChsZWZ0LCB0b3AsIGZpcnN0Q29tcG9uZW50V2lkdGgsIGZpcnN0Q29tcG9uZW50SGVpZ2h0KSk7CiAgImZ1bmN0aW9uIiA9PSB0eXBlb2YgdGhpcy5maXJzdENvbXBvbmVudF8ucmVzaXplICYmIHRoaXMuZmlyc3RDb21wb25lbnRfLnJlc2l6ZShuZXcgZ29vZy5tYXRoLlNpemUoZmlyc3RDb21wb25lbnRXaWR0aCwgZmlyc3RDb21wb25lbnRIZWlnaHQpKTsKICB0aGlzLm1vdmVBbmRTaXplXyh0aGlzLnNwbGl0cGFuZUhhbmRsZV8sIG5ldyBnb29nLm1hdGguUmVjdChoYW5kbGVMZWZ0LCBoYW5kbGVUb3AsIGhhbmRsZVdpZHRoLCBoYW5kbGVIZWlnaHQpKTsKICB0aGlzLm1vdmVBbmRTaXplXyh0aGlzLnNlY29uZENvbXBvbmVudENvbnRhaW5lcl8sIG5ldyBnb29nLm1hdGguUmVjdChzZWNvbmRDb21wb25lbnRMZWZ0LCBzZWNvbmRDb21wb25lbnRUb3AsIHNlY29uZENvbXBvbmVudFdpZHRoLCBzZWNvbmRDb21wb25lbnRIZWlnaHQpKTsKICAiZnVuY3Rpb24iID09IHR5cGVvZiB0aGlzLnNlY29uZENvbXBvbmVudF8ucmVzaXplICYmIHRoaXMuc2Vjb25kQ29tcG9uZW50Xy5yZXNpemUobmV3IGdvb2cubWF0aC5TaXplKHNlY29uZENvbXBvbmVudFdpZHRoLCBzZWNvbmRDb21wb25lbnRIZWlnaHQpKTsKICB0aGlzLmRpc3BhdGNoRXZlbnQoZ29vZy51aS5Db21wb25lbnQuRXZlbnRUeXBlLkNIQU5HRSkKfTsKZ29vZy51aS5TcGxpdFBhbmUucmVzaXplV2FybmluZ1dvcmthcm91bmRfID0ge3Jlc2l6ZTpmdW5jdGlvbiAkZ29vZyR1aSRTcGxpdFBhbmUkcmVzaXplV2FybmluZ1dvcmthcm91bmRfJHJlc2l6ZSQoKSB7Cn19Owpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUuc2V0U2l6ZSA9IGZ1bmN0aW9uICRnb29nJHVpJFNwbGl0UGFuZSQkc2V0U2l6ZSQoc2l6ZSkgewogIGdvb2cuc3R5bGUuc2V0Qm9yZGVyQm94U2l6ZSh0aGlzLmdldEVsZW1lbnQoKSwgc2l6ZSk7CiAgdGhpcy5pZnJhbWVPdmVybGF5XyAmJiBnb29nLnN0eWxlLnNldEJvcmRlckJveFNpemUodGhpcy5pZnJhbWVPdmVybGF5Xywgc2l6ZSk7CiAgdGhpcy5zZXRGaXJzdENvbXBvbmVudFNpemUoKQp9Owpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUuc25hcEl0XyA9IGZ1bmN0aW9uICRnb29nJHVpJFNwbGl0UGFuZSQkc25hcEl0XyQoKSB7CiAgdmFyIGhhbmRsZVBvcyA9IGdvb2cuc3R5bGUuZ2V0UmVsYXRpdmVQb3NpdGlvbih0aGlzLnNwbGl0cGFuZUhhbmRsZV8sIHRoaXMuZmlyc3RDb21wb25lbnRDb250YWluZXJfKSwgZmlyc3RCb3JkZXJCb3hTaXplID0gZ29vZy5zdHlsZS5nZXRCb3JkZXJCb3hTaXplKHRoaXMuZmlyc3RDb21wb25lbnRDb250YWluZXJfKSwgZmlyc3RDb250ZW50Qm94U2l6ZSA9IGdvb2cuc3R5bGUuZ2V0Q29udGVudEJveFNpemUodGhpcy5maXJzdENvbXBvbmVudENvbnRhaW5lcl8pLCBpc1ZlcnRpY2FsID0gdGhpcy5pc1ZlcnRpY2FsKCksIHNuYXBTaXplLCBoYW5kbGVQb3NpdGlvbjsKICBpc1ZlcnRpY2FsID8gKHNuYXBTaXplID0gZmlyc3RCb3JkZXJCb3hTaXplLmhlaWdodCAtIGZpcnN0Q29udGVudEJveFNpemUuaGVpZ2h0LCBoYW5kbGVQb3NpdGlvbiA9IGhhbmRsZVBvcy55KSA6IChzbmFwU2l6ZSA9IGZpcnN0Qm9yZGVyQm94U2l6ZS53aWR0aCAtIGZpcnN0Q29udGVudEJveFNpemUud2lkdGgsIGhhbmRsZVBvc2l0aW9uID0gaGFuZGxlUG9zLngpOwogIHNuYXBTaXplID09IGhhbmRsZVBvc2l0aW9uID8gdGhpcy5zZXRGaXJzdENvbXBvbmVudFNpemUodGhpcy5zYXZlZFNuYXBTaXplXykgOiAodGhpcy5zYXZlZFNuYXBTaXplXyA9IGlzVmVydGljYWwgPyBnb29nLnN0eWxlLmdldEJvcmRlckJveFNpemUodGhpcy5maXJzdENvbXBvbmVudENvbnRhaW5lcl8pLmhlaWdodCA6IGdvb2cuc3R5bGUuZ2V0Qm9yZGVyQm94U2l6ZSh0aGlzLmZpcnN0Q29tcG9uZW50Q29udGFpbmVyXykud2lkdGgsIHRoaXMuc2V0Rmlyc3RDb21wb25lbnRTaXplKHNuYXBTaXplKSkKfTsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLmhhbmRsZURyYWdTdGFydF8gPSBmdW5jdGlvbiAkZ29vZyR1aSRTcGxpdFBhbmUkJGhhbmRsZURyYWdTdGFydF8kKCkgewogIGlmKCF0aGlzLmlmcmFtZU92ZXJsYXlfKSB7CiAgICB2YXIgY3NzU3R5bGVzID0gInBvc2l0aW9uOiByZWxhdGl2ZSI7CiAgICBnb29nLnVzZXJBZ2VudC5JRSAmJiAoY3NzU3R5bGVzICs9ICI7YmFja2dyb3VuZC1jb2xvcjogIzAwMDtmaWx0ZXI6IEFscGhhKE9wYWNpdHk9MCkiKTsKICAgIHRoaXMuaWZyYW1lT3ZlcmxheV8gPSB0aGlzLmdldERvbUhlbHBlcigpLmNyZWF0ZURvbSgiZGl2Iiwge3N0eWxlOmNzc1N0eWxlc30pOwogICAgdGhpcy5nZXREb21IZWxwZXIoKS5hcHBlbmRDaGlsZCh0aGlzLmdldEVsZW1lbnQoKSwgdGhpcy5pZnJhbWVPdmVybGF5XykKICB9CiAgdGhpcy5pZnJhbWVPdmVybGF5Xy5zdHlsZS56SW5kZXggPSBnb29nLnVpLlNwbGl0UGFuZS5JZnJhbWVPdmVybGF5SW5kZXhfLk9WRVJMQVk7CiAgZ29vZy5zdHlsZS5zZXRCb3JkZXJCb3hTaXplKHRoaXMuaWZyYW1lT3ZlcmxheV8sIGdvb2cuc3R5bGUuZ2V0Qm9yZGVyQm94U2l6ZSh0aGlzLmdldEVsZW1lbnQoKSkpOwogIHZhciBwb3MgPSBnb29nLnN0eWxlLmdldFBvc2l0aW9uKHRoaXMuZmlyc3RDb21wb25lbnRDb250YWluZXJfKSwgbGltaXRXaWR0aCA9IDAsIGxpbWl0SGVpZ2h0ID0gMCwgbGltaXR4ID0gcG9zLngsIGxpbWl0eSA9IHBvcy55LCBmaXJzdEJvcmRlckJveFNpemUgPSBnb29nLnN0eWxlLmdldEJvcmRlckJveFNpemUodGhpcy5maXJzdENvbXBvbmVudENvbnRhaW5lcl8pLCBmaXJzdENvbnRlbnRCb3hTaXplID0gZ29vZy5zdHlsZS5nZXRDb250ZW50Qm94U2l6ZSh0aGlzLmZpcnN0Q29tcG9uZW50Q29udGFpbmVyXyksIHNlY29uZENvbnRlbnRCb3hTaXplID0gZ29vZy5zdHlsZS5nZXRDb250ZW50Qm94U2l6ZSh0aGlzLnNlY29uZENvbXBvbmVudENvbnRhaW5lcl8pOwogIHRoaXMuaXNWZXJ0aWNhbCgpID8gKGxpbWl0SGVpZ2h0ID0gZmlyc3RDb250ZW50Qm94U2l6ZS5oZWlnaHQgKyBzZWNvbmRDb250ZW50Qm94U2l6ZS5oZWlnaHQsIGxpbWl0eSArPSBmaXJzdEJvcmRlckJveFNpemUuaGVpZ2h0IC0gZmlyc3RDb250ZW50Qm94U2l6ZS5oZWlnaHQpIDogKGxpbWl0V2lkdGggPSBmaXJzdENvbnRlbnRCb3hTaXplLndpZHRoICsgc2Vjb25kQ29udGVudEJveFNpemUud2lkdGgsIGxpbWl0eCArPSBmaXJzdEJvcmRlckJveFNpemUud2lkdGggLSBmaXJzdENvbnRlbnRCb3hTaXplLndpZHRoKTsKICB2YXIgbGltaXRzID0gbmV3IGdvb2cubWF0aC5SZWN0KGxpbWl0eCwgbGltaXR5LCBsaW1pdFdpZHRoLCBsaW1pdEhlaWdodCk7CiAgdGhpcy5zcGxpdERyYWdnZXJfLnNldExpbWl0cyhsaW1pdHMpCn07Cmdvb2cudWkuU3BsaXRQYW5lLnByb3RvdHlwZS5nZXRSZWxhdGl2ZUxlZnRfID0gZnVuY3Rpb24gJGdvb2ckdWkkU3BsaXRQYW5lJCRnZXRSZWxhdGl2ZUxlZnRfJChsZWZ0KSB7CiAgcmV0dXJuIGxlZnQgLSBnb29nLnN0eWxlLmdldFBvc2l0aW9uKHRoaXMuZmlyc3RDb21wb25lbnRDb250YWluZXJfKS54Cn07Cmdvb2cudWkuU3BsaXRQYW5lLnByb3RvdHlwZS5nZXRSZWxhdGl2ZVRvcF8gPSBmdW5jdGlvbiAkZ29vZyR1aSRTcGxpdFBhbmUkJGdldFJlbGF0aXZlVG9wXyQodG9wKSB7CiAgcmV0dXJuIHRvcCAtIGdvb2cuc3R5bGUuZ2V0UG9zaXRpb24odGhpcy5maXJzdENvbXBvbmVudENvbnRhaW5lcl8pLnkKfTsKZ29vZy51aS5TcGxpdFBhbmUucHJvdG90eXBlLmhhbmRsZURyYWdfID0gZnVuY3Rpb24gJGdvb2ckdWkkU3BsaXRQYW5lJCRoYW5kbGVEcmFnXyQoZSkgewogIGlmKHRoaXMuY29udGludW91c1Jlc2l6ZV8pIHsKICAgIGlmKHRoaXMuaXNWZXJ0aWNhbCgpKSB7CiAgICAgIHZhciB0b3AgPSB0aGlzLmdldFJlbGF0aXZlVG9wXyhlLnRvcCk7CiAgICAgIHRoaXMuc2V0Rmlyc3RDb21wb25lbnRTaXplKHRvcCkKICAgIH1lbHNlIHsKICAgICAgdmFyIGxlZnQgPSB0aGlzLmdldFJlbGF0aXZlTGVmdF8oZS5sZWZ0KTsKICAgICAgdGhpcy5zZXRGaXJzdENvbXBvbmVudFNpemUobGVmdCkKICAgIH0KICB9Cn07Cmdvb2cudWkuU3BsaXRQYW5lLnByb3RvdHlwZS5oYW5kbGVEcmFnRW5kXyA9IGZ1bmN0aW9uICRnb29nJHVpJFNwbGl0UGFuZSQkaGFuZGxlRHJhZ0VuZF8kKGUpIHsKICB0aGlzLmlmcmFtZU92ZXJsYXlfLnN0eWxlLnpJbmRleCA9IGdvb2cudWkuU3BsaXRQYW5lLklmcmFtZU92ZXJsYXlJbmRleF8uSElEREVOOwogIGlmKCF0aGlzLmNvbnRpbnVvdXNSZXNpemVfKSB7CiAgICBpZih0aGlzLmlzVmVydGljYWwoKSkgewogICAgICB2YXIgdG9wID0gdGhpcy5nZXRSZWxhdGl2ZVRvcF8oZS50b3ApOwogICAgICB0aGlzLnNldEZpcnN0Q29tcG9uZW50U2l6ZSh0b3ApCiAgICB9ZWxzZSB7CiAgICAgIHZhciBsZWZ0ID0gdGhpcy5nZXRSZWxhdGl2ZUxlZnRfKGUubGVmdCk7CiAgICAgIHRoaXMuc2V0Rmlyc3RDb21wb25lbnRTaXplKGxlZnQpCiAgICB9CiAgfQogIHRoaXMuZGlzcGF0Y2hFdmVudChnb29nLnVpLlNwbGl0UGFuZS5FdmVudFR5cGUuSEFORExFX0RSQUdfRU5EKQp9Owpnb29nLnVpLlNwbGl0UGFuZS5wcm90b3R5cGUuaGFuZGxlRG91YmxlQ2xpY2tfID0gZnVuY3Rpb24gJGdvb2ckdWkkU3BsaXRQYW5lJCRoYW5kbGVEb3VibGVDbGlja18kKCkgewogIHRoaXMuc25hcEl0XygpCn07Cmdvb2cudWkuU3BsaXRQYW5lLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkZ29vZyR1aSRTcGxpdFBhbmUkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgZ29vZy51aS5TcGxpdFBhbmUuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgdGhpcy5zcGxpdERyYWdnZXJfLmRpc3Bvc2UoKTsKICB0aGlzLnNwbGl0RHJhZ2dlcl8gPSBudWxsOwogIGdvb2cuZG9tLnJlbW92ZU5vZGUodGhpcy5pZnJhbWVPdmVybGF5Xyk7CiAgdGhpcy5pZnJhbWVPdmVybGF5XyA9IG51bGwKfTsKZ29vZy5kb20uYTExeSA9IHt9Owpnb29nLmRvbS5hMTF5LlN0YXRlID0ge0FDVElWRURFU0NFTkRBTlQ6ImFjdGl2ZWRlc2NlbmRhbnQiLCBBVE9NSUM6ImF0b21pYyIsIEFVVE9DT01QTEVURToiYXV0b2NvbXBsZXRlIiwgQlVTWToiYnVzeSIsIENIRUNLRUQ6ImNoZWNrZWQiLCBDT05UUk9MUzoiY29udHJvbHMiLCBERVNDUklCRURCWToiZGVzY3JpYmVkYnkiLCBESVNBQkxFRDoiZGlzYWJsZWQiLCBEUk9QRUZGRUNUOiJkcm9wZWZmZWN0IiwgRVhQQU5ERUQ6ImV4cGFuZGVkIiwgRkxPV1RPOiJmbG93dG8iLCBHUkFCQkVEOiJncmFiYmVkIiwgSEFTUE9QVVA6Imhhc3BvcHVwIiwgSElEREVOOiJoaWRkZW4iLCBJTlZBTElEOiJpbnZhbGlkIiwgTEFCRUw6ImxhYmVsIiwgTEFCRUxMRURCWToibGFiZWxsZWRieSIsIExFVkVMOiJsZXZlbCIsIExJVkU6ImxpdmUiLCBNVUxUSUxJTkU6Im11bHRpbGluZSIsIE1VTFRJU0VMRUNUQUJMRToibXVsdGlzZWxlY3RhYmxlIiwgT1JJRU5UQVRJT046Im9yaWVudGF0aW9uIiwgT1dOUzoib3ducyIsIApQT1NJTlNFVDoicG9zaW5zZXQiLCBQUkVTU0VEOiJwcmVzc2VkIiwgUkVBRE9OTFk6InJlYWRvbmx5IiwgUkVMRVZBTlQ6InJlbGV2YW50IiwgUkVRVUlSRUQ6InJlcXVpcmVkIiwgU0VMRUNURUQ6InNlbGVjdGVkIiwgU0VUU0laRToic2V0c2l6ZSIsIFNPUlQ6InNvcnQiLCBWQUxVRU1BWDoidmFsdWVtYXgiLCBWQUxVRU1JTjoidmFsdWVtaW4iLCBWQUxVRU5PVzoidmFsdWVub3ciLCBWQUxVRVRFWFQ6InZhbHVldGV4dCJ9Owpnb29nLmRvbS5hMTF5LlJvbGUgPSB7QUxFUlQ6ImFsZXJ0IiwgQUxFUlRESUFMT0c6ImFsZXJ0ZGlhbG9nIiwgQVBQTElDQVRJT046ImFwcGxpY2F0aW9uIiwgQVJUSUNMRToiYXJ0aWNsZSIsIEJBTk5FUjoiYmFubmVyIiwgQlVUVE9OOiJidXR0b24iLCBDSEVDS0JPWDoiY2hlY2tib3giLCBDT0xVTU5IRUFERVI6ImNvbHVtbmhlYWRlciIsIENPTUJPQk9YOiJjb21ib2JveCIsIENPTVBMRU1FTlRBUlk6ImNvbXBsZW1lbnRhcnkiLCBESUFMT0c6ImRpYWxvZyIsIERJUkVDVE9SWToiZGlyZWN0b3J5IiwgRE9DVU1FTlQ6ImRvY3VtZW50IiwgRk9STToiZm9ybSIsIEdSSUQ6ImdyaWQiLCBHUklEQ0VMTDoiZ3JpZGNlbGwiLCBHUk9VUDoiZ3JvdXAiLCBIRUFESU5HOiJoZWFkaW5nIiwgSU1HOiJpbWciLCBMSU5LOiJsaW5rIiwgTElTVDoibGlzdCIsIExJU1RCT1g6Imxpc3Rib3giLCBMSVNUSVRFTToibGlzdGl0ZW0iLCBMT0c6ImxvZyIsIE1BSU46Im1haW4iLCBNQVJRVUVFOiJtYXJxdWVlIiwgCk1BVEg6Im1hdGgiLCBNRU5VOiJtZW51IiwgTUVOVUJBUjoibWVudWJhciIsIE1FTlVfSVRFTToibWVudWl0ZW0iLCBNRU5VX0lURU1fQ0hFQ0tCT1g6Im1lbnVpdGVtY2hlY2tib3giLCBNRU5VX0lURU1fUkFESU86Im1lbnVpdGVtcmFkaW8iLCBOQVZJR0FUSU9OOiJuYXZpZ2F0aW9uIiwgTk9URToibm90ZSIsIE9QVElPTjoib3B0aW9uIiwgUFJFU0VOVEFUSU9OOiJwcmVzZW50YXRpb24iLCBQUk9HUkVTU0JBUjoicHJvZ3Jlc3NiYXIiLCBSQURJTzoicmFkaW8iLCBSQURJT0dST1VQOiJyYWRpb2dyb3VwIiwgUkVHSU9OOiJyZWdpb24iLCBST1c6InJvdyIsIFJPV0dST1VQOiJyb3dncm91cCIsIFJPV0hFQURFUjoicm93aGVhZGVyIiwgU0NST0xMQkFSOiJzY3JvbGxiYXIiLCBTRUFSQ0g6InNlYXJjaCIsIFNFUEFSQVRPUjoic2VwYXJhdG9yIiwgU0xJREVSOiJzbGlkZXIiLCBTUElOQlVUVE9OOiJzcGluYnV0dG9uIiwgU1RBVFVTOiJzdGF0dXMiLCBUQUI6InRhYiIsIFRBQl9MSVNUOiJ0YWJsaXN0IiwgClRBQl9QQU5FTDoidGFicGFuZWwiLCBURVhUQk9YOiJ0ZXh0Ym94IiwgVElNRVI6InRpbWVyIiwgVE9PTEJBUjoidG9vbGJhciIsIFRPT0xUSVA6InRvb2x0aXAiLCBUUkVFOiJ0cmVlIiwgVFJFRUdSSUQ6InRyZWVncmlkIiwgVFJFRUlURU06InRyZWVpdGVtIn07Cmdvb2cuZG9tLmExMXkuTGl2ZVByaW9yaXR5ID0ge09GRjoib2ZmIiwgUE9MSVRFOiJwb2xpdGUiLCBBU1NFUlRJVkU6ImFzc2VydGl2ZSJ9Owpnb29nLmRvbS5hMTF5LnNldFJvbGUgPSBmdW5jdGlvbiAkZ29vZyRkb20kYTExeSRzZXRSb2xlJChlbGVtZW50LCByb2xlTmFtZSkgewogIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJyb2xlIiwgcm9sZU5hbWUpOwogIGVsZW1lbnQucm9sZU5hbWUgPSByb2xlTmFtZQp9Owpnb29nLmRvbS5hMTF5LmdldFJvbGUgPSBmdW5jdGlvbiAkZ29vZyRkb20kYTExeSRnZXRSb2xlJChlbGVtZW50KSB7CiAgcmV0dXJuIGVsZW1lbnQucm9sZU5hbWUgfHwgIiIKfTsKZ29vZy5kb20uYTExeS5zZXRTdGF0ZSA9IGZ1bmN0aW9uICRnb29nJGRvbSRhMTF5JHNldFN0YXRlJChlbGVtZW50LCBzdGF0ZSwgdmFsdWUpIHsKICBlbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS0iICsgc3RhdGUsIHZhbHVlKQp9Owpnb29nLmRvbS5hMTF5LmdldFN0YXRlID0gZnVuY3Rpb24gJGdvb2ckZG9tJGExMXkkZ2V0U3RhdGUkKGVsZW1lbnQsIHN0YXRlTmFtZSkgewogIHZhciBhdHRyYiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJhcmlhLSIgKyBzdGF0ZU5hbWUpOwogIHJldHVybiEwID09PSBhdHRyYiB8fCAhMSA9PT0gYXR0cmIgPyBhdHRyYiA/ICJ0cnVlIiA6ICJmYWxzZSIgOiBhdHRyYiA/ICIiICsgYXR0cmIgOiAiIgp9Owpnb29nLmRvbS5hMTF5LmdldEFjdGl2ZURlc2NlbmRhbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kYTExeSRnZXRBY3RpdmVEZXNjZW5kYW50JChlbGVtZW50KSB7CiAgdmFyIGlkID0gZ29vZy5kb20uYTExeS5nZXRTdGF0ZShlbGVtZW50LCBnb29nLmRvbS5hMTF5LlN0YXRlLkFDVElWRURFU0NFTkRBTlQpOwogIHJldHVybiBnb29nLmRvbS5nZXRPd25lckRvY3VtZW50KGVsZW1lbnQpLmdldEVsZW1lbnRCeUlkKGlkKQp9Owpnb29nLmRvbS5hMTF5LnNldEFjdGl2ZURlc2NlbmRhbnQgPSBmdW5jdGlvbiAkZ29vZyRkb20kYTExeSRzZXRBY3RpdmVEZXNjZW5kYW50JChlbGVtZW50LCBhY3RpdmVFbGVtZW50KSB7CiAgZ29vZy5kb20uYTExeS5zZXRTdGF0ZShlbGVtZW50LCBnb29nLmRvbS5hMTF5LlN0YXRlLkFDVElWRURFU0NFTkRBTlQsIGFjdGl2ZUVsZW1lbnQgPyBhY3RpdmVFbGVtZW50LmlkIDogIiIpCn07Cmdvb2cuZG9tLmExMXkuQW5ub3VuY2VyID0gZnVuY3Rpb24gJGdvb2ckZG9tJGExMXkkQW5ub3VuY2VyJChkb21IZWxwZXIpIHsKICBnb29nLkRpc3Bvc2FibGUuY2FsbCh0aGlzKTsKICB0aGlzLmRvbUhlbHBlcl8gPSBkb21IZWxwZXI7CiAgdGhpcy5saXZlUmVnaW9uc18gPSB7fQp9Owpnb29nLmluaGVyaXRzKGdvb2cuZG9tLmExMXkuQW5ub3VuY2VyLCBnb29nLkRpc3Bvc2FibGUpOwpnb29nLmRvbS5hMTF5LkFubm91bmNlci5wcm90b3R5cGUuZGlzcG9zZUludGVybmFsID0gZnVuY3Rpb24gJGdvb2ckZG9tJGExMXkkQW5ub3VuY2VyJCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cub2JqZWN0LmZvckVhY2godGhpcy5saXZlUmVnaW9uc18sIHRoaXMuZG9tSGVscGVyXy5yZW1vdmVOb2RlLCB0aGlzLmRvbUhlbHBlcl8pOwogIHRoaXMuZG9tSGVscGVyXyA9IHRoaXMubGl2ZVJlZ2lvbnNfID0gbnVsbDsKICBnb29nLmRvbS5hMTF5LkFubm91bmNlci5zdXBlckNsYXNzXy5kaXNwb3NlSW50ZXJuYWwuY2FsbCh0aGlzKQp9Owpnb29nLnVpLlppcHB5ID0gZnVuY3Rpb24gJGdvb2ckdWkkWmlwcHkkKGhlYWRlciwgb3B0X2NvbnRlbnQsIG9wdF9leHBhbmRlZCwgb3B0X2V4cGFuZGVkSGVhZGVyLCBvcHRfZG9tSGVscGVyKSB7CiAgZnVuY3Rpb24gYWRkSGVhZGVyRXZlbnRzKGVsKSB7CiAgICBlbCAmJiAoZWwudGFiSW5kZXggPSAwLCBnb29nLmRvbS5hMTF5LnNldFJvbGUoZWwsIHNlbGYuZ2V0QXJpYVJvbGUoKSksIGdvb2cuZG9tLmNsYXNzZXMuYWRkKGVsLCAiZ29vZy16aXBweS1oZWFkZXIiKSwgc2VsZi5lbmFibGVNb3VzZUV2ZW50c0hhbmRsaW5nXyhlbCksIHNlbGYuZW5hYmxlS2V5Ym9hcmRFdmVudHNIYW5kbGluZ18oZWwpKQogIH0KICBnb29nLmV2ZW50cy5FdmVudFRhcmdldC5jYWxsKHRoaXMpOwogIHRoaXMuZG9tXyA9IG9wdF9kb21IZWxwZXIgfHwgZ29vZy5kb20uZ2V0RG9tSGVscGVyKCk7CiAgdGhpcy5lbEhlYWRlcl8gPSB0aGlzLmRvbV8uZ2V0RWxlbWVudChoZWFkZXIpIHx8IG51bGw7CiAgdGhpcy5lbEV4cGFuZGVkSGVhZGVyXyA9IHRoaXMuZG9tXy5nZXRFbGVtZW50KG9wdF9leHBhbmRlZEhlYWRlciB8fCBudWxsKTsKICB0aGlzLmVsQ29udGVudF8gPSAodGhpcy5sYXp5Q3JlYXRlRnVuY18gPSBnb29nLmlzRnVuY3Rpb24ob3B0X2NvbnRlbnQpID8gb3B0X2NvbnRlbnQgOiBudWxsKSB8fCAhb3B0X2NvbnRlbnQgPyBudWxsIDogdGhpcy5kb21fLmdldEVsZW1lbnQob3B0X2NvbnRlbnQpOwogIHRoaXMuZXhwYW5kZWRfID0gITAgPT0gb3B0X2V4cGFuZGVkOwogIHRoaXMua2V5Ym9hcmRFdmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLm1vdXNlRXZlbnRIYW5kbGVyXyA9IG5ldyBnb29nLmV2ZW50cy5FdmVudEhhbmRsZXIodGhpcyk7CiAgdmFyIHNlbGYgPSB0aGlzOwogIGFkZEhlYWRlckV2ZW50cyh0aGlzLmVsSGVhZGVyXyk7CiAgYWRkSGVhZGVyRXZlbnRzKHRoaXMuZWxFeHBhbmRlZEhlYWRlcl8pOwogIHRoaXMuc2V0RXhwYW5kZWQodGhpcy5leHBhbmRlZF8pCn07Cmdvb2cuaW5oZXJpdHMoZ29vZy51aS5aaXBweSwgZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQpOwpnb29nLnVpLlppcHB5LkV2ZW50cyA9IHtBQ1RJT046ImFjdGlvbiIsIFRPR0dMRToidG9nZ2xlIn07Cmdvb2cudWkuWmlwcHkucHJvdG90eXBlLmRpc3Bvc2VJbnRlcm5hbCA9IGZ1bmN0aW9uICRnb29nJHVpJFppcHB5JCRkaXNwb3NlSW50ZXJuYWwkKCkgewogIGdvb2cudWkuWmlwcHkuc3VwZXJDbGFzc18uZGlzcG9zZUludGVybmFsLmNhbGwodGhpcyk7CiAgZ29vZy5kaXNwb3NlKHRoaXMua2V5Ym9hcmRFdmVudEhhbmRsZXJfKTsKICBnb29nLmRpc3Bvc2UodGhpcy5tb3VzZUV2ZW50SGFuZGxlcl8pCn07Cmdvb2cudWkuWmlwcHkucHJvdG90eXBlLmdldEFyaWFSb2xlID0gZnVuY3Rpb24gJGdvb2ckdWkkWmlwcHkkJGdldEFyaWFSb2xlJCgpIHsKICByZXR1cm4gZ29vZy5kb20uYTExeS5Sb2xlLlRBQgp9Owpnb29nLnVpLlppcHB5LnByb3RvdHlwZS5nZXRDb250ZW50RWxlbWVudCA9IGZ1bmN0aW9uICRnb29nJHVpJFppcHB5JCRnZXRDb250ZW50RWxlbWVudCQoKSB7CiAgcmV0dXJuIHRoaXMuZWxDb250ZW50Xwp9Owpnb29nLnVpLlppcHB5LnByb3RvdHlwZS5leHBhbmQgPSBmdW5jdGlvbiAkZ29vZyR1aSRaaXBweSQkZXhwYW5kJCgpIHsKICB0aGlzLnNldEV4cGFuZGVkKCEwKQp9Owpnb29nLnVpLlppcHB5LnByb3RvdHlwZS5jb2xsYXBzZSA9IGZ1bmN0aW9uICRnb29nJHVpJFppcHB5JCRjb2xsYXBzZSQoKSB7CiAgdGhpcy5zZXRFeHBhbmRlZCghMSkKfTsKZ29vZy51aS5aaXBweS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gJGdvb2ckdWkkWmlwcHkkJHRvZ2dsZSQoKSB7CiAgdGhpcy5zZXRFeHBhbmRlZCghdGhpcy5leHBhbmRlZF8pCn07Cmdvb2cudWkuWmlwcHkucHJvdG90eXBlLnNldEV4cGFuZGVkID0gZnVuY3Rpb24gJGdvb2ckdWkkWmlwcHkkJHNldEV4cGFuZGVkJChleHBhbmRlZCkgewogIHRoaXMuZWxDb250ZW50XyA/IGdvb2cuc3R5bGUuc2hvd0VsZW1lbnQodGhpcy5lbENvbnRlbnRfLCBleHBhbmRlZCkgOiBleHBhbmRlZCAmJiB0aGlzLmxhenlDcmVhdGVGdW5jXyAmJiAodGhpcy5lbENvbnRlbnRfID0gdGhpcy5sYXp5Q3JlYXRlRnVuY18oKSk7CiAgdGhpcy5lbENvbnRlbnRfICYmIGdvb2cuZG9tLmNsYXNzZXMuYWRkKHRoaXMuZWxDb250ZW50XywgImdvb2ctemlwcHktY29udGVudCIpOwogIHRoaXMuZWxFeHBhbmRlZEhlYWRlcl8gPyAoZ29vZy5zdHlsZS5zaG93RWxlbWVudCh0aGlzLmVsSGVhZGVyXywgIWV4cGFuZGVkKSwgZ29vZy5zdHlsZS5zaG93RWxlbWVudCh0aGlzLmVsRXhwYW5kZWRIZWFkZXJfLCBleHBhbmRlZCkpIDogdGhpcy51cGRhdGVIZWFkZXJDbGFzc05hbWUoZXhwYW5kZWQpOwogIHRoaXMuc2V0RXhwYW5kZWRJbnRlcm5hbChleHBhbmRlZCk7CiAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBnb29nLnVpLlppcHB5RXZlbnQoZ29vZy51aS5aaXBweS5FdmVudHMuVE9HR0xFLCB0aGlzLCB0aGlzLmV4cGFuZGVkXykpCn07Cmdvb2cudWkuWmlwcHkucHJvdG90eXBlLnNldEV4cGFuZGVkSW50ZXJuYWwgPSBmdW5jdGlvbiAkZ29vZyR1aSRaaXBweSQkc2V0RXhwYW5kZWRJbnRlcm5hbCQoZXhwYW5kZWQpIHsKICB0aGlzLmV4cGFuZGVkXyA9IGV4cGFuZGVkCn07Cmdvb2cudWkuWmlwcHkucHJvdG90eXBlLmlzRXhwYW5kZWQgPSBmdW5jdGlvbiAkZ29vZyR1aSRaaXBweSQkaXNFeHBhbmRlZCQoKSB7CiAgcmV0dXJuIHRoaXMuZXhwYW5kZWRfCn07Cmdvb2cudWkuWmlwcHkucHJvdG90eXBlLnVwZGF0ZUhlYWRlckNsYXNzTmFtZSA9IGZ1bmN0aW9uICRnb29nJHVpJFppcHB5JCR1cGRhdGVIZWFkZXJDbGFzc05hbWUkKGV4cGFuZGVkKSB7CiAgdGhpcy5lbEhlYWRlcl8gJiYgKGdvb2cuZG9tLmNsYXNzZXMuZW5hYmxlKHRoaXMuZWxIZWFkZXJfLCAiZ29vZy16aXBweS1leHBhbmRlZCIsIGV4cGFuZGVkKSwgZ29vZy5kb20uY2xhc3Nlcy5lbmFibGUodGhpcy5lbEhlYWRlcl8sICJnb29nLXppcHB5LWNvbGxhcHNlZCIsICFleHBhbmRlZCksIGdvb2cuZG9tLmExMXkuc2V0U3RhdGUodGhpcy5lbEhlYWRlcl8sIGdvb2cuZG9tLmExMXkuU3RhdGUuRVhQQU5ERUQsIGV4cGFuZGVkKSkKfTsKZ29vZy51aS5aaXBweS5wcm90b3R5cGUuZW5hYmxlS2V5Ym9hcmRFdmVudHNIYW5kbGluZ18gPSBmdW5jdGlvbiAkZ29vZyR1aSRaaXBweSQkZW5hYmxlS2V5Ym9hcmRFdmVudHNIYW5kbGluZ18kKGhlYWRlcikgewogIGhlYWRlciAmJiB0aGlzLmtleWJvYXJkRXZlbnRIYW5kbGVyXy5saXN0ZW4oaGVhZGVyLCBnb29nLmV2ZW50cy5FdmVudFR5cGUuS0VZRE9XTiwgdGhpcy5vbkhlYWRlcktleURvd25fKQp9Owpnb29nLnVpLlppcHB5LnByb3RvdHlwZS5lbmFibGVNb3VzZUV2ZW50c0hhbmRsaW5nXyA9IGZ1bmN0aW9uICRnb29nJHVpJFppcHB5JCRlbmFibGVNb3VzZUV2ZW50c0hhbmRsaW5nXyQoaGVhZGVyKSB7CiAgaGVhZGVyICYmIHRoaXMubW91c2VFdmVudEhhbmRsZXJfLmxpc3RlbihoZWFkZXIsIGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5DTElDSywgdGhpcy5vbkhlYWRlckNsaWNrXykKfTsKZ29vZy51aS5aaXBweS5wcm90b3R5cGUub25IZWFkZXJLZXlEb3duXyA9IGZ1bmN0aW9uICRnb29nJHVpJFppcHB5JCRvbkhlYWRlcktleURvd25fJChldmVudCkgewogIGlmKGV2ZW50LmtleUNvZGUgPT0gZ29vZy5ldmVudHMuS2V5Q29kZXMuRU5URVIgfHwgZXZlbnQua2V5Q29kZSA9PSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5TUEFDRSkgewogICAgdGhpcy50b2dnbGUoKSwgdGhpcy5kaXNwYXRjaEFjdGlvbkV2ZW50XygpLCBldmVudC5wcmV2ZW50RGVmYXVsdCgpLCBldmVudC5zdG9wUHJvcGFnYXRpb24oKQogIH0KfTsKZ29vZy51aS5aaXBweS5wcm90b3R5cGUub25IZWFkZXJDbGlja18gPSBmdW5jdGlvbiAkZ29vZyR1aSRaaXBweSQkb25IZWFkZXJDbGlja18kKCkgewogIHRoaXMudG9nZ2xlKCk7CiAgdGhpcy5kaXNwYXRjaEFjdGlvbkV2ZW50XygpCn07Cmdvb2cudWkuWmlwcHkucHJvdG90eXBlLmRpc3BhdGNoQWN0aW9uRXZlbnRfID0gZnVuY3Rpb24gJGdvb2ckdWkkWmlwcHkkJGRpc3BhdGNoQWN0aW9uRXZlbnRfJCgpIHsKICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGdvb2cuZXZlbnRzLkV2ZW50KGdvb2cudWkuWmlwcHkuRXZlbnRzLkFDVElPTiwgdGhpcykpCn07Cmdvb2cudWkuWmlwcHlFdmVudCA9IGZ1bmN0aW9uICRnb29nJHVpJFppcHB5RXZlbnQkKHR5cGUsIHRhcmdldCkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgdHlwZSwgdGFyZ2V0KQp9Owpnb29nLmluaGVyaXRzKGdvb2cudWkuWmlwcHlFdmVudCwgZ29vZy5ldmVudHMuRXZlbnQpOwp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmRUZW1wbGF0ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmRUZW1wbGF0ZSQob3B0X2RhdGEsIG9wdF9zYikgewogIHZhciBvdXRwdXQgPSBvcHRfc2IgfHwgbmV3IHNveS5TdHJpbmdCdWlsZGVyOwogIG91dHB1dC5hcHBlbmQoJ1JlbmRlcmVyOiA8c3BhbiBpZD0iJywgb3B0X2RhdGEucmVuZGVyZXJUeXBlSWQsICciPk5vbmU8L3NwYW4+LCBSZXNvbHV0aW9uOjxzcGFuIGlkPSInLCBvcHRfZGF0YS5sb2NhbFJlc0lkLCAnIj5OQTwvc3Bhbj4gPHNwYW4gaWQ9IicsIG9wdF9kYXRhLnJlbW90ZVJlc0lkLCAnIj48L3NwYW4+PGJyLz48ZGl2IGlkPSInLCBvcHRfZGF0YS5jYWxsSW5mb0lkLCAnIj48L2Rpdj48ZGl2IGlkPSInLCBvcHRfZGF0YS5jb25uZWN0aW9uSW5mb0lkLCAnIj48L2Rpdj48ZGl2IGlkPSInLCBvcHRfZGF0YS5zdHJlYW1TdGF0c0lkLCAnIj48L2Rpdj48ZGl2IGlkPSInLCBvcHRfZGF0YS5jYWxsSGlzdG9yeUlkLCAnIj48L2Rpdj4nKTsKICByZXR1cm4gb3B0X3NiID8gIiIgOiBvdXRwdXQudG9TdHJpbmcoKQp9Owp0YWxrLm1lZGlhLlJlc29sdXRpb25UZW1wbGF0ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFJlc29sdXRpb25UZW1wbGF0ZSQob3B0X2RhdGEsIG9wdF9zYikgewogIHZhciBvdXRwdXQgPSBvcHRfc2IgfHwgbmV3IHNveS5TdHJpbmdCdWlsZGVyOwogIG91dHB1dC5hcHBlbmQoc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS53aWR0aCksICJ4Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5oZWlnaHQpLCAiICgiLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmVuZHBvaW50KSwgIikiKTsKICByZXR1cm4gb3B0X3NiID8gIiIgOiBvdXRwdXQudG9TdHJpbmcoKQp9Owp0YWxrLm1lZGlhLkNhbGxJbmZvVGVtcGxhdGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsSW5mb1RlbXBsYXRlJChvcHRfZGF0YSwgb3B0X3NiKSB7CiAgdmFyIG91dHB1dCA9IG9wdF9zYiB8fCBuZXcgc295LlN0cmluZ0J1aWxkZXI7CiAgb3V0cHV0LmFwcGVuZCgnPHRhYmxlIGNsYXNzPSInLCAiQ1NTX0FQUF9UQUJMRSIsICcgc3RhdHMiPjx0Ym9keT48dHI+PHRoIGNvbHNwYW49ND48aT5TdGF0aXN0aWNzPC9pPjwvdGg+PC90cj48dHI+PHRkPkxhc3QgdXBkYXRlPC90ZD48dGQ+Jywgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5sb2NhbFRpbWUpLCAiPC90ZD48dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5jYWxsVGltZSksICI8L3RkPjwvdHI+PHRyPjx0ZD5DYWxsIHBhcnRpY2lwYW50czwvdGQ+PHRkPlJlbW90ZTogIiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5udW1iZXJPZlVzZXJzKSwgIiwgQXVkaW8gc2VuZGVyczogIiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5udW1iZXJPZkF1ZGlvU2VuZGVycyksICIsIFZpZGVvIHNlbmRlcnM6ICIsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEubnVtYmVyT2ZWaWRlb1NlbmRlcnMpLCAiPC90ZD48L3RyPjx0cj48dGQ+Q1BVIHVzYWdlPC90ZD48dGQ+UGx1Z2luOiAiLCAKICBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnBsdWdpbkNwdSksICIgJTwvdGQ+PHRkPlRvdGFsOiAiLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnRvdGFsQ3B1KSwgIiAlPC90ZD48dGQ+Q1BVczogIiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5udW1DcHVzKSwgJzwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiNlZWVlZmYiPkxvY2FsIGF1ZGlvPC90ZD48dGQgYmdjb2xvcj0iI2VlZWVmZiI+U1NSQzogJywgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5sb2NhbEF1ZGlvU3NyYyksICc8L3RkPjx0ZCBiZ2NvbG9yPSIjZWVlZWZmIj5Db2RlYzogJywgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5sb2NhbEF1ZGlvQ29kZWMpLCAnPC90ZD48dGQgYmdjb2xvcj0iI2VlZWVmZiI+SW5wdXQgbGV2ZWw6ICcsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuYXVkaW9JbnB1dExldmVsKSwgIjxici8+T3V0cHV0IGxldmVsOiAiLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmF1ZGlvT3V0cHV0TGV2ZWwpLCAKICAnPC90ZD48L3RyPjx0cj48dGQgYmdjb2xvcj0iI2VlZmZlZSI+TG9jYWwgdmlkZW88L3RkPjx0ZCBiZ2NvbG9yPSIjZWVmZmVlIj5TU1JDOiAnLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmxvY2FsVmlkZW9Tc3JjKSwgJzwvdGQ+PHRkIGJnY29sb3I9IiNlZWZmZWUiPkNvZGVjOiAnLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmxvY2FsVmlkZW9Db2RlYyksICc8L3RkPjwvdHI+PHRyPjx0ZCBiZ2NvbG9yPSIjZWVmZmVlIj5WaWRlbyBiYW5kd2lkdGggbGltaXQ8L3RkPjx0ZCBiZ2NvbG9yPSIjZWVmZmVlIj4nLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnZpZGVvQmFuZHdpZHRoTGltaXQpLCAiIGticHM8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjxicj4iKTsKICByZXR1cm4gb3B0X3NiID8gIiIgOiBvdXRwdXQudG9TdHJpbmcoKQp9Owp0YWxrLm1lZGlhLlN0cmVhbUhlYWRlclRlbXBsYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkU3RyZWFtSGVhZGVyVGVtcGxhdGUkKG9wdF9kYXRhLCBvcHRfc2IpIHsKICB2YXIgb3V0cHV0ID0gb3B0X3NiIHx8IG5ldyBzb3kuU3RyaW5nQnVpbGRlcjsKICBvdXRwdXQuYXBwZW5kKCc8cCBjbGFzcz0iJywgImppZCIsICciIGlkPSJ6aXBweV8nLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmppZCksICciPicsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuamlkKSwgJyAtIDxzcGFuIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyBjdXJzb3I6cG9pbnRlcjsgY29sb3I6Ymx1ZTsiPmV4cGFuZC9jb2xsYXBzZTwvc3Bhbj48L3A+PGRpdiBjbGFzcz0iJywgInBhcnRpY2lwYW50IiwgJyIgaWQ9IicsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuamlkKSwgJyI+PGRpdiBjbGFzcz0iJywgImF1ZGlvIiwgJyI+PHRhYmxlIGNsYXNzPSInLCAiQ1NTX0FQUF9URU1QTEFURSIsICciPjx0cj48dGggY29sc3Bhbj0zPjxpPkF1ZGlvIChTU1JDICcsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuYXVkaW8uc3NyYyksICIpPC9pPjwvdGg+PC90cj48dHI+PHRoPkV2ZW50czwvdGg+PHRoPlJlY2VpdmVkPC90aD48dGg+U2VudDwvdGg+PC90cj48dGJvZHk+Iik7CiAgcmV0dXJuIG9wdF9zYiA/ICIiIDogb3V0cHV0LnRvU3RyaW5nKCkKfTsKdGFsay5tZWRpYS5TdHJlYW1BdWRpb1Jvd1RlbXBsYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkU3RyZWFtQXVkaW9Sb3dUZW1wbGF0ZSQob3B0X2RhdGEsIG9wdF9zYikgewogIHZhciBvdXRwdXQgPSBvcHRfc2IgfHwgbmV3IHNveS5TdHJpbmdCdWlsZGVyOwogIG91dHB1dC5hcHBlbmQoJzx0cj48dGQ+PHRhYmxlIGNsYXNzPSInLCAic3RhdHMiLCAnIj48dGJvZHk+PHRyPjx0ZD5qc2E8L3RkPiA8dGQ+Jywgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5ldmVudHMuanNhKSwgIjwvdGQ+PC90cj48dHI+PHRkPmpzcjwvdGQ+IDx0ZD4iLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmV2ZW50cy5qc3IpLCAiPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L3RkPjx0ZD4iLCBvcHRfZGF0YS5yZWN2ID8gJzx0YWJsZSBjbGFzcz0ic3RhdHMiPjx0Ym9keT48dHI+PHRkPkJ5dGVzPC90ZD4gPHRkPicgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnJlY3YuYnl0ZXMpICsgIjwvdGQ+PC90cj48dHI+PHRkPlBhY2tldHM8L3RkPiA8dGQ+IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEucmVjdi5wYWNrZXRzKSArICI8L3RkPjwvdHI+PHRyPjx0ZD5Mb3N0IFBhY2tldHM8L3RkPiA8dGQ+IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEucmVjdi5sb3N0UGFja2V0cykgKyAKICAiPC90ZD48L3RyPjx0cj48dGQ+RnJhY3Rpb24gTG9zdDwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5yZWN2Lmxvc3NSYXRpbykgKyAiPC90ZD48L3RyPjx0cj48dGQ+Sml0dGVyPC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnJlY3Yuaml0dGVyKSArICI8L3RkPjwvdHI+PHRyPjx0ZD5FbmVyZ3k8L3RkPiA8dGQ+IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEucmVjdi5lbmVyZ3kpICsgIjwvdGQ+PC90cj48dHI+PHRkPlNlcXVlbmNlICM8L3RkPiA8dGQ+IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEucmVjdi5oaWdoZXN0U2VxTnVtYmVyKSArICI8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPiIgOiAiIiwgIjwvdGQ+PHRkPiIsIG9wdF9kYXRhLnNlbmQgPyAnPHRhYmxlIGNsYXNzPSJzdGF0cyI+PHRib2R5Pjx0cj48dGQ+Qnl0ZXM8L3RkPiA8dGQ+JyArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuc2VuZC5ieXRlcykgKyAKICAiPC90ZD48L3RyPjx0cj48dGQ+UGFja2V0czwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kLnBhY2tldHMpICsgIjwvdGQ+PC90cj48dHI+PHRkPkxvc3QgUGFja2V0czwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kLmxvc3RQYWNrZXRzKSArICI8L3RkPjwvdHI+PHRyPjx0ZD5GcmFjdGlvbiBMb3N0PC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnNlbmQubG9zc1JhdGlvKSArICI8L3RkPjwvdHI+PHRyPjx0ZD5KaXR0ZXI8L3RkPiA8dGQ+IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuc2VuZC5qaXR0ZXIpICsgIjwvdGQ+PC90cj48dHI+PHRkPkVuZXJneTwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kLmVuZXJneSkgKyAiPC90ZD48L3RyPjx0cj48dGQ+U2VxdWVuY2UgIzwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kLmhpZ2hlc3RTZXFOdW1iZXIpICsgCiAgIjwvdGQ+PC90cj48dHI+PHRkPlRpbWVzdGFtcDwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kLnRpbWVzdGFtcCkgKyAiPC90ZD48L3RyPjx0cj48dGQ+UlRUPC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnNlbmQucnR0KSArICIgbXM8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPiIgOiAiIiwgIjwvdGQ+PC90cj4iKTsKICByZXR1cm4gb3B0X3NiID8gIiIgOiBvdXRwdXQudG9TdHJpbmcoKQp9Owp0YWxrLm1lZGlhLlN0cmVhbU1pZGRsZVRlbXBsYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkU3RyZWFtTWlkZGxlVGVtcGxhdGUkKG9wdF9kYXRhLCBvcHRfc2IpIHsKICB2YXIgb3V0cHV0ID0gb3B0X3NiIHx8IG5ldyBzb3kuU3RyaW5nQnVpbGRlcjsKICBvdXRwdXQuYXBwZW5kKCc8L3Rib2R5PjwvdGFibGU+PC9kaXY+PGRpdiBjbGFzcz0iJywgInZpZGVvIiwgJyI+PHRhYmxlIGNsYXNzPSInLCAiQ1NTX0FQUF9URU1QTEFURSIsICciPjx0cj48dGggY29sc3Bhbj01PjxpPlZpZGVvIChTU1JDICcsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEudmlkZW8ucmVjdlNzcmMpLCAiKTwvaT48L3RoPjwvdHI+PHRyPjx0aD5FdmVudHM8L3RoPjx0aD5SZWNlaXZlZDwvdGg+PHRoPlNlbnQ8L3RoPjx0aD5TdHJlYW08L3RoPjx0aD5GcmFtZXJhdGU8L3RoPjwvdHI+PHRib2R5PiIpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEuU3RyZWFtVmlkZW9Sb3dUZW1wbGF0ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFN0cmVhbVZpZGVvUm93VGVtcGxhdGUkKG9wdF9kYXRhLCBvcHRfc2IpIHsKICB2YXIgb3V0cHV0ID0gb3B0X3NiIHx8IG5ldyBzb3kuU3RyaW5nQnVpbGRlcjsKICBvdXRwdXQuYXBwZW5kKCc8dHI+PHRkPjx0YWJsZSBjbGFzcz0iJywgInN0YXRzIiwgJyI+PHRib2R5Pjx0cj48dGQ+anNhPC90ZD4gPHRkPicsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuZXZlbnRzLmpzYSksICI8L3RkPjwvdHI+PHRyPjx0ZD5qc3I8L3RkPiA8dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5ldmVudHMuanNyKSwgIjwvdGQ+PC90cj48dHI+PHRkPnZpZXc8L3RkPiA8dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5ldmVudHMudmlldyksICI8L3RkPjwvdHI+PHRyPjx0ZD5zdHJlYW1vbjwvdGQ+IDx0ZD4iLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmV2ZW50cy5zdHJlYW1vbiksICI8L3RkPjwvdHI+PHRyPjx0ZD5zdHJlYW1yZWFkeTwvdGQ+IDx0ZD4iLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmV2ZW50cy5zdHJlYW1yZWFkeSksICI8L3RkPjwvdHI+PHRyPjx0ZD5zdHJlYW1vZmY8L3RkPiA8dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5ldmVudHMuc3RyZWFtb2ZmKSwgCiAgIjwvdGQ+PC90cj48dHI+PHRkPnN0cmVhbWZhaWxlZDwvdGQ+IDx0ZD4iLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmV2ZW50cy5zdHJlYW1mYWlsZWQpLCAiPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L3RkPjx0ZD4iLCBvcHRfZGF0YS5yZWN2ID8gJzx0YWJsZSBjbGFzcz0ic3RhdHMiPjx0Ym9keT48dHI+PHRkPkJ5dGVzPC90ZD4gPHRkPicgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnJlY3YuYnl0ZXMpICsgIjwvdGQ+PC90cj48dHI+PHRkPkxvc3QgUGFja2V0czwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5yZWN2Lmxvc3RQYWNrZXRzKSArICI8L3RkPjwvdHI+PHRyPjx0ZD5GcmFjdGlvbiBMb3N0PC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnJlY3YubG9zc1JhdGlvKSArICI8L3RkPjwvdHI+PHRyPjx0ZD4jIEZJUnM8L3RkPiA8dGQ+IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEucmVjdi5maXJzKSArIAogICI8L3RkPjwvdHI+PHRyPjx0ZD4jIE5BQ0tzPC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnJlY3YubmFja3MpICsgIjwvdGQ+PC90cj48dHI+PHRkPkNvbmNlYWxlZCBQYWNrZXRzPC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnJlY3YuY29uY2VhbGVkUGFja2V0cykgKyAiPC90ZD48L3RyPjx0cj48dGQ+U2l6ZTwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5yZWN2LndpZHRoKSArICJ4IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEucmVjdi5oZWlnaHQpICsgIjwvdGQ+PC90cj48dHI+PHRkPlJlY2VpdmVkIEZQUzwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5yZWN2LmZwc1JlY3ZlZCkgKyAiPC90ZD48L3RyPjx0cj48dGQ+RGVjb2RlZCBGUFM8L3RkPiA8dGQ+IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEucmVjdi5mcHNEZWNvZGVkKSArICI8L3RkPjwvdHI+PHRyPjx0ZD5GUFMgVG8gUmVuZGVyZXI8L3RkPiA8dGQ+IiArIAogIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEucmVjdi5mcHNUb1JlbmRlcmVyKSArICI8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPiIgOiAiIiwgIjwvdGQ+PHRkPiIsIG9wdF9kYXRhLnNlbmQgPyAnPHRhYmxlIGNsYXNzPSJzdGF0cyI+PHRib2R5Pjx0cj48dGQ+Qnl0ZXM8L3RkPiA8dGQ+JyArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuc2VuZC5ieXRlcykgKyAiPC90ZD48L3RyPjx0cj48dGQ+U1NSQzwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kU3NyYykgKyAiPC90ZD48L3RyPjx0cj48dGQ+UGFja2V0czwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kLnBhY2tldHMpICsgIjwvdGQ+PC90cj48dHI+PHRkPkxvc3QgUGFja2V0czwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kLmxvc3RQYWNrZXRzKSArICI8L3RkPjwvdHI+PHRyPjx0ZD5GcmFjdGlvbiBMb3N0PC90ZD4gPHRkPiIgKyAKICBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnNlbmQubG9zc1JhdGlvKSArICI8L3RkPjwvdHI+PHRyPjx0ZD4jIEZJUnM8L3RkPiA8dGQ+IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuc2VuZC5maXJzKSArICI8L3RkPjwvdHI+PHRyPjx0ZD4jIE5BQ0tzPC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnNlbmQubmFja3MpICsgIjwvdGQ+PC90cj48dHI+PHRkPkNhY2hlZCBQYWNrZXRzPC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnNlbmQuY2FjaGVkUGFja2V0cykgKyAiPC90ZD48L3RyPjx0cj48dGQ+UmUtVFggUGFja2V0czwvdGQ+IDx0ZD4iICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kLnJldHJhbnNtaXR0ZWRQYWNrZXRzKSArICI8L3RkPjwvdHI+PHRyPjx0ZD5TaXplPC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnNlbmQud2lkdGgpICsgIngiICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kLmhlaWdodCkgKyAKICAiPC90ZD48L3RyPjx0cj48dGQ+RlBTIFRvIEVuY29kZXI8L3RkPiA8dGQ+IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuc2VuZC5mcHNUb0VuY29kZXIpICsgIjwvdGQ+PC90cj48dHI+PHRkPlNlbnQgRlBTPC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnNlbmQuZnBzU2VudCkgKyAiPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4iIDogIiIsICI8L3RkPjx0ZD4iLCBvcHRfZGF0YS5zdHJlYW0gPyAnPHRhYmxlIGNsYXNzPSJzdGF0cyI+PHRib2R5Pjx0cj48dGQ+dmlld3BvcnQ8L3RkPiA8dGQ+JyArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuc3RyZWFtLnZpZXdwb3J0KSArICI8L3RkPjwvdHI+PHRyPjx0ZD5zb3VyY2U8L3RkPiA8dGQ+IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuc3RyZWFtLnNvdXJjZVdpZHRoKSArICJ4IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuc3RyZWFtLnNvdXJjZUhlaWdodCkgKyAiPC90ZD48L3RyPjx0cj48dGQ+cmVuZGVyPC90ZD4gPHRkPiIgKyAKICBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnN0cmVhbS5yZW5kZXJXaWR0aCkgKyAieCIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnN0cmVhbS5yZW5kZXJIZWlnaHQpICsgIjwvdGQ+PC90cj48dHI+PHRkPnBpeGVsPC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnN0cmVhbS5waXhlbFdpZHRoKSArICJ4IiArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuc3RyZWFtLnBpeGVsSGVpZ2h0KSArICI8L3RkPjwvdHI+PHRyPjx0ZD50ZXh0dXJlPC90ZD4gPHRkPiIgKyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnN0cmVhbS50ZXh0dXJlV2lkdGgpICsgIngiICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zdHJlYW0udGV4dHVyZUhlaWdodCkgKyAiPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4iIDogIiIsICI8L3RkPjx0ZD4iLCBvcHRfZGF0YS5yZWN2ID8gJzx0YWJsZSBjbGFzcz0ic3RhdHMiPjx0Ym9keT48dHI+PHRkPk8zRCBpbnB1dDwvdGQ+IDx0ZCBpZD0iZnBzLXJlbmRlci0nICsgCiAgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5mcHNJZCkgKyAnIj4nICsgc295LiQkZXNjYXBlSHRtbChNYXRoLnJvdW5kKDEwICogb3B0X2RhdGEucmVjdi5mcHNHcmFwaGljc0lucHV0KSAvIDEwKSArICcgZnBzPC90ZD48L3RyPjx0cj48dGQ+TzNEIG91dHB1dDwvdGQ+IDx0ZCBpZD0iZnBzLXVwZGF0ZS0nICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5mcHNJZCkgKyAnIj4nICsgc295LiQkZXNjYXBlSHRtbChNYXRoLnJvdW5kKDEwICogb3B0X2RhdGEucmVjdi5mcHNHcmFwaGljc091dHB1dCkgLyAxMCkgKyAiIGZwczwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+IiA6ICIiLCAiPC90ZD48L3RyPiIpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEuU3RyZWFtRm9vdGVyVGVtcGxhdGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRTdHJlYW1Gb290ZXJUZW1wbGF0ZSQob3B0X2RhdGEsIG9wdF9zYikgewogIHZhciBvdXRwdXQgPSBvcHRfc2IgfHwgbmV3IHNveS5TdHJpbmdCdWlsZGVyOwogIG91dHB1dC5hcHBlbmQoJzwvdGJvZHk+PC90YWJsZT48cD48c3BhbiBjbGFzcz0iJywgIm5vdGVzIiwgJyI+PGI+Tm90ZXM6PC9iPiAnLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLm5vdGVzKSwgIjwvc3Bhbj48L3A+PC9kaXY+PC9kaXY+Iik7CiAgcmV0dXJuIG9wdF9zYiA/ICIiIDogb3V0cHV0LnRvU3RyaW5nKCkKfTsKdGFsay5tZWRpYS5Db25uZWN0aW9uSGVhZGVyVGVtcGxhdGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDb25uZWN0aW9uSGVhZGVyVGVtcGxhdGUkKG9wdF9kYXRhLCBvcHRfc2IpIHsKICB2YXIgb3V0cHV0ID0gb3B0X3NiIHx8IG5ldyBzb3kuU3RyaW5nQnVpbGRlcjsKICBvdXRwdXQuYXBwZW5kKCc8dGFibGUgY2xhc3M9IicsICJDU1NfQVBQX1RFTVBMQVRFIiwgJyBzdGF0cyI+PHRyPjx0aCBjb2xzcGFuPTY+PGk+Q29ubmVjdGlvbnM8L2k+PC90aD48L3RyPjx0cj48dGg+TWVkaWE8L3RoPjx0aD5SVFQgKG1zKTwvdGg+PHRoPlNlbnQgYnBzIChieXRlcyk8L3RoPjx0aD5SZWNlaXZlZCBicHMgKGJ5dGVzKTwvdGg+PHRoPkxvY2FsIENhbmRpZGF0ZTwvdGg+PHRoPlJlbW90ZSBDYW5kaWRhdGU8L3RoPjwvdHI+Jyk7CiAgcmV0dXJuIG9wdF9zYiA/ICIiIDogb3V0cHV0LnRvU3RyaW5nKCkKfTsKdGFsay5tZWRpYS5Db25uZWN0aW9uUm93VGVtcGxhdGUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDb25uZWN0aW9uUm93VGVtcGxhdGUkKG9wdF9kYXRhLCBvcHRfc2IpIHsKICB2YXIgb3V0cHV0ID0gb3B0X3NiIHx8IG5ldyBzb3kuU3RyaW5nQnVpbGRlcjsKICBvdXRwdXQuYXBwZW5kKCI8dHI+PHRkPiIsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEubWVkaWEpLCAiPC90ZD48dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5ydHQpLCAiPC90ZD48dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5zZW5kQnBicyksICIgKCIsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuc2VuZEJ5dGVzKSwgIik8L3RkPjx0ZD4iLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnJlY3ZCcGJzKSwgIiAoIiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5yZWN2Qnl0ZXMpLCAiKTwvdGQ+PHRkPiIsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEubG9jYWxDYW5kaWRhdGUubmFtZSksICIsIiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5sb2NhbENhbmRpZGF0ZS50eXBlKSwgIiwiLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmxvY2FsQ2FuZGlkYXRlLnByb3RvY29sKSwgIiwiLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmxvY2FsQ2FuZGlkYXRlLmFkZHJlc3MpLCAKICAiPC90ZD48dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5yZW1vdGVDYW5kaWRhdGUubmFtZSksICIsIiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5yZW1vdGVDYW5kaWRhdGUudHlwZSksICIsIiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5yZW1vdGVDYW5kaWRhdGUucHJvdG9jb2wpLCAiLCIsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEucmVtb3RlQ2FuZGlkYXRlLmFkZHJlc3MpLCAiPC90ZD48L3RyPiIpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEuQ29ubmVjdGlvbkZvb3RlclRlbXBsYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ29ubmVjdGlvbkZvb3RlclRlbXBsYXRlJChvcHRfZGF0YSwgb3B0X3NiKSB7CiAgdmFyIG91dHB1dCA9IG9wdF9zYiB8fCBuZXcgc295LlN0cmluZ0J1aWxkZXI7CiAgb3V0cHV0LmFwcGVuZCgiPC90Ym9keT48L3RhYmxlPiIpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEuQ2FsbEhpc3RvcnlUZW1wbGF0ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxIaXN0b3J5VGVtcGxhdGUkKG9wdF9kYXRhLCBvcHRfc2IpIHsKICB2YXIgb3V0cHV0ID0gb3B0X3NiIHx8IG5ldyBzb3kuU3RyaW5nQnVpbGRlcjsKICBvdXRwdXQuYXBwZW5kKCc8dGFibGUgY2xhc3M9IicsICJDU1NfQVBQX1RBQkxFIiwgJyBzdGF0cyI+PHRib2R5Pjx0cj48dGggY29sc3Bhbj0zPjxpPkhpc3Rvcnk8L2k+PC90aD48L3RyPjx0cj48dGQ+QWxsIHJlbW90ZSBqaWRzIHNlZW48L3RkPjx0ZD4oJywgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5hbGxSZW1vdGVKaWRzQ291bnQpLCAiKTwvdGQ+PHRkPiIsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuYWxsUmVtb3RlSmlkcyksICI8L3RkPjwvdHI+PHRyPjx0ZD5BbGwgc2Vzc2lvbiBJRHMgc2VlbjwvdGQ+PHRkPigiLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmFsbFNlc3Npb25JZHNDb3VudCksICIpPC90ZD48dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5hbGxTZXNzaW9uSWRzKSwgJzwvdGQ+PC90cj48dHIgY2xhc3M9IicsICJhdWRpbyIsICciPjx0ZD5BbGwgYXVkaW8gU1NSQ3MgYWRkZWQ8L3RkPjx0ZD4oJywgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5hbGxBdWRpb1NzcmNzQWRkZWRDb3VudCksIAogICIpPC90ZD48dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5hbGxBdWRpb1NzcmNzQWRkZWQpLCAnPC90ZD48L3RyPjx0ciBjbGFzcz0iJywgImF1ZGlvIiwgJyI+PHRkPkFsbCBhdWRpbyBTU1JDcyByZW1vdmVkPC90ZD48dGQ+KCcsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuYWxsQXVkaW9Tc3Jjc1JlbW92ZWRDb3VudCksICIpPC90ZD48dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5hbGxBdWRpb1NzcmNzUmVtb3ZlZCksICc8L3RkPjwvdHI+PHRyIGNsYXNzPSInLCAidmlkZW8iLCAnIj48dGQ+QWxsIHZpZGVvIFNTUkNzIGFkZGVkPC90ZD48dGQ+KCcsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuYWxsVmlkZW9Tc3Jjc0FkZGVkQ291bnQpLCAiKTwvdGQ+PHRkPiIsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuYWxsVmlkZW9Tc3Jjc0FkZGVkKSwgJzwvdGQ+PC90cj48dHIgY2xhc3M9IicsICJ2aWRlbyIsICciPjx0ZD5BbGwgdmlkZW8gU1NSQ3MgcmVtb3ZlZDwvdGQ+PHRkPignLCAKICBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmFsbFZpZGVvU3NyY3NSZW1vdmVkQ291bnQpLCAiKTwvdGQ+PHRkPiIsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuYWxsVmlkZW9Tc3Jjc1JlbW92ZWQpLCAiPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48YnI+Iik7CiAgcmV0dXJuIG9wdF9zYiA/ICIiIDogb3V0cHV0LnRvU3RyaW5nKCkKfTsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbERhc2hib2FyZCQob3B0X2NhbGxNYW5hZ2VyLCBvcHRfZG9tSGVscGVyKSB7CiAgZ29vZy51aS5Db21wb25lbnQuY2FsbCh0aGlzLCBvcHRfZG9tSGVscGVyKTsKICB0aGlzLmNhbGxNYW5hZ2VyXyA9IG9wdF9jYWxsTWFuYWdlcjsKICB0aGlzLmF1ZGlvU3NyY0luZm9fID0ge307CiAgdGhpcy52aWRlb1NzcmNJbmZvXyA9IHt9OwogIHRoaXMucmVtb3RlSmlkc18gPSBuZXcgZ29vZy5zdHJ1Y3RzLlNldDsKICB0aGlzLnNlc3Npb25JZHNfID0gbmV3IGdvb2cuc3RydWN0cy5TZXQ7CiAgdGhpcy5hdWRpb1NzcmNzQWRkZWRfID0gbmV3IGdvb2cuc3RydWN0cy5TZXQ7CiAgdGhpcy52aWRlb1NzcmNzQWRkZWRfID0gbmV3IGdvb2cuc3RydWN0cy5TZXQ7CiAgdGhpcy5hdWRpb1NzcmNzUmVtb3ZlZF8gPSBuZXcgZ29vZy5zdHJ1Y3RzLlNldDsKICB0aGlzLnZpZGVvU3NyY3NSZW1vdmVkXyA9IG5ldyBnb29nLnN0cnVjdHMuU2V0OwogIHRoaXMuemlwcGllc18gPSBuZXcgZ29vZy5zdHJ1Y3RzLk1hcDsKICB0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQucHJvdG90eXBlLmxvY2FsSmlkXyA9ICJ1bmtub3duIjsKICBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmNhbGxNYW5hZ2VyXykgJiYgZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5jYWxsTWFuYWdlcl8uZ2V0VGFsa1BsdWdpbigpKSAmJiAodGhpcy5sb2NhbEppZF8gPSB0aGlzLmNhbGxNYW5hZ2VyXy5nZXRUYWxrUGx1Z2luKCkuZ2V0TG9jYWxKaWQoKSkKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQsIGdvb2cudWkuQ29tcG9uZW50KTsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLnByb3RvdHlwZS52aWRlb0JhbmR3aWR0aExpbWl0XyA9IDA7CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5wcm90b3R5cGUuYXVkaW9JbnB1dExldmVsXyA9IDA7CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5wcm90b3R5cGUuYXVkaW9PdXRwdXRMZXZlbF8gPSAwOwp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQucHJvdG90eXBlLm1lZGlhSW5mb18gPSBudWxsOwp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQucHJvdG90eXBlLmVsYXBzZWRUaW1lXyA9ICIwIjsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLklkID0ge0NPTk5FQ1RJT05fSU5GTzoieGkiLCBSRU5ERVJFUl9UWVBFOiJydCIsIExPQ0FMX1JFU09MVVRJT046ImxyIiwgUkVNT1RFX1JFU09MVVRJT046InJyIiwgQ0FMTF9JTkZPOiJjaSIsIENBTExfSElTVE9SWToiY2giLCBTVFJFQU1fU1RBVFM6InNzIn07CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5MT0NBTF9TU1JDID0gImxvY2FsIjsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLnByb3RvdHlwZS5jcmVhdGVEb20gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsRGFzaGJvYXJkJCRjcmVhdGVEb20kKCkgewogIHRoaXMuZGVjb3JhdGVJbnRlcm5hbCh0aGlzLmRvbV8uY3JlYXRlRWxlbWVudCgiZGl2IikpCn07CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5wcm90b3R5cGUuZGVjb3JhdGVJbnRlcm5hbCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkJGRlY29yYXRlSW50ZXJuYWwkKGVsZW1lbnQpIHsKICB0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuc3VwZXJDbGFzc18uZGVjb3JhdGVJbnRlcm5hbC5jYWxsKHRoaXMsIGVsZW1lbnQpOwogIGdvb2cuc3R5bGUuaW5zdGFsbFN0eWxlcygiI2Rhc2hib2FyZHtmb250LWZhbWlseTpzYW5zLXNlcmlmfSNkYXNoYm9hcmQgLnBhcnRpY2lwYW50e21hcmdpbi10b3A6MjBweH0jZGFzaGJvYXJkIGRpdi5hdWRpb3ttYXJnaW4tbGVmdDoxMHB4O21hcmdpbi10b3A6MTBweH0jZGFzaGJvYXJkIGRpdi52aWRlb3ttYXJnaW4tbGVmdDoxMHB4O21hcmdpbi10b3A6MTBweH0jZGFzaGJvYXJkIC5qaWR7Zm9udDppdGFsaWMgYm9sZCAxMjAlIHNhbnMtc2VyaWY7YmFja2dyb3VuZC1jb2xvcjojY2NjY2NjfSNkYXNoYm9hcmQgdGFibGV7cGFkZGluZzoxO2ZvbnQtc2l6ZTpzbWFsbH0jZGFzaGJvYXJkIHRoe2JhY2tncm91bmQtY29sb3I6I2NjY2NjY30jZGFzaGJvYXJkIHRke2JhY2tncm91bmQtY29sb3I6I2VlZWVlZTt2ZXJ0aWNhbC1hbGlnbjp0b3B9I2Rhc2hib2FyZCAuYXVkaW8gdGR7YmFja2dyb3VuZC1jb2xvcjojZWVlZWZmfSNkYXNoYm9hcmQgLmF1ZGlvIHRoe2JhY2tncm91bmQtY29sb3I6I2RkZGRlZX0jZGFzaGJvYXJkIC52aWRlbyB0ZHtiYWNrZ3JvdW5kLWNvbG9yOiNlZWZmZWV9I2Rhc2hib2FyZCAudmlkZW8gdGh7YmFja2dyb3VuZC1jb2xvcjojZGRlZWRkfSNkYXNoYm9hcmQgLnN0YXRzIHRkOmZpcnN0LWNoaWxke2ZvbnQtd2VpZ2h0OmJvbGR9IiwgCiAgdGhpcy5nZXRFbGVtZW50KCkpOwogIHRoaXMuZ2V0RWxlbWVudCgpLmlubmVySFRNTCA9IHRhbGsubWVkaWEuQ2FsbERhc2hib2FyZFRlbXBsYXRlKHRoaXMuY3JlYXRlVGVtcGxhdGVDb250ZXh0XygpKQp9Owp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQucHJvdG90eXBlLmNyZWF0ZVRlbXBsYXRlQ29udGV4dF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsRGFzaGJvYXJkJCRjcmVhdGVUZW1wbGF0ZUNvbnRleHRfJCgpIHsKICByZXR1cm57Y29ubmVjdGlvbkluZm9JZDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuSWQuQ09OTkVDVElPTl9JTkZPKSwgcmVuZGVyZXJUeXBlSWQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLklkLlJFTkRFUkVSX1RZUEUpLCBsb2NhbFJlc0lkOnRoaXMubWFrZUlkKHRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5JZC5MT0NBTF9SRVNPTFVUSU9OKSwgcmVtb3RlUmVzSWQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLklkLlJFTU9URV9SRVNPTFVUSU9OKSwgY2FsbEluZm9JZDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuSWQuQ0FMTF9JTkZPKSwgY2FsbEhpc3RvcnlJZDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuSWQuQ0FMTF9ISVNUT1JZKSwgc3RyZWFtU3RhdHNJZDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuSWQuU1RSRUFNX1NUQVRTKX0KfTsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLnByb3RvdHlwZS5vbk1lZGlhSW5mbyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkJG9uTWVkaWFJbmZvJChtZWRpYUluZm8pIHsKICB0aGlzLm1lZGlhSW5mb18gPSBtZWRpYUluZm87CiAgdGhpcy5lbGFwc2VkVGltZV8gPSBtZWRpYUluZm8uZWxhcHNlZFRpbWU7CiAgZm9yKHZhciBpID0gMDtpIDwgbWVkaWFJbmZvLmF1ZGlvUmVjZWl2ZXJJbmZvcy5sZW5ndGg7KytpKSB7CiAgICB2YXIgYXVkaW9TdHJlYW1JbmZvID0gdGhpcy5nZXRBdWRpb1N0cmVhbUluZm9fKG1lZGlhSW5mby5hdWRpb1JlY2VpdmVySW5mb3NbaV0uc3NyYyk7CiAgICBhdWRpb1N0cmVhbUluZm8ucmVjdiA9IG1lZGlhSW5mby5hdWRpb1JlY2VpdmVySW5mb3NbaV0KICB9CiAgZm9yKGkgPSAwO2kgPCBtZWRpYUluZm8uYXVkaW9TZW5kZXJJbmZvcy5sZW5ndGg7KytpKSB7CiAgICBhdWRpb1N0cmVhbUluZm8gPSB0aGlzLmdldEF1ZGlvU3RyZWFtSW5mb18obWVkaWFJbmZvLmF1ZGlvU2VuZGVySW5mb3NbaV0uc3NyYyksIGF1ZGlvU3RyZWFtSW5mby5zZW5kID0gbWVkaWFJbmZvLmF1ZGlvU2VuZGVySW5mb3NbaV0KICB9CiAgaWYoZ29vZy5pc0RlZkFuZE5vdE51bGwobWVkaWFJbmZvLnZpZGVvUmVjZWl2ZXJJbmZvcykpIHsKICAgIGZvcihpID0gMDtpIDwgbWVkaWFJbmZvLnZpZGVvUmVjZWl2ZXJJbmZvcy5sZW5ndGg7KytpKSB7CiAgICAgIHZhciB2aWRlb1N0cmVhbUluZm8gPSB0aGlzLmdldFZpZGVvU3RyZWFtSW5mb18obWVkaWFJbmZvLnZpZGVvUmVjZWl2ZXJJbmZvc1tpXS5zc3JjKTsKICAgICAgdmlkZW9TdHJlYW1JbmZvLnJlY3YgPSBtZWRpYUluZm8udmlkZW9SZWNlaXZlckluZm9zW2ldCiAgICB9CiAgfQogIGlmKGdvb2cuaXNEZWZBbmROb3ROdWxsKG1lZGlhSW5mby52aWRlb1NlbmRlckluZm9zKSkgewogICAgZm9yKGkgPSAwO2kgPCBtZWRpYUluZm8udmlkZW9TZW5kZXJJbmZvcy5sZW5ndGg7KytpKSB7CiAgICAgIHZpZGVvU3RyZWFtSW5mbyA9IHRoaXMuZ2V0VmlkZW9TdHJlYW1JbmZvXyhtZWRpYUluZm8udmlkZW9TZW5kZXJJbmZvc1tpXS5zc3JjKSwgdmlkZW9TdHJlYW1JbmZvLnNlbmQgPSBtZWRpYUluZm8udmlkZW9TZW5kZXJJbmZvc1tpXQogICAgfQogIH0KICB0aGlzLnVwZGF0ZURhc2hib2FyZF8oKQp9Owp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQucHJvdG90eXBlLm9uU3RyZWFtUmVhZHlNZXNzYWdlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbERhc2hib2FyZCQkb25TdHJlYW1SZWFkeU1lc3NhZ2UkKG1zZykgewogIGlmKDcgPCBtc2cubGVuZ3RoKSB7CiAgICB0aGlzLmdldEVsZW1lbnRCeUZyYWdtZW50KHRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5JZC5SRU5ERVJFUl9UWVBFKS5pbm5lckhUTUwgPSAiTzNEIjsKICAgIHZhciB3aWR0aCA9IG1zZ1s2XSwgaGVpZ2h0ID0gbXNnWzddLCBvcHRfcmVuZGVyZWRXaWR0aCA9IG1zZ1s4XSwgb3B0X3JlbmRlcmVkSGVpZ2h0ID0gbXNnWzldLCBjb250ZXh0ID0ge3dpZHRoOm9wdF9yZW5kZXJlZFdpZHRoIHx8IHdpZHRoLCBoZWlnaHQ6b3B0X3JlbmRlcmVkSGVpZ2h0IHx8IGhlaWdodH07CiAgICBnb29nLmlzRGVmQW5kTm90TnVsbChtc2dbNV0pID8gKGNvbnRleHQuZW5kcG9pbnQgPSAicmVtb3RlIiwgdGhpcy5nZXRFbGVtZW50QnlGcmFnbWVudCh0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuSWQuUkVNT1RFX1JFU09MVVRJT04pLmlubmVySFRNTCA9IHRhbGsubWVkaWEuUmVzb2x1dGlvblRlbXBsYXRlKGNvbnRleHQpKSA6IChjb250ZXh0LmVuZHBvaW50ID0gImxvY2FsIiwgdGhpcy5nZXRFbGVtZW50QnlGcmFnbWVudCh0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuSWQuTE9DQUxfUkVTT0xVVElPTikuaW5uZXJIVE1MID0gdGFsay5tZWRpYS5SZXNvbHV0aW9uVGVtcGxhdGUoY29udGV4dCkpCiAgfWVsc2UgewogICAgdGhpcy5nZXRFbGVtZW50QnlGcmFnbWVudCh0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuSWQuUkVOREVSRVJfVFlQRSkuaW5uZXJIVE1MID0gIkZsYXNoIgogIH0KfTsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLnByb3RvdHlwZS5vbkZsdXRlTWVzc2FnZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkJG9uRmx1dGVNZXNzYWdlJChlKSB7CiAgdGhpcy5leHRyYWN0Q2FsbEluZm9fKGUuZ2V0UGFyc2VkTXNnKCkpOwogIHRoaXMuZXh0cmFjdFNzcmNJbmZvXyhlLmdldFBhcnNlZE1zZygpKTsKICB0aGlzLnVwZGF0ZURhc2hib2FyZF8oKQp9Owp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQucHJvdG90eXBlLm9uSmluZ2xlTWVzc2FnZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkJG9uSmluZ2xlTWVzc2FnZSQoZSkgewogIHRoaXMuZXh0cmFjdFNzcmNJbmZvXyhlLmdldFBhcnNlZE1zZygpKTsKICB0aGlzLnVwZGF0ZURhc2hib2FyZF8oKQp9Owp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQucHJvdG90eXBlLm9uQXVkaW9JbmZvTWVzc2FnZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkJG9uQXVkaW9JbmZvTWVzc2FnZSQoZSkgewogIHZhciBqc29uID0gZS5nZXRQYXJzZWRNc2coKTsKICB0aGlzLmF1ZGlvSW5wdXRMZXZlbF8gPSBwYXJzZUludChqc29uWzNdLCAxMCk7CiAgdGhpcy5hdWRpb091dHB1dExldmVsXyA9IHBhcnNlSW50KGpzb25bNF1bMF0sIDEwKTsKICBmb3IodmFyIGkgPSAwO2kgPCBqc29uWzRdWzFdLmxlbmd0aDtpKyspIHsKICAgIHZhciBzcGVha2Vyc19zdHJlYW0gPSBqc29uWzRdWzFdW2ldOwogICAgdGhpcy5nZXRBdWRpb1N0cmVhbUluZm9fKHNwZWFrZXJzX3N0cmVhbVswXS50b1N0cmluZygpKS5sZXZlbCA9IHNwZWFrZXJzX3N0cmVhbVsxXQogIH0KfTsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLnByb3RvdHlwZS5leHRyYWN0Q2FsbEluZm9fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbERhc2hib2FyZCQkZXh0cmFjdENhbGxJbmZvXyQoanNvbikgewogIGlmKGpzb24pIHsKICAgIHN3aXRjaChqc29uWzBdKSB7CiAgICAgIGNhc2UgImphIjoKICAgICAgOwogICAgICBjYXNlICJqYyI6CiAgICAgIDsKICAgICAgY2FzZSAiam4iOgogICAgICA7CiAgICAgIGNhc2UgImp0IjoKICAgICAgOwogICAgICBjYXNlICJqc2EiOgogICAgICA7CiAgICAgIGNhc2UgImpzciI6CiAgICAgIDsKICAgICAgY2FzZSAianRyIjoKICAgICAgOwogICAgICBjYXNlICJqbHJ0cCI6CiAgICAgIDsKICAgICAgY2FzZSAianJ0cCI6CiAgICAgIDsKICAgICAgY2FzZSAianNob3ciOgogICAgICA7CiAgICAgIGNhc2UgImp1cCI6CiAgICAgIDsKICAgICAgY2FzZSAic3RyZWFtb24iOgogICAgICA7CiAgICAgIGNhc2UgInN0cmVhbW9mZiI6CiAgICAgICAganNvblsxXSAmJiB0aGlzLnJlbW90ZUppZHNfLmFkZChqc29uWzFdKSwganNvblsyXSAmJiB0aGlzLnNlc3Npb25JZHNfLmFkZChqc29uWzJdKQogICAgfQogICAgaWYoImpydHAiID09IGpzb25bMF0gfHwgImpscnRwIiA9PSBqc29uWzBdIHx8ICJqdXAiID09IGpzb25bMF0pIHsKICAgICAgdmFyIGF1ZGlvQ29kZWNzID0ganNvblszXSwgdmlkZW9Db2RlY3MgPSBqc29uWzRdOwogICAgICBhdWRpb0NvZGVjcyAmJiBhdWRpb0NvZGVjc1swXSAmJiAodGhpcy5sb2NhbEF1ZGlvQ29kZWNfID0gYXVkaW9Db2RlY3NbMF0pOwogICAgICB2aWRlb0NvZGVjcyAmJiB2aWRlb0NvZGVjc1swXSAmJiAodGhpcy5sb2NhbFZpZGVvQ29kZWNfID0gdmlkZW9Db2RlY3NbMF0pOwogICAgICB2YXIgYXVkaW9NZXRhSW5mbyA9IGpzb25bNV0sIHZpZGVvTWV0YUluZm8gPSBqc29uWzZdOwogICAgICBhdWRpb01ldGFJbmZvICYmIGF1ZGlvTWV0YUluZm8ucyAmJiAodGhpcy5sb2NhbEF1ZGlvU3NyY18gPSBhdWRpb01ldGFJbmZvLnMpOwogICAgICB2aWRlb01ldGFJbmZvICYmIHZpZGVvTWV0YUluZm8ucyAmJiAodGhpcy5sb2NhbFZpZGVvU3NyY18gPSB2aWRlb01ldGFJbmZvLnMpCiAgICB9ZWxzZSB7CiAgICAgIGlmKCJqc2hvdyIgPT0ganNvblswXSkgewogICAgICAgIHZhciBwYXJhbXMgPSBqc29uWzNdOwogICAgICAgIHBhcmFtcyAmJiBwYXJhbXMubWF4QmFuZHdpZHRoICYmICh0aGlzLnZpZGVvQmFuZHdpZHRoTGltaXRfID0gTWF0aC5yb3VuZChwYXJhbXMubWF4QmFuZHdpZHRoIC8gMTAyNCkpCiAgICAgIH0KICAgIH0KICB9Cn07CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5wcm90b3R5cGUuZXh0cmFjdFNzcmNJbmZvXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkJGV4dHJhY3RTc3JjSW5mb18kKGpzb24pIHsKICBpZihqc29uKSB7CiAgICBzd2l0Y2goanNvblswXSkgewogICAgICBjYXNlICJqc2EiOgogICAgICA7CiAgICAgIGNhc2UgImpzciI6CiAgICAgICAgdmFyIGF1ZGlvU3NyYyA9IGpzb25bM10sIHZpZGVvU3NyYyA9IGpzb25bNF07CiAgICAgICAgYXVkaW9Tc3JjICYmICgianNhIiA9PSBqc29uWzBdID8gKHRoaXMuYXVkaW9Tc3Jjc0FkZGVkXy5hZGQoYXVkaW9Tc3JjKSwgdGhpcy5hdWRpb1NzcmNzUmVtb3ZlZF8ucmVtb3ZlKGF1ZGlvU3NyYykpIDogImpzciIgPT0ganNvblswXSAmJiAodGhpcy5hdWRpb1NzcmNzUmVtb3ZlZF8uYWRkKGF1ZGlvU3NyYyksIHRoaXMuYXVkaW9Tc3Jjc0FkZGVkXy5yZW1vdmUoYXVkaW9Tc3JjKSksIHRoaXMuZ2V0QXVkaW9TdHJlYW1JbmZvXyhhdWRpb1NzcmMpLmNvdW50RXZlbnQoanNvblswXSkpOwogICAgICAgIHZpZGVvU3NyYyAmJiAoImpzYSIgPT0ganNvblswXSA/ICh0aGlzLnZpZGVvU3NyY3NBZGRlZF8uYWRkKHZpZGVvU3NyYyksIHRoaXMudmlkZW9Tc3Jjc1JlbW92ZWRfLnJlbW92ZSh2aWRlb1NzcmMpKSA6ICJqc3IiID09IGpzb25bMF0gJiYgKHRoaXMudmlkZW9Tc3Jjc1JlbW92ZWRfLmFkZCh2aWRlb1NzcmMpLCB0aGlzLnZpZGVvU3NyY3NBZGRlZF8ucmVtb3ZlKHZpZGVvU3NyYykpLCB0aGlzLmdldFZpZGVvU3RyZWFtSW5mb18odmlkZW9Tc3JjKS5jb3VudEV2ZW50KGpzb25bMF0pKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAic3RyZWFtb24iOgogICAgICAgIHZhciB2aWRlb1N0cmVhbUluZm8gPSB0aGlzLmdldFZpZGVvU3RyZWFtSW5mb18oanNvbls1XSB8fCB0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuTE9DQUxfU1NSQyk7CiAgICAgICAgdmlkZW9TdHJlYW1JbmZvLmNvdW50RXZlbnQoanNvblswXSk7CiAgICAgICAgdmlkZW9TdHJlYW1JbmZvLnVwZGF0ZVRleHR1cmVTaXplKGpzb25bNl0sIGpzb25bN10pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJzdHJlYW1yZWFkeSI6CiAgICAgICAgdmlkZW9TdHJlYW1JbmZvID0gdGhpcy5nZXRWaWRlb1N0cmVhbUluZm9fKGpzb25bNV0gfHwgdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLkxPQ0FMX1NTUkMpOwogICAgICAgIHZpZGVvU3RyZWFtSW5mby5jb3VudEV2ZW50KGpzb25bMF0pOwogICAgICAgIHZpZGVvU3RyZWFtSW5mby51cGRhdGVTdHJlYW1TaXplcyhqc29uWzZdLCBqc29uWzddLCBqc29uWzhdLCBqc29uWzldLCBqc29uWzEwXSwganNvblsxMV0pOwogICAgICAgIHRoaXMub25TdHJlYW1SZWFkeU1lc3NhZ2UoanNvbik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInN0cmVhbW9mZiI6CiAgICAgICAgdGhpcy5nZXRWaWRlb1N0cmVhbUluZm9fKGpzb25bM10gfHwgdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLkxPQ0FMX1NTUkMpLmNvdW50RXZlbnQoanNvblswXSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInN0cmVhbWZhaWxlZCI6CiAgICAgICAgdGhpcy5nZXRWaWRlb1N0cmVhbUluZm9fKGpzb25bNV0gfHwgdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLkxPQ0FMX1NTUkMpLmNvdW50RXZlbnQoanNvblswXSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInZpZXciOgogICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IGpzb25bM10ubGVuZ3RoO2krKykgewogICAgICAgICAgdmFyIHZpZXcgPSBqc29uWzNdW2ldOwogICAgICAgICAgInNlbGVjdGVkIiA9PSB2aWV3WzBdICYmICh2aWRlb1N0cmVhbUluZm8gPSB0aGlzLmdldFZpZGVvU3RyZWFtSW5mb18odmlld1syXSksIHZpZGVvU3RyZWFtSW5mby5jb3VudEV2ZW50KGpzb25bMF0pLCB2aWRlb1N0cmVhbUluZm8udXBkYXRlVmlld3BvcnQodmlld1szXSwgdmlld1s0XSwgdmlld1s1XSkpCiAgICAgICAgfQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLnByb3RvdHlwZS5nZXRWaWRlb1N0cmVhbUluZm9fID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbERhc2hib2FyZCQkZ2V0VmlkZW9TdHJlYW1JbmZvXyQodmlkZW9Tc3JjKSB7CiAgdGhpcy52aWRlb1NzcmNJbmZvX1t2aWRlb1NzcmNdIHx8ICh0aGlzLnZpZGVvU3NyY0luZm9fW3ZpZGVvU3NyY10gPSBuZXcgdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLlZpZGVvU3RyZWFtSW5mbyh2aWRlb1NzcmMpKTsKICByZXR1cm4gdGhpcy52aWRlb1NzcmNJbmZvX1t2aWRlb1NzcmNdCn07CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5wcm90b3R5cGUuZ2V0QXVkaW9TdHJlYW1JbmZvXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkJGdldEF1ZGlvU3RyZWFtSW5mb18kKGF1ZGlvU3NyYykgewogIHRoaXMuYXVkaW9Tc3JjSW5mb19bYXVkaW9Tc3JjXSB8fCAodGhpcy5hdWRpb1NzcmNJbmZvX1thdWRpb1NzcmNdID0gbmV3IHRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5BdWRpb1N0cmVhbUluZm8oYXVkaW9Tc3JjKSk7CiAgcmV0dXJuIHRoaXMuYXVkaW9Tc3JjSW5mb19bYXVkaW9Tc3JjXQp9Owp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQucHJvdG90eXBlLnVwZGF0ZURhc2hib2FyZF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsRGFzaGJvYXJkJCR1cGRhdGVEYXNoYm9hcmRfJCgpIHsKICBpZih0aGlzLmNhbGxNYW5hZ2VyXykgewogICAgdmFyIGNhbGwgPSB0aGlzLmNhbGxNYW5hZ2VyXy5nZXRBY3RpdmVDYWxsKCk7CiAgICBpZihjYWxsKSB7CiAgICAgIHZhciBsb2NhbFRpbWUgPSBuZXcgRGF0ZSwgbWFwcGluZ3MgPSBudWxsLCBzYiA9IG5ldyBnb29nLnN0cmluZy5TdHJpbmdCdWZmZXIsIG1hcHBpbmdzID0gY2FsbC5pc011bHRpd2F5KCkgPyB0aGlzLmdldE11bHRpd2F5TWFwcGluZ3NfKGNhbGwpIDogdGhpcy5nZXRPbmVPbk9uZU1hcHBpbmdzXyhjYWxsKTsKICAgICAgc2IuYXBwZW5kKHRhbGsubWVkaWEuQ2FsbEluZm9UZW1wbGF0ZSh7bG9jYWxUaW1lOmxvY2FsVGltZSwgY2FsbFRpbWU6IkNhbGwgdGltZTogIiArIHRoaXMuZWxhcHNlZFRpbWVfICsgIiBzZWNvbmRzIiwgbnVtYmVyT2ZVc2VyczptYXBwaW5ncyA/IG1hcHBpbmdzLmxlbmd0aCA6ICJuL2EiLCBudW1iZXJPZkF1ZGlvU2VuZGVyczpjYWxsLmlzTXVsdGl3YXkoKSA/IGNhbGwuZ2V0TnVtYmVyT2ZBdWRpb1NlbmRlcnMoKSA6IDEsIG51bWJlck9mVmlkZW9TZW5kZXJzOmNhbGwuaXNNdWx0aXdheSgpID8gY2FsbC5nZXROdW1iZXJPZlZpZGVvU2VuZGVycygpIDogMSwgbG9jYWxBdWRpb1NzcmM6Y2FsbC5pc011bHRpd2F5KCkgPyB0aGlzLmxvY2FsQXVkaW9Tc3JjXyA6IHRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5MT0NBTF9TU1JDLCBsb2NhbFZpZGVvU3NyYzpjYWxsLmlzTXVsdGl3YXkoKSA/IHRoaXMubG9jYWxWaWRlb1NzcmNfIDogdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLkxPQ0FMX1NTUkMsIAogICAgICBsb2NhbEF1ZGlvQ29kZWM6dGhpcy5sb2NhbEF1ZGlvQ29kZWNfLCBsb2NhbFZpZGVvQ29kZWM6dGhpcy5sb2NhbFZpZGVvQ29kZWNfLCB2aWRlb0JhbmR3aWR0aExpbWl0OnRoaXMudmlkZW9CYW5kd2lkdGhMaW1pdF8sIGF1ZGlvSW5wdXRMZXZlbDp0aGlzLmF1ZGlvSW5wdXRMZXZlbF8sIGF1ZGlvT3V0cHV0TGV2ZWw6dGhpcy5hdWRpb091dHB1dExldmVsXywgbnVtQ3B1czp0aGlzLm1lZGlhSW5mb18gPyB0aGlzLm1lZGlhSW5mb18uZ2xvYmFsSW5mby5jcHVzIDogIm4vYSIsIHBsdWdpbkNwdTp0aGlzLm1lZGlhSW5mb18gPyB0aGlzLm1lZGlhSW5mb18uZ2xvYmFsSW5mby5jcHUgOiAibi9hIiwgdG90YWxDcHU6dGhpcy5tZWRpYUluZm9fID8gdGhpcy5tZWRpYUluZm9fLmdsb2JhbEluZm8udG90YWxDcHUgOiAibi9hIn0pKTsKICAgICAgdGhpcy5nZXRFbGVtZW50QnlGcmFnbWVudCh0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuSWQuQ0FMTF9JTkZPKS5pbm5lckhUTUwgPSBzYi50b1N0cmluZygpOwogICAgICBzYi5jbGVhcigpOwogICAgICBpZihtYXBwaW5ncykgewogICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IG1hcHBpbmdzLmxlbmd0aDtpKyspIHsKICAgICAgICAgIHNiLmFwcGVuZCh0YWxrLm1lZGlhLlN0cmVhbUhlYWRlclRlbXBsYXRlKG1hcHBpbmdzW2ldKSksIHNiLmFwcGVuZCh0YWxrLm1lZGlhLlN0cmVhbUF1ZGlvUm93VGVtcGxhdGUobWFwcGluZ3NbaV0uYXVkaW8pKSwgc2IuYXBwZW5kKHRhbGsubWVkaWEuU3RyZWFtTWlkZGxlVGVtcGxhdGUobWFwcGluZ3NbaV0pKSwgc2IuYXBwZW5kKHRhbGsubWVkaWEuU3RyZWFtVmlkZW9Sb3dUZW1wbGF0ZShtYXBwaW5nc1tpXS52aWRlbykpLCBzYi5hcHBlbmQodGFsay5tZWRpYS5TdHJlYW1Gb290ZXJUZW1wbGF0ZShtYXBwaW5nc1tpXSkpCiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuZ2V0RWxlbWVudEJ5RnJhZ21lbnQodGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLklkLlNUUkVBTV9TVEFUUykuaW5uZXJIVE1MID0gc2IudG9TdHJpbmcoKTsKICAgICAgc2IuY2xlYXIoKTsKICAgICAgc2IuYXBwZW5kKHRhbGsubWVkaWEuQ2FsbEhpc3RvcnlUZW1wbGF0ZSh7YWxsUmVtb3RlSmlkczp0aGlzLnJlbW90ZUppZHNfLmdldFZhbHVlcygpLmpvaW4oIiwgIiksIGFsbFNlc3Npb25JZHM6dGhpcy5zZXNzaW9uSWRzXy5nZXRWYWx1ZXMoKS5qb2luKCIsICIpLCBhbGxBdWRpb1NzcmNzQWRkZWQ6dGhpcy5hdWRpb1NzcmNzQWRkZWRfLmdldFZhbHVlcygpLnNvcnQoKS5qb2luKCIsICIpLCBhbGxWaWRlb1NzcmNzQWRkZWQ6dGhpcy52aWRlb1NzcmNzQWRkZWRfLmdldFZhbHVlcygpLnNvcnQoKS5qb2luKCIsICIpLCBhbGxBdWRpb1NzcmNzUmVtb3ZlZDp0aGlzLmF1ZGlvU3NyY3NSZW1vdmVkXy5nZXRWYWx1ZXMoKS5zb3J0KCkuam9pbigiLCAiKSwgYWxsVmlkZW9Tc3Jjc1JlbW92ZWQ6dGhpcy52aWRlb1NzcmNzUmVtb3ZlZF8uZ2V0VmFsdWVzKCkuc29ydCgpLmpvaW4oIiwgIiksIGFsbFJlbW90ZUppZHNDb3VudDp0aGlzLnJlbW90ZUppZHNfLmdldFZhbHVlcygpLmxlbmd0aCwgCiAgICAgIGFsbFNlc3Npb25JZHNDb3VudDp0aGlzLnNlc3Npb25JZHNfLmdldFZhbHVlcygpLmxlbmd0aCwgYWxsQXVkaW9Tc3Jjc0FkZGVkQ291bnQ6dGhpcy5hdWRpb1NzcmNzQWRkZWRfLmdldFZhbHVlcygpLmxlbmd0aCwgYWxsVmlkZW9Tc3Jjc0FkZGVkQ291bnQ6dGhpcy52aWRlb1NzcmNzQWRkZWRfLmdldFZhbHVlcygpLmxlbmd0aCwgYWxsQXVkaW9Tc3Jjc1JlbW92ZWRDb3VudDp0aGlzLmF1ZGlvU3NyY3NSZW1vdmVkXy5nZXRWYWx1ZXMoKS5sZW5ndGgsIGFsbFZpZGVvU3NyY3NSZW1vdmVkQ291bnQ6dGhpcy52aWRlb1NzcmNzUmVtb3ZlZF8uZ2V0VmFsdWVzKCkubGVuZ3RofSkpOwogICAgICB2YXIgemlwcHlFeHBhbmRTdGF0ZSA9IHt9OwogICAgICBnb29nLml0ZXIuZm9yRWFjaCh0aGlzLnppcHBpZXNfLmdldEtleUl0ZXJhdG9yKCksIGZ1bmN0aW9uKG5pY2spIHsKICAgICAgICB2YXIgemlwcHkgPSB0aGlzLnppcHBpZXNfLmdldChuaWNrKTsKICAgICAgICB6aXBweUV4cGFuZFN0YXRlW25pY2tdID0gemlwcHkuaXNFeHBhbmRlZCgpOwogICAgICAgIGdvb2cuZGlzcG9zZSh6aXBweSkKICAgICAgfSwgdGhpcyk7CiAgICAgIHRoaXMuemlwcGllc18uY2xlYXIoKTsKICAgICAgdGhpcy5nZXRFbGVtZW50QnlGcmFnbWVudCh0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuSWQuQ0FMTF9ISVNUT1JZKS5pbm5lckhUTUwgPSBzYi50b1N0cmluZygpOwogICAgICBmb3IoaSA9IDA7aSA8IG1hcHBpbmdzLmxlbmd0aDtpKyspIHsKICAgICAgICB2YXIgbmljayQkMCA9IG1hcHBpbmdzW2ldLmppZDsKICAgICAgICB0aGlzLnppcHBpZXNfLnNldChuaWNrJCQwLCBuZXcgZ29vZy51aS5aaXBweSgiemlwcHlfIiArIG5pY2skJDAsIG5pY2skJDAsIHppcHB5RXhwYW5kU3RhdGVbbmljayQkMF0sIG51bGwsIHRoaXMuZG9tXykpCiAgICAgIH0KICAgICAgaWYodGhpcy5tZWRpYUluZm9fKSB7CiAgICAgICAgc2IuY2xlYXIoKTsKICAgICAgICBzYi5hcHBlbmQodGFsay5tZWRpYS5Db25uZWN0aW9uSGVhZGVyVGVtcGxhdGUodGhpcy5tZWRpYUluZm9fKSk7CiAgICAgICAgZm9yKGkgPSAwO2kgPCB0aGlzLm1lZGlhSW5mb18uYXVkaW9Db25uZWN0aW9uSW5mb3MubGVuZ3RoOysraSkgewogICAgICAgICAgc2IuYXBwZW5kKHRhbGsubWVkaWEuQ29ubmVjdGlvblJvd1RlbXBsYXRlKHRoaXMubWVkaWFJbmZvXy5hdWRpb0Nvbm5lY3Rpb25JbmZvc1tpXSkpCiAgICAgICAgfQogICAgICAgIGlmKGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMubWVkaWFJbmZvXy52aWRlb0Nvbm5lY3Rpb25JbmZvcykpIHsKICAgICAgICAgIGZvcihpID0gMDtpIDwgdGhpcy5tZWRpYUluZm9fLnZpZGVvQ29ubmVjdGlvbkluZm9zLmxlbmd0aDsrK2kpIHsKICAgICAgICAgICAgc2IuYXBwZW5kKHRhbGsubWVkaWEuQ29ubmVjdGlvblJvd1RlbXBsYXRlKHRoaXMubWVkaWFJbmZvXy52aWRlb0Nvbm5lY3Rpb25JbmZvc1tpXSkpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNiLmFwcGVuZCh0YWxrLm1lZGlhLkNvbm5lY3Rpb25Gb290ZXJUZW1wbGF0ZSh0aGlzLm1lZGlhSW5mb18pKTsKICAgICAgICB0aGlzLmdldEVsZW1lbnRCeUZyYWdtZW50KHRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5JZC5DT05ORUNUSU9OX0lORk8pLmlubmVySFRNTCA9IHNiLnRvU3RyaW5nKCkKICAgICAgfQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLnByb3RvdHlwZS5nZXRPbmVPbk9uZU1hcHBpbmdzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkJGdldE9uZU9uT25lTWFwcGluZ3NfJChjYWxsKSB7CiAgaWYoIWNhbGwgfHwgY2FsbC5pc011bHRpd2F5KCkgfHwgMSAhPSBjYWxsLnJlbW90ZUppZHMubGVuZ3RoKSB7CiAgICByZXR1cm4gbnVsbAogIH0KICB2YXIgbG9jYWwgPSB7fTsKICBsb2NhbC5qaWQgPSB0aGlzLmxvY2FsSmlkXzsKICBsb2NhbC5hdWRpbyA9IHt9OwogIGxvY2FsLmF1ZGlvLnNzcmMgPSB0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuTE9DQUxfU1NSQzsKICBsb2NhbC5hdWRpby5zdHJlYW0gPSB0aGlzLmdldEF1ZGlvU3RyZWFtSW5mb18obG9jYWwuYXVkaW8uc3NyYyk7CiAgbG9jYWwuYXVkaW8uZXZlbnRzID0gbG9jYWwuYXVkaW8uc3RyZWFtLmV2ZW50czsKICBsb2NhbC5hdWRpby5zZW5kID0gbG9jYWwuYXVkaW8uc3RyZWFtLnNlbmQ7CiAgbG9jYWwuYXVkaW8ucmVjdiA9IGxvY2FsLmF1ZGlvLnN0cmVhbS5yZWN2OwogIGxvY2FsLnZpZGVvID0ge307CiAgbG9jYWwudmlkZW8uc3NyYyA9IHRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5MT0NBTF9TU1JDOwogIGxvY2FsLnZpZGVvLnN0cmVhbSA9IHRoaXMuZ2V0VmlkZW9TdHJlYW1JbmZvXyhsb2NhbC52aWRlby5zc3JjKTsKICBsb2NhbC52aWRlby5ldmVudHMgPSBsb2NhbC52aWRlby5zdHJlYW0uZXZlbnRzOwogIGxvY2FsLnZpZGVvLnNlbmQgPSBsb2NhbC52aWRlby5zdHJlYW0uc2VuZDsKICBsb2NhbC52aWRlby5yZWN2ID0gbG9jYWwudmlkZW8uc3RyZWFtLnJlY3Y7CiAgbG9jYWwubm90ZXMgPSB0aGlzLmFkZFN0cmVhbU5vdGVzXyhsb2NhbCwgITEpOwogIHZhciByZW1vdGUgPSB7fTsKICByZW1vdGUuamlkID0gYXBwcy5jaGF0LmNvcmUuSmlkLm5vcm1hbGl6ZWRCYXJlUGFydChjYWxsLnJlbW90ZUppZHNbMF0pOwogIHJlbW90ZS5hdWRpbyA9IHt9OwogIHJlbW90ZS5hdWRpby5zc3JjID0gIjAiOwogIHJlbW90ZS5hdWRpby5zdHJlYW0gPSB0aGlzLmdldEF1ZGlvU3RyZWFtSW5mb18ocmVtb3RlLmF1ZGlvLnNzcmMpOwogIHJlbW90ZS5hdWRpby5ldmVudHMgPSByZW1vdGUuYXVkaW8uc3RyZWFtLmV2ZW50czsKICByZW1vdGUuYXVkaW8uc2VuZCA9IHJlbW90ZS5hdWRpby5zdHJlYW0uc2VuZDsKICByZW1vdGUuYXVkaW8ucmVjdiA9IHJlbW90ZS5hdWRpby5zdHJlYW0ucmVjdjsKICByZW1vdGUudmlkZW8gPSB7fTsKICByZW1vdGUudmlkZW8uc3NyYyA9ICIwIjsKICByZW1vdGUudmlkZW8uc3RyZWFtID0gdGhpcy5nZXRWaWRlb1N0cmVhbUluZm9fKHJlbW90ZS52aWRlby5zc3JjKTsKICByZW1vdGUudmlkZW8uZXZlbnRzID0gcmVtb3RlLnZpZGVvLnN0cmVhbS5ldmVudHM7CiAgcmVtb3RlLnZpZGVvLnNlbmQgPSByZW1vdGUudmlkZW8uc3RyZWFtLnNlbmQ7CiAgcmVtb3RlLnZpZGVvLnJlY3YgPSByZW1vdGUudmlkZW8uc3RyZWFtLnJlY3Y7CiAgcmVtb3RlLm5vdGVzID0gdGhpcy5hZGRTdHJlYW1Ob3Rlc18ocmVtb3RlLCAhMSk7CiAgcmV0dXJuW2xvY2FsLCByZW1vdGVdCn07CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5wcm90b3R5cGUuZ2V0TXVsdGl3YXlNYXBwaW5nc18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsRGFzaGJvYXJkJCRnZXRNdWx0aXdheU1hcHBpbmdzXyQoY2FsbCkgewogIGlmKCFjYWxsIHx8ICFjYWxsLmlzTXVsdGl3YXkoKSkgewogICAgcmV0dXJuIG51bGwKICB9CiAgdmFyIHJvd3MgPSBbXSwgamlkcyA9IGNhbGwuc3NyY01hcC5nZXRLZXlzKCk7CiAgamlkcy5zb3J0KCk7CiAgZm9yKHZhciBpID0gMDtpIDwgamlkcy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgbWFwRW50cnkgPSBjYWxsLnNzcmNNYXAuZ2V0KGppZHNbaV0pLCByb3cgPSB7fTsKICAgIHJvdy5qaWQgPSBhcHBzLmNoYXQuY29yZS5KaWQubm9ybWFsaXplZEJhcmVQYXJ0KGppZHNbaV0pOwogICAgcm93LnJlc291cmNlID0gYXBwcy5jaGF0LmNvcmUuSmlkLnJlc291cmNlKGppZHNbaV0pOwogICAgcm93LmF1ZGlvID0ge307CiAgICByb3cuYXVkaW8uc3NyYyA9IG1hcEVudHJ5LmF1ZGlvU3NyYzsKICAgIHJvdy5hdWRpby5zdHJlYW0gPSB0aGlzLmdldEF1ZGlvU3RyZWFtSW5mb18ocm93LmF1ZGlvLnNzcmMpOwogICAgcm93LmF1ZGlvLmV2ZW50cyA9IHJvdy5hdWRpby5zdHJlYW0uZXZlbnRzOwogICAgcm93LmF1ZGlvLnNlbmQgPSByb3cuYXVkaW8uc3RyZWFtLnNlbmQ7CiAgICByb3cuYXVkaW8ucmVjdiA9IHJvdy5hdWRpby5zdHJlYW0ucmVjdjsKICAgIHJvdy52aWRlbyA9IHt9OwogICAgcm93LnZpZGVvLnJlY3ZTc3JjID0gbWFwRW50cnkudmlkZW9Tc3JjOwogICAgcm93LnZpZGVvLnN0cmVhbSA9IHRoaXMuZ2V0VmlkZW9TdHJlYW1JbmZvXyhyb3cudmlkZW8ucmVjdlNzcmMpOwogICAgcm93LnZpZGVvLmV2ZW50cyA9IHJvdy52aWRlby5zdHJlYW0uZXZlbnRzOwogICAgcm93LnZpZGVvLnJlY3YgPSByb3cudmlkZW8uc3RyZWFtLnJlY3Y7CiAgICByb3cudmlkZW8uc2VuZCA9IHJvdy52aWRlby5zdHJlYW0uc2VuZDsKICAgIHJvdy52aWRlby5zZW5kU3NyYyA9IG51bGw7CiAgICByb3cudmlkZW8uZnBzSWQgPSByb3cuamlkOwogICAgIXJvdy52aWRlby5zZW5kICYmIDAgPT0gcm93LmppZC5pbmRleE9mKHRoaXMubG9jYWxKaWRfLnJlcGxhY2UoIkAiLCAiXyIpKSAmJiAocm93LnZpZGVvLnNlbmRTc3JjID0gdGhpcy5sb2NhbFZpZGVvU3NyY18sIHJvdy52aWRlby5zZW5kID0gdGhpcy5nZXRWaWRlb1N0cmVhbUluZm9fKHJvdy52aWRlby5zZW5kU3NyYykuc2VuZCk7CiAgICByb3cubm90ZXMgPSB0aGlzLmFkZFN0cmVhbU5vdGVzXyhyb3csICEwKTsKICAgIHJvd3MucHVzaChyb3cpCiAgfQogIHJldHVybiByb3dzCn07CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5wcm90b3R5cGUuYWRkU3RyZWFtTm90ZXNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbERhc2hib2FyZCQkYWRkU3RyZWFtTm90ZXNfJChtYXBSb3csIGlzTXVsdGl3YXkpIHsKICB2YXIgc2IgPSBuZXcgZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyOwogIG1hcFJvdy52aWRlby5zc3JjICYmICFtYXBSb3cuYXVkaW8uc3NyYyAmJiBzYi5hcHBlbmQoIlZpZGVvIHdpdGhvdXQgYXVkaW8sICIpOwogIG1hcFJvdy5hdWRpby5ldmVudHMgJiYgKDEgPCBtYXBSb3cuYXVkaW8uZXZlbnRzLmpzYSAmJiBzYi5hcHBlbmQoIkF1ZGlvIGFkZGVkIG1vcmUgdGhhbiBvbmNlLCAiKSwgbWFwUm93LmF1ZGlvLmV2ZW50cy5qc3IgPiBtYXBSb3cuYXVkaW8uZXZlbnRzLmpzYSAmJiBzYi5hcHBlbmQoIkF1ZGlvIGpzcj5qc2EsICIpKTsKICAxIDwgbWFwUm93LnZpZGVvLmV2ZW50cy5qc2EgJiYgc2IuYXBwZW5kKCJWaWRlbyBhZGRlZCBtb3JlIHRoYW4gb25jZSwgIik7CiAgbWFwUm93LnZpZGVvLmV2ZW50cy5qc3IgPiBtYXBSb3cudmlkZW8uZXZlbnRzLmpzYSAmJiBzYi5hcHBlbmQoIlZpZGVvIGpzcj5qc2EsICIpOwogIGlzTXVsdGl3YXkgJiYgMCA9PSBtYXBSb3cudmlkZW8uZXZlbnRzLmpzYSAmJiAwIDwgbWFwUm93LnZpZGVvLmV2ZW50cy5zdHJlYW1vbiAmJiBzYi5hcHBlbmQoIlZpZGVvIHN0cmVhbW9uIHdpdGhvdXQganNhLCAiKTsKICAwIDwgbWFwUm93LnZpZGVvLmV2ZW50cy5zdHJlYW1mYWlsZWQgJiYgc2IuYXBwZW5kKCI8Yj48Zm9udCBjb2xvcj1yZWQ+VmlkZW8gc3RyZWFtIGZhaWxlZC48L2ZvbnQ+PC9iPiIpOwogIHJldHVybiBzYi50b1N0cmluZygpCn07CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5WaWV3cG9ydCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkVmlld3BvcnQkKHcsIGgsIGZwcykgewogIHRoaXMud2lkdGggPSB3OwogIHRoaXMuaGVpZ2h0ID0gaDsKICB0aGlzLmZwcyA9IGZwcwp9Owp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuVmlld3BvcnQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbERhc2hib2FyZCRWaWV3cG9ydCQkdG9TdHJpbmckKCkgewogIHJldHVybiB0aGlzLndpZHRoICsgIngiICsgdGhpcy5oZWlnaHQgKyAiQCIgKyB0aGlzLmZwcwp9Owp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuVmlkZW9TdHJlYW1JbmZvID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkQ2FsbERhc2hib2FyZCRWaWRlb1N0cmVhbUluZm8kKHNzcmMpIHsKICB0aGlzLnNzcmMgPSBzc3JjOwogIHRoaXMudmlld3BvcnQgPSBuZXcgdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLlZpZXdwb3J0KDAsIDAsIDApOwogIHRoaXMuZXZlbnRzID0ge2pzYTowLCBqc3I6MCwgc3RyZWFtb246MCwgc3RyZWFtcmVhZHk6MCwgc3RyZWFtZmFpbGVkOjAsIHN0cmVhbW9mZjowLCB2aWV3OjB9Cn07CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5WaWRlb1N0cmVhbUluZm8ucHJvdG90eXBlLnRleHR1cmVXaWR0aCA9IDA7CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5WaWRlb1N0cmVhbUluZm8ucHJvdG90eXBlLnRleHR1cmVIZWlnaHQgPSAwOwp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuVmlkZW9TdHJlYW1JbmZvLnByb3RvdHlwZS5zb3VyY2VXaWR0aCA9IDA7CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5WaWRlb1N0cmVhbUluZm8ucHJvdG90eXBlLnNvdXJjZUhlaWdodCA9IDA7CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5WaWRlb1N0cmVhbUluZm8ucHJvdG90eXBlLnBpeGVsV2lkdGggPSAwOwp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuVmlkZW9TdHJlYW1JbmZvLnByb3RvdHlwZS5waXhlbEhlaWdodCA9IDA7CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5WaWRlb1N0cmVhbUluZm8ucHJvdG90eXBlLnJlbmRlcldpZHRoID0gMDsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLlZpZGVvU3RyZWFtSW5mby5wcm90b3R5cGUucmVuZGVySGVpZ2h0ID0gMDsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLlZpZGVvU3RyZWFtSW5mby5wcm90b3R5cGUucmVjdiA9IG51bGw7CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5WaWRlb1N0cmVhbUluZm8ucHJvdG90eXBlLnNlbmQgPSBudWxsOwp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuVmlkZW9TdHJlYW1JbmZvLnByb3RvdHlwZS51cGRhdGVWaWV3cG9ydCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkVmlkZW9TdHJlYW1JbmZvJCR1cGRhdGVWaWV3cG9ydCQodywgaCwgZnBzKSB7CiAgdGhpcy52aWV3cG9ydCA9IG5ldyB0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuVmlld3BvcnQodywgaCwgZnBzKQp9Owp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuVmlkZW9TdHJlYW1JbmZvLnByb3RvdHlwZS51cGRhdGVUZXh0dXJlU2l6ZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkVmlkZW9TdHJlYW1JbmZvJCR1cGRhdGVUZXh0dXJlU2l6ZSQodGV4dHVyZVdpZHRoLCB0ZXh0dXJlSGVpZ2h0KSB7CiAgdGhpcy50ZXh0dXJlV2lkdGggPSB0ZXh0dXJlV2lkdGg7CiAgdGhpcy50ZXh0dXJlSGVpZ2h0ID0gdGV4dHVyZUhlaWdodAp9Owp0YWxrLm1lZGlhLkNhbGxEYXNoYm9hcmQuVmlkZW9TdHJlYW1JbmZvLnByb3RvdHlwZS51cGRhdGVTdHJlYW1TaXplcyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkVmlkZW9TdHJlYW1JbmZvJCR1cGRhdGVTdHJlYW1TaXplcyQoc291cmNlV2lkdGgsIHNvdXJjZUhlaWdodCwgcmVuZGVyV2lkdGgsIHJlbmRlckhlaWdodCwgcGl4ZWxXaWR0aCwgcGl4ZWxIZWlnaHQpIHsKICB0aGlzLnNvdXJjZVdpZHRoID0gc291cmNlV2lkdGg7CiAgdGhpcy5zb3VyY2VIZWlnaHQgPSBzb3VyY2VIZWlnaHQ7CiAgdGhpcy5yZW5kZXJXaWR0aCA9IHJlbmRlcldpZHRoOwogIHRoaXMucmVuZGVySGVpZ2h0ID0gcmVuZGVySGVpZ2h0OwogIHRoaXMucGl4ZWxXaWR0aCA9IHBpeGVsV2lkdGg7CiAgdGhpcy5waXhlbEhlaWdodCA9IHBpeGVsSGVpZ2h0Cn07CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5WaWRlb1N0cmVhbUluZm8ucHJvdG90eXBlLmNvdW50RXZlbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRDYWxsRGFzaGJvYXJkJFZpZGVvU3RyZWFtSW5mbyQkY291bnRFdmVudCQoZXZlbnQpIHsKICB0aGlzLmV2ZW50c1tldmVudF0gPyB0aGlzLmV2ZW50c1tldmVudF0rKyA6IHRoaXMuZXZlbnRzW2V2ZW50XSA9IDEKfTsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLkF1ZGlvU3RyZWFtSW5mbyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkQXVkaW9TdHJlYW1JbmZvJChzc3JjKSB7CiAgdGhpcy5zc3JjID0gc3NyYzsKICB0aGlzLmV2ZW50cyA9IHtqc2E6MCwganNyOjB9Cn07CnRhbGsubWVkaWEuQ2FsbERhc2hib2FyZC5BdWRpb1N0cmVhbUluZm8ucHJvdG90eXBlLmxldmVsID0gMDsKdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkLkF1ZGlvU3RyZWFtSW5mby5wcm90b3R5cGUuY291bnRFdmVudCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJENhbGxEYXNoYm9hcmQkQXVkaW9TdHJlYW1JbmZvJCRjb3VudEV2ZW50JChldmVudCkgewogIHRoaXMuZXZlbnRzW2V2ZW50XSA/IHRoaXMuZXZlbnRzW2V2ZW50XSsrIDogdGhpcy5ldmVudHNbZXZlbnRdID0gMQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0ID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkKHR5cGUsIG9wdF93aWR0aCwgb3B0X2hlaWdodCwgb3B0X2RvbUhlbHBlciwgb3B0X3VyaSkgewogIGdvb2cudWkuQ29tcG9uZW50LmNhbGwodGhpcywgb3B0X2RvbUhlbHBlcik7CiAgdGhpcy51cmlfID0gbmV3IGdvb2cuVXJpKG9wdF91cmkgfHwgZ29vZy51aS5TZXJ2ZXJDaGFydC5DSEFSVF9TRVJWRVJfU0NIRU1FX0lOREVQRU5ERU5UX1VSSSk7CiAgdGhpcy5lbmNvZGluZ1R5cGVfID0gZ29vZy51aS5TZXJ2ZXJDaGFydC5FbmNvZGluZ1R5cGUuQVVUT01BVElDOwogIHRoaXMuZGF0YVNldHNfID0gW107CiAgdGhpcy5zZXRDb2xvcnNfID0gW107CiAgdGhpcy5zZXRMZWdlbmRUZXh0c18gPSBbXTsKICB0aGlzLnhMYWJlbHNfID0gW107CiAgdGhpcy5sZWZ0TGFiZWxzXyA9IFtdOwogIHRoaXMucmlnaHRMYWJlbHNfID0gW107CiAgdGhpcy5tdWx0aUF4aXNUeXBlXyA9IFtdOwogIHRoaXMubXVsdGlBeGlzTGFiZWxUZXh0XyA9IHt9OwogIHRoaXMubXVsdGlBeGlzTGFiZWxQb3NpdGlvbl8gPSB7fTsKICB0aGlzLm11bHRpQXhpc1JhbmdlXyA9IHt9OwogIHRoaXMubXVsdGlBeGlzTGFiZWxTdHlsZV8gPSB7fTsKICB0aGlzLnNldFR5cGUodHlwZSk7CiAgdGhpcy5zZXRTaXplKG9wdF93aWR0aCwgb3B0X2hlaWdodCk7CiAgdGhpcy5taW5WYWx1ZV8gPSB0aGlzLmlzUGllQ2hhcnQoKSA/IDAgOiBJbmZpbml0eQp9Owpnb29nLmluaGVyaXRzKGdvb2cudWkuU2VydmVyQ2hhcnQsIGdvb2cudWkuQ29tcG9uZW50KTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5DSEFSVF9TRVJWRVJfU0NIRU1FX0lOREVQRU5ERU5UX1VSSSA9ICIvL2NoYXJ0Lmdvb2dsZWFwaXMuY29tL2NoYXJ0IjsKZ29vZy51aS5TZXJ2ZXJDaGFydC5DSEFSVF9TRVJWRVJfSFRUUF9VUkkgPSAiaHR0cDovL2NoYXJ0Lmdvb2dsZWFwaXMuY29tL2NoYXJ0IjsKZ29vZy51aS5TZXJ2ZXJDaGFydC5DSEFSVF9TRVJWRVJfSFRUUFNfVVJJID0gImh0dHBzOi8vY2hhcnQuZ29vZ2xlYXBpcy5jb20vY2hhcnQiOwpnb29nLnVpLlNlcnZlckNoYXJ0LkNIQVJUX1NFUlZFUl9VUkkgPSBnb29nLnVpLlNlcnZlckNoYXJ0LkNIQVJUX1NFUlZFUl9IVFRQX1VSSTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5ERUZBVUxUX05PUk1BTElaQVRJT04gPSAwLjU7Cmdvb2cudWkuU2VydmVyQ2hhcnQucHJvdG90eXBlLnVyaUxlbmd0aExpbWl0XyA9IDIwNDg7Cmdvb2cudWkuU2VydmVyQ2hhcnQucHJvdG90eXBlLmdyaWRYXyA9IDA7Cmdvb2cudWkuU2VydmVyQ2hhcnQucHJvdG90eXBlLmdyaWRZXyA9IDA7Cmdvb2cudWkuU2VydmVyQ2hhcnQucHJvdG90eXBlLm1heFZhbHVlXyA9IC1JbmZpbml0eTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5wcm90b3R5cGUudGl0bGVfID0gbnVsbDsKZ29vZy51aS5TZXJ2ZXJDaGFydC5wcm90b3R5cGUubGVnZW5kXyA9IG51bGw7Cmdvb2cudWkuU2VydmVyQ2hhcnQucHJvdG90eXBlLm51bVZpc2libGVEYXRhU2V0c18gPSBudWxsOwpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5jcmVhdGVEb20gPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCQkY3JlYXRlRG9tJCgpIHsKICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZSgpOwogIHRoaXMuc2V0RWxlbWVudEludGVybmFsKHRoaXMuZ2V0RG9tSGVscGVyKCkuY3JlYXRlRG9tKCJpbWciLCB7c3JjOnRoaXMuZ2V0VXJpKCksICJjbGFzcyI6Imdvb2ctc2VydmVyY2hhcnQtaW1hZ2UiLCB3aWR0aDpzaXplWzBdLCBoZWlnaHQ6c2l6ZVsxXX0pKQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5kZWNvcmF0ZUludGVybmFsID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJGRlY29yYXRlSW50ZXJuYWwkKGltZykgewogIGltZy5zcmMgPSB0aGlzLmdldFVyaSgpOwogIHRoaXMuc2V0RWxlbWVudEludGVybmFsKGltZykKfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5wcm90b3R5cGUudXBkYXRlQ2hhcnQgPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCQkdXBkYXRlQ2hhcnQkKCkgewogIHRoaXMuZ2V0RWxlbWVudCgpICYmICh0aGlzLmdldEVsZW1lbnQoKS5zcmMgPSB0aGlzLmdldFVyaSgpKQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5nZXRVcmkgPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCQkZ2V0VXJpJCgpIHsKICB0aGlzLmNvbXB1dGVEYXRhU3RyaW5nXygpOwogIHJldHVybiB0aGlzLnVyaV8KfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5wcm90b3R5cGUuc2V0R3JpZFBhcmFtZXRlciA9IGZ1bmN0aW9uICRnb29nJHVpJFNlcnZlckNoYXJ0JCRzZXRHcmlkUGFyYW1ldGVyJCh2YWx1ZSkgewogIHRoaXMudXJpXy5zZXRQYXJhbWV0ZXJWYWx1ZShnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtLkdSSUQsIHZhbHVlKQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LkVuY29kaW5nVHlwZSA9IHtBVVRPTUFUSUM6IiIsIEVYVEVOREVEOiJlIiwgU0lNUExFOiJzIiwgVEVYVDoidCJ9Owpnb29nLnVpLlNlcnZlckNoYXJ0LkNoYXJ0VHlwZSA9IHtCQVI6ImJyIiwgQ0xPQ0s6ImNmIiwgQ09OQ0VOVFJJQ19QSUU6InBjIiwgRklMTEVETElORToibHIiLCBGSU5BTkNFOiJsZmkiLCBHT09HTEVPTUVURVI6ImdvbSIsIEhPUklaT05UQUxfR1JPVVBFRF9CQVI6ImJoZyIsIEhPUklaT05UQUxfU1RBQ0tFRF9CQVI6ImJocyIsIExJTkU6ImxjIiwgTUFQOiJ0IiwgTUFQVVNBOiJ0dXNzIiwgTUFQV09STEQ6InR3b2MiLCBQSUU6InAiLCBQSUUzRDoicDMiLCBSQURBUjoicnMiLCBTQ0FUVEVSOiJzIiwgU1BBUktMSU5FOiJscyIsIFZFTk46InYiLCBWRVJUSUNBTF9HUk9VUEVEX0JBUjoiYnZnIiwgVkVSVElDQUxfU1RBQ0tFRF9CQVI6ImJ2cyIsIFhZTElORToibHh5In07Cmdvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzVHlwZSA9IHtYX0FYSVM6IngiLCBMRUZUX1lfQVhJUzoieSIsIFJJR0hUX1lfQVhJUzoiciIsIFRPUF9BWElTOiJ0In07Cmdvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzQWxpZ25tZW50ID0ge0FMSUdOX0xFRlQ6LTEsIEFMSUdOX0NFTlRFUjowLCBBTElHTl9SSUdIVDoxfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5MZWdlbmRQb3NpdGlvbiA9IHtUT1A6InQiLCBCT1RUT006ImIiLCBMRUZUOiJsIiwgUklHSFQ6InIifTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5BeGlzRGlzcGxheVR5cGUgPSB7TElORV9BTkRfVElDS1M6Imx0IiwgTElORToibCIsIFRJQ0tTOiJ0In07Cmdvb2cudWkuU2VydmVyQ2hhcnQuTWF4aW11bVZhbHVlID0ge1dJRFRIOjFFMywgSEVJR0hUOjFFMywgTUFQX1dJRFRIOjQ0MCwgTUFQX0hFSUdIVDoyMjAsIFRPVEFMX0FSRUE6M0U1fTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlQYXJhbSA9IHtCQUNLR1JPVU5EX0ZJTEw6ImNoZiIsIEJBUl9IRUlHSFQ6ImNoYmgiLCBEQVRBOiJjaGQiLCBEQVRBX0NPTE9SUzoiY2hjbyIsIERBVEFfTEFCRUxTOiJjaGxkIiwgREFUQV9TQ0FMSU5HOiJjaGRzIiwgRElHSVRBTF9TSUdOQVRVUkU6InNpZyIsIEdFT0dSQVBISUNBTF9SRUdJT046ImNodG0iLCBHUklEOiJjaGciLCBMQUJFTF9DT0xPUlM6ImNobGMiLCBMRUZUX1lfTEFCRUxTOiJjaGx5IiwgTEVHRU5EOiJjaGRsIiwgTEVHRU5EX1BPU0lUSU9OOiJjaGRscCIsIExFR0VORF9URVhUUzoiY2hkbCIsIExJTkVfU1RZTEVTOiJjaGxzIiwgTUFSR0lOUzoiY2htYSIsIE1BUktFUlM6ImNobSIsIE1JU0NfUEFSQU1TOiJjaHAiLCBNVUxUSV9BWElTX0xBQkVMX1BPU0lUSU9OOiJjaHhwIiwgTVVMVElfQVhJU19MQUJFTF9URVhUOiJjaHhsIiwgTVVMVElfQVhJU19SQU5HRToiY2h4ciIsIE1VTFRJX0FYSVNfU1RZTEU6ImNoeHMiLCBNVUxUSV9BWElTX1RZUEVTOiJjaHh0IiwgClJJR0hUX0xBQkVMUzoiY2hsciIsIFJJR0hUX0xBQkVMX1BPU0lUSU9OUzoiY2hscnAiLCBTSVpFOiJjaHMiLCBUSVRMRToiY2h0dCIsIFRJVExFX0ZPUk1BVDoiY2h0cyIsIFRZUEU6ImNodCIsIFhfQVhJU19TVFlMRToiY2h4IiwgWF9MQUJFTFM6ImNobCJ9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5zZXRUeXBlID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJHNldFR5cGUkKHR5cGUpIHsKICB0aGlzLnVyaV8uc2V0UGFyYW1ldGVyVmFsdWUoZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlQYXJhbS5UWVBFLCB0eXBlKQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5nZXRUeXBlID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJGdldFR5cGUkKCkgewogIHJldHVybiB0aGlzLnVyaV8uZ2V0UGFyYW1ldGVyVmFsdWUoZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlQYXJhbS5UWVBFKQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5zZXRTaXplID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJHNldFNpemUkKG9wdF93aWR0aCwgb3B0X2hlaWdodCkgewogIHZhciBzaXplU3RyaW5nID0gW29wdF93aWR0aCB8fCAzMDAsIG9wdF9oZWlnaHQgfHwgMTUwXS5qb2luKCJ4Iik7CiAgdGhpcy51cmlfLnNldFBhcmFtZXRlclZhbHVlKGdvb2cudWkuU2VydmVyQ2hhcnQuVXJpUGFyYW0uU0laRSwgc2l6ZVN0cmluZykKfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5wcm90b3R5cGUuZ2V0U2l6ZSA9IGZ1bmN0aW9uICRnb29nJHVpJFNlcnZlckNoYXJ0JCRnZXRTaXplJCgpIHsKICB2YXIgc2l6ZVN0ciA9IHRoaXMudXJpXy5nZXRQYXJhbWV0ZXJWYWx1ZShnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtLlNJWkUpOwogIHJldHVybiBzaXplU3RyLnNwbGl0KCJ4IikKfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5wcm90b3R5cGUuc2V0TWluVmFsdWUgPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCQkc2V0TWluVmFsdWUkKG1pblZhbHVlKSB7CiAgdGhpcy5taW5WYWx1ZV8gPSBtaW5WYWx1ZQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5zZXRNYXhWYWx1ZSA9IGZ1bmN0aW9uICRnb29nJHVpJFNlcnZlckNoYXJ0JCRzZXRNYXhWYWx1ZSQobWF4VmFsdWUpIHsKICB0aGlzLm1heFZhbHVlXyA9IG1heFZhbHVlCn07Cmdvb2cudWkuU2VydmVyQ2hhcnQucHJvdG90eXBlLmlzUGllQ2hhcnQgPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCQkaXNQaWVDaGFydCQoKSB7CiAgdmFyIHR5cGUgPSB0aGlzLmdldFR5cGUoKTsKICByZXR1cm4gdHlwZSA9PSBnb29nLnVpLlNlcnZlckNoYXJ0LkNoYXJ0VHlwZS5QSUUgfHwgdHlwZSA9PSBnb29nLnVpLlNlcnZlckNoYXJ0LkNoYXJ0VHlwZS5QSUUzRCB8fCB0eXBlID09IGdvb2cudWkuU2VydmVyQ2hhcnQuQ2hhcnRUeXBlLkNPTkNFTlRSSUNfUElFCn07Cmdvb2cudWkuU2VydmVyQ2hhcnQucHJvdG90eXBlLmlzTWFwID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJGlzTWFwJCgpIHsKICB2YXIgdHlwZSA9IHRoaXMuZ2V0VHlwZSgpOwogIHJldHVybiB0eXBlID09IGdvb2cudWkuU2VydmVyQ2hhcnQuQ2hhcnRUeXBlLk1BUCB8fCB0eXBlID09IGdvb2cudWkuU2VydmVyQ2hhcnQuQ2hhcnRUeXBlLk1BUFVTQSB8fCB0eXBlID09IGdvb2cudWkuU2VydmVyQ2hhcnQuQ2hhcnRUeXBlLk1BUFdPUkxECn07Cmdvb2cudWkuU2VydmVyQ2hhcnQucHJvdG90eXBlLnNldExlZnRMYWJlbHMgPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCQkc2V0TGVmdExhYmVscyQobGFiZWxzKSB7CiAgdGhpcy5sZWZ0TGFiZWxzXyA9IGxhYmVsczsKICB0aGlzLnVyaV8uc2V0UGFyYW1ldGVyVmFsdWUoZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlQYXJhbS5MRUZUX1lfTEFCRUxTLCB0aGlzLmxlZnRMYWJlbHNfLnJldmVyc2UoKS5qb2luKCJ8IikpCn07Cmdvb2cudWkuU2VydmVyQ2hhcnQucHJvdG90eXBlLnNldFBhcmFtZXRlclZhbHVlID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJHNldFBhcmFtZXRlclZhbHVlJChrZXksIHZhbHVlKSB7CiAgdGhpcy51cmlfLnNldFBhcmFtZXRlclZhbHVlKGtleSwgdmFsdWUpCn07Cmdvb2cudWkuU2VydmVyQ2hhcnQucHJvdG90eXBlLnJlbW92ZVBhcmFtZXRlciA9IGZ1bmN0aW9uICRnb29nJHVpJFNlcnZlckNoYXJ0JCRyZW1vdmVQYXJhbWV0ZXIkKGtleSkgewogIHRoaXMudXJpXy5yZW1vdmVQYXJhbWV0ZXIoa2V5KQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5zZXRUaXRsZSA9IGZ1bmN0aW9uICRnb29nJHVpJFNlcnZlckNoYXJ0JCRzZXRUaXRsZSQodGl0bGUpIHsKICB0aGlzLnRpdGxlXyA9IHRpdGxlOwogIHRoaXMudXJpXy5zZXRQYXJhbWV0ZXJWYWx1ZShnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtLlRJVExFLCB0aGlzLnRpdGxlXy5yZXBsYWNlKC9cbi9nLCAifCIpKQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5zZXRMZWdlbmQgPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCQkc2V0TGVnZW5kJChsZWdlbmQpIHsKICB0aGlzLmxlZ2VuZF8gPSBsZWdlbmQ7CiAgdGhpcy51cmlfLnNldFBhcmFtZXRlclZhbHVlKGdvb2cudWkuU2VydmVyQ2hhcnQuVXJpUGFyYW0uTEVHRU5ELCB0aGlzLmxlZ2VuZF8uam9pbigifCIpKQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5hZGREYXRhU2V0ID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJGFkZERhdGFTZXQkKGRhdGEsIGNvbG9yLCBvcHRfbGVnZW5kVGV4dCkgewogIHZhciBkYXRhTWluID0gdGhpcy5hcnJheU1pbl8oZGF0YSk7CiAgZGF0YU1pbiA8IHRoaXMubWluVmFsdWVfICYmICh0aGlzLm1pblZhbHVlXyA9IGRhdGFNaW4pOwogIHZhciBkYXRhTWF4ID0gdGhpcy5hcnJheU1heF8oZGF0YSk7CiAgZGF0YU1heCA+IHRoaXMubWF4VmFsdWVfICYmICh0aGlzLm1heFZhbHVlXyA9IGRhdGFNYXgpOwogIGlmKGdvb2cuaXNEZWYob3B0X2xlZ2VuZFRleHQpKSB7CiAgICBpZih0aGlzLnNldExlZ2VuZFRleHRzXy5sZW5ndGggPCB0aGlzLmRhdGFTZXRzXy5sZW5ndGgpIHsKICAgICAgdGhyb3cgRXJyb3IoIkNhbm5vdCBzdGFydCBhZGRpbmcgbGVnZW5kcyB0ZXh0IGFmdGVyIGZpcnN0IGVsZW1lbnQuIik7CiAgICB9CiAgICB0aGlzLnNldExlZ2VuZFRleHRzXy5wdXNoKG9wdF9sZWdlbmRUZXh0KTsKICAgIHRoaXMudXJpXy5zZXRQYXJhbWV0ZXJWYWx1ZShnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtLkxFR0VORF9URVhUUywgdGhpcy5zZXRMZWdlbmRUZXh0c18uam9pbigifCIpKQogIH0KICB0aGlzLmRhdGFTZXRzXy5wdXNoKGRhdGEpOwogIHRoaXMuc2V0Q29sb3JzXy5wdXNoKGNvbG9yKTsKICB0aGlzLnVyaV8uc2V0UGFyYW1ldGVyVmFsdWUoZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlQYXJhbS5EQVRBX0NPTE9SUywgdGhpcy5zZXRDb2xvcnNfLmpvaW4oIiwiKSkKfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5wcm90b3R5cGUuY2xlYXJEYXRhU2V0cyA9IGZ1bmN0aW9uICRnb29nJHVpJFNlcnZlckNoYXJ0JCRjbGVhckRhdGFTZXRzJCgpIHsKICB2YXIgcXVlcnlEYXRhID0gdGhpcy51cmlfLmdldFF1ZXJ5RGF0YSgpOwogIHF1ZXJ5RGF0YS5yZW1vdmUoZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlQYXJhbS5MRUdFTkRfVEVYVFMpOwogIHF1ZXJ5RGF0YS5yZW1vdmUoZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlQYXJhbS5EQVRBX0NPTE9SUyk7CiAgcXVlcnlEYXRhLnJlbW92ZShnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtLkRBVEEpOwogIHRoaXMuc2V0TGVnZW5kVGV4dHNfLmxlbmd0aCA9IDA7CiAgdGhpcy5zZXRDb2xvcnNfLmxlbmd0aCA9IDA7CiAgdGhpcy5kYXRhU2V0c18ubGVuZ3RoID0gMAp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJGdldERhdGEkKG9wdF9zZXROdW1iZXIpIHsKICByZXR1cm4gZ29vZy5pc0RlZihvcHRfc2V0TnVtYmVyKSA/IHRoaXMuZGF0YVNldHNfW29wdF9zZXROdW1iZXJdIDogdGhpcy5kYXRhU2V0c18KfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5wcm90b3R5cGUuY29tcHV0ZURhdGFTdHJpbmdfID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJGNvbXB1dGVEYXRhU3RyaW5nXyQoKSB7CiAgdmFyIG9rOwogIHRoaXMuZW5jb2RpbmdUeXBlXyAhPSBnb29nLnVpLlNlcnZlckNoYXJ0LkVuY29kaW5nVHlwZS5BVVRPTUFUSUMgPyBvayA9IHRoaXMuY29tcHV0ZURhdGFTdHJpbmdGb3JFbmNvZGluZ18odGhpcy5lbmNvZGluZ1R5cGVfKSA6IChvayA9IHRoaXMuY29tcHV0ZURhdGFTdHJpbmdGb3JFbmNvZGluZ18oZ29vZy51aS5TZXJ2ZXJDaGFydC5FbmNvZGluZ1R5cGUuRVhURU5ERUQpKSB8fCAob2sgPSB0aGlzLmNvbXB1dGVEYXRhU3RyaW5nRm9yRW5jb2RpbmdfKGdvb2cudWkuU2VydmVyQ2hhcnQuRW5jb2RpbmdUeXBlLlNJTVBMRSkpOwogIG9rIHx8IHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlUb29Mb25nRXZlbnQodGhpcy51cmlfLnRvU3RyaW5nKCkpKQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5jb21wdXRlRGF0YVN0cmluZ0ZvckVuY29kaW5nXyA9IGZ1bmN0aW9uICRnb29nJHVpJFNlcnZlckNoYXJ0JCRjb21wdXRlRGF0YVN0cmluZ0ZvckVuY29kaW5nXyQoZW5jb2RpbmcpIHsKICBmb3IodmFyIGRhdGFTdHJpbmdzID0gW10sIGkgPSAwLCBzZXRMZW4gPSB0aGlzLmRhdGFTZXRzXy5sZW5ndGg7aSA8IHNldExlbjsrK2kpIHsKICAgIGRhdGFTdHJpbmdzW2ldID0gdGhpcy5nZXRDaGFydFNlcnZlclZhbHVlc18odGhpcy5kYXRhU2V0c19baV0sIHRoaXMubWluVmFsdWVfLCB0aGlzLm1heFZhbHVlXywgZW5jb2RpbmcpCiAgfQogIHZhciBkZWxpbWl0ZXIgPSBlbmNvZGluZyA9PSBnb29nLnVpLlNlcnZlckNoYXJ0LkVuY29kaW5nVHlwZS5URVhUID8gInwiIDogIiwiLCBkYXRhU3RyaW5ncyA9IGRhdGFTdHJpbmdzLmpvaW4oZGVsaW1pdGVyKSwgZGF0YTsKICBkYXRhID0gbnVsbCA9PSB0aGlzLm51bVZpc2libGVEYXRhU2V0c18gPyBnb29nLnN0cmluZy5idWlsZFN0cmluZyhlbmNvZGluZywgIjoiLCBkYXRhU3RyaW5ncykgOiBnb29nLnN0cmluZy5idWlsZFN0cmluZyhlbmNvZGluZywgdGhpcy5udW1WaXNpYmxlRGF0YVNldHNfLCAiOiIsIGRhdGFTdHJpbmdzKTsKICB0aGlzLnVyaV8uc2V0UGFyYW1ldGVyVmFsdWUoZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlQYXJhbS5EQVRBLCBkYXRhKTsKICByZXR1cm4gdGhpcy51cmlfLnRvU3RyaW5nKCkubGVuZ3RoIDwgdGhpcy51cmlMZW5ndGhMaW1pdF8KfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5DSEFSVF9WQUxVRVMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiOwpnb29nLnVpLlNlcnZlckNoYXJ0LkNIQVJUX1ZBTFVFU19FWFRFTkRFRCA9IGdvb2cudWkuU2VydmVyQ2hhcnQuQ0hBUlRfVkFMVUVTICsgIi0uIjsKZ29vZy51aS5TZXJ2ZXJDaGFydC5FWFRFTkRFRF9VUFBFUl9CT1VORCA9IE1hdGgucG93KGdvb2cudWkuU2VydmVyQ2hhcnQuQ0hBUlRfVkFMVUVTX0VYVEVOREVELmxlbmd0aCwgMikgLSAxOwpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5nZXRDb252ZXJ0ZWRWYWx1ZV8gPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCQkZ2V0Q29udmVydGVkVmFsdWVfJCh2YWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlLCBlbmNvZGluZykgewogIGdvb2cuYXNzZXJ0cy5hc3NlcnQobWluVmFsdWUgPD0gbWF4VmFsdWUsICJtaW5WYWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1heFZhbHVlIik7CiAgdmFyIGlzRXh0ZW5kZWQgPSBlbmNvZGluZyA9PSBnb29nLnVpLlNlcnZlckNoYXJ0LkVuY29kaW5nVHlwZS5FWFRFTkRFRDsKICBpZihnb29nLmlzTnVsbCh2YWx1ZSkgfHwgIWdvb2cuaXNEZWYodmFsdWUpIHx8IGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IG1pblZhbHVlIHx8IHZhbHVlID4gbWF4VmFsdWUpIHsKICAgIHJldHVybiBpc0V4dGVuZGVkID8gIl9fIiA6ICJfIgogIH0KICBpZihlbmNvZGluZyA9PSBnb29nLnVpLlNlcnZlckNoYXJ0LkVuY29kaW5nVHlwZS5URVhUKSB7CiAgICByZXR1cm4iIiArIHZhbHVlCiAgfQogIHZhciBmcmFjID0gZ29vZy51aS5TZXJ2ZXJDaGFydC5ERUZBVUxUX05PUk1BTElaQVRJT047CiAgbWF4VmFsdWUgPiBtaW5WYWx1ZSAmJiAoZnJhYyA9ICh2YWx1ZSAtIG1pblZhbHVlKSAvIChtYXhWYWx1ZSAtIG1pblZhbHVlKSk7CiAgaWYoaXNFeHRlbmRlZCkgewogICAgdmFyIG1heEluZGV4ID0gZ29vZy51aS5TZXJ2ZXJDaGFydC5DSEFSVF9WQUxVRVNfRVhURU5ERUQubGVuZ3RoLCB1cHBlckJvdW5kID0gZ29vZy51aS5TZXJ2ZXJDaGFydC5FWFRFTkRFRF9VUFBFUl9CT1VORCwgaW5kZXgxID0gTWF0aC5mbG9vcihmcmFjICogdXBwZXJCb3VuZCAvIG1heEluZGV4KSwgaW5kZXgyID0gTWF0aC5mbG9vcihmcmFjICogdXBwZXJCb3VuZCAlIG1heEluZGV4KSwgZXh0ZW5kZWRWYWxzID0gZ29vZy51aS5TZXJ2ZXJDaGFydC5DSEFSVF9WQUxVRVNfRVhURU5ERUQ7CiAgICByZXR1cm4gZXh0ZW5kZWRWYWxzLmNoYXJBdChpbmRleDEpICsgZXh0ZW5kZWRWYWxzLmNoYXJBdChpbmRleDIpCiAgfQogIHZhciBpbmRleCA9IE1hdGgucm91bmQoZnJhYyAqIChnb29nLnVpLlNlcnZlckNoYXJ0LkNIQVJUX1ZBTFVFUy5sZW5ndGggLSAxKSk7CiAgcmV0dXJuIGdvb2cudWkuU2VydmVyQ2hhcnQuQ0hBUlRfVkFMVUVTLmNoYXJBdChpbmRleCkKfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5wcm90b3R5cGUuZ2V0Q2hhcnRTZXJ2ZXJWYWx1ZXNfID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJGdldENoYXJ0U2VydmVyVmFsdWVzXyQodmFsdWVzLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIGVuY29kaW5nKSB7CiAgZm9yKHZhciBzID0gW10sIGkgPSAwLCB2YWx1ZXNMZW4gPSB2YWx1ZXMubGVuZ3RoO2kgPCB2YWx1ZXNMZW47KytpKSB7CiAgICBzLnB1c2godGhpcy5nZXRDb252ZXJ0ZWRWYWx1ZV8odmFsdWVzW2ldLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIGVuY29kaW5nKSkKICB9CiAgcmV0dXJuIHMuam9pbih0aGlzLmVuY29kaW5nVHlwZV8gPT0gZ29vZy51aS5TZXJ2ZXJDaGFydC5FbmNvZGluZ1R5cGUuVEVYVCA/ICIsIiA6ICIiKQp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5hcnJheU1pbl8gPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCQkYXJyYXlNaW5fJChhcnkpIHsKICBmb3IodmFyIG1pbiA9IEluZmluaXR5LCBpID0gMCwgYXJ5TGVuID0gYXJ5Lmxlbmd0aDtpIDwgYXJ5TGVuOysraSkgewogICAgdmFyIHZhbHVlID0gYXJ5W2ldOwogICAgbnVsbCAhPSB2YWx1ZSAmJiB2YWx1ZSA8IG1pbiAmJiAobWluID0gdmFsdWUpCiAgfQogIHJldHVybiBtaW4KfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5wcm90b3R5cGUuYXJyYXlNYXhfID0gZnVuY3Rpb24gJGdvb2ckdWkkU2VydmVyQ2hhcnQkJGFycmF5TWF4XyQoYXJ5KSB7CiAgZm9yKHZhciBtYXggPSAtSW5maW5pdHksIGkgPSAwLCBhcnlMZW4gPSBhcnkubGVuZ3RoO2kgPCBhcnlMZW47KytpKSB7CiAgICB2YXIgdmFsdWUgPSBhcnlbaV07CiAgICBudWxsICE9IHZhbHVlICYmIHZhbHVlID4gbWF4ICYmIChtYXggPSB2YWx1ZSkKICB9CiAgcmV0dXJuIG1heAp9Owpnb29nLnVpLlNlcnZlckNoYXJ0LnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCQkZGlzcG9zZUludGVybmFsJCgpIHsKICBnb29nLnVpLlNlcnZlckNoYXJ0LnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpOwogIGRlbGV0ZSB0aGlzLnhMYWJlbHNfOwogIGRlbGV0ZSB0aGlzLmxlZnRMYWJlbHNfOwogIGRlbGV0ZSB0aGlzLnJpZ2h0TGFiZWxzXzsKICBkZWxldGUgdGhpcy5ncmlkWF87CiAgZGVsZXRlIHRoaXMuZ3JpZFlfOwogIGRlbGV0ZSB0aGlzLnNldENvbG9yc187CiAgZGVsZXRlIHRoaXMuc2V0TGVnZW5kVGV4dHNfOwogIGRlbGV0ZSB0aGlzLmRhdGFTZXRzXzsKICB0aGlzLnVyaV8gPSBudWxsOwogIGRlbGV0ZSB0aGlzLm1pblZhbHVlXzsKICBkZWxldGUgdGhpcy5tYXhWYWx1ZV87CiAgdGhpcy50aXRsZV8gPSBudWxsOwogIGRlbGV0ZSB0aGlzLm11bHRpQXhpc1R5cGVfOwogIGRlbGV0ZSB0aGlzLm11bHRpQXhpc0xhYmVsVGV4dF87CiAgZGVsZXRlIHRoaXMubXVsdGlBeGlzTGFiZWxQb3NpdGlvbl87CiAgZGVsZXRlIHRoaXMubXVsdGlBeGlzUmFuZ2VfOwogIGRlbGV0ZSB0aGlzLm11bHRpQXhpc0xhYmVsU3R5bGVfOwogIHRoaXMubGVnZW5kXyA9IG51bGwKfTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5FdmVudCA9IHtVUklfVE9PX0xPTkc6InVyaXRvb2xvbmcifTsKZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlUb29Mb25nRXZlbnQgPSBmdW5jdGlvbiAkZ29vZyR1aSRTZXJ2ZXJDaGFydCRVcmlUb29Mb25nRXZlbnQkKHVyaSkgewogIGdvb2cuZXZlbnRzLkV2ZW50LmNhbGwodGhpcywgZ29vZy51aS5TZXJ2ZXJDaGFydC5FdmVudC5VUklfVE9PX0xPTkcpOwogIHRoaXMudXJpID0gdXJpCn07Cmdvb2cuaW5oZXJpdHMoZ29vZy51aS5TZXJ2ZXJDaGFydC5VcmlUb29Mb25nRXZlbnQsIGdvb2cuZXZlbnRzLkV2ZW50KTsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZFRlbXBsYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkR3JhcGhEYXNoYm9hcmRUZW1wbGF0ZSQob3B0X2RhdGEsIG9wdF9zYikgewogIHZhciBvdXRwdXQgPSBvcHRfc2IgfHwgbmV3IHNveS5TdHJpbmdCdWlsZGVyOwogIG91dHB1dC5hcHBlbmQoJ3RpbWUgc3BhbjogPHNwYW4gaWQ9IicsIG9wdF9kYXRhLnN0YXJ0VGltZUlkLCAnIj4wPC9zcGFuPnMgdG8gPHNwYW4gaWQ9IicsIG9wdF9kYXRhLmVuZFRpbWVJZCwgJyI+MDwvc3Bhbj5zPGJyLz48aW1nIGlkPSInLCBvcHRfZGF0YS5jcHVVc2FnZUNoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEuY29ubmVjdGlvblJ0dENoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEuY29ubmVjdGlvblNlbnRCaXRyYXRlQ2hhcnQsICciLz48aW1nIGlkPSInLCBvcHRfZGF0YS5jb25uZWN0aW9uUmVjdkJpdHJhdGVDaGFydCwgJyIvPjxoND5BdWRpbyAtIFNlbnQgPC9oND48aW1nIGlkPSInLCBvcHRfZGF0YS5hdWRpb1NlbmRlckxvc3NSYXRpb0NoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEuYXVkaW9TZW5kZXJMb3N0UGFja2V0c0NoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEuYXVkaW9TZW5kZXJKaXR0ZXJDaGFydCwgJyIvPjxpbWcgaWQ9IicsIAogIG9wdF9kYXRhLmF1ZGlvU2VuZGVyUnR0Q2hhcnQsICciLz48aW1nIGlkPSInLCBvcHRfZGF0YS5hdWRpb1NlbmRlckVuZXJneUNoYXJ0LCAnIi8+PGg0PkF1ZGlvIC0gUmVjZWl2ZWQ8L2g0PjxpbWcgaWQ9IicsIG9wdF9kYXRhLmF1ZGlvUmVjdmVyTG9zc1JhdGlvQ2hhcnQsICciLz48aW1nIGlkPSInLCBvcHRfZGF0YS5hdWRpb1JlY3Zlckxvc3RQYWNrZXRzQ2hhcnQsICciLz48aW1nIGlkPSInLCBvcHRfZGF0YS5hdWRpb1JlY3ZlckppdHRlckNoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEuYXVkaW9SZWN2ZXJFbmVyZ3lDaGFydCwgJyIvPjxoND5WaWRlbyAtIFNlbnQ8L2g0PjxpbWcgaWQ9IicsIG9wdF9kYXRhLnZpZGVvU2VuZGVyTG9zc1JhdGlvQ2hhcnQsICciLz48aW1nIGlkPSInLCBvcHRfZGF0YS52aWRlb1NlbmRlckxvc3RQYWNrZXRzQ2hhcnQsICciLz48aW1nIGlkPSInLCBvcHRfZGF0YS52aWRlb1NlbmRlckNhY2hlZFBhY2tldHNDaGFydCwgJyIvPjxpbWcgaWQ9IicsIAogIG9wdF9kYXRhLnZpZGVvU2VuZGVyRmlyQ2hhcnQsICciLz48aW1nIGlkPSInLCBvcHRfZGF0YS52aWRlb1NlbmRlck5hY2tDaGFydCwgJyIvPjxpbWcgaWQ9IicsIG9wdF9kYXRhLnZpZGVvU2VuZGVyRG5hY2tDaGFydCwgJyIvPjxpbWcgaWQ9IicsIG9wdF9kYXRhLnZpZGVvU2VuZGVyRHJ0eENoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEudmlkZW9TZW5kZXJSdHRDaGFydCwgJyIvPjxpbWcgaWQ9IicsIG9wdF9kYXRhLnZpZGVvU2VuZGVyV2lkdGhDaGFydCwgJyIvPjxpbWcgaWQ9IicsIG9wdF9kYXRhLnZpZGVvU2VuZGVySGVpZ2h0Q2hhcnQsICciLz48aW1nIGlkPSInLCBvcHRfZGF0YS52aWRlb1NlbmRlckZwc0NoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEudmlkZW9TZW5kZXJGcHNTZW50Q2hhcnQsICciLz48aDQ+VmlkZW8gLSBSZWNlaXZlZDwvaDQ+PGltZyBpZD0iJywgb3B0X2RhdGEudmlkZW9SZWN2ZXJMb3NzUmF0aW9DaGFydCwgJyIvPjxpbWcgaWQ9IicsIAogIG9wdF9kYXRhLnZpZGVvUmVjdmVyTG9zdFBhY2tldHNDaGFydCwgJyIvPjxpbWcgaWQ9IicsIG9wdF9kYXRhLnZpZGVvUmVjdmVyQ29uY2VhbGVkUGFja2V0c0NoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEudmlkZW9SZWN2ZXJGaXJDaGFydCwgJyIvPjxpbWcgaWQ9IicsIG9wdF9kYXRhLnZpZGVvUmVjdmVyTmFja0NoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEudmlkZW9SZWN2ZXJEbmFja0NoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEudmlkZW9SZWN2ZXJXaWR0aENoYXJ0LCAnIi8+PGltZyBpZD0iJywgb3B0X2RhdGEudmlkZW9SZWN2ZXJIZWlnaHRDaGFydCwgJyIvPjxpbWcgaWQ9IicsIG9wdF9kYXRhLnZpZGVvUmVjdmVyRnBzQ2hhcnQsICciLz48aW1nIGlkPSInLCBvcHRfZGF0YS52aWRlb1JlY3ZlckZwc1JlY2VpdmVkQ2hhcnQsICciLz48aW1nIGlkPSInLCBvcHRfZGF0YS52aWRlb1JlY3ZlckZwc0RlY29kZWRDaGFydCwgJyIvPicpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCQob3B0X2RvbUhlbHBlcikgewogIGdvb2cudWkuQ29tcG9uZW50LmNhbGwodGhpcywgb3B0X2RvbUhlbHBlcik7CiAgdGhpcy5tZWRpYUluZm9zXyA9IFtdCn07Cmdvb2cuaW5oZXJpdHModGFsay5tZWRpYS5HcmFwaERhc2hib2FyZCwgZ29vZy51aS5Db21wb25lbnQpOwp0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkID0ge1NUQVJUX1RJTUU6InN0IiwgRU5EX1RJTUU6ImV0IiwgQ1BVX1VTQUdFX0NIQVJUOiJjcHUiLCBDT05ORUNUSU9OX1JUVF9DSEFSVDoiY3J0dCIsIENPTk5FQ1RJT05fU0VOVF9CSVRSQVRFX0NIQVJUOiJjc2JwcyIsIENPTk5FQ1RJT05fUkVDVl9CSVRSQVRFX0NIQVJUOiJjcmJwcyIsIEFVRElPX1NFTkRFUl9MT1NTX1JBVElPX0NIQVJUOiJhc2ZsIiwgQVVESU9fU0VOREVSX0xPU1RfUEFDS0VUU19DSEFSVDoiYXNwbCIsIEFVRElPX1NFTkRFUl9KSVRURVJfQ0hBUlQ6ImFzaiIsIEFVRElPX1NFTkRFUl9SVFRfQ0hBUlQ6ImFzcnR0IiwgQVVESU9fU0VOREVSX0VORVJHWV9DSEFSVDoiYXNlbiIsIEFVRElPX1JFQ1ZFUl9MT1NTX1JBVElPX0NIQVJUOiJhcmZsIiwgQVVESU9fUkVDVkVSX0xPU1RfUEFDS0VUU19DSEFSVDoiYXJwbCIsIEFVRElPX1JFQ1ZFUl9KSVRURVJfQ0hBUlQ6ImFyaiIsIEFVRElPX1JFQ1ZFUl9FTkVSR1lfQ0hBUlQ6ImFyZW4iLCAKVklERU9fU0VOREVSX0xPU1NfUkFUSU9fQ0hBUlQ6InZzZmwiLCBWSURFT19TRU5ERVJfTE9TVF9QQUNLRVRTX0NIQVJUOiJ2c3BsIiwgVklERU9fU0VOREVSX0NBQ0hFRF9QQUNLRVRTX0NIQVJUOiJ2c3BjIiwgVklERU9fU0VOREVSX0ZJUl9DSEFSVDoidnNmaXIiLCBWSURFT19TRU5ERVJfTkFDS19DSEFSVDoidnNuYWNrIiwgVklERU9fU0VOREVSX0ROQUNLX0NIQVJUOiJ2c2RuYWNrIiwgVklERU9fU0VOREVSX0RSVFhfQ0hBUlQ6InZzZHJ0eCIsIFZJREVPX1NFTkRFUl9SVFRfQ0hBUlQ6InZzcnR0IiwgVklERU9fU0VOREVSX1dJRFRIX0NIQVJUOiJ2c3ciLCBWSURFT19TRU5ERVJfSEVJR0hUX0NIQVJUOiJ2c2giLCBWSURFT19TRU5ERVJfRlBTX0NIQVJUOiJ2c2ZwcyIsIFZJREVPX1NFTkRFUl9GUFNfU0VOVF9DSEFSVDoidnNzZnBzIiwgVklERU9fUkVDVkVSX0xPU1NfUkFUSU9fQ0hBUlQ6InZyZmwiLCBWSURFT19SRUNWRVJfTE9TVF9QQUNLRVRTX0NIQVJUOiJ2cnBsIiwgClZJREVPX1JFQ1ZFUl9DT05DRUFMRURfUEFDS0VUU19DSEFSVDoidnJweCIsIFZJREVPX1JFQ1ZFUl9GSVJfQ0hBUlQ6InZyZmlyIiwgVklERU9fUkVDVkVSX05BQ0tfQ0hBUlQ6InZybmFjayIsIFZJREVPX1JFQ1ZFUl9ETkFDS19DSEFSVDoidnJkbmFjayIsIFZJREVPX1JFQ1ZFUl9XSURUSF9DSEFSVDoidnJ3IiwgVklERU9fUkVDVkVSX0hFSUdIVF9DSEFSVDoidnJoIiwgVklERU9fUkVDVkVSX0ZQU19DSEFSVDoidnJmcHMiLCBWSURFT19SRUNWRVJfRlBTX1JFQ1ZFRF9DSEFSVDoidnJyZnBzIiwgVklERU9fUkVDVkVSX0ZQU19ERUNPREVEX0NIQVJUOiJ2cmRmcHMifTsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DcHVVc2FnZSA9IHtQUk9DRVNTX0NQVToiY3B1IiwgU1lTVEVNX0NQVToidGNwdSJ9Owp0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZS5jcmVhdGVEb20gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCQkY3JlYXRlRG9tJCgpIHsKICB0aGlzLmRlY29yYXRlSW50ZXJuYWwodGhpcy5kb21fLmNyZWF0ZUVsZW1lbnQoImRpdiIpKQp9Owp0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZS5kZWNvcmF0ZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkR3JhcGhEYXNoYm9hcmQkJGRlY29yYXRlSW50ZXJuYWwkKGVsZW1lbnQpIHsKICB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLnN1cGVyQ2xhc3NfLmRlY29yYXRlSW50ZXJuYWwuY2FsbCh0aGlzLCBlbGVtZW50KTsKICB0aGlzLmdldEVsZW1lbnQoKS5pbm5lckhUTUwgPSB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkVGVtcGxhdGUodGhpcy5jcmVhdGVUZW1wbGF0ZUNvbnRleHRfKCkpCn07CnRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLmVudGVyRG9jdW1lbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCQkZW50ZXJEb2N1bWVudCQoKSB7CiAgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5zdXBlckNsYXNzXy5lbnRlckRvY3VtZW50LmNhbGwodGhpcyk7CiAgdGhpcy5jcmVhdGVDaGFydHNfKCkKfTsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5wcm90b3R5cGUuY3JlYXRlVGVtcGxhdGVDb250ZXh0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEdyYXBoRGFzaGJvYXJkJCRjcmVhdGVUZW1wbGF0ZUNvbnRleHRfJCgpIHsKICByZXR1cm57c3RhcnRUaW1lSWQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5TVEFSVF9USU1FKSwgZW5kVGltZUlkOnRoaXMubWFrZUlkKHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuRU5EX1RJTUUpLCBjcHVVc2FnZUNoYXJ0OnRoaXMubWFrZUlkKHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuQ1BVX1VTQUdFX0NIQVJUKSwgY29ubmVjdGlvblJ0dENoYXJ0OnRoaXMubWFrZUlkKHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuQ09OTkVDVElPTl9SVFRfQ0hBUlQpLCBjb25uZWN0aW9uU2VudEJpdHJhdGVDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLkNPTk5FQ1RJT05fU0VOVF9CSVRSQVRFX0NIQVJUKSwgY29ubmVjdGlvblJlY3ZCaXRyYXRlQ2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5DT05ORUNUSU9OX1JFQ1ZfQklUUkFURV9DSEFSVCksIGF1ZGlvU2VuZGVyTG9zc1JhdGlvQ2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5BVURJT19TRU5ERVJfTE9TU19SQVRJT19DSEFSVCksIAogIGF1ZGlvU2VuZGVyTG9zdFBhY2tldHNDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLkFVRElPX1NFTkRFUl9MT1NUX1BBQ0tFVFNfQ0hBUlQpLCBhdWRpb1NlbmRlckppdHRlckNoYXJ0OnRoaXMubWFrZUlkKHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuQVVESU9fU0VOREVSX0pJVFRFUl9DSEFSVCksIGF1ZGlvU2VuZGVyUnR0Q2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5BVURJT19TRU5ERVJfUlRUX0NIQVJUKSwgYXVkaW9TZW5kZXJFbmVyZ3lDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLkFVRElPX1NFTkRFUl9FTkVSR1lfQ0hBUlQpLCBhdWRpb1JlY3Zlckxvc3NSYXRpb0NoYXJ0OnRoaXMubWFrZUlkKHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuQVVESU9fUkVDVkVSX0xPU1NfUkFUSU9fQ0hBUlQpLCBhdWRpb1JlY3Zlckxvc3RQYWNrZXRzQ2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5BVURJT19SRUNWRVJfTE9TVF9QQUNLRVRTX0NIQVJUKSwgCiAgYXVkaW9SZWN2ZXJKaXR0ZXJDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLkFVRElPX1JFQ1ZFUl9KSVRURVJfQ0hBUlQpLCBhdWRpb1JlY3ZlckVuZXJneUNoYXJ0OnRoaXMubWFrZUlkKHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuQVVESU9fUkVDVkVSX0VORVJHWV9DSEFSVCksIHZpZGVvU2VuZGVyTG9zc1JhdGlvQ2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19TRU5ERVJfTE9TU19SQVRJT19DSEFSVCksIHZpZGVvU2VuZGVyTG9zdFBhY2tldHNDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9MT1NUX1BBQ0tFVFNfQ0hBUlQpLCB2aWRlb1NlbmRlckNhY2hlZFBhY2tldHNDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9DQUNIRURfUEFDS0VUU19DSEFSVCksIHZpZGVvU2VuZGVyRmlyQ2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19TRU5ERVJfRklSX0NIQVJUKSwgCiAgdmlkZW9TZW5kZXJOYWNrQ2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19TRU5ERVJfTkFDS19DSEFSVCksIHZpZGVvU2VuZGVyRG5hY2tDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9ETkFDS19DSEFSVCksIHZpZGVvU2VuZGVyRHJ0eENoYXJ0OnRoaXMubWFrZUlkKHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuVklERU9fU0VOREVSX0RSVFhfQ0hBUlQpLCB2aWRlb1NlbmRlclJ0dENoYXJ0OnRoaXMubWFrZUlkKHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuVklERU9fU0VOREVSX1JUVF9DSEFSVCksIHZpZGVvU2VuZGVyV2lkdGhDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9XSURUSF9DSEFSVCksIHZpZGVvU2VuZGVySGVpZ2h0Q2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19TRU5ERVJfSEVJR0hUX0NIQVJUKSwgCiAgdmlkZW9TZW5kZXJGcHNDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9GUFNfQ0hBUlQpLCB2aWRlb1NlbmRlckZwc1NlbnRDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9GUFNfU0VOVF9DSEFSVCksIHZpZGVvUmVjdmVyTG9zc1JhdGlvQ2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19SRUNWRVJfTE9TU19SQVRJT19DSEFSVCksIHZpZGVvUmVjdmVyTG9zdFBhY2tldHNDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1JFQ1ZFUl9MT1NUX1BBQ0tFVFNfQ0hBUlQpLCB2aWRlb1JlY3ZlckNvbmNlYWxlZFBhY2tldHNDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1JFQ1ZFUl9DT05DRUFMRURfUEFDS0VUU19DSEFSVCksIHZpZGVvUmVjdmVyRmlyQ2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19SRUNWRVJfRklSX0NIQVJUKSwgCiAgdmlkZW9SZWN2ZXJOYWNrQ2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19SRUNWRVJfTkFDS19DSEFSVCksIHZpZGVvUmVjdmVyRG5hY2tDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1JFQ1ZFUl9ETkFDS19DSEFSVCksIHZpZGVvUmVjdmVyV2lkdGhDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1JFQ1ZFUl9XSURUSF9DSEFSVCksIHZpZGVvUmVjdmVySGVpZ2h0Q2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19SRUNWRVJfSEVJR0hUX0NIQVJUKSwgdmlkZW9SZWN2ZXJGcHNDaGFydDp0aGlzLm1ha2VJZCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1JFQ1ZFUl9GUFNfQ0hBUlQpLCB2aWRlb1JlY3ZlckZwc1JlY2VpdmVkQ2hhcnQ6dGhpcy5tYWtlSWQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19SRUNWRVJfRlBTX1JFQ1ZFRF9DSEFSVCksIAogIHZpZGVvUmVjdmVyRnBzRGVjb2RlZENoYXJ0OnRoaXMubWFrZUlkKHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuVklERU9fUkVDVkVSX0ZQU19ERUNPREVEX0NIQVJUKX0KfTsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5wcm90b3R5cGUub25NZWRpYUluZm8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCQkb25NZWRpYUluZm8kKG1lZGlhSW5mbykgewogIHRoaXMubWVkaWFJbmZvc18ucHVzaChtZWRpYUluZm8pOwogIHRoaXMubWVkaWFJbmZvc18ubGVuZ3RoID4gdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DaGFydC5NQVhfUE9JTlRTXyAmJiB0aGlzLm1lZGlhSW5mb3NfLnNoaWZ0KCkKfTsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5wcm90b3R5cGUudXBkYXRlR3JhcGhzID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkR3JhcGhEYXNoYm9hcmQkJHVwZGF0ZUdyYXBocyQoKSB7CiAgdGhpcy51cGRhdGVDaGFydHNfKCk7CiAgdGhpcy5kcmF3Q2hhcnRzXygpOwogIDAgPCB0aGlzLm1lZGlhSW5mb3NfLmxlbmd0aCAmJiAodGhpcy5nZXRFbGVtZW50QnlGcmFnbWVudCh0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlNUQVJUX1RJTUUpLmlubmVySFRNTCA9IHRoaXMubWVkaWFJbmZvc19bMF0uZWxhcHNlZFRpbWUsIHRoaXMuZ2V0RWxlbWVudEJ5RnJhZ21lbnQodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5FTkRfVElNRSkuaW5uZXJIVE1MID0gZ29vZy5hcnJheS5wZWVrKHRoaXMubWVkaWFJbmZvc18pLmVsYXBzZWRUaW1lKQp9Owp0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZS5ncm91cEJ5S2V5XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEdyYXBoRGFzaGJvYXJkJCRncm91cEJ5S2V5XyQoc2FtcGxlcywgZ3JvdXAsIGluZGV4KSB7CiAgZm9yKHZhciBqID0gMDtqIDwgc2FtcGxlcy5sZW5ndGg7aisrKSB7CiAgICB2YXIgc2FtcGxlID0gc2FtcGxlc1tqXSwga2V5ID0gc2FtcGxlLmtleSgpOwogICAgZ3JvdXBba2V5XSA9IGdyb3VwW2tleV0gfHwgW107CiAgICBncm91cFtrZXldLnB1c2goe2k6aW5kZXgsIHZhbHVlOnNhbXBsZX0pCiAgfQp9Owp0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZS51cGRhdGVDaGFydHNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkR3JhcGhEYXNoYm9hcmQkJHVwZGF0ZUNoYXJ0c18kKCkgewogIHZhciBjb25uZWN0aW9ucyA9IFtdLCBhdWRpb1NlbmRlcnMgPSBbXSwgYXVkaW9SZWN2ZXJzID0gW10sIHZpZGVvU2VuZGVycyA9IFtdLCB2aWRlb1JlY3ZlcnMgPSBbXTsKICB0aGlzLmNwdXNfID0gMCA8IHRoaXMubWVkaWFJbmZvc18ubGVuZ3RoID8gdGhpcy5tZWRpYUluZm9zX1t0aGlzLm1lZGlhSW5mb3NfLmxlbmd0aCAtIDFdLmdsb2JhbEluZm8uY3B1cyA6IDE7CiAgdGhpcy5jbGVhckNoYXJ0c18oKTsKICB0aGlzLmNwdVVzYWdlQ2hhcnRfLnNldE1heFZhbHVlKDEwMCAqIHRoaXMuY3B1c18pOwogIHRoaXMuY3B1VXNhZ2VDaGFydF8uYWRkS2V5KHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuQ3B1VXNhZ2UuUFJPQ0VTU19DUFUpOwogIHRoaXMuY3B1VXNhZ2VDaGFydF8uYWRkS2V5KHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuQ3B1VXNhZ2UuU1lTVEVNX0NQVSk7CiAgZm9yKHZhciBpID0gMDtpIDwgdGhpcy5tZWRpYUluZm9zXy5sZW5ndGg7aSsrKSB7CiAgICB2YXIgbWVkaWFJbmZvID0gdGhpcy5tZWRpYUluZm9zX1tpXTsKICAgIHRoaXMuY3B1VXNhZ2VDaGFydF8uc2V0VmFsdWUodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DcHVVc2FnZS5QUk9DRVNTX0NQVSwgaSwgbWVkaWFJbmZvLmdsb2JhbEluZm8uY3B1KTsKICAgIHRoaXMuY3B1VXNhZ2VDaGFydF8uc2V0VmFsdWUodGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DcHVVc2FnZS5TWVNURU1fQ1BVLCBpLCBtZWRpYUluZm8uZ2xvYmFsSW5mby50b3RhbENwdSk7CiAgICB0aGlzLmdyb3VwQnlLZXlfKG1lZGlhSW5mby5hdWRpb0Nvbm5lY3Rpb25JbmZvcywgY29ubmVjdGlvbnMsIGkpOwogICAgbWVkaWFJbmZvLnZpZGVvQ29ubmVjdGlvbkluZm9zICYmIHRoaXMuZ3JvdXBCeUtleV8obWVkaWFJbmZvLnZpZGVvQ29ubmVjdGlvbkluZm9zLCBjb25uZWN0aW9ucywgaSk7CiAgICB0aGlzLmdyb3VwQnlLZXlfKG1lZGlhSW5mby5hdWRpb1NlbmRlckluZm9zLCBhdWRpb1NlbmRlcnMsIGkpOwogICAgdGhpcy5ncm91cEJ5S2V5XyhtZWRpYUluZm8uYXVkaW9SZWNlaXZlckluZm9zLCBhdWRpb1JlY3ZlcnMsIGkpOwogICAgbWVkaWFJbmZvLnZpZGVvU2VuZGVySW5mb3MgJiYgdGhpcy5ncm91cEJ5S2V5XyhtZWRpYUluZm8udmlkZW9TZW5kZXJJbmZvcywgdmlkZW9TZW5kZXJzLCBpKTsKICAgIG1lZGlhSW5mby52aWRlb1JlY2VpdmVySW5mb3MgJiYgdGhpcy5ncm91cEJ5S2V5XyhtZWRpYUluZm8udmlkZW9SZWNlaXZlckluZm9zLCB2aWRlb1JlY3ZlcnMsIGkpCiAgfQogIGZvcih2YXIga2V5IGluIGNvbm5lY3Rpb25zKSB7CiAgICB0aGlzLmNvbm5lY3Rpb25SdHRDaGFydF8uYWRkS2V5KGtleSk7CiAgICB0aGlzLmNvbm5lY3Rpb25TZW50Qml0cmF0ZUNoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMuY29ubmVjdGlvblJlY3ZCaXRyYXRlQ2hhcnRfLmFkZEtleShrZXkpOwogICAgZm9yKHZhciB2YWx1ZXMgPSBjb25uZWN0aW9uc1trZXldLCBpZHggPSAwO2lkeCA8IHZhbHVlcy5sZW5ndGg7aWR4KyspIHsKICAgICAgdmFyIGkgPSB2YWx1ZXNbaWR4XS5pLCB2ID0gdmFsdWVzW2lkeF0udmFsdWU7CiAgICAgIHRoaXMuY29ubmVjdGlvblJ0dENoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYucnR0KTsKICAgICAgdGhpcy5jb25uZWN0aW9uU2VudEJpdHJhdGVDaGFydF8uc2V0VmFsdWUoa2V5LCBpLCB2LnNlbmRCcGJzIC8gMTI4KTsKICAgICAgdGhpcy5jb25uZWN0aW9uUmVjdkJpdHJhdGVDaGFydF8uc2V0VmFsdWUoa2V5LCBpLCB2LnJlY3ZCcGJzIC8gMTI4KQogICAgfQogIH0KICBmb3Ioa2V5IGluIGF1ZGlvU2VuZGVycykgewogICAgdGhpcy5hdWRpb1NlbmRlckxvc3NSYXRpb0NoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMuYXVkaW9TZW5kZXJMb3N0UGFja2V0c0NoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMuYXVkaW9TZW5kZXJKaXR0ZXJDaGFydF8uYWRkS2V5KGtleSk7CiAgICB0aGlzLmF1ZGlvU2VuZGVyUnR0Q2hhcnRfLmFkZEtleShrZXkpOwogICAgdGhpcy5hdWRpb1NlbmRlckVuZXJneUNoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHZhbHVlcyA9IGF1ZGlvU2VuZGVyc1trZXldOwogICAgZm9yKGlkeCA9IDA7aWR4IDwgdmFsdWVzLmxlbmd0aDtpZHgrKykgewogICAgICBpID0gdmFsdWVzW2lkeF0uaSwgdiA9IHZhbHVlc1tpZHhdLnZhbHVlLCB0aGlzLmF1ZGlvU2VuZGVyTG9zc1JhdGlvQ2hhcnRfLnNldFZhbHVlKGtleSwgaSwgdi5sb3NzUmF0aW8pLCB0aGlzLmF1ZGlvU2VuZGVyTG9zdFBhY2tldHNDaGFydF8uc2V0VmFsdWUoa2V5LCBpLCB2Lmxvc3RQYWNrZXRzKSwgdGhpcy5hdWRpb1NlbmRlckppdHRlckNoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYuaml0dGVyKSwgdGhpcy5hdWRpb1NlbmRlclJ0dENoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYucnR0KSwgdGhpcy5hdWRpb1NlbmRlckVuZXJneUNoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYuZW5lcmd5KQogICAgfQogIH0KICBmb3Ioa2V5IGluIGF1ZGlvUmVjdmVycykgewogICAgdGhpcy5hdWRpb1JlY3Zlckxvc3NSYXRpb0NoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMuYXVkaW9SZWN2ZXJMb3N0UGFja2V0c0NoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMuYXVkaW9SZWN2ZXJKaXR0ZXJDaGFydF8uYWRkS2V5KGtleSk7CiAgICB0aGlzLmF1ZGlvUmVjdmVyRW5lcmd5Q2hhcnRfLmFkZEtleShrZXkpOwogICAgdmFsdWVzID0gYXVkaW9SZWN2ZXJzW2tleV07CiAgICBmb3IoaWR4ID0gMDtpZHggPCB2YWx1ZXMubGVuZ3RoO2lkeCsrKSB7CiAgICAgIGkgPSB2YWx1ZXNbaWR4XS5pLCB2ID0gdmFsdWVzW2lkeF0udmFsdWUsIHRoaXMuYXVkaW9SZWN2ZXJMb3NzUmF0aW9DaGFydF8uc2V0VmFsdWUoa2V5LCBpLCB2Lmxvc3NSYXRpbyksIHRoaXMuYXVkaW9SZWN2ZXJMb3N0UGFja2V0c0NoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYubG9zdFBhY2tldHMpLCB0aGlzLmF1ZGlvUmVjdmVySml0dGVyQ2hhcnRfLnNldFZhbHVlKGtleSwgaSwgdi5qaXR0ZXIpLCB0aGlzLmF1ZGlvUmVjdmVyRW5lcmd5Q2hhcnRfLnNldFZhbHVlKGtleSwgaSwgdi5lbmVyZ3kpCiAgICB9CiAgfQogIGZvcihrZXkgaW4gdmlkZW9TZW5kZXJzKSB7CiAgICB0aGlzLnZpZGVvU2VuZGVyTG9zc1JhdGlvQ2hhcnRfLmFkZEtleShrZXkpOwogICAgdGhpcy52aWRlb1NlbmRlckxvc3RQYWNrZXRzQ2hhcnRfLmFkZEtleShrZXkpOwogICAgdGhpcy52aWRlb1NlbmRlckNhY2hlZFBhY2tldHNDaGFydF8uYWRkS2V5KGtleSk7CiAgICB0aGlzLnZpZGVvU2VuZGVyRmlyQ2hhcnRfLmFkZEtleShrZXkpOwogICAgdGhpcy52aWRlb1NlbmRlck5hY2tDaGFydF8uYWRkS2V5KGtleSk7CiAgICB0aGlzLnZpZGVvU2VuZGVyRG5hY2tDaGFydF8uYWRkS2V5KGtleSk7CiAgICB0aGlzLnZpZGVvU2VuZGVyRHJ0eENoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMudmlkZW9TZW5kZXJSdHRDaGFydF8uYWRkS2V5KGtleSk7CiAgICB0aGlzLnZpZGVvU2VuZGVyV2lkdGhDaGFydF8uYWRkS2V5KGtleSk7CiAgICB0aGlzLnZpZGVvU2VuZGVySGVpZ2h0Q2hhcnRfLmFkZEtleShrZXkpOwogICAgdGhpcy52aWRlb1NlbmRlckZwc0NoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMudmlkZW9TZW5kZXJGcHNTZW50Q2hhcnRfLmFkZEtleShrZXkpOwogICAgdmFsdWVzID0gdmlkZW9TZW5kZXJzW2tleV07CiAgICBmb3IoaWR4ID0gMDtpZHggPCB2YWx1ZXMubGVuZ3RoO2lkeCsrKSB7CiAgICAgIGkgPSB2YWx1ZXNbaWR4XS5pLCB2ID0gdmFsdWVzW2lkeF0udmFsdWUsIHRoaXMudmlkZW9TZW5kZXJMb3NzUmF0aW9DaGFydF8uc2V0VmFsdWUoa2V5LCBpLCB2Lmxvc3NSYXRpbyksIHRoaXMudmlkZW9TZW5kZXJMb3N0UGFja2V0c0NoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYubG9zdFBhY2tldHMpLCB0aGlzLnZpZGVvU2VuZGVyQ2FjaGVkUGFja2V0c0NoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYuY2FjaGVkUGFja2V0cyksIHRoaXMudmlkZW9TZW5kZXJGaXJDaGFydF8uc2V0VmFsdWUoa2V5LCBpLCB2LmZpcnMpLCB0aGlzLnZpZGVvU2VuZGVyTmFja0NoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYubmFja3MpLCB0aGlzLnZpZGVvU2VuZGVyRG5hY2tDaGFydF8uc2V0VmFsdWUoa2V5LCBpLCB2LmRpc3RpbmN0TmFja3MpLCB0aGlzLnZpZGVvU2VuZGVyRHJ0eENoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYucmV0cmFuc21pdHRlZFBhY2tldHMpLCB0aGlzLnZpZGVvU2VuZGVyUnR0Q2hhcnRfLnNldFZhbHVlKGtleSwgCiAgICAgIGksIHYucnR0KSwgdGhpcy52aWRlb1NlbmRlcldpZHRoQ2hhcnRfLnNldFZhbHVlKGtleSwgaSwgdi53aWR0aCksIHRoaXMudmlkZW9TZW5kZXJIZWlnaHRDaGFydF8uc2V0VmFsdWUoa2V5LCBpLCB2LmhlaWdodCksIHRoaXMudmlkZW9TZW5kZXJGcHNDaGFydF8uc2V0VmFsdWUoa2V5LCBpLCB2LmZwc1RvRW5jb2RlciksIHRoaXMudmlkZW9TZW5kZXJGcHNTZW50Q2hhcnRfLnNldFZhbHVlKGtleSwgaSwgdi5mcHNTZW50KQogICAgfQogIH0KICBmb3Ioa2V5IGluIHZpZGVvUmVjdmVycykgewogICAgdGhpcy52aWRlb1JlY3Zlckxvc3NSYXRpb0NoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMudmlkZW9SZWN2ZXJMb3N0UGFja2V0c0NoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMudmlkZW9SZWN2ZXJDb25jZWFsZWRQYWNrZXRzQ2hhcnRfLmFkZEtleShrZXkpOwogICAgdGhpcy52aWRlb1JlY3ZlckZpckNoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMudmlkZW9SZWN2ZXJOYWNrQ2hhcnRfLmFkZEtleShrZXkpOwogICAgdGhpcy52aWRlb1JlY3ZlckRuYWNrQ2hhcnRfLmFkZEtleShrZXkpOwogICAgdGhpcy52aWRlb1JlY3ZlcldpZHRoQ2hhcnRfLmFkZEtleShrZXkpOwogICAgdGhpcy52aWRlb1JlY3ZlckhlaWdodENoYXJ0Xy5hZGRLZXkoa2V5KTsKICAgIHRoaXMudmlkZW9SZWN2ZXJGcHNDaGFydF8uYWRkS2V5KGtleSk7CiAgICB0aGlzLnZpZGVvUmVjdmVyRnBzUmVjdmVkQ2hhcnRfLmFkZEtleShrZXkpOwogICAgdGhpcy52aWRlb1JlY3ZlckZwc0RlY29kZWRDaGFydF8uYWRkS2V5KGtleSk7CiAgICB2YWx1ZXMgPSB2aWRlb1JlY3ZlcnNba2V5XTsKICAgIGZvcihpZHggPSAwO2lkeCA8IHZhbHVlcy5sZW5ndGg7aWR4KyspIHsKICAgICAgaSA9IHZhbHVlc1tpZHhdLmksIHYgPSB2YWx1ZXNbaWR4XS52YWx1ZSwgdGhpcy52aWRlb1JlY3Zlckxvc3NSYXRpb0NoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYubG9zc1JhdGlvKSwgdGhpcy52aWRlb1JlY3Zlckxvc3RQYWNrZXRzQ2hhcnRfLnNldFZhbHVlKGtleSwgaSwgdi5sb3N0UGFja2V0cyksIHRoaXMudmlkZW9SZWN2ZXJDb25jZWFsZWRQYWNrZXRzQ2hhcnRfLnNldFZhbHVlKGtleSwgaSwgdi5jb25jZWFsZWRQYWNrZXRzKSwgdGhpcy52aWRlb1JlY3ZlckZpckNoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYuZmlycyksIHRoaXMudmlkZW9SZWN2ZXJOYWNrQ2hhcnRfLnNldFZhbHVlKGtleSwgaSwgdi5uYWNrcyksIHRoaXMudmlkZW9SZWN2ZXJEbmFja0NoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYuZGlzdGluY3ROYWNrcyksIHRoaXMudmlkZW9SZWN2ZXJXaWR0aENoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYud2lkdGgpLCB0aGlzLnZpZGVvUmVjdmVySGVpZ2h0Q2hhcnRfLnNldFZhbHVlKGtleSwgCiAgICAgIGksIHYuaGVpZ2h0KSwgdGhpcy52aWRlb1JlY3ZlckZwc0NoYXJ0Xy5zZXRWYWx1ZShrZXksIGksIHYuZnBzVG9SZW5kZXJlciksIHRoaXMudmlkZW9SZWN2ZXJGcHNSZWN2ZWRDaGFydF8uc2V0VmFsdWUoa2V5LCBpLCB2LmZwc1JlY3ZlZCksIHRoaXMudmlkZW9SZWN2ZXJGcHNEZWNvZGVkQ2hhcnRfLnNldFZhbHVlKGtleSwgaSwgdi5mcHNEZWNvZGVkKQogICAgfQogIH0KfTsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5wcm90b3R5cGUuZHJhd0NoYXJ0c18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCQkZHJhd0NoYXJ0c18kKCkgewogIHRoaXMuY3B1VXNhZ2VDaGFydF8uZHJhdygpOwogIHRoaXMuY29ubmVjdGlvblJ0dENoYXJ0Xy5kcmF3KCk7CiAgdGhpcy5jb25uZWN0aW9uU2VudEJpdHJhdGVDaGFydF8uZHJhdygpOwogIHRoaXMuY29ubmVjdGlvblJlY3ZCaXRyYXRlQ2hhcnRfLmRyYXcoKTsKICB0aGlzLmF1ZGlvU2VuZGVyTG9zc1JhdGlvQ2hhcnRfLmRyYXcoKTsKICB0aGlzLmF1ZGlvU2VuZGVyTG9zdFBhY2tldHNDaGFydF8uZHJhdygpOwogIHRoaXMuYXVkaW9TZW5kZXJKaXR0ZXJDaGFydF8uZHJhdygpOwogIHRoaXMuYXVkaW9TZW5kZXJSdHRDaGFydF8uZHJhdygpOwogIHRoaXMuYXVkaW9TZW5kZXJFbmVyZ3lDaGFydF8uZHJhdygpOwogIHRoaXMuYXVkaW9SZWN2ZXJMb3NzUmF0aW9DaGFydF8uZHJhdygpOwogIHRoaXMuYXVkaW9SZWN2ZXJMb3N0UGFja2V0c0NoYXJ0Xy5kcmF3KCk7CiAgdGhpcy5hdWRpb1JlY3ZlckppdHRlckNoYXJ0Xy5kcmF3KCk7CiAgdGhpcy5hdWRpb1JlY3ZlckVuZXJneUNoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1NlbmRlckxvc3NSYXRpb0NoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1NlbmRlckxvc3RQYWNrZXRzQ2hhcnRfLmRyYXcoKTsKICB0aGlzLnZpZGVvU2VuZGVyQ2FjaGVkUGFja2V0c0NoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1NlbmRlckZpckNoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1NlbmRlck5hY2tDaGFydF8uZHJhdygpOwogIHRoaXMudmlkZW9TZW5kZXJEbmFja0NoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1NlbmRlckRydHhDaGFydF8uZHJhdygpOwogIHRoaXMudmlkZW9TZW5kZXJSdHRDaGFydF8uZHJhdygpOwogIHRoaXMudmlkZW9TZW5kZXJXaWR0aENoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1NlbmRlckhlaWdodENoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1NlbmRlckZwc0NoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1NlbmRlckZwc1NlbnRDaGFydF8uZHJhdygpOwogIHRoaXMudmlkZW9SZWN2ZXJMb3NzUmF0aW9DaGFydF8uZHJhdygpOwogIHRoaXMudmlkZW9SZWN2ZXJMb3N0UGFja2V0c0NoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1JlY3ZlckNvbmNlYWxlZFBhY2tldHNDaGFydF8uZHJhdygpOwogIHRoaXMudmlkZW9SZWN2ZXJGaXJDaGFydF8uZHJhdygpOwogIHRoaXMudmlkZW9SZWN2ZXJOYWNrQ2hhcnRfLmRyYXcoKTsKICB0aGlzLnZpZGVvUmVjdmVyRG5hY2tDaGFydF8uZHJhdygpOwogIHRoaXMudmlkZW9SZWN2ZXJXaWR0aENoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1JlY3ZlckhlaWdodENoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1JlY3ZlckZwc0NoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1JlY3ZlckZwc1JlY3ZlZENoYXJ0Xy5kcmF3KCk7CiAgdGhpcy52aWRlb1JlY3ZlckZwc0RlY29kZWRDaGFydF8uZHJhdygpCn07CnRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLmNyZWF0ZUNoYXJ0c18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCQkY3JlYXRlQ2hhcnRzXyQoKSB7CiAgdGhpcy5jcHVVc2FnZUNoYXJ0XyA9IHRoaXMuY3JlYXRlQ2hhcnRfKCJDUFUgdXNhZ2UgKCUpIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5DUFVfVVNBR0VfQ0hBUlQsIDEwMCwgITApOwogIHRoaXMuY29ubmVjdGlvblJ0dENoYXJ0XyA9IHRoaXMuY3JlYXRlQ2hhcnRfKCJDb25uZWN0aW9uIFJUVCAobXMpIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5DT05ORUNUSU9OX1JUVF9DSEFSVCwgMUUzLCAhMSk7CiAgdGhpcy5jb25uZWN0aW9uU2VudEJpdHJhdGVDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiQ29ubmVjdGlvbiBzZW5kIGJpdHJhdGUgKGticHMpIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5DT05ORUNUSU9OX1NFTlRfQklUUkFURV9DSEFSVCwgMkUzLCAhMSk7CiAgdGhpcy5jb25uZWN0aW9uUmVjdkJpdHJhdGVDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiQ29ubmVjdGlvbiByZWNlaXZlIGJpdHJhdGUgKGticHMpIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5DT05ORUNUSU9OX1JFQ1ZfQklUUkFURV9DSEFSVCwgMkUzLCAhMCk7CiAgdGhpcy5hdWRpb1NlbmRlckxvc3NSYXRpb0NoYXJ0XyA9IHRoaXMuY3JlYXRlQ2hhcnRfKCJPdXRnb2luZyBhdWRpbyBsb3NzIHJhdGlvICglKSIsIHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuQVVESU9fU0VOREVSX0xPU1NfUkFUSU9fQ0hBUlQsIDEsICExKTsKICB0aGlzLmF1ZGlvU2VuZGVyTG9zdFBhY2tldHNDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiT3V0Z29pbmcgYXVkaW8gbG9zdCBwYWNrZXRzIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5BVURJT19TRU5ERVJfTE9TVF9QQUNLRVRTX0NIQVJULCA1RTMsICExKTsKICB0aGlzLmF1ZGlvU2VuZGVySml0dGVyQ2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIk91dGdvaW5nIGF1ZGlvIGppdHRlciAobXMpIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5BVURJT19TRU5ERVJfSklUVEVSX0NIQVJULCAyMDAsICExKTsKICB0aGlzLmF1ZGlvU2VuZGVyUnR0Q2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIk91dGdvaW5nIGF1ZGlvIFJUVCAobXMpIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5BVURJT19TRU5ERVJfUlRUX0NIQVJULCAxRTMsICExKTsKICB0aGlzLmF1ZGlvU2VuZGVyRW5lcmd5Q2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIk91dGdvaW5nIGF1ZGlvIGVuZXJneSIsIHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuQVVESU9fU0VOREVSX0VORVJHWV9DSEFSVCwgMzVFMywgITApOwogIHRoaXMuYXVkaW9SZWN2ZXJMb3NzUmF0aW9DaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiSW5jb21pbmcgYXVkaW8gbG9zcyByYXRpbyAoJSkiLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLkFVRElPX1JFQ1ZFUl9MT1NTX1JBVElPX0NIQVJULCAxLCAhMSk7CiAgdGhpcy5hdWRpb1JlY3Zlckxvc3RQYWNrZXRzQ2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIkluY29taW5nIGF1ZGlvIGxvc3QgcGFja2V0cyIsIHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuQVVESU9fUkVDVkVSX0xPU1RfUEFDS0VUU19DSEFSVCwgNUUzLCAhMSk7CiAgdGhpcy5hdWRpb1JlY3ZlckppdHRlckNoYXJ0XyA9IHRoaXMuY3JlYXRlQ2hhcnRfKCJJbmNvbWluZyBhdWRpbyBqaXR0ZXIgKG1zKSIsIHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuQVVESU9fUkVDVkVSX0pJVFRFUl9DSEFSVCwgMjAwLCAhMSk7CiAgdGhpcy5hdWRpb1JlY3ZlckVuZXJneUNoYXJ0XyA9IHRoaXMuY3JlYXRlQ2hhcnRfKCJJbmNvbWluZyBhdWRpbyBlbmVyZ3kiLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLkFVRElPX1JFQ1ZFUl9FTkVSR1lfQ0hBUlQsIDM1RTMsICEwKTsKICB0aGlzLnZpZGVvU2VuZGVyTG9zc1JhdGlvQ2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIk91dGdvaW5nIHZpZGVvIGxvc3MgcmF0aW8gKCUpIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19TRU5ERVJfTE9TU19SQVRJT19DSEFSVCwgMSwgITEpOwogIHRoaXMudmlkZW9TZW5kZXJMb3N0UGFja2V0c0NoYXJ0XyA9IHRoaXMuY3JlYXRlQ2hhcnRfKCJPdXRnb2luZyB2aWRlbyBsb3N0IHBhY2tldHMiLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9MT1NUX1BBQ0tFVFNfQ0hBUlQsIDVFMywgITEpOwogIHRoaXMudmlkZW9TZW5kZXJDYWNoZWRQYWNrZXRzQ2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIk91dGdvaW5nIHZpZGVvIGNhY2hlZCBwYWNrZXRzIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19TRU5ERVJfQ0FDSEVEX1BBQ0tFVFNfQ0hBUlQsIDVFMywgITEpOwogIHRoaXMudmlkZW9TZW5kZXJGaXJDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiRklScyByZWNlaXZlZCBmb3Igb3V0Z29pbmcgdmlkZW8iLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9GSVJfQ0hBUlQsIDVFMywgITEpOwogIHRoaXMudmlkZW9TZW5kZXJOYWNrQ2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIk5BQ0tzIHJlY2VpdmVkIGZvciBvdXRnb2luZyB2aWRlbyIsIHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuVklERU9fU0VOREVSX05BQ0tfQ0hBUlQsIDVFMywgITEpOwogIHRoaXMudmlkZW9TZW5kZXJEbmFja0NoYXJ0XyA9IHRoaXMuY3JlYXRlQ2hhcnRfKCJEaXN0aW5jdCBOQUNLcyByZWNlaXZlZCBmb3Igb3V0Z29pbmcgdmlkZW8iLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9ETkFDS19DSEFSVCwgNUUzLCAhMSk7CiAgdGhpcy52aWRlb1NlbmRlckRydHhDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiUmV0cmFuc21pdHRlZCB2aWRlbyBwYWNrZXRzIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19TRU5ERVJfRFJUWF9DSEFSVCwgNUUzLCAhMSk7CiAgdGhpcy52aWRlb1NlbmRlclJ0dENoYXJ0XyA9IHRoaXMuY3JlYXRlQ2hhcnRfKCJPdXRnb2luZyB2aWRlbyBSVFQgKG1zKSIsIHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuVklERU9fU0VOREVSX1JUVF9DSEFSVCwgMUUzLCAhMSk7CiAgdGhpcy52aWRlb1NlbmRlcldpZHRoQ2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIk91dGdvaW5nIHZpZGVvIHdpZHRoIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19TRU5ERVJfV0lEVEhfQ0hBUlQsIDE1MDAsICExKTsKICB0aGlzLnZpZGVvU2VuZGVySGVpZ2h0Q2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIk91dGdvaW5nIHZpZGVvIGhlaWdodCIsIHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuVklERU9fU0VOREVSX0hFSUdIVF9DSEFSVCwgMTUwMCwgITEpOwogIHRoaXMudmlkZW9TZW5kZXJGcHNDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiT3V0Z29pbmcgdmlkZW8gZnBzIHRvIGVuY29kZXIiLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9GUFNfQ0hBUlQsIDMwLCAhMSk7CiAgdGhpcy52aWRlb1NlbmRlckZwc1NlbnRDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiT3V0Z29pbmcgdmlkZW8gZnBzIHNlbnQiLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1NFTkRFUl9GUFNfU0VOVF9DSEFSVCwgMzAsICEwKTsKICB0aGlzLnZpZGVvUmVjdmVyTG9zc1JhdGlvQ2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIkluY29taW5nIHZpZGVvIGxvc3MgcmF0aW8gKCUpIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19SRUNWRVJfTE9TU19SQVRJT19DSEFSVCwgMSwgITEpOwogIHRoaXMudmlkZW9SZWN2ZXJMb3N0UGFja2V0c0NoYXJ0XyA9IHRoaXMuY3JlYXRlQ2hhcnRfKCJJbmNvbWluZyB2aWRlbyBsb3N0IHBhY2tldHMiLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1JFQ1ZFUl9MT1NUX1BBQ0tFVFNfQ0hBUlQsIDVFMywgITEpOwogIHRoaXMudmlkZW9SZWN2ZXJDb25jZWFsZWRQYWNrZXRzQ2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIkNvbmNlYWxlZCB2aWRlbyBwYWNrZXRzIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19SRUNWRVJfQ09OQ0VBTEVEX1BBQ0tFVFNfQ0hBUlQsIDVFMywgITEpOwogIHRoaXMudmlkZW9SZWN2ZXJGaXJDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiRklScyBzZW50IGZvciBpbmNvbWluZyB2aWRlbyIsIHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuVklERU9fUkVDVkVSX0ZJUl9DSEFSVCwgNUUzLCAhMSk7CiAgdGhpcy52aWRlb1JlY3Zlck5hY2tDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiTkFDS3Mgc2VudCBmb3IgaW5jb21pbmcgdmlkZW8iLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1JFQ1ZFUl9OQUNLX0NIQVJULCA1RTMsICExKTsKICB0aGlzLnZpZGVvUmVjdmVyRG5hY2tDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiRGlzdGluY3QgTkFDS3Mgc2VudCBmb3IgaW5jb21pbmcgdmlkZW8iLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLklkLlZJREVPX1JFQ1ZFUl9ETkFDS19DSEFSVCwgNUUzLCAhMSk7CiAgdGhpcy52aWRlb1JlY3ZlcldpZHRoQ2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIkluY29taW5nIHZpZGVvIHdpZHRoIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19SRUNWRVJfV0lEVEhfQ0hBUlQsIDE1MDAsICExKTsKICB0aGlzLnZpZGVvUmVjdmVySGVpZ2h0Q2hhcnRfID0gdGhpcy5jcmVhdGVDaGFydF8oIkluY29taW5nIHZpZGVvIGhlaWdodCIsIHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuVklERU9fUkVDVkVSX0hFSUdIVF9DSEFSVCwgMTUwMCwgITEpOwogIHRoaXMudmlkZW9SZWN2ZXJGcHNDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiSW5jb21pbmcgdmlkZW8gZnBzIHRvIHJlbmRlcmVyIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19SRUNWRVJfRlBTX0NIQVJULCAzMCwgITEpOwogIHRoaXMudmlkZW9SZWN2ZXJGcHNSZWN2ZWRDaGFydF8gPSB0aGlzLmNyZWF0ZUNoYXJ0XygiSW5jb21pbmcgdmlkZW8gZnBzIHJlY2VpdmVkIiwgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5JZC5WSURFT19SRUNWRVJfRlBTX1JFQ1ZFRF9DSEFSVCwgMzAsICExKTsKICB0aGlzLnZpZGVvUmVjdmVyRnBzRGVjb2RlZENoYXJ0XyA9IHRoaXMuY3JlYXRlQ2hhcnRfKCJJbmNvbWluZyB2aWRlbyBmcHMgZGVjb2RlZCIsIHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuSWQuVklERU9fUkVDVkVSX0ZQU19ERUNPREVEX0NIQVJULCAzMCwgITApCn07CnRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLmNyZWF0ZUNoYXJ0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEdyYXBoRGFzaGJvYXJkJCRjcmVhdGVDaGFydF8kKHRpdGxlLCBpZCwgbWF4VmFsdWUsIGhhc0xlZ2VuZCkgewogIHJldHVybiBuZXcgdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DaGFydCh0aXRsZSwgdGhpcy5nZXRFbGVtZW50QnlGcmFnbWVudChpZCksIG1heFZhbHVlLCBoYXNMZWdlbmQpCn07CnRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLmNsZWFyQ2hhcnRzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJEdyYXBoRGFzaGJvYXJkJCRjbGVhckNoYXJ0c18kKCkgewogIHRoaXMuY3B1VXNhZ2VDaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy5jb25uZWN0aW9uUnR0Q2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMuY29ubmVjdGlvblNlbnRCaXRyYXRlQ2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMuY29ubmVjdGlvblJlY3ZCaXRyYXRlQ2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMuYXVkaW9TZW5kZXJMb3NzUmF0aW9DaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy5hdWRpb1NlbmRlckxvc3RQYWNrZXRzQ2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMuYXVkaW9TZW5kZXJKaXR0ZXJDaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy5hdWRpb1NlbmRlclJ0dENoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLmF1ZGlvU2VuZGVyRW5lcmd5Q2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMuYXVkaW9SZWN2ZXJMb3NzUmF0aW9DaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy5hdWRpb1JlY3Zlckxvc3RQYWNrZXRzQ2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMuYXVkaW9SZWN2ZXJKaXR0ZXJDaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy5hdWRpb1JlY3ZlckVuZXJneUNoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLnZpZGVvU2VuZGVyTG9zc1JhdGlvQ2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMudmlkZW9TZW5kZXJMb3N0UGFja2V0c0NoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLnZpZGVvU2VuZGVyQ2FjaGVkUGFja2V0c0NoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLnZpZGVvU2VuZGVyRmlyQ2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMudmlkZW9TZW5kZXJOYWNrQ2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMudmlkZW9TZW5kZXJEbmFja0NoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLnZpZGVvU2VuZGVyRHJ0eENoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLnZpZGVvU2VuZGVyUnR0Q2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMudmlkZW9TZW5kZXJXaWR0aENoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLnZpZGVvU2VuZGVySGVpZ2h0Q2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMudmlkZW9TZW5kZXJGcHNDaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy52aWRlb1NlbmRlckZwc1NlbnRDaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy52aWRlb1JlY3Zlckxvc3NSYXRpb0NoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLnZpZGVvUmVjdmVyTG9zdFBhY2tldHNDaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy52aWRlb1JlY3ZlckNvbmNlYWxlZFBhY2tldHNDaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy52aWRlb1JlY3ZlckZpckNoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLnZpZGVvUmVjdmVyTmFja0NoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLnZpZGVvUmVjdmVyRG5hY2tDaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy52aWRlb1JlY3ZlcldpZHRoQ2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMudmlkZW9SZWN2ZXJIZWlnaHRDaGFydF8uY2xlYXJEYXRhKCk7CiAgdGhpcy52aWRlb1JlY3ZlckZwc0NoYXJ0Xy5jbGVhckRhdGEoKTsKICB0aGlzLnZpZGVvUmVjdmVyRnBzUmVjdmVkQ2hhcnRfLmNsZWFyRGF0YSgpOwogIHRoaXMudmlkZW9SZWN2ZXJGcHNEZWNvZGVkQ2hhcnRfLmNsZWFyRGF0YSgpCn07CnRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuQ2hhcnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCRDaGFydCQodGl0bGUsIGltYWdlLCBtYXhWYWx1ZSwgaGFzTGVnZW5kKSB7CiAgdGhpcy5rZXlzXyA9IFtdOwogIHRoaXMuZGF0YV8gPSBbXTsKICB0aGlzLmhhc0xlZ2VuZF8gPSAhMTsKICB2YXIgd2lkdGggPSB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLkNoYXJ0LldJRFRIXzsKICBoYXNMZWdlbmQgJiYgKHdpZHRoID0gdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DaGFydC5MRUdFTkRfV0lEVEhfLCB0aGlzLmhhc0xlZ2VuZF8gPSAhMCk7CiAgdmFyIGNoYXJ0VXJpID0gdGhpcy5nZXRDaGFydFVyaV8oKTsKICB0aGlzLnNlcnZlckNoYXJ0XyA9IG5ldyBnb29nLnVpLlNlcnZlckNoYXJ0KGdvb2cudWkuU2VydmVyQ2hhcnQuQ2hhcnRUeXBlLkxJTkUsIHdpZHRoLCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLkNoYXJ0LkhFSUdIVF8sIG51bGwsIGNoYXJ0VXJpKTsKICB0aGlzLnNlcnZlckNoYXJ0Xy5zZXRUaXRsZSh0aXRsZSk7CiAgdGhpcy5zZXJ2ZXJDaGFydF8uc2V0TWluVmFsdWUoMCk7CiAgdGhpcy5zZXJ2ZXJDaGFydF8uc2V0TWF4VmFsdWUobWF4VmFsdWUpOwogIGZvcih2YXIgbGFiZWxzID0gW10sIGkgPSAwOzUgPj0gaTtpKyspIHsKICAgIGxhYmVscy5wdXNoKGkgKiBtYXhWYWx1ZSAvIDUpCiAgfQogIHRoaXMuc2VydmVyQ2hhcnRfLnNldExlZnRMYWJlbHMobGFiZWxzKTsKICB0aGlzLnNlcnZlckNoYXJ0Xy5zZXRHcmlkUGFyYW1ldGVyKCIwLCAyMCwgMSwgNCIpOwogIHRoaXMuc2VydmVyQ2hhcnRfLmRlY29yYXRlKGltYWdlKQp9Owp0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLkNoYXJ0LldJRFRIXyA9IDI0MDsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DaGFydC5MRUdFTkRfV0lEVEhfID0gMjg4Owp0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLkNoYXJ0LkhFSUdIVF8gPSAxNjQ7CnRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuQ2hhcnQuTUFYX1BPSU5UU18gPSAzMDsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DaGFydC5wcm90b3R5cGUuZ2V0Q2hhcnRVcmlfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkR3JhcGhEYXNoYm9hcmQkQ2hhcnQkJGdldENoYXJ0VXJpXyQoKSB7CiAgdmFyIHVzZVNzbENoYXJ0U2VydmVyID0gImh0dHBzIiA9PSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7CiAgcmV0dXJuIHVzZVNzbENoYXJ0U2VydmVyID8gZ29vZy51aS5TZXJ2ZXJDaGFydC5DSEFSVF9TRVJWRVJfSFRUUFNfVVJJIDogZ29vZy51aS5TZXJ2ZXJDaGFydC5DSEFSVF9TRVJWRVJfSFRUUF9VUkkKfTsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DaGFydC5wcm90b3R5cGUuY2xlYXJEYXRhID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkR3JhcGhEYXNoYm9hcmQkQ2hhcnQkJGNsZWFyRGF0YSQoKSB7CiAgdGhpcy5rZXlzXyA9IFtdOwogIHRoaXMuZGF0YV8gPSBbXQp9Owp0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLkNoYXJ0LnByb3RvdHlwZS5hZGRLZXkgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCRDaGFydCQkYWRkS2V5JChrZXkpIHsKICB0aGlzLmtleXNfLnB1c2goa2V5KTsKICB0aGlzLmRhdGFfW2tleV0gPSBbXTsKICBmb3IodmFyIGkgPSAwO2kgPCB0YWxrLm1lZGlhLkdyYXBoRGFzaGJvYXJkLkNoYXJ0Lk1BWF9QT0lOVFNfO2krKykgewogICAgdGhpcy5kYXRhX1trZXldW2ldID0gMAogIH0KfTsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DaGFydC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCRDaGFydCQkc2V0VmFsdWUkKGtleSwgaSwgdmFsdWUpIHsKICB0aGlzLmRhdGFfW2tleV1baV0gPSBNYXRoLm1heCh2YWx1ZSwgMCkKfTsKdGFsay5tZWRpYS5HcmFwaERhc2hib2FyZC5DaGFydC5wcm90b3R5cGUuc2V0TWF4VmFsdWUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCRDaGFydCQkc2V0TWF4VmFsdWUkKHZhbHVlKSB7CiAgdGhpcy5zZXJ2ZXJDaGFydF8uc2V0TWF4VmFsdWUodmFsdWUpCn07CnRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQuQ2hhcnQucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRHcmFwaERhc2hib2FyZCRDaGFydCQkZHJhdyQoKSB7CiAgdmFyIGNvbG9ycyA9ICJGRjAwMDAsMDBGRkZGLDAwMDBGRiw1RkI0MDQsMDAwMEEwLEZGMDA4MCw4MDAwODAsRkZGRjAwLDAwRkYwMCxGRjAwRkYsQzBDMEMwLDgwODA4MCwwMDAwMDAsRkY4MDQwLDgwNDAwMCw4MDAwMDAsODA4MDAwLDQwODA4MCw5RTdCRkYsNDE2MjdFLDZBMjg3RSxFMEZGRkYsNzM2QUZGLDY2N0MyNiIuc3BsaXQoIiwiKTsKICB0aGlzLnNlcnZlckNoYXJ0Xy5jbGVhckRhdGFTZXRzKCk7CiAgdmFyIGlkeCA9IDAsIGtleTsKICBmb3Ioa2V5IGluIHRoaXMuZGF0YV8pIHsKICAgIHRoaXMuc2VydmVyQ2hhcnRfLmFkZERhdGFTZXQodGhpcy5kYXRhX1trZXldLCBjb2xvcnNbaWR4ICUgY29sb3JzLmxlbmd0aF0pLCBpZHgrKwogIH0KICAhMCA9PSB0aGlzLmhhc0xlZ2VuZF8gJiYgdGhpcy5zZXJ2ZXJDaGFydF8uc2V0TGVnZW5kKHRoaXMua2V5c18pOwogIHRoaXMuc2VydmVyQ2hhcnRfLnVwZGF0ZUNoYXJ0KCkKfTsKdGFsay5tZWRpYS5Jc3N1ZURhc2hib2FyZFRlbXBsYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkSXNzdWVEYXNoYm9hcmRUZW1wbGF0ZSQob3B0X2RhdGEsIG9wdF9zYikgewogIHZhciBvdXRwdXQgPSBvcHRfc2IgfHwgbmV3IHNveS5TdHJpbmdCdWlsZGVyLCBpc3N1ZUxpc3QzID0gb3B0X2RhdGEuaXNzdWVzLCBpc3N1ZUxpc3RMZW4zID0gaXNzdWVMaXN0My5sZW5ndGg7CiAgaWYoMCA8IGlzc3VlTGlzdExlbjMpIHsKICAgIGZvcih2YXIgaXNzdWVJbmRleDMgPSAwO2lzc3VlSW5kZXgzIDwgaXNzdWVMaXN0TGVuMztpc3N1ZUluZGV4MysrKSB7CiAgICAgIHZhciBpc3N1ZURhdGEzID0gaXNzdWVMaXN0M1tpc3N1ZUluZGV4M107CiAgICAgIG91dHB1dC5hcHBlbmQoMCA9PSBpc3N1ZUluZGV4MyA/ICI8dGFibGU+PHRoZWFkPjx0cj48dGg+SWQ8L3RoPjx0aD5DYXRlZ29yeTwvdGg+PHRoPkxldmVsPC90aD48dGg+VmlzaWJpbGl0eTwvdGg+PHRoPk1lc3NhZ2U8L3RoPjx0aD5JbXByZXNzaW9uPC90aD48dGg+VXJpPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PiIgOiAiIik7CiAgICAgIHRhbGsubWVkaWEuSXNzdWVUYWJsZVJvdyhpc3N1ZURhdGEzLCBvdXRwdXQpOwogICAgICBvdXRwdXQuYXBwZW5kKGlzc3VlSW5kZXgzID09IGlzc3VlTGlzdExlbjMgLSAxID8gIjwvdGJvZHk+PC90YWJsZT4iIDogIiIpCiAgICB9CiAgfWVsc2UgewogICAgb3V0cHV0LmFwcGVuZCgiPHA+Tm8gaXNzdWVzISIpCiAgfQogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEuSXNzdWVUYWJsZUhlYWRpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRJc3N1ZVRhYmxlSGVhZGluZyQob3B0X2RhdGEsIG9wdF9zYikgewogIHZhciBvdXRwdXQgPSBvcHRfc2IgfHwgbmV3IHNveS5TdHJpbmdCdWlsZGVyOwogIG91dHB1dC5hcHBlbmQoIjx0cj48dGg+SWQ8L3RoPjx0aD5DYXRlZ29yeTwvdGg+PHRoPkxldmVsPC90aD48dGg+VmlzaWJpbGl0eTwvdGg+PHRoPk1lc3NhZ2U8L3RoPjx0aD5JbXByZXNzaW9uPC90aD48dGg+VXJpPC90aD48L3RyPiIpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEuSXNzdWVUYWJsZVJvdyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJElzc3VlVGFibGVSb3ckKG9wdF9kYXRhLCBvcHRfc2IpIHsKICB2YXIgb3V0cHV0ID0gb3B0X3NiIHx8IG5ldyBzb3kuU3RyaW5nQnVpbGRlcjsKICBvdXRwdXQuYXBwZW5kKCI8dHI+PHRkPiIsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuaWQpLCAiPC90ZD48dGQ+Iiwgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5jYXRlZ29yeSksICI8L3RkPjx0ZD4iLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmxldmVsKSwgIjwvdGQ+PHRkPiIsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEudmlzaWJpbGl0eSksICI8L3RkPjx0ZD4iLCBudWxsICE9IG9wdF9kYXRhLm1lc3NhZ2UgPyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLm1lc3NhZ2UpIDogIk4vQSIsICI8L3RkPjx0ZD4iLCBudWxsICE9IG9wdF9kYXRhLmltcHJlc3Npb24gPyBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLmltcHJlc3Npb24pIDogIk4vQSIsICI8L3RkPjx0ZD4iLCBudWxsICE9IG9wdF9kYXRhLnVyaSA/ICc8YSBocmVmPSInICsgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS51cmkpICsgJyI+JyArIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEudXJpKSArIAogICI8L2E+IiA6ICJOL0EiLCAiPC90ZD48L3RyPiIpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEuSXNzdWVEYXNoYm9hcmQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRJc3N1ZURhc2hib2FyZCQob3B0X2RvbUhlbHBlcikgewogIGdvb2cudWkuQ29tcG9uZW50LmNhbGwodGhpcywgb3B0X2RvbUhlbHBlcikKfTsKZ29vZy5pbmhlcml0cyh0YWxrLm1lZGlhLklzc3VlRGFzaGJvYXJkLCBnb29nLnVpLkNvbXBvbmVudCk7CnRhbGsubWVkaWEuSXNzdWVEYXNoYm9hcmQucHJvdG90eXBlLmlzc3VlQ29sbGVjdG9yXyA9IG51bGw7CnRhbGsubWVkaWEuSXNzdWVEYXNoYm9hcmQuQ0FURUdPUllfVEVYVCA9IGdvb2cub2JqZWN0LnRyYW5zcG9zZSh0YWxrLm1lZGlhLnF1YWxpdHkuSXNzdWUuQ2F0ZWdvcnkpOwp0YWxrLm1lZGlhLklzc3VlRGFzaGJvYXJkLkxFVkVMX1RFWFQgPSBnb29nLm9iamVjdC50cmFuc3Bvc2UodGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLkxldmVsKTsKdGFsay5tZWRpYS5Jc3N1ZURhc2hib2FyZC5WSVNJQklMSVRZX1RFWFQgPSBnb29nLm9iamVjdC50cmFuc3Bvc2UodGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlLlZpc2liaWxpdHkpOwp0YWxrLm1lZGlhLklzc3VlRGFzaGJvYXJkLnByb3RvdHlwZS5kZWNvcmF0ZUludGVybmFsID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkSXNzdWVEYXNoYm9hcmQkJGRlY29yYXRlSW50ZXJuYWwkKGVsZW1lbnQpIHsKICB0YWxrLm1lZGlhLklzc3VlRGFzaGJvYXJkLnN1cGVyQ2xhc3NfLmRlY29yYXRlSW50ZXJuYWwuY2FsbCh0aGlzLCBlbGVtZW50KTsKICB0aGlzLmdldEVsZW1lbnQoKS5pbm5lckhUTUwgPSB0YWxrLm1lZGlhLklzc3VlRGFzaGJvYXJkVGVtcGxhdGUodGhpcy5jcmVhdGVUZW1wbGF0ZUNvbnRleHRfKCkpCn07CnRhbGsubWVkaWEuSXNzdWVEYXNoYm9hcmQucHJvdG90eXBlLmVudGVyRG9jdW1lbnQgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRJc3N1ZURhc2hib2FyZCQkZW50ZXJEb2N1bWVudCQoKSB7CiAgdGFsay5tZWRpYS5Jc3N1ZURhc2hib2FyZC5zdXBlckNsYXNzXy5lbnRlckRvY3VtZW50LmNhbGwodGhpcykKfTsKdGFsay5tZWRpYS5Jc3N1ZURhc2hib2FyZC5wcm90b3R5cGUuY3JlYXRlVGVtcGxhdGVDb250ZXh0XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJElzc3VlRGFzaGJvYXJkJCRjcmVhdGVUZW1wbGF0ZUNvbnRleHRfJCgpIHsKICBpZighdGhpcy5pc3N1ZUNvbGxlY3Rvcl8pIHsKICAgIHJldHVybntpc3N1ZXM6W119CiAgfQogIGZvcih2YXIgY29udGV4dCA9IFtdLCBpc3N1ZUhpc3RvcnkgPSB0aGlzLmlzc3VlQ29sbGVjdG9yXy5nZXRJc3N1ZUhpc3RvcnkoKSwgaSA9IDA7aSA8IGlzc3VlSGlzdG9yeS5sZW5ndGg7aSsrKSB7CiAgICBjb250ZXh0LnB1c2godGhpcy5jb252ZXJ0VG9Db250ZXh0SXNzdWVfKGlzc3VlSGlzdG9yeVtpXSkpCiAgfQogIHJldHVybntpc3N1ZXM6Y29udGV4dH0KfTsKdGFsay5tZWRpYS5Jc3N1ZURhc2hib2FyZC5wcm90b3R5cGUudXBkYXRlRGFzaGJvYXJkID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkSXNzdWVEYXNoYm9hcmQkJHVwZGF0ZURhc2hib2FyZCQoY29sbGVjdG9yKSB7CiAgdGhpcy5pc3N1ZUNvbGxlY3Rvcl8gPSBjb2xsZWN0b3I7CiAgdGhpcy5nZXRFbGVtZW50KCkuaW5uZXJIVE1MID0gdGFsay5tZWRpYS5Jc3N1ZURhc2hib2FyZFRlbXBsYXRlKHRoaXMuY3JlYXRlVGVtcGxhdGVDb250ZXh0XygpKQp9Owp0YWxrLm1lZGlhLklzc3VlRGFzaGJvYXJkLnByb3RvdHlwZS5jb252ZXJ0VG9Db250ZXh0SXNzdWVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkSXNzdWVEYXNoYm9hcmQkJGNvbnZlcnRUb0NvbnRleHRJc3N1ZV8kKGlzc3VlKSB7CiAgcmV0dXJue2lkOmlzc3VlLmdldElkKCksIGNhdGVnb3J5OnRhbGsubWVkaWEuSXNzdWVEYXNoYm9hcmQuQ0FURUdPUllfVEVYVFtpc3N1ZS5nZXRDYXRlZ29yeSgpXSwgbGV2ZWw6dGFsay5tZWRpYS5Jc3N1ZURhc2hib2FyZC5MRVZFTF9URVhUW2lzc3VlLmdldExldmVsKCldLCB2aXNpYmlsaXR5OnRhbGsubWVkaWEuSXNzdWVEYXNoYm9hcmQuVklTSUJJTElUWV9URVhUW2lzc3VlLmdldFZpc2liaWxpdHkoKV0sIG1lc3NhZ2U6aXNzdWUuZ2V0TWVzc2FnZSgpLCBpbXByZXNzaW9uOmlzc3VlLmdldEltcHJlc3Npb24oKSwgdXJpOmlzc3VlLmdldFVyaSgpfQp9Owp0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFQcm9ibGVtUmVjb3JkZXIkKGNhbGxNYW5hZ2VyLCBvcHRfZm9yY2VFbmFibGUpIHsKICB0aGlzLmNhbGxNYW5hZ2VyXyA9IGNhbGxNYW5hZ2VyOwogIHRoaXMuZm9yY2VFbmFibGVfID0gb3B0X2ZvcmNlRW5hYmxlCn07CnRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIucHJvdG90eXBlLnJlY29yZER1cmF0aW9uTXNfID0gMDsKdGFsay5tZWRpYS5NZWRpYVByb2JsZW1SZWNvcmRlci5FQ0hPX0JJVFJBVEVfID0gODAwOwp0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyLk9VVEdPSU5HX0FVRElPX0JJVFJBVEVfID0gMzI7CnRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIuSU5DT01JTkdfQVVESU9fQklUUkFURV8gPSA5NjsKdGFsay5tZWRpYS5NZWRpYVByb2JsZW1SZWNvcmRlci5PVVRHT0lOR19WSURFT19CSVRSQVRFXyA9IDFFMzsKdGFsay5tZWRpYS5NZWRpYVByb2JsZW1SZWNvcmRlci5JTkNPTUlOR19WSURFT19CSVRSQVRFXyA9IDI4MDA7CnRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIuTUFYX1JFQ09SRF9TSVpFXyA9IDI0NTc2Owp0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyLk1BWF9SRUNPUkRfTUlMTElTRUNPTkRTXyA9IDZFNDsKdGFsay5tZWRpYS5NZWRpYVByb2JsZW1SZWNvcmRlci5sb2dnZXJfID0gZ29vZy5kZWJ1Zy5Mb2dnZXIuZ2V0TG9nZ2VyKCJ0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyIik7CnRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIucHJvdG90eXBlLnN0YXJ0UmVjb3JkaW5nID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFQcm9ibGVtUmVjb3JkZXIkJHN0YXJ0UmVjb3JkaW5nJChjYWxsLCBlY2hvLCBhdWRpbywgdmlkZW8sIHJlY2VpdmVkLCBzZW50KSB7CiAgdGhpcy5yZWNvcmREdXJhdGlvbk1zXyA9IDA7CiAgaWYodGhpcy5jdXJyZW50Q2FsbF8pIHsKICAgIHJldHVybiB0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyLmxvZ2dlcl8ud2FybmluZygiYWxyZWFkeSByZWNvcmRpbmcgbWVkaWEiKSwgITEKICB9CiAgaWYoIXRoaXMuY2FuUmVjb3JkKGNhbGwpKSB7CiAgICByZXR1cm4hMQogIH0KICBpZighZWNobyAmJiAhYXVkaW8gJiYgIXZpZGVvKSB7CiAgICByZXR1cm4gdGFsay5tZWRpYS5NZWRpYVByb2JsZW1SZWNvcmRlci5sb2dnZXJfLndhcm5pbmcoImVjaG8gfHwgYXVkaW8gfHwgdmlkZW8gbXVzdCBiZSB0cnVlIiksICExCiAgfQogIGlmKCFzZW50ICYmICFyZWNlaXZlZCkgewogICAgcmV0dXJuIHRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIubG9nZ2VyXy53YXJuaW5nKCJzZW50IHx8IHJlY2VpdmVkIG11c3QgYmUgdHJ1ZSIpLCAhMQogIH0KICB2YXIgbWVkaWEgPSAiIjsKICBlY2hvICYmIChtZWRpYSArPSAiZSIpOwogIGF1ZGlvICYmIChtZWRpYSArPSAiYSIpOwogIHZpZGVvICYmIChtZWRpYSArPSAidiIpOwogIHZhciBkaXJlY3Rpb24gPSAiIjsKICBzZW50ICYmIChkaXJlY3Rpb24gKz0gInMiKTsKICByZWNlaXZlZCAmJiAoZGlyZWN0aW9uICs9ICJyIik7CiAgdGhpcy5jYWxsTWFuYWdlcl8uc2VuZEZsdXRlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUoWyJkZWJ1ZyIsIGNhbGwucmVtb3RlSmlkc1swXSwgY2FsbC5zZXNzaW9uSWQsICJyZWNvcmQiLCB7dHlwZTptZWRpYSwgZGlyZWN0aW9uOmRpcmVjdGlvbn1dKSk7CiAgdGhpcy5jdXJyZW50Q2FsbF8gPSBjYWxsOwogIHRoaXMucmVjb3JkRHVyYXRpb25Nc18gPSB0aGlzLmNhbGN1bGF0ZVJlY29yZFRpbWVfKGVjaG8sIGF1ZGlvLCB2aWRlbywgc2VudCwgcmVjZWl2ZWQpOwogIDAgPCB0aGlzLnJlY29yZER1cmF0aW9uTXNfICYmIGdvb2cuVGltZXIuY2FsbE9uY2UodGhpcy5zdG9wUmVjb3JkaW5nLCB0aGlzLnJlY29yZER1cmF0aW9uTXNfLCB0aGlzKTsKICByZXR1cm4hMAp9Owp0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyLnByb3RvdHlwZS5jYWxjdWxhdGVSZWNvcmRUaW1lXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhUHJvYmxlbVJlY29yZGVyJCRjYWxjdWxhdGVSZWNvcmRUaW1lXyQoZWNobywgYXVkaW8sIHZpZGVvLCBzZW50LCByZWNlaXZlZCkgewogIHZhciBiaXRyYXRlID0gMDsKICBlY2hvICYmIChiaXRyYXRlICs9IHRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIuRUNIT19CSVRSQVRFXyk7CiAgYXVkaW8gJiYgcmVjZWl2ZWQgJiYgKGJpdHJhdGUgKz0gdGFsay5tZWRpYS5NZWRpYVByb2JsZW1SZWNvcmRlci5JTkNPTUlOR19BVURJT19CSVRSQVRFXyk7CiAgYXVkaW8gJiYgc2VudCAmJiAoYml0cmF0ZSArPSB0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyLk9VVEdPSU5HX0FVRElPX0JJVFJBVEVfKTsKICB2aWRlbyAmJiByZWNlaXZlZCAmJiAoYml0cmF0ZSArPSB0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyLklOQ09NSU5HX1ZJREVPX0JJVFJBVEVfKTsKICB2aWRlbyAmJiBzZW50ICYmIChiaXRyYXRlICs9IHRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIuT1VUR09JTkdfVklERU9fQklUUkFURV8pOwogIHZhciBkdXJhdGlvbk1zID0gMDsKICBpZigwIDwgYml0cmF0ZSkgewogICAgdmFyIG1zID0gMUUzICogKHRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIuTUFYX1JFQ09SRF9TSVpFXyAvIGJpdHJhdGUpLCBkdXJhdGlvbk1zID0gTWF0aC5taW4odGFsay5tZWRpYS5NZWRpYVByb2JsZW1SZWNvcmRlci5NQVhfUkVDT1JEX01JTExJU0VDT05EU18sIG1zKQogIH0KICByZXR1cm4gZHVyYXRpb25Ncwp9Owp0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyLnByb3RvdHlwZS5nZXRSZWNvcmREdXJhdGlvbk1zID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkTWVkaWFQcm9ibGVtUmVjb3JkZXIkJGdldFJlY29yZER1cmF0aW9uTXMkKCkgewogIHJldHVybiB0aGlzLnJlY29yZER1cmF0aW9uTXNfCn07CnRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIucHJvdG90eXBlLmNhblJlY29yZCA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJE1lZGlhUHJvYmxlbVJlY29yZGVyJCRjYW5SZWNvcmQkKGNhbGwpIHsKICBpZighY2FsbCkgewogICAgcmV0dXJuIHRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIubG9nZ2VyXy53YXJuaW5nKCJjYWxsIHdhcyBudWxsIiksICExCiAgfQogIGlmKCFjYWxsLmlzTXVsdGl3YXkoKSkgewogICAgcmV0dXJuIHRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIubG9nZ2VyXy53YXJuaW5nKCJjYW5ub3QgcmVjb3JkIG1lZGlhIG9uIGEgMToxIGNhbGwiKSwgITEKICB9CiAgaWYodGhpcy5mb3JjZUVuYWJsZV8pIHsKICAgIHJldHVybiB0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyLmxvZ2dlcl8ud2FybmluZygiU2tpcHBpbmcgYWxwaGEgcm9vbSBjaGVjazsgZm9yY2VFbmFibGUgPSB0cnVlIiksICEwCiAgfQogIGlmKDEgIT0gY2FsbC5yZW1vdGVKaWRzLmxlbmd0aCkgewogICAgcmV0dXJuIHRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIubG9nZ2VyXy53YXJuaW5nKCJyZW1vdGVKaWRzLmxlbmd0aCAhPSAxOiAiICsgY2FsbC5yZW1vdGVKaWRzLmpvaW4oIiwgIikpLCAhMQogIH0KICB2YXIgcmVtb3RlSmlkID0gY2FsbC5yZW1vdGVKaWRzWzBdOwogIHJldHVybiFhcHBzLmNoYXQuY29yZS5KaWQuSXNSb29tSmlkKHJlbW90ZUppZCkgfHwgMCAhPSByZW1vdGVKaWQuaW5kZXhPZigibXV2Yy1wcml2YXRlLWNoYXQtMDAwMCIpID8gKHRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIubG9nZ2VyXy53YXJuaW5nKCJyZW1vdGVKaWQgaXMgbm90IGFuIGFscGhhIE1VQzogIiArIHJlbW90ZUppZCksICExKSA6ICEwCn07CnRhbGsubWVkaWEuTWVkaWFQcm9ibGVtUmVjb3JkZXIucHJvdG90eXBlLnN0b3BSZWNvcmRpbmcgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRNZWRpYVByb2JsZW1SZWNvcmRlciQkc3RvcFJlY29yZGluZyQoKSB7CiAgaWYoIXRoaXMuY3VycmVudENhbGxfKSB7CiAgICByZXR1cm4hMQogIH0KICB0aGlzLmNhbGxNYW5hZ2VyXy5zZW5kRmx1dGVNc2coZ29vZy5qc29uLnNlcmlhbGl6ZShbImRlYnVnIiwgdGhpcy5jdXJyZW50Q2FsbF8ucmVtb3RlSmlkc1swXSwgdGhpcy5jdXJyZW50Q2FsbF8uc2Vzc2lvbklkLCAicmVjb3JkIiwge3R5cGU6IiIsIGRpcmVjdGlvbjoiIn1dKSk7CiAgdGhpcy5jdXJyZW50Q2FsbF8gPSBudWxsOwogIHRoaXMucmVjb3JkRHVyYXRpb25Nc18gPSAwOwogIHJldHVybiEwCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweVRlbXBsYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweVRlbXBsYXRlJChvcHRfZGF0YSwgb3B0X3NiKSB7CiAgdmFyIG91dHB1dCA9IG9wdF9zYiB8fCBuZXcgc295LlN0cmluZ0J1aWxkZXI7CiAgb3V0cHV0LmFwcGVuZCgnPGRpdiBpZD0ic3BsaXR0ZXIiIGNsYXNzPSInLCAiZ29vZy1zcGxpdHBhbmUiLCAnIj48ZGl2IGNsYXNzPSInLCAiZ29vZy1zcGxpdHBhbmUtZmlyc3QtY29udGFpbmVyIiwgJyIgc3R5bGU9ImJvcmRlci13aWR0aDogMHB4OyBvdmVyZmxvdzogYXV0bzsgcG9zaXRpb246IGFic29sdXRlOyI+PGRpdiBpZD0idG9vbHMiPjxzcGFuIGlkPSJoZWxwbGluayI+PGEgaHJlZj0iaHR0cDovL2dvdG8uZ29vZ2xlLmNvbS90YWxrcGx1Z2lubG9nIiB0YXJnZXQ9X2JsYW5rPjxiPkhlbHAhPC9iPjwvYT4gKFdoYXQgZG9lcyBhbGwgdGhpcyBtZWFuPyk8L3NwYW4+PGJyLz48c3BhbiBpZD0idXBsb2FkbG9nIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsgY3Vyc29yOnBvaW50ZXI7IGNvbG9yOmJsdWU7Ij5VcGxvYWQgVGFsayBQbHVnaW4gTG9nPC9zcGFuPjxici8+PGRpdiBzdHlsZT0iZmxvYXQ6Y2xlYXI7Ij48c3BhbiBpZD0ic2ltdWxhdGVtZXNzYWdlX3ppcHB5IiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsgY3Vyc29yOnBvaW50ZXI7IGNvbG9yOmJsdWU7Ij5TaW11bGF0ZSBhIFRhbGtQbHVnaW4gTWVzc2FnZTwvc3Bhbj48YnIvPjxkaXYgaWQ9InNpbXVsYXRlbWVzc2FnZSIgc3R5bGU9ImZvbnQtc2l6ZToxNHB4OyI+PGRpdiBzdHlsZT0ibWFyZ2luOi41ZW07Ij48bGFiZWwgZm9yPSJmbHV0ZW1zZ3R5cGUiPicsIAogICJUeXBlIiwgJzwvbGFiZWw+PHRleHRhcmVhIGlkPSJmbHV0ZW1zZ3R5cGUiIG5hbWU9ImZsdXRlbXNndHlwZSIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IGhlaWdodDogM2VtOyB3aWR0aDogMTAlOyI+PC90ZXh0YXJlYT48L2Rpdj48ZGl2IHN0eWxlPSJtYXJnaW46LjVlbTsiPjxsYWJlbCBmb3I9ImZsdXRlbXNnYm9keSI+JywgIk1lc3NhZ2UiLCAnPC9sYWJlbD48dGV4dGFyZWEgaWQ9ImZsdXRlbXNnYm9keSIgbmFtZT0iZmx1dGVtc2dib2R5IiBzdHlsZT0iZGlzcGxheTpibG9jazsgaGVpZ2h0OiAzZW07IHdpZHRoOiA1MCU7Ij48L3RleHRhcmVhPjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbjouNWVtOyI+PGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImdlbmVyYXRlZXZlbnQiIG5hbWU9ImdlbmVyYXRlZXZlbnQiIHZhbHVlPSJTaW11bGF0ZSIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IGZvbnQtc2l6ZToxNXB4OyI+PC9pbnB1dD48L2Rpdj48L2Rpdj48L2Rpdj48c3BhbiBpZD0idG9nZ2xlYXVkaW9sb2dnaW5nIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsgY3Vyc29yOnBvaW50ZXI7IGNvbG9yOmJsdWU7Ij5Ub2dnbGUgR1RQIERldGFpbGVkIEF1ZGlvIExvZ2dpbmc8L3NwYW4+IEN1cnJlbnQ6PHNwYW4gaWQ9ImF1ZGlvbG9nbGV2ZWwiIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPkxTX1dBUk5JTkc8L3NwYW4+PGJyLz48c3BhbiBpZD0idG9nZ2xldmlkZW9sb2dnaW5nIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsgY3Vyc29yOnBvaW50ZXI7IGNvbG9yOmJsdWU7Ij5Ub2dnbGUgR1RQIERldGFpbGVkIFZpZGVvIExvZ2dpbmc8L3NwYW4+IEN1cnJlbnQ6PHNwYW4gaWQ9InZpZGVvbG9nbGV2ZWwiIHN0eWxlPSJmb250LXNpemU6IHNtYWxsZXIiPkxTX1dBUk5JTkc8L3NwYW4+PGJyLz48c3BhbiBpZD0ic3RhcnRyZWNvcmQiIHN0eWxlPSInLCAKICBvcHRfZGF0YS5zaG93UmVjb3JkTGluayA/ICJ0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyBjdXJzb3I6cG9pbnRlcjsgY29sb3I6Ymx1ZTsiIDogImNvbG9yOmdyYXk7IiwgJyI+U3RhcnQgUmVjb3JkPC9zcGFuPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InJlY29yZGVjaG8iIGNoZWNrZWQ+IDxsYWJlbCBmb3I9InJlY29yZGVjaG8iPiBFY2hvIDwvbGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icmVjb3JkYXVkaW8iIGNoZWNrZWQ+IDxsYWJlbCBmb3I9InJlY29yZGF1ZGlvIj4gQXVkaW8gPC9sYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJyZWNvcmR2aWRlbyIgY2hlY2tlZD4gPGxhYmVsIGZvcj0icmVjb3JkdmlkZW8iPiBWaWRlbyA8L2xhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InJlY29yZGluY29taW5nIiBjaGVja2VkPiA8bGFiZWwgZm9yPSJyZWNvcmRpbmNvbWluZyI+IEluY29taW5nIDwvbGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icmVjb3Jkb3V0Z29pbmciIGNoZWNrZWQ+IDxsYWJlbCBmb3I9InJlY29yZG91dGdvaW5nIj4gT3V0Z29pbmcgPC9sYWJlbD48L2Rpdj48aHI+PGgzIGlkPSJncmFwaF96aXBweSI+R3JhcGhzIC0gPHNwYW4gc3R5bGU9InRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IGN1cnNvcjpwb2ludGVyOyBjb2xvcjpibHVlOyI+ZXhwYW5kL2NvbGxhcHNlPC9zcGFuPjwvaDM+PGRpdiBpZD0iZ3JhcGhkYXNoYm9hcmQiPjwvZGl2Pjxocj48aDMgaWQ9ImRhc2hib2FyZF96aXBweSI+Q2FsbCBJbmZvIC0gPHNwYW4gc3R5bGU9InRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IGN1cnNvcjpwb2ludGVyOyBjb2xvcjpibHVlOyI+ZXhwYW5kL2NvbGxhcHNlPC9zcGFuPjwvaDM+PGRpdiBpZD0iZGFzaGJvYXJkIj48L2Rpdj48aHI+PGgzIGlkPSJpc3N1ZV96aXBweSInLCAKICAhb3B0X2RhdGEuc2hvd0lzc3VlcyA/ICcgc3R5bGU9ImRpc3BsYXk6bm9uZSInIDogIiIsICc+SXNzdWVzIC0gPHNwYW4gc3R5bGU9InRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IGN1cnNvcjpwb2ludGVyOyBjb2xvcjpibHVlOyI+ZXhwYW5kL2NvbGxhcHNlPC9zcGFuPjwvaDM+PGRpdiBpZD0iaXNzdWVkYXNoYm9hcmQiJywgIW9wdF9kYXRhLnNob3dJc3N1ZXMgPyAnIHN0eWxlPSJkaXNwbGF5Om5vbmUiJyA6ICIiLCAnPjwvZGl2PjwvZGl2PjxkaXYgaWQ9ImxvZyIgY2xhc3M9IicsICJnb29nLXNwbGl0cGFuZS1zZWNvbmQtY29udGFpbmVyIiwgJyIgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBvdmVyZmxvdzogYXV0bzsgcG9zaXRpb246IGFic29sdXRlOyI+PC9kaXY+PGRpdiBjbGFzcz0iJywgImdvb2ctc3BsaXRwYW5lLWhhbmRsZSIsICciIHN0eWxlPSJiYWNrZ3JvdW5kOiAjY2NjOyBjdXJzb3I6IHJvdy1yZXNpemU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsiPjwvZGl2PjwvZGl2PicpOwogIHJldHVybiBvcHRfc2IgPyAiIiA6IG91dHB1dC50b1N0cmluZygpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpbkxvZ1RlbXBsYXRlID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpbkxvZ1RlbXBsYXRlJChvcHRfZGF0YSwgb3B0X3NiKSB7CiAgdmFyIG91dHB1dCA9IG9wdF9zYiB8fCBuZXcgc295LlN0cmluZ0J1aWxkZXI7CiAgb3V0cHV0LmFwcGVuZCgnPGRpdiBjbGFzcz0ibG9nbXNnICcsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuZm9ybWF0KSwgJyI+PHNwYW4gY2xhc3M9Imx0cyI+WycsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEudGltZSksICdzXTwvc3Bhbj48c3BhbiBjbGFzcz0ibHR5cGUgJywgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5kaXIpLCAnIj4nLCBzb3kuJCRlc2NhcGVIdG1sKG9wdF9kYXRhLnR5cGUpLCAnPC9zcGFuPjxzcGFuIGNsYXNzPSJsYm9keSBkYmctJywgc295LiQkZXNjYXBlSHRtbChvcHRfZGF0YS5sZXZlbCksICciPicsIHNveS4kJGVzY2FwZUh0bWwob3B0X2RhdGEuYm9keSksICI8L3NwYW4+PC9kaXY+Iik7CiAgcmV0dXJuIG9wdF9zYiA/ICIiIDogb3V0cHV0LnRvU3RyaW5nKCkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQob3B0X2NhbGxNYW5hZ2VyLCBvcHRfZXZlbnRzLCBvcHRfb3BlbldpbmRvdywgb3B0X3dpbmRvd1RpdGxlLCBvcHRfZm9yY2VFbmFibGVNZWRpYVJlY29yZGVyLCBvcHRfYXBwQ29udGV4dCwgb3B0X21lZGlhSW5mb0hhbmRsZXIpIHsKICB0aGlzLmNhbGxNYW5hZ2VyXyA9IG9wdF9jYWxsTWFuYWdlcjsKICB0aGlzLndpbmRvd1RpdGxlXyA9ICJWb2ljZSBhbmQgVmlkZW8gU3RhdHMiOwogIGdvb2cuaXNEZWZBbmROb3ROdWxsKG9wdF93aW5kb3dUaXRsZSkgJiYgKHRoaXMud2luZG93VGl0bGVfID0gb3B0X3dpbmRvd1RpdGxlKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8gPSBuZXcgZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyKHRoaXMpOwogIHRoaXMuZXZlbnRzXyA9IG5ldyBnb29nLnN0cnVjdHMuQ2lyY3VsYXJCdWZmZXIoMUUzKTsKICB0aGlzLmZpcnN0RXZlbnRUaW1lXyA9IDA7CiAgdGhpcy5saXN0ZW5lZEVuZHBvaW50c18gPSBbXTsKICB2YXIgZXZlbnRzVG9MaXN0ZW4gPSBbdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuTUVTU0FHRSwgdGFsay5tZWRpYS5UYWxrUGx1Z2luRXZlbnQuT1VUR09JTkdfTUVTU0FHRSwgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5JTkNPTUlOR19KSU5HTEUsIHRhbGsubWVkaWEuQ2FsbE1hbmFnZXIuRXZlbnQuT1VUR09JTkdfSklOR0xFXTsKICB0aGlzLmNhbGxNYW5hZ2VyXyAmJiAodGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLmNhbGxNYW5hZ2VyXywgZXZlbnRzVG9MaXN0ZW4sIHRoaXMuaGFuZGxlRXZlbnRfKSwgdGhpcy5tZWRpYVJlY29yZGVyXyA9IG5ldyB0YWxrLm1lZGlhLk1lZGlhUHJvYmxlbVJlY29yZGVyKHRoaXMuY2FsbE1hbmFnZXJfLCBvcHRfZm9yY2VFbmFibGVNZWRpYVJlY29yZGVyKSk7CiAgdGhpcy5pc3N1ZU1hbmFnZXJfID0gbnVsbDsKICBnb29nLmlzRGVmQW5kTm90TnVsbChvcHRfYXBwQ29udGV4dCkgJiYgKHRoaXMuaXNzdWVNYW5hZ2VyXyA9IHRhbGsubWVkaWEucXVhbGl0eS5Jc3N1ZU1hbmFnZXIuZ2V0KG9wdF9hcHBDb250ZXh0KSwgZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5pc3N1ZU1hbmFnZXJfKSAmJiB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuaXNzdWVNYW5hZ2VyXywgdGFsay5tZWRpYS5xdWFsaXR5Lklzc3VlTWFuYWdlci5FdmVudC5JU1NVRVNfQ0hBTkdFRCwgdGhpcy5oYW5kbGVJc3N1ZUV2ZW50XykpOwogIHRoaXMubGlzdGVuRm9yTWVkaWFJbmZvRXZlbnRzXyA9ICExOwogIGdvb2cuaXNEZWZBbmROb3ROdWxsKG9wdF9tZWRpYUluZm9IYW5kbGVyKSAmJiAodGhpcy5ldmVudEhhbmRsZXJfLmxpc3RlbihvcHRfbWVkaWFJbmZvSGFuZGxlciwgdGFsay5tZWRpYS5NZWRpYUluZm8uRXZlbnRzLk1FRElBX0lORk8sIHRoaXMuaGFuZGxlRXZlbnRfKSwgdGhpcy5saXN0ZW5Gb3JNZWRpYUluZm9FdmVudHNfID0gITApOwogIGlmKG9wdF9ldmVudHMpIHsKICAgIGZvcih2YXIgaSA9IDA7aSA8IG9wdF9ldmVudHMubGVuZ3RoO2krKykgewogICAgICB0aGlzLmV2ZW50c18uYWRkKFtvcHRfZXZlbnRzW2ldLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkuZ2V0VGltZXN0YW1wXyhvcHRfZXZlbnRzW2ldKV0pCiAgICB9CiAgfQogIHRoaXMuZG9tSGVscGVyXyA9IGdvb2cuZG9tLmdldERvbUhlbHBlcigpOwogIHRoaXMuY29va2llXyA9IG5ldyBnb29nLm5ldC5Db29raWVzKHRoaXMuZG9tSGVscGVyXy5nZXREb2N1bWVudCgpKTsKICBvcHRfb3BlbldpbmRvdyAmJiB0aGlzLm9wZW5XaW5kb3coKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkubG9nZ2VyXyA9IGdvb2cuZGVidWcuTG9nZ2VyLmdldExvZ2dlcigidGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5Iik7CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5TUExJVF9QQU5FX1BBRERJTkdfID0gMTg7CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5TUExJVF9QQU5FX0hBTkRMRV9TSVpFXyA9IDM7CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5XSU5ET1dfSEVJR0hUXyA9IDcyMDsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LldJTkRPV19XSURUSF8gPSAxMjgwOwp0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkuVEFMS19QTFVHSU5fU1BZX0FDVElWRV8gPSAiVFBTQSI7CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luU3B5JCRpc0FjdGl2ZSQoKSB7CiAgcmV0dXJuIGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMuY29va2llXy5nZXQodGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LlRBTEtfUExVR0lOX1NQWV9BQ1RJVkVfKSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5vcGVuV2luZG93ID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkb3BlbldpbmRvdyQoKSB7CiAgaWYodGhpcy5kZWJ1Z1dpbmRvd18gJiYgIXRoaXMuZGVidWdXaW5kb3dfLmNsb3NlZCkgewogICAgcmV0dXJuIHRoaXMuZGVidWdXaW5kb3dfLmZvY3VzKCksICEwCiAgfQogIHZhciB3aW5kb3dVcmwgPSAiIjsKICBnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkNIUk9NRSAmJiAod2luZG93VXJsID0gImFib3V0OmJsYW5rIik7CiAgdGhpcy5kZWJ1Z1dpbmRvd18gPSB0aGlzLm9wZW5EZWJ1Z1dpbmRvd18od2luZG93VXJsKTsKICBpZighdGhpcy5kZWJ1Z1dpbmRvd18pIHsKICAgIHJldHVybiExCiAgfQogIHRoaXMuY29va2llXy5zZXQodGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LlRBTEtfUExVR0lOX1NQWV9BQ1RJVkVfLCAidHJ1ZSIsIC0xLCAiLyIpOwogIGdvb2cuZXZlbnRzLmxpc3Rlbih0aGlzLmRlYnVnV2luZG93XywgImJlZm9yZXVubG9hZCIsIHRoaXMuaGFuZGxlVW5sb2FkXy5iaW5kKHRoaXMpLCAhMCk7CiAgdGhpcy5yZW5kZXJQbHVnaW5TcHlfKCk7CiAgcmV0dXJuITAKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5oYW5kbGVVbmxvYWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkaGFuZGxlVW5sb2FkXyQoKSB7CiAgdGhpcy5jb29raWVfLnJlbW92ZSh0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkuVEFMS19QTFVHSU5fU1BZX0FDVElWRV8sICIvIikKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5vcGVuRGVidWdXaW5kb3dfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkb3BlbkRlYnVnV2luZG93XyQod2luZG93VXJsKSB7CiAgcmV0dXJuIHdpbmRvdy5vcGVuKHdpbmRvd1VybCwgIiIsICJtZW51YmFyPW5vLHRvb2xiYXI9bm8scmVzaXphYmxlPXllcyxzY3JvbGxiYXJzPW5vLGhlaWdodD0iICsgdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LldJTkRPV19IRUlHSFRfICsgIix3aWR0aD0iICsgdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LldJTkRPV19XSURUSF8pCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUuZ2V0Um9vdF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luU3B5JCRnZXRSb290XyQoKSB7CiAgcmV0dXJuIHRoaXMuZGVidWdXaW5kb3dfLmRvY3VtZW50LmJvZHkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5yZW5kZXJQbHVnaW5TcHlfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkcmVuZGVyUGx1Z2luU3B5XyQoKSB7CiAgaWYoIXRoaXMuZGVidWdXaW5kb3dfLmRvY3VtZW50LmJvZHkgfHwgMCA9PSB0aGlzLmRlYnVnV2luZG93Xy5kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoKSB7CiAgICBzZXRUaW1lb3V0KHRoaXMucmVuZGVyUGx1Z2luU3B5Xy5iaW5kKHRoaXMpLCAxMDApCiAgfWVsc2UgewogICAgdGhpcy5kZWJ1Z1dpbmRvd18uZG9jdW1lbnQudGl0bGUgPSB0aGlzLndpbmRvd1RpdGxlXzsKICAgIHZhciByb290ID0gdGhpcy5nZXRSb290XygpOwogICAgcm9vdC5pbm5lckhUTUwgPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHlUZW1wbGF0ZSh7c2hvd1JlY29yZExpbms6dGhpcy5pc01lZGlhUmVjb3JkaW5nRW5hYmxlZF8oKSwgc2hvd0lzc3Vlczp0aGlzLnNob3dJc3N1ZURhc2hib2FyZF8oKX0pOwogICAgdGhpcy5kb21fID0gZ29vZy5kb20uZ2V0RG9tSGVscGVyKHJvb3QpOwogICAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLmRvbV8uZ2V0RWxlbWVudCgidXBsb2FkbG9nIiksIGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5DTElDSywgdGhpcy5vblVwbG9hZExvZ0NsaWNrXyk7CiAgICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuZG9tXy5nZXRFbGVtZW50KCJ0b2dnbGVhdWRpb2xvZ2dpbmciKSwgZ29vZy5ldmVudHMuRXZlbnRUeXBlLkNMSUNLLCB0aGlzLm9uVG9nZ2xlQXVkaW9Mb2dnaW5nQ2xpY2tfKTsKICAgIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5kb21fLmdldEVsZW1lbnQoInRvZ2dsZXZpZGVvbG9nZ2luZyIpLCBnb29nLmV2ZW50cy5FdmVudFR5cGUuQ0xJQ0ssIHRoaXMub25Ub2dnbGVWaWRlb0xvZ2dpbmdDbGlja18pOwogICAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLmRvbV8uZ2V0RWxlbWVudCgic3RhcnRyZWNvcmQiKSwgZ29vZy5ldmVudHMuRXZlbnRUeXBlLkNMSUNLLCB0aGlzLm9uUmVjb3JkTWVkaWFDbGlja18pOwogICAgdGhpcy5zcGxpdHBhbmVfID0gbmV3IGdvb2cudWkuU3BsaXRQYW5lKG5ldyBnb29nLnVpLkNvbXBvbmVudCh0aGlzLmRvbV8pLCBuZXcgZ29vZy51aS5Db21wb25lbnQodGhpcy5kb21fKSwgZ29vZy51aS5TcGxpdFBhbmUuT3JpZW50YXRpb24uVkVSVElDQUwsIHRoaXMuZG9tXyk7CiAgICB2YXIgd2lkdGggPSB0aGlzLmRlYnVnV2luZG93Xy5kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIC0gdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LlNQTElUX1BBTkVfUEFERElOR18sIGhlaWdodCA9IHRoaXMuZGVidWdXaW5kb3dfLmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IC0gdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LlNQTElUX1BBTkVfUEFERElOR187CiAgICB0aGlzLnNwbGl0cGFuZV8uc2V0SW5pdGlhbFNpemUoaGVpZ2h0IC0gMTAwKTsKICAgIHRoaXMuc3BsaXRwYW5lXy5zZXRIYW5kbGVTaXplKHRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5TUExJVF9QQU5FX0hBTkRMRV9TSVpFXyk7CiAgICB0aGlzLnNwbGl0cGFuZV8uZGVjb3JhdGUodGhpcy5kb21fLmdldEVsZW1lbnQoInNwbGl0dGVyIikpOwogICAgdGhpcy5zcGxpdHBhbmVfLnNldFNpemUobmV3IGdvb2cubWF0aC5TaXplKHdpZHRoLCBoZWlnaHQpKTsKICAgIHRoaXMubG9nZ2luZ0Rpdl8gPSB0aGlzLmRvbV8uZ2V0RWxlbWVudCgibG9nIik7CiAgICB0aGlzLmluc3RhbGxMb2dnaW5nU3R5bGVzXyh0aGlzLmxvZ2dpbmdEaXZfKTsKICAgIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5kZWJ1Z1dpbmRvd18sIGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5SRVNJWkUsIHRoaXMucmVzaXplUGFuZV8sICExLCB0aGlzKTsKICAgIHRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5sb2dnZXJfLmluZm8oIlJlbmRlcmluZyAiICsgdGhpcy5ldmVudHNfLmdldENvdW50KCkgKyAiIHByaW9yIGV2ZW50cyIpOwogICAgdGhpcy5yZXNldERhc2hib2FyZHNfKCk7CiAgICB0aGlzLmVuc3VyZVNpbXVsYXRlTWVzc2FnZVJlYWR5XygpOwogICAgZm9yKHZhciByZW5kZXJlZEh0bWwgPSBuZXcgZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyLCBpID0gMDtpIDwgdGhpcy5ldmVudHNfLmdldENvdW50KCk7aSsrKSB7CiAgICAgIHZhciBldmVudHMgPSB0aGlzLmV2ZW50c18uZ2V0KGkpOwogICAgICB0aGlzLnJlbmRlckV2ZW50XyhyZW5kZXJlZEh0bWwsIGV2ZW50c1swXSwgZXZlbnRzWzFdKQogICAgfQogICAgdGhpcy5ncmFwaERhc2hib2FyZF8udXBkYXRlR3JhcGhzKCk7CiAgICB0aGlzLmxvZ2dpbmdEaXZfLmlubmVySFRNTCA9IHJlbmRlcmVkSHRtbC50b1N0cmluZygpCiAgfQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkucHJvdG90eXBlLmluc3RhbGxMb2dnaW5nU3R5bGVzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJGluc3RhbGxMb2dnaW5nU3R5bGVzXyQoZWxlbWVudCkgewogIGdvb2cuc3R5bGUuaW5zdGFsbFN0eWxlcygnLmxib2R5e3BhZGRpbmctbGVmdDoycHh9LmRiZy1pe2NvbG9yOiM0NDR9LmxvZ21zZ3tib3JkZXItYm90dG9tOjFweCBzb2xpZCAjQ0NDO3BhZGRpbmc6MnB4fS5sb2dzZXB7YmFja2dyb3VuZC1jb2xvcjogIzhDODt9I2xvZ3tib3JkZXI6MXB4IHNvbGlkICNDQ0M7YmFja2dyb3VuZC1jb2xvcjojRkNGQ0ZDO2ZvbnQ6bm9ybWFsIG5vcm1hbCBub3JtYWwgMTNweCBtb25vc3BhY2V9Lmx0eXBle2Zsb2F0OmxlZnQ7dGV4dC1hbGlnbjpsZWZ0O3dpZHRoOjRlbTtwYWRkaW5nOjAgMnB4IDAgMnB4O2JvcmRlci1yaWdodDoxcHggc29saWQgI0NDQ30ubGluOmFmdGVye2NvbnRlbnQ6Ii1pbiJ9LmxvdXQ6YWZ0ZXJ7Y29udGVudDoiLW91dCJ9Lmx0c3tmbG9hdDpsZWZ0O3RleHQtYWxpZ246cmlnaHQ7d2lkdGg6N2VtO3BhZGRpbmctcmlnaHQ6MnB4O2JvcmRlci1yaWdodDoxcHggc29saWQgI0NDQ30ubG1pe3doaXRlLXNwYWNlOnByZTtiYWNrZ3JvdW5kLWNvbG9yOiNFRUZ9JywgCiAgZWxlbWVudCkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5hZGRUb0xvZ18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luU3B5JCRhZGRUb0xvZ18kKHMpIHsKICB2YXIgZXZlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgZXZlbnRFbGVtZW50LmlubmVySFRNTCA9IHM7CiAgdGhpcy5sb2dnaW5nRGl2Xy5hcHBlbmRDaGlsZChldmVudEVsZW1lbnQpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUucmVjb3JkRGlhZ25vc3RpYyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJHJlY29yZERpYWdub3N0aWMkKHRleHQpIHsKICB2YXIgZSA9IG5ldyBnb29nLmV2ZW50cy5FdmVudCgiZGlhZyIpOwogIGUudGV4dCA9IHRleHQ7CiAgdGhpcy5oYW5kbGVFdmVudF8oZSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5lbnN1cmVTaW11bGF0ZU1lc3NhZ2VSZWFkeV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luU3B5JCRlbnN1cmVTaW11bGF0ZU1lc3NhZ2VSZWFkeV8kKCkgewogIHRoaXMud2FybmluZ1NpbXVsYXRvclppcHB5XyA9IG5ldyBnb29nLnVpLlppcHB5KCJzaW11bGF0ZW1lc3NhZ2VfemlwcHkiLCAic2ltdWxhdGVtZXNzYWdlIiwgITEsIG51bGwsIHRoaXMuZG9tXyk7CiAgdGhpcy5mbHV0ZU1zZ1R5cGVfID0gdGhpcy5kb21fLmdldEVsZW1lbnQoImZsdXRlbXNndHlwZSIpOwogIHRoaXMuZmx1dGVNc2dCb2R5XyA9IHRoaXMuZG9tXy5nZXRFbGVtZW50KCJmbHV0ZW1zZ2JvZHkiKTsKICAodGhpcy5zaW11bGF0ZUJ1dHRvbl8gPSB0aGlzLmRvbV8uZ2V0RWxlbWVudCgiZ2VuZXJhdGVldmVudCIpKSAmJiB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuc2ltdWxhdGVCdXR0b25fLCBnb29nLmV2ZW50cy5FdmVudFR5cGUuQ0xJQ0ssIHRoaXMuc2ltdWxhdGVQbHVnaW5NZXNzYWdlXyk7CiAgdGhpcy5mbHV0ZU1zZ1R5cGVfICYmICh0aGlzLmZsdXRlTXNnVHlwZV8udmFsdWUgPSAidHJzdGF0ZSIpOwogIHRoaXMuZmx1dGVNc2dCb2R5XyAmJiAodGhpcy5mbHV0ZU1zZ0JvZHlfLnZhbHVlID0gZ29vZy5qc29uLnNlcmlhbGl6ZSh7YW55V3JpdGFibGU6ITAsIGFsbFdyaXRhYmxlOiEwLCBhbnlUY3A6ITEsIGFueVJlbGF5OiExLCBzbW9vdGhlZEJXUmVjdjoxRTUsIHNtb290aGVkQldTZW5kOjFFNH0pKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkucHJvdG90eXBlLnNpbXVsYXRlUGx1Z2luTWVzc2FnZV8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luU3B5JCRzaW11bGF0ZVBsdWdpbk1lc3NhZ2VfJCgpIHsKICBpZih0aGlzLmNhbGxNYW5hZ2VyXy5nZXRBY3RpdmVDYWxsKCkgJiYgdGhpcy5mbHV0ZU1zZ1R5cGVfICYmIDAgPCB0aGlzLmZsdXRlTXNnVHlwZV8udmFsdWUubGVuZ3RoICYmIHRoaXMuZmx1dGVNc2dCb2R5XyAmJiAwIDwgdGhpcy5mbHV0ZU1zZ0JvZHlfLnZhbHVlLmxlbmd0aCkgewogICAgdmFyIGZsdXRlTXNnID0gW107CiAgICBmbHV0ZU1zZ1swXSA9IHRoaXMuZmx1dGVNc2dUeXBlXy52YWx1ZTsKICAgIGZsdXRlTXNnWzFdID0gdGhpcy5jYWxsTWFuYWdlcl8uZ2V0QWN0aXZlQ2FsbCgpLnJlbW90ZUppZHNbMF07CiAgICBmbHV0ZU1zZ1syXSA9IHRoaXMuY2FsbE1hbmFnZXJfLmdldEFjdGl2ZUNhbGwoKS5zZXNzaW9uSWQ7CiAgICBmbHV0ZU1zZ1szXSA9IGdvb2cuanNvbi5wYXJzZSh0aGlzLmZsdXRlTXNnQm9keV8udmFsdWUpOwogICAgdmFyIHRhbGtwbHVnaW4gPSB0aGlzLmNhbGxNYW5hZ2VyXy5nZXRUYWxrUGx1Z2luKCk7CiAgICB0YWxrcGx1Z2luLmRpc3BhdGNoRXZlbnQobmV3IHRhbGsubWVkaWEuQ2FsbEV2ZW50KHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50Lk1FU1NBR0UsIGdvb2cuanNvbi5zZXJpYWxpemUoZmx1dGVNc2cpKSkKICB9Cn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUub25VcGxvYWRMb2dDbGlja18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luU3B5JCRvblVwbG9hZExvZ0NsaWNrXyQoKSB7CiAgdmFyIHBsdWdpbiA9IHRoaXMuY2FsbE1hbmFnZXJfLmdldFRhbGtQbHVnaW4oKSwgYWN0aXZlQ2FsbCA9IHRoaXMuY2FsbE1hbmFnZXJfLmdldEFjdGl2ZUNhbGwoKTsKICBwbHVnaW4gJiYgYWN0aXZlQ2FsbCA/ICh0aGlzLmNhbGxNYW5hZ2VyXy5kb1VwbG9hZExvZyhhY3RpdmVDYWxsLnNlc3Npb25JZCwgcGx1Z2luLmdldExvY2FsSmlkKCkpLCB3aW5kb3cuYWxlcnQoIkxvZyB1cGxvYWQgcmVxdWVzdCBzZW50IHRvIEdvb2dsZSBUYWxrIFBsdWdpbi4iKSkgOiB3aW5kb3cuYWxlcnQoIlVwbG9hZCBsb2cgZmFpbGVkLiBFbnN1cmUgdGhlcmUgaXMgYW4gYWN0aXZlIGNhbGwuIikKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5vblRvZ2dsZUF1ZGlvTG9nZ2luZ0NsaWNrXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJG9uVG9nZ2xlQXVkaW9Mb2dnaW5nQ2xpY2tfJCgpIHsKICBpZihnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmNhbGxNYW5hZ2VyXykpIHsKICAgIHZhciBsb2dMZXZlbCA9IHRoaXMuY2FsbE1hbmFnZXJfLnRvZ2dsZURldGFpbGVkTG9nZ2luZyh0YWxrLm1lZGlhLk1lZGlhVHlwZS5BVURJTyk7CiAgICB0aGlzLmRvbV8uZ2V0RWxlbWVudCgiYXVkaW9sb2dsZXZlbCIpLmlubmVySFRNTCA9IGxvZ0xldmVsCiAgfQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkucHJvdG90eXBlLm9uVG9nZ2xlVmlkZW9Mb2dnaW5nQ2xpY2tfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkb25Ub2dnbGVWaWRlb0xvZ2dpbmdDbGlja18kKCkgewogIGlmKGdvb2cuaXNEZWZBbmROb3ROdWxsKHRoaXMuY2FsbE1hbmFnZXJfKSkgewogICAgdmFyIGxvZ0xldmVsID0gdGhpcy5jYWxsTWFuYWdlcl8udG9nZ2xlRGV0YWlsZWRMb2dnaW5nKHRhbGsubWVkaWEuTWVkaWFUeXBlLlZJREVPKTsKICAgIHRoaXMuZG9tXy5nZXRFbGVtZW50KCJ2aWRlb2xvZ2xldmVsIikuaW5uZXJIVE1MID0gbG9nTGV2ZWwKICB9Cn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUub25SZWNvcmRNZWRpYUNsaWNrXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJG9uUmVjb3JkTWVkaWFDbGlja18kKCkgewogIGlmKHRoaXMuaXNNZWRpYVJlY29yZGluZ0VuYWJsZWRfKCkpIHsKICAgIGlmKHRoaXMubWVkaWFSZWNvcmRlcl8uc3RhcnRSZWNvcmRpbmcodGhpcy5jYWxsTWFuYWdlcl8uZ2V0QWN0aXZlQ2FsbCgpLCAhMCA9PSB0aGlzLmRvbV8uZ2V0RWxlbWVudCgicmVjb3JkZWNobyIpLmNoZWNrZWQsICEwID09IHRoaXMuZG9tXy5nZXRFbGVtZW50KCJyZWNvcmRhdWRpbyIpLmNoZWNrZWQsICEwID09IHRoaXMuZG9tXy5nZXRFbGVtZW50KCJyZWNvcmR2aWRlbyIpLmNoZWNrZWQsICEwID09IHRoaXMuZG9tXy5nZXRFbGVtZW50KCJyZWNvcmRpbmNvbWluZyIpLmNoZWNrZWQsICEwID09IHRoaXMuZG9tXy5nZXRFbGVtZW50KCJyZWNvcmRvdXRnb2luZyIpLmNoZWNrZWQpKSB7CiAgICAgIHZhciBzZWNvbmRzID0gdGhpcy5tZWRpYVJlY29yZGVyXy5nZXRSZWNvcmREdXJhdGlvbk1zKCkgLyAxRTM7CiAgICAgIDAgPCBzZWNvbmRzICYmIHdpbmRvdy5hbGVydCgiUmVjb3JkaW5nIG1lZGlhLi4uIFN0b3AgaW4gIiArIHNlY29uZHMudG9GaXhlZCgyKSArICIgc2Vjb25kcy4iKQogICAgfWVsc2UgewogICAgICB3aW5kb3cuYWxlcnQoIkZhaWxlZCB0byBzdGFydCByZWNvcmRpbmcgKGNoZWNrIGxvZ3MpIikKICAgIH0KICB9Cn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUuaXNNZWRpYVJlY29yZGluZ0VuYWJsZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkaXNNZWRpYVJlY29yZGluZ0VuYWJsZWRfJCgpIHsKICByZXR1cm4gZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5tZWRpYVJlY29yZGVyXykgJiYgZ29vZy5pc0RlZkFuZE5vdE51bGwodGhpcy5jYWxsTWFuYWdlcl8pICYmIHRoaXMubWVkaWFSZWNvcmRlcl8uY2FuUmVjb3JkKHRoaXMuY2FsbE1hbmFnZXJfLmdldEFjdGl2ZUNhbGwoKSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5oYW5kbGVFdmVudF8gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luU3B5JCRoYW5kbGVFdmVudF8kKGUpIHsKICB2YXIgZXZlbnRUaW1lc3RhbXAgPSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkuZ2V0VGltZXN0YW1wXyhlKTsKICB0aGlzLmV2ZW50c18uYWRkKFtlLCBldmVudFRpbWVzdGFtcF0pOwogIDAgPT0gdGhpcy5maXJzdEV2ZW50VGltZV8gJiYgKHRoaXMuZmlyc3RFdmVudFRpbWVfID0gZXZlbnRUaW1lc3RhbXApOwogIGlmKHRoaXMuZGVidWdXaW5kb3dfICYmIHRoaXMuZGVidWdXaW5kb3dfLmRvY3VtZW50KSB7CiAgICB0cnkgewogICAgICB0aGlzLmVuc3VyZURhc2hib2FyZHNSZWFkeV8oKTsKICAgICAgdmFyIGV2ZW50SHRtbCA9IG5ldyBnb29nLnN0cmluZy5TdHJpbmdCdWZmZXI7CiAgICAgIHRoaXMucmVuZGVyRXZlbnRfKGV2ZW50SHRtbCwgZSwgZXZlbnRUaW1lc3RhbXApOwogICAgICB0aGlzLmFkZFRvTG9nXyhldmVudEh0bWwudG9TdHJpbmcoKSkKICAgIH1jYXRjaChleGNlcHRpb24pIHsKICAgICAgdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LmxvZ2dlcl8uc2V2ZXJlKCJFeGNlcHRpb24gaW4gaGFuZGxlRXZlbnQiLCBleGNlcHRpb24pCiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkucHJvdG90eXBlLmhhbmRsZUlzc3VlRXZlbnRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkaGFuZGxlSXNzdWVFdmVudF8kKGUpIHsKICB0aGlzLmlzc3VlRGFzaGJvYXJkXyAmJiB0aGlzLnNob3dJc3N1ZURhc2hib2FyZF8oKSAmJiB0aGlzLmlzc3VlRGFzaGJvYXJkXy51cGRhdGVEYXNoYm9hcmQoZS5jb2xsZWN0b3IpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUucmVuZGVyTWVkaWFJbmZvXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJHJlbmRlck1lZGlhSW5mb18kKG1lZGlhSW5mbywgdGltZXN0YW1wKSB7CiAgdGhpcy5jYWxsRGFzaGJvYXJkXy5vbk1lZGlhSW5mbyhtZWRpYUluZm8pOwogIHRoaXMuZ3JhcGhEYXNoYm9hcmRfLm9uTWVkaWFJbmZvKG1lZGlhSW5mbyk7CiAgdGhpcy5ncmFwaERhc2hib2FyZF8udXBkYXRlR3JhcGhzKCk7CiAgcmV0dXJuIHRoaXMucmVuZGVyXygiSk1JIiwgdGltZXN0YW1wLCAiXG4iICsgbWVkaWFJbmZvLnRvU3RyaW5nKCksICIiLCAibWkiKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkucHJvdG90eXBlLnJlc2l6ZVBhbmVfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkcmVzaXplUGFuZV8kKCkgewogIHZhciB3aWR0aCA9IHRoaXMuZGVidWdXaW5kb3dfLmRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggLSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkuU1BMSVRfUEFORV9QQURESU5HXywgaGVpZ2h0ID0gdGhpcy5kZWJ1Z1dpbmRvd18uZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgLSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkuU1BMSVRfUEFORV9QQURESU5HXywgZmlyc3RDb21wb25lbnRIZWlnaHQgPSB0aGlzLnNwbGl0cGFuZV8uZ2V0Rmlyc3RDb21wb25lbnRTaXplKCk7CiAgaWYoZmlyc3RDb21wb25lbnRIZWlnaHQgPiBoZWlnaHQpIHsKICAgIHZhciBjb21wb25lbnRIZWlnaHQgPSBoZWlnaHQgLSB0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkuU1BMSVRfUEFORV9QQURESU5HXzsKICAgIDAgPiBjb21wb25lbnRIZWlnaHQgJiYgKGNvbXBvbmVudEhlaWdodCA9IDApOwogICAgdGhpcy5zcGxpdHBhbmVfLnNldEZpcnN0Q29tcG9uZW50U2l6ZShjb21wb25lbnRIZWlnaHQpCiAgfQogIHRoaXMuc3BsaXRwYW5lXy5zZXRTaXplKG5ldyBnb29nLm1hdGguU2l6ZSh3aWR0aCwgaGVpZ2h0KSkKfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5saXN0ZW5Ub1BhcnRpY2lwYW50RW5kcG9pbnRzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJGxpc3RlblRvUGFydGljaXBhbnRFbmRwb2ludHNfJCgpIHsKICBpZih0aGlzLmVuZHBvaW50c18pIHsKICAgIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuZW5kcG9pbnRzXy5sZW5ndGg7aSsrKSB7CiAgICAgIHRoaXMuZXZlbnRIYW5kbGVyXy5saXN0ZW4odGhpcy5lbmRwb2ludHNfW2ldLCB0YWxrLm1lZGlhLmMzZC5TdHJlYW1FbmRwb2ludC5FdmVudHMuRlJBTUVSQVRFX0NIQU5HRUQsIHRoaXMub25FbmRwb2ludEZyYW1lcmF0ZUNoYW5nZWRfKSwgdGhpcy5saXN0ZW5lZEVuZHBvaW50c18ucHVzaCh0aGlzLmVuZHBvaW50c19baV0pCiAgICB9CiAgfQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkucHJvdG90eXBlLnVubGlzdGVuVG9QYXJ0aWNpcGFudEVuZHBvaW50c18gPSBmdW5jdGlvbiAkdGFsayRtZWRpYSRUYWxrUGx1Z2luU3B5JCR1bmxpc3RlblRvUGFydGljaXBhbnRFbmRwb2ludHNfJCgpIHsKICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLmxpc3RlbmVkRW5kcG9pbnRzXy5sZW5ndGg7aSsrKSB7CiAgICB0aGlzLmV2ZW50SGFuZGxlcl8udW5saXN0ZW4odGhpcy5saXN0ZW5lZEVuZHBvaW50c19baV0sIHRhbGsubWVkaWEuYzNkLlN0cmVhbUVuZHBvaW50LkV2ZW50cy5GUkFNRVJBVEVfQ0hBTkdFRCwgdGhpcy5vbkVuZHBvaW50RnJhbWVyYXRlQ2hhbmdlZF8pCiAgfQogIHRoaXMubGlzdGVuZWRFbmRwb2ludHNfID0gW10KfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5yZXNldERhc2hib2FyZHNfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkcmVzZXREYXNoYm9hcmRzXyQoKSB7CiAgdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LmxvZ2dlcl8uaW5mbygicmVzZXREYXNoYm9hcmRzXyBjYWxsZWQiKTsKICB0aGlzLmRpc3Bvc2VEYXNoYm9hcmRzXygpOwogIHRoaXMuZG9tXy5nZXRFbGVtZW50KCJkYXNoYm9hcmQiKS5pbm5lckhUTUwgPSAiIjsKICB0aGlzLmRvbV8uZ2V0RWxlbWVudCgiZ3JhcGhkYXNoYm9hcmQiKS5pbm5lckhUTUwgPSAiIjsKICB0aGlzLmRvbV8uZ2V0RWxlbWVudCgiaXNzdWVkYXNoYm9hcmQiKS5pbm5lckhUTUwgPSAiIjsKICB0aGlzLmVuc3VyZURhc2hib2FyZHNSZWFkeV8oKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkucHJvdG90eXBlLmRpc3Bvc2VEYXNoYm9hcmRzXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJGRpc3Bvc2VEYXNoYm9hcmRzXyQoKSB7CiAgdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LmxvZ2dlcl8uaW5mbygiZGlzcG9zZURhc2hib2FyZHNfIGNhbGxlZCIpOwogIGdvb2cuZGlzcG9zZSh0aGlzLmNhbGxEYXNoYm9hcmRfKTsKICB0aGlzLmNhbGxEYXNoYm9hcmRfID0gbnVsbDsKICBnb29nLmRpc3Bvc2UodGhpcy5kYXNoYm9hcmRaaXBweV8pOwogIHRoaXMuZGFzaGJvYXJkWmlwcHlfID0gbnVsbDsKICBnb29nLmRpc3Bvc2UodGhpcy5ncmFwaERhc2hib2FyZF8pOwogIHRoaXMuZ3JhcGhEYXNoYm9hcmRfID0gbnVsbDsKICBnb29nLmRpc3Bvc2UodGhpcy5ncmFwaFppcHB5Xyk7CiAgdGhpcy5ncmFwaFppcHB5XyA9IG51bGw7CiAgZ29vZy5kaXNwb3NlKHRoaXMuaXNzdWVEYXNoYm9hcmRfKTsKICB0aGlzLmlzc3VlRGFzaGJvYXJkXyA9IG51bGw7CiAgZ29vZy5kaXNwb3NlKHRoaXMuaXNzdWVaaXBweV8pOwogIHRoaXMuaXNzdWVaaXBweV8gPSBudWxsCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUuZW5zdXJlRGFzaGJvYXJkc1JlYWR5XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJGVuc3VyZURhc2hib2FyZHNSZWFkeV8kKCkgewogIHRoaXMuY2FsbERhc2hib2FyZF8gfHwgKHRoaXMuY2FsbERhc2hib2FyZF8gPSBuZXcgdGFsay5tZWRpYS5DYWxsRGFzaGJvYXJkKHRoaXMuY2FsbE1hbmFnZXJfLCB0aGlzLmRvbV8pLCB0aGlzLmNhbGxEYXNoYm9hcmRfLmRlY29yYXRlKHRoaXMuZG9tXy5nZXRFbGVtZW50KCJkYXNoYm9hcmQiKSksIHRoaXMuZGFzaGJvYXJkWmlwcHlfID0gbmV3IGdvb2cudWkuWmlwcHkoImRhc2hib2FyZF96aXBweSIsICJkYXNoYm9hcmQiLCAhMCwgbnVsbCwgdGhpcy5kb21fKSk7CiAgdGhpcy5ncmFwaERhc2hib2FyZF8gfHwgKHRoaXMuZ3JhcGhEYXNoYm9hcmRfID0gbmV3IHRhbGsubWVkaWEuR3JhcGhEYXNoYm9hcmQodGhpcy5kb21fKSwgdGhpcy5ncmFwaERhc2hib2FyZF8uZGVjb3JhdGUodGhpcy5kb21fLmdldEVsZW1lbnQoImdyYXBoZGFzaGJvYXJkIikpLCB0aGlzLmdyYXBoWmlwcHlfID0gbmV3IGdvb2cudWkuWmlwcHkoImdyYXBoX3ppcHB5IiwgImdyYXBoZGFzaGJvYXJkIiwgITEsIG51bGwsIHRoaXMuZG9tXykpOwogICF0aGlzLmlzc3VlRGFzaGJvYXJkXyAmJiB0aGlzLnNob3dJc3N1ZURhc2hib2FyZF8oKSAmJiAodGhpcy5pc3N1ZURhc2hib2FyZF8gPSBuZXcgdGFsay5tZWRpYS5Jc3N1ZURhc2hib2FyZCh0aGlzLmRvbV8pLCB0aGlzLmlzc3VlRGFzaGJvYXJkXy5kZWNvcmF0ZSh0aGlzLmRvbV8uZ2V0RWxlbWVudCgiaXNzdWVkYXNoYm9hcmQiKSksIHRoaXMuaXNzdWVaaXBweV8gPSBuZXcgZ29vZy51aS5aaXBweSgiaXNzdWVfemlwcHkiLCAiaXNzdWVkYXNoYm9hcmQiLCAhMSwgbnVsbCwgdGhpcy5kb21fKSk7CiAgdGhpcy51bmxpc3RlblRvUGFydGljaXBhbnRFbmRwb2ludHNfKCk7CiAgdGhpcy5saXN0ZW5Ub1BhcnRpY2lwYW50RW5kcG9pbnRzXygpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUuc2hvd0lzc3VlRGFzaGJvYXJkXyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJHNob3dJc3N1ZURhc2hib2FyZF8kKCkgewogIHJldHVybiBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLmlzc3VlTWFuYWdlcl8pCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUub25FbmRwb2ludEZyYW1lcmF0ZUNoYW5nZWRfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkb25FbmRwb2ludEZyYW1lcmF0ZUNoYW5nZWRfJChlKSB7CiAgdmFyIHJlc291cmNlSWQgPSBlLmVuZHBvaW50LmdldFBhcnRpY2lwYW50KCkuZ2V0UmVzb3VyY2VJZCgpLCByZW5kZXIgPSB0aGlzLmRvbV8uZ2V0RWxlbWVudCgiZnBzLXJlbmRlci0iICsgcmVzb3VyY2VJZCk7CiAgcmVuZGVyICYmIChyZW5kZXIuaW5uZXJIVE1MID0gZS5yZW5kZXJDb3VudCArICIgZnBzIik7CiAgdmFyIHVwZGF0ZSA9IHRoaXMuZG9tXy5nZXRFbGVtZW50KCJmcHMtdXBkYXRlLSIgKyByZXNvdXJjZUlkKTsKICB1cGRhdGUgJiYgKHVwZGF0ZS5pbm5lckhUTUwgPSBlLnVwZGF0ZUNvdW50ICsgIiBmcHMiKQp9Owp0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkucHJvdG90eXBlLnJlbmRlckV2ZW50XyA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJHJlbmRlckV2ZW50XyQoc2IsIGUsIHRpbWVzdGFtcCkgewogIGlmKGUudHlwZSA9PSB0YWxrLm1lZGlhLk1lZGlhSW5mby5FdmVudHMuTUVESUFfSU5GTykgewogICAgc2IuYXBwZW5kKHRoaXMucmVuZGVyTWVkaWFJbmZvXyhlLm1lZGlhSW5mbywgdGltZXN0YW1wKSkKICB9ZWxzZSB7CiAgICBpZigiam4iID09IGUubXNnVHlwZSAmJiBlLnR5cGUgPT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5PVVRHT0lOR19KSU5HTEUgJiYgKCF0aGlzLmNhbGxNYW5hZ2VyXyB8fCB0aGlzLmNhbGxNYW5hZ2VyXy5oYXNBY3RpdmVDYWxsKCkgJiYgZS5nZXRQYXJzZWRNc2coKVsyXSA9PSB0aGlzLmNhbGxNYW5hZ2VyXy5nZXRBY3RpdmVDYWxsKCkuc2Vzc2lvbklkKSkgewogICAgICBzYi5hcHBlbmQoIjxocj48aDI+TmV3IENhbGw8L2gyPjxocj4iKSwgdGhpcy5yZXNldERhc2hib2FyZHNfKCkKICAgIH0KICAgIGlmKCJkaWFnIiA9PSBlLnR5cGUpIHsKICAgICAgc2IuYXBwZW5kKHRoaXMucmVuZGVyXygiRGlhZyIsIHRpbWVzdGFtcCwgZS50ZXh0KSkKICAgIH1lbHNlIHsKICAgICAgaWYoZS50eXBlID09IHRhbGsubWVkaWEuVGFsa1BsdWdpbkV2ZW50Lk9VVEdPSU5HX01FU1NBR0UpIHsKICAgICAgICBzYi5hcHBlbmQodGhpcy5yZW5kZXJfKCJGIiwgdGltZXN0YW1wLCBlLmpzb24sICJvdXQiLCAiZmwiKSksIHRoaXMuY2FsbERhc2hib2FyZF8ub25GbHV0ZU1lc3NhZ2UoZSkKICAgICAgfWVsc2UgewogICAgICAgIGlmKGUudHlwZSA9PSB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50Lk9VVEdPSU5HX0pJTkdMRSkgewogICAgICAgICAgaWYoImptaWRhdGEiICE9IGUubXNnVHlwZSAmJiBzYi5hcHBlbmQodGhpcy5yZW5kZXJfKCJKIiwgdGltZXN0YW1wLCBlLmpzb24sICJvdXQiLCAiamkiKSksICJ2aWV3IiA9PSBlLm1zZ1R5cGUpIHsKICAgICAgICAgICAgdGhpcy5jYWxsRGFzaGJvYXJkXy5vbkppbmdsZU1lc3NhZ2UoZSkKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSB7CiAgICAgICAgICBpZihlLnR5cGUgPT0gdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5JTkNPTUlOR19KSU5HTEUpIHsKICAgICAgICAgICAgc2IuYXBwZW5kKHRoaXMucmVuZGVyXygiSiIsIHRpbWVzdGFtcCwgZS5qc29uLCAiaW4iLCAiamkiKSkKICAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgaWYoImphaSIgPT0gZS5tc2dUeXBlKSB7CiAgICAgICAgICAgICAgdGhpcy5jYWxsRGFzaGJvYXJkXy5vbkF1ZGlvSW5mb01lc3NhZ2UoZSkKICAgICAgICAgICAgfWVsc2UgewogICAgICAgICAgICAgIGlmKCJqbWlkYXRhIiA9PSBlLm1zZ1R5cGUgJiYgIXRoaXMubGlzdGVuRm9yTWVkaWFJbmZvRXZlbnRzXykgewogICAgICAgICAgICAgICAgdmFyIG1lZGlhSW5mbyA9IG5ldyB0YWxrLm1lZGlhLk1lZGlhSW5mbyhlLmdldFBhcnNlZE1zZygpKTsKICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0aGlzLnJlbmRlck1lZGlhSW5mb18obWVkaWFJbmZvLCB0aW1lc3RhbXApKQogICAgICAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgICAgICJzdHJlYW1yZWFkeSIgPT0gZS5tc2dUeXBlID8gKHNiLmFwcGVuZCh0aGlzLnJlbmRlcl8oIkYiLCB0aW1lc3RhbXAsIGUuanNvbiwgImluIiwgImZsIikpLCB0aGlzLmNhbGxEYXNoYm9hcmRfLm9uRmx1dGVNZXNzYWdlKGUpKSA6IHNiLmFwcGVuZCh0aGlzLnJlbmRlcl8oIkYiLCB0aW1lc3RhbXAsIGUuanNvbiwgImluIiwgImZsIikpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAianQiID09IGUubXNnVHlwZSAmJiBzYi5hcHBlbmQoIjxocj48aDI+RW5kIENhbGw8L2gyPjxocj4iKQogIH0KfTsKdGFsay5tZWRpYS5UYWxrUGx1Z2luU3B5LnByb3RvdHlwZS5yZW5kZXJfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSQkcmVuZGVyXyQodHlwZSwgdGltZXN0YW1wLCBib2R5LCBvcHRfZGlyZWN0aW9uLCBvcHRfZm9ybWF0KSB7CiAgdmFyIHJlY29yZCA9IHt0eXBlOnR5cGUsIHRpbWU6KCh0aW1lc3RhbXAgLSB0aGlzLmZpcnN0RXZlbnRUaW1lXykgLyAxRTMpLnRvRml4ZWQoMyksIGJvZHk6Ym9keSwgZGlyOm9wdF9kaXJlY3Rpb24gPyAibCIgKyBvcHRfZGlyZWN0aW9uIDogIiIsIGZvcm1hdDpvcHRfZm9ybWF0ID8gImwiICsgb3B0X2Zvcm1hdCA6ICIiLCBsZXZlbDoiaSJ9OwogIHJldHVybiB0YWxrLm1lZGlhLlRhbGtQbHVnaW5Mb2dUZW1wbGF0ZShyZWNvcmQpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5nZXRUaW1lc3RhbXBfID0gZnVuY3Rpb24gJHRhbGskbWVkaWEkVGFsa1BsdWdpblNweSRnZXRUaW1lc3RhbXBfJChlKSB7CiAgcmV0dXJuIGdvb2cuaXNEZWYoZS50aW1lc3RhbXApID8gZS50aW1lc3RhbXAgOiBnb29nLm5vdygpCn07CnRhbGsubWVkaWEuVGFsa1BsdWdpblNweS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICR0YWxrJG1lZGlhJFRhbGtQbHVnaW5TcHkkJGRpc3Bvc2UkKCkgewogIGdvb2cuZGlzcG9zZSh0aGlzLndhcm5pbmdTaW11bGF0b3JaaXBweV8pOwogIHRoaXMud2FybmluZ1NpbXVsYXRvclppcHB5XyA9IG51bGw7CiAgZ29vZy5kaXNwb3NlKHRoaXMuZXZlbnRIYW5kbGVyXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbnVsbDsKICB0aGlzLmRpc3Bvc2VEYXNoYm9hcmRzXygpOwogIGdvb2cuZGlzcG9zZSh0aGlzLnNwbGl0UGFuZV8pOwogIHRoaXMuZG9tXyA9IHRoaXMuY2FsbE1hbmFnZXJfID0gdGhpcy5kZWJ1Z1dpbmRvd18gPSB0aGlzLnNwbGl0UGFuZV8gPSBudWxsCn07CnRhbGsuVmlkZW9QbGF5Z3JvdW5kID0gZnVuY3Rpb24gJHRhbGskVmlkZW9QbGF5Z3JvdW5kJChjYWxsaW5nUmVxdWlyZW1lbnRzLCBjYWxsTWFuYWdlciwgdGFsa1BsdWdpbiwgdGFsa1BsdWdpblNweSwgd2lkdGgsIGhlaWdodCwgZnJhbWVyYXRlLCBjb250YWluZXIsIG9ubHlGbGFzaCwgY2FsbFR5cGUsIG11bHRpVmlldywgbGFuZywgZW5hYmxlTm90aWZpY2F0aW9ucywgcmVuZGVyTW9kZSkgewogIGdvb2cuRGlzcG9zYWJsZS5jYWxsKHRoaXMpOwogIHRoaXMuY2FsbGluZ1JlcXVpcmVtZW50c18gPSBjYWxsaW5nUmVxdWlyZW1lbnRzOwogIHRoaXMuY2FsbE1hbmFnZXJfID0gY2FsbE1hbmFnZXI7CiAgdGhpcy50YWxrUGx1Z2luXyA9IHRhbGtQbHVnaW47CiAgdGhpcy50YWxrUGx1Z2luU3B5XyA9IHRhbGtQbHVnaW5TcHk7CiAgdGhpcy53aWR0aF8gPSB3aWR0aDsKICB0aGlzLmhlaWdodF8gPSBoZWlnaHQ7CiAgdGhpcy5mcmFtZXJhdGVfID0gZnJhbWVyYXRlOwogIHRoaXMuY29udGFpbmVyXyA9IGNvbnRhaW5lcjsKICB0aGlzLm9ubHlGbGFzaF8gPSBvbmx5Rmxhc2g7CiAgdGhpcy5jYWxsVHlwZV8gPSBjYWxsVHlwZTsKICB0aGlzLm11bHRpVmlld18gPSBtdWx0aVZpZXc7CiAgdGhpcy5sYW5nXyA9IGxhbmc7CiAgdGhpcy5lbmFibGVOb3RpZmljYXRpb25zXyA9IGVuYWJsZU5vdGlmaWNhdGlvbnM7CiAgdGhpcy5yZW5kZXJNb2RlXyA9IHJlbmRlck1vZGU7CiAgdGhpcy5ldmVudEhhbmRsZXJfID0gbmV3IGdvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcih0aGlzKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuY2FsbE1hbmFnZXJfLCB0YWxrLm1lZGlhLlRhbGtQbHVnaW5FdmVudC5NRVNTQUdFLCB0aGlzLmhhbmRsZVRhbGtQbHVnaW5NZXNzYWdlXyk7CiAgdGhpcy5ldmVudEhhbmRsZXJfLmxpc3Rlbih0aGlzLmNhbGxNYW5hZ2VyXywgdGFsay5tZWRpYS5DYWxsTWFuYWdlci5FdmVudC5ORVdfQ0FMTCwgdGhpcy5vbk5ld0NhbGxfKTsKICB0aGlzLmV2ZW50SGFuZGxlcl8ubGlzdGVuKHRoaXMuY2FsbE1hbmFnZXJfLCB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkV2ZW50Lk1JQ19NVVRFLCB0aGlzLmhhbmRsZU1pY011dGVOb3RpZmljYXRpb25fKTsKICB0aGlzLmNhbGxNYW5hZ2VyXy5pc1RhbGtQbHVnaW5FbmFibGVkKCkgJiYgdGhpcy5zdGFydENhbGxfKCkKfTsKZ29vZy5pbmhlcml0cyh0YWxrLlZpZGVvUGxheWdyb3VuZCwgZ29vZy5EaXNwb3NhYmxlKTsKdGFsay5WaWRlb1BsYXlncm91bmQuQVZBSUxBQkxFX01PREVTXyA9IFtbIjE2MCIsICIxMDAiLCAiMzAiXSwgWyIzMjAiLCAiMjAwIiwgIjMwIl0sIFsiNjQwIiwgIjQwMCIsICIzMCJdLCBbIjEyODAiLCAiODAwIiwgIjMwIl1dOwp0YWxrLlZpZGVvUGxheWdyb3VuZC5BVkFUQVJfSU1HX1VSTF8gPSAiaHR0cDovL2ljYW5oYXNjaGVlemJ1cmdlci5maWxlcy53b3JkcHJlc3MuY29tLzIwMDgvMDMvZnVubnktcGljdHVyZXMtZHItcGhpbC1zZWFsLmpwZyI7CnRhbGsuVmlkZW9QbGF5Z3JvdW5kLkFVRElPX0NPREVDX0lORk9fID0gW1siMTAzIiwgIklTQUMiLCAiMSIsICIwIiwgIjE2MDAwIl0sIFsiMTA0IiwgIklTQUMiLCAiMSIsICIwIiwgIjMyMDAwIl0sIFsiMTA3IiwgInNwZWV4IiwgIjEiLCAiMjIwMDAiLCAiMTYwMDAiXSwgWyI5IiwgIkc3MjIiLCAiMSIsICI2NDAwMCIsICIxNjAwMCJdLCBbIjEwMiIsICJJTEJDIiwgIjEiLCAiMTMzMDAiLCAiODAwMCJdLCBbIjEwOCIsICJzcGVleCIsICIxIiwgIjExMDAwIiwgIjgwMDAiXSwgWyIwIiwgIlBDTVUiLCAiMSIsICI2NDAwMCIsICI4MDAwIl0sIFsiOCIsICJQQ01BIiwgIjEiLCAiNjQwMDAiLCAiODAwMCJdLCBbIjEwNiIsICJDTiIsICIxIiwgIjAiLCAiMzIwMDAiXSwgWyIxMDUiLCAiQ04iLCAiMSIsICIwIiwgIjE2MDAwIl0sIFsiMTMiLCAiQ04iLCAiMSIsICIwIiwgIjgwMDAiXSwgWyIxMjciLCAicmVkIiwgIjEiLCAiMCIsICI4MDAwIl0sIFsiMTI2IiwgInRlbGVwaG9uZS1ldmVudCIsIAoiMSIsICIwIiwgIjgwMDAiXV07CnRhbGsuVmlkZW9QbGF5Z3JvdW5kLmNyZWF0ZSA9IGZ1bmN0aW9uICR0YWxrJFZpZGVvUGxheWdyb3VuZCRjcmVhdGUkKHdpZHRoLCBoZWlnaHQsIGZyYW1lcmF0ZSwgY29udGFpbmVyLCBvbmx5Rmxhc2gsIGNhbGxUeXBlLCBtdWx0aVZpZXcsIGxhbmcsIGVuYWJsZU5vdGlmaWNhdGlvbnMsIHJlbmRlck1vZGUsIGRlYnVnKSB7CiAgdmFyIGNhbGxpbmdSZXF1aXJlbWVudHMgPSBuZXcgdGFsay5tZWRpYS5DYWxsaW5nUmVxdWlyZW1lbnRzKCFvbmx5Rmxhc2gpLCBjYWxsTWFuYWdlciA9IG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyKGNhbGxpbmdSZXF1aXJlbWVudHMpLCB0YWxrUGx1Z2luID0gbmV3IHRhbGsubWVkaWEuVGFsa1BsdWdpbigiIiwgY2FsbGluZ1JlcXVpcmVtZW50cy5nZXRSZW5kZXJlckRldGVjdG9yKCkpOwogIGNhbGxNYW5hZ2VyLnNldFRhbGtQbHVnaW4odGFsa1BsdWdpbik7CiAgdmFyIHRhbGtQbHVnaW5TcHkgPSBudWxsOwogIGlmKGRlYnVnKSB7CiAgICB2YXIgdGFsa1BsdWdpblNweSA9IG5ldyB0YWxrLm1lZGlhLlRhbGtQbHVnaW5TcHkoY2FsbE1hbmFnZXIsIHZvaWQgMCwgITApLCByZW5kZXJDYXBzID0gY2FsbGluZ1JlcXVpcmVtZW50cy5nZXRSZW5kZXJlckRldGVjdG9yKCkuZ2V0Q2FwYWJpbGl0aWVzKCksIGhhc0ZsYXNoID0gISEocmVuZGVyQ2FwcyAmIHRhbGsubWVkaWEuUmVuZGVyZXJEZXRlY3Rvci5SRU5ERVJfTUFHSUNDQU1fQ0FQQUJJTElUWSksIGhhc08zRCA9ICEhKHJlbmRlckNhcHMgJiB0YWxrLm1lZGlhLlJlbmRlcmVyRGV0ZWN0b3IuUkVOREVSX0NMSUVOVDNEX0NBUEFCSUxJVFkpOwogICAgdGFsa1BsdWdpblNweS5yZWNvcmREaWFnbm9zdGljKCJGbGFzaCBhdmFpbGFibGU/ICIgKyAoaGFzRmxhc2ggPyAiWWVzIiA6ICJObyIpKTsKICAgIHRhbGtQbHVnaW5TcHkucmVjb3JkRGlhZ25vc3RpYygiTzNEIGF2YWlsYWJsZS9lbmFibGVkPyAiICsgKGhhc08zRCA/ICJZZXMiIDogIk5vIikpCiAgfQogIHRhbGtQbHVnaW4uaW5pdGlhbGl6ZSgpOwogIHJldHVybiBuZXcgdGFsay5WaWRlb1BsYXlncm91bmQoY2FsbGluZ1JlcXVpcmVtZW50cywgY2FsbE1hbmFnZXIsIHRhbGtQbHVnaW4sIHRhbGtQbHVnaW5TcHksIHdpZHRoLCBoZWlnaHQsIGZyYW1lcmF0ZSwgY29udGFpbmVyLCBvbmx5Rmxhc2gsIGNhbGxUeXBlLCBtdWx0aVZpZXcsIGxhbmcsIGVuYWJsZU5vdGlmaWNhdGlvbnMsIHJlbmRlck1vZGUpCn07CnRhbGsuVmlkZW9QbGF5Z3JvdW5kLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICR0YWxrJFZpZGVvUGxheWdyb3VuZCQkZ2V0V2lkdGgkKCkgewogIHJldHVybiB0aGlzLndpZHRoXwp9Owp0YWxrLlZpZGVvUGxheWdyb3VuZC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gJHRhbGskVmlkZW9QbGF5Z3JvdW5kJCRnZXRIZWlnaHQkKCkgewogIHJldHVybiB0aGlzLmhlaWdodF8KfTsKdGFsay5WaWRlb1BsYXlncm91bmQucHJvdG90eXBlLmNoYW5nZVJlc29sdXRpb24gPSBmdW5jdGlvbiAkdGFsayRWaWRlb1BsYXlncm91bmQkJGNoYW5nZVJlc29sdXRpb24kKHdpZHRoLCBoZWlnaHQpIHsKICAxNjAgPiB3aWR0aCB8fCAxMDAgPiBoZWlnaHQgfHwgKHRoaXMud2lkdGhfID0gd2lkdGgsIHRoaXMuaGVpZ2h0XyA9IGhlaWdodCwgdGhpcy5jYWxsTWFuYWdlcl8uaXNUYWxrUGx1Z2luRW5hYmxlZCgpICYmIHRoaXMuYXBwbHlDdXJyZW50TW9kZV8oKSkKfTsKdGFsay5WaWRlb1BsYXlncm91bmQucHJvdG90eXBlLmFwcGx5Q3VycmVudE1vZGVfID0gZnVuY3Rpb24gJHRhbGskVmlkZW9QbGF5Z3JvdW5kJCRhcHBseUN1cnJlbnRNb2RlXyQoKSB7CiAgdmFyIGplYyA9IFsiamVjIiwgdGhpcy5nZXRWaWRlb0NvZGVjSW5mb18oKV07CiAgdGhpcy5jYWxsTWFuYWdlcl8uaGFuZGxlSmluZ2xlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUoamVjKSkKfTsKdGFsay5WaWRlb1BsYXlncm91bmQucHJvdG90eXBlLmdldFZpZGVvQ29kZWNJbmZvXyA9IGZ1bmN0aW9uICR0YWxrJFZpZGVvUGxheWdyb3VuZCQkZ2V0VmlkZW9Db2RlY0luZm9fJCgpIHsKICB2YXIgbW9kZUluZm8gPSBbdGhpcy53aWR0aF8sIHRoaXMuaGVpZ2h0XywgdGhpcy5mcmFtZXJhdGVfXTsKICByZXR1cm5bWyI5OSIsICJIMjY0LVNWQyJdLmNvbmNhdChtb2RlSW5mbyksIFsiOTciLCAiSDI2NCJdLmNvbmNhdChtb2RlSW5mbyldCn07CnRhbGsuVmlkZW9QbGF5Z3JvdW5kLnByb3RvdHlwZS5oYW5kbGVUYWxrUGx1Z2luTWVzc2FnZV8gPSBmdW5jdGlvbiAkdGFsayRWaWRlb1BsYXlncm91bmQkJGhhbmRsZVRhbGtQbHVnaW5NZXNzYWdlXyQoZSkgewogICJqYyIgPT0gZS5tc2dUeXBlID8gdGhpcy5jYWxsTWFuYWdlcl8uaGFuZGxlSmluZ2xlTXNnKGUuanNvbikgOiBnb29nLmlzRGVmQW5kTm90TnVsbCh0aGlzLnBsYXllcl8pID8gdGhpcy5wbGF5ZXJfLnJlbGF5Q2FsbE1lc3NhZ2UoInBsdWdpbi1kYXRhIiwgZS5qc29uKSA6IHRoaXMuY2FsbE1hbmFnZXJfLmlzVGFsa1BsdWdpbkVuYWJsZWQoKSAmJiB0aGlzLnN0YXJ0Q2FsbF8oKQp9Owp0YWxrLlZpZGVvUGxheWdyb3VuZC5wcm90b3R5cGUuc3RhcnRDYWxsXyA9IGZ1bmN0aW9uICR0YWxrJFZpZGVvUGxheWdyb3VuZCQkc3RhcnRDYWxsXyQoKSB7CiAgdGhpcy5hcHBseUN1cnJlbnRNb2RlXygpOwogIHZhciB0eXBlOwogIHN3aXRjaCh0aGlzLmNhbGxUeXBlXykgewogICAgY2FzZSAidiI6CiAgICAgIHR5cGUgPSB0YWxrLm1lZGlhLkNhbGxUeXBlLlZJREVPOwogICAgICBicmVhazsKICAgIGNhc2UgImEiOgogICAgICB0eXBlID0gdGFsay5tZWRpYS5DYWxsVHlwZS5WT0lDRTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0eXBlID0gdGFsay5tZWRpYS5DYWxsVHlwZS5URVNUCiAgfQogIHR5cGUgIT0gdGFsay5tZWRpYS5DYWxsVHlwZS5URVNUID8gdGhpcy5jYWxsTWFuYWdlcl8uc3RhcnRDYWxsKCJmb29AYmFyLmNvbSIsIHR5cGUpIDogdGhpcy5vcGVuUGxheWVyXyghMCwgIiIsICIiLCB0eXBlKQp9Owp0YWxrLlZpZGVvUGxheWdyb3VuZC5wcm90b3R5cGUub25OZXdDYWxsXyA9IGZ1bmN0aW9uICR0YWxrJFZpZGVvUGxheWdyb3VuZCQkb25OZXdDYWxsXyQoZSkgewogIHRoaXMub3BlblBsYXllcl8oZS5pc091dGdvaW5nLCBlLnNlc3Npb25JZCwgZS5qaWQsIGUuY2FsbFR5cGUpOwogIGdvb2cuVGltZXIuY2FsbE9uY2UodGhpcy5zaW11bGF0ZUFjY2VwdF8sIDVFMywgdGhpcyk7CiAgdGhpcy5jYWxsTWFuYWdlcl8uaGFuZGxlSmluZ2xlTXNnKGdvb2cuanNvbi5zZXJpYWxpemUoWyJqdHIiLCBlLmppZCwgZS5zZXNzaW9uSWQsICJpIl0pKQp9Owp0YWxrLlZpZGVvUGxheWdyb3VuZC5wcm90b3R5cGUuc2ltdWxhdGVBY2NlcHRfID0gZnVuY3Rpb24gJHRhbGskVmlkZW9QbGF5Z3JvdW5kJCRzaW11bGF0ZUFjY2VwdF8kKGUpIHsKICBpZighdGhpcy5pc0Rpc3Bvc2VkKCkpIHsKICAgIHZhciBqcnRwTXNnID0gW3RoaXMuY2FsbE1hbmFnZXJfLmdldEFjdGl2ZUNhbGwoKS5yZW1vdGVKaWRzWzBdLCB0aGlzLmNhbGxNYW5hZ2VyXy5nZXRBY3RpdmVDYWxsKCkuc2Vzc2lvbklkLCB0YWxrLlZpZGVvUGxheWdyb3VuZC5BVURJT19DT0RFQ19JTkZPXywgdGhpcy5nZXRWaWRlb0NvZGVjSW5mb18oKV07CiAgICB0aGlzLmNhbGxNYW5hZ2VyXy5oYW5kbGVKaW5nbGVNc2coZ29vZy5qc29uLnNlcmlhbGl6ZShbImpscnRwIl0uY29uY2F0KGpydHBNc2cpKSk7CiAgICB0aGlzLmNhbGxNYW5hZ2VyXy5oYW5kbGVKaW5nbGVNc2coZ29vZy5qc29uLnNlcmlhbGl6ZShbImpydHAiXS5jb25jYXQoanJ0cE1zZykpKTsKICAgIHZhciBqc29uX2phX2FycmF5ID0gZ29vZy5qc29uLnNlcmlhbGl6ZShbImphIiwgdGhpcy5jYWxsTWFuYWdlcl8uZ2V0QWN0aXZlQ2FsbCgpLnJlbW90ZUppZHNbMF0sIHRoaXMuY2FsbE1hbmFnZXJfLmdldEFjdGl2ZUNhbGwoKS5zZXNzaW9uSWRdKTsKICAgIHRoaXMuY2FsbE1hbmFnZXJfLmhhbmRsZUppbmdsZU1zZyhqc29uX2phX2FycmF5KTsKICAgIHRoaXMucGxheWVyXy5yZWxheUNhbGxNZXNzYWdlKCJjb25uZWN0LWRhdGEiLCBqc29uX2phX2FycmF5KTsKICAgIGlmKHRoaXMubXVsdGlWaWV3XykgewogICAgICB2YXIgbG9jYWxQYXJ0aWNpcGFudCA9IG5ldyB0YWxrLm1lZGlhLlBhcnRpY2lwYW50KCJsb2NhbCIsICEwKSwgcmVtb3RlUGFydGljaXBhbnQgPSBuZXcgdGFsay5tZWRpYS5QYXJ0aWNpcGFudChlLmppZCk7CiAgICAgIHJlbW90ZVBhcnRpY2lwYW50LnNldFZpZGVvU1NSQygiMCIpOwogICAgICB0aGlzLmNhbGxNYW5hZ2VyXy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkFkZFBhcnRpY2lwYW50RXZlbnQodGhpcy5jYWxsTWFuYWdlcl8uZ2V0QWN0aXZlQ2FsbCgpLnNlc3Npb25JZCwgbG9jYWxQYXJ0aWNpcGFudCkpOwogICAgICB0aGlzLmNhbGxNYW5hZ2VyXy5kaXNwYXRjaEV2ZW50KG5ldyB0YWxrLm1lZGlhLkNhbGxNYW5hZ2VyLkFkZFBhcnRpY2lwYW50RXZlbnQodGhpcy5jYWxsTWFuYWdlcl8uZ2V0QWN0aXZlQ2FsbCgpLnNlc3Npb25JZCwgcmVtb3RlUGFydGljaXBhbnQpKQogICAgfQogIH0KfTsKdGFsay5WaWRlb1BsYXlncm91bmQucHJvdG90eXBlLmhhbmRsZU1pY011dGVOb3RpZmljYXRpb25fID0gZnVuY3Rpb24gJHRhbGskVmlkZW9QbGF5Z3JvdW5kJCRoYW5kbGVNaWNNdXRlTm90aWZpY2F0aW9uXyQoZSkgewogIHRoaXMucGxheWVyXy5oYW5kbGVNaWNNdXRlTm90aWZpY2F0aW9uKGUpCn07CnRhbGsuVmlkZW9QbGF5Z3JvdW5kLnByb3RvdHlwZS5vcGVuUGxheWVyXyA9IGZ1bmN0aW9uICR0YWxrJFZpZGVvUGxheWdyb3VuZCQkb3BlblBsYXllcl8kKGlzT3V0Z29pbmcsIHNlc3Npb25JZCwgamlkLCBjYWxsVHlwZSkgewogIHZhciBzd2ZVcmwgPSAibWVkaWEtcGxheWVyLnN3ZiIsIG11dGVIYW5kbGVyID0gbmV3IHRhbGsubWVkaWEuQzNkRnVsbHNjcmVlbk11dGVIYW5kbGVyOwogIGlmKHRoaXMuY2FsbE1hbmFnZXJfLnVzZUNsaWVudDNEKCkpIHsKICAgIHRoaXMucGxheWVyXyA9IG5ldyB0YWxrLm1lZGlhLkMzZENvbW11bmljYXRpb25QbGF5ZXJXcmFwcGVyKHRoaXMuY2FsbE1hbmFnZXJfLCBuZXcgdGFsay5tZWRpYS5QbGF5ZXJPcHRpb25zKHRoaXMubGFuZ18pLCAhIXRoaXMubXVsdGlWaWV3Xywgdm9pZCAwLCBzd2ZVcmwsIG11dGVIYW5kbGVyLCB0aGlzLmVuYWJsZU5vdGlmaWNhdGlvbnNfLCB0aGlzLnJlbmRlck1vZGVfKSwgdGhpcy5wbGF5ZXJfLnNldENvbnRhaW5lcih0aGlzLmNvbnRhaW5lcl8pLCBtdXRlSGFuZGxlci5zZXR1cE11dGVTaG9ydGN1dCh0aGlzLnBsYXllcl8pCiAgfWVsc2UgewogICAgaWYodGhpcy5jYWxsTWFuYWdlcl8uY2FuVXNlRmxhc2goKSkgewogICAgICB0aGlzLnBsYXllcl8gPSBuZXcgdGFsay5tZWRpYS5Db21tdW5pY2F0aW9uUGxheWVyKHRoaXMuY2FsbE1hbmFnZXJfLCB2b2lkIDAsIHN3ZlVybCksIHRoaXMucGxheWVyXy5zZXRDb250YWluZXIodGhpcy5jb250YWluZXJfKQogICAgfWVsc2UgewogICAgICB0aGlzLnRhbGtQbHVnaW5TcHlfICYmIHRoaXMudGFsa1BsdWdpblNweV8ucmVjb3JkRGlhZ25vc3RpYygiRXJyb3I6ICIgKyAodGhpcy5vbmx5Rmxhc2hfID8gIkZsYXNoIiA6ICJPM0QiKSArICIgcmVuZGVyaW5nIG1ldGhvZCBub3QgYXZhaWxhYmxlLiIpOwogICAgICByZXR1cm4KICAgIH0KICB9CiAgdmFyIHBhcnRpY2lwYW50cyA9IG5ldyB0YWxrLm1lZGlhLlBhcnRpY2lwYW50czsKICBwYXJ0aWNpcGFudHMuYWRkKCJsb2NhbCIsICEwKS5zZXRBdmF0YXIodGFsay5WaWRlb1BsYXlncm91bmQuQVZBVEFSX0lNR19VUkxfKTsKICBwYXJ0aWNpcGFudHMuYWRkKGppZCkuc2V0QXZhdGFyKHRhbGsuVmlkZW9QbGF5Z3JvdW5kLkFWQVRBUl9JTUdfVVJMXyk7CiAgdGhpcy5wbGF5ZXJfLm9uTmV3Q2FsbChpc091dGdvaW5nLCBzZXNzaW9uSWQsIGppZCwgcGFydGljaXBhbnRzLCBjYWxsVHlwZSwgITEpCn07CnRhbGsuVmlkZW9QbGF5Z3JvdW5kLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkdGFsayRWaWRlb1BsYXlncm91bmQkJGRpc3Bvc2VJbnRlcm5hbCQoKSB7CiAgdGhpcy5wbGF5ZXJfICYmIHRoaXMucGxheWVyXy5kaXNwb3NlKCk7CiAgdGhpcy50YWxrUGx1Z2luU3B5XyAmJiB0aGlzLnRhbGtQbHVnaW5TcHlfLmRpc3Bvc2UoKTsKICB0aGlzLmNhbGxNYW5hZ2VyXy5kaXNwb3NlKCk7CiAgdGhpcy50YWxrUGx1Z2luXy5kaXNwb3NlKCk7CiAgdGhpcy5jYWxsaW5nUmVxdWlyZW1lbnRzXy5kaXNwb3NlKCkKfTsKZ29vZy5leHBvcnRTeW1ib2woInRhbGsuVmlkZW9QbGF5Z3JvdW5kLnByb3RvdHlwZS5jaGFuZ2VSZXNvbHV0aW9uIiwgdGFsay5WaWRlb1BsYXlncm91bmQucHJvdG90eXBlLmNoYW5nZVJlc29sdXRpb24pOwpnb29nLmV2ZW50cy5LZXlIYW5kbGVyID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEtleUhhbmRsZXIkKG9wdF9lbGVtZW50LCBvcHRfY2FwdHVyZSkgewogIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0LmNhbGwodGhpcyk7CiAgb3B0X2VsZW1lbnQgJiYgdGhpcy5hdHRhY2gob3B0X2VsZW1lbnQsIG9wdF9jYXB0dXJlKQp9Owpnb29nLmluaGVyaXRzKGdvb2cuZXZlbnRzLktleUhhbmRsZXIsIGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KTsKZ29vZy5ldmVudHMuS2V5SGFuZGxlci5wcm90b3R5cGUuZWxlbWVudF8gPSBudWxsOwpnb29nLmV2ZW50cy5LZXlIYW5kbGVyLnByb3RvdHlwZS5rZXlQcmVzc0tleV8gPSBudWxsOwpnb29nLmV2ZW50cy5LZXlIYW5kbGVyLnByb3RvdHlwZS5rZXlEb3duS2V5XyA9IG51bGw7Cmdvb2cuZXZlbnRzLktleUhhbmRsZXIucHJvdG90eXBlLmtleVVwS2V5XyA9IG51bGw7Cmdvb2cuZXZlbnRzLktleUhhbmRsZXIucHJvdG90eXBlLmxhc3RLZXlfID0gLTE7Cmdvb2cuZXZlbnRzLktleUhhbmRsZXIucHJvdG90eXBlLmtleUNvZGVfID0gLTE7Cmdvb2cuZXZlbnRzLktleUhhbmRsZXIuRXZlbnRUeXBlID0ge0tFWToia2V5In07Cmdvb2cuZXZlbnRzLktleUhhbmRsZXIuc2FmYXJpS2V5XyA9IHszOmdvb2cuZXZlbnRzLktleUNvZGVzLkVOVEVSLCAxMjpnb29nLmV2ZW50cy5LZXlDb2Rlcy5OVU1MT0NLLCA2MzIzMjpnb29nLmV2ZW50cy5LZXlDb2Rlcy5VUCwgNjMyMzM6Z29vZy5ldmVudHMuS2V5Q29kZXMuRE9XTiwgNjMyMzQ6Z29vZy5ldmVudHMuS2V5Q29kZXMuTEVGVCwgNjMyMzU6Z29vZy5ldmVudHMuS2V5Q29kZXMuUklHSFQsIDYzMjM2Omdvb2cuZXZlbnRzLktleUNvZGVzLkYxLCA2MzIzNzpnb29nLmV2ZW50cy5LZXlDb2Rlcy5GMiwgNjMyMzg6Z29vZy5ldmVudHMuS2V5Q29kZXMuRjMsIDYzMjM5Omdvb2cuZXZlbnRzLktleUNvZGVzLkY0LCA2MzI0MDpnb29nLmV2ZW50cy5LZXlDb2Rlcy5GNSwgNjMyNDE6Z29vZy5ldmVudHMuS2V5Q29kZXMuRjYsIDYzMjQyOmdvb2cuZXZlbnRzLktleUNvZGVzLkY3LCA2MzI0Mzpnb29nLmV2ZW50cy5LZXlDb2Rlcy5GOCwgNjMyNDQ6Z29vZy5ldmVudHMuS2V5Q29kZXMuRjksIAo2MzI0NTpnb29nLmV2ZW50cy5LZXlDb2Rlcy5GMTAsIDYzMjQ2Omdvb2cuZXZlbnRzLktleUNvZGVzLkYxMSwgNjMyNDc6Z29vZy5ldmVudHMuS2V5Q29kZXMuRjEyLCA2MzI0ODpnb29nLmV2ZW50cy5LZXlDb2Rlcy5QUklOVF9TQ1JFRU4sIDYzMjcyOmdvb2cuZXZlbnRzLktleUNvZGVzLkRFTEVURSwgNjMyNzM6Z29vZy5ldmVudHMuS2V5Q29kZXMuSE9NRSwgNjMyNzU6Z29vZy5ldmVudHMuS2V5Q29kZXMuRU5ELCA2MzI3Njpnb29nLmV2ZW50cy5LZXlDb2Rlcy5QQUdFX1VQLCA2MzI3Nzpnb29nLmV2ZW50cy5LZXlDb2Rlcy5QQUdFX0RPV04sIDYzMjg5Omdvb2cuZXZlbnRzLktleUNvZGVzLk5VTUxPQ0ssIDYzMzAyOmdvb2cuZXZlbnRzLktleUNvZGVzLklOU0VSVH07Cmdvb2cuZXZlbnRzLktleUhhbmRsZXIua2V5SWRlbnRpZmllcl8gPSB7VXA6Z29vZy5ldmVudHMuS2V5Q29kZXMuVVAsIERvd246Z29vZy5ldmVudHMuS2V5Q29kZXMuRE9XTiwgTGVmdDpnb29nLmV2ZW50cy5LZXlDb2Rlcy5MRUZULCBSaWdodDpnb29nLmV2ZW50cy5LZXlDb2Rlcy5SSUdIVCwgRW50ZXI6Z29vZy5ldmVudHMuS2V5Q29kZXMuRU5URVIsIEYxOmdvb2cuZXZlbnRzLktleUNvZGVzLkYxLCBGMjpnb29nLmV2ZW50cy5LZXlDb2Rlcy5GMiwgRjM6Z29vZy5ldmVudHMuS2V5Q29kZXMuRjMsIEY0Omdvb2cuZXZlbnRzLktleUNvZGVzLkY0LCBGNTpnb29nLmV2ZW50cy5LZXlDb2Rlcy5GNSwgRjY6Z29vZy5ldmVudHMuS2V5Q29kZXMuRjYsIEY3Omdvb2cuZXZlbnRzLktleUNvZGVzLkY3LCBGODpnb29nLmV2ZW50cy5LZXlDb2Rlcy5GOCwgRjk6Z29vZy5ldmVudHMuS2V5Q29kZXMuRjksIEYxMDpnb29nLmV2ZW50cy5LZXlDb2Rlcy5GMTAsIEYxMTpnb29nLmV2ZW50cy5LZXlDb2Rlcy5GMTEsIApGMTI6Z29vZy5ldmVudHMuS2V5Q29kZXMuRjEyLCAiVSswMDdGIjpnb29nLmV2ZW50cy5LZXlDb2Rlcy5ERUxFVEUsIEhvbWU6Z29vZy5ldmVudHMuS2V5Q29kZXMuSE9NRSwgRW5kOmdvb2cuZXZlbnRzLktleUNvZGVzLkVORCwgUGFnZVVwOmdvb2cuZXZlbnRzLktleUNvZGVzLlBBR0VfVVAsIFBhZ2VEb3duOmdvb2cuZXZlbnRzLktleUNvZGVzLlBBR0VfRE9XTiwgSW5zZXJ0Omdvb2cuZXZlbnRzLktleUNvZGVzLklOU0VSVH07Cmdvb2cuZXZlbnRzLktleUhhbmRsZXIuVVNFU19LRVlET1dOXyA9IGdvb2cudXNlckFnZW50LklFIHx8IGdvb2cudXNlckFnZW50LldFQktJVCAmJiBnb29nLnVzZXJBZ2VudC5pc1ZlcnNpb24oIjUyNSIpOwpnb29nLmV2ZW50cy5LZXlIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGVLZXlEb3duXyA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRLZXlIYW5kbGVyJCRoYW5kbGVLZXlEb3duXyQoZSkgewogIGlmKGdvb2cudXNlckFnZW50LldFQktJVCAmJiAodGhpcy5sYXN0S2V5XyA9PSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5DVFJMICYmICFlLmN0cmxLZXkgfHwgdGhpcy5sYXN0S2V5XyA9PSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5BTFQgJiYgIWUuYWx0S2V5KSkgewogICAgdGhpcy5rZXlDb2RlXyA9IHRoaXMubGFzdEtleV8gPSAtMQogIH0KICBnb29nLmV2ZW50cy5LZXlIYW5kbGVyLlVTRVNfS0VZRE9XTl8gJiYgIWdvb2cuZXZlbnRzLktleUNvZGVzLmZpcmVzS2V5UHJlc3NFdmVudChlLmtleUNvZGUsIHRoaXMubGFzdEtleV8sIGUuc2hpZnRLZXksIGUuY3RybEtleSwgZS5hbHRLZXkpID8gdGhpcy5oYW5kbGVFdmVudChlKSA6IHRoaXMua2V5Q29kZV8gPSBnb29nLnVzZXJBZ2VudC5HRUNLTyA/IGdvb2cuZXZlbnRzLktleUNvZGVzLm5vcm1hbGl6ZUdlY2tvS2V5Q29kZShlLmtleUNvZGUpIDogZS5rZXlDb2RlCn07Cmdvb2cuZXZlbnRzLktleUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZUtleXVwXyA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRLZXlIYW5kbGVyJCRoYW5kbGVLZXl1cF8kKCkgewogIHRoaXMua2V5Q29kZV8gPSB0aGlzLmxhc3RLZXlfID0gLTEKfTsKZ29vZy5ldmVudHMuS2V5SGFuZGxlci5wcm90b3R5cGUuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkS2V5SGFuZGxlciQkaGFuZGxlRXZlbnQkKGUpIHsKICB2YXIgYmUgPSBlLmdldEJyb3dzZXJFdmVudCgpLCBrZXlDb2RlLCBjaGFyQ29kZTsKICBnb29nLnVzZXJBZ2VudC5JRSAmJiBlLnR5cGUgPT0gZ29vZy5ldmVudHMuRXZlbnRUeXBlLktFWVBSRVNTID8gKGtleUNvZGUgPSB0aGlzLmtleUNvZGVfLCBjaGFyQ29kZSA9IGtleUNvZGUgIT0gZ29vZy5ldmVudHMuS2V5Q29kZXMuRU5URVIgJiYga2V5Q29kZSAhPSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5FU0MgPyBiZS5rZXlDb2RlIDogMCkgOiBnb29nLnVzZXJBZ2VudC5XRUJLSVQgJiYgZS50eXBlID09IGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5LRVlQUkVTUyA/IChrZXlDb2RlID0gdGhpcy5rZXlDb2RlXywgY2hhckNvZGUgPSAwIDw9IGJlLmNoYXJDb2RlICYmIDYzMjMyID4gYmUuY2hhckNvZGUgJiYgZ29vZy5ldmVudHMuS2V5Q29kZXMuaXNDaGFyYWN0ZXJLZXkoa2V5Q29kZSkgPyBiZS5jaGFyQ29kZSA6IDApIDogZ29vZy51c2VyQWdlbnQuT1BFUkEgPyAoa2V5Q29kZSA9IHRoaXMua2V5Q29kZV8sIGNoYXJDb2RlID0gZ29vZy5ldmVudHMuS2V5Q29kZXMuaXNDaGFyYWN0ZXJLZXkoa2V5Q29kZSkgPyAKICBiZS5rZXlDb2RlIDogMCkgOiAoa2V5Q29kZSA9IGJlLmtleUNvZGUgfHwgdGhpcy5rZXlDb2RlXywgY2hhckNvZGUgPSBiZS5jaGFyQ29kZSB8fCAwLCBnb29nLnVzZXJBZ2VudC5NQUMgJiYgY2hhckNvZGUgPT0gZ29vZy5ldmVudHMuS2V5Q29kZXMuUVVFU1RJT05fTUFSSyAmJiBrZXlDb2RlID09IGdvb2cuZXZlbnRzLktleUNvZGVzLldJTl9LRVkgJiYgKGtleUNvZGUgPSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5TTEFTSCkpOwogIHZhciBrZXkgPSBrZXlDb2RlLCBrZXlJZGVudGlmaWVyID0gYmUua2V5SWRlbnRpZmllcjsKICBrZXlDb2RlID8gNjMyMzIgPD0ga2V5Q29kZSAmJiBrZXlDb2RlIGluIGdvb2cuZXZlbnRzLktleUhhbmRsZXIuc2FmYXJpS2V5XyA/IGtleSA9IGdvb2cuZXZlbnRzLktleUhhbmRsZXIuc2FmYXJpS2V5X1trZXlDb2RlXSA6IDI1ID09IGtleUNvZGUgJiYgZS5zaGlmdEtleSAmJiAoa2V5ID0gOSkgOiBrZXlJZGVudGlmaWVyICYmIGtleUlkZW50aWZpZXIgaW4gZ29vZy5ldmVudHMuS2V5SGFuZGxlci5rZXlJZGVudGlmaWVyXyAmJiAoa2V5ID0gZ29vZy5ldmVudHMuS2V5SGFuZGxlci5rZXlJZGVudGlmaWVyX1trZXlJZGVudGlmaWVyXSk7CiAgdmFyIHJlcGVhdCA9IGtleSA9PSB0aGlzLmxhc3RLZXlfOwogIHRoaXMubGFzdEtleV8gPSBrZXk7CiAgdmFyIGV2ZW50ID0gbmV3IGdvb2cuZXZlbnRzLktleUV2ZW50KGtleSwgY2hhckNvZGUsIHJlcGVhdCwgYmUpOwogIHRyeSB7CiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpCiAgfWZpbmFsbHkgewogICAgZXZlbnQuZGlzcG9zZSgpCiAgfQp9Owpnb29nLmV2ZW50cy5LZXlIYW5kbGVyLnByb3RvdHlwZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24gJGdvb2ckZXZlbnRzJEtleUhhbmRsZXIkJGdldEVsZW1lbnQkKCkgewogIHJldHVybiB0aGlzLmVsZW1lbnRfCn07Cmdvb2cuZXZlbnRzLktleUhhbmRsZXIucHJvdG90eXBlLmF0dGFjaCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRLZXlIYW5kbGVyJCRhdHRhY2gkKGVsZW1lbnQsIG9wdF9jYXB0dXJlKSB7CiAgdGhpcy5rZXlVcEtleV8gJiYgdGhpcy5kZXRhY2goKTsKICB0aGlzLmVsZW1lbnRfID0gZWxlbWVudDsKICB0aGlzLmtleVByZXNzS2V5XyA9IGdvb2cuZXZlbnRzLmxpc3Rlbih0aGlzLmVsZW1lbnRfLCBnb29nLmV2ZW50cy5FdmVudFR5cGUuS0VZUFJFU1MsIHRoaXMsIG9wdF9jYXB0dXJlKTsKICB0aGlzLmtleURvd25LZXlfID0gZ29vZy5ldmVudHMubGlzdGVuKHRoaXMuZWxlbWVudF8sIGdvb2cuZXZlbnRzLkV2ZW50VHlwZS5LRVlET1dOLCB0aGlzLmhhbmRsZUtleURvd25fLCBvcHRfY2FwdHVyZSwgdGhpcyk7CiAgdGhpcy5rZXlVcEtleV8gPSBnb29nLmV2ZW50cy5saXN0ZW4odGhpcy5lbGVtZW50XywgZ29vZy5ldmVudHMuRXZlbnRUeXBlLktFWVVQLCB0aGlzLmhhbmRsZUtleXVwXywgb3B0X2NhcHR1cmUsIHRoaXMpCn07Cmdvb2cuZXZlbnRzLktleUhhbmRsZXIucHJvdG90eXBlLmRldGFjaCA9IGZ1bmN0aW9uICRnb29nJGV2ZW50cyRLZXlIYW5kbGVyJCRkZXRhY2gkKCkgewogIHRoaXMua2V5UHJlc3NLZXlfICYmIChnb29nLmV2ZW50cy51bmxpc3RlbkJ5S2V5KHRoaXMua2V5UHJlc3NLZXlfKSwgZ29vZy5ldmVudHMudW5saXN0ZW5CeUtleSh0aGlzLmtleURvd25LZXlfKSwgZ29vZy5ldmVudHMudW5saXN0ZW5CeUtleSh0aGlzLmtleVVwS2V5XyksIHRoaXMua2V5VXBLZXlfID0gdGhpcy5rZXlEb3duS2V5XyA9IHRoaXMua2V5UHJlc3NLZXlfID0gbnVsbCk7CiAgdGhpcy5lbGVtZW50XyA9IG51bGw7CiAgdGhpcy5rZXlDb2RlXyA9IHRoaXMubGFzdEtleV8gPSAtMQp9Owpnb29nLmV2ZW50cy5LZXlIYW5kbGVyLnByb3RvdHlwZS5kaXNwb3NlSW50ZXJuYWwgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkS2V5SGFuZGxlciQkZGlzcG9zZUludGVybmFsJCgpIHsKICBnb29nLmV2ZW50cy5LZXlIYW5kbGVyLnN1cGVyQ2xhc3NfLmRpc3Bvc2VJbnRlcm5hbC5jYWxsKHRoaXMpOwogIHRoaXMuZGV0YWNoKCkKfTsKZ29vZy5ldmVudHMuS2V5RXZlbnQgPSBmdW5jdGlvbiAkZ29vZyRldmVudHMkS2V5RXZlbnQkKGtleUNvZGUsIGNoYXJDb2RlLCByZXBlYXQsIGJyb3dzZXJFdmVudCkgewogIGdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5jYWxsKHRoaXMsIGJyb3dzZXJFdmVudCk7CiAgdGhpcy50eXBlID0gZ29vZy5ldmVudHMuS2V5SGFuZGxlci5FdmVudFR5cGUuS0VZOwogIHRoaXMua2V5Q29kZSA9IGtleUNvZGU7CiAgdGhpcy5jaGFyQ29kZSA9IGNoYXJDb2RlOwogIHRoaXMucmVwZWF0ID0gcmVwZWF0Cn07Cmdvb2cuaW5oZXJpdHMoZ29vZy5ldmVudHMuS2V5RXZlbnQsIGdvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCk7CgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVmlkZW9QbGF5Z3JvdW5kL2luZGV4Lmh0bWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQAMDQwMTEwMgAwMDExNjEwADAwMDAwMDA2Mjc0ADExNzIxNTI3NDU3ADAxNTE1NwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAG5vYWhyaWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZW5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+CjxoZWFkPgogIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InZpZGVvcGxheWdyb3VuZC1qcy5qcyI+CiAgPC9zY3JpcHQ+CiAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgZ29vZy5yZXF1aXJlKCdnb29nLlVyaScpOwogICAgZ29vZy5yZXF1aXJlKCdnb29nLmV2ZW50cycpOwogICAgZ29vZy5yZXF1aXJlKCdnb29nLmV2ZW50cy5LZXlDb2RlcycpOwogICAgZ29vZy5yZXF1aXJlKCdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJyk7CiAgICBnb29nLnJlcXVpcmUoJ3RhbGsuVmlkZW9QbGF5Z3JvdW5kJyk7CiAgPC9zY3JpcHQ+CiAgPHRpdGxlPlZpZGVvIFBsYXlncm91bmQ8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IHN0eWxlPSJtYXJnaW46MDtwYWRkaW5nOjAiIG9ubG9hZD0ib25Mb2FkKCk7IiBvbnVubG9hZD0ib25VbmxvYWQoKTsiPgo8ZGl2IGlkPSJ2aWRlbyI+CjxkaXYgc3R5bGU9InBhZGRpbmctdG9wOjEwO3RleHQtYWxpZ246Y2VudGVyIj4KPGgzPkxvYWRpbmcgVmlkZW8gUGxheWdyb3VuZCAuLi48L2gzPgo8L2Rpdj4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KdmFyIHZpZGVvUGxheWdyb3VuZDsKCmZ1bmN0aW9uIG9uTG9hZCgpIHsKICB2YXIgdXJpID0gbmV3IGdvb2cuVXJpKHdpbmRvdy5sb2NhdGlvbik7CiAgdmFyIGRlYnVnID0gdXJpLmdldFBhcmFtZXRlclZhbHVlKCJkZWJ1ZyIpOwogIHZhciBvbmx5Rmxhc2ggPSB1cmkuZ2V0UGFyYW1ldGVyVmFsdWUoImZsYXNoIik7CiAgdmFyIGNhbGxUeXBlID0gdXJpLmdldFBhcmFtZXRlclZhbHVlKCJjYWxsVHlwZSIpOwogIHZhciBtdWx0aVZpZXcgPSB1cmkuZ2V0UGFyYW1ldGVyVmFsdWUoIm11bHRpVmlldyIpOwogIHZhciBsYW5nID0gdXJpLmdldFBhcmFtZXRlclZhbHVlKCJobCIpIHx8ICJlbiI7CiAgdmFyIGVuYWJsZU5vdGlmaWNhdGlvbnMgPSB1cmkuZ2V0UGFyYW1ldGVyVmFsdWUoImVuYWJsZU5vdGlmaWNhdGlvbnMiKTsKICB2YXIgcmVuZGVyTW9kZSA9IHVyaS5nZXRQYXJhbWV0ZXJWYWx1ZSgicmVuZGVyTW9kZSIpOwoKICAvLyBEZWZhdWx0IGlzIDMyMHgyMDB4MzBmcHMuCiAgdmFyIHdpZHRoID0gdXJpLmdldFBhcmFtZXRlclZhbHVlKCJ3aWR0aCIpIHx8IDMyMDsKICB2YXIgaGVpZ2h0ID0gdXJpLmdldFBhcmFtZXRlclZhbHVlKCJoZWlnaHQiKSB8fCAyMDA7CiAgdmFyIGZyYW1lcmF0ZSA9IHVyaS5nZXRQYXJhbWV0ZXJWYWx1ZSgiZnJhbWVyYXRlIikgfHwgMzA7CiAgaWYgKHVyaS5nZXRQYXJhbWV0ZXJWYWx1ZSgidmdhIikpIHsKICAgIHdpZHRoID0gNjQwOwogICAgaGVpZ2h0ID0gNDAwOwogICAgZnJhbWVyYXRlID0gMzA7CiAgfQoKICAvLyAicmVuZGVyV2lkdGgiLyJyZW5kZXJIZWlnaHQiIG92ZXJyaWRlIHZpZGVvIGRpdiBzaXplLgogIHZhciB2aWRlb0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlbyIpOwogIHZhciByZW5kZXJXaWR0aCA9IHVyaS5nZXRQYXJhbWV0ZXJWYWx1ZSgicmVuZGVyV2lkdGgiKTsKICBpZiAocmVuZGVyV2lkdGgpIHsKICAgIHZpZGVvRGl2LnN0eWxlLndpZHRoID0gcmVuZGVyV2lkdGg7CiAgfQogIHZhciByZW5kZXJIZWlnaHQgPSB1cmkuZ2V0UGFyYW1ldGVyVmFsdWUoInJlbmRlckhlaWdodCIpOwogIGlmIChyZW5kZXJIZWlnaHQpIHsKICAgIHZpZGVvRGl2LnN0eWxlLmhlaWdodCA9IHJlbmRlckhlaWdodDsKICB9CgogIHZpZGVvUGxheWdyb3VuZCA9IHRhbGsuVmlkZW9QbGF5Z3JvdW5kLmNyZWF0ZSh3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRGl2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5Rmxhc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aVZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU5vdGlmaWNhdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlck1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKTsKCiAgZ29vZy5ldmVudHMubGlzdGVuKAogICAgICBuZXcgZ29vZy5ldmVudHMuS2V5SGFuZGxlcihkb2N1bWVudCksCiAgICAgIGdvb2cuZXZlbnRzLktleUhhbmRsZXIuRXZlbnRUeXBlLktFWSwKICAgICAgZnVuY3Rpb24oZSkgewogICAgICAgIC8vIFVwL0Rvd24gbW92ZXMgdG8gdGhlIG5leHQgaGlnaGVyL2xvd2VyIHJlc29sdXRpb24uCiAgICAgICAgLy8gTW92aW5nIHVwIGRvdWJsZXMgdGhlIHdpZHRoL2hlaWdodCwgZG93biBoYWx2ZXMgdGhlbS4KICAgICAgICBpZiAoZS5rZXlDb2RlID09IGdvb2cuZXZlbnRzLktleUNvZGVzLlVQKSB7CiAgICAgICAgICB2aWRlb1BsYXlncm91bmQuY2hhbmdlUmVzb2x1dGlvbih2aWRlb1BsYXlncm91bmQuZ2V0V2lkdGgoKSAqIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1BsYXlncm91bmQuZ2V0SGVpZ2h0KCkgKiAyKTsKICAgICAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PSBnb29nLmV2ZW50cy5LZXlDb2Rlcy5ET1dOKSB7CiAgICAgICAgICB2aWRlb1BsYXlncm91bmQuY2hhbmdlUmVzb2x1dGlvbih2aWRlb1BsYXlncm91bmQuZ2V0V2lkdGgoKSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1BsYXlncm91bmQuZ2V0SGVpZ2h0KCkgLyAyKTsKICAgICAgICB9CiAgICAgIH0pOwp9OwoKZnVuY3Rpb24gb25VbmxvYWQoKSB7CiAgaWYgKHZpZGVvUGxheWdyb3VuZCkgewogICAgdmlkZW9QbGF5Z3JvdW5kLmRpc3Bvc2UoKTsKICAgIHZpZGVvUGxheWdyb3VuZCA9IG51bGw7CiAgfQp9Owo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=