Skip to content

Instantly share code, notes, and snippets.

@asnowfix
Created September 30, 2013 09:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save asnowfix/6761624 to your computer and use it in GitHub Desktop.
Save asnowfix/6761624 to your computer and use it in GitHub Desktop.
large form-data exhibit issue refered to by https://github.com/mscdex/busboy/issues/1
This file has been truncated, but you can view the full file.
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="README-CORDOVA-WEBOS.md"
Content-Type: application/octet-stream; x-encoding=base64
Q29yZG92YSB3ZWJPUyBJbnN0cnVjdGlvbnM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBTZXQgdXAgeW91ciBwcm9qZWN0IHRoZSBzYW1lIHdheSB5b3Ugd291bGQgc2V0IHVwIGFueSBvdGhlciBib290cGxhdGUgcHJvamVjdC4KLSBNb2RpZnkgeW91ciBpbmRleC5odG1sIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFzIG91dGxpbmVkIGluIHRoaXMgYmxvZyBwb3N0OiBbSmF2YVNjcmlwdCBBcHBzIGZvciBPcGVuIHdlYk9TIFdpdGggRW55byBhbmQgQ29yZG92YV0oaHR0cDovL2Jsb2cub3BlbndlYm9zcHJvamVjdC5vcmcvcG9zdC8zOTI3ODYxODI5OS9qYXZhc2NyaXB0LWFwcHMtZm9yLW9wZW4td2Vib3Mtd2l0aC1lbnlvLWFuZC1jb3Jkb3ZhKQotIENvcHkgYXBwaW5mby5qc29uIGZyb20gdGhlIFBob25lR2FwICdsaWIvd2Vib3MvZnJhbWV3b3JrJyBkaXJlY3RvcnkgYW5kIGEgY29yZG92YSBKYXZhU2NyaXB0IGZpbGUgZnJvbSB0aGUgUGhvbmVHYXAgJ2xpYi93ZWJvcy9saWInIGRpcmVjdG9yeQotIE1vZGlmeSBhcHBpbmZvLmpzb24gZm9yIHlvdXIgcHJvamVjdCBhbmQgYWRkIGFuIGljb24KLSBydW4gdG9vbHNcZGVwbG95LmJhdCAtLWNvcmRvdmEtd2Vib3Mgb3IgdG9vbHMvZGVwbG95LnNoIC0tY29yZG92YS13ZWJvcyB0byBkZXBsb3kgeW91ciBhcHAuCg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="README.md"
Content-Type: application/octet-stream; x-encoding=base64
VGlwQ2FsYwo9PT09PT09CgpCYXNlZCBvbiBib290cGxhdGUKClJlZmVyIHRvIHRoZSBbV2lraV0oaHR0cHM6Ly9naXRodWIuY29tL2VueW9qcy9lbnlvL3dpa2kvQm9vdHBsYXRlKSBmb3IgaG93IHRvIGdldCBzdGFydGVkLgoKCgpCdWlsZGluZyBmb3Igd2ViT1MKPT09PT09PT09PT09PT09PT09CgotIC4vdG9vbHMvZGVwbG95LnNoCi0gY3AgYXBwaW5mby5qc29uIGRlcGxveS9UaXBDYWxjCi0gY3AgZnJhbWV3b3JrX2NvbmZpZy5qc29uIGRlcGxveS9UaXBDYWxjCi0gY2QgZGVwbG95Ci0gcGFsbS1wYWNrYWdlIFRpcENhbGMKLSBwYWxtLWluc3RhbGwgY29tLnlkbS50aXBjYWxjXzEuMC4wX2FsbC5pcGsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="appinfo.json"
Content-Type: application/octet-stream; x-encoding=base64
ewogICJpZCI6ICJjb20uZXhhbXBsZXMuYXBwcy5teWFwcCIsCiAgInZlcnNpb24iOiAiMC4wLjEiLAogICJ2ZW5kb3IiOiAiTXkgQ29tcGFueSIsCiAgInR5cGUiOiAid2ViIiwKICAibWFpbiI6ICJpbmRleC5odG1sIiwKICAidGl0bGUiOiAiRXhhbXBsZTogTXkgQXBwbGljYXRpb24iLAogICJpY29uIjogImljb24ucG5nIiwKICAidWlSZXZpc2lvbiI6IDIKfQ==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="assets/enyo.png"
Content-Type: application/octet-stream; x-encoding=base64
iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAG21JREFUeNrsXWl0FNeZvVWtDSEQYCMWIRASYpVAIAwGBZABY+wEg3HsxB4nASeZnNgniX1m8iMzP2LPn/zImbGTcRzHcxLLx0kcExODdyCA2AQItIAWQGySQCCEEBJol7pr3lZVr3rTQsvdUteTy9XdVFdVv+9+97vfe6/eUzRNg13Ct6h2FdgAsIsNALvYALBLWJaIcPvBc7MeSia7TWRbJfa07CDbAbqvKNxfFU71oYRDFkCMnkl23yNbDtkyezm8hGx5ZHuXgKHEBsDQNPgYYeyNwsvHeI1/iorIqCh0d3fB5XJ5O6RJsMNOCgoCiCYbAEOL2j1/MPmDotD/4HA4EB0zgrxWQOvB6exBT3c3AUS3r68Pu1AxpAHQV2pXiKdTg6uqyl4zDJA/1aEyAPA60MCrQmMw6enphrOnB91dXfBRR8MiVAwpAAhql718jM/0Rhib7rnHE4Mrwvs5FRAGiCAAiDEMbOxJOKCvXWSj3+khQKCAoGDoJVTo7NBkAyDw1L5ReLpPaldVhXu7QxhfGJx9blA/3xhISAiIio42zmHUhaZxALh0ZtAMw1NwMEAQ3eAnVOQJ3RDyoSIkAUCMLgu4ZN/UToypqkzMKarC9+wz3dCqYXBFkQAAAYAIogGiY7iRBfub4YBsLrrnbCBvDAyi3rp7DxVVupAkYMizAXCP1M5pXRhX1aldf80NzmgfMhBkzzcZgIrAqJgY0+vF3vB6HQT0Txjd5XJ5gIHu6TmdIlT0dPcwQTkUQkXQANAfaje9WvJ0i/FVQ+jx14oZ/yWm4GEAQgNQoBAGGOEJAG9agLxhIYEb3mWwAweJy8oOIpzQjIICgbJDqIaKoACAGP+yX2q3GF2icpXHdd3Iqmp+Lh+nWt7Dg/41egy9DksDY9w0gGaAwGMzDK2DwWUJCTobyHtdcHJ28B8qCAimf9W2CFZTcLJPozOWNmO5TO+qZHgYhlY9gKBKHq9/rulMIIUCmgZGREZ6ZQBNAIIb3eUBCpf4nP67DgbFxd/T+3Hpe3EOKjgjyb1SzUH/jbIDBYQUKpKDYYiQ6AtQ9dxckTxelendNDb73KB88dqdGej5xPctws8Qg3o7gAOOiAiL+teZQN9AwWN4PTewHlY0jRhYIYZX6ef83C56PPV80bjEQEGOpwmFC2Z4iSDXpeCj52xvaw1a3QcdAIZBDMNzY3LD8jjtbni69wUICwikcCCngBp0EUjO45CqwNIeYFK4y/BsUwO4e7smgKBSRnADAn1P/kcDrskoLvN6wSxBBYCi/0mijQFAGN70bhkMYi8Mz71dBoSVDYxwophhBlIW4CsE0L1ucMWhCaqnhnMxz+deT0Hi5KCi1xNAgMIB4hJ6QyBdfMbpQFN48qmEMwAECsx4bwBAtbw2vJ4YjLGDw2EFjGIeyypa5ccpvP3XmgpSo7CwIzSAxACWNgABBiPtI2BQDXHn5J7OPlOYBmBsoTiZt+tez/ai4ZAa3wk+AIOdjwKFogBaeAPAI+67GZ9StCq8nhqMGpsCQE/j3EEDWTSK14Di0SCkM4AZAkz6VyQdoKouqU2As4Ci0zsVgU56TonqCQg0/Rq6qCVnpDhQ6XnofeoaI/j2D5EBIYpngw03qMOgeVWIOub9zOhEwAnjOxgg3MKELgBlBhBA0EQ4cDAR6JBCsQQCIxRwEciMZwg+Huep8GPGpmBwOg2jE41vDLXSDa9p4l6ELpCBGL4AUOT0T8/brR5tbNT4RDnLwFDEa0WEB/eGIYsAZGkhb0nURL2zLEAwgCYJQQ2mDjCyAWE4lQJC5UxAQ4HLyRlG0xuXaM5PqtUpgUDTHBwEvOHF1DzgYcHWAAIEqUmJqLp+wxMIwvMNPeD2mrGA6jBUPwUFdDbgXYNubQASAAio4N4bKOf8uiYQ52Yq3iU3KXPP11h2wXN6lWKHVC1lAoWFEQIFF00ZNcyYkojzNVeY84dCL0xE0K0vMcCTG9dj8uSJ2Lb9c5ScPc9jv2RkrgMcjLp5r5+DGV5xYwVjk8OKlCrqxSExgGF4PR3UeP6ux31qYKYDFM4AoJSv6X0O5Bgn92WX4jTTO+L5Ootkpc/B05sfRS0B+K/f+KOlQSrMRSCkBhoF05KT8PN/+xGuXLmG7Tt24dS5i1aqNwwsDO6g3h9hEYOQj3PrEdSkziA9dECSAJrRFCwagBTViPssjVNcPJ5TYUdCgIMpfNOMjOZJ2qir/czZs7F5w1okJU1i/36NMZxi9YHwbQfQWwM86yIpaTJe+slW1NZex45P9+N05SVhVIdhfO71Dt7/rzoMzzeOs7QDmINCNHEtSv8yALj4A2/okUMBE3sqS/MUSuXE8JqDm9sFSLFe1w4OzJ+VisfXr0Ri4kSPtg9LVhLuIlDfFB+KODFxEl780bNobr6L3fuOouDUWXSTvFtnBYcOCKELYGkTkPoJhPCC0fIoMgu3lkCzMcjs8WPxXTTiOIS7u2jod5g/gZYoAqgHMmZh3aolGB0f18vvDn4GEBohAEqf4mF8/Cg89cQ6PLJ6GfYeKsTJskp09biYDjBEoR4q3ECg6I1HUsoJlgYK8WjQtyY6A2n8V1njjyaafDWhI2isV3XWomGffD0qKhKL56ZhdXYmRo2O61vDV/DZP4TaAQwa6P3I0QQIT3wjB2tXPYC8/BIUVlwijOBiniwbXpFFodRVLDfOqJa+ADkTUIX3c/XP2/VpykevA9HoQwwfGYmsOdOxcul8jBoV25+mT2lvA8AUg/3wiVGjRmLDI9nIWZ6JwwXlKDpXjS6nyzS+QzUahQz6F20B0PNwB9+8hgBFDwMKS+X0oaC0HycyMgKZs6Yhe9GcfhjeLeopNgNYKHGghQLh0TVLsGJpOvILz6H4fA26nZolFJipoMPIOngWwEWkRQQCRv8/c3OVv6bSMYbE+AVpU7Ascxbi4mICgnrNZgBFpoABl7i4WCK+FrLt5OmLOFZRhdaObtPwqpsQBERfg6o7P78TpgEUo8OGvo6LjsKSudOwKH16YH6upRk43NsBBuGci+ensq24vAoFZ6+gpbPbMDzbiwvz5mOHgT+9DYA28ND7GhkTgwdmTUXmnKTA9nsgdEpIaAAzRw/seRfOS2ZbCQHByXO1bkCA2ZEkZwDkb2Q0UfUzE0kuP2XQfq8NAKv6G1Q6zJydxLbTlbU4eb4OrQQITOvrjUUiHR05IgpZaZOQnjb5KwF92ANArgT6etfew0ibmYKxY+MH5XrzqVeTrfTCdZRVN6CptZPpg3FE0KVPT8C81ImD+nubbjdjz/58C9CDDYNgDQtnF+VDsqIQFRXFmmUjyeuRsbEkr87CNx7NwZhBAoJert5oQjS5dtKksYN6neamO/hs90EcOFaE1rY29jg6GxVMtq7OTrS23GXHVRTuV8KKAbyVjq4u7D16AqfOXsQjOcuwdvWyQbtW0sSxiCYKfzDLvgMnsOvAMTQ0NrKnhhRbBPaukOn/m1tasf3LPBwrrsDG9auQMW8GhlIpO3MJO3cfxrX6m3AKw8tax9YAHhrQsz2AVtINEjf/tO1zTEuciGc2rsGECfeFtOFv1Dfi758dxOXa6+xpoFBS/CHMALySpk+eiCv1DUbroD5oWmPx+hZee+cj3tu2chFrAQyl0tLSjn8eKUFB6TnxtI/i0bZlZByKDQCvGHj8sdUkNYvAPz7bi4Y7Laz51TKYg2xFZy/hbHUdHpiXinWrFoXErf/zyGmcLL+AtvYOjw4nBQiZAaAhCgDFkg4tXpzBtj378vFF3nH06KOrpEfHugi1Hi27iAoChBULZyErIzUod15Udhn5py+g6W4r6ya2jjm0jvxVvLZ72ADwWR5evRxLsjLwz4MncLiw3PJvemi429aJ3QVnUFF1A9kLUpEydcJXcm9VV28iv/Qyakm853G+byDv/bOwBoBnhdBBIE9uWI3sBzKwjQira7eaLQ9T6QM7rt26g38cKkPKpDrkLErFuDFxg3KHt5tbcbD4Ii7XNTJlb9y24r9Dy4z9tB/CaTNAf8vEiePx0+8/iTPnqvBx3km0d/VYcSMquOrGbby7uxiZKZOwdG4SYmOjA3L99vYuFJy5gtLLdWxQiHdjKhgVG0OA4SBA8c0KoaYEhtRUsXNmJbNt94EiFFXWMH2geMkpS6tv4nxdM+YnJ+DB9HvrySsov4qy6np0dnXDVxNOdEQEli5Iw4olc/H7P39GAHB3IIRnA6Cvhar/5YvnYPeRUlSSeGytVy6+OnucKLxUT4BwB1mpCZg7fXy/rnGm6iaKL9bjbnunMSeAV1BOm4S1D87DyJExQ7Eqh+5k0XEjR2DzuiWorbuFfSfP40az90kWWjq6cPDMNcYIWanjMSXBf/9Cbf1dFBPgXL/dAn/9JJPvi8fKzBRMnjhuYD9AswEQkJI48T585xv3oeRMDU5U0j7/HmNol1zqmtrwefFVTLu/GQ/OTED8KKvHNt/tIN+/gepbLT49no4ViBsRjcUzJ/scK6BAsxkgGCVzzlTMnJZAtME1lNU0oNsHa9fcasWV41XInDoW6cn3sef3y6sbUVrT6MdLNURFqCSMTMaCmYmIHRHVi3Nrlsk/LM8c2gAYvBJLVPjXCC3Pm56Aw2VXUdPQYg705BbgQ79cGkpqbuPs9bsYEeVAl0CLSzKPPG9Q0v2jsXxeEsbGx97jHWohFwNCCACBq5Cx8XHYkD0bNddvI//sddxu7YLiEP0K9LEvhY/77yZC0SEyB934xhw+9Dwjo7F01iRMnTQmcMbWbAbwWVGH8guRlha4EUFTJ41lW9G56yipbmDPDfAn+QQI2Hh/yetF7I9yqFhAsobMtP6PEKKzgSkGebhM+g9RBITMmkG0noorKvHKr95AYVFZQM+9iHjxMytnY96UcfzJDjfjyMafkzgGT6+YNSDj6z9Ek6aDM8KJ5b3NAD5LU0sLfpf7ARYXluNfnn6MNQcHooyIicSKjClInzYOB8uvo6653ZgIkpYJ8SOwMn2KR3YwUDB7M3QoTswdIgDQDPWsvy05U4nzv76Kbz3+MB5cMj9w+mB0LDYuS8XFq40ouHATMUQELpk5AalT7gsQk5kzjUFiAqvxNRsAnnSoWSZqpoWOD/zLzj0oKq3Ed55ej1GjAtfJk0rCwZSE0YgfPTLgYJZnGnP/TfI0tLYG8ONFchp2rvoqfvW7v+LQ0VMBvU5MdGTA772jq9t8shjSjCOQdIAWOiEhpACQvWg+xsTFGXWk6U/lkjftnV34eP8xvPHODtTfbAw50NbfvI033/sE9bebTerXNAvbx5PfRn9jKIUANZQ8fvGiDPzXf/wEy2klSVO2Gt5DPOvKjQa89dcvsO9I6KzTdOBYKf6wbRe5t1vM++VFJ/Rt+ULy237xIrIWzrN4f1g/HeyeHtHqoA+D/PD5p7G4uBzv79iDFuL5bH5e1Zyrv51og33HT+NCdR02rVuKhPvHBuX+bzY0YefeE6ipuwmXs0ekli7L+gLxcbH41oY1WLhgTkhmAxGhwwC8EUUvC4mnpKRMxc7P89hIW0UYn863p1fwlfpbePP9XVieORvrVmR+pfe85/ApHD1dCafTaU4lb6wzxLcl8+dg0/qV1vmCQqw/IPhZgJ/UiLYBfPeZDVhG0sBtH+9DQ3MLm8EbYqpWPjmzivxTlbhwpR4bchYiafL4Qb3fq9ca8OnBEtQ3NpkLStD7EYtH0Iam8WNH46mv52BGSpL3H2zoAw1hP1k0IFeG95KWOg3/+fJWfPRpHg4XV7BJmumUrXziZj7r9k0ivnI/PozlGTOwJjsj4HfZ2tqB46cvsNHIlO4hrRoiLyS1IisdGx9d0QfA82JPF6+ZTtFboZNDLZg3A9u/OISGO618Aid98mVwRsgvvYDyqut4LHs+ZiQH5mnfC1V1+DK/FM2tbdAo5YvZQ+lQcDpGkHr/eMJWm9dlI2V6Yp/aCTS39gG7JbCPmjhl+hT8/IVnsCfvBA4XVaDbxefodzAw8MWgmu+24oM9BVg4cypWLp7FRg8N1OsPFZ1DceUVPjkkvRbdM+rnQIh0qFi9ZAHWrMjCUCwhoAGkNXv74REP5zyA+XNS8OEXh3HtVhMDAe/ng7EvrqzBxav1eHQAbEC9ftfRMtwhXk/nCGYqX1A9fRaAAmDy+LF4ct1yTJgwrn+MJzUUhTcANFMUDYQO6YOiL27ZiL0Hi3Ck5CyfL1AYX5/vv7mljbFBChGHG3Iye2UD6vWfEJF3ubbeXCFMV/qU8qnXR6jIzpzLJoYcCOD1hapDAQQRwba/USX3UBlrVi5CxpxkfLb/JC5du8knambz8YPFZ0Vz4GLtDbz1931YvywD6bOmej1P2bka7D5Wjo7ubonmzRXD6JaSmIDHVmUhYfzA2x40Wf2H+4ohhidornvqKE8YPw5bn16H4tLz+OxAEbqo10LM9s2Wb1PQToz50f5CnCKhYePqLIyK40O8WqjXk88vkRSP34vTnDJWpHqREQ58PScLmekz7vkHW0VgWKeBbqtyBKAuFmakkXg/GR9+mY9LhMZZu4GimEAgry9eqcPv3t9NaHwmmyLmKMkcOulK4B6LR3MAUK/fvG5Zv2cF9Q/44Bs/JDQAF4F8Sta33/0b4uJGImPB3Hs6LZ07YOtTDzM22JN/ij3coS/spM870N7hwr6CcsSIKWI0Y0yguVj06NgYrF02/969XpTS0rP4v/e2Ge0GoaACgzpJlALFWOhJFTN308kbn3zsYTz33JMBudZdkhLuOVTM5hWAPGk0xOrhFAAeS8a4sGj2dKzNXhgQr6flL3/dge2f72HGp83HTtGeQK/V1sofagnGJFFBBQAt8pp/fDkYPsnzjKlT8Iufv4Cx4wLT0XO2sho79h5HS3uH0QZHQWcyAOfnOOL1G1cvxey0qQG57u3GJvzqv9/ChZqrRhahG58WOmNYZ0dH+AKA3YSi8iXgHPoqIApbyyc2JgZbn9mMNWtXBIwNdh8sxMmKiwYDREsMsGhuKtatyAqY1+/dewS5H+xAa3u7YXy9BZGyUWc7nTKu2zg+nABAE+h3yGYk0vo6fopYHJKu56cvErVySRa+8+ymgLFBVfU1IhKPoLH5LqJiolnnDW3GnT5tUsC8/s/vf4yDJwoNb9dpn4LNSdLLdkL7Ut3TwQ1bCQBKwgIAAgT0aYtfku0l+XOHviikQ+gCsRBE4oTx+NHWZzAvfVbA7uHDT/IwenQcHn8kO2DnLC+rJGL2A9TW3zTonq0v2MO9nk4M2dnRLn/ldbK9SozfFDYi0A0ImwQbjJF1gcwA+gJRFBSbH12Db397Y2B+PDFIICeK/GDbp9j+5V7RSWRSvs4C7W1tYgYxVpqE1+8IuyzACwiSBQhyLCEhgq/rp8rrCBNWSE+bgZ++8N17DgmBAgCdA/i3v38PZecvitVEnWZvIanf7q4udJB4L9V1njB+VVimgX6A8IoIC5aQwJeMFRmCAASdy//Hzz+LBx9cFFQAFBwvwZu5fyNCr8NifD3et4u5gaVC6f6VUKlzJdSeVhEC8SOyJcuGokwg6wJ9QSgqEH/y4pagAOAN4vUHC4q44V0uq+eTPZ0EWqpf6u1PBEPoDSkASALxNbJZLKuDwKHrArFkXOL4+/HDLd/ut0AcKAAqKs7j7dxtQuhZjU7rs6uzg1C+Rejlku3lYAm9IQcAvwKRrvIREclDg8NcT5iGhG9ueAQbNjw8qAD45NO9+PDT3Wjr6LCkeC4xNpC26oWa0BuyAJAE4kcebQZi2VeHw1xClgJi3owU/IyEhL4IxP4AgOb2//vWeyglQk9zp3tSh3Tu//Y2j9z+iVAQekMaAH4Folj920wV+TYuPh7PP/fNXgViXwFwnAi9P/1lO27ducMHh7g0k/rJ1hHiQm9YAECAIEeEBEkgqoiIMBnAWG6eGHd9TjZ+8P1n7wkAf3znA3x5IN+geLk510lz+9YW9l4SepTy84ZKnQ4pAEgCkYJgk/QzECGtIUyBwBeHdmBywv3495/+gC1L3x8AVFddxf+88SfU3mzwMD5lgK4uD6G3Qxi/aSjV55ADgASELSJTsApEh7y8PN9GREfjqcfXY9Om9X0CwM6P9+Dvn+xiQk8fGCLn9h3WTpwmofBzh2I9DlkASG0GHp1KagRfVp63FYh1gsnrxRlz8eN/fc4QiO4AaLx1G2//8W8oKC2XHvzQDAbocToZ5YdCJ44NACsQKBO85C4QVbFkLB9zwIEwbvQovPzC82zUkQwAOlrn9Tdz0UiEnjEaWHg+HS1A++xpR45UXieGf3mo192wAIAkED+SQ4IxzkBiAkWs5rF+1dfwwgtbGAD+8Paf8UXeEeP5BP2RLz48DGhruSsLvSaR3uUNh3obNgDwJxBVNuxMlQDAV/JImzoFMTEjcOFqLTtSHghKC13mjbblD3WhFzYAkIDwkhCIFsGnSkvJa2IASnRMjNtUrhrTEe6jdYTQe3241dWwBIAvgahnCvpKI7QVMYoCAHxyR/6AiitkRut8FUXFMC3CYA+Bj7gxipHLa2ZOr89M0dPdReK9ReXT7z40XI0/rBnAjQ08OpV4phCB6BExjPJpo85Q6sSxATAwgUizhBwzHNDnAqJZw45U8oTKbwqHegkbAPgTiMNd6NkA8C4Q5VFHVQjB0To2AAY/JLwmeX5TONZD2ALALsM8DbSLDQC72ACwiw0Au9gAsIvvEtLrBoo+fl+lyVfeLvL8Mb0dK1JBubOoytswbrf78HWuZKldodd7tAHg3/CvkN3P3IzoXvLAO3vk770kvpfs5Zw0z/8N+EgePeenxt8vHfYq2V7xcq39vq4r+hle83ZNP9e1Q4Af49PK/mUvxvf2vXf8GUKcj553v/D8QNzrFrg9x+jvurYG6L1CqQfnDOB71Au39PFw6vUvBeBeqdHf6cdXMgWz2SHAT/me23vaMdPs49gqP9/bIWhXLzmwPlX0PR9U35+yxUtIotdsGuTrDmsAyIIsV8RkXxPyNrnRrF5KSKx9wt04xPumSUZLDsC9rnJ7760LeTCuGzZZQLUXkeZXBHoBhvv5ejt2gY+MotfiR+BV21lAiBaaogmVrjPIJvK+2A0Y7gDYabcDDK/yKqwDRPx5fJMITcOmhHJLIKVjfWCnt+3lALHA6300KjX+Q76o3k9qucBmgL6XEskDN4lKr/aTBZQECARbiQHfFSo9x02s5Qnaz3Uz/gG3lJW2L7iHh2mwPKRiyVxsAHgpv3HLrf3l9nmBpGPxqFee+0QU5POHfHwl1y3Fy+wlfNDyrh0C/Bshd6jEWNFnsLUfX8kNxVlD1BCs2K1CmFUNARDkCj2S5+cw+jteFb8r5Io9JjDMiz0ewAaAXWwA2MUGgF3Cs/y/AAMA3Vr2WgCSYnYAAAAASUVORK5CYII=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="assets/favicon.ico"
Content-Type: application/octet-stream; x-encoding=base64
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2sm9/1MyGf/ayb3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2sm9/1MyGf+SYj7/UzIZ/9rJvf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2sm9/1MyGf+WZ0T/ropv/864qf9TMhn/2sm9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2sm9/1MyGf+WZ0T/ropv///////OuKn/zrip/1MyGf/ayb3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2sm9/1MyGf+WZ0T/ropv///////Eqpf//////864qf/OuKn/UzIZ/9rJvf8AAAAAAAAAAAAAAAAAAAAAAAAAAFMyGf+WZ0T/ropv///////Eqpf/ropv/864qf//////zrip/864qf9TMhn/AAAAAAAAAAAAAAAAAAAAAAAAAABTMhn/lmdE///////Eqpf/ropv///////OuKn/zrip///////OuKn/UzIZ/wAAAAAAAAAAAAAAAAAAAAAAAAAAUzIZ/5ZnRP/Eqpf/ropv///////Eqpf//////864qf/OuKn/zrip/1MyGf8AAAAAAAAAAAAAAAAAAAAAAAAAAFMyGf+WZ0T/ropv///////Eqpf/ropv/864qf//////zrip/864qf9TMhn/AAAAAAAAAAAAAAAAAAAAAAAAAABTMhn/lmdE///////Eqpf/ropv///////OuKn/zrip/864qf/OuKn/UzIZ/wAAAAAAAAAAAAAAAAAAAAAAAAAAUzIZ/5ZnRP/Eqpf/ropv//////+uim///////864qf/OuKn/zrip/1MyGf8AAAAAAAAAAAAAAAAAAAAAAAAAAFMyGf+WZ0T/ropv//////+uim//kmI+/864qf//////zrip/864qf9TMhn/AAAAAAAAAAAAAAAAAAAAAAAAAABTMhn/lmdE//////+uim//kmI+/5JiPv/OuKn/zrip///////OuKn/UzIZ/wAAAAAAAAAAAAAAAAAAAAAAAAAAUzIZ/5NlQf+uim//lmdE/5ZnRP+WZ0T/zrip/864qf/OuKn/zrip/1MyGf8AAAAAAAAAAAAAAAAAAAAAAAAAANrJvf9TMhn/UzIZ/5hrSP+WZ0T/lmdE/864qf/OuKn/UzIZ/1MyGf/Eqpf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANrJvf9TMhn/UzIZ/1MyGf9TMhn/UzIZ/8Sql/8AAAAAAAAAAAAAAAAAAAAA/j8AAPwfAAD4DwAA8AcAAOADAADgAwAA4AMAAOADAADgAwAA4AMAAOADAADgAwAA4AMAAOADAADgAwAA+A8AAA==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="assets/resources/en.json"
Content-Type: application/octet-stream; x-encoding=base64
ewoJIkVYQUNUIjogIkVYQUNUIiwKCSJVUCI6ICJVUCIsCgkiRE9XTiI6ICJET1dOIgp9
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="assets/resources/fr.json"
Content-Type: application/octet-stream; x-encoding=base64
ewoJIkVYQUNUIjogIkV4YWN0IiwKCSJVUCI6ICJIYXV0IiwKCSJET1dOIjogIkJhcyIKfQ==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="debug.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgoJPGhlYWQ+CgkJPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlLGNocm9tZT0xIj4KCQk8dGl0bGU+VGlwQ2FsYzwvdGl0bGU+CgkJPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJhc3NldHMvZmF2aWNvbi5pY28iLz4KCQk8IS0tIC0tPgoJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0ZjgiLz4KCQk8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiBjb250ZW50PSJ5ZXMiLz4KCQk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCQk8IS0tIExlc3MuanMgKHVuY29tbWVudCBmb3IgY2xpZW50LXNpZGUgcmVuZGVyaW5nIG9mIGxlc3Mgc3R5bGVzaGVldHM7IGxlYXZlIGNvbW1lbnRlZCB0byB1c2Ugb25seSBDU1MpIC0tPgoJCTwhLS0gPHNjcmlwdCBzcmM9ImVueW8vdG9vbHMvbWluaWZpZXIvbm9kZV9tb2R1bGVzL2xlc3MvZGlzdC9sZXNzLTEuMy4wZS5taW4uanMiPjwvc2NyaXB0PiAtLT4KCQk8IS0tIGVueW8gKGRlYnVnKSAtLT4KCQk8c2NyaXB0IHNyYz0iZW55by9lbnlvLmpzIj48L3NjcmlwdD4KCQk8IS0tIGFwcGxpY2F0aW9uIChkZWJ1ZykgLS0+CgkJPHNjcmlwdCBzcmM9InNvdXJjZS9wYWNrYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPC9oZWFkPgoJPGJvZHkgY2xhc3M9ImVueW8tdW5zZWxlY3RhYmxlIj4KCQk8c2NyaXB0PgoJCQluZXcgRXguVGlwQ2FsYygpLnJlbmRlckludG8oZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuUGFsbVN5c3RlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5QYWxtU3lzdGVtLnN0YWdlUmVhZHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCTwvc2NyaXB0PgoJPC9ib2R5Pgo8L2h0bWw+Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="deploy.json"
Content-Type: application/octet-stream; x-encoding=base64
ewoJImVueW8iOiAiZW55byIsCgkic291cmNlIjogIi4iLAoJImFzc2V0cyI6IFsiaWNvbi5wbmciLCAiaW5kZXguaHRtbCIsICJhc3NldHMiXSwKCSJsaWJzIjogWyJsaWIvb255eCIsICJsaWIvbGF5b3V0Il0KfQ==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="deploy.md"
Content-Type: application/octet-stream; x-encoding=base64
IyBNaW5pZmljYXRpb24gYW5kIERlcGxveW1lbnQKIyMgVW5kZXJzdGFuZGluZyBhbmQgVXNpbmcgTWluaWZpY2F0aW9uCgpFbnlvIGNvbWVzIHdpdGggYSBtaW5pZmljYXRpb24gdG9vbCBiYXNlZCBvbiBVZ2xpZnlKUywgcnVuIGJ5IE5vZGUuanMuCgpUaGlzIHRvb2wgY2FuIGJlIHVzZWQgdG8gY29tcHJlc3MgdGhlIGZyYW1ld29yaywgb3RoZXIgbGlicmFyaWVzLCBhbmQgYXBwbGljYXRpb25zLCBhbmQgd2lsbCBrZWVwIGxvYWQgb3JkZXIgaW50YWN0IGFzIHdlbGwgYXMgY29ycmVjdCB1cmwgcGF0aHMgaW4gY3NzLgoKIyMjIFdoeSBjb21wcmVzcz8KCkNvbXByZXNzaW5nIGVueW8gYXBwcyBncmVhdGx5IHJlZHVjZXMgbG9hZCB0aW1lcyBvZiBhcHBsaWNhdGlvbnMsIGFzIHdlbGwgYXMgcmVkdWNpbmcgb3ZlcmFsbCBjb2RlIHNpemUuCgpUaGlzIHdheSwgeW91IGNhbiBiZSB2ZXJ5IHZlcmJvc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBzb3VyY2UgY29kZSwgd2l0aG91dCB0aGF0IGltcGFjdGluZyB0aGUgcGVyZm9ybWFuY2Ugb2YgeW91ciBhcHBsaWNhdGlvbiBpbiBwcm9kdWN0aW9uLgoKIyMjIFdoYXQgaXMgY29tcHJlc3NlZAoKRm9yIGVueW8sIHRoZSBsaWJyYXJpZXMsIGFuZCB5b3VyIGNvZGU6ICoqZXh0ZXJuYWwgYXNzZXRzIHN1Y2ggYXMgaW1hZ2VzIHdpbGwgbm90IGJlIGNvcGllZCBvciBtb3ZlZCoqLgoKSW5zdGVhZCwgdGhlIENTUyB1cmwgcGF0aHMgYXJlIGZpeGVkIHVwIHRvIHJlZmVyZW5jZSB0aGUgbmV3IHBhdGggZnJvbSB0aGUgYnVpbGQgbG9jYXRpb24uCgojIyMgSG93IHRvIGNvbXByZXNzCgpUbyBjb21wcmVzcyB5b3VyIGFwcGxpY2F0aW9uLCB5b3UgbXVzdCBydW4gdGhlIE5vZGUuanMgc2NyaXB0IG5hbWVkIGBkZXBsb3kuanNgIHRoYXQgY29tZXMgd2l0aCBFbnlvLCBhcyBgZW55by90b29scy9kZXBsb3kuanNgLgoKICAgICQgbm9kZSBlbnlvL3Rvb2xzL2RlcGxveS5qcyAtaAoKVGhpcyBzY3JpcHQgd2lsbCBydW4gdGhlIG1pbmlmaWNhdGlvbiB0b29sIGxvY2F0ZWQgaW4gYGVueW8vdG9vbHMvbWluaWZpZXIvbWluaWZ5LmpzYCwgYW5kIG1ha2UgYSBidWlsZCBvZiBlbnlvLCB0aGVuIGEgYnVpbGQgb2YgeW91ciBhcHAuCgpBbnkgbGlicmFyaWVzIHJlZmVyZW5jZWQgaW4geW91ciBgcGFja2FnZS5qc2AgbWFuaWZlc3Qgd2lsbCBiZSBidWlsdCBpbnRvIHlvdXIgYXBwJ3MgYnVpbHQgY29kZS4KCioqTk9URToqKiBgZGVwbG95LmpzYCBleHBlY3RzIHRvIGZpbmQgYSBgcGFja2FnZS5qc2AgaW4gdGhlIHJvb3QtZm9sZGVyIG9mIHlvdXIgYXBwbGljYXRpb24uIEl0IG9ubHkgcmVmZXJlbmNlcyB5b3VyIGFwcCdzIGBwYWNrYWdlLmpzYCB0byBrZWVwIHBhdGhzIGNvcnJlY3QuIERvIG5vdCBtb2RpZnkgdGhpcy4KCiMjIyBXaGF0IGNvbWVzIG91dD8KCkFmdGVyIHJ1bm5pbmcgdGhlIGBkZXBsb3kuanNgIHNjcmlwdCwgYSBuZXcgZm9sZGVyIGBidWlsZGAgKHlvdSBjaGFuZ2UgdGhpcyB1c2luZyB0aGUgYC1iYCBmbGFnIG9mIHRoZSBgZGVwbG95LmpzYCBzY3JpcHQpIHdpbGwgYmUgbG9jYXRlZCBuZXh0IHRvIHlvdXIgYHNvdXJjZWAgZGlyZWN0b3J5LgoKSW4gaXQgd2lsbCBiZSA0IGZpbGVzOgotIGVueW8uY3NzCi0gZW55by5qcwotIGFwcC5jc3MKLSBhcHAuanMKClRoZXNlIGZpbGVzIHdpbGwgYmUgbG9hZGVkIGluIHRoZSBnaXZlbiBvcmRlciBieSBgaW5kZXguaHRtbGAuCgpUaGUgb3V0cHV0IG9mIHRoZSBgZGVwbG95YCBzY3JpcHRzIHdpbGwgbWluaWZ5IHlvdXIgYXBwbGlhY3Rpb24sIGFuZCBjb3B5IHRoZSBuZWNlc3NhcnkgZmlsZXMgaW50byBgZGVwbG95LzxhcHBuYW1lPi9gLgoKSWYgdGhlIGxpYnJhcmllcyBoYXZlIGEgY29tcGF0aWJsZSBgZGVwbG95LnNoYCBvciBgZGVwbG95LmJhdGAgc2NyaXB0LCB0aGV5IHdpbGwgYmUgZXhlY3V0ZWQsIGFuZCBhIG1pbmltYWwgY29weSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgZGVwbG95bWVudCdzIGxpYiBmb2xkZXIuCgpJZiBubyBgZGVwbG95LihzaHxiYXQpYCBzY3JpcHQgaXMgZm91bmQgZm9yIHRoZSBsaWJyYXJ5LCBhbGwgb2YgdGhlIGxpYnJhcnkgaXMgY29waWVkIGludG8gdGhlIGxpYiBmb2xkZXIgdG8gcHJvdmlkZSBtYXhpbXVtIHNhZmV0eS4KCklmIHlvdSBhcmUgYWRkaW5nIGEgbGlicmFyeSwgcGxlYXNlIGFkZCBhIGBkZXBsb3kuc2hgIGZpbGUgYW5kIGBkZXBsb3kuYmF0YCBmaWxlIHNpbWlsYXIgdG8gdGhlIG9uZXMgaW4gYGxpYi9vbnl4YC4KCklmIG5vIGltYWdlcyBvciBmaWxlcyBhcmUgbmVlZGVkIGZyb20gdGhlIGxpYnJhcnksIGp1c3QgaW5jbHVkZSBibGFuayAoYW5kIGV4ZWN1dGFibGUpIGNvcGllcyBvZiB0aGUgZGVwbG95IHNjcmlwdHMuCg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/CONTRIBUTING.md"
Content-Type: application/octet-stream; x-encoding=base64
IyBDb250cmlidXRpb25zCgpDb250cmlidXRpb25zIGFyZSB3ZWxjb21lIGZvciBFbnlvIGFuZCBpdHMgYXNzb2NpYXRlZCBsaWJyYXJpZXMgaW5jbHVkaW5nIG9ueXggYW5kIGxheW91dC4KClBsZWFzZSBzZWUgW0NvbnRyaWJ1dGluZyB0byBFbnlvXShodHRwOi8vZW55b2pzLmNvbS9jb21tdW5pdHkvY29udHJpYnV0ZS8pIGZvciBkZXRhaWxzCm9uIG91ciBjb250cmlidXRpb24gcG9saWN5IGFuZCBndWlkZWxpbmVzIGZvciB1c2Ugb2YgdGhlIEVueW8tRENPLTEuMS1TaWduZWQtb2ZmLWJ5CmxpbmUgaW4geW91ciBjb21taXRzIGFuZCBwdWxsIHJlcXVlc3RzLgoKV2UgaGF2ZSBhIGJyaWVmCltFbnlvIEpTIHN0eWxlIGd1aWRlXShodHRwczovL2dpdGh1Yi5jb20vZW55b2pzL2VueW8vd2lraS9TdHlsZS1HdWlkZSkKZm9yIGNvZGUgZ29pbmcgaW50byB0aGUgcmVwby4gV2UndmUgcmVjZW50bHkgYWRkZWQgLmpzaGludHJjCmZpbGVzIHRvIHRoZSByb290IG9mIHRoZSB2YXJpb3VzIGNvZGUgYmFzZXMsIGFuZCBhc2sgdGhhdCB5b3UgbWFrZSB5b3VyIGNvZGUKcmVhc29uYWJsZSBjbGVhbiB0byB0aGUgW0pTIEhpbnRdKGh0dHA6Ly9qc2hpbnQuY29tLykgdG9vbCBiZWZvcmUgc3VibWl0dGluZy4KV2Uga25vdyB0aGF0IHRoZXJlIGFyZSBpc3N1ZXMgc29tZXRpbWVzIHdpdGggaG93IGpzaGludCBoYW5kbGVzIGluZGVudGF0aW9uCmxldmVscyB3aXRoIEpTIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFmZmVjdCBraW5kIGRlZmluaXRpb25zLCBzbyB3ZSBnaXZlIGEKbGl0dGxlIGxlZXdheS4KCklmIHlvdSdyZSBpbnRlcmVzdGVkIGluIGludHJvZHVjaW5nIG5ldyBraW5kcywgeW91IG1pZ2h0IGFsc28gY29uc2lkZXIgaG9zdGluZwp5b3VyIG93biByZXBvIGFuZCBjb250cmlidXRpbmcgdG8gdGhlIFtFbnlvIGNvbW11bml0eSBnYWxsZXJ5XShodHRwOi8vZW55b2pzLmNvbS9nYWxsZXJ5KS4K
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/LICENSE-2.0.txt"
Content-Type: application/octet-stream; x-encoding=base64
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4K
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/README.md"
Content-Type: application/octet-stream; x-encoding=base64
IyMjIExvb2tpbmcgZm9yIHRoZSBpc3N1ZSB0cmFja2VyPwpJdCdzIG1vdmVkIHRvIFtodHRwczovL2VueW9qcy5hdGxhc3NpYW4ubmV0XShodHRwczovL2VueW9qcy5hdGxhc3NpYW4ubmV0KS4KCi0tLQoKIyBRdWljayBJbmZvCgojIyBDb3JlCgpUaGlzIHJlcG9zaXRvcnkgY29udGFpbnMgRW55byBjb3JlLiBXZSd2ZSBwYXJlZCBpdCBkb3duIHRvIHRoZSBlc3NlbnRpYWxzLCBzbyBmb2xrcyBjYW4gd29yayBhdCB0aGUgbWV0YWwuIFdpZGdldCBsaWJyYXJpZXMsIGcxMW4gY29kZSwgYW5kIG90aGVyIGZhbmN5IGJpdHMgYXJlIG9wdGlvbmFsIHBhY2thZ2VzLgoKIyMgTGliCgpQYWNrYWdlcyBzaG91bGQgZ28gaW4gYSBmb2xkZXIgbmFtZWQgX2xpYl8gKGUuZy4gdGhlIF9leHRyYV8gb3IgX2NhbnZhc18gcmVwb3NpdG9yaWVzIG9uIEdpdEh1YikuIF9saWJfIGlzIGEgbWFnaWMgbmFtZSB0aGF0IGVueW8gdXNlcyB0byB3b3JrIHdpdGggYWRkLW9uIHBhY2thZ2VzLiBJdCdzIHJlY29tbWVuZGVkIHlvdSBjcmVhdGUgYSBfbGliXyBmb2xkZXIgYXMgc2libGluZyB0byBfZW55b18gYW5kIGtlZXAgeW91ciBwYWNrYWdlcyB0aGVyZSwgYnV0IHlvdSBjYW4gbWFrZSBhcyBtYW55IF9saWJfIGZvbGRlcnMgYXMgeW91IGxpa2UgYW5kIHB1dCB0aGVtIGFueXdoZXJlLgoKIyMgV2FybmluZyBhYm91dCBmaWxlOi8vCgpfTm90ZV86IGluIENocm9tZSwgdmFyaW91cyBzYW1wbGVzIHdpbGwgbm90IHdvcmsgZnJvbSBmaWxlOi8vIGJlY2F1c2Ugb2YgQ2hyb21lJ3Mgc2VjdXJpdHkgcG9saWN5LiBSdW4gZnJvbSBhIGxvY2FsIGh0dHAgc2VydmVyLCB1c2UgdGhlIC0tYWxsb3ctZmlsZS1hY2Nlc3MtZnJvbS1maWxlcyBpbiBDaHJvbWUsIG9yIHVzZSB0aGUgb25saW5lIHZlcnNpb25zIGF0IGh0dHA6Ly9lbnlvanMuY29tLgoKIyBXaGF0IElzIEVueW8KCkVueW8gaXMgYW4gb2JqZWN0LW9yaWVudGVkIEphdmFTY3JpcHQgYXBwbGljYXRpb24gZnJhbWV3b3JrIGVtcGhhc2l6aW5nIG1vZHVsYXJpdHkgYW5kIGVuY2Fwc3VsYXRpb24uIEVueW8gaXMgc3VpdGFibGUgZm9yIHNtYWxsIGFuZCBsYXJnZS1zY2FsZSBhcHBsaWNhdGlvbnMuCgpFbnlvIHVwIHRvIDEueCB3YXMgdGhlIHVuZGVybHlpbmcgZnJhbWV3b3JrIHVzZWQgdG8gZGV2ZWxvcCBhcHBsaWNhdGlvbnMgZm9yIEhQJ3MgVG91Y2hQYWQgdGFibGV0LiBFbnlvIGFzIHNoaXBwZWQgb24gdGhlIFRvdWNoUGFkIGluY2x1ZGVkIGFuIGNvbXBsZXRlIHNldCBvZiB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIGFuZCBzZXJ2aWNlIHdyYXBwZXJzLiBXaGF0IHlvdSB3aWxsIGZpbmQgaGVyZSBpcyBFbnlvIDIsIHdoYXQgd2UgaW5mb3JtYWxseSBjYWxsIF9jb3JlXzogdGhlIHByaW1hcnkgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHN1cHBvcnQgYW55IG51bWJlciBvZiBFbnlvLWJhc2VkIGxpYnJhcmllcy4gTm90IHRvIHdvcnJ5LCBFbnlvIDEueCBpdHNlbGYgaXMgb3Blbi1zb3VyY2UgbGljZW5zZWQsIGFuZCB3b3JrIGlzIHByb2dyZXNzaW5nIG9uIHBhY2thZ2luZyB1cCB0aG9zZSBjb250cm9scyBhbmQgZ29vZGllcyB0byB3b3JrIHdpdGggRW55byAyLgoKRW55byB3YXMgZGVzaWduZWQgZnJvbSB0aGUgYmVnaW5uaW5nIHRvIGJlIGhpZ2hseSBleHRlbnNpYmxlLiBUaGlzIHJlcG9zaXRvcnkgcmVmbGVjdHMgYSBzbWFsbCB3b3JraW5nIHNldCBvZiBjb2RlLCB0aGF0IGNhbiBiZSBleHBhbmRlZCB3aXRoIGFueSBudW1iZXIgb2YgbGlicmFyaWVzIG9yIHBsdWdpbnMuCgpFbnlvIDIgaXMgbGlnaHR3ZWlnaHQsIGVhc3kgdG8gZGlnZXN0LCBhbmQgcG93ZXJmdWwuCgojIFdoYXQgRG8gSSBHZXQKClRoZSBjb3JlIGNvZGUgaW5jbHVkZXMgdGhlIEVueW8ga2VybmVsLCB0aGUgRE9NIGV4dGVuc2lvbnMsIHNvbWUgQWpheCAoWEhSKSB0b29scywgYW5kIGJhc2ljIHdyYXBwZXIga2luZHMgZm9yIGEgbG90IG9mIERPTSBmb3JtIGVsZW1lbnRzLiBUaGVzZSB0aGluZ3MgYXJlIGFjdHVhbGx5IHNlcGFyYWJsZSAoaXQncyBlYXN5IHRvIG1ha2UgbWljcm8tYnVpbGRzIG9mIEVueW8pLCBidXQgd2UgYmVsaWV2ZSB0aGlzIGlzIGEgdXNlZnVsIHdvcmtpbmcgc2V0LgoKVGhlIEVueW8gMiBrZXJuZWwgcHJvdmlkZXMgYSBtb2R1bGFyaXR5IGNvbmNlcHQgKENvbXBvbmVudCkgYW5kIGEgdmlldyBjb25jZXB0IChVaUNvbXBvbmVudCkuIFRoZSBET00gYXNwZWN0IGluY2x1ZGVzIGEgd2lkZ2V0IGNvbmNlcHQgKENvbnRyb2wpIGFuZCBhbiBleHRlbnNpYmxlIGV2ZW50IHN5c3RlbSAoRGlzcGF0Y2hlcikuIFRoZSBBamF4IHBhY2thZ2UgaW5jbHVkZXMgYmFzaWMgeGhyIGZ1bmN0aW9uYWxpdHkgYW5kIGFuIGltcGxlbWVudGF0aW9uIG9mIHhociBhcyBhIENvbXBvbmVudCAoQWpheCkuICBUaGUgdG91Y2ggcGFja2FnZSBwcm92aWRlcyBwbGF0Zm9ybS1vcHRpbWl6ZWQgc2Nyb2xsZXJzLCB3aGlsZSB0aGUgVUkgcGFja2FnZSBwcm92aWRlcyBiYXNlIGtpbmRzIGZvciBjb21tb24gY29udHJvbHMgbGlrZSBidXR0b25zIGFuZCBwb3B1cHMuCgpKdXN0IHRoZXNlIHBpZWNlcyBhcmUgc3VmZmljaWVudCB0byBjcmVhdGUgbGFyZ2UgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBFbnlvIGVuY2Fwc3VsYXRpb24gbW9kZWwuIERldmVsb3BlcnMgdGhhdCB3YW50IG9ubHkgdGhpcyBsb3ctbGV2ZWwgY29kZSBhcmUgZW5jb3VyYWdlZCB0byByb2xsLXRoZWlyLW93bi4gRm9yIHRob3NlIHRoYXQgd2FudCBhIHJpY2hlciBzZXQgb2YgdG9vbHMsIHRoZXJlIGFyZSBzb21lIHByZS1idWlsdCBsaWJyYXJpZXMgYWxyZWFkeSBhdmFpbGFibGUsIGFuZCBtdWNoIG1vcmUgb24gdGhlIHdheS4KCiMgV2h5IERvIEkgQ2FyZQoKRmlyc3QgaXMgb3VyIGVtcGhhc2lzIG9uIGNyb3NzLXBsYXRmb3JtOiBFbnlvIGNvcmUgd29ya3Mgb24gYm90aCBkZXNrdG9wIGFuZCBtb2JpbGUgYnJvd3NlcnMuCgpTZWNvbmQgaXMgRW55bydzIGJ1aWxkaW5nIGJsb2NrIGFwcHJvYWNoIHRvIGFwcGxpY2F0aW9ucy4gRWFjaCBwaWVjZSBvZiBhbiBhcHBsaWNhdGlvbiBpcyBhIENvbXBvbmVudCwgYW5kIENvbXBvbmVudHMgYXJlIGNvbnN0cnVjdGVkIG91dCBvZiBvdGhlciBDb21wb25lbnRzLgoKRm9yIGV4YW1wbGUsIGl0J3MgZWFzeSB0byBkZWZpbmUgYSBjb21iaW5hdGlvbiBvZiBhbiBgPGlucHV0PmAgdGFnIHdpdGggYSBgPGxhYmVsPmAgdGFnIGludG8gb25lIF9MYWJlbGVkSW5wdXRfIENvbXBvbmVudC4KCk5vdyBJIGNhbiB1c2UgKGFuZCByZS11c2UpIExhYmVsZWRJbnB1dCBhcyBvbmUgYXRvbWljIHBpZWNlLgoKQnV0IHRoYXQncyBqdXN0IHRoZSBiZWdpbm5pbmcuIFVsdGltYXRlbHksIGxhcmdlIHBpZWNlcyBvZiBmdW5jdGlvbmFsaXR5IGNhbiBiZSBleHBvc2VkIGFzIHNpbmdsZSBDb21wb25lbnRzLCBmb3IgZXhhbXBsZSBhIGZhbmN5IHJlcG9ydCBnZW5lcmF0b3IsIG9yIGEgY29sb3IgcGlja2VyLCBvciBhbiBlbnRpcmUgcGFpbnRpbmcgYXBwbGljYXRpb24uCgpVc2UgdGhlIEVueW8gZW5jYXBzdWxhdGlvbiBtb2RlbCB0byBkaXZpZGUgYW5kIGNvbnF1ZXIgbGFyZ2UgcHJvamVjdHMuIE5vIHBhcnRpY3VsYXIgcGllY2Ugb2YgYW4gYXBwbGljYXRpb24gbmVlZCBiZSBlc3BlY2lhbGx5IGNvbXBsZXguIEJlY2F1c2UgY29tYmluaW5nIHBpZWNlcyBpcyBjZW50cmFsLCBpdCdzIG5hdHVyYWwgdG8gZmFjdG9yIGNvbXBsZXggc2VjdGlvbnMgaW50byBzbWFsbGVyIHBpZWNlcy4gQW5kIGJlY2F1c2Ugb2YgdGhlIG1vZHVsYXJpdHksIGFsbCB0aGVzZSBwaWVjZXMgdGVuZCB0byBiZSByZXVzYWJsZSwgaW4gdGhlIHNhbWUgcHJvamVjdCwgaW4gb3RoZXIgcHJvamVjdHMsIG9yIGV2ZW4gZm9yIHRoZSBwdWJsaWMgYXQgbGFyZ2UuCgpUaGlzIGlzIGFsbCBwYXJ0IG9mIG91ciBzdHJhdGVneSB0byBhbGxvdyBkZXZlbG9wZXJzIHRvIGZvY3VzIG9uIGNyZWF0aXZpdHkgYW5kIGF2b2lkIFJlcGVhdGluZyBUaGVtc2VsdmVzLgoKIyBUaGF0J3MgYSBMb3Qgb2YgVGFsawoKVGhlIGNvcmUgRW55byBkZXNpZ24gd2FzIHByb3ZlbiBvdXQgYnkgdGhlIGNvbXBsZXggYXBwbGljYXRpb25zIEhQIGRldmVsb3BlZCBmb3IgdGhlIFRvdWNoUGFkIHBsYXRmb3JtLiBXZSBkb24ndCBjbGFpbSB0aGlzIHdhcyBwYXJ0aWN1bGFybHkgZWFzeSwgdGhlcmUgd2VyZSBhIGxvdCBvZiBoYXJkd29ya2luZyBkZXZlbG9wZXJzIG9uIHRoZSBhcHBzIHRlYW1zLCBidXQgd2UgYXJlIGNvbmZpZGVudCB0aGUgRW55byBwcmluY2lwbGVzIGFyZSBlZmZlY3RpdmUgb24gYSBsYXJnZSBzY2FsZS4KCkluIGFueSBjYXNlLCByb2xsIHlvdXIgc2xlZXZlcyB1cCBhbmQgdHJ5IGl0IGZvciB5b3Vyc2VsZi4KCiMgR2l2ZSBtZSB0aGUgQmFzaWNzCgpIZXJlIGlzIGFuIEVueW8gSGVsbG8gV29ybGQ6CgpgYGBodG1sCjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+RW55bzwvdGl0bGU+Cgk8c2NyaXB0IHNyYz0iZW55b2pzLzIuMi4wL2VueW8uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8bGluayBocmVmPSJlbnlvanMvMi4yLjAvZW55by5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+CjwvaGVhZD4KPGJvZHk+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJbmV3IGVueW8uQ29udHJvbCh7Y29udGVudDogIkhlbGxvIEZyb20gRW55byJ9KS5yZW5kZXJJbnRvKGRvY3VtZW50LmJvZHkpOwoJPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgpgYGAKClRoaXMgZXhhbXBsZSBsb2FkcyBhbiBlbnlvLmpzIGJ1aWxkIGZyb20gX2VueW9qcy8yLjIuMC9fLiBJZiB5b3UgZG93bmxvYWRlZCB0aGUgU0RLIHlvdSBoYXZlIGEgdmVyc2lvbmVkIGJ1aWxkIGZpbGUuIElmIHlvdSBwdWxsZWQgZnJvbSBHaXRIdWIsIHlvdSBjYW4gZWl0aGVyIG1ha2UgeW91ciBvd24gYnVpbGQgdXNpbmcgYSBtaW5pZnkgc2NyaXB0IGluIF9lbnlvL3NvdXJjZS9taW5pZnlfIChyZXF1aXJlcyBOb2RlKSwgb3IgeW91IGNhbiBsb2FkIGRpcmVjdGx5IGZyb20gdGhlIHNvdXJjZSAoX2VueW8vc291cmNlL2VueW8uanNfKS4gTG9hZGluZyBmcm9tIHNvdXJjZSBpcyBhbHNvIGNhbGxlZCAnZGVidWcgbG9hZGluZycgYmVjYXVzZSB0aGUgbW9kdWxlcyBhcmUgbG9hZGVkIGFzIGluZGl2aWR1YWwgZmlsZXMsIHdoaWNoIGlzIGVhc2llciBmb3IgZGVidWdnaW5nLCBidXQgbXVjaCBsZXNzIGVmZmljaWVudC4KClRoZSBiYXNlIGVueW8uQ29udHJvbCB3b3JrcyBtdWNoIGxpa2UgYW4gSFRNTCB0YWcuIFlvdSBjYW4gYXNzaWduIF9jbGFzc2VzXyBhbmQgX2F0dHJpYnV0ZXNfIGFuZCBnaXZlIGl0IGEgX3N0eWxlXy4gRS5nLgoKYGBgamF2YXNjcmlwdApuZXcgZW55by5Db250cm9sKHtjb250ZW50OiAiSGVsbG8gRnJvbSBFbnlvIiwgY2xhc3NlczogImZvbyIsIHN0eWxlOiAiY29sb3I6IHJlZCIsCiAgICAgIGF0dHJpYnV0ZXM6IHt0YWJJbmRleDogMH19KS5yZW5kZXJJbnRvKGRvY3VtZW50LmJvZHkpOwpgYGAKCnByb2R1Y2VzCgpgYGBodG1sCjxkaXYgY2xhc3M9ImZvbyIgc3R5bGU9ImNvbG9yOiByZWQ7IiB0YWJJbmRleD0iMCI+SGVsbG8gRnJvbSBFbnlvPC9kaXY+CmBgYAoKTm93LCB0aGUgZ29vZCBwYXJ0cyBzdGFydCB3aGVuIHlvdSBjb21iaW5lIG1vcmUgdGhhbiBvbmUgQ29udHJvbCwgZS5nLgoKYGBgamF2YXNjcmlwdApuZXcgZW55by5Db250cm9sKHsKCWNvbXBvbmVudHM6IFsKCQl7Y29udGVudDogIkhlbGxvIEZyb20gRW55byJ9LAoJCXt0YWc6ICJociJ9CgldCn0pLnJlbmRlckludG8oZG9jdW1lbnQuYm9keSk7CmBgYAoKVGhpcyBDb250cm9sIG5vdyBlbmNhcHN1bGF0ZXMgdHdvIENvbnRyb2xzIGludG8gb25lIHNjb3BlICh3ZSBjYW4gZW5jYXBzdWxhdGUgYW55IHR5cGUgb2YgQ29tcG9uZW50LCB0aGF0J3Mgd2h5IHRoZSBwcm9wZXJ0eSBpcyBjYWxsZWQgX2NvbXBvbmVudHNfLiBDb250cm9scyBhcmUgb25lIGtpbmQgb2YgQ29tcG9uZW50LikgVGhlIG91dGVyIENvbnRyb2wgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBlbmNhcHN1bGF0ZWQgY29tcG9uZW50czogaXQgbWFuYWdlcyB0aGVpciBsaWZlY3ljbGUsIGxpc3RlbnMgdG8gdGhlaXIgbWVzc2FnZXMsIGFuZCBtYWludGFpbnMgcmVmZXJlbmNlcyB0byB0aGVtLiBGb3IgZXhhbXBsZToKCmBgYGphdmFzY3JpcHQKbmV3IGVueW8uQ29udHJvbCh7Cgljb21wb25lbnRzOiBbCgkJe25hbWU6ICJoZWxsbyIsIGNvbnRlbnQ6ICJIZWxsbyBGcm9tIEVueW8iLCBvbnRhcDogImhlbGxvVGFwIn0sCgkJe3RhZzogImhyIn0KCV0sCgloZWxsb1RhcDogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLmhlbGxvLmFkZFN0eWxlcygiY29sb3I6IHJlZCIpOwoJfQp9KS5yZW5kZXJJbnRvKGRvY3VtZW50LmJvZHkpOwpgYGAKCkhlcmUgd2UndmUgZ2l2ZW4gb25lIG9mIHRoZSBjb21wb25lbnRzIGEgbmFtZSAoJ2hlbGxvJykgYW5kIHRvbGQgaXQgdG8gc2VuZCBhICdoZWxsb1RhcCcgbWVzc2FnZSB3aGVuIGl0J3MgdGFwcGVkICh0YXAgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHRoZSBET00gY2xpY2sgZXZlbnQsIGJ1dCBpdCB3b3JrcyBpbiBib3RoIG1vdXNlIGFuZCB0b3VjaCBlbnZpcm9ubWVudHMpLiBUaGUgJyQnIHByb3BlcnR5IGlzIGEgaGFzaCB0aGF0IHJlZmVyZW5jZXMgYWxsIHRoZSBzdWItY29tcG9uZW50cyAod2UgZG9uJ3Qgc3RvcmUgdGhlc2UgcmVmZXJlbmNlcyBkaXJlY3RseSBvbiBfdGhpc18gdG8gYXZvaWQgbmFtZSBjb25mbGljdHMpLiBOb3RpY2UgdGhlcmUgaXMgbm8gYWRkL3JlbW92ZSBtYWNoaW5lcnkgdG8gbGlzdGVuIHRvIHRoaXMgZXZlbnQsIHRoYXQncyBhbGwgdGFrZW4gY2FyZSBvZi4KClRoZSBtYWluIHBvaW50IGlzIHRoYXQgJ2hlbGxvJyBhbmQgdGhlICdocicsIHRoZWlyIHJlZmVyZW5jZXMgYW5kIGJlaGF2aW9yLCBhcmUgY29tcGxldGVseSBjb250YWluZWQgaW5zaWRlIHRoZSBvdXRlciBjb250cm9sLiBOb3csIHRvIHJlLXVzZSB0aGlzLCB3ZSBuZWVkIHRvIG1ha2UgaXQgYSBwcm90b3R5cGUuCgpFbnlvIGNvbnRhaW5zIGEgY29uc3RydWN0b3IvcHJvdG90eXBlLWdlbmVyYXRvciB0aGF0IHdlIGNhbGwgZW55by5raW5kLiBDb25zdHJ1Y3RvcnMgdGhhdCBlbnlvLmtpbmQgcHJvZHVjZXMgYXJlIGNhbGxlZCBfa2luZHNfLiBLaW5kcyBhcmUgbm90IG1hZ2ljLCB0aGV5IGFyZSBqdXN0IHJlZ3VsYXIgb2xkIEphdmFTY3JpcHQgY29uc3RydWN0b3JzLiBVc2luZyB0aGUgZW55by5raW5kIGZhY3RvcnkgaG93ZXZlciBhbGxvd3MgdXMgdG8gcmVtb3ZlIGJvaWxlcnBsYXRlIGZyb20gb3VyIHByb3RvdHlwZSBnZW5lcmF0aW9uIChEUlkpIGFuZCBoYXZlIGNvbXBhY3Qgc3ludGF4LiBXZSBjYW4gY29udmVydCB0aGUgQ29udHJvbCBhYm92ZSB0byBhIGtpbmQgbGlrZSBzbzoKCmBgYGphdmFzY3JpcHQKZW55by5raW5kKHsKCW5hbWU6ICJIZWxsbyIsCglraW5kOiBlbnlvLkNvbnRyb2wsCgljb21wb25lbnRzOiBbCgkJe25hbWU6ICJoZWxsbyIsIGNvbnRlbnQ6ICJIZWxsbyBGcm9tIEVueW8iLCBvbnRhcDogImhlbGxvVGFwIn0sCgkJe3RhZzogImhyIn0KCV0sCgloZWxsb1RhcDogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLmhlbGxvLmFkZFN0eWxlcygiY29sb3I6IHJlZCIpOwoJfQp9KTsKLy8gbWFrZSB0d28sIHRoZXkncmUgc21hbGwKbmV3IGVueW8uQ29udHJvbCh7CiAgICAgIGNvbXBvbmVudHM6IFsge2tpbmQ6ICJIZWxsbyJ9LCB7a2luZDogIkhlbGxvIn0gXQogIH0pLnJlbmRlckludG8oZG9jdW1lbnQuYm9keSk7CmBgYAoKVGhlIGNvZGUgYWJvdmUgY3JlYXRlcyBhIG5ldyBraW5kIGNhbGxlZCAiSGVsbG8iIGRlcml2ZWQgZnJvbSBlbnlvLkNvbnRyb2wuIEl0IGNvbnRhaW5zIHNvbWUgY29tcG9uZW50cyBhbmQgc29tZSBiZWhhdmlvci4gSSBjYW4gY3JlYXRlIGFzIG1hbnkgIkhlbGxvIiBvYmplY3RzIGFzIEkgd2FudCwgZWFjaCBpbnN0YW5jZSBpcyBpbmRlcGVuZGVudCwgYW5kIHRoZSB1c2VyIG9mIGEgIkhlbGxvIiBkb2Vzbid0IG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCBpdHMgaW50ZXJuYWxzLgoKVGhpcyBhYmlsaXR5IHRvIGRlZmluZSBlbmNhcHN1bGF0ZWQgb2JqZWN0cyBhbmQgYmVoYXZpb3IgKENvbXBvbmVudHMpIGFuZCB0byByZS11c2UgdGhvc2UgZW5jYXBzdWxhdGlvbnMgYXMgcHJvdG90eXBlcyAoa2luZHMpIGlzIG1vbmV5Lgo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/enyo.js"
Content-Type: application/octet-stream; x-encoding=base64
LyogZ2xvYmFsIGVueW86dHJ1ZSAqLwooZnVuY3Rpb24oKSB7CgkvLyBlbnlvIGNhbiB1c2UgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2NyaXB0IHRhZyB0aGF0IGxvYWRzIHRoaXMgYm9vdHN0cmFwIGZpbGUKCXZhciB0aGlzU2NyaXB0ID0gImVueW8uanMiOwoKCWVueW8gPSB3aW5kb3cuZW55byB8fCB7fTsKCgllbnlvLmxvY2F0ZVNjcmlwdCA9IGZ1bmN0aW9uKGluTmFtZSkgewoJCXZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOwoJCWZvciAodmFyIGk9c2NyaXB0cy5sZW5ndGgtMSwgcywgc3JjLCBsPWluTmFtZS5sZW5ndGg7IChpPj0wKSAmJiAocz1zY3JpcHRzW2ldKTsgaS0tKSB7CgkJCWlmICghcy5sb2NhdGVkKSB7CgkJCQlzcmMgPSBzLmdldEF0dHJpYnV0ZSgic3JjIikgfHwgIiI7CgkJCQlpZiAoc3JjLnNsaWNlKC1sKSA9PSBpbk5hbWUpIHsKCQkJCQlzLmxvY2F0ZWQgPSB0cnVlOwoJCQkJCXJldHVybiB7cGF0aDogc3JjLnNsaWNlKDAsIE1hdGgubWF4KDAsIHNyYy5sYXN0SW5kZXhPZigiLyIpKSksIG5vZGU6IHN9OwoJCQkJfQoJCQl9CgkJfQoJfTsKCgllbnlvLmFyZ3MgPSBlbnlvLmFyZ3MgfHwge307CgoJdmFyIHRhZyA9IGVueW8ubG9jYXRlU2NyaXB0KHRoaXNTY3JpcHQpOwoJaWYgKHRhZykgewoJCS8vIGluZmVyIHRoZSBmcmFtZXdvcmsgcGF0aCBmcm9tIHRoZSBkb2N1bWVudCwgdW5sZXNzIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgb25lIGV4cGxpY2l0bHkKCQllbnlvLmFyZ3Mucm9vdCA9IChlbnlvLmFyZ3Mucm9vdCB8fCB0YWcucGF0aCk7CgkJLy8gYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIGJvb3RzdHJhcCBzY3JpcHQgdGFnIGJlY29tZSBlbnlvLmFyZ3MKCQlmb3IgKHZhciBpPTAsIGFsID0gdGFnLm5vZGUuYXR0cmlidXRlcy5sZW5ndGgsIGl0OyAoaSA8IGFsKSAmJiAoaXQgPSB0YWcubm9kZS5hdHRyaWJ1dGVzLml0ZW0oaSkpOyBpKyspIHsKCQkJZW55by5hcmdzW2l0Lm5vZGVOYW1lXSA9IGl0LnZhbHVlOwoJCX0KCX0KCgl2YXIgcm9vdCA9IGVueW8uYXJncy5yb290OwoKCXZhciBzY3JpcHQgPSBmdW5jdGlvbihpblNyYykgewoJCS8qIGpzaGludCBldmlsOiB0cnVlICovCgkJZG9jdW1lbnQud3JpdGUoJzxzY3JpJyArICdwdCBzcmM9IicgKyByb290ICsgIi9zb3VyY2UvYm9vdC8iICsgaW5TcmMgKyAnIj48L3NjcmknICsgJ3B0PicpOwoJCS8qIGpzaGludCBldmlsOiBmYWxzZSAqLwoJfTsKCglzY3JpcHQoInJlYWR5LmpzIik7CglzY3JpcHQoIi4uLy4uL2xvYWRlci5qcyIpOwoJc2NyaXB0KCJib290LmpzIik7CglzY3JpcHQoIi4uL3BhY2thZ2UuanMiKTsKfSkoKTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/kind-template.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCgkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBQUk9URUNURUQgUFJPUEVSVElFUwoKCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJLy8gQ09NUFVURUQgUFJPUEVSVElFUwoKCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJLy8gUFVCTElDIE1FVEhPRFMKCgkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCS8vIFBST1RFQ1RFRCBNRVRIT0RTCgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBPQlNFUlZFUlMKCn0pOw==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/loader.js"
Content-Type: application/octet-stream; x-encoding=base64
LyogZ2xvYmFsIGVueW86dHJ1ZSAqLwooZnVuY3Rpb24oKSB7CgllbnlvID0gd2luZG93LmVueW8gfHwge307CgoJZW55by5wYXRoUmVzb2x2ZXJGYWN0b3J5ID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5wYXRocyA9IHt9OwoJCXRoaXMucGF0aE5hbWVzID0gW107Cgl9OwoKCWVueW8ucGF0aFJlc29sdmVyRmFjdG9yeS5wcm90b3R5cGUgPSB7CgkJYWRkUGF0aDogZnVuY3Rpb24oaW5OYW1lLCBpblBhdGgpIHsKCQkJdGhpcy5wYXRoc1tpbk5hbWVdID0gaW5QYXRoOwoJCQl0aGlzLnBhdGhOYW1lcy5wdXNoKGluTmFtZSk7CgkJCXRoaXMucGF0aE5hbWVzLnNvcnQoZnVuY3Rpb24oYSwgYikgewoJCQkJcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7CgkJCX0pOwoJCQlyZXR1cm4gaW5QYXRoOwoJCX0sCgkJYWRkUGF0aHM6IGZ1bmN0aW9uKGluUGF0aHMpIHsKCQkJaWYgKGluUGF0aHMpIHsKCQkJCWZvciAodmFyIG4gaW4gaW5QYXRocykgewoJCQkJCXRoaXMuYWRkUGF0aChuLCBpblBhdGhzW25dKTsKCQkJCX0KCQkJfQoJCX0sCgkJaW5jbHVkZVRyYWlsaW5nU2xhc2g6IGZ1bmN0aW9uKGluUGF0aCkgewoJCQlyZXR1cm4gKGluUGF0aCAmJiBpblBhdGguc2xpY2UoLTEpICE9PSAiLyIpID8gaW5QYXRoICsgIi8iIDogaW5QYXRoOwoJCX0sCgkJLy8gcmVwbGFjZSBtYWNyb3Mgb2YgdGhlIGZvcm0gJHBhdGhuYW1lIHdpdGggdGhlIG1hcHBlZCB2YWx1ZSBvZiBwYXRocy5wYXRobmFtZQoJCXJld3JpdGU6IGZ1bmN0aW9uIChpblBhdGgpIHsKCQkJdmFyIHdvcmtpbmcsIGl0cyA9IHRoaXMuaW5jbHVkZVRyYWlsaW5nU2xhc2gsIHBhdGhzID0gdGhpcy5wYXRoczsKCQkJdmFyIGZuID0gZnVuY3Rpb24obWFjcm8sIG5hbWUpIHsKCQkJCXdvcmtpbmcgPSB0cnVlOwoJCQkJcmV0dXJuIGl0cyhwYXRoc1tuYW1lXSkgfHwgJyc7CgkJCX07CgkJCXZhciByZXN1bHQgPSBpblBhdGg7CgkJCWRvIHsKCQkJCXdvcmtpbmcgPSBmYWxzZTsKCQkJCWZvciAodmFyIGk9MDsgaTx0aGlzLnBhdGhOYW1lcy5sZW5ndGg7IGkrKykgewoJCQkJCXZhciByZWdleCA9IG5ldyBSZWdFeHAoIlxcJCgiICsgdGhpcy5wYXRoTmFtZXNbaV0gKyAiKShcXC8pPyIsICJnIik7CgkJCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UocmVnZXgsIGZuKTsKCQkJCX0KCQkJfSB3aGlsZSAod29ya2luZyk7CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfTsKCgllbnlvLnBhdGggPSBuZXcgZW55by5wYXRoUmVzb2x2ZXJGYWN0b3J5KCk7CgoJZW55by5sb2FkZXJGYWN0b3J5ID0gZnVuY3Rpb24oaW5NYWNoaW5lLCBpblBhdGhSZXNvbHZlcikgewoJCXRoaXMubWFjaGluZSA9IGluTWFjaGluZTsKCQkvLyBwYWNrYWdlIGluZm9ybWF0aW9uCgkJdGhpcy5wYWNrYWdlcyA9IFtdOwoJCS8vIG1vZHVsZSBpbmZvcm1hdGlvbgoJCXRoaXMubW9kdWxlcyA9IFtdOwoJCS8vIHN0eWxlc2hlZXQgcGF0aHMKCQl0aGlzLnNoZWV0cyA9IFtdOwoJCS8vIGRlc2lnbmVyIG1ldGFkYXRhIHBhdGhzCgkJdGhpcy5kZXNpZ25zID0gW107CgkJLy8gKHByb3RlY3RlZCkgaW50ZXJuYWwgZGVwZW5kZW5jeSBzdGFjawoJCXRoaXMuc3RhY2sgPSBbXTsKCQl0aGlzLnBhdGhSZXNvbHZlciA9IGluUGF0aFJlc29sdmVyIHx8IGVueW8ucGF0aDsKCQl0aGlzLnBhY2thZ2VOYW1lID0gIiI7CgkJdGhpcy5wYWNrYWdlRm9sZGVyID0gIiI7CgkJdGhpcy5maW5pc2hDYWxsYmFja3MgPSB7fTsKCX07CgoJZW55by5sb2FkZXJGYWN0b3J5LnByb3RvdHlwZSAgPSB7CgkJdmVyYm9zZTogZmFsc2UsCgkJbG9hZFNjcmlwdDogZnVuY3Rpb24oaW5TY3JpcHQsIHN1Y2Nlc3MsIGZhaWx1cmUpIHsKCQkJdGhpcy5tYWNoaW5lLnNjcmlwdChpblNjcmlwdCwgc3VjY2VzcywgZmFpbHVyZSk7CgkJfSwKCQlsb2FkU2hlZXQ6IGZ1bmN0aW9uKGluU2hlZXQpIHsKCQkJdGhpcy5tYWNoaW5lLnNoZWV0KGluU2hlZXQpOwoJCX0sCgkJbG9hZFBhY2thZ2U6IGZ1bmN0aW9uKGluUGFja2FnZSkgewoJCQl0aGlzLm1hY2hpbmUuc2NyaXB0KGluUGFja2FnZSk7CgkJfSwKCQlyZXBvcnQ6IGZ1bmN0aW9uKCkgewoJCX0sCgkJLy8KCQlsb2FkOiBmdW5jdGlvbigvKjxpbkRlcGVuZGVuY3kwLCBpbkRlcGVuZGVuY3kxIC4uLj4qLykgewoJCQkvLyBiZWdpbiBwcm9jZXNzaW5nIGRlcGVuZGVuY2llcwoJCQl0aGlzLm1vcmUoewoJCQkJaW5kZXg6IDAsCgkJCQlkZXBlbmRzOiBhcmd1bWVudHMgfHwgW10KCQkJfSk7CgkJfSwKCQltb3JlOiBmdW5jdGlvbihpbkJsb2NrKSB7CgkJCS8vIGEgJ2Jsb2NrJyBpcyBhIGRlcGVuZGVuY3kgbGlzdCB3aXRoIGEgYm9va21hcmsKCQkJLy8gdGhlIGJvb2ttYXJrIChpbmRleCkgYWxsb3dzIHVzIHRvIGludGVycnVwdAoJCQkvLyBwcm9jZXNzaW5nIGFuZCB0aGVuIGNvbnRpbnVlIGFzeW5jaHJvbm91c2x5LgoJCQlpZiAoaW5CbG9jaykgewoJCQkJLy8gcmV0dXJucyB0cnVlIGlmIHRoaXMgYmxvY2sgaGFzIGFzeW5jaHJvbm91cyByZXF1aXJlbWVudHMKCQkJCS8vIGluIHRoYXQgY2FzZSwgd2UgdW53aW5kIHRoZSBzdGFjay4gVGhlIGFzeW5jaHJvbm91cyBsb2FkZXIKCQkJCS8vIG11c3QgcHJvdmlkZSB0aGUgY29udGludWF0aW9uIChieSBjYWxsaW5nICdtb3JlJyBhZ2FpbikuCgkJCQlpZiAodGhpcy5jb250aW51ZUJsb2NrKGluQmxvY2spKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQl9CgkJCS8vIEEgcGFja2FnZSBpcyBub3cgY29tcGxldGUuIFBvcCB0aGUgYmxvY2sgdGhhdCB3YXMgaW50ZXJydXB0ZWQgZm9yIHRoYXQgcGFja2FnZSAoaWYgYW55KS4KCQkJdmFyIGJsb2NrID0gdGhpcy5zdGFjay5wb3AoKTsKCQkJaWYgKGJsb2NrKSB7CgkJCQkvLyBwcm9wYWdhdGUgZmFpbGVkIHNjcmlwdHMgdG8gcXVldWVkIGJsb2NrCgkJCQlpZihlbnlvLnJ1bnRpbWVMb2FkaW5nICYmIGluQmxvY2suZmFpbGVkKSB7CgkJCQkJYmxvY2suZmFpbGVkID0gYmxvY2suZmFpbGVkIHx8IFtdOwoJCQkJCWJsb2NrLmZhaWxlZC5wdXNoLmFwcGx5KGJsb2NrLmZhaWxlZCwgaW5CbG9jay5mYWlsZWQpOwoJCQkJfQoKCQkJCS8vIGJsb2NrLnBhY2thZ2VOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgaW50ZXJydXB0ZWQgdXMKCQkJCS8vdGhpcy5yZXBvcnQoImZpbmlzaGVkIHBhY2thZ2UiLCBibG9jay5wYWNrYWdlTmFtZSk7CgkJCQlpZiAodGhpcy52ZXJib3NlKSB7CgkJCQkJd2luZG93LmNvbnNvbGUuZ3JvdXBFbmQoIiogZmluaXNoIHBhY2thZ2UgKCIgKyAoYmxvY2sucGFja2FnZU5hbWUgfHwgImFub24iKSArICIpIik7CgkJCQl9CgkJCQkvLyBjYWNoZSB0aGUgZm9sZGVyIGZvciB0aGUgY3VycmVudGx5IHByb2Nlc3NpbmcgcGFja2FnZQoJCQkJdGhpcy5wYWNrYWdlRm9sZGVyID0gYmxvY2suZm9sZGVyOwoJCQkJLy8gbm8gY3VycmVudCBwYWNrYWdlCgkJCQl0aGlzLnBhY2thZ2VOYW1lID0gIiI7CgkJCQkvLyBwcm9jZXNzIHRoaXMgbmV3IGJsb2NrCgkJCQl0aGlzLm1vcmUoYmxvY2spOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5maW5pc2goaW5CbG9jayk7CgkJCX0KCQl9LAoJCWZpbmlzaDogZnVuY3Rpb24oaW5CbG9jaykgewoJCQl0aGlzLnBhY2thZ2VGb2xkZXIgPSAiIjsKCQkJaWYgKHRoaXMudmVyYm9zZSkgewoJCQkJd2luZG93LmNvbnNvbGUubG9nKCItLS0tLS0tLS0tLS0tLSBmaW5pIik7CgkJCX0KCQkJZm9yICh2YXIgaSBpbiB0aGlzLmZpbmlzaENhbGxiYWNrcykgewoJCQkJaWYgKHRoaXMuZmluaXNoQ2FsbGJhY2tzW2ldKSB7CgkJCQkJdmFyIGNhbGxiYWNrID0gdGhpcy5maW5pc2hDYWxsYmFja3NbaV07CgkJCQkJdGhpcy5maW5pc2hDYWxsYmFja3NbaV0gPSBudWxsOwoJCQkJCWNhbGxiYWNrKGluQmxvY2spOwoJCQkJfQoJCQl9CgkJfSwKCQljb250aW51ZUJsb2NrOiBmdW5jdGlvbihpbkJsb2NrKSB7CgkJCXdoaWxlIChpbkJsb2NrLmluZGV4IDwgaW5CbG9jay5kZXBlbmRzLmxlbmd0aCkgewoJCQkJdmFyIGQgPSBpbkJsb2NrLmRlcGVuZHNbaW5CbG9jay5pbmRleCsrXTsKCQkJCWlmIChkKSB7CgkJCQkJaWYgKHR5cGVvZiBkID09ICJzdHJpbmciKSB7CgkJCQkJCWlmICh0aGlzLnJlcXVpcmUoZCwgaW5CbG9jaykpIHsKCQkJCQkJCS8vIHJldHVybiB0cnVlIHRvIGluZGljYXRlIHdlIG5lZWQgdG8gaW50ZXJydXB0CgkJCQkJCQkvLyBwcm9jZXNzaW5nIHVudGlsIGFzeW5jaHJvbm91cyBmaWxlIGxvYWQgY29tcGxldGVzCgkJCQkJCQkvLyB0aGUgbG9hZCBwcm9jZXNzIGl0c2VsZiBtdXN0IHByb3ZpZGUgdGhlCgkJCQkJCQkvLyBjb250aW51YXRpb24KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGhpcy5wYXRoUmVzb2x2ZXIuYWRkUGF0aHMoZCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSwKCQlyZXF1aXJlOiBmdW5jdGlvbihpblBhdGgsIGluQmxvY2spIHsKCQkJLy8gcHJvY2VzcyBhbGlhc2VzCgkJCXZhciBwYXRoID0gdGhpcy5wYXRoUmVzb2x2ZXIucmV3cml0ZShpblBhdGgpOwoJCQkvLyBnZXQgcGF0aCByb290CgkJCXZhciBwcmVmaXggPSB0aGlzLmdldFBhdGhQcmVmaXgoaW5QYXRoKTsKCQkJLy8gYXNzZW1ibGUgcGF0aAoJCQlwYXRoID0gcHJlZml4ICsgcGF0aDsKCQkJLy8gcHJvY2VzcyBwYXRoCgkJCWlmICgocGF0aC5zbGljZSgtNCkgPT0gIi5jc3MiKSB8fCAocGF0aC5zbGljZSgtNSkgPT0gIi5sZXNzIikpIHsKCQkJCWlmICh0aGlzLnZlcmJvc2UpIHsKCQkJCQl3aW5kb3cuY29uc29sZS5sb2coIisgc3R5bGVzaGVldDogWyIgKyBwcmVmaXggKyAiXVsiICsgaW5QYXRoICsgIl0iKTsKCQkJCX0KCQkJCXRoaXMucmVxdWlyZVN0eWxlc2hlZXQocGF0aCk7CgkJCX0gZWxzZSBpZiAocGF0aC5zbGljZSgtMykgPT0gIi5qcyIgJiYgcGF0aC5zbGljZSgtMTApICE9ICJwYWNrYWdlLmpzIikgewoJCQkJaWYgKHRoaXMudmVyYm9zZSkgewoJCQkJCXdpbmRvdy5jb25zb2xlLmxvZygiKyBtb2R1bGU6IFsiICsgcHJlZml4ICsgIl1bIiArIGluUGF0aCArICJdIik7CgkJCQl9CgoJCQkJcmV0dXJuIHRoaXMucmVxdWlyZVNjcmlwdChpblBhdGgsIHBhdGgsIGluQmxvY2spOwoJCQl9IGVsc2UgaWYgKHBhdGguc2xpY2UoLTcpID09ICIuZGVzaWduIikgewoJCQkJaWYgKHRoaXMudmVyYm9zZSkgewoJCQkJCXdpbmRvdy5jb25zb2xlLmxvZygiKyBkZXNpZ24gbWV0YWRhdGE6IFsiICsgcHJlZml4ICsgIl1bIiArIGluUGF0aCArICJdIik7CgkJCQl9CgkJCQl0aGlzLnJlcXVpcmVEZXNpZ24ocGF0aCk7CgkJCX0gZWxzZSB7CgkJCQkvLyBwYWNrYWdlCgkJCQl0aGlzLnJlcXVpcmVQYWNrYWdlKHBhdGgsIGluQmxvY2spOwoJCQkJLy8gcmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgYSBwYWNrYWdlIHdhcyBsb2NhdGVkIGFuZAoJCQkJLy8gd2UgbmVlZCB0byBpbnRlcnJ1cHQgZnVydGhlciBwcm9jZXNzaW5nIHVudGlsIGl0J3MgY29tcGxldGVkCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0sCgkJZ2V0UGF0aFByZWZpeDogZnVuY3Rpb24oaW5QYXRoKSB7CgkJCXZhciBkZWxpbSA9IGluUGF0aC5zbGljZSgwLCAxKTsKCQkJaWYgKChkZWxpbSAhPSAiLyIpICYmIChkZWxpbSAhPSAiXFwiKSAmJiAoZGVsaW0gIT0gIiQiKSAmJiAhL15odHRwcz86L2kudGVzdChpblBhdGgpKSB7CgkJCQlyZXR1cm4gdGhpcy5wYWNrYWdlRm9sZGVyOwoJCQl9CgkJCXJldHVybiAiIjsKCQl9LAoJCXJlcXVpcmVTdHlsZXNoZWV0OiBmdW5jdGlvbihpblBhdGgpIHsKCQkJLy8gc3R5bGVzaGVldAoJCQl0aGlzLnNoZWV0cy5wdXNoKGluUGF0aCk7CgkJCXRoaXMubG9hZFNoZWV0KGluUGF0aCk7CgkJfSwKCQlyZXF1aXJlU2NyaXB0OiBmdW5jdGlvbihpblJhd1BhdGgsIGluUGF0aCwgaW5CbG9jaykgewoJCQkvLyBzY3JpcHQgZmlsZQoJCQl0aGlzLm1vZHVsZXMucHVzaCh7CgkJCQlwYWNrYWdlTmFtZTogdGhpcy5wYWNrYWdlTmFtZSwKCQkJCXJhd1BhdGg6IGluUmF3UGF0aCwKCQkJCXBhdGg6IGluUGF0aAoJCQl9KTsKCgkJCWlmKGVueW8ucnVudGltZUxvYWRpbmcpIHsKCQkJCXZhciBfdGhpcyA9IHRoaXM7CgkJCQl2YXIgc3VjY2VzcyA9IGZ1bmN0aW9uKCkgewoJCQkJCV90aGlzLm1vcmUoaW5CbG9jayk7CgkJCQl9OwoKCQkJCXZhciBmYWlsdXJlID0gZnVuY3Rpb24oKSB7CgkJCQkJaW5CbG9jay5mYWlsZWQgPSBpbkJsb2NrLmZhaWxlZCB8fCBbXTsKCQkJCQlpbkJsb2NrLmZhaWxlZC5wdXNoKGluUGF0aCk7CgkJCQkJX3RoaXMubW9yZShpbkJsb2NrKTsKCQkJCX07CgoJCQkJdGhpcy5sb2FkU2NyaXB0KGluUGF0aCwgc3VjY2VzcywgZmFpbHVyZSk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmxvYWRTY3JpcHQoaW5QYXRoKTsKCQkJfQoKCQkJcmV0dXJuIGVueW8ucnVudGltZUxvYWRpbmc7CgkJfSwKCQlyZXF1aXJlRGVzaWduOiBmdW5jdGlvbihpblBhdGgpIHsKCQkJLy8gZGVzaWduZXIgbWV0YWRhdGEgKG5vIGxvYWRpbmcgaGVyZSkKCQkJdGhpcy5kZXNpZ25zLnB1c2goewoJCQkJcGFja2FnZU5hbWU6IHRoaXMucGFja2FnZU5hbWUsCgkJCQlwYXRoOiBpblBhdGgKCQkJfSk7CgkJfSwKCQlkZWNvZGVQYWNrYWdlUGF0aDogZnVuY3Rpb24oaW5QYXRoKSB7CgkJCS8vIEEgcGFja2FnZSBwYXRoIGNhbiBiZSBlbmNvZGVkIGluIHR3byB3YXlzOgoJCQkvLwoJCQkvLwkxLiBbZm9sZGVyXQoJCQkvLwkyLiBbZm9sZGVyXS9bKnBhY2thZ2UuanNdCgkJCS8vCgkJCS8vIE5vdGU6IG1hbmlmZXN0IGZpbGUgbmFtZSBtdXN0IGVuZCBpbiAicGFja2FnZS5qcyIKCQkJLy8KCQkJdmFyIGZvbGRlciA9ICcnLCBtYW5pZmVzdCA9ICdwYWNrYWdlLmpzJzsKCQkJLy8gY29udmVydCBiYWNrIHNsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzLCByZW1vdmUgZG91YmxlIHNsYXNoZXMsIHNwbGl0IG9uIHNsYXNoCgkJCXZhciBwYXJ0cyA9IGluUGF0aC5yZXBsYWNlKC9cXC9nLCAiLyIpLnJlcGxhY2UoL1wvXC8vZywgIi8iKS5yZXBsYWNlKC86XC8vLCAiOi8vIikuc3BsaXQoIi8iKTsKCQkJaWYgKHBhcnRzLmxlbmd0aCkgewoJCQkJLy8gaWYgaW5QYXRoIGhhcyBhIHRyYWlsaW5nIHNsYXNoLCBwYXJ0cyBoYXMgYW4gZW1wdHkgc3RyaW5nIHdoaWNoIHdlIHBvcCBvZmYgYW5kIGlnbm9yZQoJCQkJdmFyIG5hbWUgPSBwYXJ0cy5wb3AoKSB8fCBwYXJ0cy5wb3AoKSB8fCAiIjsKCQkJCS8vIHRlc3QgaWYgbmFtZSBpbmNsdWRlcyB0aGUgbWFuaWZlc3QgdGFnCgkJCQlpZiAobmFtZS5zbGljZSgtbWFuaWZlc3QubGVuZ3RoKSAhPT0gbWFuaWZlc3QpIHsKCQkJCQkvLyBpZiBub3QgYSBtYW5pZmVzdCBuYW1lLCBpdCdzIHBhcnQgb2YgdGhlIGZvbGRlciBwYXRoCgkJCQkJcGFydHMucHVzaChuYW1lKTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gb3RoZXJ3aXNlIHRoaXMgaXMgdGhlIG1hbmlmZXN0IG5hbWUKCQkJCQltYW5pZmVzdCA9IG5hbWU7CgkJCQl9CgkJCQkvLwoJCQkJZm9sZGVyID0gcGFydHMuam9pbigiLyIpOwoJCQkJZm9sZGVyID0gKGZvbGRlciA/IGZvbGRlciArICIvIiA6ICIiKTsKCQkJCW1hbmlmZXN0ID0gZm9sZGVyICsgbWFuaWZlc3Q7CgkJCX0KCQkJcmV0dXJuIHsKCQkJCWZvbGRlcjogZm9sZGVyLAoJCQkJbWFuaWZlc3Q6IG1hbmlmZXN0CgkJCX07CgkJfSwKCQlhbGlhc1BhY2thZ2U6IGZ1bmN0aW9uKGluUGF0aCkgewoJCQl2YXIgcGFydHMgPSB0aGlzLmRlY29kZVBhY2thZ2VQYXRoKGluUGF0aCk7CgkJCS8vIGNhY2hlIG1hbmlmZXN0IHBhdGgKCQkJdGhpcy5tYW5pZmVzdCA9IHBhcnRzLm1hbmlmZXN0OwoJCX0sCgkJcmVxdWlyZVBhY2thZ2U6IGZ1bmN0aW9uKGluUGF0aCwgaW5CbG9jaykgewoJCQkvLyBjYWNoZSB0aGUgaW50ZXJydXB0ZWQgcGFja2FnZUZvbGRlcgoJCQlpbkJsb2NrLmZvbGRlciA9IHRoaXMucGFja2FnZUZvbGRlcjsKCQkJLy8gc2V0IG5ldyBtYW5pZmVzdC9wYWNrYWdlRm9sZGVyCgkJCXZhciBwYXJ0cyA9IHRoaXMuZGVjb2RlUGFja2FnZVBhdGgoaW5QYXRoKTsKCQkJdGhpcy5tYW5pZmVzdCA9IHBhcnRzLm1hbmlmZXN0OwoJCQl0aGlzLnBhY2thZ2VGb2xkZXIgPSBwYXJ0cy5mb2xkZXI7CgkJCS8vIGNhY2hlIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlICdpbkJsb2NrJyBpcyBsb2FkaW5nIG5vdwoJCQlpbkJsb2NrLnBhY2thZ2VOYW1lID0gdGhpcy5wYWNrYWdlTmFtZTsKCQkJLy8gcHVzaCBpbkJsb2NrIG9uIHRoZSBjb250aW51YXRpb24gc3RhY2sKCQkJdGhpcy5zdGFjay5wdXNoKGluQmxvY2spOwoJCQkvLyBjb25zb2xlL3VzZXIgcmVwb3J0aW5nCgkJCXRoaXMucmVwb3J0KCJsb2FkaW5nIHBhY2thZ2UiLCB0aGlzLnBhY2thZ2VOYW1lKTsKCQkJaWYgKHRoaXMudmVyYm9zZSkgewoJCQkJd2luZG93LmNvbnNvbGUuZ3JvdXAoIiogc3RhcnQgcGFja2FnZSBbIiArIHRoaXMucGFja2FnZU5hbWUgKyAiXSIpOwoJCQl9CgkJCS8vIGxvYWQgdGhlIGFjdHVhbCBwYWNrYWdlLiB0aGUgcGFja2FnZSBNVVNUIGNhbGwgYSBjb250aW51YXRpb24gZnVuY3Rpb24KCQkJLy8gb3IgdGhlIHByb2Nlc3Mgd2lsbCBoYWx0LgoJCQl0aGlzLmxvYWRQYWNrYWdlKHRoaXMubWFuaWZlc3QpOwoJCX0KCX07Cn0pKCk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/minify/minify.bat"
Content-Type: application/octet-stream; x-encoding=base64
QEVDSE8gT0ZGClJFTSBGSVhNRTogbWluaWZ5IGhhcyBhIHByb2JsZW0gaWYgJ3BhY2thZ2UuanMnIGlzIG5vdCBpbiBDV0QsIGhlbmNlIHB1c2gsIGNkLCBwb3AKUFVTSEQgIiVDRCUiCkNEICIlfmRwMCIKQ0FMTCAuLlx0b29sc1xtaW5pZnkuYmF0IHBhY2thZ2UuanMgLW5vLWFsaWFzIC1vdXRwdXQgLi5cLi5cYnVpbGRcZW55byAlKgpQT1BECg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/minify/minify.sh"
Content-Type: application/octet-stream; x-encoding=base64
IyEvYmluL3NoCmNkICQoZGlybmFtZSAkMCkKLi4vdG9vbHMvbWluaWZ5LnNoIHBhY2thZ2UuanMgLW5vLWFsaWFzIC1vdXRwdXQgLi4vLi4vYnVpbGQvZW55bwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/minify/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJIi4uL3NvdXJjZS9ib290IiwKCSIuLi9zb3VyY2UiCik7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/package.json"
Content-Type: application/octet-stream; x-encoding=base64
ewogICAgIm5hbWUiOiAiZW55b2pzIiwKICAgICJmaWxlbmFtZSI6ICJlbnlvLmpzIiwKICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKICAgICJkZXNjcmlwdGlvbiI6IkVueW8gaXMgYW4gb3BlbiBzb3VyY2Ugb2JqZWN0LW9yaWVudGVkIEphdmFTY3JpcHQgZnJhbWV3b3JrIGVtcGhhc2l6aW5nIGVuY2Fwc3VsYXRpb24gYW5kIG1vZHVsYXJpdHkuIEVueW8gY29udGFpbnMgZXZlcnl0aGluZyB5b3UgbmVlZCB0byBjcmVhdGUgYSBmYXN0LCBzY2FsYWJsZSBtb2JpbGUgb3Igd2ViIGFwcGxpY2F0aW9uLiIsCiAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL2VueW9qcy5jb20vIiwKICAgICJidWdzIjogImh0dHA6Ly9qaXJhLmVueW9qcy5jb20vIiwKICAgICJrZXl3b3JkcyI6IFsgImZyYW1ld29yayIsICJ0b29sa2l0IiwgImNvbXBvbmVudHMiLCAibW9iaWxlIiwgIndlYk9TIiBdLAogICAgIm1haW50YWluZXJzIjogW3sKICAgICAgICAibmFtZSI6ICJFbnlvIEpTIEZyYW1ld29yayBUZWFtIiwKICAgICAgICAid2ViIjogImh0dHA6Ly9lbnlvanMuY29tLyIKICAgIH1dLAogICAgImxpY2Vuc2VzIjogW3sKICAgICAgICAidHlwZSI6ICJBcGFjaGUtMi4wIiwgInVybCI6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCiAgICB9XSwKICAgICJidWdzIjogImh0dHBzOi8vamlyYS5lbnlvanMuY29tLyIsCiAgICAicmVwb3NpdG9yeSI6IHsKICAgICAgICAidHlwZSI6ICJnaXQiLCAidXJsIjogImh0dHA6Ly9naXRodWIuY29tL2VueW9qcy9lbnlvIgogICAgfSwKICAgICJkZXBlbmRlbmNpZXMiOiBbCiAgICAgICAgeyJsZXNzIjogIjEuMy4zIn0sCiAgICAgICAgeyJ1Z2xpZnktanMiOiAiMi4yLjUifSwKICAgICAgICB7InNoZWxsanMiOiAiMC4wLjgifSwKICAgICAgICB7Im5vcHQiOiAiMi4wLjAifQogICAgXQp9Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/AjaxSample.css"
Content-Type: application/octet-stream; x-encoding=base64
LmFqYXgtc2FtcGxlIHsKCXBhZGRpbmc6IDE1cHg7Cn0KCi5hamF4LXNhbXBsZS1zb3VyY2UgewoJcGFkZGluZzoxNXB4OwoJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKCWZvbnQtc2l6ZTogMTJweDsKCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCWJveC1zaXppbmc6IGJvcmRlci1ib3g7Cgl3aWR0aDoxMDAlOyAKCWhlaWdodDoxMDAlOwoJbWFyZ2luLXRvcDoxNXB4Owp9Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/AjaxSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5BSkFYIFNhbXBsZTwvdGl0bGU+Cgk8IS0tIC0tPgoJPHNjcmlwdCBzcmM9Ii4uLy4uL2VueW8vZW55by5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTxzY3JpcHQgc3JjPSIuLi8uLi9saWIvbGF5b3V0L3BhY2thZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vbGliL29ueXgvcGFja2FnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTwhLS0gLS0+Cgk8bGluayBocmVmPSJBamF4U2FtcGxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KCTxzY3JpcHQgc3JjPSJBamF4U2FtcGxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPCEtLSAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ib255eCI+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCW5ldyBlbnlvLnNhbXBsZS5BamF4U2FtcGxlKCkucmVuZGVySW50byhkb2N1bWVudC5ib2R5KTsKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/AjaxSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5BamF4U2FtcGxlIiwKCWtpbmQ6ICJGaXR0YWJsZVJvd3MiLAoJY2xhc3NlczogImVueW8tZml0IGFqYXgtc2FtcGxlIiwKCWNvbXBvbmVudHM6IFsKCQl7a2luZDogIkZpdHRhYmxlQ29sdW1ucyIsIGNsYXNzZXM6Im9ueXgtdG9vbGJhci1pbmxpbmUiLCBjb21wb25lbnRzOiBbCgkJCXtjb250ZW50OiAiWVFMOiAifSwKCQkJe2tpbmQ6ICJvbnl4LklucHV0IiwgbmFtZToicXVlcnkiLCBmaXQ6dHJ1ZSwgdmFsdWU6J3NlbGVjdCAqIGZyb20gdXBjb21pbmcuZXZlbnRzIHdoZXJlIHdvZWlkIGluIChzZWxlY3Qgd29laWQgZnJvbSBnZW8ucGxhY2VzIHdoZXJlIHRleHQ9IlN1bm55dmFsZSwgQ0EiKSd9LAoJCQl7a2luZDogIm9ueXguQnV0dG9uIiwgY29udGVudDoiRmV0Y2giLCBvbnRhcDoiZmV0Y2gifQoJCV19LAoJCXtraW5kOiAiRml0dGFibGVDb2x1bW5zIiwgY2xhc3Nlczoib255eC10b29sYmFyLWlubGluZSIsIGNvbXBvbmVudHM6IFsKCQkJe2NvbnRlbnQ6ICJVUkw6ICJ9LAoJCQl7a2luZDogIm9ueXguSW5wdXQiLCBuYW1lOiJiYXNlVXJsIiwgZml0OnRydWUsIHZhbHVlOidodHRwOi8vcXVlcnkueWFob29hcGlzLmNvbS92MS9wdWJsaWMveXFsP2Zvcm1hdD1qc29uJ30KCQldfSwKCQl7a2luZDogIm9ueXguVGV4dEFyZWEiLCBmaXQ6dHJ1ZSwgY2xhc3NlczoiYWpheC1zYW1wbGUtc291cmNlIn0KCV0sCglmZXRjaDogZnVuY3Rpb24oKSB7CgkJdmFyIGFqYXggPSBuZXcgZW55by5BamF4KHsKCQkJdXJsOiB0aGlzLiQuYmFzZVVybC5nZXRWYWx1ZSgpCgkJfSk7CgkJLy8gc2VuZCBwYXJhbWV0ZXJzIHRoZSByZW1vdGUgc2VydmljZSB1c2luZyB0aGUgJ2dvKCknIG1ldGhvZAoJCWFqYXguZ28oewoJCQlxOiB0aGlzLiQucXVlcnkuZ2V0VmFsdWUoKQoJCX0pOwoJCS8vIGF0dGFjaCByZXNwb25kZXJzIHRvIHRoZSB0cmFuc2FjdGlvbiBvYmplY3QKCQlhamF4LnJlc3BvbnNlKHRoaXMsICJwcm9jZXNzUmVzcG9uc2UiKTsKCQkvLyBoYW5kbGUgZXJyb3IKCQlhamF4LmVycm9yKHRoaXMsICJwcm9jZXNzRXJyb3IiKTsKCX0sCglwcm9jZXNzUmVzcG9uc2U6IGZ1bmN0aW9uKGluU2VuZGVyLCBpblJlc3BvbnNlKSB7CgkJLy8gZG8gc29tZXRoaW5nIHdpdGggaXQKCQl0aGlzLiQudGV4dEFyZWEuc2V0VmFsdWUoSlNPTi5zdHJpbmdpZnkoaW5SZXNwb25zZSwgbnVsbCwgMikpOwoJfSwKCXByb2Nlc3NFcnJvcjogZnVuY3Rpb24oaW5TZW5kZXIsIGluUmVzcG9uc2UpIHsKCQl3aW5kb3cuYWxlcnQoIkVycm9yISIpOwoJfQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/AudioSample.css"
Content-Type: application/octet-stream; x-encoding=base64
LmF1ZGlvLXNhbXBsZSB7CglwYWRkaW5nOiAxNXB4Owp9CgouYXVkaW8tc2FtcGxlLWRpdmlkZXIgewoJY29sb3I6ICNGNDkyMDA7Cgl0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwoJZm9udC1mYW1pbHk6IFNlZ29lIFVJLCBQcmVsdWRlIE1lZGl1bSwgSGVsdmV0aWNhLCBWZXJkYW5hLCBzYW5zLXNlcmlmOwoJZm9udC1zaXplOiAxNHB4OwoJZm9udC13ZWlnaHQ6IGJvbGQ7CgltYXJnaW4tYm90dG9tOiA4cHg7Cn0=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/AudioSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5BdWRpbyBTYW1wbGU8L3RpdGxlPgoJPCEtLSAtLT4KCTxzY3JpcHQgc3JjPSIuLi8uLi9lbnlvL2VueW8uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vbGliL29ueXgvcGFja2FnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTwhLS0gLS0+Cgk8bGluayBocmVmPSJBdWRpb1NhbXBsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+Cgk8c2NyaXB0IHNyYz0iQXVkaW9TYW1wbGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8IS0tIC0tPgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSJvbnl4Ij4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJbmV3IGVueW8uc2FtcGxlLkF1ZGlvU2FtcGxlKCkucmVuZGVySW50byhkb2N1bWVudC5ib2R5KTsKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/AudioSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5BdWRpb1NhbXBsZSIsCgljbGFzc2VzOiAiYXVkaW8tc2FtcGxlIiwKCWNvbXBvbmVudHM6IFsKCQl7a2luZDogImVueW8uQXVkaW8iLCBvbkVuZGVkOiAiZW5kZWQifSwKCQl7Y29udGVudDogIlNvdW5kcyIsIGNsYXNzZXM6ImF1ZGlvLXNhbXBsZS1kaXZpZGVyIn0sCgkJe2NsYXNzZXM6ICJvbnl4LXRvb2xiYXItaW5saW5lIiwgY29tcG9uZW50czogWwoJCQl7a2luZDogIm9ueXguUGlja2VyRGVjb3JhdG9yIiwgY29tcG9uZW50czogWwoJCQkJe30sCgkJCQl7a2luZDogIm9ueXguUGlja2VyIiwgb25TZWxlY3Q6ICJpdGVtU2VsZWN0ZWQiLCBjb21wb25lbnRzOiBbCgkJCQkJe2NvbnRlbnQ6ICJCaXJkcyIsIGFjdGl2ZTogdHJ1ZX0sCgkJCQkJe2NvbnRlbnQ6ICJDYXQifSwKCQkJCQl7Y29udGVudDogIkNvdyJ9LAoJCQkJCXtjb250ZW50OiAiR3VpdGFyIn0KCQkJCV19CgkJCV19LAoJCQl7a2luZDogIm9ueXguQnV0dG9uIiwgY29udGVudDogIlBsYXkiLCBvbnRhcDogInRvZ2dsZVBsYXkifQoJCV19LAoJCXt0YWc6ICJiciJ9LAoJCXtuYW1lOiAiY29uc29sZSJ9CgldLAoJc291bmRzOiBbCgkJe2xhYmVsOiAiQmlyZHMiLCBzcmM6ICJodHRwOi8vd3d3LnVuaXZlcnNhbC1zb3VuZGJhbmsuY29tL21wMy9zb3VuZHMvMTI1OTEubXAzIn0sCgkJe2xhYmVsOiAiQ2F0Iiwgc3JjOiAiaHR0cDovL3d3dy51bml2ZXJzYWwtc291bmRiYW5rLmNvbS9tcDMvc291bmRzLzk4Ni5tcDMifSwKCQl7bGFiZWw6ICJDb3ciLCBzcmM6ICJodHRwOi8vd3d3LnVuaXZlcnNhbC1zb3VuZGJhbmsuY29tL21wMy9zb3VuZHMvMTAxLm1wMyJ9LAoJCXtsYWJlbDogIkd1aXRhciIsIHNyYzogImh0dHA6Ly93d3cudW5pdmVyc2FsLXNvdW5kYmFuay5jb20vbXAzL3NvdW5kcy8xODI2NS5tcDMifQoJXSwKCXJlbmRlcmVkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXRoaXMubG9hZEF1ZGlvKDApOwoJfSwKCWxvYWRBdWRpbzogZnVuY3Rpb24oaW5JbmRleCkgewoJCXRoaXMuJC5hdWRpby5zZXRTcmModGhpcy5zb3VuZHNbaW5JbmRleF0uc3JjKTsKCQl0aGlzLiQuY29uc29sZS5zZXRDb250ZW50KCIiKTsKCQl0aGlzLiQuYnV0dG9uLnNldENvbnRlbnQoIlBsYXkiKTsKCX0sCglwbGF5QXVkaW86IGZ1bmN0aW9uKCkgewoJCXRoaXMuJC5hdWRpby5wbGF5KCk7CgkJdGhpcy4kLmJ1dHRvbi5zZXRDb250ZW50KCJQYXVzZSIpOwoJCXRoaXMuJC5jb25zb2xlLnNldENvbnRlbnQoIkF1ZGlvIHBsYXlpbmciKTsKCX0sCglwYXVzZUF1ZGlvOiBmdW5jdGlvbigpIHsKCQl0aGlzLiQuYXVkaW8ucGF1c2UoKTsKCQl0aGlzLiQuYnV0dG9uLnNldENvbnRlbnQoIlBsYXkiKTsKCQl0aGlzLiQuY29uc29sZS5zZXRDb250ZW50KCJBdWRpbyBwYXVzZWQiKTsKCX0sCgl0b2dnbGVQbGF5OiBmdW5jdGlvbihpblNlbmRlciwgaW5SZXNwb25zZSkgewoJCWlmICh0aGlzLiQuYXVkaW8uZ2V0UGF1c2VkKCkpIHsKCQkJdGhpcy5wbGF5QXVkaW8oKTsKCQl9IGVsc2UgewoJCQl0aGlzLnBhdXNlQXVkaW8oKTsKCQl9Cgl9LAoJZW5kZWQ6IGZ1bmN0aW9uKGluU2VuZGVyLCBpblJlc3BvbnNlKSB7CgkJdGhpcy4kLmNvbnNvbGUuc2V0Q29udGVudCgiQXVkaW8gZW5kZWQiKTsKCQl0aGlzLiQuYnV0dG9uLnNldENvbnRlbnQoIlBsYXkiKTsKCX0sCglpdGVtU2VsZWN0ZWQ6IGZ1bmN0aW9uKGluSXRlbSkgewoJCXZhciBjb250ZW50ID0gaW5JdGVtLnNlbGVjdGVkLmdldENvbnRlbnQoKTsKCQl2YXIgc291bmRDb3VudCA9IHRoaXMuc291bmRzLmxlbmd0aDsKCQlmb3IgKHZhciBpPTA7IGk8c291bmRDb3VudDsgaSsrKSB7CgkJCWlmIChjb250ZW50ID09PSB0aGlzLnNvdW5kc1tpXS5sYWJlbCkgewoJCQkJdGhpcy5sb2FkQXVkaW8oaSk7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfSk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/DrawerSample.css"
Content-Type: application/octet-stream; x-encoding=base64
LmRyYXdlci1zYW1wbGUgewoJcGFkZGluZzogMTBweDsKfQouZHJhd2VyLXNhbXBsZS1kaXZpZGVyIHsKCWNvbG9yOiAjRjQ5MjAwOwoJdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKCWZvbnQtZmFtaWx5OiBTZWdvZSBVSSwgUHJlbHVkZSBNZWRpdW0sIEhlbHZldGljYSwgVmVyZGFuYSwgc2Fucy1zZXJpZjsKCWZvbnQtc2l6ZTogMTRweDsKCWZvbnQtd2VpZ2h0OiBib2xkOwoJbWFyZ2luLWJvdHRvbTogOHB4Owp9Ci5kcmF3ZXItc2FtcGxlLWxhYmVsIHsKCWNvbG9yOiAjMTg3OUNEOwoJZm9udC1zaXplOiAxOHB4OwoJdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQouZHJhd2VyLXNhbXBsZS1ib3ggewoJYm9yZGVyOiAycHggc29saWQgbGlnaHRibHVlOwoJcGFkZGluZzogNHB4OwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKCW92ZXJmbG93OmhpZGRlbjsKfQouZHJhd2VyLXNhbXBsZS1tdGIgewoJbWFyZ2luLXRvcDogM3B4OwoJbWFyZ2luLWJvdHRvbTogM3B4Owp9Ci5kcmF3ZXItc2FtcGxlLW1sciB7CgltYXJnaW4tbGVmdDogNnB4OwoJbWFyZ2luLXJpZ2h0OiA2cHg7Cn0KLmRyYXdlci1zYW1wbGUtbyB7Cglib3JkZXItY29sb3I6IG9yYW5nZTsKfQ==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/DrawerSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5EcmF3ZXIgU2FtcGxlPC90aXRsZT4KCTwhLS0gLS0+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vZW55by9lbnlvLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9sYXlvdXQvcGFja2FnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTwhLS0gLS0+Cgk8bGluayBocmVmPSJEcmF3ZXJTYW1wbGUuY3NzIiByZWw9InN0eWxlc2hlZXQiPgoJPHNjcmlwdCBzcmM9IkRyYXdlclNhbXBsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTwhLS0gLS0+CjwvaGVhZD4KPGJvZHk+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCW5ldyBlbnlvLnNhbXBsZS5EcmF3ZXJTYW1wbGUoe2NsYXNzZXM6ICJlbnlvLXVuc2VsZWN0YWJsZSJ9KS5yZW5kZXJJbnRvKGRvY3VtZW50LmJvZHkpOwo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/DrawerSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5EcmF3ZXJTYW1wbGUiLAoJY2xhc3NlczogImRyYXdlci1zYW1wbGUiLAoJY29tcG9uZW50czogWwoJCXtjb250ZW50OiAiRHJhd2VycyIsIGNsYXNzZXM6ImRyYXdlci1zYW1wbGUtZGl2aWRlciJ9LAoJCXtjb250ZW50OiAiQWN0aXZhdGUgKFYpIiwgY2xhc3NlczogImRyYXdlci1zYW1wbGUtYm94IGRyYXdlci1zYW1wbGUtbXRiIiwgb250YXA6ImFjdGl2YXRlRHJhd2VyIn0sCgkJe25hbWU6ICJkcmF3ZXIiLCBraW5kOiAiZW55by5EcmF3ZXIiLCBjb21wb25lbnRzOiBbCgkJCXtjb250ZW50OiAiVmVydGljYWwgRHJhd2VyPGJyPlZlcnRpY2FsIERyYXdlcjxicj5WZXJ0aWNhbCBEcmF3ZXI8YnI+VmVydGljYWwgRHJhd2VyIiwgYWxsb3dIdG1sOiB0cnVlLCBjbGFzc2VzOiAiZHJhd2VyLXNhbXBsZS1ib3ggZHJhd2VyLXNhbXBsZS1tdGIifSwKCQkJe2NvbXBvbmVudHM6IFsKCQkJCXtraW5kOiAiZW55by5DaGVja2JveCIsIG5hbWU6ICJhbmltYXRlU2V0dGluZyIsIHZhbHVlOiB0cnVlfSwKCQkJCXtjb250ZW50OiJBbmltYXRlZCIsIGNsYXNzZXM6ImVueW8taW5saW5lIG9ueXgtc2FtcGxlLWFuaW1hdGUtbGFiZWwifQoJCQldfSwKCQkJe2NvbnRlbnQ6ICJBY3RpdmF0ZSAoVikgKFRvZ2dsZWQgQW5pbWF0aW9uKSIsIGNsYXNzZXM6ICJkcmF3ZXItc2FtcGxlLWJveCBkcmF3ZXItc2FtcGxlLW10YiIsIG9udGFwOiJhY3RpdmF0ZURyYXdlcjIifSwKCQkJe25hbWU6ICJkcmF3ZXIyIiwga2luZDogImVueW8uRHJhd2VyIiwgYW5pbWF0ZWQ6IHRydWUsIGNvbXBvbmVudHM6IFsKCQkJCXtjb250ZW50OiAiVmVydGljYWwgRHJhd2VyPGJyPlZlcnRpY2FsIERyYXdlcjxicj5WZXJ0aWNhbCBEcmF3ZXI8YnI+VmVydGljYWwgRHJhd2VyIiwgYWxsb3dIdG1sOiB0cnVlLCBjbGFzc2VzOiAiZHJhd2VyLXNhbXBsZS1ib3ggZHJhd2VyLXNhbXBsZS1tdGIifQoJCQldfSwKCQkJe2NvbnRlbnQ6ICJWZXJ0aWNhbCBEcmF3ZXI8YnI+VmVydGljYWwgRHJhd2VyPGJyPlZlcnRpY2FsIERyYXdlcjxicj5WZXJ0aWNhbCBEcmF3ZXIiLCBhbGxvd0h0bWw6IHRydWUsIGNsYXNzZXM6ICJkcmF3ZXItc2FtcGxlLWJveCBkcmF3ZXItc2FtcGxlLW10YiJ9CgkJXX0sCgkJe2NvbnRlbnQ6ICJGb288YnI+Rm9vIiwgYWxsb3dIdG1sOiB0cnVlLCBjbGFzc2VzOiAiZHJhd2VyLXNhbXBsZS1ib3ggZHJhd2VyLXNhbXBsZS1tdGIifSwKCQl7a2luZDogIkZpdHRhYmxlQ29sdW1ucyIsIGZpdDogdHJ1ZSwgb250YXA6ICJhY3RpdmF0ZUNvbHVtbnNEcmF3ZXIiLCBjbGFzc2VzOiAiZHJhd2VyLXNhbXBsZS1ib3ggZHJhd2VyLXNhbXBsZS1tdGIgZHJhd2VyLXNhbXBsZS1vIiwgY29tcG9uZW50czogWwoJCQl7Y29udGVudDogIkFjdGl2YXRlIChIKSIsIGNsYXNzZXM6ICJkcmF3ZXItc2FtcGxlLWJveCBkcmF3ZXItc2FtcGxlLW1sciJ9LAoJCQl7bmFtZTogImNvbHVtbnNEcmF3ZXIiLCBvcmllbnQ6ICJoIiwga2luZDogImVueW8uRHJhd2VyIiwgb3BlbjogZmFsc2UsIGNvbXBvbmVudHM6IFsKCQkJCXtjb250ZW50OiAiSC1EcmF3ZXIiLCBjbGFzc2VzOiAiZHJhd2VyLXNhbXBsZS1ib3ggZHJhd2VyLXNhbXBsZS1tbHIifQoJCQldfSwKCQkJe2NvbnRlbnQ6ICJGb28iLCBmaXQ6IHRydWUsIGNsYXNzZXM6ICJkcmF3ZXItc2FtcGxlLWJveCBkcmF3ZXItc2FtcGxlLW1sciBkcmF3ZXItc2FtcGxlLW8ifSwKCQkJe2NvbnRlbnQ6ICJGb28iLCBjbGFzc2VzOiAiZHJhd2VyLXNhbXBsZS1ib3ggZHJhd2VyLXNhbXBsZS1tbHIifQoJCV19LAoJCXtjb250ZW50OiAiRm9vIiwgY2xhc3NlczogImRyYXdlci1zYW1wbGUtYm94IGRyYXdlci1zYW1wbGUtbXRiIn0KCV0sCglhY3RpdmF0ZURyYXdlcjogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLmRyYXdlci5zZXRPcGVuKCF0aGlzLiQuZHJhd2VyLm9wZW4pOwoJfSwKCWFjdGl2YXRlRHJhd2VyMjogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLmRyYXdlcjIuc2V0QW5pbWF0ZWQodGhpcy4kLmFuaW1hdGVTZXR0aW5nLmdldFZhbHVlKCkpOwoJCXRoaXMuJC5kcmF3ZXIyLnNldE9wZW4oIXRoaXMuJC5kcmF3ZXIyLm9wZW4pOwoJfSwKCWFjdGl2YXRlQ29sdW1uc0RyYXdlcjogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLmNvbHVtbnNEcmF3ZXIuc2V0T3BlbighdGhpcy4kLmNvbHVtbnNEcmF3ZXIub3Blbik7CgkJcmV0dXJuIHRydWU7Cgl9Cn0pOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/FullscreenSample.css"
Content-Type: application/octet-stream; x-encoding=base64
LmZ1bGxzY3JlZW4tc2FtcGxlIHsKCXBhZGRpbmc6IDE1cHg7Cn0KCi5mdWxsc2NyZWVuLXNhbXBsZSAuZnVsbHNjcmVlbi1zYW1wbGUtY29udGFpbmVyIHsKCXdpZHRoOiA0MDBweDsKfQoKLmZ1bGxzY3JlZW4tc2FtcGxlIC5mdWxsc2NyZWVuLXNhbXBsZS1jb250YWluZXIgLmZ1bGxzY3JlZW4tc2FtcGxlLXNjcm9sbGVyIHsKCXBhZGRpbmc6IDEwcHg7CgloZWlnaHQ6IDMwMHB4OwoJYm9yZGVyOiAxcHggc29saWQgI2FhYTsKfQoKLmZ1bGxzY3JlZW4tc2FtcGxlIGJ1dHRvbiB7CgltYXJnaW4tdG9wOiAyMHB4Owp9CgovKiBGdWxsc2NyZWVuIFN0eWxlcyAtIE5vdGU6IFRoZXNlIHJ1bGVzIGNhbid0IGJlIGNvbW1hLXNlcGFyYXRlZCAqLwouZnVsbHNjcmVlbi1zYW1wbGUgLmZ1bGxzY3JlZW4tc2FtcGxlLWNvbnRhaW5lcjotd2Via2l0LWZ1bGwtc2NyZWVuIC5mdWxsc2NyZWVuLXNhbXBsZS1zY3JvbGxlciB7Cglib3JkZXI6IG5vbmU7Cn0KLmZ1bGxzY3JlZW4tc2FtcGxlIC5mdWxsc2NyZWVuLXNhbXBsZS1jb250YWluZXI6LW1vei1mdWxsLXNjcmVlbiAuZnVsbHNjcmVlbi1zYW1wbGUtc2Nyb2xsZXIgewoJYm9yZGVyOiBub25lOwoJYmFja2dyb3VuZDogI2RkZDsKfQouZnVsbHNjcmVlbi1zYW1wbGUgLmZ1bGxzY3JlZW4tc2FtcGxlLWNvbnRhaW5lcjotbXMtZnVsbC1zY3JlZW4gLmZ1bGxzY3JlZW4tc2FtcGxlLXNjcm9sbGVyIHsKCWJvcmRlcjogbm9uZTsKfQouZnVsbHNjcmVlbi1zYW1wbGUgLmZ1bGxzY3JlZW4tc2FtcGxlLWNvbnRhaW5lcjotby1mdWxsLXNjcmVlbiAuZnVsbHNjcmVlbi1zYW1wbGUtc2Nyb2xsZXIgewoJYm9yZGVyOiBub25lOwp9Ci5mdWxsc2NyZWVuLXNhbXBsZSAuZnVsbHNjcmVlbi1zYW1wbGUtY29udGFpbmVyOi1mdWxsLXNjcmVlbiAuZnVsbHNjcmVlbi1zYW1wbGUtc2Nyb2xsZXIgewoJYm9yZGVyOiBub25lOwp9Ci8qIEZhbGxiYWNrIEZ1bGxzY3JlZW4gU3R5bGUgKGZvciBicm93c2VycyB3aXRob3V0IEhUTUw1IGZ1bGxzY3JlZW4gc3VwcG9ydCkgKi8KYm9keSAuZW55by1mdWxsc2NyZWVuLmZ1bGxzY3JlZW4tc2FtcGxlLWNvbnRhaW5lciB7CgliYWNrZ3JvdW5kOiAjZGRkOwp9
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/FullscreenSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5GdWxsc2NyZWVuIFNhbXBsZTwvdGl0bGU+Cgk8IS0tIC0tPgoJPHNjcmlwdCBzcmM9Ii4uLy4uL2VueW8vZW55by5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTxzY3JpcHQgc3JjPSIuLi8uLi9saWIvbGF5b3V0L3BhY2thZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vbGliL29ueXgvcGFja2FnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTwhLS0gLS0+Cgk8bGluayBocmVmPSJGdWxsc2NyZWVuU2FtcGxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KCTxzY3JpcHQgc3JjPSJGdWxsc2NyZWVuU2FtcGxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPCEtLSAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ib255eCI+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCW5ldyBlbnlvLnNhbXBsZS5GdWxsc2NyZWVuU2FtcGxlKCkucmVuZGVySW50byhkb2N1bWVudC5ib2R5KTsKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/FullscreenSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5GdWxsc2NyZWVuU2FtcGxlIiwKCWNsYXNzZXM6ICJmdWxsc2NyZWVuLXNhbXBsZSBlbnlvLWZpdCBlbnlvLXVuc2VsZWN0YWJsZSIsCgljb21wb25lbnRzOiBbCgkJe25hbWU6ICJzYW1wbGVDb250ZW50IiwgY2xhc3NlczogImZ1bGxzY3JlZW4tc2FtcGxlLWNvbnRhaW5lciIsIGNvbXBvbmVudHM6IFsKCQkJe2tpbmQ6ICJvbnl4Lkdyb3VwYm94SGVhZGVyIiwgY29udGVudDogIkZ1bGxzY3JlZW4gU2FtcGxlIn0sCgkJCXtraW5kOiAiZW55by5TY3JvbGxlciIsIGNsYXNzZXM6ICJmdWxsc2NyZWVuLXNhbXBsZS1zY3JvbGxlciIsIGNvbXBvbmVudHM6IFsKCQkJCXtjb250ZW50OiAiTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2ljaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS4gU2VkIHV0IHBlcnNwaWNpYXRpcyB1bmRlIG9tbmlzIGlzdGUgbmF0dXMgZXJyb3Igc2l0IHZvbHVwdGF0ZW0gYWNjdXNhbnRpdW0gZG9sb3JlbXF1ZSBsYXVkYW50aXVtLCB0b3RhbSByZW0gYXBlcmlhbSwgZWFxdWUgaXBzYSBxdWFlIGFiIGlsbG8gaW52ZW50b3JlIHZlcml0YXRpcyBldCBxdWFzaSBhcmNoaXRlY3RvIGJlYXRhZSB2aXRhZSBkaWN0YSBzdW50IGV4cGxpY2Fiby4gTmVtbyBlbmltIGlwc2FtIHZvbHVwdGF0ZW0gcXVpYSB2b2x1cHRhcyBzaXQgYXNwZXJuYXR1ciBhdXQgb2RpdCBhdXQgZnVnaXQsIHNlZCBxdWlhIGNvbnNlcXV1bnR1ciBtYWduaSBkb2xvcmVzIGVvcyBxdWkgcmF0aW9uZSB2b2x1cHRhdGVtIHNlcXVpIG5lc2NpdW50LiBOZXF1ZSBwb3JybyBxdWlzcXVhbSBlc3QsIHF1aSBkb2xvcmVtIGlwc3VtIHF1aWEgZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyLCBhZGlwaXNjaSB2ZWxpdCwgc2VkIHF1aWEgbm9uIG51bXF1YW0gZWl1cyBtb2RpIHRlbXBvcmEgaW5jaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYW0gYWxpcXVhbSBxdWFlcmF0IHZvbHVwdGF0ZW0uIFV0IGVuaW0gYWQgbWluaW1hIHZlbmlhbSwgcXVpcyBub3N0cnVtIGV4ZXJjaXRhdGlvbmVtIHVsbGFtIGNvcnBvcmlzIHN1c2NpcGl0IGxhYm9yaW9zYW0sIG5pc2kgdXQgYWxpcXVpZCBleCBlYSBjb21tb2RpIGNvbnNlcXVhdHVyPyBRdWlzIGF1dGVtIHZlbCBldW0gaXVyZSByZXByZWhlbmRlcml0IHF1aSBpbiBlYSB2b2x1cHRhdGUgdmVsaXQgZXNzZSBxdWFtIG5paGlsIG1vbGVzdGlhZSBjb25zZXF1YXR1ciwgdmVsIGlsbHVtIHF1aSBkb2xvcmVtIGV1bSBmdWdpYXQgcXVvIHZvbHVwdGFzIG51bGxhIHBhcmlhdHVyPyJ9CgkJCV19LAoJCQl7a2luZDogIm9ueXguQnV0dG9uIiwgY29udGVudDogIlRvZ2dsZSBGdWxsc2NyZWVuIiwgb250YXA6ICJ0b2dnbGVGdWxsc2NyZWVuIn0KCQldfQoJXSwKCS8vKiBTZXQvdW5zZXQgX3RoaXMuJC5zYW1wbGVDb250ZW50XyBhcyBmdWxsc2NyZWVuIGNvbnRyb2wKCXRvZ2dsZUZ1bGxzY3JlZW46IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdmFyIHRhcmdldENvbnRyb2wgPSB0aGlzLiQuc2FtcGxlQ29udGVudDsKCQkKCQkvLyBJZiBfdGFyZ2V0Q29udHJvbF8gaXMgY3VycmVudGx5IGZ1bGxzY3JlZW4sIGNhbmNlbCBmdWxsc2NyZWVuCgkJaWYgKHRhcmdldENvbnRyb2wuaXNGdWxsc2NyZWVuKCkpIHsKCQkJdGFyZ2V0Q29udHJvbC5jYW5jZWxGdWxsc2NyZWVuKCk7CgkJCgkJLy8gSWYgX3RhcmdldENvbnRyb2xfIGlzIG5vdCBjdXJyZW50bHkgZnVsbHNjcmVlbiwgcmVxdWVzdCBmdWxsc2NyZWVuCgkJfSBlbHNlIHsKCQkJdGFyZ2V0Q29udHJvbC5yZXF1ZXN0RnVsbHNjcmVlbigpOwoJCX0KCX0KfSk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/GestureSample.css"
Content-Type: application/octet-stream; x-encoding=base64
Lmdlc3R1cmUtc2FtcGxlIHsKCXBhZGRpbmc6IDE1cHg7Cn0KCi5nZXN0dXJlLXNhbXBsZSA+ICogewoJbWFyZ2luLWJvdHRvbToxMHB4Owp9CgouZ2VzdHVyZS1zYW1wbGUtcGFkIHsKCWJvcmRlci1yYWRpdXM6IDVweDsKCWJhY2tncm91bmQtY29sb3I6ICM4ODg7Cgljb2xvcjogIzY4Njg2ODsKIAl0ZXh0LXNoYWRvdzojQUFBIDBweCAxcHggMCwgIzAwMCAwIC0xcHggMDsKIAl0ZXh0LWFsaWduOmNlbnRlcjsKCXBhZGRpbmctdG9wOjE1JTsKCWZvbnQtc2l6ZTozMHB4OwoJb3ZlcmZsb3c6aGlkZGVuOwp9CgouZ2VzdHVyZS1zYW1wbGUtbm90ZSB7Cglmb250LXNpemU6MTVweDsgCgl0ZXh0LXNoYWRvdzpub25lOwp9CgouZ2VzdHVyZS1zYW1wbGUtcGFkZGVkID4gKiB7CglwYWRkaW5nOjVweDsKfQoKLmdlc3R1cmUtc2FtcGxlLWxlZnQgPiAqIHsKCXRleHQtYWxpZ246bGVmdDsKfQoKLmdlc3R1cmUtc2FtcGxlLXNldHRpbmcgewoJZm9udC1zaXplOiAxNXB4OwoJcGFkZGluZzogMTBweDsKCW1pbi1oZWlnaHQ6IDMwcHg7CglsaW5lLWhlaWdodDogMzBweDsKfQouZ2VzdHVyZS1zYW1wbGUtc2V0dGluZyA+ICogewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgouZ2VzdHVyZS1zYW1wbGUtc2V0dGluZyA+IDpsYXN0LWNoaWxkIHsKCWZsb2F0OiByaWdodDsKfQoKQG1lZGlhIGFsbCBhbmQgKG1heC1oZWlnaHQ6NjAwcHgpIHsKCS5nZXN0dXJlLXNhbXBsZS10cnVuY2F0ZSB7CgkJd2lkdGg6MTAwJTsKCQl3b3JkLXdyYXA6bm9ybWFsOwoJCXdoaXRlLXNwYWNlOm5vd3JhcDsKCQlvdmVyZmxvdzpoaWRkZW47CgkJLW8tdGV4dC1vdmVyZmxvdzplbGxpcHNpczsKCQl0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOwoJfQp9Cgo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/GestureSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5HZXN0dXJlIFNhbXBsZTwvdGl0bGU+Cgk8IS0tIC0tPgoJPHNjcmlwdCBzcmM9Ii4uLy4uL2VueW8vZW55by5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTxzY3JpcHQgc3JjPSIuLi8uLi9saWIvbGF5b3V0L3BhY2thZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vbGliL29ueXgvcGFja2FnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTwhLS0gLS0+Cgk8bGluayBocmVmPSJHZXN0dXJlU2FtcGxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KCTxzY3JpcHQgc3JjPSJHZXN0dXJlU2FtcGxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPCEtLSAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ib255eCI+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCW5ldyBlbnlvLnNhbXBsZS5HZXN0dXJlU2FtcGxlKCkucmVuZGVySW50byhkb2N1bWVudC5ib2R5KTsKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/GestureSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5HZXN0dXJlU2FtcGxlIiwKCWtpbmQ6ICJGaXR0YWJsZVJvd3MiLAoJY2xhc3NlczogImdlc3R1cmUtc2FtcGxlIGVueW8tZml0IGVueW8tdW5zZWxlY3RhYmxlIiwKCWNvbXBvbmVudHM6IFsKCQl7CgkJCWNsYXNzZXM6Imdlc3R1cmUtc2FtcGxlLXBhZCIsCgkJCWZpdDp0cnVlLAoJCQlvbmRvd246ICJoYW5kbGVFdmVudCIsCgkJCW9udXA6ICJoYW5kbGVFdmVudCIsCgkJCW9udGFwOiAiaGFuZGxlRXZlbnQiLAoJCQlvbm1vdmU6ICJoYW5kbGVFdmVudCIsCgkJCW9uZW50ZXI6ICJoYW5kbGVFdmVudCIsCgkJCW9ubGVhdmU6ICJoYW5kbGVFdmVudCIsCgkJCW9uZHJhZ3N0YXJ0OiAiaGFuZGxlRXZlbnQiLAoJCQlvbmRyYWc6ICJoYW5kbGVFdmVudCIsCgkJCW9uZHJhZ292ZXI6ICJoYW5kbGVFdmVudCIsCgkJCW9uaG9sZDogImhhbmRsZUV2ZW50IiwKCQkJb25yZWxlYXNlOiAiaGFuZGxlRXZlbnQiLAoJCQlvbmhvbGRwdWxzZTogImhhbmRsZUV2ZW50IiwKCQkJb25mbGljazogImhhbmRsZUV2ZW50IiwKCQkJb25nZXN0dXJlc3RhcnQ6ICJoYW5kbGVFdmVudCIsCgkJCW9uZ2VzdHVyZWNoYW5nZTogImhhbmRsZUV2ZW50IiwKCQkJb25nZXN0dXJlZW5kOiAiaGFuZGxlRXZlbnQiLAoJCQljb21wb25lbnRzOiBbCgkJCQl7Y29udGVudDogIlBlcmZvcm0gZ2VzdHVyZXMgaGVyZSJ9LAoJCQkJe2NsYXNzZXM6ICJnZXN0dXJlLXNhbXBsZS1ub3RlIiwgY29udGVudDoiKHRhcCBiZWxvdyBmb3Igb3B0aW9ucykifQoJCQldCgkJfSwKCQl7a2luZDogIm9ueXguR3JvdXBib3giLCBvbnRhcDoidG9nZ2xlU2V0dGluZ3MiLCBjb21wb25lbnRzOiBbCgkJCXtraW5kOiAib255eC5Hcm91cGJveEhlYWRlciIsIGNvbnRlbnQ6ICJFdmVudHMifSwKCQkJe25hbWU6ICJldmVudExpc3QiLCBzdHlsZToiZm9udC1zaXplOjEycHg7Iiwgb25Eb25lOiJyZW1vdmVFdmVudCIsIGNvbXBvbmVudHM6IFsKCQkJCXtuYW1lOiJ3YWl0aW5nIiwgY29udGVudDogIldhaXRpbmcgZm9yIGV2ZW50cy4uLiIsIHN0eWxlOiJwYWRkaW5nOjRweDtmb250LXN0eWxlOml0YWxpYztjb2xvcjpncmF5OyJ9CgkJCV19CgkJXX0sCgkJe29udGFwOiJ0b2dnbGVTZXR0aW5ncyIsIG5hbWU6InNldHRpbmdzIiwgc2hvd2luZzpmYWxzZSwgY29tcG9uZW50czogWwoJCQl7a2luZDogIm9ueXguR3JvdXBib3giLCBjbGFzc2VzOiJnZXN0dXJlLXNhbXBsZS1wYWRkZWQiLCBjb21wb25lbnRzOiBbCgkJCQl7a2luZDogIm9ueXguR3JvdXBib3hIZWFkZXIiLCBjb250ZW50OiAiT3B0aW9ucyJ9LAoJCQkJe2NsYXNzZXM6Imdlc3R1cmUtc2FtcGxlLXNldHRpbmciLCBjb21wb25lbnRzOiBbCgkJCQkJe2NvbnRlbnQ6IlRydW5jYXRlIGRldGFpbCBvbiBzbWFsbCBzY3JlZW46ICJ9LAoJCQkJCXtuYW1lOiJ0cnVuY2F0ZURldGFpbCIsIG9uY2hhbmdlOiJ0cnVuY2F0ZUNoYW5nZWQiLCBvbnRhcDoicHJldmVudERlZmF1bHQiLCBraW5kOiJvbnl4LkNoZWNrYm94IiwgY2hlY2tlZDp0cnVlfQoJCQkJXX0sCgkJCQl7Y2xhc3NlczoiZ2VzdHVyZS1zYW1wbGUtc2V0dGluZyIsIHN0eWxlOiJtaW4taGVpZ2h0OjQwcHg7IiwgY29tcG9uZW50czogWwoJCQkJCXtjb250ZW50OiJNb25pdG9yIGV2ZW50OiAifSwKCQkJCQl7a2luZDoib255eC5QaWNrZXJEZWNvcmF0b3IiLCBvbnRhcDoicHJldmVudERlZmF1bHQiLCBvblNlbGVjdDoibW9uaXRvckV2ZW50U2VsZWN0ZWQiLCBjb21wb25lbnRzOiBbCgkJCQkJCXtjb250ZW50OiJTZWxlY3QgZXZlbnQiLCBzdHlsZToid2lkdGg6MTQwcHg7IG1hcmdpbi1ib3R0b206NXB4OyJ9LAoJCQkJCQl7bmFtZToiZXZlbnRQaWNrZXIiLCBraW5kOiJvbnl4LlBpY2tlciIsIGNsYXNzZXM6Imdlc3R1cmUtc2FtcGxlLWxlZnQifQoJCQkJCV19CgkJCQldfQoJCQldfQoJCV19CgldLAoJY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXRoaXMuZXZlbnRMaXN0ID0ge307CgkJdGhpcy5ldmVudENvdW50ID0gMDsKCQllbnlvLmZvckVhY2goCgkJCVsiQWxsIGV2ZW50cyIsImRvd24iLCJ1cCIsInRhcCIsIm1vdmUiLCJlbnRlciIsImxlYXZlIiwiZHJhZ3N0YXJ0IiwiZHJhZyIsImRyYWdvdmVyIiwiaG9sZCIsInJlbGVhc2UiLAoJCQkJImhvbGRwdWxzZSIsImZsaWNrIiwiZ2VzdHVyZXN0YXJ0IiwiZ2VzdHVyZWNoYW5nZSIsImdlc3R1cmVlbmQiXSwKCQkJdGhpcy5iaW5kU2FmZWx5KGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQl0aGlzLiQuZXZlbnRQaWNrZXIuY3JlYXRlQ29tcG9uZW50KHtjb250ZW50OmV2ZW50LCBzdHlsZToidGV4dC1hbGlnbjpsZWZ0In0pOwoJCQl9KSk7Cgl9LAoJaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdmFyIGV2ZW50ID0gZW55by5jbG9uZShpbkV2ZW50KTsKCQlpZiAodGhpcy5tb25pdG9yRXZlbnQgJiYgKGV2ZW50LnR5cGUgIT0gdGhpcy5tb25pdG9yRXZlbnQpKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCQl2YXIgZXZlbnRJdGVtID0gdGhpcy5ldmVudExpc3RbZXZlbnQudHlwZV07CgkJaWYgKGV2ZW50SXRlbSkgewoJCQlldmVudEl0ZW0uc2V0KCJldmVudCIsIGV2ZW50LCB0cnVlKTsKCQl9IGVsc2UgewoJCQl0aGlzLmV2ZW50Q291bnQrKzsKCQkJZXZlbnRJdGVtID0gdGhpcy4kLmV2ZW50TGlzdC5jcmVhdGVDb21wb25lbnQoewoJCQkJa2luZDogImVueW8uc2FtcGxlLkV2ZW50SXRlbSIsCgkJCQlldmVudDpldmVudCwKCQkJCXRydW5jYXRlOiB0aGlzLiQudHJ1bmNhdGVEZXRhaWwuZ2V0KCJ2YWx1ZSIpLAoJCQkJcGVyc2lzdDogdGhpcy5tb25pdG9yRXZlbnQKCQkJfSk7CgkJCXRoaXMuZXZlbnRMaXN0W2V2ZW50LnR5cGVdID0gZXZlbnRJdGVtOwoJCX0KCQlldmVudEl0ZW0ucmVuZGVyKCk7CgkJdGhpcy4kLndhaXRpbmcuaGlkZSgpOwoJCXRoaXMucmVmbG93KCk7CgkJcmV0dXJuIHRydWU7Cgl9LAoJdHJ1bmNhdGVDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQlmb3IgKHZhciBpIGluIHRoaXMuZXZlbnRMaXN0KSB7CgkJCXRoaXMuZXZlbnRMaXN0W2ldLnNldCgidHJ1bmNhdGUiLCB0aGlzLiQudHJ1bmNhdGVEZXRhaWwuZ2V0KCJ2YWx1ZSIpKTsKCQl9CgkJdGhpcy5yZWZsb3coKTsKCQlyZXR1cm4gZmFsc2U7Cgl9LAoJcmVtb3ZlRXZlbnQ6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdGhpcy5ldmVudENvdW50LS07CgkJdGhpcy5ldmVudExpc3RbaW5FdmVudC50eXBlXS5kZXN0cm95KCk7CgkJZGVsZXRlIHRoaXMuZXZlbnRMaXN0W2luRXZlbnQudHlwZV07CgkJaWYgKHRoaXMuZXZlbnRDb3VudCA9PT0gMCkgewoJCQl0aGlzLiQud2FpdGluZy5zaG93KCk7CgkJfQoJCXRoaXMucmVmbG93KCk7CgkJcmV0dXJuIHRydWU7Cgl9LAoJcmVtb3ZlQWxsRXZlbnRzOiBmdW5jdGlvbigpIHsKCQlmb3IgKHZhciBpIGluIHRoaXMuZXZlbnRMaXN0KSB7CgkJCXRoaXMuZXZlbnRMaXN0W2ldLmRlc3Ryb3koKTsKCQkJZGVsZXRlIHRoaXMuZXZlbnRMaXN0W2ldOwoJCX0KCQl0aGlzLmV2ZW50Q291bnQgPSAwOwoJCXRoaXMuJC53YWl0aW5nLnNob3coKTsKCQl0aGlzLnJlZmxvdygpOwoJfSwKCXRvZ2dsZVNldHRpbmdzOiBmdW5jdGlvbigpIHsKCQl0aGlzLiQuc2V0dGluZ3Muc2V0KCJzaG93aW5nIiwgIXRoaXMuJC5zZXR0aW5ncy5nZXQoInNob3dpbmciKSk7CgkJdGhpcy5yZWZsb3coKTsKCX0sCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRydWU7Cgl9LAoJbW9uaXRvckV2ZW50U2VsZWN0ZWQ6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdGhpcy5yZW1vdmVBbGxFdmVudHMoKTsKCQlpZiAoaW5FdmVudC5vcmlnaW5hdG9yLmNvbnRlbnQgPT0gIkFsbCBldmVudHMiKSB7CgkJCXRoaXMubW9uaXRvckV2ZW50ID0gbnVsbDsKCQl9IGVsc2UgewoJCQl0aGlzLm1vbml0b3JFdmVudCA9IGluRXZlbnQub3JpZ2luYXRvci5jb250ZW50OwoJCX0KCX0KfSk7CgplbnlvLmtpbmQoewoJbmFtZToiZW55by5zYW1wbGUuRXZlbnRJdGVtIiwKCXB1Ymxpc2hlZDogewoJCWV2ZW50OiIiLAoJCXRydW5jYXRlOiB0cnVlLAoJCXBlcnNpc3Q6IGZhbHNlCgl9LAoJc3R5bGU6InBhZGRpbmc6NHB4OyIsCglldmVudHM6IHsKCQlvbkRvbmU6IiIKCX0sCgljb21wb25lbnRzOiBbCgkJe25hbWU6ImV2ZW50UHJvcHMiLCBhbGxvd0h0bWw6dHJ1ZX0sCgkJe2tpbmQ6IkFuaW1hdG9yIiwgZHVyYXRpb246MTAwMCwgc3RhcnRWYWx1ZTowLCBlbmRWYWx1ZToyNTUsIG9uU3RlcDoic3RlcEFuaW1hdGlvbiIsIG9uRW5kOiJhbmltYXRpb25FbmRlZCJ9CgldLAoJY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXRoaXMuZXZlbnRDaGFuZ2VkKCk7CgkJdGhpcy50cnVuY2F0ZUNoYW5nZWQoKTsKCX0sCgl0cnVuY2F0ZUNoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuJC5ldmVudFByb3BzLmFkZFJlbW92ZUNsYXNzKCJnZXN0dXJlLXNhbXBsZS10cnVuY2F0ZSIsIHRoaXMudHJ1bmNhdGUpOwoJfSwKCWV2ZW50Q2hhbmdlZDogZnVuY3Rpb24oaW5PbGQpIHsKCQlpZiAodGhpcy5ldmVudCkgewoJCQlpZiAodGhpcy50aW1lb3V0KSB7CgkJCQljbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTsKCQkJCXRoaXMudGltZW91dCA9IG51bGw7CgkJCX0KCQkJdGhpcy4kLmFuaW1hdG9yLnN0b3AoKTsKCQkJdGhpcy4kLmV2ZW50UHJvcHMuc2V0KCJjb250ZW50IiwgdGhpcy5nZXRQcm9wc1N0cmluZygpKTsKCQkJdGhpcy4kLmFuaW1hdG9yLnBsYXkoKTsKCQl9Cgl9LAoJc3RlcEFuaW1hdGlvbjogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQl2YXIgdiA9IE1hdGguZmxvb3IoaW5TZW5kZXIudmFsdWUpOwoJCXRoaXMuYXBwbHlTdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsICJyZ2IoIiArIHYgKyAiLDI1NSwiICsgdiArICIpOyIpOwoJCXJldHVybiB0cnVlOwoJfSwKCWFuaW1hdGlvbkVuZGVkOiBmdW5jdGlvbigpIHsKCQlpZiAoIXRoaXMucGVyc2lzdCkgewoJCQl0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuYmluZFNhZmVseShmdW5jdGlvbigpIHsKCQkJCXRoaXMuZG9Eb25lKHt0eXBlOnRoaXMuZXZlbnQudHlwZX0pOwoJCQl9KSwgMjAwMCk7CgkJfQoJCXJldHVybiB0cnVlOwoJfSwKCWRlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLnRpbWVvdXQpIHsKCQkJY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7CgkJCXRoaXMudGltZW91dCA9IG51bGw7CgkJfQoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJZ2V0UHJvcHNTdHJpbmc6IGZ1bmN0aW9uKCkgewoJCXZhciBwcm9wcyA9IFtdOwoJCWZvciAodmFyIGkgaW4gdGhpcy5ldmVudCkgewoJCQlpZiAoKHRoaXMuZXZlbnRbaV0gIT09IHVuZGVmaW5lZCkgJiYKCQkJCSh0aGlzLmV2ZW50W2ldICE9PSBudWxsKSAmJgoJCQkJISh0aGlzLmV2ZW50W2ldIGluc3RhbmNlb2YgT2JqZWN0KSAmJgoJCQkJKGkgIT0gInR5cGUiKSkgewoJCQkJcHJvcHMucHVzaChpICsgIjogIiArIHRoaXMuZXZlbnRbaV0pOwoJCQl9CgkJfQoJCWlmICh0aGlzLmV2ZW50LnNyY0V2ZW50ICYmIHRoaXMuZXZlbnQuc3JjRXZlbnQudHlwZSkgewoJCQlwcm9wcy5wdXNoKCJzcmNFdmVudC50eXBlOiAiICsgdGhpcy5ldmVudC5zcmNFdmVudC50eXBlKTsKCQl9CgkJcmV0dXJuICI8Yj4iICsgdGhpcy5ldmVudC50eXBlICsgIjwvYj46IHsgIiArIHByb3BzLmpvaW4oIiwgIikgKyAiIH0iOwoJfQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/JsonpSample.css"
Content-Type: application/octet-stream; x-encoding=base64
Lmpzb25wLXNhbXBsZSB7CglwYWRkaW5nOiAxNXB4Owp9CgouanNvbnAtc2FtcGxlLXNvdXJjZSB7CglwYWRkaW5nOjE1cHg7Cglmb250LWZhbWlseTogbW9ub3NwYWNlOwoJZm9udC1zaXplOiAxMnB4OwoJd2hpdGUtc3BhY2U6IHByZS13cmFwOwoJYm94LXNpemluZzogYm9yZGVyLWJveDsKCXdpZHRoOjEwMCU7IAoJaGVpZ2h0OjEwMCU7CgltYXJnaW4tdG9wOjE1cHg7Cn0K
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/JsonpSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5KU09OUCBTYW1wbGU8L3RpdGxlPgoJPCEtLSAtLT4KCTxzY3JpcHQgc3JjPSIuLi8uLi9lbnlvL2VueW8uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2xheW91dC9wYWNrYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9vbnl4L3BhY2thZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8IS0tIC0tPgoJPGxpbmsgaHJlZj0iSnNvbnBTYW1wbGUuY3NzIiByZWw9InN0eWxlc2hlZXQiPgoJPHNjcmlwdCBzcmM9Ikpzb25wU2FtcGxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPCEtLSAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ib255eCI+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCW5ldyBlbnlvLnNhbXBsZS5Kc29ucFNhbXBsZSgpLnJlbmRlckludG8oZG9jdW1lbnQuYm9keSk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/JsonpSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5Kc29ucFNhbXBsZSIsCglraW5kOiAiRml0dGFibGVSb3dzIiwKCWNsYXNzZXM6ICJlbnlvLWZpdCBqc29ucC1zYW1wbGUiLAoJY29tcG9uZW50czogWwoJCXtraW5kOiAiRml0dGFibGVDb2x1bW5zIiwgY2xhc3Nlczoib255eC10b29sYmFyLWlubGluZSIsIGNvbXBvbmVudHM6IFsKCQkJe2NvbnRlbnQ6ICJZUUw6ICJ9LAoJCQl7a2luZDogIm9ueXguSW5wdXQiLCBuYW1lOiJxdWVyeSIsIGZpdDp0cnVlLCB2YWx1ZTonc2VsZWN0ICogZnJvbSB1cGNvbWluZy5ldmVudHMgd2hlcmUgd29laWQgaW4gKHNlbGVjdCB3b2VpZCBmcm9tIGdlby5wbGFjZXMgd2hlcmUgdGV4dD0iU3Vubnl2YWxlLCBDQSIpJ30sCgkJCXtraW5kOiAib255eC5CdXR0b24iLCBjb250ZW50OiJGZXRjaCIsIG9udGFwOiJmZXRjaCJ9CgkJXX0sCgkJe2tpbmQ6ICJvbnl4LlRleHRBcmVhIiwgZml0OnRydWUsIGNsYXNzZXM6Impzb25wLXNhbXBsZS1zb3VyY2UifQoJXSwKCWZldGNoOiBmdW5jdGlvbigpIHsKCQl2YXIganNvbnAgPSBuZXcgZW55by5Kc29ucFJlcXVlc3QoewoJCQl1cmw6ICJodHRwOi8vcXVlcnkueWFob29hcGlzLmNvbS92MS9wdWJsaWMveXFsP2Zvcm1hdD1qc29uIiwKCQkJY2FsbGJhY2tOYW1lOiAiY2FsbGJhY2siCgkJfSk7CgkJLy8gc2VuZCBwYXJhbWV0ZXJzIHRoZSByZW1vdGUgc2VydmljZSB1c2luZyB0aGUgJ2dvKCknIG1ldGhvZAoJCWpzb25wLmdvKHsKCQkJcTogdGhpcy4kLnF1ZXJ5LmdldFZhbHVlKCkKCQl9KTsKCQkvLyBhdHRhY2ggcmVzcG9uZGVycyB0byB0aGUgdHJhbnNhY3Rpb24gb2JqZWN0CgkJanNvbnAucmVzcG9uc2UodGhpcywgInByb2Nlc3NSZXNwb25zZSIpOwoJfSwKCXByb2Nlc3NSZXNwb25zZTogZnVuY3Rpb24oaW5TZW5kZXIsIGluUmVzcG9uc2UpIHsKCQkvLyBkbyBzb21ldGhpbmcgd2l0aCBpdAoJCXRoaXMuJC50ZXh0QXJlYS5zZXRWYWx1ZShKU09OLnN0cmluZ2lmeShpblJlc3BvbnNlLCBudWxsLCAyKSk7Cgl9Cn0pOw==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/NestedRepeaterSample.css"
Content-Type: application/octet-stream; x-encoding=base64
Lm5lc3RlZC1yZXBlYXRlci1zYW1wbGUgewoJcGFkZGluZzoxNXB4Owp9Ci5uZXN0ZWQtcmVwZWF0ZXItc2FtcGxlLWl0ZW0gewoJcGFkZGluZzo0cHg7CgltYXJnaW46MnB4OwoJYm9yZGVyOjFweCBzb2xpZCBncmF5OwoJYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5Owp9
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/NestedRepeaterSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5OZXN0ZWQgUmVwZWF0ZXIgU2FtcGxlPC90aXRsZT4KCTwhLS0gLS0+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vZW55by9lbnlvLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9sYXlvdXQvcGFja2FnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTxzY3JpcHQgc3JjPSIuLi8uLi9saWIvb255eC9wYWNrYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPCEtLSAtLT4KCTxsaW5rIGhyZWY9Ik5lc3RlZFJlcGVhdGVyU2FtcGxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KCTxzY3JpcHQgc3JjPSJOZXN0ZWRSZXBlYXRlclNhbXBsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTwhLS0gLS0+CjwvaGVhZD4KPGJvZHkgY2xhc3M9Im9ueXgiPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgluZXcgZW55by5TY3JvbGxlcih7CgkJY29tcG9uZW50czogWyB7IGtpbmQ6ICJlbnlvLnNhbXBsZS5OZXN0ZWRSZXBlYXRlclNhbXBsZSIgfSBdCgl9KS5yZW5kZXJJbnRvKGRvY3VtZW50LmJvZHkpOwo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/NestedRepeaterSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5OZXN0ZWRSZXBlYXRlclNhbXBsZSIsCgljbGFzc2VzOiAiZW55by1maXQgbmVzdGVkLXJlcGVhdGVyLXNhbXBsZSIsCgljb21wb25lbnRzOiBbCgkJe2tpbmQ6ICJSZXBlYXRlciIsIG5hbWU6ICJvdXRlciIsIG9uU2V0dXBJdGVtOiJzZXR1cEdyb3VwIiwgY291bnQ6IDMsIGNvbXBvbmVudHM6IFsKCQkJe2tpbmQ6ICJSZXBlYXRlciIsIG5hbWU6ICJpbm5lciIsIG9uU2V0dXBJdGVtOiJzZXR1cEl0ZW0iLCBjb21wb25lbnRzOiBbCgkJCQl7bmFtZToiaXRlbSIsIGNsYXNzZXM6Im5lc3RlZC1yZXBlYXRlci1zYW1wbGUtaXRlbSIsIGNvbXBvbmVudHM6IFsKCQkJCQl7dGFnOiJzcGFuIiwgbmFtZTogInBlcnNvbk51bWJlciJ9LAoJCQkJCXt0YWc6InNwYW4iLCBuYW1lOiAicGVyc29uTmFtZSJ9CgkJCQldfQoJCQldfQoJCV19CgldLAoJY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCXNldHVwR3JvdXA6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdmFyIGl0ZW0gPSBpbkV2ZW50Lml0ZW07CgkJaXRlbS4kLmlubmVyLnNldENvdW50KHRoaXMucGVvcGxlLmxlbmd0aCk7CgkJcmV0dXJuIHRydWU7Cgl9LAoJc2V0dXBJdGVtOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCXZhciBncm91cCA9IGluRXZlbnQuaW5kaWNlc1sxXTsKCQl2YXIgaW5kZXggPSBpbkV2ZW50LmluZGV4OwoJCXZhciBpdGVtID0gaW5FdmVudC5pdGVtOwoJCXZhciBwZXJzb24gPSB0aGlzLnBlb3BsZVtpbmRleF07CgkJaXRlbS4kLnBlcnNvbk51bWJlci5zZXRDb250ZW50KChncm91cCArIDEpICsgIjoiICsgKGluZGV4KzEpICsgIi4gIik7CgkJaXRlbS4kLnBlcnNvbk5hbWUuc2V0Q29udGVudChwZXJzb24ubmFtZSk7CgkJaXRlbS4kLnBlcnNvbk5hbWUuYXBwbHlTdHlsZSgiY29sb3IiLCBwZXJzb24uc2V4ID09ICJtYWxlIiA/ICJkb2RnZXJibHVlIiA6ICJkZWVwcGluayIpOwoJCS8qIHN0b3AgcHJvcGFnYXRpb24gKi8KCQlyZXR1cm4gdHJ1ZTsKCX0sCglwZW9wbGU6IFsKCQl7bmFtZTogIkFuZHJldyIsIHNleDoibWFsZSJ9LAoJCXtuYW1lOiAiQmV0dHkiLCBzZXg6ImZlbWFsZSJ9LAoJCXtuYW1lOiAiQ2hyaXN0b3BoZXIiLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIkRvbm5hIiwgc2V4OiJmZW1hbGUifSwKCQl7bmFtZTogIkVwaHJhaW0iLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIkZyYW5raWUiLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIkdlcmFsZCIsIHNleDoibWFsZSJ9LAoJCXtuYW1lOiAiSGVhdGhlciIsIHNleDoiZmVtYWxlIn0sCgkJe25hbWU6ICJJbmdyZWQiLCBzZXg6ImZlbWFsZSJ9LAoJCXtuYW1lOiAiSmFjayIsIHNleDoibWFsZSJ9LAoJCXtuYW1lOiAiS2V2aW4iLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIkx1Y3kiLCBzZXg6ImZlbWFsZSJ9LAoJCXtuYW1lOiAiTWF0dGhldyIsIHNleDoibWFsZSJ9LAoJCXtuYW1lOiAiTm9yZWVuIiwgc2V4OiJmZW1hbGUifSwKCQl7bmFtZTogIk9zY2FyIiwgc2V4OiJtYWxlIn0sCgkJe25hbWU6ICJQZWRybyIsIHNleDoibWFsZSJ9LAoJCXtuYW1lOiAiUXVlbnRpbiIsIHNleDoibWFsZSJ9LAoJCXtuYW1lOiAiUmFscGgiLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIlN0ZXZlbiIsIHNleDoibWFsZSJ9LAoJCXtuYW1lOiAiVHJhY3kiLCBzZXg6ImZlbWFsZSJ9LAoJCXtuYW1lOiAiVW1hIiwgc2V4OiJmZW1hbGUifSwKCQl7bmFtZTogIlZpY3RvciIsIHNleDoibWFsZSJ9LAoJCXtuYW1lOiAiV2VuZHkiLCBzZXg6ImZlbWFsZSJ9LAoJCXtuYW1lOiAiWGluIiwgc2V4OiJtYWxlIn0sCgkJe25hbWU6ICJZdWxpYSIsIHNleDoiZmVtYWxlIn0sCgkJe25hbWU6ICJab2x0YW4ifQoJXQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/PlatformSample.css"
Content-Type: application/octet-stream; x-encoding=base64
LnBsYXRmb3JtLXNhbXBsZSB7CglwYWRkaW5nOiAxNXB4Owp9Ci5wbGF0Zm9ybS1zYW1wbGUtZGl2aWRlciB7Cgljb2xvcjogI0Y0OTIwMDsKCXRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cglmb250LWZhbWlseTogU2Vnb2UgVUksIFByZWx1ZGUgTWVkaXVtLCBIZWx2ZXRpY2EsIFZlcmRhbmEsIHNhbnMtc2VyaWY7Cglmb250LXNpemU6IDE0cHg7Cglmb250LXdlaWdodDogYm9sZDsKCW1hcmdpbi1ib3R0b206IDhweDsKfQ==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/PlatformSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5QbGF0Zm9ybSBTYW1wbGU8L3RpdGxlPgoJPCEtLSAtLT4KCTxzY3JpcHQgc3JjPSIuLi8uLi9lbnlvL2VueW8uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2xheW91dC9wYWNrYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9vbnl4L3BhY2thZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8IS0tIC0tPgoJPGxpbmsgaHJlZj0iUGxhdGZvcm1TYW1wbGUuY3NzIiByZWw9InN0eWxlc2hlZXQiPgoJPHNjcmlwdCBzcmM9IlBsYXRmb3JtU2FtcGxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPCEtLSAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ib255eCI+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCW5ldyBlbnlvLnNhbXBsZS5QbGF0Zm9ybVNhbXBsZSgpLnJlbmRlckludG8oZG9jdW1lbnQuYm9keSk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/PlatformSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5QbGF0Zm9ybVNhbXBsZSIsCglraW5kOiAiRml0dGFibGVSb3dzIiwKCWNsYXNzZXM6ICJlbnlvLWZpdCBwbGF0Zm9ybS1zYW1wbGUiLAoJY29tcG9uZW50czogWwoJCXtjbGFzc2VzOiAicGxhdGZvcm0tc2FtcGxlLWRpdmlkZXIiLCBjb250ZW50OiAiRW55byBQbGF0Zm9ybSBEZXRlY3Rpb24ifSwKCQl7a2luZDogIm9ueXguR3JvdXBib3giLCBjb21wb25lbnRzOiBbCgkJCXtraW5kOiAib255eC5Hcm91cGJveEhlYWRlciIsIGNvbnRlbnQ6ICJVc2VyLUFnZW50IFN0cmluZyJ9LAoJCQl7bmFtZTogInVhU3RyaW5nIiwgY29udGVudDogIiIsIHN0eWxlOiAicGFkZGluZzogOHB4OyJ9CgkJXX0sCgkJe3RhZzogImJyIn0sCgkJe2tpbmQ6ICJvbnl4Lkdyb3VwYm94IiwgY29tcG9uZW50czogWwoJCQl7a2luZDogIm9ueXguR3JvdXBib3hIZWFkZXIiLCBjb250ZW50OiAiV2luZG93In0sCgkJCXtuYW1lOiAid2luZG93QXR0ciIsIGNvbnRlbnQ6ICIiLCBzdHlsZTogInBhZGRpbmc6IDhweDsifQoJCV19LAoJCXt0YWc6ICJiciJ9LAoJCXtraW5kOiAib255eC5Hcm91cGJveCIsIGNvbXBvbmVudHM6IFsKCQkJe2tpbmQ6ICJvbnl4Lkdyb3VwYm94SGVhZGVyIiwgY29udGVudDogImVueW8ucGxhdGZvcm0ifSwKCQkJe25hbWU6ICJlbnlvUGxhdGZvcm1KU09OIiwgY29udGVudDogIiIsIHN0eWxlOiAicGFkZGluZzogOHB4OyJ9CgkJXX0KCV0sCgl1cGRhdGVXaW5kb3dTaXplOiBmdW5jdGlvbigpIHsKCQl2YXIgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDsKCQlpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgewoJCQl3aWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsKCQl9CgkJdmFyIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsKCQlpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsKCQkJaGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsKCQl9CgkJdGhpcy4kLndpbmRvd0F0dHIuc2V0Q29udGVudCgic2l6ZTogIiArIHdpZHRoICsgIngiICsgaGVpZ2h0ICsKCQkJIiwgZGV2aWNlUGl4ZWxSYXRpbzogIiArIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTsKCX0sCgljcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJdGhpcy4kLnVhU3RyaW5nLnNldENvbnRlbnQobmF2aWdhdG9yLnVzZXJBZ2VudCk7CgkJdGhpcy4kLmVueW9QbGF0Zm9ybUpTT04uc2V0Q29udGVudChKU09OLnN0cmluZ2lmeShlbnlvLnBsYXRmb3JtLCBudWxsLCAxKSk7CgkJdGhpcy51cGRhdGVXaW5kb3dTaXplKCk7Cgl9LAoJcmVzaXplSGFuZGxlcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl0aGlzLnVwZGF0ZVdpbmRvd1NpemUoKTsKCX0KfSk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/RepeaterSample.css"
Content-Type: application/octet-stream; x-encoding=base64
LnJlcGVhdGVyLXNhbXBsZSB7CglwYWRkaW5nOjE1cHg7Cn0KLnJlcGVhdGVyLXNhbXBsZS1pdGVtIHsKCXBhZGRpbmc6NHB4OwoJbWFyZ2luOjJweDsKCWJvcmRlcjoxcHggc29saWQgZ3JheTsKCWJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTsKfQ==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/RepeaterSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5SZXBlYXRlciBTYW1wbGU8L3RpdGxlPgoJPCEtLSAtLT4KCTxzY3JpcHQgc3JjPSIuLi8uLi9lbnlvL2VueW8uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2xheW91dC9wYWNrYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9vbnl4L3BhY2thZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8IS0tIC0tPgoJPGxpbmsgaHJlZj0iUmVwZWF0ZXJTYW1wbGUuY3NzIiByZWw9InN0eWxlc2hlZXQiPgoJPHNjcmlwdCBzcmM9IlJlcGVhdGVyU2FtcGxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPCEtLSAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ib255eCI+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCW5ldyBlbnlvLlNjcm9sbGVyKHsKCQljb21wb25lbnRzOiBbIHsga2luZDogImVueW8uc2FtcGxlLlJlcGVhdGVyU2FtcGxlIiB9IF0KCX0pLnJlbmRlckludG8oZG9jdW1lbnQuYm9keSk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/RepeaterSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5SZXBlYXRlclNhbXBsZSIsCgljbGFzc2VzOiAiZW55by1maXQgcmVwZWF0ZXItc2FtcGxlIiwKCWNvbXBvbmVudHM6IFsKCQl7a2luZDogIlJlcGVhdGVyIiwgb25TZXR1cEl0ZW06InNldHVwSXRlbSIsIGNvbXBvbmVudHM6IFsKCQkJe25hbWU6Iml0ZW0iLCBjbGFzc2VzOiJyZXBlYXRlci1zYW1wbGUtaXRlbSIsIGNvbXBvbmVudHM6IFsKCQkJCXt0YWc6InNwYW4iLCBuYW1lOiAicGVyc29uTnVtYmVyIn0sCgkJCQl7dGFnOiJzcGFuIiwgbmFtZTogInBlcnNvbk5hbWUifQoJCQldfQoJCV19CgldLAoJY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXRoaXMuJC5yZXBlYXRlci5zZXRDb3VudCh0aGlzLnBlb3BsZS5sZW5ndGgpOwoJfSwKCXNldHVwSXRlbTogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQl2YXIgaW5kZXggPSBpbkV2ZW50LmluZGV4OwoJCXZhciBpdGVtID0gaW5FdmVudC5pdGVtOwoJCXZhciBwZXJzb24gPSB0aGlzLnBlb3BsZVtpbmRleF07CgkJaXRlbS4kLnBlcnNvbk51bWJlci5zZXRDb250ZW50KChpbmRleCsxKSArICIuICIpOwoJCWl0ZW0uJC5wZXJzb25OYW1lLnNldENvbnRlbnQocGVyc29uLm5hbWUpOwoJCWl0ZW0uJC5wZXJzb25OYW1lLmFwcGx5U3R5bGUoImNvbG9yIiwgcGVyc29uLnNleCA9PSAibWFsZSIgPyAiZG9kZ2VyYmx1ZSIgOiAiZGVlcHBpbmsiKTsKCQkvKiBzdG9wIHByb3BhZ2F0aW9uICovCgkJcmV0dXJuIHRydWU7Cgl9LAoJcGVvcGxlOiBbCgkJe25hbWU6ICJBbmRyZXciLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIkJldHR5Iiwgc2V4OiJmZW1hbGUifSwKCQl7bmFtZTogIkNocmlzdG9waGVyIiwgc2V4OiJtYWxlIn0sCgkJe25hbWU6ICJEb25uYSIsIHNleDoiZmVtYWxlIn0sCgkJe25hbWU6ICJFcGhyYWltIiwgc2V4OiJtYWxlIn0sCgkJe25hbWU6ICJGcmFua2llIiwgc2V4OiJtYWxlIn0sCgkJe25hbWU6ICJHZXJhbGQiLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIkhlYXRoZXIiLCBzZXg6ImZlbWFsZSJ9LAoJCXtuYW1lOiAiSW5ncmVkIiwgc2V4OiJmZW1hbGUifSwKCQl7bmFtZTogIkphY2siLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIktldmluIiwgc2V4OiJtYWxlIn0sCgkJe25hbWU6ICJMdWN5Iiwgc2V4OiJmZW1hbGUifSwKCQl7bmFtZTogIk1hdHRoZXciLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIk5vcmVlbiIsIHNleDoiZmVtYWxlIn0sCgkJe25hbWU6ICJPc2NhciIsIHNleDoibWFsZSJ9LAoJCXtuYW1lOiAiUGVkcm8iLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIlF1ZW50aW4iLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIlJhbHBoIiwgc2V4OiJtYWxlIn0sCgkJe25hbWU6ICJTdGV2ZW4iLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIlRyYWN5Iiwgc2V4OiJmZW1hbGUifSwKCQl7bmFtZTogIlVtYSIsIHNleDoiZmVtYWxlIn0sCgkJe25hbWU6ICJWaWN0b3IiLCBzZXg6Im1hbGUifSwKCQl7bmFtZTogIldlbmR5Iiwgc2V4OiJmZW1hbGUifSwKCQl7bmFtZTogIlhpbiIsIHNleDoibWFsZSJ9LAoJCXtuYW1lOiAiWXVsaWEiLCBzZXg6ImZlbWFsZSJ9LAoJCXtuYW1lOiAiWm9sdGFuIn0KCV0KfSk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/ScrollerSample.css"
Content-Type: application/octet-stream; x-encoding=base64
LnNjcm9sbGVyLXNhbXBsZS1wYW5lbHMgewoJbWFyZ2luOjE1cHg7Cn0KLnNjcm9sbGVyLXNhbXBsZS1jb250ZW50IHsKCXdpZHRoOjQwMDBweDsKfQouc2Nyb2xsZXItc2FtcGxlLXNjcm9sbGVyIHsKCWJvcmRlcjogMXB4IHNvbGlkIG9yYW5nZTsKfQ==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/ScrollerSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5TY3JvbGxlciBTYW1wbGU8L3RpdGxlPgoJPCEtLSAtLT4KCTxzY3JpcHQgc3JjPSIuLi8uLi9lbnlvL2VueW8uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2xheW91dC9wYWNrYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9vbnl4L3BhY2thZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8IS0tIC0tPgoJPGxpbmsgaHJlZj0iU2Nyb2xsZXJTYW1wbGUuY3NzIiByZWw9InN0eWxlc2hlZXQiPgoJPHNjcmlwdCBzcmM9IlNjcm9sbGVyU2FtcGxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPCEtLSAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ib255eCI+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCW5ldyBlbnlvLnNhbXBsZS5TY3JvbGxlclNhbXBsZSgpLnJlbmRlckludG8oZG9jdW1lbnQuYm9keSk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/ScrollerSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5TY3JvbGxlclNhbXBsZSIsCglraW5kOiAiRml0dGFibGVSb3dzIiwKCWNsYXNzZXM6ICJlbnlvLWZpdCAgZW55by11bnNlbGVjdGFibGUiLAoJY29tcG9uZW50czogWwoJCXtraW5kOiAib255eC5Ub29sYmFyIiwgY29tcG9uZW50czogWwoJCQl7a2luZDogIm9ueXguUGlja2VyRGVjb3JhdG9yIiwgY29tcG9uZW50czogWwoJCQkJe2NvbnRlbnQ6IkNob29zZSBTY3JvbGxlciIsIHN0eWxlOiJ3aWR0aDoyNTBweDsifSwKCQkJCXtraW5kOiAib255eC5QaWNrZXIiLCBmbG9hdGluZzp0cnVlLCBtYXhIZWlnaHQ6IDMwMCwgb25TZWxlY3Q6InNhbXBsZUNoYW5nZWQiLCBjb21wb25lbnRzOiBbCgkJCQkJe2NvbnRlbnQ6IkRlZmF1bHQgc2Nyb2xsZXIiLCBhY3RpdmU6dHJ1ZX0sCgkJCQkJe2NvbnRlbnQ6IkZvcmNlIHRvdWNoIHNjcm9sbGVyIn0sCgkJCQkJe2NvbnRlbnQ6Ikhvcml6b250YWwgb25seSJ9LAoJCQkJCXtjb250ZW50OiJWZXJ0aWNhbCBvbmx5In0sCgkJCQkJe2NvbnRlbnQ6IkZvcmNlIFRvdWNoU2Nyb2xsU3RyYXRlZ3kifSwKCQkJCQl7Y29udGVudDoiRm9yY2UgVHJhbnNpdGlvblNjcm9sbFN0cmF0ZWd5In0sCgkJCQkJe2NvbnRlbnQ6IkZvcmNlIFRyYW5zbGF0ZVNjcm9sbFN0cmF0ZWd5In0KCQkJCV19CgkJCV19CgkJXX0sCgkJe2tpbmQ6ICJQYW5lbHMiLCBmaXQ6IHRydWUsIGRyYWdnYWJsZTogZmFsc2UsIGNsYXNzZXM6ICJzY3JvbGxlci1zYW1wbGUtcGFuZWxzIiwgY29tcG9uZW50czogWwoJCQkvLyBEZWZhdWx0IHNjcm9sbGVyIChjaG9vc2VzIGJlc3Qgc2Nyb2xsaW5nIG1ldGhvZCBmb3IgcGxhdGZvcm0pCgkJCXtraW5kOiAiU2Nyb2xsZXIiLCBjbGFzc2VzOiAic2Nyb2xsZXItc2FtcGxlLXNjcm9sbGVyIGVueW8tZml0In0sCgkJCS8vIEZvcmNlcyB0b3VjaCBzY3JvbGxpbmcsIGV2ZW4gb24gZGVza3RvcAoJCQl7a2luZDogIlNjcm9sbGVyIiwgdG91Y2g6dHJ1ZSwgY2xhc3NlczogInNjcm9sbGVyLXNhbXBsZS1zY3JvbGxlciBlbnlvLWZpdCJ9LAoJCQkvLyBIb3Jpem9udGFsLW9ubHkgc2Nyb2xsaW5nCgkJCXtraW5kOiAiU2Nyb2xsZXIiLCB2ZXJ0aWNhbDoiaGlkZGVuIiwgY2xhc3NlczogInNjcm9sbGVyLXNhbXBsZS1zY3JvbGxlciBlbnlvLWZpdCJ9LAoJCQkvLyBWZXJ0aWNhbC1vbmx5IHNjcm9sbGluZwoJCQl7a2luZDogIlNjcm9sbGVyIiwgaG9yaXpvbnRhbDoiaGlkZGVuIiwgY2xhc3NlczogInNjcm9sbGVyLXNhbXBsZS1zY3JvbGxlciBlbnlvLWZpdCIsIG9ubW91c2Vkb3duOiAibW91c2VEb3duIiwgb25kcmFnc3RhcnQ6ICJkcmFnU3RhcnQifSwKCQkJLy8gRm9yY2Ugc3BlY2lmaWMgc3RyYXRlZ2llcwoJCQl7a2luZDogIlNjcm9sbGVyIiwgY2xhc3NlczogInNjcm9sbGVyLXNhbXBsZS1zY3JvbGxlciBlbnlvLWZpdCIsIHN0cmF0ZWd5S2luZDogIlRvdWNoU2Nyb2xsU3RyYXRlZ3kifSwKCQkJe2tpbmQ6ICJTY3JvbGxlciIsIGNsYXNzZXM6ICJzY3JvbGxlci1zYW1wbGUtc2Nyb2xsZXIgZW55by1maXQiLCBzdHJhdGVneUtpbmQ6ICJUcmFuc2l0aW9uU2Nyb2xsU3RyYXRlZ3kifSwKCQkJe2tpbmQ6ICJTY3JvbGxlciIsIGNsYXNzZXM6ICJzY3JvbGxlci1zYW1wbGUtc2Nyb2xsZXIgZW55by1maXQiLCBzdHJhdGVneUtpbmQ6ICJUcmFuc2xhdGVTY3JvbGxTdHJhdGVneSJ9CgkJXX0KCV0sCgljcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJdmFyIHNjcm9sbGVycyA9IHRoaXMuJC5wYW5lbHMuZ2V0UGFuZWxzKCk7CgkJZm9yICh2YXIgaSBpbiBzY3JvbGxlcnMpIHsKCQkJc2Nyb2xsZXJzW2ldLmNyZWF0ZUNvbXBvbmVudCh7CgkJCQlhbGxvd0h0bWw6dHJ1ZSwKCQkJCWNvbnRlbnQ6dGhpcy50ZXh0LAoJCQkJY2xhc3Nlczoic2Nyb2xsZXItc2FtcGxlLWNvbnRlbnQiCgkJCX0pOwoJCX0KCX0sCglzYW1wbGVDaGFuZ2VkOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCXRoaXMuJC5wYW5lbHMuc2V0SW5kZXgoaW5FdmVudC5zZWxlY3RlZC5pbmRleEluQ29udGFpbmVyKCktMSk7Cgl9LAoJdGV4dDogIkZvbzxicj5CYXI8YnI+QmFyPGJyPkJvb20gYm9vbSBwb3c8YnI+Rm9vPGJyPkJhcjxicj5Cb29tIGJvb20gcG93PGJyPkZvbzxicj5CYXI8YnI+Qm9vbSBib29tIHBvdzxicj4iICsKCQkiRm9vPGJyPkJhcjxicj5Cb29tIGJvb20gcG93PGJyPkZvbzxicj5CYXI8YnI+Qm9vbSBib29tIHBvdzxicj5Gb288YnI+QmFyPGJyPkJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuICIgKwoJCSJCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiAiICsKCQkiQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gIiArCgkJIkJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIDxicj5Gb288YnI+QmFyPGJyPkJhcjxicj4iICsKCQkiQm9vbSBib29tIHBvdzxicj5Gb288YnI+QmFyPGJyPkJvb20gYm9vbSBwb3c8YnI+Rm9vPGJyPkJhcjxicj5Cb29tIGJvb20gcG93PGJyPkZvbzxicj5CYXI8YnI+Qm9vbSBib29tIHBvdzxicj4iICsKCQkiRm9vPGJyPkJhcjxicj5Cb29tIGJvb20gcG93PGJyPkZvbzxicj5CYXI8YnI+Qm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gIiArCgkJIkJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuICIgKwoJCSJCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiAiICsKCQkiQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gPGJyPkZvbzxicj5CYXI8YnI+QmFyPGJyPkJvb20gYm9vbSBwb3c8YnI+Rm9vPGJyPkJhcjxicj4iICsKCQkiQm9vbSBib29tIHBvdzxicj5Gb288YnI+QmFyPGJyPkJvb20gYm9vbSBwb3c8YnI+Rm9vPGJyPkJhcjxicj5Cb29tIGJvb20gcG93PGJyPkZvbzxicj5CYXI8YnI+Qm9vbSBib29tIHBvdzxicj4iICsKCQkiRm9vPGJyPkJhcjxicj5Cb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiAiICsKCQkiQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gIiArCgkJIkJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuICIgKwoJCSJCb29tIGJvb20gcG93LiA8YnI+Rm9vPGJyPkJhcjxicj5CYXI8YnI+Qm9vbSBib29tIHBvdzxicj5Gb288YnI+QmFyPGJyPkJvb20gYm9vbSBwb3c8YnI+Rm9vPGJyPkJhcjxicj4iICsKCQkiQm9vbSBib29tIHBvdzxicj5Gb288YnI+QmFyPGJyPkJvb20gYm9vbSBwb3c8YnI+Rm9vPGJyPkJhcjxicj5Cb29tIGJvb20gcG93PGJyPkZvbzxicj5CYXI8YnI+Qm9vbSBib29tIHBvdy4gIiArCgkJIkJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuIEJvb20gYm9vbSBwb3cuICIgKwoJCSJCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiBCb29tIGJvb20gcG93LiAiICsKCQkiQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gQm9vbSBib29tIHBvdy4gPGJyPiIsCgkvLyBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHdoZW4gdGhpcyBzYW1wbGUgaXMgY2FsbGVkIGZyb20gdGhlIFNhbXBsZXIgYXBwCgltb3VzZURvd246IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJaW5FdmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJfSwKCWRyYWdTdGFydDogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQlpZiAoaW5FdmVudC5ob3Jpem9udGFsKSB7CgkJCS8vIFByZXZlbnQgZHJhZyBwcm9wYWdhdGlvbiBvbiBob3Jpem9udGFsIGRyYWcgZXZlbnRzCgkJCXJldHVybiB0cnVlOwoJCX0KCX0KfSk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/WebServiceSample.css"
Content-Type: application/octet-stream; x-encoding=base64
LndlYnNlcnZpY2Utc2FtcGxlIHsKCXBhZGRpbmc6IDE1cHg7Cn0KCi53ZWJzZXJ2aWNlLXNhbXBsZS1zb3VyY2UgewoJcGFkZGluZzoxNXB4OwoJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKCWZvbnQtc2l6ZTogMTJweDsKCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCWJveC1zaXppbmc6IGJvcmRlci1ib3g7Cgl3aWR0aDoxMDAlOyAKCWhlaWdodDoxMDAlOwoJbWFyZ2luLXRvcDoxNXB4Owp9Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/WebServiceSample.html"
Content-Type: application/octet-stream; x-encoding=base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSIvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgoJPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIgY29udGVudD0ieWVzIi8+Cgk8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KCTxtZXRhIG5hbWU9ImZvcm1hdC1kZXRlY3Rpb24iIGNvbnRlbnQ9InRlbGVwaG9uZT1ubyIvPgoJPG1ldGEgbmFtZT0iZ29vZ2xlIiB2YWx1ZT0ibm90cmFuc2xhdGUiLz4KCTx0aXRsZT5XZWJTZXJ2aWNlIFNhbXBsZTwvdGl0bGU+Cgk8IS0tIC0tPgoJPHNjcmlwdCBzcmM9Ii4uLy4uL2VueW8vZW55by5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTxzY3JpcHQgc3JjPSIuLi8uLi9saWIvbGF5b3V0L3BhY2thZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHNyYz0iLi4vLi4vbGliL29ueXgvcGFja2FnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KCTwhLS0gLS0+Cgk8bGluayBocmVmPSJXZWJTZXJ2aWNlU2FtcGxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KCTxzY3JpcHQgc3JjPSJXZWJTZXJ2aWNlU2FtcGxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgoJPCEtLSAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ib255eCI+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCW5ldyBlbnlvLnNhbXBsZS5XZWJTZXJ2aWNlU2FtcGxlKCkucmVuZGVySW50byhkb2N1bWVudC5ib2R5KTsKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/WebServiceSample.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLnNhbXBsZS5XZWJTZXJ2aWNlU2FtcGxlIiwKCWtpbmQ6ICJGaXR0YWJsZVJvd3MiLAoJY2xhc3NlczogImVueW8tZml0IHdlYnNlcnZpY2Utc2FtcGxlIiwKCWNvbXBvbmVudHM6IFsKCQl7a2luZDogIldlYlNlcnZpY2UiLCBuYW1lOiJ5cWwiLCB1cmw6ICJodHRwOi8vcXVlcnkueWFob29hcGlzLmNvbS92MS9wdWJsaWMveXFsP2Zvcm1hdD1qc29uIiwgb25SZXNwb25zZToicHJvY2Vzc1Jlc3BvbnNlIiwgY2FsbGJhY2tOYW1lOiAiY2FsbGJhY2sifSwKCQl7a2luZDogIkZpdHRhYmxlQ29sdW1ucyIsIGNsYXNzZXM6Im9ueXgtdG9vbGJhci1pbmxpbmUiLCBjb21wb25lbnRzOiBbCgkJCXtjb250ZW50OiAiWVFMOiAifSwKCQkJe2tpbmQ6ICJvbnl4LklucHV0IiwgbmFtZToicXVlcnkiLCBmaXQ6dHJ1ZSwgdmFsdWU6J3NlbGVjdCAqIGZyb20gdXBjb21pbmcuZXZlbnRzIHdoZXJlIHdvZWlkIGluIChzZWxlY3Qgd29laWQgZnJvbSBnZW8ucGxhY2VzIHdoZXJlIHRleHQ9IlN1bm55dmFsZSwgQ0EiKSd9LAoJCQl7a2luZDogIm9ueXguUGlja2VyRGVjb3JhdG9yIiwgY29tcG9uZW50czogWwoJCQkJe2NvbnRlbnQ6IkNob29zZSBTY3JvbGxlciIsIHN0eWxlOiJ3aWR0aDoxMDBweDsifSwKCQkJCXtraW5kOiAib255eC5QaWNrZXIiLCBmbG9hdGluZzp0cnVlLCBjb21wb25lbnRzOiBbCgkJCQkJe2NvbnRlbnQ6IkFKQVgiLCBhY3RpdmU6dHJ1ZX0sCgkJCQkJe2NvbnRlbnQ6IkpTT04tUCJ9CgkJCQldfQoJCQldfSwKCQkJe2tpbmQ6ICJvbnl4LkJ1dHRvbiIsIGNvbnRlbnQ6IkZldGNoIiwgb250YXA6ImZldGNoIn0KCQldfSwKCQl7a2luZDogIm9ueXguVGV4dEFyZWEiLCBmaXQ6dHJ1ZSwgY2xhc3Nlczoid2Vic2VydmljZS1zYW1wbGUtc291cmNlIn0KCV0sCglmZXRjaDogZnVuY3Rpb24oKSB7CgkJLy8gc2VuZCBwYXJhbWV0ZXJzIHRoZSByZW1vdGUgc2VydmljZSB1c2luZyB0aGUgJ3NlbmQoKScgbWV0aG9kCgkJdGhpcy4kLnlxbC5zZW5kKHsKCQkJcTogdGhpcy4kLnF1ZXJ5LmdldFZhbHVlKCksCgkJCWpzb25wOiAodGhpcy4kLnBpY2tlci5nZXRTZWxlY3RlZCgpLmluZGV4SW5Db250YWluZXIoKT09MikKCQl9KTsKCX0sCglwcm9jZXNzUmVzcG9uc2U6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJLy8gZG8gc29tZXRoaW5nIHdpdGggaXQKCQl0aGlzLiQudGV4dEFyZWEuc2V0VmFsdWUoSlNPTi5zdHJpbmdpZnkoaW5FdmVudC5kYXRhLCBudWxsLCAyKSk7Cgl9Cn0pOw==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/assets/Sample1.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJTYW1wbGUiLAoJa2luZDogIkNvbnRyb2wiLAoJY29tcG9uZW50czogWwoJCXtuYW1lOiAiaW5wdXQiLCB0YWc6ICJpbnB1dCJ9LAoJCXt0YWc6ICJiciJ9LAoJCXtuYW1lOiAiYnV0dG9uIiwgdGFnOiAiYnV0dG9uIiwgY29udGVudDogIlNldCBDb250ZW50Iiwgb250YXA6ICJidXR0b25UYXAifSwKCQl7dGFnOiAiYnIifSwKCQl7bmFtZTogIm91dHB1dCIsIGNsYXNzZXM6ICJzYW1wbGUtb3V0cHV0In0KCV0sCglidXR0b25UYXA6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdmFyIHZhbHVlID0gdGhpcy4kLmlucHV0Lmhhc05vZGUoKS52YWx1ZTsKCQl0aGlzLiQub3V0cHV0LnNldENvbnRlbnQodmFsdWUpOwoJfQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/assets/Sample2.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJTYW1wbGUiLAoJa2luZDogIkNvbnRyb2wiLAoJY29tcG9uZW50czogWwoJCXtuYW1lOiAiaW5wdXQiLCB0YWc6ICJpbnB1dCIsIGF0dHJpYnV0ZXM6IHt2YWx1ZTogInJlZCJ9fSwKCQl7dGFnOiAiYnIifSwKCQl7dGFnOiAiYnV0dG9uIiwgY29udGVudDogIlNldCBDb2xvciIsIG9udGFwOiAiYnV0dG9uVGFwIn0sCgkJe3RhZzogImJyIn0sCgkJe25hbWU6ICJvdXRwdXQiLCBjbGFzc2VzOiAic2FtcGxlLW91dHB1dCJ9CgldLAoJYnV0dG9uVGFwOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCXZhciBjb2xvciA9IHRoaXMuJC5pbnB1dC5oYXNOb2RlKCkudmFsdWU7CgkJdGhpcy4kLm91dHB1dC5hcHBseVN0eWxlKCJiYWNrZ3JvdW5kIiwgY29sb3IpOwoJfQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/assets/Sample3.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJTYW1wbGUiLAoJa2luZDogIkNvbnRyb2wiLAoJY29tcG9uZW50czogWwoJCXtuYW1lOiAiaW5wdXQiLCB0YWc6ICJpbnB1dCIsIGF0dHJpYnV0ZXM6IHt2YWx1ZTogIkZvbyAifX0sCgkJe3RhZzogImJyIn0sCgkJe3RhZzogImJ1dHRvbiIsIGNvbnRlbnQ6ICJBZGQgQ29udGVudCIsIG9udGFwOiAiYWRkQ29udGVudFRhcCJ9LAoJCXt0YWc6ICJiciJ9LAoJCXt0YWc6ICJidXR0b24iLCBzdHlsZTogIm1hcmdpbi1yaWdodDogLjVlbTsiLCBjb250ZW50OiAiSGlkZSIsIG9udGFwOiAiaGlkZVRhcCJ9LAoJCXt0YWc6ICJidXR0b24iLCBzdHlsZTogIm1hcmdpbi1yaWdodDogLjVlbTsiLCBjb250ZW50OiAiU2hvdyIsIG9udGFwOiAic2hvd1RhcCJ9LAoJCXt0YWc6ICJidXR0b24iLCBjb250ZW50OiAiVG9nZ2xlIGNsYXNzIiwgb250YXA6ICJ0b2dnbGVDbGFzc1RhcCJ9LAoJCXt0YWc6ICJiciJ9LAoJCXtuYW1lOiAib3V0cHV0IiwgY2xhc3NlczogInNhbXBsZS1vdXRwdXQifQoJXSwKCWFkZENvbnRlbnRUYXA6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdmFyIGNvbnRlbnQgPSB0aGlzLiQuaW5wdXQuaGFzTm9kZSgpLnZhbHVlOwoJCXRoaXMuJC5vdXRwdXQuYWRkQ29udGVudChjb250ZW50KTsKCX0sCgloaWRlVGFwOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCXRoaXMuJC5vdXRwdXQuaGlkZSgpOwoJfSwKCXNob3dUYXA6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdGhpcy4kLm91dHB1dC5zaG93KCk7Cgl9LAoJdG9nZ2xlQ2xhc3NUYXA6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdmFyIGMgPSAic2FtcGxlLW91dHB1dCI7CgkJdmFyIGhhcyA9IHRoaXMuJC5vdXRwdXQuaGFzQ2xhc3MoYyk7CgkJdGhpcy4kLm91dHB1dC5hZGRSZW1vdmVDbGFzcyhjLCAhaGFzKTsKCX0KfSk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/assets/Sample4.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5raW5kKHsKCW5hbWU6ICJTYW1wbGUiLAoJa2luZDogIkNvbnRyb2wiLAoJY29tcG9uZW50czogWwoJCXtjb250ZW50OiAiQ3JlYXRlIGEgYnV0dG9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gY29udGVudDoiLCBzdHlsZTogInBhZGRpbmc6IDEwcHggMDsifSwKCQl7bmFtZTogImlucHV0IiwgdGFnOiAiaW5wdXQiLCBhdHRyaWJ1dGVzOiB7dmFsdWU6ICJGb28ifSwgc3R5bGU6ICJkaXNwbGF5OiBibG9jazsifSwKCQl7c3R5bGU6ICJwYWRkaW5nOiAxMHB4IDA7IiwgY29tcG9uZW50czogWwoJCQl7dGFnOiAiYnV0dG9uIiwgc3R5bGU6ICJtYXJnaW4tcmlnaHQ6IDEwcHg7IiwgY29udGVudDogIkFkZCIsIG9udGFwOiAiYWRkVGFwIn0sCgkJCXt0YWc6ICJidXR0b24iLCBjb250ZW50OiAiQ2xlYXIiLCBvbnRhcDogImNsZWFyVGFwIn0sCgkJXX0sCgkJe25hbWU6ICJvdXRwdXQifQoJXSwKCWFkZFRhcDogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQl2YXIgY29udGVudCA9IHRoaXMuJC5pbnB1dC5oYXNOb2RlKCkudmFsdWU7CgkJdGhpcy5jcmVhdGVDb21wb25lbnQoewoJCQl0YWc6ICJidXR0b24iLAoJCQljb250ZW50OiBjb250ZW50LAoJCQljb250YWluZXI6IHRoaXMuJC5vdXRwdXQKCQl9KS5yZW5kZXIoKTsKCX0sCgljbGVhclRhcDogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQl0aGlzLiQub3V0cHV0LmRlc3Ryb3lDbGllbnRDb250cm9scygpOwoJfQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/samples/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJIlBsYXRmb3JtU2FtcGxlLmNzcyIsCgkiUGxhdGZvcm1TYW1wbGUuanMiLAoJIkFqYXhTYW1wbGUuY3NzIiwKCSJBamF4U2FtcGxlLmpzIiwKCSJKc29ucFNhbXBsZS5jc3MiLAoJIkpzb25wU2FtcGxlLmpzIiwKCSJXZWJTZXJ2aWNlU2FtcGxlLmNzcyIsCgkiV2ViU2VydmljZVNhbXBsZS5qcyIsCgkiUmVwZWF0ZXJTYW1wbGUuY3NzIiwKCSJSZXBlYXRlclNhbXBsZS5qcyIsCgkiU2Nyb2xsZXJTYW1wbGUuY3NzIiwKCSJTY3JvbGxlclNhbXBsZS5qcyIsCgkiR2VzdHVyZVNhbXBsZS5jc3MiLAoJIkdlc3R1cmVTYW1wbGUuanMiLAoJIkRyYXdlclNhbXBsZS5jc3MiLAoJIkRyYXdlclNhbXBsZS5qcyIsCgkiRnVsbHNjcmVlblNhbXBsZS5jc3MiLAoJIkZ1bGxzY3JlZW5TYW1wbGUuanMiLAoJIkF1ZGlvU2FtcGxlLmNzcyIsCgkiQXVkaW9TYW1wbGUuanMiCik7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ajax/Ajax.js"
Content-Type: application/octet-stream; x-encoding=base64
77u/LyoqCglfZW55by5BamF4XyBpcyBhIHdyYXBwZXIgZm9yIF9YbWxIdHRwUmVxdWVzdF8gdGhhdCB1c2VzCgl0aGUgPGEgaHJlZj0iI2VueW8uQXN5bmMiPmVueW8uQXN5bmM8L2E+IEFQSS4KCglfZW55by5BamF4XyBwdWJsaXNoZXMgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZQoJPGEgaHJlZj0iI2VueW8uQWpheFByb3BlcnRpZXMiPmVueW8uQWpheFByb3BlcnRpZXM8L2E+CglvYmplY3QuCgoJTGlrZSBfZW55by5Bc3luY18sIF9lbnlvLkFqYXhfIGlzIGFuICoqT2JqZWN0KiosIG5vdCBhICoqQ29tcG9uZW50KiouCglEbyBub3QgdHJ5IHRvIG1ha2UgX2VueW8uQWpheF8gb2JqZWN0cyBpbnNpZGUgYSBfY29tcG9uZW50c18gYmxvY2suCglJZiB5b3Ugd2FudCB0byB1c2UgX2VueW8uQWpheF8gYXMgYSBjb21wb25lbnQsIHlvdSBzaG91bGQgcHJvYmFibHkKCWJlIHVzaW5nIDxhIGhyZWY9IiNlbnlvLldlYlNlcnZpY2UiPmVueW8uV2ViU2VydmljZTwvYT4gaW5zdGVhZC4KCglJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIF9lbnlvLkFqYXhfLCBiZSBzdXJlIHRvIGFkZCBvciB1cGRhdGUgdGhlIGFwcHJvcHJpYXRlCglbdW5pdCB0ZXN0c10oaHR0cHM6Ly9naXRodWIuY29tL2VueW9qcy9lbnlvL3RyZWUvbWFzdGVyL3Rvb2xzL3Rlc3QvYWpheC90ZXN0cykuCgoJRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbgoJW0NvbnN1bWluZyBXZWIgU2VydmljZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvanMvZW55by93aWtpL0NvbnN1bWluZy1XZWItU2VydmljZXMpCglpbiB0aGUgRW55byBEZXZlbG9wZXIgR3VpZGUuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5BamF4IiwKCWtpbmQ6ICJlbnlvLkFzeW5jIiwKCS8vKiBTZWUgPGEgaHJlZj0iI2VueW8uQWpheFByb3BlcnRpZXMiPmVueW8uQWpheFByb3BlcnRpZXM8L2E+IGZvciB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzCgkvLyogcHVibGlzaGVkIGJ5IF9lbnlvLkFqYXhfLgoJcHVibGlzaGVkOiBlbnlvLkFqYXhQcm9wZXJ0aWVzLAoJLy8qIEBwcm90ZWN0ZWQKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihpblBhcmFtcykgewoJCWVueW8ubWl4aW4odGhpcywgaW5QYXJhbXMpOwoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJLy8qIEBwdWJsaWMKCS8qKgoJU2VuZHMgdGhlIEFqYXggcmVxdWVzdCB3aXRoIHBhcmFtZXRlcnMgX2luUGFyYW1zXy4gX2luUGFyYW1zXyB2YWx1ZXMgbWF5IGJlCgllaXRoZXIgU3RyaW5ncyBvciBPYmplY3RzLgoKCV9pblBhcmFtc18gYXMgYW4gT2JqZWN0IGlzIGNvbnZlcnRlZCBpbnRvIHRoZSB1cmwgcXVlcnkgc3RyaW5nLiBGb3IKCWluc3RhbmNlLCBwYXNzaW5nIDxjb2RlPntxOiAic2VhcmNoVGVybSJ9PC9jb2RlPiB3aWxsIHJlc3VsdCBpbiB0aGUgYWRkaXRpb24KCW9mIHRoZSBzdHJpbmcgYHE9InNlYXJjaFRlcm0iYCB0byB0aGUgY3VycmVudCB1cmwgcXVlcnkgc3RyaW5nLgoKCV9pblBhcmFtc18gYXMgYSBTdHJpbmcgaXMgdXNlZCBhcyB0aGUgcXVlcnkgcGFydCBvZiB0aGUgVVJMIGRpcmVjdGx5LgoKCV9pblBhcmFtc18gd2lsbCBub3QgYmUgY29udmVydGVkIGludG8gYSBQT1NUIGJvZHksIGl0IHdpbGwgYWx3YXlzIGJlIHVzZWQgYXMKCXBhcnQgb2YgdGhlIFVSTCBxdWVyeSBzdHJpbmcgaWYgcHJvdmlkZWQuICBVc2UgdGhlIGBwb3N0Qm9keWAgcHJvcGVydHkgZm9yCglzcGVjaWZ5aW5nIGEgYm9keS4KCglXaGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlZCwgdGhlIGNvZGUgd2lsbCBzZXQgYSBgeGhyUmVzcG9uc2VgIHByb3BlcnR5CglpbiB0aGUgYGVueW8uQWpheGAgb2JqZWN0IHdpdGggdGhlIHN1YnByb3BlcnRpZXMgYHN0YXR1c2AsIGBoZWFkZXJzYCwgYW5kCglgYm9keWAuICBUaGVzZSBjYWNoZSB0aGUgcmVzdWx0cyBmcm9tIHRoZSBYSFIgZm9yIGxhdGVyIHVzZS4gIFRoZSBrZXlzIGZvcgoJdGhlIGBoZWFkZXJzYCBvYmplY3QgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0byBhbGwgbG93ZXIgY2FzZSBhcyBIVFRQIGhlYWRlcnMKCWFyZSBjYXNlLWluc2Vuc2l0aXZlLgoJKi8KCWdvOiBmdW5jdGlvbihpblBhcmFtcykgewoJCXRoaXMuc3RhcnRUaW1lcigpOwoJCXRoaXMucmVxdWVzdChpblBhcmFtcyk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoJLy8qIEBwcm90ZWN0ZWQKCXJlcXVlc3Q6IGZ1bmN0aW9uKGluUGFyYW1zKSB7CgkJdmFyIHBhcnRzID0gdGhpcy51cmwuc3BsaXQoIj8iKTsKCQl2YXIgdXJpID0gcGFydHMuc2hpZnQoKSB8fCAiIjsKCQl2YXIgYXJncyA9IHBhcnRzLmxlbmd0aCA/IChwYXJ0cy5qb2luKCI/Iikuc3BsaXQoIiYiKSkgOiBbXTsKCQkvLwoJCXZhciBxdWVyeSA9IG51bGw7CgkJLy8KCQlpZihlbnlvLmlzU3RyaW5nKGluUGFyYW1zKSl7CgkJCS8vSWYgaW5QYXJhbXMgcGFyYW1ldGVyIGlzIGEgc3RyaW5nLCB1c2UgaXQgYXMgcmVxdWVzdCBib2R5CgkJCXF1ZXJ5ID0gaW5QYXJhbXM7CgkJfQoJCWVsc2V7CgkJCS8vSWYgaW5QYXJhbXMgcGFyYW1ldGVyIGlzIG5vdCBhIHN0cmluZywgYnVpbGQgYSBxdWVyeSBmcm9tIGl0CgkJCWlmKGluUGFyYW1zKXsKCQkJCXF1ZXJ5ID0gZW55by5BamF4Lm9iamVjdFRvUXVlcnkoaW5QYXJhbXMpOwoJCQl9CgkJfQoJCS8vCgkJaWYgKHF1ZXJ5KSB7CgkJCWFyZ3MucHVzaChxdWVyeSk7CgkJCXF1ZXJ5ID0gbnVsbDsKCQl9CgkJaWYgKHRoaXMuY2FjaGVCdXN0KSB7CgkJCWFyZ3MucHVzaChNYXRoLnJhbmRvbSgpKTsKCQl9CgkJLy8KCQl2YXIgdXJsID0gYXJncy5sZW5ndGggPyBbdXJpLCBhcmdzLmpvaW4oIiYiKV0uam9pbigiPyIpIDogdXJpOwoJCS8vCgkJdmFyIHhocl9oZWFkZXJzID0ge307CgkJdmFyIGJvZHk7CgkJaWYgKHRoaXMubWV0aG9kICE9ICJHRVQiKSB7CgkJCWJvZHkgPSB0aGlzLnBvc3RCb2R5OwoJCQlpZiAodGhpcy5tZXRob2QgPT09ICJQT1NUIiAmJiBib2R5IGluc3RhbmNlb2YgZW55by5Gb3JtRGF0YSkgewoJCQkJaWYgKGJvZHkuZmFrZSkgewoJCQkJCXhocl9oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9IGJvZHkuZ2V0Q29udGVudFR5cGUoKTsKCQkJCQlib2R5ID0gYm9keS50b1N0cmluZygpOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBOb3RoaW5nIHRvIGRvIGFzIHRoZQoJCQkJCS8vIGNvbnRlbnQtdHlwZSB3aWxsIGJlCgkJCQkJLy8gYXV0b21hZ2ljYWxseSBzZXQgYWNjb3JkaW5nCgkJCQkJLy8gdG8gdGhlIEZvcm1EYXRhCgkJCQl9CgkJCX0gZWxzZSB7CgkJCQl4aHJfaGVhZGVyc1siQ29udGVudC1UeXBlIl0gPSB0aGlzLmNvbnRlbnRUeXBlOwoJCQkJaWYgKGJvZHkgaW5zdGFuY2VvZiBPYmplY3QpIHsKCQkJCQlpZiAodGhpcy5jb250ZW50VHlwZS5tYXRjaCgvXmFwcGxpY2F0aW9uXC9qc29uKDsuKik/JC8pICE9PSBudWxsKSB7CgkJCQkJCWJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTsKCQkJCQl9IGVsc2UgaWYgKHRoaXMuY29udGVudFR5cGUgPT09ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSB7CgkJCQkJCWJvZHkgPSBlbnlvLkFqYXgub2JqZWN0VG9RdWVyeShib2R5KTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCWJvZHkgPSBib2R5LnRvU3RyaW5nKCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWVueW8ubWl4aW4oeGhyX2hlYWRlcnMsIHRoaXMuaGVhZGVycyk7CgkJLy8gZG9uJ3QgcGFzcyBpbiBoZWFkZXJzIHN0cnVjdHVyZSBpZiB0aGVyZSBhcmUgbm8gaGVhZGVycyBkZWZpbmVkIGFzIHRoaXMgbWVzc2VzCgkJLy8gdXAgQ09SUyBjb2RlIGZvciBJRTgtOQoJCWlmIChlbnlvLmtleXMoeGhyX2hlYWRlcnMpLmxlbmd0aCA9PT0gMCkgewoJCQl4aHJfaGVhZGVycyA9IHVuZGVmaW5lZDsKCQl9CgkJLy8KCQl0cnkgewoJCQl0aGlzLnhociA9IGVueW8ueGhyLnJlcXVlc3QoewoJCQkJdXJsOiB1cmwsCgkJCQltZXRob2Q6IHRoaXMubWV0aG9kLAoJCQkJY2FsbGJhY2s6IHRoaXMuYmluZFNhZmVseSgicmVjZWl2ZSIpLAoJCQkJYm9keTogYm9keSwKCQkJCWhlYWRlcnM6IHhocl9oZWFkZXJzLAoJCQkJc3luYzogdGhpcy5zeW5jLAoJCQkJdXNlcm5hbWU6IHRoaXMudXNlcm5hbWUsCgkJCQlwYXNzd29yZDogdGhpcy5wYXNzd29yZCwKCQkJCXhockZpZWxkczogZW55by5taXhpbih7b25wcm9ncmVzczogdGhpcy5iaW5kU2FmZWx5KHRoaXMudXBkYXRlUHJvZ3Jlc3MpfSwgdGhpcy54aHJGaWVsZHMpLAoJCQkJbWltZVR5cGU6IHRoaXMubWltZVR5cGUKCQkJfSk7CgkJfQoJCWNhdGNoIChlKSB7CgkJCS8vIElFIGNhbiB0aHJvdyBlcnJvcnMgaGVyZSBpZiB0aGUgWEhSIHdvdWxkIGZhaWwgQ09SUyBjaGVja3MsCgkJCS8vIHNvIGNhdGNoIGFuZCB0dXJuIGludG8gYSBmYWlsdXJlLgoJCQl0aGlzLmZhaWwoZSk7CgkJfQoJfSwKCXJlY2VpdmU6IGZ1bmN0aW9uKGluVGV4dCwgaW5YaHIpIHsKCQlpZiAoIXRoaXMuZmFpbGVkICYmICF0aGlzLmRlc3Ryb3llZCkgewoJCQl2YXIgYm9keTsKCQkJaWYgKHR5cGVvZiBpblhoci5yZXNwb25zZVRleHQgPT09ICJzdHJpbmciKSB7CgkJCQlib2R5ID0gaW5YaHIucmVzcG9uc2VUZXh0OwoJCQl9IGVsc2UgewoJCQkJLy8gSUUgY2FycnlpbmcgYSBiaW5hcnkKCQkJCWJvZHkgPSBpblhoci5yZXNwb25zZUJvZHk7CgkJCX0KCQkJdGhpcy54aHJSZXNwb25zZSA9IHsKCQkJCXN0YXR1czogaW5YaHIuc3RhdHVzLAoJCQkJaGVhZGVyczogZW55by5BamF4LnBhcnNlUmVzcG9uc2VIZWFkZXJzKGluWGhyKSwKCQkJCWJvZHk6IGJvZHkKCQkJfTsKCQkJaWYgKHRoaXMuaXNGYWlsdXJlKGluWGhyKSkgewoJCQkJdGhpcy5mYWlsKGluWGhyLnN0YXR1cyk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLnJlc3BvbmQodGhpcy54aHJUb1Jlc3BvbnNlKGluWGhyKSk7CgkJCX0KCQl9Cgl9LAoJZmFpbDogZnVuY3Rpb24oaW5FcnJvcikgewoJCS8vIG9uIGZhaWx1cmUsIGV4cGxpY2l0bHkgY2FuY2VsIHRoZSBYSFIgdG8gcHJldmVudAoJCS8vIGZ1cnRoZXIgcmVzcG9uc2VzLiAgY2FuY2VsbGF0aW9uIGFsc28gcmVzZXRzIHRoZQoJCS8vIHJlc3BvbnNlIGhlYWRlcnMgJiBib2R5LAoJCWlmICh0aGlzLnhocikgewoJCQllbnlvLnhoci5jYW5jZWwodGhpcy54aHIpOwoJCQl0aGlzLnhociA9IG51bGw7CgkJfQoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJeGhyVG9SZXNwb25zZTogZnVuY3Rpb24oaW5YaHIpIHsKCQlpZiAoaW5YaHIpIHsKCQkJcmV0dXJuIHRoaXNbKHRoaXMuaGFuZGxlQXMgfHwgInRleHQiKSArICJIYW5kbGVyIl0oaW5YaHIpOwoJCX0KCX0sCglpc0ZhaWx1cmU6IGZ1bmN0aW9uKGluWGhyKSB7CgkJLy8gaWYgYW55IGV4Y2VwdGlvbnMgYXJlIHRocm93biB3aGlsZSBjaGVja2luZyBmaWVsZHMgaW4gdGhlIHhociwKCQkvLyBhc3N1bWUgYSBmYWlsdXJlLgoJCXRyeSB7CgkJCXZhciB0ZXh0ID0gIiI7CgkJCS8vIHdvcmsgYXJvdW5kIElFOC05IGJ1ZyB3aGVyZSBhY2Nlc3NpbmcgcmVzcG9uc2VUZXh0IHdpbGwgdGhyb3duIGVycm9yCgkJCS8vIGZvciBiaW5hcnkgcmVxdWVzdHMuCgkJCWlmICh0eXBlb2YgaW5YaHIucmVzcG9uc2VUZXh0ID09PSAic3RyaW5nIikgewoJCQkJdGV4dCA9IGluWGhyLnJlc3BvbnNlVGV4dDsKCQkJfQoJCQkvLyBGb2xsb3cgc2FtZSBmYWlsdXJlIHBvbGljeSBhcyBqUXVlcnkncyBBamF4IGNvZGUKCQkJLy8gQ09SUyBmYWlsdXJlcyBvbiBGaXJlRm94IHdpbGwgaGF2ZSBzdGF0dXMgMCBhbmQgbm8gcmVzcG9uc2VUZXh0LAoJCQkvLyBzbyB0cmVhdCB0aGF0IGFzIGZhaWx1cmUuCgkJCWlmIChpblhoci5zdGF0dXMgPT09IDAgJiYgdGV4dCA9PT0gIiIpIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCS8vIE90aGVyd2lzZSwgc3RhdHVzIDAgbWF5IGJlIGdvb2QgZm9yIGxvY2FsIGZpbGUgYWNjZXNzLiAgV2UgdHJlYXQgdGhlIHJhbmdlCgkJCS8vIDEtMTk5IGFuZCAzMDArIGFzIGZhaWx1cmUgKG9ubHkgMjAwLXNlcmllcyBjb2RlIGFyZSBPSykuCgkJCXJldHVybiAoaW5YaHIuc3RhdHVzICE9PSAwKSAmJiAoaW5YaHIuc3RhdHVzIDwgMjAwIHx8IGluWGhyLnN0YXR1cyA+PSAzMDApOwoJCX0KCQljYXRjaCAoZSkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9LAoJeG1sSGFuZGxlcjogZnVuY3Rpb24oaW5YaHIpIHsKCQlyZXR1cm4gaW5YaHIucmVzcG9uc2VYTUw7Cgl9LAoJdGV4dEhhbmRsZXI6IGZ1bmN0aW9uKGluWGhyKSB7CgkJcmV0dXJuIGluWGhyLnJlc3BvbnNlVGV4dDsKCX0sCglqc29uSGFuZGxlcjogZnVuY3Rpb24oaW5YaHIpIHsKCQl2YXIgciA9IGluWGhyLnJlc3BvbnNlVGV4dDsKCQl0cnkgewoJCQlyZXR1cm4gciAmJiBlbnlvLmpzb24ucGFyc2Uocik7CgkJfSBjYXRjaCAoeCkgewoJCQllbnlvLndhcm4oIkFqYXggcmVxdWVzdCBzZXQgdG8gaGFuZGxlQXMgSlNPTiBidXQgZGF0YSB3YXMgbm90IGluIEpTT04gZm9ybWF0Iik7CgkJCXJldHVybiByOwoJCX0KCX0sCgkvLyogQHByb3RlY3RlZAoJLy8qIEhhbmRsZXIgZm9yIGFqYXggcHJvZ3Jlc3MgZXZlbnRzLgoJdXBkYXRlUHJvZ3Jlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy8gZmlsdGVyIG91dCAiaW5wdXQiIGFzIGl0IGNhdXNlcyBleGNlcHRpb25zIG9uIHNvbWUgRmlyZWZveCB2ZXJzaW9ucwoJCS8vIGR1ZSB0byB1bmltcGxlbWVudGVkIGludGVybmFsIEFQSXMKCQl2YXIgZXYgPSB7fTsKCQlmb3IgKHZhciBrIGluIGV2ZW50KSB7CgkJCWlmIChrICE9PSAnaW5wdXQnKSB7CgkJCQlldltrXSA9IGV2ZW50W2tdOwoJCQl9CgkJfQoJCXRoaXMuc2VuZFByb2dyZXNzKGV2ZW50LmxvYWRlZCwgMCwgZXZlbnQudG90YWwsIGV2KTsKCX0sCglzdGF0aWNzOiB7CgkJb2JqZWN0VG9RdWVyeTogZnVuY3Rpb24oLypPYmplY3QqLyBtYXApIHsKCQkJdmFyIGVuYyA9IGVuY29kZVVSSUNvbXBvbmVudDsKCQkJdmFyIHBhaXJzID0gW107CgkJCXZhciBiYWNrc3RvcCA9IHt9OwoJCQlmb3IgKHZhciBuYW1lIGluIG1hcCl7CgkJCQl2YXIgdmFsdWUgPSBtYXBbbmFtZV07CgkJCQlpZiAodmFsdWUgIT0gYmFja3N0b3BbbmFtZV0pIHsKCQkJCQl2YXIgYXNzaWduID0gZW5jKG5hbWUpICsgIj0iOwoJCQkJCWlmIChlbnlvLmlzQXJyYXkodmFsdWUpKSB7CgkJCQkJCWZvciAodmFyIGk9MDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7CgkJCQkJCQlwYWlycy5wdXNoKGFzc2lnbiArIGVuYyh2YWx1ZVtpXSkpOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJcGFpcnMucHVzaChhc3NpZ24gKyBlbmModmFsdWUpKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHBhaXJzLmpvaW4oIiYiKTsKCQl9Cgl9LAoJcHJvdGVjdGVkU3RhdGljczogewoJCXBhcnNlUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbih4aHIpIHsKCQkJdmFyIGhlYWRlcnMgPSB7fTsKCQkJdmFyIGhlYWRlcnNTdHIgPSBbXTsKCQkJaWYgKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMpIHsKCQkJCWhlYWRlcnNTdHIgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkuc3BsaXQoL1xyP1xuLyk7CgkJCX0KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkZXJzU3RyLmxlbmd0aDsgaSsrKSB7CgkJCQl2YXIgaGVhZGVyU3RyID0gaGVhZGVyc1N0cltpXTsKCQkJCXZhciBpbmRleCA9IGhlYWRlclN0ci5pbmRleE9mKCc6ICcpOwoJCQkJaWYgKGluZGV4ID4gMCkgewoJCQkJCXZhciBrZXkgPSBoZWFkZXJTdHIuc3Vic3RyaW5nKDAsIGluZGV4KS50b0xvd2VyQ2FzZSgpOwoJCQkJCXZhciB2YWwgPSBoZWFkZXJTdHIuc3Vic3RyaW5nKGluZGV4ICsgMik7CgkJCQkJaGVhZGVyc1trZXldID0gdmFsOwoJCQkJfQoJCQl9CgkJCXJldHVybiBoZWFkZXJzOwoJCX0KCX0KfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ajax/AjaxProperties.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglDb21tb24gc2V0IG9mIHB1Ymxpc2hlZCBwcm9wZXJ0aWVzIHVzZWQgaW4gYm90aAoJPGEgaHJlZj0iI2VueW8uQWpheCI+ZW55by5BamF4PC9hPiBhbmQKCTxhIGhyZWY9IiNlbnlvLldlYlNlcnZpY2UiPmVueW8uV2ViU2VydmljZTwvYT4uCiovCmVueW8uQWpheFByb3BlcnRpZXMgPSB7CgkvKioKCQlXaGVuIHRydWUsIGFwcGVuZHMgYSByYW5kb20gbnVtYmVyIGFzIGEgcGFyYW1ldGVyIGZvciBHRVQgcmVxdWVzdHMKCQl0byB0cnkgdG8gZm9yY2UgYSBuZXcgZmV0Y2ggb2YgdGhlIHJlc291cmNlIGluc3RlYWQgb2YgcmV1c2luZyBhIGxvY2FsIGNhY2hlLgoJKi8KCWNhY2hlQnVzdDogdHJ1ZSwKCS8qKgoJCVRoZSBVUkwgZm9yIHRoZSBzZXJ2aWNlLiAgVGhpcyBjYW4gYmUgYSByZWxhdGl2ZSBVUkwgaWYgdXNlZCB0byBmZXRjaCByZXNvdXJjZXMgYnVuZGxlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbi4KCSovCgl1cmw6ICIiLAoJLyoqCgkJVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QsIGRlZmF1bHRzIHRvIEdFVC4gIFN1cHBvcnRlZCB2YWx1ZXMgaW5jbHVkZQoJCSJHRVQiLCAiUE9TVCIsICJQVVQiLCBhbmQgIkRFTEVURSIuCgkqLwoJbWV0aG9kOiAiR0VUIiwgLy8ge3ZhbHVlOiAiR0VUIiwgb3B0aW9uczogWyJHRVQiLCAiUE9TVCIsICJQVVQiLCAiREVMRVRFIl19LAoJLyoqCgkJSG93IHRoZSByZXNwb25zZSB3aWxsIGJlIGhhbmRsZWQuCgkJU3VwcG9ydGVkIHZhbHVlcyBhcmU6IDxjb2RlPiJqc29uIiwgInRleHQiLCAieG1sIjwvY29kZT4KCSovCgloYW5kbGVBczogImpzb24iLCAvLyB7dmFsdWU6ICJqc29uIiwgb3B0aW9uczogWyJ0ZXh0IiwgImpzb24iLCAieG1sIl19LAoJLyoqCgkJVGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgZm9yIHRoZSByZXF1ZXN0IGFzIGEgU3RyaW5nLgoJKi8KCWNvbnRlbnRUeXBlOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKCS8qKgoJCUlmIHRydWUsIG1ha2VzIGEgc3luY2hyb25vdXMgKGJsb2NraW5nKSBjYWxsLCBpZiBzdXBwb3J0ZWQuCgkqLwoJc3luYzogZmFsc2UsCgkvKioKCQlPcHRpb25hbCBhZGRpdGlvbmFsIHJlcXVlc3QgaGVhZGVycyBhcyBhIEpTIG9iamVjdCwgZS5nLgoJCTxjb2RlPnsgIlgtTXktSGVhZGVyIjogIk15IFZhbHVlIiwgIk1vb2QiOiAiSGFwcHkiIH08L2NvZGU+IG9yIG51bGwuCgkqLwoJaGVhZGVyczogbnVsbCwKCS8qKgoJCVRoZSBjb250ZW50IGZvciB0aGUgcmVxdWVzdCBib2R5IGZvciBQT1NUL1BVVCBtZXRob2RzLgoKCQlXaGVuIHBvc3RCb2R5IGlzIGEgQnVmZmVyIG9yIGEgU3RyaW5nLCBpdCBpcyBwYXNzZWQgdmVyYmF0aW0gaW4gdGhlIHJlcXVlc3QgYm9keS4KCQlXaGVuIHBvc3RCb2R5IGlzIGFuIE9iamVjdCwgdGhlIHdheSBpdCBpcyBlbmNvZGVkIGRlcGVuZHMgb24gdGhlIGNvbnRlbnRUeXBlOgoKICAgICAgICAqIGFwcGxpY2F0aW9uL2pzb24gPT4gSlNPTi5zdHJpbmdpZnkKICAgICAgICAqIGFwcGxpY2F0aW9uL3gtd3d3LXVybGVuY29lZCA9PiB1cmwtZW5jb2RlZCBwYXJhbWV0ZXJzCiAgICAgICAgKiBtdWx0aXBhcnQvZm9ybS1kYXRhID0+IHBhc3NlZCBhcyBmaWVsZHMgaW4gZW55by5Gb3JtRGF0YSAoWEhSMiBlbXVsYXRpb24pCgkqLwoJcG9zdEJvZHk6ICIiLAoJLyoqCgkJVGhlIG9wdGlvbmFsIHVzZXIgbmFtZSB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uIHB1cnBvc2VzLgoJKi8KCXVzZXJuYW1lOiAiIiwKCS8qKgoJCVRoZSBvcHRpb25hbCBwYXNzd29yZCB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uIHB1cnBvc2VzLgoJKi8KCXBhc3N3b3JkOiAiIiwKCS8qKgoJCU9wdGlvbmFsIG9iamVjdCB3aXRoIGZpZWxkcyB0byBwYXNzIGRpcmVjdGx5IHRvIHRoZSB1bmRlcmx5aW5nIFhIUiBvYmplY3QuCgkJT25lIGV4YW1wbGUgaXMgdGhlIF93aXRoQ3JlZGVudGlhbHNfIGZsYWcgdXNlZCBmb3IgY3Jvc3Mtb3JpZ2luIHJlcXVlc3RzLgoJKi8KCXhockZpZWxkczogbnVsbCwKCS8qKgoJCU9wdGlvbmFsIHN0cmluZyB0byBvdmVycmlkZSB0aGUgTUlNRS1UeXBlIGhlYWRlci4KCSovCgltaW1lVHlwZTogbnVsbAp9Owo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ajax/Async.js"
Content-Type: application/octet-stream; x-encoding=base64
77u/LyoqCglfZW55by5Bc3luY18gaXMgdGhlIGJhc2Uga2luZCBmb3IgaGFuZGxpbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCgoJX2VueW8uQXN5bmNfIGlzIGFuICoqT2JqZWN0KiosIG5vdCBhICoqQ29tcG9uZW50Kio7IHRodXMsIHlvdSBtYXkgbm90IGRlY2xhcmUKCWFuIF9Bc3luY18gaW4gYSBfY29tcG9uZW50c18gYmxvY2suIElmIHlvdSB3YW50IHRvIHVzZSBfQXN5bmNfIGFzIGEKCWNvbXBvbmVudCwgeW91IHNob3VsZCBwcm9iYWJseSBiZSB1c2luZwoJPGEgaHJlZj0iI2VueW8uV2ViU2VydmljZSI+ZW55by5XZWJTZXJ2aWNlPC9hPiBpbnN0ZWFkLgoKCUFuIEFzeW5jIG9iamVjdCByZXByZXNlbnRzIGEgdGFzayB0aGF0IGhhcyBub3QgeWV0IGNvbXBsZXRlZC4gWW91IG1heSBhdHRhY2gKCWNhbGxiYWNrIGZ1bmN0aW9ucyB0byBhbiBBc3luYywgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHRhc2sgY29tcGxldGVzIG9yCgllbmNvdW50ZXJzIGFuIGVycm9yLgoKCU1vcmUgaW5mb3JtYXRpb24gb24gX0FzeW5jXyBhbmQgaXRzIHVzYWdlIGlzIGF2YWlsYWJsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbglvbgoJPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2VueW9qcy9lbnlvL3dpa2kvQ29uc3VtaW5nLVdlYi1TZXJ2aWNlcyI+Q29uc3VtaW5nIFdlYiBTZXJ2aWNlczwvYT4KCWluIHRoZSBFbnlvIERldmVsb3BlciBHdWlkZS4KKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLkFzeW5jIiwKCWtpbmQ6ICJlbnlvLk9iamVjdCIsCglwdWJsaXNoZWQ6IHsKCQkvKioKCQkJSWYgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUsIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvCgkJCXdhaXQgYWZ0ZXIgdGhlIF9nb18gY2FsbCBiZWZvcmUgZmFpbGluZyB3aXRoIHRoZSAidGltZW91dCIgZXJyb3IKCQkqLwoJCXRpbWVvdXQ6IDAKCX0sCgkvLyogQHByb3RlY3RlZAoJZmFpbGVkOiBmYWxzZSwKCWNvbnRleHQ6IG51bGwsCgljb25zdHJ1Y3RvcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl0aGlzLnJlc3BvbmRlcnMgPSBbXTsKCQl0aGlzLmVycm9ySGFuZGxlcnMgPSBbXTsKCQl0aGlzLnByb2dyZXNzSGFuZGxlcnMgPSBbXTsKCX0sCglhY2N1bXVsYXRlOiBmdW5jdGlvbihpbkFycmF5LCBpbk1ldGhvZEFyZ3MpIHsKCQl2YXIgZm4gPSAoaW5NZXRob2RBcmdzLmxlbmd0aCA8IDIpID8gaW5NZXRob2RBcmdzWzBdIDogZW55by5iaW5kKGluTWV0aG9kQXJnc1swXSwgaW5NZXRob2RBcmdzWzFdKTsKCQlpbkFycmF5LnB1c2goZm4pOwoJfSwKCS8vKiBAcHVibGljCgkvKioKCQlSZWdpc3RlcnMgYSByZXNwb25zZSBmdW5jdGlvbi4KCQlGaXJzdCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgX3RoaXNfIGNvbnRleHQgZm9yIHRoZSByZXNwb25zZSBtZXRob2QuCgkJU2Vjb25kIChvciBvbmx5KSBwYXJhbWV0ZXIgaXMgdGhlIGZ1bmN0aW9uIG9iamVjdC4KCSovCglyZXNwb25zZTogZnVuY3Rpb24oLyogW2luQ29udGV4dF0sIGluUmVzcG9uZGVyICovKSB7CgkJdGhpcy5hY2N1bXVsYXRlKHRoaXMucmVzcG9uZGVycywgYXJndW1lbnRzKTsKCQlyZXR1cm4gdGhpczsKCX0sCgkvKioKCQlSZWdpc3RlcnMgYW4gZXJyb3IgaGFuZGxlci4KCQlGaXJzdCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgX3RoaXNfIGNvbnRleHQgZm9yIHRoZSByZXNwb25zZSBtZXRob2QuCgkJU2Vjb25kIChvciBvbmx5KSBwYXJhbWV0ZXIgaXMgdGhlIGZ1bmN0aW9uIG9iamVjdC4KCSovCgllcnJvcjogZnVuY3Rpb24oLyogW2luQ29udGV4dF0sIGluUmVzcG9uZGVyICovKSB7CgkJdGhpcy5hY2N1bXVsYXRlKHRoaXMuZXJyb3JIYW5kbGVycywgYXJndW1lbnRzKTsKCQlyZXR1cm4gdGhpczsKCX0sCgkvLyogQHByb3RlY3RlZAoJcm91dGU6IGZ1bmN0aW9uKGluQXN5bmMsIGluVmFsdWUpIHsKCQl2YXIgciA9IHRoaXMuYmluZFNhZmVseSgicmVzcG9uZCIpOwoJCWluQXN5bmMucmVzcG9uc2UoZnVuY3Rpb24oaW5TZW5kZXIsIGluVmFsdWUpIHsKCQkJcihpblZhbHVlKTsKCQl9KTsKCQl2YXIgZiA9IHRoaXMuYmluZFNhZmVseSgiZmFpbCIpOwoJCWluQXN5bmMuZXJyb3IoZnVuY3Rpb24oaW5TZW5kZXIsIGluVmFsdWUpIHsKCQkJZihpblZhbHVlKTsKCQl9KTsKCQlpbkFzeW5jLmdvKGluVmFsdWUpOwoJfSwKCWhhbmRsZTogZnVuY3Rpb24oaW5WYWx1ZSwgaW5IYW5kbGVycykgewoJCXZhciByID0gaW5IYW5kbGVycy5zaGlmdCgpOwoJCWlmIChyKSB7CgkJCWlmIChyIGluc3RhbmNlb2YgZW55by5Bc3luYykgewoJCQkJdGhpcy5yb3V0ZShyLCBpblZhbHVlKTsKCQkJfSBlbHNlIHsKCQkJCS8vIGhhbmRsZXIgY2FuIHJldHVybiBhIG5ldyAndmFsdWUnCgkJCQl2YXIgdiA9IGVueW8uY2FsbCh0aGlzLmNvbnRleHQgfHwgdGhpcywgciwgW3RoaXMsIGluVmFsdWVdKTsKCQkJCS8vIC4uLiBidXQgb25seSBpZiBpdCByZXR1cm5zIHNvbWV0aGluZyBvdGhlciB0aGFuIHVuZGVmaW5lZAoJCQkJdiA9ICh2ICE9PSB1bmRlZmluZWQpID8gdiA6IGluVmFsdWU7CgkJCQkvLyBuZXh0IGhhbmRsZXIKCQkJCSh0aGlzLmZhaWxlZCA/IHRoaXMuZmFpbCA6IHRoaXMucmVzcG9uZCkuY2FsbCh0aGlzLCB2KTsKCQkJfQoJCX0KCX0sCglzdGFydFRpbWVyOiBmdW5jdGlvbigpIHsKCQl0aGlzLnN0YXJ0VGltZSA9IGVueW8ubm93KCk7CgkJaWYgKHRoaXMudGltZW91dCkgewoJCQl0aGlzLnRpbWVvdXRKb2IgPSBzZXRUaW1lb3V0KHRoaXMuYmluZFNhZmVseSgidGltZW91dENvbXBsZXRlIiksIHRoaXMudGltZW91dCk7CgkJfQoJfSwKCWVuZFRpbWVyOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy50aW1lb3V0Sm9iKSB7CgkJCXRoaXMuZW5kVGltZSA9IGVueW8ubm93KCk7CgkJCWNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRKb2IpOwoJCQl0aGlzLnRpbWVvdXRKb2IgPSBudWxsOwoJCQl0aGlzLmxhdGVuY3kgPSB0aGlzLmVuZFRpbWUgLSB0aGlzLnN0YXJ0VGltZTsKCQl9Cgl9LAoJdGltZW91dENvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRpbWVkb3V0ID0gdHJ1ZTsKCQl0aGlzLmZhaWwoInRpbWVvdXQiKTsKCX0sCgkvLyogQHByb3RlY3RlZAoJLy8qIENhbGxlZCBhcyBwYXJ0IG9mIHRoZSBhc3luYyBpbXBsZW1lbnRhdGlvbjsgdHJpZ2dlcnMgdGhlIGhhbmRsZXIgY2hhaW4uCglyZXNwb25kOiBmdW5jdGlvbihpblZhbHVlKSB7CgkJdGhpcy5mYWlsZWQgPSBmYWxzZTsKCQl0aGlzLmVuZFRpbWVyKCk7CgkJdGhpcy5oYW5kbGUoaW5WYWx1ZSwgdGhpcy5yZXNwb25kZXJzKTsKCX0sCgkvLyogQHB1YmxpYwoJLy8qIENhbiBiZSBjYWxsZWQgZnJvbSBhbnkgaGFuZGxlciB0byB0cmlnZ2VyIHRoZSBlcnJvciBjaGFpbi4KCWZhaWw6IGZ1bmN0aW9uKGluRXJyb3IpIHsKCQl0aGlzLmZhaWxlZCA9IHRydWU7CgkJdGhpcy5lbmRUaW1lcigpOwoJCXRoaXMuaGFuZGxlKGluRXJyb3IsIHRoaXMuZXJyb3JIYW5kbGVycyk7Cgl9LAoJLy8qIENhbGxlZCBmcm9tIGFuIGVycm9yIGhhbmRsZXI7IGNsZWFycyB0aGUgZXJyb3IgY29uZGl0aW9uIGFuZCByZXN1bWVzCgkvLyogY2FsbGluZyBoYW5kbGVyIG1ldGhvZHMuCglyZWNvdmVyOiBmdW5jdGlvbigpIHsKCQl0aGlzLmZhaWxlZCA9IGZhbHNlOwoJfSwKICAgIC8vKiBAcHVibGljCgkvKioKCQlSZWdpc3RlcnMgYSBwcm9ncmVzcyBoYW5kbGVyLgoJCUZpcnN0IHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBfdGhpc18gY29udGV4dCBmb3IgdGhlIHJlc3BvbnNlIG1ldGhvZC4KCQlTZWNvbmQgKG9yIG9ubHkpIHBhcmFtZXRlciBpcyB0aGUgZnVuY3Rpb24gb2JqZWN0LgoJCVByb2dyZXNzIGhhbmRsZXJzIGFyZSBjYWxsZWQgd2l0aCB0aGUgc2VuZGVyIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgYSBwcm9ncmVzcyBldmVudCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LgoJKi8KCXByb2dyZXNzOiBmdW5jdGlvbigvKiBbaW5Db250ZXh0XSwgaW5SZXNwb25kZXIgKi8pIHsKCQl0aGlzLmFjY3VtdWxhdGUodGhpcy5wcm9ncmVzc0hhbmRsZXJzLCBhcmd1bWVudHMpOwoJCXJldHVybiB0aGlzOwoJfSwKCS8vKiBAcHJvdGVjdGVkCgkvLyogTm90aWZpZXMgdGhlIHByb2dyZXNzIGhhbmRsZXJzCglzZW5kUHJvZ3Jlc3M6IGZ1bmN0aW9uKGN1cnJlbnQsIG1pbiwgbWF4LCBzb3VyY2VFdmVudCkgewoJCXZhciBldmVudCA9IGVueW8ubWl4aW4oe30sIHNvdXJjZUV2ZW50KTsKCQlldmVudC50eXBlID0gJ3Byb2dyZXNzJzsKCQlldmVudC5jdXJyZW50ID0gY3VycmVudDsKCQlldmVudC5taW4gPSBtaW47CgkJZXZlbnQubWF4ID0gbWF4OwoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wcm9ncmVzc0hhbmRsZXJzLmxlbmd0aDsgaSsrKSB7CgkJCWVueW8uY2FsbCh0aGlzLmNvbnRleHQgfHwgdGhpcywgdGhpcy5wcm9ncmVzc0hhbmRsZXJzW2ldLCBbdGhpcywgZXZlbnRdKTsKCQl9Cgl9LAoJLy8qIFN0YXJ0cyB0aGUgYXN5bmMgYWN0aXZpdHkuIE92ZXJyaWRkZW4gaW4gc3Via2luZHMuCglnbzogZnVuY3Rpb24oaW5WYWx1ZSkgewoJCXRoaXMuc2VuZFByb2dyZXNzKDAsIDAsIDEpOwoJCWVueW8uYXN5bmNNZXRob2QodGhpcywgZnVuY3Rpb24oKSB7CgkJCXRoaXMuc2VuZFByb2dyZXNzKDEsIDAsIDEpOwoJCQl0aGlzLnJlc3BvbmQoaW5WYWx1ZSk7CgkJfSk7CgkJcmV0dXJuIHRoaXM7Cgl9Cn0pOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ajax/Jsonp.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5Kc29ucFJlcXVlc3RfIGlzIGEgc3BlY2lhbGl6ZWQgZm9ybSBvZgoJPGEgaHJlZj0iI2VueW8uQXN5bmMiPmVueW8uQXN5bmM8L2E+IHVzZWQgZm9yIG1ha2luZyBKU09OUCByZXF1ZXN0cyB0byBhCglyZW1vdGUgc2VydmVyLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgbm9ybWFsIFhNTEh0dHBSZXF1ZXN0IGNhbGwgaW4gdGhhdCB0aGUKCWV4dGVybmFsIHJlc291cmNlIGlzIGxvYWRlZCB1c2luZyBhICZsdDtzY3JpcHQmZ3Q7IHRhZy4gVGhpcyBhbGxvd3MgdXMgdG8KCWJ5cGFzcyB0aGUgc2FtZS1kb21haW4gcnVsZXMgdGhhdCBub3JtYWxseSBhcHBseSB0byBYSFIsIHNpbmNlIHRoZSBicm93c2VyCgl3aWxsIGxvYWQgc2NyaXB0cyBmcm9tIGFueSBhZGRyZXNzLgoKCUF0IHRoZSBzYW1lIHRpbWUsIGluIG9yZGVyIHRvIHN1Y2Nlc3NmdWxseSBsb2FkIGRhdGEgdmlhIHRoZSAmbHQ7c2NyaXB0Jmd0OwoJdGFnLCB5b3VyIGRhdGEgc291cmNlIG11c3QgYmUgYWNjZXNzZWQgdmlhIGFuIEhUVFAgR0VUIHJlcXVlc3QgYW5kIG11c3QgYmUKCWFibGUgdG8gZHluYW1pY2FsbHkgYWRkIHRoZSByZXF1ZXN0ZWQgY2FsbGJhY2sgbmFtZSBhcyBhIGZ1bmN0aW9uIHdyYXBwZXIKCWFyb3VuZCB0aGUgSlNPTiBkYXRhLgoKCUlmIHlvdSBtYWtlIGNoYW5nZXMgdG8gX2VueW8uSnNvbnBSZXF1ZXN0XywgYmUgc3VyZSB0byBhZGQgb3IgdXBkYXRlIHRoZQoJYXBwcm9wcmlhdGUgW3VuaXQgdGVzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvanMvZW55by90cmVlL21hc3Rlci90b29scy90ZXN0L2FqYXgvdGVzdHMpLgoKCUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb24KCVtDb25zdW1pbmcgV2ViIFNlcnZpY2VzXShodHRwczovL2dpdGh1Yi5jb20vZW55b2pzL2VueW8vd2lraS9Db25zdW1pbmctV2ViLVNlcnZpY2VzKQoJaW4gdGhlIEVueW8gRGV2ZWxvcGVyIEd1aWRlLgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uSnNvbnBSZXF1ZXN0IiwKCWtpbmQ6ICJlbnlvLkFzeW5jIiwKCXB1Ymxpc2hlZDogewoJCS8vKiBUaGUgVVJMIGZvciB0aGUgc2VydmljZQoJCXVybDogIiIsCgkJLy8qIE9wdGlvbmFsIGNoYXJhY3RlciBzZXQgdG8gdXNlIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGRhdGEKCQljaGFyc2V0OiBudWxsLAoJCS8qKgoJCQlOYW1lIG9mIHRoZSBhcmd1bWVudCB0aGF0IGhvbGRzIHRoZSBjYWxsYmFjayBuYW1lLiBGb3IgZXhhbXBsZSwgdGhlCgkJCVR3aXR0ZXIgc2VhcmNoIEFQSSB1c2VzICJjYWxsYmFjayIgYXMgdGhlIHBhcmFtZXRlciB0byBob2xkIHRoZQoJCQluYW1lIG9mIHRoZSBjYWxsZWQgZnVuY3Rpb24uICBXZSB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkIHRoaXMgdG8KCQkJdGhlIGVuY29kZWQgYXJndW1lbnRzLgoKCQkJSWYgdGhpcyBpcyBudWxsLCB3ZSB3b24ndCBwYXNzIGEgY2FsbGJhY2sgbmFtZSB0byB0aGUgSlNPTlAgc2VydmVyLgoJCQlUaGF0IG1vZGUgaXMgdXN1YWxseSBvbmx5IHVzZWQgaWYgeW91IGFsc28gc2V0IHRoZSBfb3ZlcnJpZGVDYWxsYmFja18KCQkJcGFyYW1ldGVyLCBzaW5jZSB3aXRob3V0IHRoaXMsIHRoZXJlJ3Mgbm8gd2F5IGZvciB0aGUgc2VydmVyIHRvIGtub3cKCQkJd2hhdCBmdW5jdGlvbiB3cmFwcGVyIHRvIHVzZS4KCQkqLwoJCWNhbGxiYWNrTmFtZTogImNhbGxiYWNrIiwKCQkvKioKCQkJV2hlbiB0cnVlLCBhcHBlbmRzIGEgcmFuZG9tIG51bWJlciBhcyBhIHBhcmFtZXRlciBmb3IgR0VUIHJlcXVlc3RzCgkJCXRvIHRyeSB0byBmb3JjZSBhIG5ldyBmZXRjaCBvZiB0aGUgcmVzb3VyY2UgaW5zdGVhZCBvZiByZXVzaW5nIGEKCQkJbG9jYWwgY2FjaGUKCQkqLwoJCWNhY2hlQnVzdDogdHJ1ZSwKCQkvKioKCQkJV2hlbiBzZXQsIHVzZSB0aGlzIGFzIHRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjayBtZXRob2QgdG8gcGFzcwoJCQl0byB0aGUgcmVtb3RlIHNlcnZlci4gVGhpcyBpcyBtYWlubHkgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoCgkJCXNlcnZlcnMgdGhhdCBhcmVuJ3QgZmxleGlibGUgaW4gaG93IHRoZXkgc3BlY2lmeSBjYWxsYmFjayBuYW1lcy4KCgkJCUlmIHlvdSBzcGVjaWZ5IHRoaXMsIHdlIHdpbGwgYWRkIGEgbWV0aG9kIHRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlCgkJCXVzaW5nIHRoZSBzcGVjaWZpZWQgbmFtZSwgc28gdGhpcyBjYW4gZWFzaWx5IHN0b21wIG9uIGEgZ2xvYmFsCgkJCXZhcmlhYmxlLiBZb3UgY2FuJ3QgaGF2ZSBtdWx0aXBsZSBjYWxscyB0byBhIEpTT05QIEFQSSBhbGl2ZSBhdAoJCQl0aGUgc2FtZSB0aW1lIHVzaW5nIHRoZSBzYW1lIGNhbGxiYWNrIG1ldGhvZC4KCQkqLwoJCW92ZXJyaWRlQ2FsbGJhY2s6IG51bGwKCX0sCglwcm90ZWN0ZWRTdGF0aWNzOiB7CgkJLy8gQ291bnRlciB0byBhbGxvdyBjcmVhdGlvbiBvZiB1bmlxdWUgbmFtZSBmb3IgZWFjaCBKU09OUCByZXF1ZXN0CgkJbmV4dENhbGxiYWNrSUQ6IDAKCX0sCgkvLyogQHByb3RlY3RlZAoJYWRkU2NyaXB0RWxlbWVudDogZnVuY3Rpb24oKSB7CgkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwoJCXNjcmlwdC5zcmMgPSB0aGlzLnNyYzsKCQlzY3JpcHQuYXN5bmMgPSAiYXN5bmMiOwoJCWlmICh0aGlzLmNoYXJzZXQpIHsKCQkJc2NyaXB0LmNoYXJzZXQgPSB0aGlzLmNoYXJzZXQ7CgkJfQoJCS8vIG1vc3QgbW9kZXJuIGJyb3dzZXJzIGFsc28gaGF2ZSBhbiBvbmVycm9yIGhhbmRsZXIKCQlzY3JpcHQub25lcnJvciA9IHRoaXMuYmluZFNhZmVseShmdW5jdGlvbigpIHsKCQkJLy8gd2UgZG9uJ3QgZ2V0IGFuIGVycm9yIGNvZGUsIHNvIHdlJ2xsIGp1c3QgdXNlIHRoZSBnZW5lcmljIDQwMCBlcnJvciBzdGF0dXMKCQkJdGhpcy5mYWlsKDQwMCk7CgkJfSk7CgkJLy8gYWRkIHNjcmlwdCBiZWZvcmUgZXhpc3Rpbmcgc2NyaXB0IHRvIG1ha2Ugc3VyZSBpdCdzIGluIGEgdmFsaWQgcGFydCBvZiBkb2N1bWVudAoJCS8vIGh0dHA6Ly93d3cuanNwYXR0ZXJucy5jb20vdGhlLXJpZGljdWxvdXMtY2FzZS1vZi1hZGRpbmctYS1zY3JpcHQtZWxlbWVudC8KCQl2YXIgZmlyc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07CgkJZmlyc3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2NyaXB0LCBmaXJzdCk7CgkJdGhpcy5zY3JpcHRUYWcgPSBzY3JpcHQ7Cgl9LAoJcmVtb3ZlU2NyaXB0RWxlbWVudDogZnVuY3Rpb24oKSB7CgkJdmFyIHNjcmlwdCA9IHRoaXMuc2NyaXB0VGFnOwoJCXRoaXMuc2NyaXB0VGFnID0gbnVsbDsKCQlzY3JpcHQub25lcnJvciA9IG51bGw7CgkJaWYgKHNjcmlwdC5wYXJlbnROb2RlKSB7CgkJCXNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7CgkJfQoJfSwKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihpblBhcmFtcykgewoJCWVueW8ubWl4aW4odGhpcywgaW5QYXJhbXMpOwoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJLy8qIEBwdWJsaWMKCS8vKiBTdGFydHMgdGhlIEpTT05QIHJlcXVlc3QuCglnbzogZnVuY3Rpb24oaW5QYXJhbXMpIHsKCQl0aGlzLnN0YXJ0VGltZXIoKTsKCQl0aGlzLmpzb25wKGluUGFyYW1zKTsKCQlyZXR1cm4gdGhpczsKCX0sCgkvLyogQHByb3RlY3RlZAoJanNvbnA6IGZ1bmN0aW9uKGluUGFyYW1zKSB7CgkJdmFyIGNhbGxiYWNrRnVuY3Rpb25OYW1lID0gdGhpcy5vdmVycmlkZUNhbGxiYWNrIHx8CgkJCSJlbnlvX2pzb25wX2NhbGxiYWNrXyIgKyAoZW55by5Kc29ucFJlcXVlc3QubmV4dENhbGxiYWNrSUQrKyk7CgkJLy8KCQl0aGlzLnNyYyA9IHRoaXMuYnVpbGRVcmwoaW5QYXJhbXMsIGNhbGxiYWNrRnVuY3Rpb25OYW1lKTsKCQl0aGlzLmFkZFNjcmlwdEVsZW1lbnQoKTsKCQkvLwoJCXdpbmRvd1tjYWxsYmFja0Z1bmN0aW9uTmFtZV0gPSB0aGlzLmJpbmRTYWZlbHkodGhpcy5yZXNwb25kKTsKCQkvLwoJCS8vIHNldHVwIGNsZWFudXAgaGFuZGxlcnMgZm9yIEpTT05QIGNvbXBsZXRpb24gYW5kIGZhaWx1cmUKCQl2YXIgY2xlYW51cCA9IHRoaXMuYmluZFNhZmVseShmdW5jdGlvbigpIHsKCQkJdGhpcy5yZW1vdmVTY3JpcHRFbGVtZW50KCk7CgkJCXdpbmRvd1tjYWxsYmFja0Z1bmN0aW9uTmFtZV0gPSBudWxsOwoJCX0pOwoJCXRoaXMucmVzcG9uc2UoY2xlYW51cCk7CgkJdGhpcy5lcnJvcihjbGVhbnVwKTsKCX0sCglidWlsZFVybDogZnVuY3Rpb24oaW5QYXJhbXMsIGluQ2FsbGJhY2tGdW5jdGlvbk5hbWUpIHsKCQl2YXIgcGFydHMgPSB0aGlzLnVybC5zcGxpdCgiPyIpOwoJCXZhciB1cmkgPSBwYXJ0cy5zaGlmdCgpIHx8ICIiOwoJCXZhciBhcmdzID0gcGFydHMubGVuZ3RoPyBwYXJ0cy5qb2luKCI/Iikuc3BsaXQoIiYiKTogW107CgkJLy8KCQl2YXIgYm9keUFyZ3MgPSB0aGlzLmJvZHlBcmdzRnJvbVBhcmFtcyhpblBhcmFtcywgaW5DYWxsYmFja0Z1bmN0aW9uTmFtZSk7CgkJYXJncy5wdXNoKGJvZHlBcmdzKTsKCQlpZiAodGhpcy5jYWNoZUJ1c3QpIHsKCQkJYXJncy5wdXNoKE1hdGgucmFuZG9tKCkpOwoJCX0KCQkvLwoJCXJldHVybiBbdXJpLCBhcmdzLmpvaW4oIiYiKV0uam9pbigiPyIpOwoJfSwKCS8vIGZvciBhIHN0cmluZyB2ZXJzaW9uIG9mIGluUGFyYW1zLCB3ZSBmb2xsb3cgdGhlIGNvbnZlbnRpb24gb2YKCS8vIHJlcGxhY2luZyB0aGUgc3RyaW5nICI9PyIgd2l0aCB0aGUgY2FsbGJhY2sgbmFtZS4gRm9yIHRoZSBtb3JlCgkvLyBjb21tb24gY2FzZSBvZiBpblBhcmFtcyBiZWluZyBhbiBvYmplY3QsIHdlJ2xsIGFkZCBhIGFyZ3VtZW50IG5hbWVkCgkvLyB1c2luZyB0aGUgY2FsbGJhY2tOYW1lIHB1Ymxpc2hlZCBwcm9wZXJ0eS4KCWJvZHlBcmdzRnJvbVBhcmFtczogZnVuY3Rpb24oaW5QYXJhbXMsIGluQ2FsbGJhY2tGdW5jdGlvbk5hbWUpIHsKCQlpZiAoZW55by5pc1N0cmluZyhpblBhcmFtcykpIHsKCQkJcmV0dXJuIGluUGFyYW1zLnJlcGxhY2UoIj0/IiwgIj0iICsgaW5DYWxsYmFja0Z1bmN0aW9uTmFtZSk7CgkJfSBlbHNlIHsKCQkJdmFyIHBhcmFtcyA9IGVueW8ubWl4aW4oe30sIGluUGFyYW1zKTsKCQkJaWYgKHRoaXMuY2FsbGJhY2tOYW1lKSB7CgkJCQlwYXJhbXNbdGhpcy5jYWxsYmFja05hbWVdID0gaW5DYWxsYmFja0Z1bmN0aW9uTmFtZTsKCQkJfQoJCQlyZXR1cm4gZW55by5BamF4Lm9iamVjdFRvUXVlcnkocGFyYW1zKTsKCQl9Cgl9Cn0pOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ajax/WebService.js"
Content-Type: application/octet-stream; x-encoding=base64
77u/Ly8qIEBwcm90ZWN0ZWQKZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLl9BamF4Q29tcG9uZW50IiwKCWtpbmQ6ICJlbnlvLkNvbXBvbmVudCIsCglwdWJsaXNoZWQ6IGVueW8uQWpheFByb3BlcnRpZXMKfSk7CgovLyogQHB1YmxpYwovKioKCV9lbnlvLldlYlNlcnZpY2VfIGlzIGEgY29tcG9uZW50IHRoYXQgcGVyZm9ybXMgV2ViIHJlcXVlc3RzIChfWG1sSHR0cFJlcXVlc3RfKS4KCglJbnRlcm5hbGx5LCBfZW55by5XZWJTZXJ2aWNlXyB1c2VzIF9lbnlvLkFzeW5jXyBzdWJraW5kcyAobmFtZWx5LAoJPGEgaHJlZj0iI2VueW8uQWpheCI+ZW55by5BamF4PC9hPiBhbmQKCTxhIGhyZWY9IiNlbnlvLkpzb25wUmVxdWVzdCI+ZW55by5Kc29ucFJlcXVlc3Q8L2E+KSB0byBtYW5hZ2UgdHJhbnNhY3Rpb25zLgoJVGhlIF9zZW5kXyBtZXRob2QgcmV0dXJucyB0aGUgQXN5bmMgaW5zdGFuY2UgdXNlZCBieSB0aGUgcmVxdWVzdC4KCglfZW55by5XZWJTZXJ2aWNlXyB1c2VzIF9lbnlvLkFqYXhfIGJ5IGRlZmF1bHQgYW5kLCBsaWtlIF9lbnlvLkFqYXhfLCBpdAoJcHVibGlzaGVzIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUKCTxhIGhyZWY9IiNlbnlvLkFqYXhQcm9wZXJ0aWVzIj5lbnlvLkFqYXhQcm9wZXJ0aWVzPC9hPiBvYmplY3QuCgoJVG8gdXNlIGBlbnlvLkpzb25wUmVxdWVzdGAgaW5zdGVhZCBvZiBgZW55by5BamF4YCwgc2V0IGBqc29uYCB0byBgdHJ1ZWAuCgoJSWYgeW91IG1ha2UgY2hhbmdlcyB0byBfZW55by5XZWJTZXJ2aWNlXywgYmUgc3VyZSB0byBhZGQgb3IgdXBkYXRlIHRoZQoJYXBwcm9wcmlhdGUgW3VuaXQgdGVzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvanMvZW55by90cmVlL21hc3Rlci90b29scy90ZXN0L2FqYXgvdGVzdHMpLgoKCUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb24KCVtDb25zdW1pbmcgV2ViIFNlcnZpY2VzXShodHRwczovL2dpdGh1Yi5jb20vZW55b2pzL2VueW8vd2lraS9Db25zdW1pbmctV2ViLVNlcnZpY2VzKQoJaW4gdGhlIEVueW8gRGV2ZWxvcGVyIEd1aWRlLgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uV2ViU2VydmljZSIsCglraW5kOiAiZW55by5fQWpheENvbXBvbmVudCIsCglwdWJsaXNoZWQ6IHsKCQkvLyogU2V0IHRvIHRydWUgdG8gdXNlIEpTT05QIHByb3RvY29sCgkJanNvbnA6IGZhbHNlLAoJCS8qKgoJCQlXaGVuIHVzaW5nIEpTT05QLCB0aGUgbmFtZSBvZiB0aGUgY2FsbGJhY2sgcGFyYW1ldGVyLgoJCQlOb3RlIHRoYXQgdGhpcyBub3QgdGhlIG5hbWUgb2YgYSBjYWxsYmFjayBmdW5jdGlvbiwgYnV0IG9ubHkKCQkJdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrIHBhcmFtZXRlci4gRW55byB3aWxsIGNyZWF0ZSBhbgoJCQlpbnRlcm5hbCBjYWxsYmFjayBmdW5jdGlvbiBhcyBuZWNlc3NhcnkuCgkJKi8KCQljYWxsYmFja05hbWU6ICJjYWxsYmFjayIsCgkJLyoqCgkJCVdoZW4gdXNpbmcgSlNPTlAsIG9wdGlvbmFsIGNoYXJhY3RlciBzZXQgdG8gdXNlIHRvIGludGVycHJldCB0aGUKCQkJcmV0dXJuIGRhdGEKCQkqLwoJCWNoYXJzZXQ6IG51bGwsCgkJLyoqCgkJCUlmIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0bwoJCQl3YWl0IGFmdGVyIHRoZSBfc2VuZF8gY2FsbCBiZWZvcmUgZmFpbGluZyB3aXRoIGEgInRpbWVvdXQiIGVycm9yCgkJKi8KCQl0aW1lb3V0OiAwCgl9LAoJZXZlbnRzOiB7CgkJLyoqCgkJCUZpcmVzIHdoZW4gYSByZXNwb25zZSBpcyByZWNlaXZlZC4KCgkJCV9pbkV2ZW50LmFqYXhfIGNvbnRhaW5zIHRoZSBBc3luYyBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QuCgoJCQlfaW5FdmVudC5kYXRhXyBjb250YWlucyB0aGUgcmVzcG9uc2UgZGF0YS4KCQkqLwoJCW9uUmVzcG9uc2U6ICIiLAoJCS8qKgoJCQlGaXJlcyB3aGVuIGFuIGVycm9yIGlzIHJlY2VpdmVkLgoKCQkJX2luRXZlbnQuYWpheF8gY29udGFpbnMgdGhlCUFzeW5jIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdC4KCgkJCV9pbkV2ZW50LmRhdGFfIGNvbnRhaW5zIHRoZSBlcnJvciBkYXRhLgoJCSovCgkJb25FcnJvcjogIiIsCgkJLyoqCgkJCUZpcmVzIHdoZW4gdGhlIHJlcXVlc3QgcHJvZ3Jlc3Nlcy4KCQkqLwoJCW9uUHJvZ3Jlc3M6ICIiCgl9LAoJLy8qIEBwcm90ZWN0ZWQKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihpblByb3BzKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCgkvLyogQHB1YmxpYwoJLyoqCgkJU2VuZHMgYSBXZWIgcmVxdWVzdCB3aXRoIHRoZSBwYXNzZWQtaW4gcGFyYW1ldGVycywgcmV0dXJuaW5nIHRoZQoJCWFzc29jaWF0ZWQgQXN5bmMgaW5zdGFuY2UuCgoJCV9pblByb3BzXyBpcyBhbiBvcHRpb25hbCBvYmplY3QgcGFyYW1ldGVydGhhdCAgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgc29tZQoJCW9mIHRoZSBBSkFYIHByb3BlcnRpZXMgZm9yIHRoaXMgcmVxdWVzdCwgc3VjaCBhcyBzZXR0aW5nIGEgX3Bvc3RCb2R5Xy4KCSovCglzZW5kOiBmdW5jdGlvbihpblBhcmFtcywgaW5Qcm9wcykgewoJCXJldHVybiB0aGlzLmpzb25wID8gdGhpcy5zZW5kSnNvbnAoaW5QYXJhbXMsIGluUHJvcHMpIDogdGhpcy5zZW5kQWpheChpblBhcmFtcywgaW5Qcm9wcyk7Cgl9LAoJLy8qIEBwcm90ZWN0ZWQKCXNlbmRKc29ucDogZnVuY3Rpb24oaW5QYXJhbXMsIGluUHJvcHMpIHsKCQl2YXIganNvbnAgPSBuZXcgZW55by5Kc29ucFJlcXVlc3QoKTsKCQlmb3IgKHZhciBuIGluIHsndXJsJzoxLCAnY2FsbGJhY2tOYW1lJzoxLCAnY2hhcnNldCc6MSwgJ3RpbWVvdXQnOjF9KSB7CgkJCWpzb25wW25dID0gdGhpc1tuXTsKCQl9CgkJZW55by5taXhpbihqc29ucCwgaW5Qcm9wcyk7CgkJcmV0dXJuIHRoaXMuc2VuZEFzeW5jKGpzb25wLCBpblBhcmFtcyk7Cgl9LAoJc2VuZEFqYXg6IGZ1bmN0aW9uKGluUGFyYW1zLCBpblByb3BzKSB7CgkJdmFyIGFqYXggPSBuZXcgZW55by5BamF4KGluUHJvcHMpOwoJCWZvciAodmFyIG4gaW4gZW55by5BamF4UHJvcGVydGllcykgewoJCQlhamF4W25dID0gdGhpc1tuXTsKCQl9CgkJYWpheC50aW1lb3V0ID0gdGhpcy50aW1lb3V0OwoJCWVueW8ubWl4aW4oYWpheCwgaW5Qcm9wcyk7CgkJcmV0dXJuIHRoaXMuc2VuZEFzeW5jKGFqYXgsIGluUGFyYW1zKTsKCX0sCglzZW5kQXN5bmM6IGZ1bmN0aW9uKGluQWpheCwgaW5QYXJhbXMpIHsKCQlyZXR1cm4gaW5BamF4LmdvKGluUGFyYW1zKS5yZXNwb25zZSh0aGlzLCAicmVzcG9uc2UiKS5lcnJvcih0aGlzLCAiZXJyb3IiKS5wcm9ncmVzcyh0aGlzLCAicHJvZ3Jlc3MiKTsKCX0sCglyZXNwb25zZTogZnVuY3Rpb24oaW5TZW5kZXIsIGluRGF0YSkgewoJCXRoaXMuZG9SZXNwb25zZSh7YWpheDogaW5TZW5kZXIsIGRhdGE6IGluRGF0YX0pOwoJfSwKCWVycm9yOiBmdW5jdGlvbihpblNlbmRlciwgaW5EYXRhKSB7CgkJdGhpcy5kb0Vycm9yKHthamF4OiBpblNlbmRlciwgZGF0YTogaW5EYXRhfSk7Cgl9LAoJcHJvZ3Jlc3M6IGZ1bmN0aW9uKGluU2VuZGVyLCBpblByb2dyZXNzRXZlbnQpIHsKCQl0aGlzLmRvUHJvZ3Jlc3MoaW5Qcm9ncmVzc0V2ZW50KTsKCX0KfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ajax/cookie.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwdWJsaWMKCi8qKgoJR2V0cyBhIG5hbWVkIHZhbHVlIGZyb20gdGhlIGRvY3VtZW50IGNvb2tpZS4KKi8KZW55by5nZXRDb29raWUgPSBmdW5jdGlvbihpbk5hbWUpIHsKCXZhciBtYXRjaGVzID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIig/Ol58OyApIiArIGluTmFtZSArICI9KFteO10qKSIpKTsKCXJldHVybiBtYXRjaGVzID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoZXNbMV0pIDogdW5kZWZpbmVkOwp9OwoKLyoqCglTZXRzIGEgbmFtZWQgdmFsdWUgaW4gdGhlIGRvY3VtZW50IGNvb2tpZSwgd2l0aCBwcm9wZXJ0aWVzLgoKCVByb3BlcnRpZXMgaW4gdGhlIG9wdGlvbmFsIF9pblByb3BzXyBhcmd1bWVudCBhcmUgYXR0YWNoZWQgdG8gdGhlIGNvb2tpZS4KCV9pblByb3BzXyBtYXkgaGF2ZSBhbiBfZXhwaXJlc18gcHJvcGVydHksIHdoaWNoIGNhbiBiZSBhIG51bWJlciBvZiBkYXlzLCBhCglEYXRlIG9iamVjdCwgb3IgYSBVVEMgdGltZSBzdHJpbmcuCgoJVG8gcmVtb3ZlIGEgY29va2llLCB1c2UgYW4gX2luUHJvcHNfIHZhbHVlIG9mIDxjb2RlPnsgIk1heC1BZ2UiOiAwIH08L2NvZGU+LgoKCUlmIGRldmVsb3BpbmcgaW4gdGhlIEdvb2dsZSBDaHJvbWUgYnJvd3NlciB3aXRoIGEgbG9jYWwgZmlsZSBhcyB5b3VyCglhcHBsaWNhdGlvbiwgc3RhcnQgQ2hyb21lIHdpdGggdGhlIDxjb2RlPi0tZW5hYmxlLWZpbGUtY29va2llczwvY29kZT4gc3dpdGNoCgl0byBhbGxvdyBjb29raWVzIHRvIGJlIHNldC4KKi8KZW55by5zZXRDb29raWUgPSBmdW5jdGlvbihpbk5hbWUsIGluVmFsdWUsIGluUHJvcHMpIHsKCXZhciBjb29raWUgPSBpbk5hbWUgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5WYWx1ZSk7Cgl2YXIgcCA9IGluUHJvcHMgfHwge307CgkvLwoJLy8gRklYTUU6IGV4cGlyZXM9MCBzZWVtcyB0byBkaXNhcHBlYXIgcmlnaHQgYXdheSwgbm90IG9uIGNsb3NlPyAoRkYzKSAgQ2hhbmdlIGRvY3M/Cgl2YXIgZXhwID0gcC5leHBpcmVzOwoJaWYgKHR5cGVvZiBleHAgPT0gIm51bWJlciIpIHsKCQl2YXIgZCA9IG5ldyBEYXRlKCk7CgkJZC5zZXRUaW1lKGQuZ2V0VGltZSgpICsgZXhwKjI0KjYwKjYwKjEwMDApOwoJCWV4cCA9IGQ7Cgl9CglpZiAoZXhwICYmIGV4cC50b1VUQ1N0cmluZykgewoJCXAuZXhwaXJlcyA9IGV4cC50b1VUQ1N0cmluZygpOwoJfQoJLy8KCXZhciBuYW1lLCB2YWx1ZTsKCWZvciAobmFtZSBpbiBwKXsKCQljb29raWUgKz0gIjsgIiArIG5hbWU7CgkJdmFsdWUgPSBwW25hbWVdOwoJCWlmICh2YWx1ZSAhPT0gdHJ1ZSkgewoJCQljb29raWUgKz0gIj0iICsgdmFsdWU7CgkJfQoJfQoJLy8KCS8vZW55by5sb2coY29va2llKTsKCWRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZTsKfTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ajax/formdata.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCgpfZW55by5Gb3JtRGF0YV8gaXMgYW4gW1hIUjJdKGh0dHA6Ly93d3cudzMub3JnL1RSL1hNTEh0dHBSZXF1ZXN0LykKYEZvcm1EYXRhYCBpbXBsZW1lbnRhdGlvbi4gIEl0IGlzIHVzZWQgdG8gc2VuZCBgbXVsdGlwYXJ0L2Zvcm0tZGF0YWAKQWpheCByZXF1ZXN0cy4gIF9lbnlvLkJsb2JfIGlzIHRoZSBhc3NvY2lhdGVkIGNvbnRlbnQgcHJvdmlkZXIgZm9yCmZpbGUtcGFydHMuCgpOb3RlIHRoYXQgaW4gSUU8MTAsIGJvdGggX2VueW8uRm9ybURhdGFfIGFuZCBfZW55by5CbG9iXyBhcmUgbGltaXRlZAp0byBgU3RyaW5nYCBjb250ZW50LS1hbiBfZW55by5CbG9iXyBtYXkgb25seSBiZSBpbnN0YW50aWF0ZWQgdXNpbmcgYW4KYEFycmF5YCBvciBgU3RyaW5nYC4KCl9lbnlvLkZvcm1EYXRhXyBpcyBpbnNwaXJlZCBieQpbaHRtbDUtZm9ybWRhdGFdKGh0dHBzOi8vZ2l0aHViLmNvbS9mcmFuY29pczJtZXR6L2h0bWw1LWZvcm1kYXRhL2Jsb2IvbWFzdGVyL2Zvcm1kYXRhLmpzKS4KCiAgICBFbXVsYXRlIEZvcm1EYXRhIGZvciBzb21lIGJyb3dzZXJzCiAgICBNSVQgTGljZW5zZQogICAgKGMpIDIwMTAgRnJhbmNvaXMgZGUgTWV0egoKICovCihmdW5jdGlvbih3KSB7CglpZiAody5Gb3JtRGF0YSkgewoJCXRyeSB7CgkJCS8qIGpzaGludCB1bnVzZWQ6IGZhbHNlICovCgkJCXZhciB0MSA9IG5ldyB3LkZvcm1EYXRhKCk7CgkJCXZhciB0MiA9IG5ldyB3LkJsb2IoKTsKCQkJLy8gQW5kcm9pZCBDaHJvbWUgMTggd2lsbCB0aHJvdyBhbiBlcnJvciB0cnlpbmcgdG8gY3JlYXRlIHRoZXNlCgkJCWVueW8uRm9ybURhdGEgPSB3LkZvcm1EYXRhOwoJCQllbnlvLkJsb2IgPSB3LkJsb2I7CgkJCXJldHVybjsKCQl9CgkJY2F0Y2ggKGUpIHsKCQkJLy8gaWdub3JlIGVycm9yIGFuZCBmYWxsIHRocm91Z2ggdG8gZmFrZSBGb3JtRGF0YSBjb2RlCgkJfQoJfQoJZnVuY3Rpb24gRm9ybURhdGEoKSB7CgkJdGhpcy5mYWtlID0gdHJ1ZTsKCQl0aGlzLl9maWVsZHMgPSBbXTsKCQkvLyBUaGlzIGdlbmVyYXRlcyBhIDUwIGNoYXJhY3RlciBib3VuZGFyeSBzaW1pbGFyIHRvCgkJLy8gdGhvc2UgdXNlZCBieSBGaXJlZm94LiAgVGhleSBhcmUgb3B0aW1pemVkIGZvcgoJCS8vIGJveWVyLW1vb3JlIHBhcnNpbmcuCgkJdGhpcy5ib3VuZGFyeSA9ICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSc7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCAyNDsgaSsrKSB7CgkJCXRoaXMuYm91bmRhcnkgKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApLnRvU3RyaW5nKDE2KTsKCQl9Cgl9CglGb3JtRGF0YS5wcm90b3R5cGUuZ2V0Q29udGVudFR5cGUgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gIm11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSIgKyB0aGlzLmJvdW5kYXJ5OwoJfTsKCUZvcm1EYXRhLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihrZXksIHZhbHVlLCBmaWxlbmFtZSkgewoJCXRoaXMuX2ZpZWxkcy5wdXNoKFtrZXksIHZhbHVlLCBmaWxlbmFtZV0pOwoJfTsKCUZvcm1EYXRhLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewoJCXZhciBib3VuZGFyeSA9IHRoaXMuYm91bmRhcnk7CgkJdmFyIGJvZHkgPSAiIjsKCQllbnlvLmZvckVhY2godGhpcy5fZmllbGRzLCBmdW5jdGlvbihmaWVsZCkgewoJCQlib2R5ICs9ICItLSIgKyBib3VuZGFyeSArICJcclxuIjsKCQkJaWYgKGZpZWxkWzJdIHx8IGZpZWxkWzFdLm5hbWUpIHsKCQkJCS8vIGZpbGUgdXBsb2FkCgkJCQl2YXIgZmlsZSA9IGZpZWxkWzFdLCBmaWxlbmFtZSA9IGZpZWxkWzJdIHx8IGZpbGUubmFtZTsKCQkJCWJvZHkgKz0gIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cIiIrIGZpZWxkWzBdICsiXCI7IGZpbGVuYW1lPVwiIisgZmlsZW5hbWUgKyJcIlxyXG4iOwoJCQkJYm9keSArPSAiQ29udGVudC1UeXBlOiAiKyBmaWxlLnR5cGUgKyJcclxuXHJcbiI7CgkJCQlib2R5ICs9IGZpbGUuZ2V0QXNCaW5hcnkoKSArICJcclxuIjsKCQkJfSBlbHNlIHsKCQkJCS8vIGtleS12YWx1ZSBmaWVsZAoJCQkJYm9keSArPSAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiIisgZmllbGRbMF0gKyJcIjtcclxuXHJcbiI7CgkJCQlib2R5ICs9IGZpZWxkWzFdICsgIlxyXG4iOwoJCQl9CgkJfSk7CgkJYm9keSArPSAiLS0iICsgYm91bmRhcnkgKyItLSI7CgkJcmV0dXJuIGJvZHk7Cgl9OwoJZW55by5Gb3JtRGF0YSA9IEZvcm1EYXRhOwoKCWZ1bmN0aW9uIEJsb2IoaW5CdWZzLCBpbk9wdHMpIHsKCQl0aGlzLm5hbWUgPSBpbk9wdHMubmFtZTsKCQl0aGlzLnR5cGUgPSBpbk9wdHMudHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKCQlpZiAoIWVueW8uaXNBcnJheShpbkJ1ZnMpKSB7CgkJCXRocm93IG5ldyBFcnJvcignZW55by5CbG9iIG9ubHkgaGFuZGxlcyBBcnJheXMgb2YgU3RyaW5ncycpOwoJCX0KCQlpZiAoKGluQnVmcy5sZW5ndGggPiAwKSAmJiB0eXBlb2YgaW5CdWZzWzBdICE9PSAnc3RyaW5nJykgewoJCQl0aHJvdyBuZXcgRXJyb3IoJ2VueW8uQmxvYiBvbmx5IGhhbmRsZXMgQXJyYXlzIG9mIFN0cmluZ3MnKTsKCQl9CgkJdGhpcy5fYnVmcyA9IGluQnVmczsgLy8gbGVhdmUgYnl0ZSBhcnJheXMgdW4tdG91Y2hlZAoJfQoJQmxvYi5wcm90b3R5cGUuZ2V0QXNCaW5hcnkgPSBmdW5jdGlvbigpIHsKCQl2YXIgZW1wdHkgPSAnJywKCQkJY29udGVudCA9IGVtcHR5LmNvbmNhdC5hcHBseShlbXB0eSwgdGhpcy5fYnVmcyk7CgkJcmV0dXJuIGNvbnRlbnQ7Cgl9OwoJZW55by5CbG9iID0gQmxvYjsKCn0pKHdpbmRvdyk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ajax/json.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5qc29uID0gewoJLy8qIEBwdWJsaWMKCS8qKgoJCVJldHVybnMgYSBKU09OIHN0cmluZyBmb3IgYSBnaXZlbiBvYmplY3QsIHVzaW5nIG5hdGl2ZSBzdHJpbmdpZnkKCQlyb3V0aW5lLgoJCTxpPmluVmFsdWU8L2k+IGlzIHRoZSBPYmplY3QgdG8gYmUgY29udmVydGVkIHRvIEpTT04uCgkJPGk+aW5SZXBsYWNlcjwvaT4gaXMgdGhlIG9wdGlvbmFsIHZhbHVlIGluY2x1c2lvbiBhcnJheSBvciByZXBsYWNlbWVudCBmdW5jdGlvbi4KCQk8aT5pblNwYWNlPC9pPiBpcyB0aGUgb3B0aW9uYWwgbnVtYmVyIG9yIHN0cmluZyB0byB1c2UgZm9yIHByZXR0eS1wcmludGluZyB3aGl0ZXNwYWNlLgoJKi8KCXN0cmluZ2lmeTogZnVuY3Rpb24oaW5WYWx1ZSwgaW5SZXBsYWNlciwgaW5TcGFjZSkgewoJCXJldHVybiBKU09OLnN0cmluZ2lmeShpblZhbHVlLCBpblJlcGxhY2VyLCBpblNwYWNlKTsKCX0sCgkvKioKCQlSZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3QgZm9yIGEgZ2l2ZW4gSlNPTiBzdHJpbmcsIHVzaW5nIG5hdGl2ZSBzdHJpbmdpZnkKCQlyb3V0aW5lLgoJCTxpPmluSnNvbjwvaT4gaXMgdGhlIEpTT04gc3RyaW5nIHRvIGJlIGNvbnZlcnRlZCB0byBhIEphdmFTY3JpcHQgb2JqZWN0LgoJKi8KCXBhcnNlOiBmdW5jdGlvbihpbkpzb24sIGluUmV2aXZlcikgewoJCXJldHVybiBpbkpzb24gPyBKU09OLnBhcnNlKGluSnNvbiwgaW5SZXZpdmVyKSA6IG51bGw7Cgl9Cn07Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ajax/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJIkFzeW5jLmpzIiwKCSJqc29uLmpzIiwKCSJjb29raWUuanMiLAoJInhoci5qcyIsCgkiZm9ybWRhdGEuanMiLAoJIkFqYXhQcm9wZXJ0aWVzLmpzIiwKCSJBamF4LmpzIiwKCSJKc29ucC5qcyIsCgkiV2ViU2VydmljZS5qcyIKKTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ajax/xhr.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwcm90ZWN0ZWQKLyoqCglJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIF9lbnlvLnhocl8sIGJlIHN1cmUgdG8gYWRkIG9yIHVwZGF0ZSB0aGUgYXBwcm9wcmlhdGUKCVt1bml0IHRlc3RzXShodHRwczovL2dpdGh1Yi5jb20vZW55b2pzL2VueW8vdHJlZS9tYXN0ZXIvdG9vbHMvdGVzdC9hamF4L3Rlc3RzKS4KKi8KZW55by54aHIgPSB7CgkvKioKCQk8Y29kZT5pblBhcmFtczwvY29kZT4gaXMgYW4gT2JqZWN0IHRoYXQgbWF5IGNvbnRhaW4gdGhlc2UgcHJvcGVydGllczoKCgkJLSBfdXJsXzogVGhlIFVSTCB0byByZXF1ZXN0IChyZXF1aXJlZCkuCgkJLSBfbWV0aG9kXzogVGhlIEhUVFAgbWV0aG9kIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QuIERlZmF1bHRzIHRvIEdFVC4KCQktIF9jYWxsYmFja186IENhbGxlZCB3aGVuIHJlcXVlc3QgaXMgY29tcGxldGVkLiAoT3B0aW9uYWwpCgkJLSBfYm9keV86IFNwZWNpZmljIGNvbnRlbnRzIGZvciB0aGUgcmVxdWVzdCBib2R5IGZvciBQT1NUIG1ldGhvZC4gKE9wdGlvbmFsKQoJCS0gX2hlYWRlcnNfOiBBZGRpdGlvbmFsIHJlcXVlc3QgaGVhZGVycy4gKE9wdGlvbmFsKS4gIEdpdmVuIGhlYWRlcnMgb3ZlcnJpZGUgdGhlIG9uZXMgdGhhdCBFbnlvIG1heSBzZXQgYnkgZGVmYXVsdCAoYG51bGxgIGV4cGxpY3RseSByZW1vdmluZyB0aGUgaGVhZGVyIGZyb20gdGhlIEFKQVggcmVxdWVzdCkuCgkJLSBfdXNlcm5hbWVfOiBUaGUgb3B0aW9uYWwgdXNlciBuYW1lIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24gcHVycG9zZXMuCgkJLSBfcGFzc3dvcmRfOiBUaGUgb3B0aW9uYWwgcGFzc3dvcmQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbiBwdXJwb3Nlcy4KCQktIF94aHJGaWVsZHNfOiBPcHRpb25hbCBvYmplY3QgY29udGFpbmluZyBuYW1lL3ZhbHVlIHBhaXJzIHRvIG1peCBkaXJlY3RseSBpbnRvIHRoZSBnZW5lcmF0ZWQgeGhyIG9iamVjdC4KCQktIF9taW1lVHlwZV86IE9wdGlvbmFsIHN0cmluZyB0byBvdmVycmlkZSB0aGUgTUlNRS1UeXBlLgoKCQlOb3RlOiBvbiBpT1MgNiwgd2Ugd2lsbCBleHBsaWNpdHkgYWRkIGEgImNhY2hlLWNvbnRyb2w6IG5vLWNhY2hlIgoJCWhlYWRlciBmb3IgYW55IG5vbi1HRVQgcmVxdWVzdHMgdG8gd29ya2Fyb3VuZCBhIHN5c3RlbSBidWcgdGhhdCBjYXVzZWQKCQlub24tY2FjaGFibGUgcmVxdWVzdHMgdG8gYmUgY2FjaGVkLiBUbyBkaXNhYmxlIHRoaXMsIHVzZSB0aGUgX2hlYWRlcl8KCQlwcm9wZXJ0eSB0byBzcGVjaWZ5IGFuIG9iamVjdCB3aGVyZSAiY2FjaGUtY29udHJvbCIgaXMgc2V0IHRvIG51bGwuCgkqLwoJcmVxdWVzdDogZnVuY3Rpb24oaW5QYXJhbXMpIHsKCQl2YXIgeGhyID0gdGhpcy5nZXRYTUxIdHRwUmVxdWVzdChpblBhcmFtcyk7CgkJdmFyIHVybCA9IGVueW8ucGF0aC5yZXdyaXRlKHRoaXMuc2ltcGxpZnlGaWxlVVJMKGluUGFyYW1zLnVybCkpOwoJCS8vCgkJdmFyIG1ldGhvZCA9IGluUGFyYW1zLm1ldGhvZCB8fCAiR0VUIjsKCQl2YXIgYXN5bmMgPSAhaW5QYXJhbXMuc3luYzsKCQkvLwoJCWlmIChpblBhcmFtcy51c2VybmFtZSkgewoJCQl4aHIub3BlbihtZXRob2QsIHVybCwgYXN5bmMsIGluUGFyYW1zLnVzZXJuYW1lLCBpblBhcmFtcy5wYXNzd29yZCk7CgkJfSBlbHNlIHsKCQkJeGhyLm9wZW4obWV0aG9kLCB1cmwsIGFzeW5jKTsKCQl9CgkJLy8KCQllbnlvLm1peGluKHhociwgaW5QYXJhbXMueGhyRmllbGRzKTsKCQkvLyBvbmx5IHNldHVwIGhhbmRsZXIgd2hlbiB3ZSBoYXZlIGEgY2FsbGJhY2sKCQlpZiAoaW5QYXJhbXMuY2FsbGJhY2spIHsKCQkJdGhpcy5tYWtlUmVhZHlTdGF0ZUhhbmRsZXIoeGhyLCBpblBhcmFtcy5jYWxsYmFjayk7CgkJfQoJCS8vCgkJaW5QYXJhbXMuaGVhZGVycyA9IGluUGFyYW1zLmhlYWRlcnMgfHwge307CgkJLy8gd29yayBhcm91bmQgaU9TIDYuMCBidWcgd2hlcmUgbm9uLUdFVCByZXF1ZXN0cyBhcmUgY2FjaGVkCgkJLy8gc2VlIGh0dHA6Ly93d3cuZWludGVybmFscy5jb20vYmxvZy93ZWItZGV2ZWxvcG1lbnQvaW9zNi0wLWNhY2hpbmctYWpheC1wb3N0LXJlcXVlc3RzCgkJaWYgKG1ldGhvZCAhPT0gIkdFVCIgJiYgZW55by5wbGF0Zm9ybS5pb3MgJiYgZW55by5wbGF0Zm9ybS5pb3MgPT0gNikgewoJCQlpZiAoaW5QYXJhbXMuaGVhZGVyc1siY2FjaGUtY29udHJvbCJdICE9PSBudWxsKSB7CgkJCQlpblBhcmFtcy5oZWFkZXJzWyJjYWNoZS1jb250cm9sIl0gPSBpblBhcmFtcy5oZWFkZXJzWydjYWNoZS1jb250cm9sJ10gfHwgIm5vLWNhY2hlIjsKCQkJfQoJCX0KCQkvLyB1c2VyLXNldCBoZWFkZXJzIG92ZXJyaWRlIGFueSBwbGF0Zm9ybS1kZWZhdWx0CgkJaWYgKHhoci5zZXRSZXF1ZXN0SGVhZGVyKSB7CgkJCWZvciAodmFyIGtleSBpbiBpblBhcmFtcy5oZWFkZXJzKSB7CgkJCQlpZiAoaW5QYXJhbXMuaGVhZGVyc1trZXldKSB7CgkJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCBpblBhcmFtcy5oZWFkZXJzW2tleV0pOwoJCQkJfQoJCQl9CgkJfQoJCS8vCgkJaWYoKHR5cGVvZiB4aHIub3ZlcnJpZGVNaW1lVHlwZSA9PSAiZnVuY3Rpb24iKSAmJiBpblBhcmFtcy5taW1lVHlwZSkgewoJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZShpblBhcmFtcy5taW1lVHlwZSk7CgkJfQoJCS8vCgkJeGhyLnNlbmQoaW5QYXJhbXMuYm9keSB8fCBudWxsKTsKCQlpZiAoIWFzeW5jICYmIGluUGFyYW1zLmNhbGxiYWNrKSB7CgkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UoeGhyKTsKCQl9CgkJcmV0dXJuIHhocjsKCX0sCgkvLyogcmVtb3ZlIGFueSBjYWxsYmFja3MgdGhhdCBtaWdodCBiZSBzZXQgZnJvbSBFbnlvIGNvZGUgZm9yIGFuIGV4aXN0aW5nIFhIUgoJLy8qIGFuZCBzdG9wIHRoZSBYSFIgZnJvbSBjb21wbGV0aW5nLgoJY2FuY2VsOiBmdW5jdGlvbihpblhocikgewoJCWlmIChpblhoci5vbmxvYWQpIHsKCQkJaW5YaHIub25sb2FkID0gbnVsbDsKCQl9CgkJaWYgKGluWGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSkgewoJCQlpblhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoJCX0KCQlpZiAoaW5YaHIuYWJvcnQpIHsKCQkJaW5YaHIuYWJvcnQoKTsKCQl9Cgl9LAoJLy8qIEBwcm90ZWN0ZWQKCW1ha2VSZWFkeVN0YXRlSGFuZGxlcjogZnVuY3Rpb24oaW5YaHIsIGluQ2FsbGJhY2spIHsKCQlpZiAod2luZG93LlhEb21haW5SZXF1ZXN0ICYmIGluWGhyIGluc3RhbmNlb2Ygd2luZG93LlhEb21haW5SZXF1ZXN0KSB7CgkJCWluWGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewoJCQkJdmFyIGRhdGE7CgkJCQlpZiAoaW5YaHIucmVzcG9uc2VUeXBlID09PSAiYXJyYXlidWZmZXIiKSB7CgkJCQkJZGF0YSA9IGluWGhyLnJlc3BvbnNlOwoJCQkJfSBlbHNlIGlmICh0eXBlb2YgaW5YaHIucmVzcG9uc2VUZXh0ID09PSAic3RyaW5nIikgewoJCQkJCWRhdGEgPSBpblhoci5yZXNwb25zZVRleHQ7CgkJCQl9CgkJCQlpbkNhbGxiYWNrLmFwcGx5KG51bGwsIFtkYXRhLCBpblhocl0pOwoJCQl9OwoJCX0KCQlpblhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKCQkJaWYgKGluWGhyLnJlYWR5U3RhdGUgPT0gNCkgewoJCQkJdmFyIGRhdGE7CgkJCQlpZiAoaW5YaHIucmVzcG9uc2VUeXBlID09PSAiYXJyYXlidWZmZXIiKSB7CgkJCQkJZGF0YSA9IGluWGhyLnJlc3BvbnNlOwoJCQkJfSBlbHNlIGlmICh0eXBlb2YgaW5YaHIucmVzcG9uc2VUZXh0ID09PSAic3RyaW5nIikgewoJCQkJCWRhdGEgPSBpblhoci5yZXNwb25zZVRleHQ7CgkJCQl9CgkJCQlpbkNhbGxiYWNrLmFwcGx5KG51bGwsIFtkYXRhLCBpblhocl0pOwoJCQl9CgkJfTsKCX0sCglpbk9yaWdpbjogZnVuY3Rpb24oaW5VcmwpIHsKCQl2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSwgcmVzdWx0ID0gZmFsc2U7CgkJYS5ocmVmID0gaW5Vcmw7CgkJLy8gcHJvdG9jb2wgaXMgIjoiIGZvciByZWxhdGl2ZSBVUkxzCgkJaWYgKGEucHJvdG9jb2wgPT09ICI6IiB8fAoJCQkJKGEucHJvdG9jb2wgPT09IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCAmJgoJCQkJCWEuaG9zdG5hbWUgPT09IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSAmJgoJCQkJCWEucG9ydCA9PT0gKHdpbmRvdy5sb2NhdGlvbi5wb3J0IHx8CgkJCQkJCSh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICJodHRwczoiID8gIjQ0MyIgOiAiODAiKSkpKSB7CgkJCXJlc3VsdCA9IHRydWU7CgkJfQoJCXJldHVybiByZXN1bHQ7Cgl9LAoJc2ltcGxpZnlGaWxlVVJMOiBmdW5jdGlvbihpblVybCkgewoJCXZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwoJCWEuaHJlZiA9IGluVXJsOwoJCS8vIHByb3RvY29sIGlzICI6IiBmb3IgcmVsYXRpdmUgVVJMcwoJCWlmIChhLnByb3RvY29sID09PSAiZmlsZToiIHx8CgkJCWEucHJvdG9jb2wgPT09ICI6IiAmJiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICJmaWxlOiIpIHsKCQkJLy8gbGVhdmUgb2ZmIHNlYXJjaCBhbmQgaGFzaCBwYXJ0cyBvZiB0aGUgVVJMCgkJCXJldHVybiBhLnByb3RvY29sICsgJy8vJyArIGEuaG9zdCArIGEucGF0aG5hbWU7CgkJfSBlbHNlIGlmIChhLnByb3RvY29sID09PSAiOiIgJiYgd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAieC13bWFwcDA6IikgewoJCQkvLyBleHBsaWNpdGx5IHJldHVybiBhYnNvbHV0ZSBVUkwgZm9yIFdpbmRvd3MgUGhvbmUgOCwgYXMgYW4gYWJzb2x1dGUgcGF0aCBpcyByZXF1aXJlZCBmb3IgbG9jYWwgZmlsZXMKCQkJcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoJy8nKVswXSArICIvIiArIGEuaG9zdCArIGEucGF0aG5hbWU7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGluVXJsOwoJCX0KCX0sCglnZXRYTUxIdHRwUmVxdWVzdDogZnVuY3Rpb24oaW5QYXJhbXMpIHsKCQl0cnkgewoJCQkvLyBvbmx5IHVzZSBYRG9tYWluUmVxdWVzdCB3aGVuIGl0IGV4aXN0cywgbm8gZXh0cmEgaGVhZGVycyB3ZXJlIHNldCwgYW5kIHRoZQoJCQkvLyB0YXJnZXQgVVJMIG1hcHMgdG8gYSBkb21haW4gb3RoZXIgdGhhbiB0aGUgZG9jdW1lbnQgb3JpZ2luLgoJCQlpZiAoZW55by5wbGF0Zm9ybS5pZSA8IDEwICYmIHdpbmRvdy5YRG9tYWluUmVxdWVzdCAmJiAhaW5QYXJhbXMuaGVhZGVycyAmJgoJCQkJIXRoaXMuaW5PcmlnaW4oaW5QYXJhbXMudXJsKSAmJiAhL15maWxlOlwvXC8vLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpKSB7CgkJCQlyZXR1cm4gbmV3IHdpbmRvdy5YRG9tYWluUmVxdWVzdCgpOwoJCQl9CgkJfSBjYXRjaChlKSB7fQoJCXRyeSB7CgkJCXJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCQl9IGNhdGNoKGUpIHt9CgkJcmV0dXJuIG51bGw7Cgl9Cn07Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/boot/boot.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8gbWFjaGluZSBmb3IgYSBsb2FkZXIgaW5zdGFuY2UKZW55by5tYWNoaW5lID0gewoJc2hlZXQ6IGZ1bmN0aW9uKGluUGF0aCkgewoJCXZhciB0eXBlID0gInRleHQvY3NzIjsKCQl2YXIgcmVsID0gInN0eWxlc2hlZXQiOwoJCXZhciBpc0xlc3MgPSAoaW5QYXRoLnNsaWNlKC01KSA9PSAiLmxlc3MiKTsKCQlpZiAoaXNMZXNzKSB7CgkJCWlmICh3aW5kb3cubGVzcykgewoJCQkJLy8gSWYgY2xpZW50LXNpZGUgbGVzcyBpcyBsb2FkZWQsIGluc2VydCB0aGUgbGVzcyBzdHlsZXNoZWV0CgkJCQl0eXBlID0gInRleHQvbGVzcyI7CgkJCQlyZWwgPSAic3R5bGVzaGVldC9sZXNzIjsKCQkJfSBlbHNlIHsKCQkJCS8vIE90aGVyd2lzZSwgd2UgZXhwZWN0IGEgY3NzIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSB0byBleGlzdAoJCQkJaW5QYXRoID0gaW5QYXRoLnNsaWNlKDAsIGluUGF0aC5sZW5ndGgtNCkgKyAiY3NzIjsKCQkJfQoJCX0KCQl2YXIgbGluazsKCQlpZiAoZW55by5ydW50aW1lTG9hZGluZyB8fCBpc0xlc3MpIHsKCQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKCQkJbGluay5ocmVmID0gaW5QYXRoOwoJCQlsaW5rLm1lZGlhID0gInNjcmVlbiI7CgkJCWxpbmsucmVsID0gcmVsOwoJCQlsaW5rLnR5cGUgPSB0eXBlOwoJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKGxpbmspOwoJCX0gZWxzZSB7CgkJCS8qIGpzaGludCBldmlsOiB0cnVlICovCgkJCWRvY3VtZW50LndyaXRlKAoJCQkJJzxsaW5rIGhyZWY9IicgKyBpblBhdGggKyAnIiBtZWRpYT0ic2NyZWVuIiByZWw9IicgKwoJCQkJcmVsICsgJyIgdHlwZT0iJyArIHR5cGUgKyAnIiAvPicpOwoJCQkvKiBqc2hpbnQgZXZpbDogZmFsc2UgKi8KCQl9CgkJaWYgKGlzTGVzcyAmJiB3aW5kb3cubGVzcykgewoJCQl3aW5kb3cubGVzcy5zaGVldHMucHVzaChsaW5rKTsKCQkJaWYgKCFlbnlvLmxvYWRlci5maW5pc2hDYWxsYmFja3MubGVzc1JlZnJlc2gpIHsKCQkJCWVueW8ubG9hZGVyLmZpbmlzaENhbGxiYWNrcy5sZXNzUmVmcmVzaCA9IGZ1bmN0aW9uKCkgewoJCQkJCXdpbmRvdy5sZXNzLnJlZnJlc2godHJ1ZSk7CgkJCQl9OwoJCQl9CgkJfQoJfSwKCXNjcmlwdDogZnVuY3Rpb24oaW5TcmMsIG9uTG9hZCwgb25FcnJvcikgewoJCWlmIChlbnlvLnJ1bnRpbWVMb2FkaW5nKSB7CgkJCXZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKCQkJc2NyaXB0LnNyYyA9IGluU3JjOwoJCQlzY3JpcHQub25sb2FkID0gb25Mb2FkOwoJCQlzY3JpcHQub25lcnJvciA9IG9uRXJyb3I7CgkJCXNjcmlwdC5jaGFyc2V0ID0gInV0Zi04IjsKCQkJZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpOwoJCX0gZWxzZSB7CgkJCS8qIGpzaGludCBldmlsOiB0cnVlICovCgkJCWRvY3VtZW50LndyaXRlKAoJCQkJJzxzY3JpJyArICdwdCBzcmM9IicgKyBpblNyYyArICciJyArCgkJCQkob25Mb2FkID8gJyBvbmxvYWQ9IicgKyBvbkxvYWQgKyAnIicgOiAnJykgKwoJCQkJKG9uRXJyb3IgPyAnIG9uZXJyb3I9IicgKyBvbkVycm9yICsgJyInIDogJycpICsKCQkJCSc+PC9zY3JpJyArICdwdD4nKTsKCQkJLyoganNoaW50IGV2aWw6IGZhbHNlICovCgkJfQoJfSwKCWluamVjdDogZnVuY3Rpb24oaW5Db2RlKSB7CgkJLyoganNoaW50IGV2aWw6IHRydWUgKi8KCQlkb2N1bWVudC53cml0ZSgnPHNjcmknICsgJ3B0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JyArIGluQ29kZSArICI8L3NjcmkiICsgInB0PiIpOwoJCS8qIGpzaGludCBldmlsOiBmYWxzZSAqLwoJfQp9OwoKLy8gY3JlYXRlIGEgZGVwZW5kZW5jeSBwcm9jZXNzb3IgdXNpbmcgb3VyIHNjcmlwdCBtYWNoaW5lCmVueW8ubG9hZGVyID0gbmV3IGVueW8ubG9hZGVyRmFjdG9yeShlbnlvLm1hY2hpbmUpOwoKLy8gZGVwZW5kZW5jeSBBUEkgdXNlcyBlbnlvIGxvYWRlcgplbnlvLmRlcGVuZHMgPSBmdW5jdGlvbigpIHsKCXZhciBsZHIgPSBlbnlvLmxvYWRlcjsKCWlmICghbGRyLnBhY2thZ2VGb2xkZXIpIHsKCQl2YXIgdGFnID0gZW55by5sb2NhdGVTY3JpcHQoInBhY2thZ2UuanMiKTsKCQlpZiAodGFnICYmIHRhZy5wYXRoKSB7CgkJCWxkci5hbGlhc1BhY2thZ2UodGFnLnBhdGgpOwoJCQlsZHIucGFja2FnZUZvbGRlciA9IHRhZy5wYXRoICsgIi8iOwoJCQkvL2NvbnNvbGUubG9nKCJkZXRlY3RlZCBQQUNLQUdFRk9MREVSIFsiICsgbGRyLnBhY2thZ2VGb2xkZXIgKyAiXSIpOwoJCX0KCX0KCWxkci5sb2FkLmFwcGx5KGxkciwgYXJndW1lbnRzKTsKfTsKCi8vIFJ1bnRpbWUgbG9hZGVyCi8vIFVzYWdlOiBlbnlvLmxvYWQoZGVwZW5kcywgW29uTG9hZENhbGxiYWNrXSkKLy8gIHdoZXJlIC0gZGVwZW5kcyBpcyBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5nIHBhdGhzIHRvIHBhY2thZ2UuanMsIHNjcmlwdCwgb3IgY3NzIHRvIGxvYWQKLy8gICAgICAgIC0gZG9uZUNhbGxiYWNrIGlzIGZpcmVkIGFmdGVyIGZpbGUgb3IgcGFja2FnZSBsb2FkaW5nIGhhcyBjb21wbGV0ZWQKLy8gT25seSBvbmUgZmlsZS9wYWNrYWdlIGlzIGxvYWRlZCBhdCBhIHRpbWU7IGFkZGl0aW9uYWwgY2FsbHMgYXJlIHF1ZXVlZCBhbmQgbG9hZGluZyBkZWZlcnJlZAooZnVuY3Rpb24oKSB7Cgl2YXIgZW55byA9IHdpbmRvdy5lbnlvOwoJdmFyIHJ1bnRpbWVMb2FkUXVldWUgPSBbXTsKCWVueW8ubG9hZCA9IGZ1bmN0aW9uKGRlcGVuZHMsIG9uTG9hZENhbGxiYWNrKSB7CgkJcnVudGltZUxvYWRRdWV1ZS5wdXNoKGFyZ3VtZW50cyk7CgkJaWYgKCFlbnlvLnJ1bnRpbWVMb2FkaW5nKSB7CgkJCWVueW8ucnVudGltZUxvYWRpbmcgPSB0cnVlOwoJCQlydW50aW1lTG9hZCgpOwoJCX0KCX07CglmdW5jdGlvbiBydW50aW1lTG9hZChvbkxvYWQpIHsKCQlpZiAob25Mb2FkKSB7CgkJCW9uTG9hZCgpOyAvLyBSdW4gdXNlciBjYWxsYmFjayBmdW5jdGlvbgoJCX0KCQlpZiAocnVudGltZUxvYWRRdWV1ZS5sZW5ndGgpIHsKCQkJdmFyIGFyZ3MgPSBydW50aW1lTG9hZFF1ZXVlLnNoaWZ0KCk7CgkJCXZhciBkZXBlbmRzID0gYXJnc1swXTsKCQkJdmFyIGRlcGVuZHNBcmcgPSBlbnlvLmlzQXJyYXkoZGVwZW5kcykgPyBkZXBlbmRzIDogW2RlcGVuZHNdOwoJCQl2YXIgb25Mb2FkQ2FsbGJhY2sgPSBhcmdzWzFdOwoJCQllbnlvLmxvYWRlci5maW5pc2hDYWxsYmFja3MucnVudGltZUxvYWRlciA9IGZ1bmN0aW9uKGluQmxvY2spIHsKCQkJCS8vIE9uY2UgbG9hZGVyIGlzIGRvbmUgbG9hZGluZyBhIHBhY2thZ2UsIHdlIGNoYWluIGEgY2FsbCB0byBydW50aW1lTG9hZCgpLAoJCQkJLy8gd2hpY2ggd2lsbCBjYWxsIHRoZSBvbkxvYWRDYWxsYmFjayBmcm9tIHRoZSBvcmlnaW5hbCBsb2FkIGNhbGwsIHBhc3NpbmcKCQkJCS8vIGEgcmVmZXJlbmNlIHRvIHRoZSBkZXBlbmRzIGFyZ3VtZW50IGZyb20gdGhlIG9yaWdpbmFsIGNhbGwgZm9yIHRyYWNraW5nLAoJCQkJLy8gZm9sbG93ZWQgYnkga2lja2luZyBvZmYgYW55IGFkZGl0aW9uYWxseSBxdWV1ZWQgbG9hZCgpIGNhbGxzCgkJCQlydW50aW1lTG9hZChmdW5jdGlvbigpIHsKCQkJCQlpZiAob25Mb2FkQ2FsbGJhY2spIHsKCQkJCQkJb25Mb2FkQ2FsbGJhY2soaW5CbG9jayk7CgkJCQkJfQoJCQkJfSk7CgkJCX07CgkJCWVueW8ubG9hZGVyLnBhY2thZ2VGb2xkZXIgPSAiLi8iOwoJCQkvLyBLaWNrIG9mZiBuZXh0IHF1ZXVlZCBjYWxsIHRvIGxvYWRlcgoJCQllbnlvLmRlcGVuZHMuYXBwbHkodGhpcywgZGVwZW5kc0FyZyk7CgkJfSBlbHNlIHsKCQkJZW55by5ydW50aW1lTG9hZGluZyA9IGZhbHNlOwoJCQllbnlvLmxvYWRlci5wYWNrYWdlRm9sZGVyID0gIiI7CgkJfQoJfQp9KSgpOwoKLy8gcHJlZGVmaW5lZCBwYXRoIGFsaWFzZXMKZW55by5wYXRoLmFkZFBhdGhzKHsKCWVueW86IGVueW8uYXJncy5yb290LAoJbGliOiAiJGVueW8vLi4vbGliIgp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/boot/enyo.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uKCkgewoJLy8gZW55byBjYW4gdXNlIGluZm9ybWF0aW9uIGZyb20gdGhlIHNjcmlwdCB0YWcgdGhhdCBsb2FkcyB0aGlzIGJvb3RzdHJhcCBmaWxlCgl2YXIgdGhpc1NjcmlwdCA9ICJlbnlvLmpzIjsKCgkvKiBnbG9iYWwgZW55bzp0cnVlICovCgllbnlvID0gd2luZG93LmVueW8gfHwge307CgoJZW55by5sb2NhdGVTY3JpcHQgPSBmdW5jdGlvbihpbk5hbWUpIHsKCQl2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTsKCQlmb3IgKHZhciBpPXNjcmlwdHMubGVuZ3RoLTEsIHMsIHNyYywgbD1pbk5hbWUubGVuZ3RoOyAoaT49MCkgJiYgKHM9c2NyaXB0c1tpXSk7IGktLSkgewoJCQlpZiAoIXMubG9jYXRlZCkgewoJCQkJc3JjID0gcy5nZXRBdHRyaWJ1dGUoInNyYyIpIHx8ICIiOwoJCQkJaWYgKHNyYy5zbGljZSgtbCkgPT0gaW5OYW1lKSB7CgkJCQkJcy5sb2NhdGVkID0gdHJ1ZTsKCQkJCQlyZXR1cm4ge3BhdGg6IHNyYy5zbGljZSgwLCBNYXRoLm1heCgwLCBzcmMubGFzdEluZGV4T2YoIi8iKSkpLCBub2RlOiBzfTsKCQkJCX0KCQkJfQoJCX0KCX07CgoJZW55by5hcmdzID0gZW55by5hcmdzIHx8IHt9OwoKCXZhciB0YWcgPSBlbnlvLmxvY2F0ZVNjcmlwdCh0aGlzU2NyaXB0KTsKCWlmICh0YWcpIHsKCQkvLyBpbmZlciB0aGUgZnJhbWV3b3JrIHBhdGggZnJvbSB0aGUgZG9jdW1lbnQsIHVubGVzcyB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIG9uZSBleHBsaWNpdGx5CgkJZW55by5hcmdzLnJvb3QgPSAoZW55by5hcmdzLnJvb3QgfHwgdGFnLnBhdGgpLnJlcGxhY2UoIi9zb3VyY2UiLCAiIik7CgkJLy8gYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIGJvb3RzdHJhcCBzY3JpcHQgdGFnIGJlY29tZSBlbnlvLmFyZ3MKCQlmb3IgKHZhciBpPTAsIGFsID0gdGFnLm5vZGUuYXR0cmlidXRlcy5sZW5ndGgsIGl0OyAoaSA8IGFsKSAmJiAoaXQgPSB0YWcubm9kZS5hdHRyaWJ1dGVzLml0ZW0oaSkpOyBpKyspIHsKCQkJZW55by5hcmdzW2l0Lm5vZGVOYW1lXSA9IGl0LnZhbHVlOwoJCX0KCX0KfSkoKTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/boot/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJImVueW8uanMiLAoJInJlYWR5LmpzIiwKCSIuLi8uLi9sb2FkZXIuanMiLAoJImJvb3QuanMiCik7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/boot/ready.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChzY29wZSkgewoKCS8vIHdlIG5lZWQgdG8gcmVnaXN0ZXIgYXBwcm9wcmlhdGVseSB0byBrbm93IHdoZW4KCS8vIHRoZSBkb2N1bWVudCBpcyBvZmZpY2lhbGx5IHJlYWR5LCB0byBlbnN1cmUgdGhhdAoJLy8gY2xpZW50IGNvZGUgaXMgb25seSBnb2luZyB0byBleGVjdXRlIGF0IHRoZQoJLy8gYXBwcm9wcmlhdGUgdGltZQoKCXZhciBkb2MgPSBzY29wZS5kb2N1bWVudDsKCXZhciBxdWV1ZSA9IFtdOwoJdmFyIHJlYWR5ID0gKCJjb21wbGV0ZSIgPT09IGRvYy5yZWFkeVN0YXRlKTsKCXZhciBydW47Cgl2YXIgaW5pdDsKCXZhciByZW1vdmU7Cgl2YXIgYWRkOwoJdmFyIGZsdXNoOwoKCWVueW8ucmVhZHkgPSBmdW5jdGlvbiAoZm4sIGNvbnRleHQpIHsKCQlpZiAocmVhZHkpIHsKCQkJcnVuKGZuLCBjb250ZXh0KTsKCQl9CgkJZWxzZSB7CgkJCXF1ZXVlLnB1c2goW2ZuLCBjb250ZXh0XSk7CgkJfQoJfTsKCglydW4gPSBmdW5jdGlvbiAoZm4sIGNvbnRleHQpIHsKCQlmbi5jYWxsKGNvbnRleHQgfHwgZW55by5nbG9iYWwpOwoJfTsKCglpbml0ID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJLy8gaWYgd2UncmUgaW50ZXJhY3RpdmUsIGl0IHNob3VsZCBiZSBzYWZlIHRvIG1vdmUKCQkvLyBmb3J3YXJkIGJlY2F1c2UgdGhlIGNvbnRlbnQgaGFzIGJlZW4gcGFyc2VkCgkJaWYgKChyZWFkeSA9ICgiaW50ZXJhY3RpdmUiID09PSBkb2MucmVhZHlTdGF0ZSkpKSB7CgkJCWlmICghfmVueW8uaW5kZXhPZihldmVudC50eXBlLCBbIkRPTUNvbnRlbnRMb2FkZWQiLCAicmVhZHlzdGF0ZWNoYW5nZSJdKSkgewoJCQkJcmVtb3ZlKGV2ZW50LnR5cGUsIGluaXQpOwoJCQkJZmx1c2goKTsKCQkJfQoJCX0KCQkvLyBmb3IgYW4gSUU4IGZhbGxiYWNrIGFuZCBsZWdhY3kgV2ViS2l0IChpbmNsdWRpbmcgd2ViT1MgMy54IGFuZCBsZXNzKSBhbmQgYXNzdXJhbmNlCgkJaWYgKChyZWFkeSA9ICgiY29tcGxldGUiID09PSBkb2MucmVhZHlTdGF0ZSB8fCAibG9hZGVkIiA9PT0gZG9jLnJlYWR5U3RhdGUpKSkgewoJCQlyZW1vdmUoZXZlbnQudHlwZSwgaW5pdCk7CgkJCWZsdXNoKCk7CgkJfQoJfTsKCglhZGQgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CgkJdmFyIG5hbWUgPSBkb2MuYWRkRXZlbnRMaXN0ZW5lcj8gImFkZEV2ZW50TGlzdGVuZXIiOiAiYXR0YWNoRXZlbnQiOwoJCXZhciBvbiA9IG5hbWUgPT09ICJhdHRhY2hFdmVudCI/ICJvbiI6ICIiOwoJCWRvY1tuYW1lXShvbiArIGV2ZW50LCBmbiwgZmFsc2UpOwoJfTsKCglyZW1vdmUgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CgkJdmFyIG5hbWUgPSBkb2MuYWRkRXZlbnRMaXN0ZW5lcj8gInJlbW92ZUV2ZW50TGlzdGVuZXIiOiAiZGV0YWNoRXZlbnQiOwoJCXZhciBvbiA9IG5hbWUgPT09ICJkZXRhY2hFdmVudCI/ICJvbiI6ICIiOwoJCWRvY1tuYW1lXShvbiArIGV2ZW50LCBmbiwgZmFsc2UpOwoJfTsKCglmbHVzaCA9IGZ1bmN0aW9uICgpIHsKCQlpZiAocmVhZHkgJiYgcXVldWUubGVuZ3RoKSB7CgkJCXdoaWxlIChxdWV1ZS5sZW5ndGgpIHsKCQkJCXJ1bi5hcHBseShzY29wZSwgcXVldWUuc2hpZnQoKSk7CgkJCX0KCQl9Cgl9OwoKCS8vIG9rLCBsZXQncyBob29rIHRoaXMgdXAKCWFkZCgiRE9NQ29udGVudExvYWRlZCIsIGluaXQpOwoJYWRkKCJyZWFkeXN0YXRlY2hhbmdlIiwgaW5pdCk7Cgp9KSh3aW5kb3csIGVueW8pOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/Control.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5Db250cm9sXyBpcyBhIGNvbXBvbmVudCB0aGF0IGNvbnRyb2xzIGEgRE9NIG5vZGUgKGkuZS4sIGFuIGVsZW1lbnQgaW4KCXRoZSB1c2VyIGludGVyZmFjZSkuIENvbnRyb2xzIGFyZSBnZW5lcmFsbHkgdmlzaWJsZSBhbmQgdGhlIHVzZXIgb2Z0ZW4KCWludGVyYWN0cyB3aXRoIHRoZW0gZGlyZWN0bHkuIFdoaWxlIHRoaW5ncyBsaWtlIGJ1dHRvbnMgYW5kIGlucHV0IGJveGVzIGFyZQoJb2J2aW91c2x5IGNvbnRyb2xzLCBpbiBFbnlvLCBhIGNvbnRyb2wgbWF5IGJlY29tZSBhcyBjb21wbGV4IGFzIGFuIGVudGlyZQoJYXBwbGljYXRpb24uCgoJSWYgeW91IG1ha2UgY2hhbmdlcyB0byBfZW55by5Db250cm9sXywgYmUgc3VyZSB0byBhZGQgb3IgdXBkYXRlIHRoZSBhcHByb3ByaWF0ZQoJW3VuaXQgdGVzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvanMvZW55by90cmVlL21hc3Rlci90b29scy90ZXN0L2NvcmUvdGVzdHMpLgoKCUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb24KCTxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvanMvZW55by93aWtpL0NyZWF0aW5nLUNvbnRyb2xzIj5Db250cm9sczwvYT4KCWluIHRoZSBFbnlvIERldmVsb3BlciBHdWlkZS4KKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLkNvbnRyb2wiLAoJa2luZDogImVueW8uVWlDb21wb25lbnQiLAoJcHVibGlzaGVkOiB7CgkJLyoqCgkJCUhUTUwgdGFnIG5hbWUgdG8gdXNlIGZvciB0aGUgY29udHJvbC4gSWYgbnVsbCwgbm8gdGFnIGlzIGdlbmVyYXRlZDsKCQkJb25seSB0aGUgY29udGVudHMgYXJlIHVzZWQuCgkJKi8KCQl0YWc6ICJkaXYiLAoJCS8vKiBIYXNoIG9mIERPTSBhdHRyaWJ1dGVzIHRvIGFwcGx5IHRvIHRoZSBnZW5lcmF0ZWQgSFRNTCB0YWcKCQlhdHRyaWJ1dGVzOiBudWxsLAoJCS8vKiBTcGFjZS1kZWxpbWl0ZWQgc2V0IG9mIENTUyBjbGFzc2VzIHRvIGFwcGx5IHRvIHRoZSBnZW5lcmF0ZWQgSFRNTCB0YWcKCQljbGFzc2VzOiAiIiwKCQkvLyogU3R5bGUgYXR0cmlidXRlIHRvIGFwcGx5IHRvIHRoZSBnZW5lcmF0ZWQgSFRNTCB0YWcKCQlzdHlsZTogIiIsCgkJLyoqCgkJCUNvbnRlbnQgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBpbnNpZGUgdGhlIEhUTUwgdGFnOyBkZWZhdWx0cyB0bwoJCQlwbGFpbiB0ZXh0IHVubGVzcyBfYWxsb3dIdG1sXyBpcyB0cnVlCgkJKi8KCQljb250ZW50OiAiIiwKCQkvLyogQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhZyB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGRvY3VtZW50CgkJc2hvd2luZzogdHJ1ZSwKCQkvLyogSWYgZmFsc2UsIEhUTUwgY29kZXMgaW4gX2NvbnRlbnRfIGFyZSBlc2NhcGVkIGJlZm9yZSByZW5kZXJpbmcKCQlhbGxvd0h0bWw6IGZhbHNlLAoJCS8vCgkJLy8gY29udmVuaWVuY2UgcHJvcGVydGllcyBmb3IgY29tbW9uIGF0dHJpYnV0ZXMKCQkvLwoJCS8vKiBTaG9ydGN1dCBmb3Igc2V0dGluZyBfc3JjXyBhdHRyaWJ1dGUgaW4gX2F0dHJpYnV0ZXNfIGhhc2guIE92ZXJyaWRlcyB0aGF0IHZhbHVlLgoJCXNyYzogIiIsCgkJLy8KCQkvLyBlc290ZXJpYwoJCS8vCgkJLyoqCgkJCVNldCB0byBmYWxzZSBpZiB0aGUgY29udHJvbCBzaG91bGQgbm90IGdlbmVyYXRlIGFueSBIVE1MLiBVc2VkIHRvCgkJCWluaGliaXQgZ2VuZXJhdGlvbiBvZiBwb3B1cHMgdW50aWwgdGhleSdyZSBzaG93biBhdCBydW50aW1lLgoJCSovCgkJY2FuR2VuZXJhdGU6IHRydWUsCgkJLy8KCQkvLyBhZCBob2MgcHJvcGVydGllczoKCQkvLwoJCS8qKgoJCQlGbGFnIHVzZWQgYnkgY29udHJvbCBsYXlvdXRzIHRvIGRldGVybWluZSB3aGljaCBjb250cm9sIHdpbGwgZXhwYW5kCgkJCXRvIGZpbGwgdGhlIGF2YWlsYWJsZSBzcGFjZS4gVGhpcyBvbmx5IGhhcyBtZWFuaW5nIHdoZW4gdGhlIGNvbnRyb2wKCQkJaXMgYmVpbmcgdXNlZCBhcyBhIGNoaWxkIG9mIGEgY29udHJvbCB3aXRoIGEgdmVyc2lvbiBvZiBGaXR0YWJsZUxheW91dAoJCQlhcyBpdHMgbGF5b3V0S2luZC4KCgkJCVRPRE86IFdlIHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byB0ZXN0IGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBmaXQKCQkJcHJvcGVydHkgd2l0aG91dCBzZXR0aW5nIGEgZGVmYXVsdCAob2YgbnVsbCkgc2luY2UgaXQgaXMgYSBib29sZWFuCgkJCWZsYWcuIFRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4LgoJCSovCgkJZml0OiBudWxsLAoJCS8vKiBVc2VkIGJ5IEFyZXMgZGVzaWduIGVkaXRvciBmb3IgZGVzaWduIG9iamVjdHMKCQlpc0NvbnRhaW5lcjogZmFsc2UsCgkJbW9kZWw6IG51bGwKCX0sCgloYW5kbGVyczogewoJCS8vKiBDb250cm9scyB3aWxsIGNhbGwgYSB1c2VyLXByb3ZpZGVkIF90YXBfIG1ldGhvZCB3aGVuIHRhcHBlZCB1cG9uLgoJCW9udGFwOiAidGFwIgoJfSwKCW1peGluczogWyJlbnlvLkNvbnRyb2xsZXJTdXBwb3J0Il0sCgkvLypAcHJvdGVjdGVkCglfaXNWaWV3OiB0cnVlLAoJbm9EZWZlcjogdHJ1ZSwKCS8vKiBUaGUgZGVmYXVsdCBraW5kIGZvciBjb250cm9scyBjcmVhdGVkIGluc2lkZSB0aGlzIGNvbnRyb2wgdGhhdCBkb24ndAoJLy8qIHNwZWNpZnkgdGhlaXIgb3duIGtpbmQKCWRlZmF1bHRLaW5kOiAiQ29udHJvbCIsCgkvLyogQSBzZXQgb2YgQ1NTIGNsYXNzZXMgdGhhdCBhcmUgYXBwbGllZCB0byBjb250cm9scyBjcmVhdGVkIGluc2lkZSB0aGlzIGNvbnRyb2wKCWNvbnRyb2xDbGFzc2VzOiAiIiwKCS8vKiBAcHJvdGVjdGVkCglub2RlOiBudWxsLAoJZ2VuZXJhdGVkOiBmYWxzZSwKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJLy8gaW5pdGlhbGl6ZSBzdHlsZSBkYXRhYmFzZXMKCQl0aGlzLmluaXRTdHlsZXMoKTsKCQkvLyBzdXBlcmtpbmQgaW5pdGlhbGl6YXRpb24KCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCS8vICdzaG93aW5nJyBpcyB0ZXJ0aWFyeSBtZXRob2QgZm9yIG1vZGlmeWluZyBkaXNwbGF5IHN0eWxlCgkJLy8gc2V0dGluZyAnZGlzcGxheTogbm9uZTsnIHN0eWxlIGF0IGluaXRpYWxpemF0aW9uIHRpbWUgd2lsbAoJCS8vIG5vdCB3b3JrIGlmICdzaG93aW5nJyBpcyB0cnVlLgoJCXRoaXMuc2hvd2luZ0NoYW5nZWQoKTsKCQkvLyBOb3RlczoKCQkvLyAtICdjbGFzc2VzJyBkb2VzIG5vdCByZWZsZWN0IHRoZSBjb21wbGV0ZSBzZXQgb2YgY2xhc3NlcyBvbiBhbiBvYmplY3Q7IHRoZSBjb21wbGV0ZSBzZXQgaXMgaW4KCQkvLyAgIHRoaXMuYXR0cmlidXRlcy5jbGFzcy4gVGhlICcqQ2xhc3MnIGFwaXMgYWZmZWN0IHRoaXMuYXR0cmlidXRlcy5jbGFzcy4KCQkvLyAtIHVzZSBhZGRDbGFzcyBpbnN0ZWFkIG9mIHNldENsYXNzZXMgaGVyZSwgYnkgY29udmVudGlvbiAnY2xhc3NlcycgaXMgcmVzZXJ2ZWQgZm9yIGluc3RhbmNlIG9iamVjdHMKCQkvLyAtIGluaGVyaXRvcnMgc2hvdWxkICdhZGRDbGFzcycgdG8gYWRkIGNsYXNzZXMKCQkvLyAtIHNldENsYXNzZXMgcmVtb3ZlcyB0aGUgb2xkIGNsYXNzZXMgYW5kIGFkZHMgdGhlIG5ldyBvbmUsIHNldENsYXNzQXR0cmlidXRlIHJlcGxhY2VzIGFsbCBjbGFzc2VzCgkJdGhpcy5hZGRDbGFzcyh0aGlzLmtpbmRDbGFzc2VzKTsKCQl0aGlzLmFkZENsYXNzKHRoaXMuY2xhc3Nlcyk7CgkJdGhpcy5pbml0UHJvcHMoWyJpZCIsICJjb250ZW50IiwgInNyYyIsICJtb2RlbCJdKTsKCX0sCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLnJlbW92ZU5vZGVGcm9tRG9tKCk7CgkJZW55by5Db250cm9sLnVucmVnaXN0ZXJEb21FdmVudHModGhpcy5pZCk7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCglpbXBvcnRQcm9wczogZnVuY3Rpb24oaW5Qcm9wcykgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJLy8gZWFjaCBpbnN0YW5jZSBoYXMgaXRzIG93biBhdHRyaWJ1dGVzIGFycmF5LCB0aGUgdW5pb24gb2YgdGhlIHByb3RvdHlwZSBhdHRyaWJ1dGVzIGFuZCB1c2VyLXNwZWNpZmllZCBhdHRyaWJ1dGVzCgkJdGhpcy5hdHRyaWJ1dGVzID0gZW55by5taXhpbihlbnlvLmNsb25lKHRoaXMua2luZEF0dHJpYnV0ZXMpLCB0aGlzLmF0dHJpYnV0ZXMpOwoJfSwKCWluaXRQcm9wczogZnVuY3Rpb24oaW5Qcm9wTmFtZXMpIHsKCQkvLyBmb3IgZWFjaCBuYW1lZCBwcm9wZXJ0eSwgdHJpZ2dlciB0aGUgKkNoYW5nZWQgaGFuZGxlciBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdHJ1dGh5CgkJZm9yICh2YXIgaT0wLCBuLCBjZjsgKG49aW5Qcm9wTmFtZXNbaV0pOyBpKyspIHsKCQkJaWYgKHRoaXNbbl0pIHsKCQkJCS8vIEZJWE1FOiBhd2t3YXJkCgkJCQljZiA9IG4gKyAiQ2hhbmdlZCI7CgkJCQlpZiAodGhpc1tjZl0pIHsKCQkJCQl0aGlzW2NmXSgpOwoJCQkJfQoJCQl9CgkJfQoJfSwKCS8vKkBwcm90ZWN0ZWQKCWRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uIChpbkV2ZW50TmFtZSwgaW5FdmVudCwgaW5TZW5kZXIpIHsKCQkvLyBwcmV2ZW50IGRpc3BhdGNoIGFuZCBidWJibGUgb2YgZXZlbnRzIHRoYXQgYXJlIHN0cmljdGx5IGludGVybmFsIChlLmcuIGVudGVyL2xlYXZlKQoJCWlmICh0aGlzLnN0cmljdGx5SW50ZXJuYWxFdmVudHNbaW5FdmVudE5hbWVdICYmIHRoaXMuaXNJbnRlcm5hbEV2ZW50KGluRXZlbnQpKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJcmV0dXJuIHRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJY2xhc3Nlc0NoYW5nZWQ6IGZ1bmN0aW9uKGluT2xkKSB7CgkJdGhpcy5yZW1vdmVDbGFzcyhpbk9sZCk7CgkJdGhpcy5hZGRDbGFzcyh0aGlzLmNsYXNzZXMpOwoJfSwKCW1vZGVsQ2hhbmdlZDogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLm1vZGVsICYmIGVueW8uaXNNb2RlbCh0aGlzLm1vZGVsKSkgewoJCQkvLyBpZiBiaW5kaW5ncyBoYXZlbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0IHRoZW4gdGhpcwoJCQkvLyB3b3VsZCBiZSB1bm5lY2Vzc2FyeQoJCQlpZiAodGhpcy5fZGlkU2V0dXBCaW5kaW5ncykgewoJCQkJdGhpcy5yZWJ1aWxkQmluZGluZ3MoKTsKCQkJfQoJCX0KCX0sCgkvLyBtb2RpZnkgY29tcG9uZW50cyB3ZSBjcmVhdGUgb3Vyc2VsdmVzCgkvKgoJYWRqdXN0Q29tcG9uZW50UHJvcHM6IGZ1bmN0aW9uKGluUHJvcHMpIHsKCQlpZiAodGhpcy5jb250cm9sQ2xhc3NlcykgewoJCQlpblByb3BzLmNsYXNzZXMgPSAoaW5Qcm9wcy5jbGFzc2VzID8gaW5Qcm9wcy5jbGFzc2VzICsgIiAiIDogIiIpICsgdGhpcy5jb250cm9sQ2xhc3NlczsKCQl9CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCgkqLwoJYWRkQ2hpbGQ6IGZ1bmN0aW9uKGluQ29udHJvbCkgewoJCWluQ29udHJvbC5hZGRDbGFzcyh0aGlzLmNvbnRyb2xDbGFzc2VzKTsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCXJlbW92ZUNoaWxkOiBmdW5jdGlvbihpbkNvbnRyb2wpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCWluQ29udHJvbC5yZW1vdmVDbGFzcyh0aGlzLmNvbnRyb2xDbGFzc2VzKTsKCX0sCgkvLyBldmVudCBmaWx0ZXIKCXN0cmljdGx5SW50ZXJuYWxFdmVudHM6IHtvbmVudGVyOiAxLCBvbmxlYXZlOiAxfSwKCWlzSW50ZXJuYWxFdmVudDogZnVuY3Rpb24oaW5FdmVudCkgewoJCXZhciByZHQgPSBlbnlvLmRpc3BhdGNoZXIuZmluZERpc3BhdGNoVGFyZ2V0KGluRXZlbnQucmVsYXRlZFRhcmdldCk7CgkJcmV0dXJuIHJkdCAmJiByZHQuaXNEZXNjZW5kYW50T2YodGhpcyk7Cgl9LAoJLy8KCS8vKiBAcHVibGljCgkvKioKCQlSZXR1cm5zIHRoZSBET00gbm9kZSByZXByZXNlbnRpbmcgdGhlIGNvbnRyb2wuCgkJSWYgdGhlIGNvbnRyb2wgaXMgbm90IGN1cnJlbnRseSByZW5kZXJlZCwgcmV0dXJucyBudWxsLgoKCQlJZiBoYXNOb2RlKCkgcmV0dXJucyBhIHZhbHVlLCB0aGUgX25vZGVfIHByb3BlcnR5IHdpbGwgYmUgdmFsaWQgYW5kCgkJY2FuIGJlIGNoZWNrZWQgZGlyZWN0bHkuCgoJCU9uY2UgaGFzTm9kZSgpIGlzIGNhbGxlZCwgdGhlIHJldHVybmVkIHZhbHVlIGlzIG1hZGUgYXZhaWxhYmxlIGluCgkJdGhlIF9ub2RlXyBwcm9wZXJ0eSBvZiB0aGlzIGNvbnRyb2wuCgoJCUEgY29udHJvbCB3aWxsIG9ubHkgcmV0dXJuIGEgbm9kZSBpZiBpdCBoYXMgYmVlbiByZW5kZXJlZC4KCgkJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQkJZW55by5sb2codGhpcy5ub2RlLm5vZGVUeXBlKTsKCQkJfQoJKi8KCWhhc05vZGU6IGZ1bmN0aW9uKCkgewoJCS8vICdnZW5lcmF0ZWQnIGlzIHVzZWQgdG8gZ2F0ZSBhY2Nlc3MgdG8gZXhwZW5zaXZlIGZpbmROb2RlQnlJZCBjYWxsCgkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVkICYmICh0aGlzLm5vZGUgfHwgdGhpcy5maW5kTm9kZUJ5SWQoKSk7Cgl9LAoJLyoqCgkJQXBwZW5kcyB0aGUgc3RyaW5nIHZhbHVlIG9mIF9pbkFkZGVuZHVtXyB0byB0aGUgX2NvbnRlbnRfIG9mIHRoaXMKCQljb250cm9sLgoJKi8KCWFkZENvbnRlbnQ6IGZ1bmN0aW9uKGluQWRkZW5kdW0pIHsKCQl0aGlzLnNldENvbnRlbnQodGhpcy5nZXQoImNvbnRlbnQiKSArIGluQWRkZW5kdW0pOwoJfSwKCS8qKgoJCUdldHMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBvbiB0aGlzIG9iamVjdC4KCgkJSWYgdGhpcyBjb250cm9sIGhhcyBhIG5vZGUsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgcmV0cmlldmVkIGZyb20gdGhlCgkJbm9kZTsgb3RoZXJ3aXNlLCBpdCdzIHJlYWQgZnJvbSB0aGUgX2F0dHJpYnV0ZXNfIHByb3BlcnR5IG9mIHRoZSBjb250cm9sCgkJaXRzZWxmLgoKCQlDYXZlYXQ6IElmIHRoZSBjb250cm9sIGlzIHJlbmRlcmVkLCB0aGUgX2F0dHJpYnV0ZXNfIHByb3BlcnR5IGlzIHVzZWQgdG8KCQljb25zdHJ1Y3QgdGhlIHJlbmRlcmluZywgYW5kIHZhbHVlcyB0aGF0IGhhdmUgY2hhbmdlZCBvbiB0aGUgbm9kZSBpdHNlbGYKCQlhcmUgbG9zdC4KCgkJCS8vIEdldCB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciB0aGlzIERvbU5vZGUKCQkJdmFyIHZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoInRhYkluZGV4Iik7CgkqLwoJZ2V0QXR0cmlidXRlOiBmdW5jdGlvbihpbk5hbWUpIHsKCQlyZXR1cm4gdGhpcy5oYXNOb2RlKCkgPyB0aGlzLm5vZGUuZ2V0QXR0cmlidXRlKGluTmFtZSkgOiB0aGlzLmF0dHJpYnV0ZXNbaW5OYW1lXTsKCX0sCgkvKioKCQlTZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgb24gdGhpcyBvYmplY3QuIFBhc3MgbnVsbCBfaW5WYWx1ZV8gdG8KCQlyZW1vdmUgYW4gYXR0cmlidXRlLgoKCQkJLy8gc2V0IHRoZSB0YWJJbmRleCBhdHRyaWJ1dGUgZm9yIHRoaXMgRG9tTm9kZQoJCQl0aGlzLnNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLCAzKTsKCQkJLi4uCgkJCS8vIHJlbW92ZSB0aGUgaW5kZXggYXR0cmlidXRlCgkJCXRoaXMuc2V0QXR0cmlidXRlKCJpbmRleCIsIG51bGwpOwoJKi8KCXNldEF0dHJpYnV0ZTogZnVuY3Rpb24oaW5OYW1lLCBpblZhbHVlKSB7CgkJdGhpcy5hdHRyaWJ1dGVzW2luTmFtZV0gPSBpblZhbHVlOwoJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQl0aGlzLmF0dHJpYnV0ZVRvTm9kZShpbk5hbWUsIGluVmFsdWUpOwoJCX0KCQl0aGlzLmludmFsaWRhdGVUYWdzKCk7Cgl9LAoJLyoqCgkJR2V0cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBuYW1lZCBfaW5OYW1lXyBkaXJlY3RseSBmcm9tIHRoZSBET00gbm9kZS4KCQlBIGNhbGxlci1zcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSwgX2luRGVmYXVsdF8sIGlzIHJldHVybmVkIHdoZW4gdGhlIERPTQoJCW5vZGUgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgoJKi8KCWdldE5vZGVQcm9wZXJ0eTogZnVuY3Rpb24oaW5OYW1lLCBpbkRlZmF1bHQpIHsKCQlpZiAodGhpcy5oYXNOb2RlKCkpIHsKCQkJcmV0dXJuIHRoaXMubm9kZVtpbk5hbWVdOwoJCX0gZWxzZSB7CgkJCXJldHVybiBpbkRlZmF1bHQ7CgkJfQoJfSwKCS8qKgoJCVNldHMgdGhlIHZhbHVlIG9mIHRoZSBfaW5OYW1lXyBwcm9wZXJ0eSBvbiB0aGUgY29udHJvbCdzIERPTSBub2RlIHRvCgkJX2luVmFsdWVfLCBpZiBhbmQgb25seSBpZiB0aGUgRE9NIG5vZGUgaGFzIGJlZW4gcmVuZGVyZWQuICBUaGlzIG1ldGhvZAoJCWRvZXMgbm90IGFsdGVyIGFueSB2YWx1ZXMgY2FjaGVkIGluIGxvY2FsIHByb3BlcnRpZXMgb2YgdGhlCgkJX2VueW8uQ29udHJvbF8gaW5zdGFuY2UuCgkqLwoJc2V0Tm9kZVByb3BlcnR5OiBmdW5jdGlvbihpbk5hbWUsIGluVmFsdWUpIHsKCQlpZiAodGhpcy5oYXNOb2RlKCkpIHsKCQkJdGhpcy5ub2RlW2luTmFtZV0gPSBpblZhbHVlOwoJCX0KCX0sCgkvKioKCQlDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3Igc2V0dGluZyB0aGUgX2NsYXNzXyBhdHRyaWJ1dGUuCgkJVGhlIF9jbGFzc18gYXR0cmlidXRlIHJlcHJlc2VudHMgdGhlIENTUyBjbGFzc2VzIGFzc2lnbmVkIHRvIHRoaXMgb2JqZWN0OwoJCWl0IGlzIGEgc3RyaW5nIHRoYXQgY2FuIGNvbnRhaW4gbXVsdGlwbGUgQ1NTIGNsYXNzZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KCgkJCXRoaXMuJC5jb250cm9sLnNldENsYXNzQXR0cmlidXRlKCJib3ggYmx1ZS1ib3JkZXIgaGlnaGxpZ2h0ZWQiKTsKCSovCglzZXRDbGFzc0F0dHJpYnV0ZTogZnVuY3Rpb24oaW5DbGFzcykgewoJCXRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsIGluQ2xhc3MpOwoJfSwKCS8qKgoJCUNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBfY2xhc3NfIGF0dHJpYnV0ZS4KCQlUaGUgX2NsYXNzXyBhdHRyaWJ1dGUgcmVwcmVzZW50cyB0aGUgQ1NTIGNsYXNzZXMgYXNzaWduZWQgdG8gdGhpcyBvYmplY3Q7CgkJaXQgaXMgYSBzdHJpbmcgdGhhdCBjYW4gY29udGFpbiBtdWx0aXBsZSBDU1MgY2xhc3NlcyBzZXBhcmF0ZWQgYnkgc3BhY2VzLgoKCQkJdmFyIGNzc0NsYXNzZXMgPSB0aGlzLiQuY29udHJvbC5nZXRDbGFzc0F0dHJpYnV0ZSgpOwoJKi8KCWdldENsYXNzQXR0cmlidXRlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzWyJjbGFzcyJdIHx8ICIiOwoJfSwKCS8qKgoJCVJldHVybnMgdHJ1ZSBpZiB0aGUgX2NsYXNzXyBhdHRyaWJ1dGUgY29udGFpbnMgYSBzdWJzdHJpbmcgbWF0Y2hpbmcKCQlfaW5DbGFzc18uCgoJCVRoZSBfY2xhc3NfIGF0dHJpYnV0ZSBpcyBhIHN0cmluZyB0aGF0IGNhbiBjb250YWluIG11bHRpcGxlIENTUyBjbGFzc2VzLgoJCVRoaXMgbWV0aG9kIHRlc3RzIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHNldCBvZgoJCWNsYXNzZXMgb24gdGhpcyBjb250cm9sLgoKCQkJLy8gcmV0dXJucyB0cnVlIGlmIF9jbGFzc18gaXMgImJhciBmb28gYmF6IiwgYnV0IGZhbHNlIGZvciAiYmFyZm9vYmF6IgoJCQl2YXIgaGFzRm9vQ2xhc3MgPSB0aGlzLiQuY29udHJvbC5oYXNDbGFzcygiZm9vIik7CgkqLwoJaGFzQ2xhc3M6IGZ1bmN0aW9uKGluQ2xhc3MpIHsKCQlyZXR1cm4gaW5DbGFzcyAmJiAoKCIgIiArIHRoaXMuZ2V0Q2xhc3NBdHRyaWJ1dGUoKSArICIgIikuaW5kZXhPZigiICIgKyBpbkNsYXNzICsgIiAiKSA+PSAwKTsKCX0sCgkvKioKCQlBZGRzIENTUyBjbGFzcyBuYW1lIF9pbkNsYXNzXyB0byB0aGUgX2NsYXNzXyBhdHRyaWJ1dGUgb2YgdGhpcyBvYmplY3QuCgoJCQkvLyBhZGQgdGhlIGhpZ2hsaWdodCBjbGFzcyB0byB0aGlzIG9iamVjdAoJCQl0aGlzLmFkZENsYXNzKCJoaWdobGlnaHQiKTsKCSovCglhZGRDbGFzczogZnVuY3Rpb24oaW5DbGFzcykgewoJCWlmIChpbkNsYXNzICYmICF0aGlzLmhhc0NsYXNzKGluQ2xhc3MpKSB7CgkJCXZhciBjID0gdGhpcy5nZXRDbGFzc0F0dHJpYnV0ZSgpOwoJCQl0aGlzLnNldENsYXNzQXR0cmlidXRlKGMgKyAoYyA/ICIgIiA6ICIiKSArIGluQ2xhc3MpOwoJCX0KCX0sCgkvKioKCQlSZW1vdmVzIHN1YnN0cmluZyBfaW5DbGFzc18gZnJvbSB0aGUgX2NsYXNzXyBhdHRyaWJ1dGUgb2YgdGhpcyBvYmplY3QuCgoJCV9pbkNsYXNzXyBtdXN0IGhhdmUgbm8gbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuCgoJCVVzaW5nIGEgY29tcG91bmQgY2xhc3MgbmFtZSBpcyBzdXBwb3J0ZWQsIGJ1dCB0aGUgbmFtZSBpcyB0cmVhdGVkCgkJYXRvbWljYWxseS4gRm9yIGV4YW1wbGUsIGdpdmVuIF8iYSBiIGMiXywgX3JlbW92ZUNsYXNzKCJhIGIiKV8gd2lsbAoJCXByb2R1Y2UgXyJjIl8sIGJ1dCBfcmVtb3ZlQ2xhc3MoImEgYyIpXyB3aWxsIHByb2R1Y2UgXyJhIGIgYyJfLgoKCQkJLy8gcmVtb3ZlIHRoZSBoaWdobGlnaHQgY2xhc3MgZnJvbSB0aGlzIG9iamVjdAoJCQl0aGlzLnJlbW92ZUNsYXNzKCJoaWdobGlnaHQiKTsKCSovCglyZW1vdmVDbGFzczogZnVuY3Rpb24oaW5DbGFzcykgewoJCWlmIChpbkNsYXNzICYmIHRoaXMuaGFzQ2xhc3MoaW5DbGFzcykpIHsKCQkJdmFyIGMgPSB0aGlzLmdldENsYXNzQXR0cmlidXRlKCk7CgkJCWMgPSAoIiAiICsgYyArICIgIikucmVwbGFjZSgiICIgKyBpbkNsYXNzICsgIiAiLCAiICIpLnNsaWNlKDEsIC0xKTsKCQkJdGhpcy5zZXRDbGFzc0F0dHJpYnV0ZShjKTsKCQl9Cgl9LAoJLyoqCgkJQWRkcyBvciByZW1vdmVzIHN1YnN0cmluZyBfaW5DbGFzc18gZnJvbSB0aGUgX2NsYXNzXyBhdHRyaWJ1dGUgb2YgdGhpcwoJCW9iamVjdCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgX2luVHJ1ZVRvQWRkXy4KCgkJSWYgX2luVHJ1ZVRvQWRkXyBpcyB0cnV0aHksIHRoZW4gX2luQ2xhc3NfIGlzIGFkZGVkOyBvdGhlcndpc2UsCgkJX2luQ2xhc3NfIGlzIHJlbW92ZWQuCgoJCQkvLyBhZGQgb3IgcmVtb3ZlIHRoZSBoaWdobGlnaHQgY2xhc3MsIGRlcGVuZGluZyBvbiB0aGUgImhpZ2hsaWdodGVkIiBwcm9wZXJ0eQoJCQl0aGlzLmFkZFJlbW92ZUNsYXNzKCJoaWdobGlnaHQiLCB0aGlzLmhpZ2hsaWdodGVkKTsKCSovCglhZGRSZW1vdmVDbGFzczogZnVuY3Rpb24oaW5DbGFzcywgaW5UcnVlVG9BZGQpIHsKCQl0aGlzW2luVHJ1ZVRvQWRkID8gImFkZENsYXNzIiA6ICJyZW1vdmVDbGFzcyJdKGluQ2xhc3MpOwoJfSwKCS8vCgkvLyBzdHlsZXMKCS8vCgkvLyogQHByb3RlY3RlZAoJaW5pdFN0eWxlczogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb21TdHlsZXMgPSB0aGlzLmRvbVN0eWxlcyB8fCB7fTsKCQllbnlvLkNvbnRyb2wuY3NzVGV4dFRvRG9tU3R5bGVzKHRoaXMua2luZFN0eWxlLCB0aGlzLmRvbVN0eWxlcyk7CgkJdGhpcy5kb21Dc3NUZXh0ID0gZW55by5Db250cm9sLmRvbVN0eWxlc1RvQ3NzVGV4dCh0aGlzLmRvbVN0eWxlcyk7Cgl9LAoJc3R5bGVDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQkvLyBGSVhNRTogc3RvbXBpbmcgb24gZG9tU3R5bGVzIGlzIHByb2JsZW1hdGljLCB0aGVyZSBtYXkgYmUgc3R5bGVzIG9uIHRoaXMgb2JqZWN0CgkJLy8gYXBwbGllZCBieSBsYXlvdXRzIG9yIG90aGVyIG9iamVjdHMuCgkJLy8gV2UgbWF5IG5lZWQgYSAncnVudGltZVN0eWxlcycgY29uY2VwdCBzZXBhcmF0ZSBmcm9tIGEgJ3VzZXJTdHlsZXMnIGNvbmNlcHQsIGFsdGhvdWdoCgkJLy8gaXQncyBub3QgY2xlYXIgd2hhdCBBUEkgY2FsbHMgbGlrZSAnYXBwbHlTdHlsZScgd291bGQgYWZmZWN0LCBhbmQgd2hpY2ggY29uY2VwdCB3b3VsZCB0YWtlCgkJLy8gcHJlY2VkZW5jZSB3aGVuIHRoZXJlIGlzIGEgY29uZmxpY3QuCgkJLy8gUGVyaGFwcyB3ZSBjYW4gc2VwYXJhdGUgJ3N0eWxlJyBjb21wbGV0ZWx5IGZyb20gJ2RvbVN0eWxlcycuIEFQSSBtZXRob2RzIGxpa2UgYXBwbHlTdHlsZQoJCS8vIHdvdWxkIGFmZmVjdCBkb21TdHlsZXMsIGFuZCB0aGUgdHdvIHN0eWxlIGRhdGFiYXNlcyB3b3VsZCBiZSBjb21iaW5lZCBhdCByZW5kZXItdGltZS4KCQkvLyBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gZGlzYWxsb3cgY2hhbmdpbmcgInN0eWxlIiBzdHJpbmcgYXQgcnVudGltZSBhbmQgYWxsb3cgaXQgdG8gYmUgc2V0CgkJLy8gYXQgaW5pdC10aW1lIG9ubHkgKGFzIGl0IHdhcyBpbiBwcmUtYXJlcyBlbnlvKS4KCQkvL3RoaXMuZG9tU3R5bGVzID0ge307CgkJLy90aGlzLmFkZFN0eWxlcyh0aGlzLmtpbmRTdHlsZSk7CgkJLy90aGlzLmFkZFN0eWxlcyh0aGlzLnN0eWxlKTsKCQl0aGlzLmludmFsaWRhdGVUYWdzKCk7CgkJdGhpcy5yZW5kZXJTdHlsZXMoKTsKCX0sCgkvLyogQHB1YmxpYwoJLyoqCgkJQXBwbGllcyBhIHNpbmdsZSBzdHlsZSB2YWx1ZSB0byB0aGlzIG9iamVjdC4KCgkJCXRoaXMuJC5ib3guYXBwbHlTdHlsZSgiei1pbmRleCIsIDQpOwoKCQlZb3UgbWF5IHJlbW92ZSBhIHN0eWxlIGJ5IHNldHRpbmcgaXRzIHZhbHVlIHRvIG51bGwuCgoJCQl0aGlzLiQuYm94LmFwcGx5U3R5bGUoInotaW5kZXgiLCBudWxsKTsKCSovCglhcHBseVN0eWxlOiBmdW5jdGlvbihpblN0eWxlLCBpblZhbHVlKSB7CgkJdGhpcy5kb21TdHlsZXNbaW5TdHlsZV0gPSBpblZhbHVlOwoJCXRoaXMuZG9tU3R5bGVzQ2hhbmdlZCgpOwoJfSwKCS8qKgoJCUFkZHMgQ1NTIHN0eWxlcyB0byB0aGUgc2V0IG9mIHN0eWxlcyBhc3NpZ25lZCB0byB0aGlzIG9iamVjdC4KCgkJX2luQ3NzVGV4dF8gaXMgYSBzdHJpbmcgY29udGFpbmluZyBDU1Mgc3R5bGVzIGluIHRleHQgZm9ybWF0LgoKCQkJdGhpcy4kLmJveC5hZGRTdHlsZXMoImJhY2tncm91bmQtY29sb3I6IHJlZDsgcGFkZGluZzogNHB4OyIpOwoJKi8KCWFkZFN0eWxlczogZnVuY3Rpb24oaW5Dc3NUZXh0KSB7CgkJZW55by5Db250cm9sLmNzc1RleHRUb0RvbVN0eWxlcyhpbkNzc1RleHQsIHRoaXMuZG9tU3R5bGVzKTsKCQl0aGlzLmRvbVN0eWxlc0NoYW5nZWQoKTsKCX0sCgkvKioKCQlSZXR1cm5zIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIENTUyBzdHlsZSBuYW1lZCBmcm9tIF9pblN0eWxlXwoJCWZvciB0aGUgRE9NIG5vZGUgb2YgdGhlIGNvbnRyb2wuIElmIHRoZSBub2RlIGhhc24ndCBiZWVuIGdlbmVyYXRlZCwKCQlyZXR1cm5zIF9pbkRlZmF1bHRfIGFzIGEgZGVmYXVsdCB2YWx1ZS4gVGhpcyB1c2VzIENTUy1zdHlsZSBwcm9wZXJ0eQoJCW5hbWVzLCBub3QgSmF2YVNjcmlwdC1zdHlsZSBuYW1lcywgc28gdXNlICJmb250LWZhbWlseSIgaW5zdGVhZCBvZgoJCSJmb250RmFtaWx5Ii4KCSovCglnZXRDb21wdXRlZFN0eWxlVmFsdWU6IGZ1bmN0aW9uKGluU3R5bGUsIGluRGVmYXVsdCkgewoJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQlyZXR1cm4gZW55by5kb20uZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKHRoaXMubm9kZSwgaW5TdHlsZSk7CgkJfQoJCXJldHVybiBpbkRlZmF1bHQ7Cgl9LAoJLy8qIEBwcm90ZWN0ZWQKCWRvbVN0eWxlc0NoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9tQ3NzVGV4dCA9IGVueW8uQ29udHJvbC5kb21TdHlsZXNUb0Nzc1RleHQodGhpcy5kb21TdHlsZXMpOwoJCXRoaXMuaW52YWxpZGF0ZVRhZ3MoKTsKCQl0aGlzLnJlbmRlclN0eWxlcygpOwoJfSwKCXN0eWxlc1RvTm9kZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5ub2RlLnN0eWxlLmNzc1RleHQgPSB0aGlzLnN0eWxlICsgKHRoaXMuc3R5bGVbdGhpcy5zdHlsZS5sZW5ndGgtMV0gPT0gJzsnID8gJyAnIDogJzsgJykgKyB0aGlzLmRvbUNzc1RleHQ7Cgl9LAoJc2V0dXBCb2R5Rml0dGluZzogZnVuY3Rpb24oKSB7CgkJZW55by5kb20uYXBwbHlCb2R5Rml0KCk7CgkJdGhpcy5hZGRDbGFzcygiZW55by1maXQgZW55by1jbGlwIik7Cgl9LAoJLyoKCQlJZiB0aGUgcGxhdGZvcm0gaXMgQW5kcm9pZCBvciBBbmRyb2lkLUNocm9tZSwgZG9uJ3QgaW5jbHVkZQoJCXRoZSBjc3MgcnVsZSAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2gsIGFzIGl0IGlzCgkJbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIGFuZCBsZWFkcyB0byBvdmVyZmxvdyBpc3N1ZXMKCQkoRU5ZTy05MDAgYW5kIEVOWU8tOTAxKQoJCVNpbWlsYXJseSwgQkIxMCBoYXMgaXNzdWVzIHJlcGFpbnRpbmcgb3V0LW9mLXZpZXdwb3J0IGNvbnRlbnQKCQl3aGVuIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nIGlzIHVzZWQgKEVOWU8tMTM5NikKCSovCglzZXR1cE92ZXJmbG93U2Nyb2xsaW5nOiBmdW5jdGlvbigpIHsKCQlpZihlbnlvLnBsYXRmb3JtLmFuZHJvaWQgfHwgZW55by5wbGF0Zm9ybS5hbmRyb2lkQ2hyb21lIHx8IGVueW8ucGxhdGZvcm0uYmxhY2tiZXJyeSkgewoJCQlyZXR1cm47CgkJfQoJCWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0uY2xhc3NOYW1lICs9ICIgd2Via2l0T3ZlcmZsb3dTY3JvbGxpbmciOwoJfSwKCS8vCgkvLwoJLy8qIEBwdWJsaWMKCS8qKgoJCVJlbmRlcnMgdGhpcyBvYmplY3QgaW50byBET00sIGdlbmVyYXRpbmcgYSBET00gbm9kZSBpZiBuZWVkZWQuCgkqLwoJcmVuZGVyOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5wYXJlbnQpIHsKCQkJLy8gYWxsb3cgdGhlIHBhcmVudCB0byBwZXJmb3JtIHNldHVwIHRhc2tzCgkJCS8vIG5vdGU6ICgncGFyZW50LmdlbmVyYXRlZCcgbWF5IGNoYW5nZSBoZXJlKQoJCQl0aGlzLnBhcmVudC5iZWZvcmVDaGlsZFJlbmRlcih0aGlzKTsKCQkJLy8gZG9uJ3QgcmVuZGVyIGlmIHRoZSBwYXJlbnQgaGFzIG5vdCBnZW5lcmF0ZWQKCQkJaWYgKCF0aGlzLnBhcmVudC5nZW5lcmF0ZWQpIHsKCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJCWlmICh0aGlzLnRhZyA9PT0gbnVsbCkgewoJCQkJLy8gY2FuJ3QgcmVuZGVyIGEgbnVsbCBlbGVtZW50LCBoYXZlIHRvIHJlbmRlciBwYXJlbnQgaW5zdGVhZAoJCQkJdGhpcy5wYXJlbnQucmVuZGVyKCk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfQoJCX0KCQlpZiAoIXRoaXMuaGFzTm9kZSgpKSB7CgkJCXRoaXMucmVuZGVyTm9kZSgpOwoJCX0KCQlpZiAodGhpcy5oYXNOb2RlKCkpIHsKCQkJdGhpcy5yZW5kZXJEb20oKTsKCQkJaWYgKHRoaXMuZ2VuZXJhdGVkKSB7CgkJCQl0aGlzLnJlbmRlcmVkKCk7CgkJCX0KCQl9CgkJLy8gcmV0dXJuICd0aGlzJyB0byBzdXBwb3J0IG1ldGhvZCBjaGFpbmluZwoJCXJldHVybiB0aGlzOwoJfSwKCS8qKgoJCVJlbmRlcnMgdGhpcyBvYmplY3QgaW50byB0aGUgRE9NIG5vZGUgcmVmZXJlbmNlZCBieSBfaW5QYXJlbnROb2RlXy4KCQlJZiByZW5kZXJpbmcgaW50byB0aGUgZG9jdW1lbnQgYm9keSBlbGVtZW50LCBhcHByb3ByaWF0ZSBzdHlsZXMgd2lsbAoJCWJlIHVzZWQgdG8gaGF2ZSBpdCBleHBhbmQgdG8gZmlsbCB0aGUgd2hvbGUgd2luZG93LgoJKi8KCXJlbmRlckludG86IGZ1bmN0aW9uKGluUGFyZW50Tm9kZSkgewoJCS8vIGNsZWFuIHVwIHJlbmRlciBmbGFncyBhbmQgbWVtb2l6YXRpb25zCgkJdGhpcy50ZWFyZG93blJlbmRlcigpOwoJCS8vIGluUGFyZW50Tm9kZSBjYW4gYmUgYSBzdHJpbmcgaWQgb3IgYSBub2RlIHJlZmVyZW5jZQoJCXZhciBwbiA9IGVueW8uZG9tLmJ5SWQoaW5QYXJlbnROb2RlKTsKCQl2YXIgbm9GaXQgPSBlbnlvLmV4aXN0cyh0aGlzLmZpdCkgJiYgdGhpcy5maXQgPT09IGZhbHNlOwoJCS8vY29uc29sZS5sb2cobm9GaXQpOwoJCWlmIChwbiA9PSBkb2N1bWVudC5ib2R5ICYmICFub0ZpdCkgewoJCQl0aGlzLnNldHVwQm9keUZpdHRpbmcoKTsKCQl9IGVsc2UgaWYgKHRoaXMuZml0KSB7CgkJCXRoaXMuYWRkQ2xhc3MoImVueW8tZml0IGVueW8tY2xpcCIpOwoJCX0KCQkvLyBmb3IgSUUxMCBzdXBwb3J0LCB3ZSB3YW50IGZ1bGwgc3VwcG9ydCBvdmVyIHRvdWNoIGFjdGlvbnMgaW4gRW55by1yZW5kZXJlZCBhcmVhcwoJCXRoaXMuYWRkQ2xhc3MoImVueW8tbm8tdG91Y2gtYWN0aW9uIik7CgkJLy8gYWRkIGNzcyB0byBlbmFibGUgaHctYWNjZWxlcmF0ZWQgc2Nyb2xsaW5nIG9uIG5vbi1BbmRyb2lkIHBsYXRmb3JtcyAoRU5ZTy05MDAsIEVOWU8tOTAxKQoJCXRoaXMuc2V0dXBPdmVyZmxvd1Njcm9sbGluZygpOwoJCS8vIGdlbmVyYXRlIG91ciBIVE1MCgkJZW55by5kb20uc2V0SW5uZXJIdG1sKHBuLCB0aGlzLmdlbmVyYXRlSHRtbCgpKTsKCQkvLyBwb3N0LXJlbmRlcmluZyB0YXNrcwoJCWlmICh0aGlzLmdlbmVyYXRlZCkgewoJCQl0aGlzLnJlbmRlcmVkKCk7CgkJfQoJCS8vIHN1cHBvcnQgbWV0aG9kIGNoYWluaW5nCgkJcmV0dXJuIHRoaXM7Cgl9LAoJLyoqCgkJVXNlcyBfZG9jdW1lbnQud3JpdGVfIHRvIG91dHB1dCB0aGUgY29udHJvbCBpbnRvIHRoZSBkb2N1bWVudC4KCQlJZiB0aGUgY29udHJvbCBoYXMgX2ZpdDogdHJ1ZV8gZGVmaW5lZCwgYXBwcm9wcmlhdGUgc3R5bGVzIHdpbGwgYmUgc2V0CgkJdG8gaGF2ZSBpdCBleHBhbmQgdG8gZmlsbCBpdHMgY29udGFpbmVyLgoKCQlOb3RlIHRoYXQgdGhpcyBoYXMgYWxsIHRoZSBsaW1pdGF0aW9ucyB0aGF0IF9kb2N1bWVudC53cml0ZV8gaGFzLgoJCUl0IG9ubHkgd29ya3Mgd2hpbGUgdGhlIHBhZ2UgaXMgbG9hZGluZywgc28geW91IGNhbid0IGNhbGwgdGhpcyBmcm9tIGFuCgkJZXZlbnQgaGFuZGxlci4gQWxzbywgaXQgd2lsbCBub3Qgd29yayBpbiBjZXJ0YWluIGVudmlyb25tZW50cywgc3VjaCBhcwoJCUNocm9tZSBQYWNrYWdlZCBBcHBzIG9yIFdpbmRvd3MgOC4KCSovCgl3cml0ZTogZnVuY3Rpb24oKSB7CgkJLyoganNoaW50IGV2aWw6dHJ1ZSAqLwoJCWlmICh0aGlzLmZpdCkgewoJCQl0aGlzLnNldHVwQm9keUZpdHRpbmcoKTsKCQl9CgkJLy8gZm9yIElFMTAgc3VwcG9ydCwgd2Ugd2FudCBmdWxsIHN1cHBvcnQgb3ZlciB0b3VjaCBhY3Rpb25zIGluIEVueW8tcmVuZGVyZWQgYXJlYXMKCQl0aGlzLmFkZENsYXNzKCJlbnlvLW5vLXRvdWNoLWFjdGlvbiIpOwoJCS8vIGFkZCBjc3MgdG8gZW5hYmxlIGh3LWFjY2VsZXJhdGVkIHNjcm9sbGluZyBvbiBub24tQW5kcm9pZCBwbGF0Zm9ybXMgKEVOWU8tOTAwLCBFTllPLTkwMSkKCQl0aGlzLnNldHVwT3ZlcmZsb3dTY3JvbGxpbmcoKTsKCQlkb2N1bWVudC53cml0ZSh0aGlzLmdlbmVyYXRlSHRtbCgpKTsKCQkvLyBwb3N0LXJlbmRlcmluZyB0YXNrcwoJCWlmICh0aGlzLmdlbmVyYXRlZCkgewoJCQl0aGlzLnJlbmRlcmVkKCk7CgkJfQoJCS8vIHN1cHBvcnQgbWV0aG9kIGNoYWluaW5nCgkJcmV0dXJuIHRoaXM7Cgl9LAoJLyoqCgkJT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSB0YXNrcyB0aGF0IHJlcXVpcmUgYWNjZXNzIHRvIHRoZSBET00gbm9kZS4KCgkJCXJlbmRlcmVkOiBmdW5jdGlvbigpIHsKCQkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCQkvLyBkbyBzb21lIHRhc2sKCQkJfQoJKi8KCXJlbmRlcmVkOiBmdW5jdGlvbigpIHsKCQkvLyBDQVZFQVQ6IEN1cnJlbnRseSB3ZSB1c2Ugb25lIGVudHJ5IHBvaW50ICgncmVmbG93JykgZm9yCgkJLy8gcG9zdC1yZW5kZXIgbGF5b3V0IHdvcmsgKmFuZCogcG9zdC1yZXNpemUgbGF5b3V0IHdvcmsuCgkJdGhpcy5yZWZsb3coKTsKCQlmb3IgKHZhciBpPTAsIGM7IChjPXRoaXMuY2hpbGRyZW5baV0pOyBpKyspIHsKCQkJaWYgKGMuZ2VuZXJhdGVkKSB7CgkJCQljLnJlbmRlcmVkKCk7CgkJCX0KCQl9Cgl9LAoJLyoqCgkJU2hvd3MgdGhpcyBub2RlIChhbGlhcyBmb3IgX3NldFNob3dpbmcodHJ1ZSlfKS4KCSovCglzaG93OiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldFNob3dpbmcodHJ1ZSk7Cgl9LAoJLyoqCgkJSGlkZXMgdGhpcyBub2RlIChhbGlhcyBmb3IgX3NldFNob3dpbmcoZmFsc2UpXykuCgkqLwoJaGlkZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZXRTaG93aW5nKGZhbHNlKTsKCX0sCgkvLyogU2V0cyBmb2N1cyB0byB0aGlzIGNvbnRyb2wuCglmb2N1czogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXRoaXMubm9kZS5mb2N1cygpOwoJCX0KCX0sCgkvLyogQmx1cnMgdGhpcyBjb250cm9sLgoJYmx1cjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXRoaXMubm9kZS5ibHVyKCk7CgkJfQoJfSwKCS8vKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRyb2wgaXMgZm9jdXNlZC4KCWhhc0ZvY3VzOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5oYXNOb2RlKCkpIHsKCQkJcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMubm9kZTsKCQl9Cgl9LAoJLyoqCgkJUmV0dXJucyBhbiBvYmplY3QgZGVzY3JpYmluZyB0aGUgZ2VvbWV0cnkgb2YgdGhpcyBvYmplY3QsIGxpa2Ugc286CgoJCQl7bGVmdDogX29mZnNldExlZnRfLCB0b3A6IF9vZmZzZXRUb3BfLCB3aWR0aDogX29mZnNldFdpZHRoXywgaGVpZ2h0OiBfb2Zmc2V0SGVpZ2h0X30KCgkJVmFsdWVzIHJldHVybmVkIGFyZSBvbmx5IHZhbGlkIGlmIF9oYXNOb2RlKClfIGlzIHRydXRoeS4KCQlJZiB0aGVyZSdzIG5vIERPTSBub2RlIGZvciB0aGUgb2JqZWN0LCB0aGlzIHJldHVybnMgYSBib3VuZHMgc3RydWN0dXJlIHdpdGgKCQlfdW5kZWZpbmVkXyBhcyB0aGUgdmFsdWUgb2YgYWxsIGZpZWxkcy4KCgkJCXZhciBib3VuZHMgPSB0aGlzLmdldEJvdW5kcygpOwoJCQllbnlvLmxvZyhib3VuZHMud2lkdGgpOwoJKi8KCWdldEJvdW5kczogZnVuY3Rpb24oKSB7CgkJdmFyIG4gPSB0aGlzLm5vZGUgfHwgdGhpcy5oYXNOb2RlKCk7CgkJdmFyIGIgPSBlbnlvLmRvbS5nZXRCb3VuZHMobik7CgkJcmV0dXJuIGIgfHwge2xlZnQ6IHVuZGVmaW5lZCwgdG9wOiB1bmRlZmluZWQsIHdpZHRoOiB1bmRlZmluZWQsIGhlaWdodDogdW5kZWZpbmVkfTsKCX0sCgkvKioKCQlTZXRzIGFueSBvciBhbGwgb2YgdGhlIGdlb21ldHJ5IHN0eWxlIHByb3BlcnRpZXMgX3dpZHRoXywgX2hlaWdodF8sCgkJX2xlZnRfLCBfdG9wXywgX3JpZ2h0XyBhbmQgX2JvdHRvbV8uCgoJCVZhbHVlcyBtYXkgYmUgc3BlY2lmaWVkIGFzIHN0cmluZ3MgKHdpdGggdW5pdHMgaW5jbHVkZWQpLCBvciBhcyBudW1iZXJzCgkJd2hlbiBhIHVuaXQgaXMgcHJvdmlkZWQgaW4gX2luVW5pdF8uCgoJCQl0aGlzLnNldEJvdW5kcyh7d2lkdGg6IDEwMCwgaGVpZ2h0OiAxMDB9LCAicHgiKTsgLy8gYWRkcyBzdHlsZSBwcm9wZXJ0aWVzIGxpa2UgIndpZHRoOiAxMDBweDsgaGVpZ2h0OiAxMDBweDsiCgkJCS8vCgkJCXRoaXMuc2V0Qm91bmRzKHt3aWR0aDogIjEwZW0iLCByaWdodDogIjMwcHQifSk7IC8vIGFkZHMgc3R5bGUgcHJvcGVydGllcyBsaWtlICJ3aWR0aDogMTBlbTsgcmlnaHQ6IDMwcHQ7IgoJKi8KCXNldEJvdW5kczogZnVuY3Rpb24oaW5Cb3VuZHMsIGluVW5pdCkgewoJCXZhciBzID0gdGhpcy5kb21TdHlsZXMsIHVuaXQgPSBpblVuaXQgfHwgInB4IjsKCQl2YXIgZXh0ZW50cyA9IFsid2lkdGgiLCAiaGVpZ2h0IiwgImxlZnQiLCAidG9wIiwgInJpZ2h0IiwgImJvdHRvbSJdOwoJCWZvciAodmFyIGk9MCwgYiwgZTsgKGU9ZXh0ZW50c1tpXSk7IGkrKykgewoJCQliID0gaW5Cb3VuZHNbZV07CgkJCWlmIChiIHx8IGIgPT09IDApIHsKCQkJCXNbZV0gPSBiICsgKCFlbnlvLmlzU3RyaW5nKGIpID8gdW5pdCA6ICcnKTsKCQkJfQoJCX0KCQl0aGlzLmRvbVN0eWxlc0NoYW5nZWQoKTsKCX0sCglnZXRBYnNvbHV0ZUJvdW5kczogZnVuY3Rpb24oKSB7CgkJdmFyIGwgPSAwLAoJCQl0ID0gMCwKCQkJbiA9IHRoaXMuaGFzTm9kZSgpLAoJCQl3ID0gbiA/IG4ub2Zmc2V0V2lkdGggOiAwLAoJCQloID0gbiA/IG4ub2Zmc2V0SGVpZ2h0IDogMDsKCgkJd2hpbGUobikgewoJCQlsICs9IG4ub2Zmc2V0TGVmdCAtIChuLm9mZnNldFBhcmVudCA/IG4ub2Zmc2V0UGFyZW50LnNjcm9sbExlZnQgOiAwKTsKCQkJdCArPSBuLm9mZnNldFRvcCAgLSAobi5vZmZzZXRQYXJlbnQgPyBuLm9mZnNldFBhcmVudC5zY3JvbGxUb3AJOiAwKTsKCQkJbiA9IG4ub2Zmc2V0UGFyZW50OwoJCX0KCgkJcmV0dXJuIHsKCQkJdG9wCQk6IHQsCgkJCWxlZnQJOiBsLAoJCQlib3R0b20JOiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCAtIHQgLSBoLAoJCQlyaWdodCAgIDogZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCAgLSBsIC0gdywKCQkJaGVpZ2h0CTogaCwKCQkJd2lkdGgJOiB3CgkJfTsKCX0sCgkvLyogQHByb3RlY3RlZAoJLy8gZXhwZW5zaXZlLCBvdGhlciBtZXRob2RzIGRvIHdvcmsgdG8gYXZvaWQgY2FsbGluZyBoZXJlCglmaW5kTm9kZUJ5SWQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmlkICYmICh0aGlzLm5vZGUgPSBlbnlvLmRvbS5ieUlkKHRoaXMuaWQpKTsKCX0sCglpZENoYW5nZWQ6IGZ1bmN0aW9uKGluT2xkKSB7CgkJaWYgKGluT2xkKSB7CgkJCWVueW8uQ29udHJvbC51bnJlZ2lzdGVyRG9tRXZlbnRzKGluT2xkKTsKCQl9CgkJdGhpcy5zZXRBdHRyaWJ1dGUoImlkIiwgdGhpcy5pZCk7CgkJaWYgKHRoaXMuaWQpIHsKCQkJZW55by5Db250cm9sLnJlZ2lzdGVyRG9tRXZlbnRzKHRoaXMuaWQsIHRoaXMpOwoJCX0KCX0sCgljb250ZW50Q2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXRoaXMucmVuZGVyQ29udGVudCgpOwoJCX0KCX0sCglnZXRTcmM6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgic3JjIik7Cgl9LAoJc3JjQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLnNyYykgewoJCQlyZXR1cm47CgkJfQoJCXRoaXMuc2V0QXR0cmlidXRlKCJzcmMiLCBlbnlvLnBhdGgucmV3cml0ZSh0aGlzLnNyYykpOwoJfSwKCWF0dHJpYnV0ZXNDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmludmFsaWRhdGVUYWdzKCk7CgkJdGhpcy5yZW5kZXJBdHRyaWJ1dGVzKCk7Cgl9LAoJLy8KCS8vIEhUTUwgcmVuZGVyaW5nCgkvLwoJZ2VuZXJhdGVIdG1sOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5jYW5HZW5lcmF0ZSA9PT0gZmFsc2UpIHsKCQkJcmV0dXJuICcnOwoJCX0KCQkvLyBkbyB0aGlzIGZpcnN0IGluIGNhc2UgY29udGVudCBnZW5lcmF0aW9uIGFmZmVjdHMgb3V0ZXIgaHRtbCAoc3R5bGVzIG9yIGF0dHJpYnV0ZXMpCgkJdmFyIGMgPSB0aGlzLmdlbmVyYXRlSW5uZXJIdG1sKCk7CgkJLy8gZ2VuZXJhdGUgdGFnLCBzdHlsZXMsIGF0dHJpYnV0ZXMKCQl2YXIgaCA9IHRoaXMuZ2VuZXJhdGVPdXRlckh0bWwoYyk7CgkJLy8gTk9URTogJ2dlbmVyYXRlZCcgaXMgdXNlZCB0byBnYXRlIGFjY2VzcyB0byBmaW5kTm9kZUJ5SWQgaW4KCQkvLyBoYXNOb2RlLCBiZWNhdXNlIGZpbmROb2RlQnlJZCBpcyBleHBlbnNpdmUuCgkJLy8gTk9URTogd2UgdHlwaWNhbGx5IHVzZSAnZ2VuZXJhdGVkJyB0byBtZWFuICdjcmVhdGVkIGluIERPTScKCQkvLyBidXQgdGhhdCBoYXMgbm90IGFjdHVhbGx5IGhhcHBlbmVkIGF0IHRoaXMgcG9pbnQuCgkJLy8gV2Ugc2V0ICdnZW5lcmF0ZWQgPSB0cnVlJyBoZXJlIGFueXdheSB0byBhdm9pZCBoYXZpbmcgdG8gd2FsayB0aGUKCQkvLyBjb250cm9sIHRyZWUgYSBzZWNvbmQgdGltZSAodG8gc2V0IGl0IGxhdGVyKS4KCQkvLyBUaGUgY29udHJhY3QgaXMgdGhhdCBpbnNlcnRpb24gaW4gRE9NIHdpbGwgaGFwcGVuIHN5bmNocm9ub3VzbHkKCQkvLyB0byBnZW5lcmF0ZUh0bWwoKSBhbmQgYmVmb3JlIGFueWJvZHkgc2hvdWxkIGJlIGNhbGxpbmcgaGFzTm9kZSgpLgoJCXRoaXMuZ2VuZXJhdGVkID0gdHJ1ZTsKCQlyZXR1cm4gaDsKCX0sCglnZW5lcmF0ZUlubmVySHRtbDogZnVuY3Rpb24oKSB7CgkJLy8gRmxvdyBjYW4gYWx0ZXIgdGhlIHdheSB0aGF0IGh0bWwgY29udGVudCBpcyByZW5kZXJlZCBpbnNpZGUKCQkvLyB0aGUgY29udGFpbmVyIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVyZSBhcmUgY2hpbGRyZW4uCgkJdGhpcy5mbG93KCk7CgkJaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7CgkJCXJldHVybiB0aGlzLmdlbmVyYXRlQ2hpbGRIdG1sKCk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRoaXMuYWxsb3dIdG1sID8gdGhpcy5nZXQoImNvbnRlbnQiKSA6IGVueW8uQ29udHJvbC5lc2NhcGVIdG1sKHRoaXMuZ2V0KCJjb250ZW50IikpOwoJCX0KCX0sCglnZW5lcmF0ZUNoaWxkSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHJlc3VsdHMgPSAnJzsKCQlmb3IgKHZhciBpPTAsIGM7IChjPXRoaXMuY2hpbGRyZW5baV0pOyBpKyspIHsKCQkJdmFyIGggPSBjLmdlbmVyYXRlSHRtbCgpOwoJCQlyZXN1bHRzICs9IGg7CgkJfQoJCXJldHVybiByZXN1bHRzOwoJfSwKCWdlbmVyYXRlT3V0ZXJIdG1sOiBmdW5jdGlvbihpbkNvbnRlbnQpIHsKCQlpZiAoIXRoaXMudGFnKSB7CgkJCXJldHVybiBpbkNvbnRlbnQ7CgkJfQoJCWlmICghdGhpcy50YWdzVmFsaWQpIHsKCQkJdGhpcy5wcmVwYXJlVGFncygpOwoJCX0KCQlyZXR1cm4gdGhpcy5fb3BlblRhZyArIGluQ29udGVudCArIHRoaXMuX2Nsb3NlVGFnOwoJfSwKCWludmFsaWRhdGVUYWdzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRhZ3NWYWxpZCA9IGZhbHNlOwoJfSwKCXByZXBhcmVUYWdzOiBmdW5jdGlvbigpIHsKCQl2YXIgaHRtbFN0eWxlID0gdGhpcy5kb21Dc3NUZXh0ICsgdGhpcy5zdHlsZTsKCQl0aGlzLl9vcGVuVGFnID0gJzwnICsKCQkJdGhpcy50YWcgKwoJCQkoaHRtbFN0eWxlID8gJyBzdHlsZT0iJyArIGh0bWxTdHlsZSArICciJyA6ICIiKSArCgkJCWVueW8uQ29udHJvbC5hdHRyaWJ1dGVzVG9IdG1sKHRoaXMuYXR0cmlidXRlcyk7CgkJaWYgKGVueW8uQ29udHJvbC5zZWxmQ2xvc2luZ1t0aGlzLnRhZ10pIHsKCQkJdGhpcy5fb3BlblRhZyArPSAnLz4nOwoJCQl0aGlzLl9jbG9zZVRhZyA9ICAnJzsKCQl9IGVsc2UgewoJCQl0aGlzLl9vcGVuVGFnICs9ICc+JzsKCQkJdGhpcy5fY2xvc2VUYWcgPSAgJzwvJyArIHRoaXMudGFnICsgJz4nOwoJCX0KCQl0aGlzLnRhZ3NWYWxpZCA9IHRydWU7Cgl9LAoJLy8gRE9NLCBha2EgZGlyZWN0LXRvLW5vZGUsIHJlbmRlcmluZwoJYXR0cmlidXRlVG9Ob2RlOiBmdW5jdGlvbihpbk5hbWUsIGluVmFsdWUpIHsKCQlpZiAoaW5WYWx1ZSA9PT0gbnVsbCB8fCBpblZhbHVlID09PSBmYWxzZSB8fCBpblZhbHVlID09PSAiIikgewoJCQl0aGlzLm5vZGUucmVtb3ZlQXR0cmlidXRlKGluTmFtZSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5ub2RlLnNldEF0dHJpYnV0ZShpbk5hbWUsIGluVmFsdWUpOwoJCX0KCX0sCglhdHRyaWJ1dGVzVG9Ob2RlOiBmdW5jdGlvbigpIHsKCQlmb3IgKHZhciBuIGluIHRoaXMuYXR0cmlidXRlcykgewoJCQl0aGlzLmF0dHJpYnV0ZVRvTm9kZShuLCB0aGlzLmF0dHJpYnV0ZXNbbl0pOwoJCX0KCX0sCglnZXRQYXJlbnROb2RlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wYXJlbnROb2RlIHx8ICh0aGlzLnBhcmVudCAmJiAodGhpcy5wYXJlbnQuaGFzTm9kZSgpIHx8IHRoaXMucGFyZW50LmdldFBhcmVudE5vZGUoKSkpOwoJfSwKCWFkZE5vZGVUb1BhcmVudDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMubm9kZSkgewoJCQl2YXIgcG4gPSB0aGlzLmdldFBhcmVudE5vZGUoKTsKCQkJaWYgKHBuKSB7CgkJCQlpZiAodGhpcy5hZGRCZWZvcmUgIT09IHVuZGVmaW5lZCkgewoJCQkJCXRoaXMuaW5zZXJ0Tm9kZUluUGFyZW50KHBuLCB0aGlzLmFkZEJlZm9yZSAmJiB0aGlzLmFkZEJlZm9yZS5oYXNOb2RlKCkpOwoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLmFwcGVuZE5vZGVUb1BhcmVudChwbik7CgkJCQl9CgkJCX0KCQl9Cgl9LAoJYXBwZW5kTm9kZVRvUGFyZW50OiBmdW5jdGlvbihpblBhcmVudE5vZGUpIHsKCQlpblBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKTsKCX0sCglpbnNlcnROb2RlSW5QYXJlbnQ6IGZ1bmN0aW9uKGluUGFyZW50Tm9kZSwgaW5CZWZvcmVOb2RlKSB7CgkJaW5QYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLm5vZGUsIGluQmVmb3JlTm9kZSB8fCBpblBhcmVudE5vZGUuZmlyc3RDaGlsZCk7Cgl9LAoJcmVtb3ZlTm9kZUZyb21Eb206IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhhc05vZGUoKSAmJiB0aGlzLm5vZGUucGFyZW50Tm9kZSkgewoJCQl0aGlzLm5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUpOwoJCX0KCX0sCglkaXNjb25uZWN0RG9tOiBmdW5jdGlvbiAoKSB7CgkJaWYgKHRoaXMuZ2VuZXJhdGVkKSB7CgkJCXRoaXMuZGlzY29ubmVjdENoaWxkcmVuRG9tKCk7CgkJfQoJCXRoaXMuX25vZGUgPSB0aGlzLm5vZGU7CgkJdGhpcy5ub2RlID0gbnVsbDsKCQl0aGlzLmdlbmVyYXRlZCA9IGZhbHNlOwoJCXRoaXMuX2RvbURpc2Nvbm5lY3RlZCA9IHRydWU7Cgl9LAoJZGlzY29ubmVjdENoaWxkcmVuRG9tOiBmdW5jdGlvbiAoKSB7CgkJZm9yICh2YXIgaT0wLCBjOyAoYz10aGlzLmNoaWxkcmVuW2ldKTsgKytpKSB7CgkJCWMuZGlzY29ubmVjdERvbSgpOwoJCX0KCX0sCgljb25uZWN0Q2hpbGRyZW5Eb206IGZ1bmN0aW9uICgpIHsKCQlmb3IgKHZhciBpPTAsIGM7IChjPXRoaXMuY2hpbGRyZW5baV0pOyArK2kpIHsKCQkJYy5jb25uZWN0RG9tKCk7CgkJfQoJfSwKCWNvbm5lY3REb206IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5fZG9tRGlzY29ubmVjdGVkKSB7CgkJCXRoaXMuY29ubmVjdENoaWxkcmVuRG9tKCk7CgkJCXRoaXMubm9kZSA9IHRoaXMuX25vZGU7CgkJCXRoaXMuX25vZGUgPSBudWxsOwoJCQl0aGlzLmdlbmVyYXRlZCA9IHRydWU7CgkJCXRoaXMuX2RvbURpc2Nvbm5lY3RlZCA9IGZhbHNlOwoJCX0KCX0sCgl0ZWFyZG93blJlbmRlcjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuZ2VuZXJhdGVkKSB7CgkJCXRoaXMudGVhcmRvd25DaGlsZHJlbigpOwoJCX0KCQl0aGlzLm5vZGUgPSBudWxsOwoJCXRoaXMuZ2VuZXJhdGVkID0gZmFsc2U7Cgl9LAoJdGVhcmRvd25DaGlsZHJlbjogZnVuY3Rpb24oKSB7CgkJZm9yICh2YXIgaT0wLCBjOyAoYz10aGlzLmNoaWxkcmVuW2ldKTsgaSsrKSB7CgkJCWMudGVhcmRvd25SZW5kZXIoKTsKCQl9Cgl9LAoJcmVuZGVyTm9kZTogZnVuY3Rpb24oKSB7CgkJdGhpcy50ZWFyZG93blJlbmRlcigpOwoJCXRoaXMubm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy50YWcpOwoJCXRoaXMuYWRkTm9kZVRvUGFyZW50KCk7CgkJdGhpcy5nZW5lcmF0ZWQgPSB0cnVlOwoJfSwKCXJlbmRlckRvbTogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW5kZXJBdHRyaWJ1dGVzKCk7CgkJdGhpcy5yZW5kZXJTdHlsZXMoKTsKCQl0aGlzLnJlbmRlckNvbnRlbnQoKTsKCX0sCglyZW5kZXJDb250ZW50OiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5nZW5lcmF0ZWQpIHsKCQkJdGhpcy50ZWFyZG93bkNoaWxkcmVuKCk7CgkJfQoJCWlmICh0aGlzLm5vZGUpIHsKCQkJZW55by5kb20uc2V0SW5uZXJIdG1sKHRoaXMubm9kZSwgdGhpcy5nZW5lcmF0ZUlubmVySHRtbCgpKTsKCQl9Cgl9LAoJcmVuZGVyUmV1c2luZ05vZGU6IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGgpIHsKCQkJZm9yICh2YXIgaT0wLCBjOyAoYz10aGlzLmNoaWxkcmVuW2ldKTsgKytpKSB7CgkJCQljLnJlbmRlclJldXNpbmdOb2RlKCk7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAodGhpcy5nZW5lcmF0ZWQgJiYgKHRoaXMubm9kZSA9IHRoaXMuaGFzTm9kZSgpKSkgewoJCQkJZW55by5kb20uc2V0SW5uZXJIdG1sKHRoaXMubm9kZSwgdGhpcy5nZW5lcmF0ZUlubmVySHRtbCgpKTsKCQkJfQoJCX0KCX0sCglyZW5kZXJTdHlsZXM6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQl0aGlzLnN0eWxlc1RvTm9kZSgpOwoJCX0KCX0sCglyZW5kZXJBdHRyaWJ1dGVzOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5oYXNOb2RlKCkpIHsKCQkJdGhpcy5hdHRyaWJ1dGVzVG9Ob2RlKCk7CgkJfQoJfSwKCWJlZm9yZUNoaWxkUmVuZGVyOiBmdW5jdGlvbigpIHsKCQkvLyBpZiB3ZSBhcmUgZ2VuZXJhdGVkLCB3ZSBzaG91bGQgZmxvdyBiZWZvcmUgcmVuZGVyaW5nIGEgY2hpbGQKCQkvLyBpZiBub3QsIHRoZSByZW5kZXIgY29udGV4dCBpc24ndCByZWFkeSBhbnl3YXkKCQlpZiAodGhpcy5nZW5lcmF0ZWQpIHsKCQkJdGhpcy5mbG93KCk7CgkJfQoJfSwKCXN5bmNEaXNwbGF5VG9TaG93aW5nOiBmdW5jdGlvbigpIHsKCQl2YXIgZHMgPSB0aGlzLmRvbVN0eWxlczsKCQlpZiAodGhpcy5zaG93aW5nKSB7CgkJCS8vIG5vdGU6IG9ubHkgc2hvdyBhIG5vZGUgaWYgaXQncyBhY3R1YWxseSBoaWRkZW4KCQkJLy8gdGhpcyB3YXkgd2UgcHJldmVudCBvdmVycmlkaW5nIHRoZSB2YWx1ZSBvZiBkb21TdHlsZXMuZGlzcGxheQoJCQlpZiAoZHMuZGlzcGxheSA9PSAibm9uZSIpIHsKCQkJCXRoaXMuYXBwbHlTdHlsZSgiZGlzcGxheSIsIHRoaXMuX2Rpc3BsYXlTdHlsZSB8fCAiIik7CgkJCX0KCQl9IGVsc2UgewoJCQkvLyBjYWNoZSB0aGUgcHJldmlvdXMgc2hvd2luZyB2YWx1ZSBvZiBkaXNwbGF5CgkJCS8vIG5vdGU6IHdlIGNvdWxkIHVzZSBhIGNsYXNzIHRvIGhpZGUgYSBub2RlLCBidXQgdGhlbgoJCQkvLyBoaWRlIHdvdWxkIG5vdCBvdmVycmlkZSBhIHNldHRpbmcgb2YgZGlzcGxheTogbm9uZSBpbiBzdHlsZSwKCQkJLy8gd2hpY2ggc2VlbXMgYmFkLgoJCQl0aGlzLl9kaXNwbGF5U3R5bGUgPSAoZHMuZGlzcGxheSA9PSAibm9uZSIgPyAiIiA6IGRzLmRpc3BsYXkpOwoJCQl0aGlzLmFwcGx5U3R5bGUoImRpc3BsYXkiLCAibm9uZSIpOwoJCX0KCX0sCglzaG93aW5nQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5zeW5jRGlzcGxheVRvU2hvd2luZygpOwoJfSwKCWdldFNob3dpbmc6IGZ1bmN0aW9uKCkgewoJCS8vICdzaG93aW5nJyBzcGVjaWZpY2FsbHkgbWVhbnMgZG9tU3R5bGVzLmRpc3BsYXkgIT09ICdub25lJy4KCQkvLyAnc2hvd2luZycgZG9lcyBub3QgaW1wbHkgdGhlIG5vZGUgaXMgYWN0dWFsbHkgdmlzaWJsZSBvciBldmVuIHJlbmRlcmVkIGluIERPTSwKCQkvLyBpdCBzaW1wbHkgcmVmbGVjdHMgdGhpcyBzdGF0ZSBvZiB0aGlzIHNwZWNpZmljIHByb3BlcnR5IGFzIGEgY29udmVuaWVuY2UuCgkJdGhpcy5zaG93aW5nID0gKHRoaXMuZG9tU3R5bGVzLmRpc3BsYXkgIT0gIm5vbmUiKTsKCQlyZXR1cm4gdGhpcy5zaG93aW5nOwoJfSwKCS8vKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFuZCBhbGwgcGFyZW50cyBhcmUgc2hvd2luZwoJZ2V0QWJzb2x1dGVTaG93aW5nOiBmdW5jdGlvbigpIHsKCQl2YXIgYiA9IHRoaXMuZ2V0Qm91bmRzKCk7CgoJCWlmKHRoaXMuZ2V0U2hvd2luZygpID09PSBmYWxzZSB8fCAoYi5oZWlnaHQgPT09IDAgJiYgYi53aWR0aCA9PT0gMCkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuZ2V0QWJzb2x1dGVTaG93aW5nKSB7CgkJCXJldHVybiB0aGlzLnBhcmVudC5nZXRBYnNvbHV0ZVNob3dpbmcoKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9LAoJLy8KCS8vCglmaXRDaGFuZ2VkOiBmdW5jdGlvbihpbk9sZCkgewoJCXRoaXMucGFyZW50LnJlZmxvdygpOwoJfSwKCS8vKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbnRyb2wgaXMgdGhlIGN1cnJlbnQgZnVsbHNjcmVlbiBjb250cm9sCglpc0Z1bGxzY3JlZW46IGZ1bmN0aW9uKCkgewoJCXJldHVybiAodGhpcy5oYXNOb2RlKCkgJiYgdGhpcy5oYXNOb2RlKCkgPT09IGVueW8uZnVsbHNjcmVlbi5nZXRGdWxsc2NyZWVuRWxlbWVudCgpKTsKCX0sCgkvLyogU2VuZCByZXF1ZXN0IHRvIG1ha2UgdGhpcyBjb250cm9sIGZ1bGxzY3JlZW4KCXJlcXVlc3RGdWxsc2NyZWVuOiBmdW5jdGlvbigpIHsKCQlpZiAoIXRoaXMuaGFzTm9kZSgpKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmIChlbnlvLmZ1bGxzY3JlZW4ucmVxdWVzdEZ1bGxzY3JlZW4odGhpcykpIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoJLy8qIFNlbmQgcmVxdWVzdCB0byB0YWtlIHRoaXMgY29udHJvbCBvdXQgb2YgZnVsbHNjcmVlbgoJY2FuY2VsRnVsbHNjcmVlbjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNGdWxsc2NyZWVuKCkpIHsKCQkJZW55by5mdWxsc2NyZWVuLmNhbmNlbEZ1bGxzY3JlZW4oKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoJLy8KCS8vCglzdGF0aWNzOiB7CgkJLyoqCgkJCVJldHVybnMgcGFzc2VkLWluIHN0cmluZyB3aXRoIGFtcGVyc2FuZCwgbGVzcy10aGFuLCBhbmQgZ3JlYXRlci10aGFuCgkJCWNoYXJhY3RlcnMgcmVwbGFjZWQgYnkgSFRNTCBlbnRpdGllcywgZS5nLiwKCQkJJyZsdDtjb2RlJmd0OyJUaGlzICZhbXA7IFRoYXQiJmx0Oy9jb2RlJmd0OycgYmVjb21lcwoJCQknJmFtcDtsdDtjb2RlJmFtcDtndDsiVGhpcyAmYW1wO2FtcDsgVGhhdCImYW1wO2x0Oy9jb2RlJmFtcDtndDsnCgkJKi8KCQllc2NhcGVIdG1sOiBmdW5jdGlvbihpblRleHQpIHsKCQkJcmV0dXJuIGluVGV4dCAhPSBudWxsID8gU3RyaW5nKGluVGV4dCkucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLzwvZywnJmx0OycpLnJlcGxhY2UoLz4vZywnJmd0OycpIDogJyc7CgkJfSwKCQkvLyogQHByb3RlY3RlZAoJCXJlZ2lzdGVyRG9tRXZlbnRzOiBmdW5jdGlvbihpbklkLCBpbkNvbnRyb2wpIHsKCQkJZW55by4kW2luSWRdID0gaW5Db250cm9sOwoJCX0sCgkJdW5yZWdpc3RlckRvbUV2ZW50czogZnVuY3Rpb24oaW5JZCkgewoJCQllbnlvLiRbaW5JZF0gPSBudWxsOwoJCX0sCgkJc2VsZkNsb3Npbmc6IHtpbWc6IDEsIGhyOiAxLCBicjogMSwgYXJlYTogMSwgYmFzZTogMSwgYmFzZWZvbnQ6IDEsIGlucHV0OiAxLCBsaW5rOiAxLCBtZXRhOiAxLAoJCQljb21tYW5kOiAxLCBlbWJlZDogMSwga2V5Z2VuOiAxLCB3YnI6IDEsIHBhcmFtOiAxLCBzb3VyY2U6IDEsIHRyYWNrOiAxLCBjb2w6IDF9LAoJCWNzc1RleHRUb0RvbVN0eWxlczogZnVuY3Rpb24oaW5UZXh0LCBpblN0eWxlSGFzaCkgewoJCQlpZiAoaW5UZXh0KSB7CgkJCQkvLyByZW1vdmUgc3BhY2VzIGJldHdlZW4gcnVsZXMsIHRoZW4gc3BsaXQgcnVsZXMgb24gZGVsaW1pdGVyICg7KQoJCQkJdmFyIHJ1bGVzID0gaW5UZXh0LnJlcGxhY2UoLzsgL2csICI7Iikuc3BsaXQoIjsiKTsKCQkJCS8vIHBhcnNlIHN0cmluZyBzdHlsZXMgaW50byBuYW1lL3ZhbHVlIHBhaXJzCgkJCQlmb3IgKHZhciBpPTAsIHMsIG4sIHYsIHJ1bGU7IChydWxlPXJ1bGVzW2ldKTsgaSsrKSB7CgkJCQkJLy8gImJhY2tncm91bmQtaW1hZ2U6IHVybChodHRwOi8vZm9vLmNvbS9mb28ucG5nKSIgPT4gWyJiYWNrZ3JvdW5kLWltYWdlIiwgInVybChodHRwIiwgIi8vZm9vLmNvbS9mb28ucG5nKSJdCgkJCQkJcyA9IHJ1bGUuc3BsaXQoIjoiKTsKCQkJCQkvLyBuID0gImJhY2tncm91bmQtaW1hZ2UiLCBzID0gWyJ1cmwoaHR0cCIsICIvL2Zvby5jb20vZm9vLnBuZykiXQoJCQkJCW4gPSBzLnNoaWZ0KCk7CgkJCQkJLy8gdiA9IFsidXJsKGh0dHAiLCAiLy9mb28uY29tL2Zvby5wbmcpIl0uam9pbignOicpID0gInVybChodHRwOi8vZm9vLmNvbS9mb28ucG5nKSIKCQkJCQl2ID0gcy5qb2luKCc6Jyk7CgkJCQkJLy8gc3RvcmUgbmFtZS92YWx1ZSBwYWlyCgkJCQkJaW5TdHlsZUhhc2hbbl0gPSB2OwoJCQkJfQoJCQl9CgkJfSwKCQlkb21TdHlsZXNUb0Nzc1RleHQ6IGZ1bmN0aW9uKGluU3R5bGVIYXNoKSB7CgkJCXZhciBuLCB2LCB0ZXh0ID0gJyc7CgkJCWZvciAobiBpbiBpblN0eWxlSGFzaCkgewoJCQkJdiA9IGluU3R5bGVIYXNoW25dOwoJCQkJaWYgKCh2ICE9PSBudWxsKSAmJiAodiAhPT0gdW5kZWZpbmVkKSAmJiAodiAhPT0gIiIpKSB7CgkJCQkJdGV4dCArPSBuICsgJzonICsgdiArICc7JzsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdGV4dDsKCQl9LAoJCXN0eWxlc1RvSHRtbDogZnVuY3Rpb24oaW5TdHlsZUhhc2gpIHsKCQkJdmFyIGNzc1RleHQgPSBlbnlvLkNvbnRyb2wuZG9tU3R5bGVzVG9Dc3NUZXh0KGluU3R5bGVIYXNoKTsKCQkJcmV0dXJuIChjc3NUZXh0ID8gJyBzdHlsZT0iJyArIGNzc1RleHQgKyAnIicgOiAiIik7CgkJfSwKCQkvKioKCQkJUmV0dXJucyBwYXNzZWQtaW4gc3RyaW5nIHdpdGggYW1wZXJzYW5kIGFuZCBkb3VibGUgcXVvdGUgY2hhcmFjdGVycwoJCQlyZXBsYWNlZCBieSBIVE1MIGVudGl0aWVzLCBlLmcuLCAnaGVsbG8gZnJvbSAiTWUgJiBTaGUiJyBiZWNvbWVzCgkJCSdoZWxsbyBmcm9tICZhbXA7cXVvdDtNZSAmYW1wO2FtcDsgU2hlJmFtcDtxdW90OycKCQkqLwoJCWVzY2FwZUF0dHJpYnV0ZTogZnVuY3Rpb24oaW5UZXh0KSB7CgkJCXJldHVybiAhZW55by5pc1N0cmluZyhpblRleHQpID8gaW5UZXh0IDogU3RyaW5nKGluVGV4dCkucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoL1wiL2csJyZxdW90OycpOwoJCX0sCgkJYXR0cmlidXRlc1RvSHRtbDogZnVuY3Rpb24oaW5BdHRyaWJ1dGVIYXNoKSB7CgkJCXZhciBuLCB2LCBoID0gJyc7CgkJCWZvciAobiBpbiBpbkF0dHJpYnV0ZUhhc2gpIHsKCQkJCXYgPSBpbkF0dHJpYnV0ZUhhc2hbbl07CgkJCQlpZiAodiAhPT0gbnVsbCAmJiB2ICE9PSBmYWxzZSAmJiB2ICE9PSAiIikgewoJCQkJCWggKz0gJyAnICsgbiArICc9IicgKyBlbnlvLkNvbnRyb2wuZXNjYXBlQXR0cmlidXRlKHYpICsgJyInOwoJCQkJfQoJCQl9CgkJCXJldHVybiBoOwoJCX0KCX0KfSk7CgplbnlvLmRlZmF1bHRDdG9yID0gZW55by5Db250cm9sOwoKZW55by5Db250cm9sLnN1YmNsYXNzID0gZnVuY3Rpb24oY3RvciwgcHJvcHMpIHsKCS8vIENvbnRyb2wgY2xhc3NlcyBtYXkgZGVjbGFyZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGludGVuZGVkCgkvLyB0byBzdGFjayB3aXRoIHN1cGVyY2xhc3MgcHJvcGVydGllcy4KCS8vCgkvLyBXZSByZXNvcnQgdG8gcHJvdG90eXBlIG1hZ2ljIHRvIGFzc2VtYmxlIHRoZXNlIHByb3BlcnRpZXMKCS8vIGF0IGtpbmQgZGVjbGFyYXRpb24gdGltZSwgaW4gdGhlIGludGVyZXN0IG9mIGVmZmljaWVuY3kKCS8vIGFuZCBlYXNlIG9mIHVzZS4KCS8vCgkvLyBIb3dldmVyLCB0aGUgcHJvcGVydGllcyBhcmUgbm8gbG9uZ2VyICdsaXZlJyBpbiBwcm90b3R5cGVzCgkvLyBiZWNhdXNlIG9mIHRoaXMgbWFnaWMtLWkuZS4sIGNoYW5nZXMgdG8gdGhlIHByb3RvdHlwZSBvZgoJLy8gYSBDb250cm9sIHN1YmNsYXNzIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIHJlZmxlY3RlZCBpbgoJLy8gaW5zdGFuY2VzIG9mIHRoYXQgY29udHJvbCAoZS5nLiwgY2hhaW5lZCBwcm90b3R5cGVzKS4KCS8vCgkvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbHNvIHJlbmFtZWQgdG8ga2luZCogdG8gYWxsb3cKCS8vIGNvbWJpbmluZyB3aXRoIGluc3RhbmNlIHByb3BlcnRpZXMuCgkvLwoJdmFyIHByb3RvID0gY3Rvci5wcm90b3R5cGU7CgkvLwoJLy8gJ2tpbmRDbGFzc2VzJyBjb21lcyBlaXRoZXIgZnJvbSBvdXIgaW5oZXJpdGFuY2UgY2hhaW4gKGUuZy4sIHByb3RvJ3MgcHJvdG90eXBlIGNoYWluKQoJLy8gb3IgaGFzIGJlZW4gZm9yY2VkIGJ5IGEga2luZCBkZWNsYXJhdGlvbi4KCS8vCglpZiAocHJvdG8uY2xhc3NlcykgewoJCXZhciBrYyA9IHByb3RvLmtpbmRDbGFzc2VzOwoJCXByb3RvLmtpbmRDbGFzc2VzID0gKGtjID8ga2MgKyAiICIgOiAiIikgKyBwcm90by5jbGFzc2VzOwoJCXByb3RvLmNsYXNzZXMgPSAiIjsKCX0KCWlmIChwcm90by5zdHlsZSkgewoJCXZhciBrcyA9IHByb3RvLmtpbmRTdHlsZTsKCQlwcm90by5raW5kU3R5bGUgPSAoa3MgPyBrcyArICI7IiA6ICIiKSArIHByb3RvLnN0eWxlOwoJCXByb3RvLnN0eWxlID0gIiI7Cgl9CglpZiAocHJvcHMuYXR0cmlidXRlcykgewoJCXZhciBrYSA9IHByb3RvLmtpbmRBdHRyaWJ1dGVzOwoJCXByb3RvLmtpbmRBdHRyaWJ1dGVzID0gZW55by5taXhpbihlbnlvLmNsb25lKGthKSwgcHJvdG8uYXR0cmlidXRlcyk7CgkJcHJvdG8uYXR0cmlidXRlcyA9IG51bGw7Cgl9Cn07CgovLypAcHVibGljCi8qKgoJQWxzbyB1c2FibGUgYXMgX2VueW8uVmlld18uCiovCmVueW8uVmlldyA9IGVueW8uQ29udHJvbDsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/animation.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uKCkgewoJdmFyIG1zID0gTWF0aC5yb3VuZCgxMDAwLzYwKTsKCXZhciBwcmVmaXggPSBbIndlYmtpdCIsICJtb3oiLCAibXMiLCAibyIsICIiXTsKCXZhciByID0gInJlcXVlc3RBbmltYXRpb25GcmFtZSI7Cgl2YXIgYyA9ICJjYW5jZWwiICsgZW55by5jYXAocik7CgkvLyBmYWxsYmFjayBvbiBzZXRUaW1lb3V0IGFuZCBjbGVhclRpbWVvdXQKCXZhciBfcmVxdWVzdEZyYW1lID0gZnVuY3Rpb24oaW5DYWxsYmFjaykgewoJCXJldHVybiB3aW5kb3cuc2V0VGltZW91dChpbkNhbGxiYWNrLCBtcyk7Cgl9OwoJdmFyIF9jYW5jZWxGcmFtZSA9IGZ1bmN0aW9uKGluSWQpIHsKCQlyZXR1cm4gd2luZG93LmNsZWFyVGltZW91dChpbklkKTsKCX07Cglmb3IgKHZhciBpID0gMCwgcGwgPSBwcmVmaXgubGVuZ3RoLCBwLCB3Yywgd3I7IChwID0gcHJlZml4W2ldKSB8fCBpIDwgcGw7IGkrKykgewoJCS8vIGlmIHdlJ3JlIG9uIGlvcyA2IGp1c3QgdXNlIHNldFRpbWVvdXQsIHJlcXVlc3RBbmltYXRpb25GcmFtZSBoYXMgc29tZSBraW5rcyBjdXJyZW50bHkKCQlpZiAoZW55by5wbGF0Zm9ybS5pb3MgPj0gNikgewoJCQlicmVhazsKCQl9CgoJCS8vIGlmIHByZWZpeGVkLCBiZWNvbWVzIFJlcXVlc3QgYW5kIENhbmNlbAoJCXdjID0gcCA/IChwICsgZW55by5jYXAoYykpIDogYzsKCQl3ciA9IHAgPyAocCArIGVueW8uY2FwKHIpKSA6IHI7CgkJLy8gVGVzdCBmb3IgY2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lLCBiZWNhdXNlIHNvbWUgYnJvd3NlcnMgKEZpcmVmaXggNC0xMCkgaGF2ZSBhIHJlcXVlc3Qgd2l0aG91dCBhIGNhbmNlbAoJCWlmICh3aW5kb3dbd2NdKSB7CgkJCV9jYW5jZWxGcmFtZSA9IHdpbmRvd1t3Y107CgkJCV9yZXF1ZXN0RnJhbWUgPSB3aW5kb3dbd3JdOwoJCQlpZiAocCA9PSAid2Via2l0IikgewoJCQkJLyoKCQkJCQlOb3RlOiBJbiBDaHJvbWUsIHRoZSBmaXJzdCByZXR1cm4gdmFsdWUgb2Ygd2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIGlzIDAuCgkJCQkJV2UgbWFrZSAxIGJvZ3VzIGNhbGwgc28gdGhlIGZpcnN0IHVzZWQgcmV0dXJuIHZhbHVlIG9mIHdlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSBpcyA+IDAsIGFzIHRoZSBzcGVjIHJlcXVpcmVzLgoJCQkJCVRoaXMgbWFrZXMgaXQgc28gdGhhdCB0aGUgcmVxdWVzdElkIGlzIGFsd2F5cyB0cnV0aHkuCgkJCQkJKHdlIGNob29zZSB0byBkbyB0aGlzIHJhdGhlciB0aGFuIHdyYXBwaW5nIHRoZSBuYXRpdmUgZnVuY3Rpb24gdG8gYXZvaWQgdGhlIG92ZXJoZWFkKQoJCQkJKi8KCQkJCV9jYW5jZWxGcmFtZShfcmVxdWVzdEZyYW1lKGVueW8ubm9wKSk7CgkJCX0KCQkJYnJlYWs7CgkJfQoJfQoJLyoqCgkJUmVxdWVzdHMgYW4gYW5pbWF0aW9uIGNhbGxiYWNrLgoKCQlPbiBjb21wYXRpYmxlIGJyb3dzZXJzLCBpZiBfaW5Ob2RlXyBpcyBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgd2lsbCBmaXJlIG9ubHkgaWYgX2luTm9kZV8gaXMgdmlzaWJsZS4KCgkJUmV0dXJucyBhIHJlcXVlc3QgaWQgdG8gYmUgdXNlZCB3aXRoIFtlbnlvLmNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZV0oI2VueW8uY2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lKS4KCSovCgllbnlvLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uKGluQ2FsbGJhY2ssIGluTm9kZSkgewoJCXJldHVybiBfcmVxdWVzdEZyYW1lKGluQ2FsbGJhY2ssIGluTm9kZSk7Cgl9OwoJLyoqCgkJQ2FuY2VscyBhIHJlcXVlc3RlZCBhbmltYXRpb24gY2FsbGJhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLgoJKi8KCWVueW8uY2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24oaW5JZCkgewoJCXJldHVybiBfY2FuY2VsRnJhbWUoaW5JZCk7Cgl9Owp9KSgpOwoKLyoqCglBbiBhc3NvcnRtZW50IG9mIGludGVycG9sYXRpb24gZnVuY3Rpb25zIGZvciBhbmltYXRpb25zLgoKCVNpbWlsYXIgaW4gZnVuY3Rpb24gdG8gQ1NTMyB0cmFuc2l0aW9ucy4KCglJbnRlbmRlZCBmb3IgdXNlIHdpdGggW2VueW8uZWFzZWRMZXJwXSgjZW55by5lYXNlZExlcnApCiovCmVueW8uZWFzaW5nID0gewoJY3ViaWNJbjogZnVuY3Rpb24obikgewoJCXJldHVybiBNYXRoLnBvdyhuLCAzKTsKCX0sCgljdWJpY091dDogZnVuY3Rpb24obikgewoJCXJldHVybiBNYXRoLnBvdyhuIC0gMSwgMykgKyAxOwoJfSwKCWV4cG9PdXQ6IGZ1bmN0aW9uKG4pIHsKCQlyZXR1cm4gKG4gPT0gMSkgPyAxIDogKC0xICogTWF0aC5wb3coMiwgLTEwICogbikgKyAxKTsKCX0sCglxdWFkSW5PdXQ6IGZ1bmN0aW9uKG4pewoJCW4gPSBuICogMjsKCQlpZiAobiA8IDEpIHsKCQkJcmV0dXJuIE1hdGgucG93KG4sIDIpIC8gMjsKCQl9CgkJcmV0dXJuIC0xICogKCgtLW4pICogKG4gLSAyKSAtIDEpIC8gMjsKCX0sCglsaW5lYXI6IGZ1bmN0aW9uKG4pIHsKCQlyZXR1cm4gbjsKCX0KfTsKCi8qKgoJR2l2ZXMgYW4gaW50ZXJwb2xhdGlvbiBvZiBhbiBhbmltYXRlZCB0cmFuc2l0aW9uJ3MgZGlzdGFuY2UgZnJvbSAwIHRvIDEuCgoJR2l2ZW4gYSBzdGFydCB0aW1lIChfaW5UMF8pIGFuZCBhbiBhbmltYXRpb24gZHVyYXRpb24gKF9pbkR1cmF0aW9uXyksIGFwcGxpZXMKCXRoZSBfaW5FYXNpbmdfIGZ1bmN0aW9uIHRvIHRoZSBwZXJjZW50YWdlIG9mIHRpbWUgZWxhcHNlZCAvIGR1cmF0aW9uLCBjYXBwZWQKCWF0IDEwMCUuCiovCmVueW8uZWFzZWRMZXJwID0gZnVuY3Rpb24oaW5UMCwgaW5EdXJhdGlvbiwgaW5FYXNpbmcsIHJldmVyc2UpIHsKCXZhciBsZXJwID0gKGVueW8ubm93KCkgLSBpblQwKSAvIGluRHVyYXRpb247CglpZiAocmV2ZXJzZSkgewoJCXJldHVybiBsZXJwID49IDEgPyAwIDogKDEgLSBpbkVhc2luZygxIC0gbGVycCkpOwoJfSBlbHNlIHsKCQlyZXR1cm4gbGVycCA+PSAxID8gMSA6IGluRWFzaW5nKGxlcnApOwoJfQp9OwoKLyoqCglHaXZlcyBhbiBpbnRlcnBvbGF0aW9uIG9mIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24ncyBkaXN0YW5jZSBmcm9tIHN0YXJ0VmFsdWUgdG8gaW5WYWx1ZUNoYW5nZS4KCglBcHBsaWVzIHRoZSBfaW5FYXNpbmdfIGZ1bmN0aW9uIHdpdGggYSB3aWRlciByYW5nZSBvZiB2YXJpYWJsZXMgdG8gYWxsb3cgZm9yIG1vcmUgY29tcGxleCBhbmltYXRpb25zCiovCmVueW8uZWFzZWRDb21wbGV4TGVycCA9IGZ1bmN0aW9uKGluVDAsIGluRHVyYXRpb24sIGluRWFzaW5nLCByZXZlcnNlLCBpblRpbWUsIGluU3RhcnRWYWx1ZSwgaW5WYWx1ZUNoYW5nZSkgewoJdmFyIGxlcnAgPSAoZW55by5ub3coKSAtIGluVDApIC8gaW5EdXJhdGlvbjsKCWlmIChyZXZlcnNlKSB7CgkJcmV0dXJuIGluRWFzaW5nKDEgLSBsZXJwLCBpblRpbWUsIGluU3RhcnRWYWx1ZSwgaW5WYWx1ZUNoYW5nZSwgaW5EdXJhdGlvbik7Cgl9IGVsc2UgewoJCXJldHVybiBpbkVhc2luZyhsZXJwLCBpblRpbWUsIGluU3RhcnRWYWx1ZSwgaW5WYWx1ZUNoYW5nZSwgaW5EdXJhdGlvbik7Cgl9Cn07Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/cordova.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCkxpc3RlbnMgZm9yIENvcmRvdmEgc3BlY2lmaWMgZXZlbnRzCgpFdmVudHMgYXJlIGV4cG9zZWQgdGhyb3VnaCB0aGUgW1NpZ25hbHNdKCNlbnlvLlNpZ25hbHMpIGtpbmQgYnkgYWRkaW5nIGNhbGxiYWNrIGhhbmRsZXJzLgoKRXhhbXBsZToKCmVueW8ua2luZCh7CgluYW1lOiAiQXBwIiwKCWNvbXBvbmVudHM6IFsKCQl7a2luZDogIlNpZ25hbHMiLCBvbmRldmljZXJlYWR5OiAiZGV2aWNlcmVhZHkifSwKCQkuLi4KCQldLAoJZGV2aWNlcmVhZHk6IGZ1bmN0aW9uKCkgewoJLy8gQ29yZG92YSBBUEkgZXhpc3RzIGF0IHRoaXMgcG9pbnQgZm9yd2FyZAoJfQp9KTsKCkxpc3Qgb2YgQ29yZG92YSBldmVudHMgZGV0YWlsZWQgb24gdGhlIFtQaG9uZUdhcCBEb2NzXShodHRwOi8vZG9jcy5waG9uZWdhcC5jb20vZW4vMS42LjAvcGhvbmVnYXBfZXZlbnRzX2V2ZW50cy5tZC5odG1sI0V2ZW50cykKKi8KLy8qIEBwcm90ZWN0ZWQKZW55by5yZWFkeShmdW5jdGlvbigpewoJaWYgKHdpbmRvdy5jb3Jkb3ZhIHx8IHdpbmRvdy5QaG9uZUdhcCkgewoJCXZhciBwZ2UgPSBbCgkJCSJkZXZpY2VyZWFkeSIsCgkJCSJwYXVzZSIsCgkJCSJyZXN1bWUiLAoJCQkib25saW5lIiwKCQkJIm9mZmxpbmUiLAoJCQkiYmFja2J1dHRvbiIsCgkJCSJsb2NhbGVjaGFuZ2UiLAoJCQkiYmF0dGVyeWNyaXRpY2FsIiwKCQkJImJhdHRlcnlsb3ciLAoJCQkiYmF0dGVyeXN0YXR1cyIsCgkJCSJtZW51YnV0dG9uIiwKCQkJInNlYXJjaGJ1dHRvbiIsCgkJCSJzdGFydGNhbGxidXR0b24iLAoJCQkiZW5kY2FsbGJ1dHRvbiIsCgkJCSJ2b2x1bWVkb3duYnV0dG9uIiwKCQkJInZvbHVtZXVwYnV0dG9uIgoJCV07CgkJZm9yICh2YXIgaT0wLCBlOyAoZT1wZ2VbaV0pOyBpKyspIHsKCQkJLy8gc29tZSBjb3Jkb3ZhIGV2ZW50cyBoYXZlIG5vIHR5cGUsIHNvIGVueW8uZGlzcGF0Y2ggZmFpbHMKCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlLCBlbnlvLmJpbmQoZW55by5TaWduYWxzLCAic2VuZCIsICJvbiIgKyBlKSwgZmFsc2UpOwoJCX0KCX0KfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/dispatcher.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qIEBwcm90ZWN0ZWQKCWVueW8uJCA9IHt9OwoKCWVueW8uZGlzcGF0Y2hlciA9IHsKCQkvLyB0aGVzZSBldmVudHMgY29tZSBmcm9tIGRvY3VtZW50CgkJZXZlbnRzOiBbIm1vdXNlZG93biIsICJtb3VzZXVwIiwgIm1vdXNlb3ZlciIsICJtb3VzZW91dCIsICJtb3VzZW1vdmUiLCAibW91c2V3aGVlbCIsCgkJCSJjbGljayIsICJkYmxjbGljayIsICJjaGFuZ2UiLCAia2V5ZG93biIsICJrZXl1cCIsICJrZXlwcmVzcyIsICJpbnB1dCIsCgkJCSJwYXN0ZSIsICJjb3B5IiwgImN1dCJdLAoJCS8vIHRoZXNlIGV2ZW50cyBjb21lIGZyb20gd2luZG93CgkJd2luZG93RXZlbnRzOiBbInJlc2l6ZSIsICJsb2FkIiwgInVubG9hZCIsICJtZXNzYWdlIiwgImhhc2hjaGFuZ2UiXSwKCQkvLyB0aGVzZSBldmVudHMgY29tZSBmcm9tIGNzcwoJCWNzc0V2ZW50czogWyJ3ZWJraXRUcmFuc2l0aW9uRW5kIiwgInRyYW5zaXRpb25lbmQiXSwKCQkvLyBmZWF0dXJlIHBsdWdpbnMgKGFrYSBmaWx0ZXJzKQoJCWZlYXR1cmVzOiBbXSwKCQljb25uZWN0OiBmdW5jdGlvbigpIHsKCQkJdmFyIGQgPSBlbnlvLmRpc3BhdGNoZXIsIGksIG47CgkJCWZvciAoaT0wOyAobj1kLmV2ZW50c1tpXSk7IGkrKykgewoJCQkJZC5saXN0ZW4oZG9jdW1lbnQsIG4pOwoJCQl9CgkJCWZvciAoaT0wOyAobj1kLmNzc0V2ZW50c1tpXSk7IGkrKykgewoJCQkJZC5saXN0ZW4oZG9jdW1lbnQsIG4pOwoJCQl9CgkJCWZvciAoaT0wOyAobj1kLndpbmRvd0V2ZW50c1tpXSk7IGkrKykgewoJCQkJLy8gQ2hyb21lIFBhY2thZ2VkIEFwcHMgZG9uJ3QgbGlrZSAidW5sb2FkIgoJCQkJaWYobiA9PT0gInVubG9hZCIgJiYKCQkJCQkodHlwZW9mIHdpbmRvdy5jaHJvbWUgPT09ICJvYmplY3QiKSAmJgoJCQkJCXdpbmRvdy5jaHJvbWUuYXBwKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJZC5saXN0ZW4od2luZG93LCBuKTsKCQkJfQoJCQlmb3IgKGk9MDsgKG49ZC5jc3NFdmVudHNbaV0pOyBpKyspIHsKCQkJCWQubGlzdGVuKGRvY3VtZW50LCBuKTsKCQkJfQoJCX0sCgkJbGlzdGVuOiBmdW5jdGlvbihpbkxpc3RlbmVyLCBpbkV2ZW50TmFtZSwgaW5IYW5kbGVyKSB7CgkJCXZhciBkID0gZW55by5kaXNwYXRjaDsKCQkJaWYgKGluTGlzdGVuZXIuYWRkRXZlbnRMaXN0ZW5lcikgewoJCQkJdGhpcy5saXN0ZW4gPSBmdW5jdGlvbihpbkxpc3RlbmVyLCBpbkV2ZW50TmFtZSwgaW5IYW5kbGVyKSB7CgkJCQkJaW5MaXN0ZW5lci5hZGRFdmVudExpc3RlbmVyKGluRXZlbnROYW1lLCBpbkhhbmRsZXIgfHwgZCwgZmFsc2UpOwoJCQkJfTsKCQkJfSBlbHNlIHsKCQkJCS8vZW55by5sb2coIklFOCBDT01QQVQ6IHVzaW5nICdhdHRhY2hFdmVudCciKTsKCQkJCXRoaXMubGlzdGVuID0gZnVuY3Rpb24oaW5MaXN0ZW5lciwgaW5FdmVudCwgaW5IYW5kbGVyKSB7CgkJCQkJaW5MaXN0ZW5lci5hdHRhY2hFdmVudCgib24iICsgaW5FdmVudCwgZnVuY3Rpb24oZSkgewoJCQkJCQllLnRhcmdldCA9IGUuc3JjRWxlbWVudDsKCQkJCQkJaWYgKCFlLnByZXZlbnREZWZhdWx0KSB7CgkJCQkJCQllLnByZXZlbnREZWZhdWx0ID0gZW55by5pZVByZXZlbnREZWZhdWx0OwoJCQkJCQl9CgkJCQkJCXJldHVybiAoaW5IYW5kbGVyIHx8IGQpKGUpOwoJCQkJCX0pOwoJCQkJfTsKCQkJfQoJCQl0aGlzLmxpc3Rlbihpbkxpc3RlbmVyLCBpbkV2ZW50TmFtZSwgaW5IYW5kbGVyKTsKCQl9LAoJCXN0b3BMaXN0ZW5pbmc6IGZ1bmN0aW9uKGluTGlzdGVuZXIsIGluRXZlbnROYW1lLCBpbkhhbmRsZXIpIHsKCQkJdmFyIGQgPSBlbnlvLmRpc3BhdGNoOwoJCQlpZiAoaW5MaXN0ZW5lci5hZGRFdmVudExpc3RlbmVyKSB7CgkJCQl0aGlzLnN0b3BMaXN0ZW5pbmcgPSBmdW5jdGlvbihpbkxpc3RlbmVyLCBpbkV2ZW50TmFtZSwgaW5IYW5kbGVyKSB7CgkJCQkJaW5MaXN0ZW5lci5yZW1vdmVFdmVudExpc3RlbmVyKGluRXZlbnROYW1lLCBpbkhhbmRsZXIgfHwgZCwgZmFsc2UpOwoJCQkJfTsKCQkJfSBlbHNlIHsKCQkJCS8vZW55by5sb2coIklFOCBDT01QQVQ6IHVzaW5nICdkZXRhY2hFdmVudCciKTsKCQkJCXRoaXMuc3RvcExpc3RlbmluZyA9IGZ1bmN0aW9uKGluTGlzdGVuZXIsIGluRXZlbnQsIGluSGFuZGxlcikgewoJCQkJCWluTGlzdGVuZXIuZGV0YWNoRXZlbnQoIm9uIiArIGluRXZlbnQsIGluSGFuZGxlciB8fCBkKTsKCQkJCX07CgkJCX0KCQkJdGhpcy5zdG9wTGlzdGVuaW5nKGluTGlzdGVuZXIsIGluRXZlbnROYW1lLCBpbkhhbmRsZXIpOwoJCX0sCgkJLy8qIEZpcmVzIGFuIGV2ZW50IGZvciBFbnlvIHRvIGxpc3RlbiBmb3IuCgkJZGlzcGF0Y2g6IGZ1bmN0aW9uKGUpIHsKCQkJLy8gRmluZCB0aGUgY29udHJvbCB3aG8gbWFwcyB0byBlLnRhcmdldCwgb3IgdGhlIGZpcnN0IGNvbnRyb2wgdGhhdCBtYXBzIHRvIGFuIGFuY2VzdG9yIG9mIGUudGFyZ2V0LgoJCQl2YXIgYyA9IHRoaXMuZmluZERpc3BhdGNoVGFyZ2V0KGUudGFyZ2V0KSB8fCB0aGlzLmZpbmREZWZhdWx0VGFyZ2V0KGUpOwoJCQkvLyBDYWNoZSB0aGUgb3JpZ2luYWwgdGFyZ2V0CgkJCWUuZGlzcGF0Y2hUYXJnZXQgPSBjOwoJCQkvLyBzdXBwb3J0IHBsdWdnYWJsZSBmZWF0dXJlcyByZXR1cm4gdHJ1ZSB0byBhYm9ydCBpbW1lZGlhdGVseSBvciBzZXQgZS5wcmV2ZW50RGlzcGF0Y2ggdG8gYXZvaWQgcHJvY2Vzc2luZy4KCQkJZm9yICh2YXIgaT0wLCBmbjsgKGZuPXRoaXMuZmVhdHVyZXNbaV0pOyBpKyspIHsKCQkJCWlmIChmbi5jYWxsKHRoaXMsIGUpID09PSB0cnVlKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQl9CgkJCWlmIChjICYmICFlLnByZXZlbnREaXNwYXRjaCkgewoJCQkJdGhpcy5kaXNwYXRjaEJ1YmJsZShlLCBjKTsKCQkJfQoJCX0sCgkJLy8qIFRha2VzIGFuIGV2ZW50IHRhcmdldCBhbmQgZmluZHMgdGhlIGNvcnJlc3BvbmRpbmcgRW55byBjb250cm9sLgoJCWZpbmREaXNwYXRjaFRhcmdldDogZnVuY3Rpb24oaW5Ob2RlKSB7CgkJCXZhciB0LCBuID0gaW5Ob2RlOwoJCQkvLyBGSVhNRTogTW96aWxsYTogdHJ5L2NhdGNoIGlzIGhlcmUgdG8gc3F1ZWxjaCAiUGVybWlzc2lvbiBkZW5pZWQgdG8gYWNjZXNzIHByb3BlcnR5IHh4eCBmcm9tIGEgbm9uLWNocm9tZSBjb250ZXh0IgoJCQkvLyB3aGljaCBhcHBlYXJzIHRvIGhhcHBlbiBmb3Igc2Nyb2xsYmFyIG5vZGVzIGluIHBhcnRpY3VsYXIuIEl0J3MgdW5jbGVhciB3aHkgdGhvc2Ugbm9kZXMgYXJlIHZhbGlkIHRhcmdldHMgaWYKCQkJLy8gaXQgaXMgaWxsZWdhbCB0byBpbnRlcnJvZ2F0ZSB0aGVtLiBXb3VsZCBsaWtlIHRvIHRyYXAgdGhlIGJhZCBub2RlcyBleHBsaWNpdGx5IHJhdGhlciB0aGFuIHVzaW5nIGFuIGV4Y2VwdGlvbiBibG9jay4KCQkJdHJ5IHsKCQkJCXdoaWxlIChuKSB7CgkJCQkJaWYgKCh0ID0gZW55by4kW24uaWRdKSkgewoJCQkJCQkvLyB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBub2RlcyB3aXRoIHRoaXMgaWQsIHRoZSByZWxldmFudCBub2RlIGZvciB0aGlzIGV2ZW50IGlzIG4KCQkJCQkJLy8gd2UgZG9uJ3QgcHVzaCB0aGlzIGRpcmVjdGx5IHRvIHQubm9kZSBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBhcmUganVzdCBhc2tpbmcgd2hhdAoJCQkJCQkvLyB0aGUgdGFyZ2V0ICd3b3VsZCBiZScgKGFrYSwgY2FsbGluZyBmaW5kRGlzcGF0Y2hUYXJnZXQgZnJvbSBoYW5kbGVNb3VzZU92ZXJPdXQpCgkJCQkJCXQuZXZlbnROb2RlID0gbjsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJCW4gPSBuLnBhcmVudE5vZGU7CgkJCQl9CgkJCX0gY2F0Y2goeCkgewoJCQkJZW55by5sb2coeCwgbik7CgkJCX0KCQkJcmV0dXJuIHQ7CgkJfSwKCQkvLyogUmV0dXJucyB0aGUgZGVmYXVsdCBFbnlvIGNvbnRyb2wgZm9yIGV2ZW50cy4KCQlmaW5kRGVmYXVsdFRhcmdldDogZnVuY3Rpb24oZSkgewoJCQlyZXR1cm4gZW55by5tYXN0ZXI7CgkJfSwKCQlkaXNwYXRjaEJ1YmJsZTogZnVuY3Rpb24oZSwgYykgewoJCQlyZXR1cm4gYy5idWJibGUoIm9uIiArIGUudHlwZSwgZSwgYyk7CgkJfQoJfTsKCgkvLyBDYWxsZWQgaW4gdGhlIGNvbnRleHQgb2YgYW4gZXZlbnQKCWVueW8uaWVQcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKCkgewoJCXRyeSB7CgkJCXRoaXMucmV0dXJuVmFsdWUgPSBmYWxzZTsKCQl9CgkJY2F0Y2goZSkgewoJCQkvLyBkbyBub3RoaW5nCgkJfQoJfTsKCgllbnlvLmRpc3BhdGNoID0gZnVuY3Rpb24oaW5FdmVudCkgewoJCXJldHVybiBlbnlvLmRpc3BhdGNoZXIuZGlzcGF0Y2goaW5FdmVudCk7Cgl9OwoKCWVueW8uYnViYmxlID0gZnVuY3Rpb24oaW5FdmVudCkgewoJCS8vICd8fCB3aW5kb3cuZXZlbnQnIGNsYXVzZSBuZWVkZWQgZm9yIElFOAoJCXZhciBlID0gaW5FdmVudCB8fCB3aW5kb3cuZXZlbnQ7CgkJaWYgKGUpIHsKCQkJLy8gV2UgZGVwZW5kIG9uIGUudGFyZ2V0IGV4aXN0aW5nIGZvciBldmVudCB0cmFja2luZyBhbmQgZGlzcGF0Y2hpbmcuCgkJCWlmICghZS50YXJnZXQpIHsKCQkJCWUudGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoJCQl9CgkJCWVueW8uZGlzcGF0Y2goZSk7CgkJfQoJfTsKCgkvLyBUaGlzIHN0cmluZyBpcyBzZXQgb24gZXZlbnQgaGFuZGxlcnMgYXR0cmlidXRlcyBmb3IgRE9NIGVsZW1lbnRzIHRoYXQKCS8vIGRvbid0IG5vcm1hbGx5IGJ1YmJsZSAobGlrZSBvbnNjcm9sbCkgc28gdGhhdCB0aGV5IGNhbiBwYXJ0aWNpcGF0ZSBpbiB0aGUKCS8vIEVueW8gZXZlbnQgc3lzdGVtLgoJZW55by5idWJibGVyID0gImVueW8uYnViYmxlKGFyZ3VtZW50c1swXSkiOwoKCS8vIFRoZSBjb2RlIGJlbG93IGhlbHBzIG1ha2UgRW55byBjb21wYXRpYmxlIHdpdGggR29vZ2xlIFBhY2thZ2VkIEFwcHMKCS8vIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5KGh0dHA6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL2NvbnRlbnRTZWN1cml0eVBvbGljeS5odG1sKSwKCS8vIHdoaWNoLCBhbW9uZyBvdGhlciB0aGluZ3MsIGZvcmJpZHMgdGhlIHVzZSBvZiBpbmxpbmUgc2NyaXB0cy4KCS8vIFdlIHJlcGxhY2Ugb25saW5lIHNjcmlwdGluZyB3aXRoIGVxdWl2YWxlbnQgbWVhbnMsIGxlYXZpbmcgZW55by5idWJibGVyCgkvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KCShmdW5jdGlvbigpIHsKCQl2YXIgYnViYmxlVXAgPSBmdW5jdGlvbigpIHsKCQkJZW55by5idWJibGUoYXJndW1lbnRzWzBdKTsKCQl9OwoKCQkvKioKCQkJTWFrZXMgZ2l2ZW4gZXZlbnRzIGJ1YmJsZSBvbiBhIHNwZWNpZmllZCBFbnlvIGNvbnRyb2wuCgkJKi8KCQllbnlvLm1ha2VCdWJibGUgPSBmdW5jdGlvbigpIHsKCQkJdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApLAoJCQkJY29udHJvbCA9IGFyZ3Muc2hpZnQoKTsKCgkJCWlmKCh0eXBlb2YgY29udHJvbCA9PT0gIm9iamVjdCIpICYmICh0eXBlb2YgY29udHJvbC5oYXNOb2RlID09PSAiZnVuY3Rpb24iKSkgewoJCQkJZW55by5mb3JFYWNoKGFyZ3MsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQkJaWYodGhpcy5oYXNOb2RlKCkpIHsKCQkJCQkJZW55by5kaXNwYXRjaGVyLmxpc3Rlbih0aGlzLm5vZGUsIGV2ZW50LCBidWJibGVVcCk7CgkJCQkJfQoJCQkJfSwgY29udHJvbCk7CgkJCX0KCQl9OwoJCS8qKgoJCQlSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5pbmcgYW5kIGJ1YmJsaW5nIGluaXRpYXRlZCBieSBfZW55by5tYWtlQnViYmxlKClfCgkJCW9uIGEgc3BlY2lmaWMgY29udHJvbC4KCQkgKi8KCQllbnlvLnVubWFrZUJ1YmJsZSA9IGZ1bmN0aW9uKCkgewoJCQl2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCksCgkJCQljb250cm9sID0gYXJncy5zaGlmdCgpOwoKCQkJaWYoKHR5cGVvZiBjb250cm9sID09PSAib2JqZWN0IikgJiYgKHR5cGVvZiBjb250cm9sLmhhc05vZGUgPT09ICJmdW5jdGlvbiIpKSB7CgkJCQllbnlvLmZvckVhY2goYXJncywgZnVuY3Rpb24oZXZlbnQpIHsKCQkJCQlpZih0aGlzLmhhc05vZGUoKSkgewoJCQkJCQllbnlvLmRpc3BhdGNoZXIuc3RvcExpc3RlbmluZyh0aGlzLm5vZGUsIGV2ZW50LCBidWJibGVVcCk7CgkJCQkJfQoJCQkJfSwgY29udHJvbCk7CgkJCX0KCQl9OwoJfSkoKTsKCgkvLyBGSVhNRTogd2UgbmVlZCB0byBjcmVhdGUgYW5kIGluaXRpYWxpemUgZGlzcGF0Y2hlciBzb21lcGxhY2UgZWxzZSB0byBhbGxvdyBvdmVycmlkZXMKCWVueW8ucmVxdWlyZXNXaW5kb3coZW55by5kaXNwYXRjaGVyLmNvbm5lY3QpOwoKCS8vIGdlbmVyYXRlIGEgdGFwcGVkIGV2ZW50IGZvciBhIHJhdy1jbGljayBldmVudAoJZW55by5kaXNwYXRjaGVyLmZlYXR1cmVzLnB1c2goCgkJZnVuY3Rpb24gKGUpIHsKCQkJaWYgKCJjbGljayIgPT09IGUudHlwZSkgewoJCQkJaWYgKGUuY2xpZW50WCA9PT0gMCAmJiBlLmNsaWVudFkgPT09IDApIHsKCQkJCQkvLyB0aGlzIGFsbG93cyB0aGUgY2xpY2sgdG8gZGlzcGF0Y2ggYXMgd2VsbAoJCQkJCS8vIGJ1dCBub3RlIHRoZSB0YXAgZXZlbnQgd2lsbCBmaXJlIGZpcnN0CgkJCQkJdmFyIGNwID0gZW55by5jbG9uZShlKTsKCQkJCQljcC50eXBlID0gInRhcCI7CgkJCQkJZW55by5kaXNwYXRjaChjcCk7CgkJCQl9CgkJCX0KCQl9CgkpOwoJCn0pKGVueW8pOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/dom.css"
Content-Type: application/octet-stream; x-encoding=base64
LyogdGhpbmdzIHdlIGFsd2F5cyB3YW50ICovCmJvZHkgewoJZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsICdOaW1idXMgU2FucyBMJywgQXJpYWwsIHNhbnMtc2VyaWY7Cn0KCi8qIGFsbG93IGh3LWFjY2VsZXJhdGVkIHNjcm9sbGluZyBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGl0ICovCmJvZHkud2Via2l0T3ZlcmZsb3dTY3JvbGxpbmcgewoJLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwp9CgovKiBmb3IgYXBwcyAqLwouZW55by1kb2N1bWVudC1maXQgewoJbWFyZ2luOiAwOwoJaGVpZ2h0OiAxMDAlOwoJLyogbm90ZTogZ2l2aW5nIGh0bWwgb3ZlcmZsb3c6IGF1dG8gaXMgb2RkIGFuZCB3YXMgb25seSBldmVyIGRvbmUgdG8gYXZvaWQgZHVwbGljYXRpb24KCQlob3dldmVyLCBhbmRyb2lkIDQuMDQgc29tZXRpbWVzIGRvZXMgbm90IGhpZGUgbm9kZXMgd2hlbiB0aGVpciBkaXNwbGF5IGlzIHNldCB0byBub25lCgkJaWYgZG9jdW1lbnQgaXMgb3ZlcmZsb3cgYXV0by4KCSovCglwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5lbnlvLWJvZHktZml0IHsKCW1hcmdpbjogMDsKCWhlaWdodDogMTAwJTsKCS8qIGhlbHBzIHByZXZlbnQgaW9zIHBhZ2Ugc2Nyb2xsICovCglvdmVyZmxvdzogYXV0bzsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmVueW8tbm8tdG91Y2gtYWN0aW9uIHsKCS1tcy10b3VjaC1hY3Rpb246IG5vbmU7Cn0KCi8qIHJlc2V0ICovCgpidXR0b24gewoJZm9udC1zaXplOiBpbmhlcml0OwoJZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi8qIHVzZXIgc2VsZWN0aW9uICovCgouZW55by11bnNlbGVjdGFibGUgewoJY3Vyc29yOiBkZWZhdWx0OwoJLW1zLXVzZXItc2VsZWN0OiBub25lOwoJLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKCS1tb3otdXNlci1zZWxlY3Q6IC1tb3otbm9uZTsKCXVzZXItc2VsZWN0OiBub25lOwp9CgouZW55by11bnNlbGVjdGFibGU6OnNlbGVjdGlvbiwgLmVueW8tdW5zZWxlY3RhYmxlIDo6c2VsZWN0aW9uIHsKCWNvbG9yOiB0cmFuc3BhcmVudDsKfQoKLmVueW8tc2VsZWN0YWJsZSB7CgljdXJzb3I6IGF1dG87CgktbXMtdXNlci1zZWxlY3Q6IGVsZW1lbnQ7Cgktd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0OwoJLW1vei11c2VyLXNlbGVjdDogdGV4dDsKCXVzZXItc2VsZWN0OiB0ZXh0Owp9CgouZW55by1zZWxlY3RhYmxlOjpzZWxlY3Rpb24sIC5lbnlvLXNlbGVjdGFibGUgOjpzZWxlY3Rpb24gewoJYmFja2dyb3VuZDogIzMyOTdGRDsKCWNvbG9yOiAjRkZGOwp9CgovKiBsYXlvdXQgKi8KCmJvZHkgLmVueW8tZml0IHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCWxlZnQ6IDA7Cgl0b3A6IDA7CglyaWdodDogMDsKCWJvdHRvbTogMDsKfQoKLmVueW8tY2xpcCB7CglvdmVyZmxvdzogaGlkZGVuOwp9CgouZW55by1ib3JkZXItYm94IHsKCS13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKCS1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKCWJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi8qIGNvbXBvc2l0aW5nICovCgouZW55by1jb21wb3NpdGUgewoJLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CgktbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKCS1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7Cgktby10cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7Cgl0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7Cn0KCi8qIEZ1bGxzY3JlZW4gQ1NTICovCjotd2Via2l0LWZ1bGwtc2NyZWVuIHsKCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CgloZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKfQo6LW1vei1mdWxsLXNjcmVlbiB7Cgl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwoJaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7Cn0KOi1tcy1mdWxsLXNjcmVlbiB7Cgl3aWR0aDogMTAwJSAhaW1wb3J0YW50OwoJaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7Cn0KOi1vLWZ1bGwtc2NyZWVuIHsKCXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CgloZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKfQo6ZnVsbC1zY3JlZW4gewoJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKCWhlaWdodDogMTAwJSAhaW1wb3J0YW50Owp9Ci8qIEZhbGxiYWNrIEZ1bGxzY3JlZW4gQ1NTICovCmJvZHkgLmVueW8tZnVsbHNjcmVlbiB7Cglwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKCWxlZnQ6IDAgIWltcG9ydGFudDsKCXRvcDogMCAhaW1wb3J0YW50OwoJcmlnaHQ6IDAgIWltcG9ydGFudDsKCWJvdHRvbTogMCAhaW1wb3J0YW50OwoJd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKCWhlaWdodDogMTAwJSAhaW1wb3J0YW50OwoJYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50Owp9Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/dom.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwdWJsaWMKCi8qKgoJQWxsb3cgYm9vdHN0cmFwcGluZyBpbiBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QgcmlnaHQgYXdheS4KKi8KZW55by5yZXF1aXJlc1dpbmRvdyA9IGZ1bmN0aW9uKGluRnVuY3Rpb24pIHsKCWluRnVuY3Rpb24oKTsKfTsKCmVueW8uZG9tID0gewoJLyoqCgkJU2hvcnRjdXQgZm9yIF9kb2N1bWVudC5nZXRFbGVtZW50QnlJZF8gaWYgX2lkXyBpcyBhIHN0cmluZywgb3RoZXJ3aXNlIHJldHVybnMgX2lkXy4KCQlVc2VzIF93aW5kb3cuZG9jdW1lbnRfIHVubGVzcyBhIGRvY3VtZW50IGlzIHNwZWNpZmllZCBpbiB0aGUgKG9wdGlvbmFsKSBfZG9jXwoJCXBhcmFtZXRlci4KCgkJCS8vIGZpbmQgJ25vZGUnIGlmIGl0J3MgYSBzdHJpbmcgaWQsIG9yIHJldHVybiBpdCB1bmNoYW5nZWQgaWYgaXQncyBhbHJlYWR5IGEgbm9kZSByZWZlcmVuY2UKCQkJdmFyIGRvbU5vZGUgPSBlbnlvLmRvbS5ieUlkKG5vZGUpOwoJKi8KCWJ5SWQ6IGZ1bmN0aW9uKGlkLCBkb2MpewoJCXJldHVybiAodHlwZW9mIGlkID09ICJzdHJpbmciKSA/IChkb2MgfHwgZG9jdW1lbnQpLmdldEVsZW1lbnRCeUlkKGlkKSA6IGlkOwoJfSwKCS8qKgoJCXJldHVybiBzdHJpbmcgd2l0aCBhbXBlcnNhbmQsIGxlc3MtdGhhbiwgYW5kIGdyZWF0ZXItdGhhbiBjaGFyYWN0ZXJzCgkJcmVwbGFjZWQgd2l0aCBIVE1MIGVudGl0aWVzLCBlLmcuCgoJCQknJmx0O2NvZGUmZ3Q7IlRoaXMgJmFtcDsgVGhhdCImbHQ7L2NvZGUmZ3Q7JwoKCQliZWNvbWVzCgoJCQknJmFtcDtsdDtjb2RlJmFtcDtndDsiVGhpcyAmYW1wO2FtcDsgVGhhdCImYW1wO2x0Oy9jb2RlJmFtcDtndDsnCgkqLwoJZXNjYXBlOiBmdW5jdGlvbihpblRleHQpIHsKCQlyZXR1cm4gaW5UZXh0ICE9PSBudWxsID8gU3RyaW5nKGluVGV4dCkucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLzwvZywnJmx0OycpLnJlcGxhY2UoLz4vZywnJmd0OycpIDogJyc7Cgl9LAoJLyoqCgkJUmV0dXJucyBhbiBvYmplY3QgZGVzY3JpYmluZyB0aGUgZ2VvbWV0cnkgb2YgdGhpcyBub2RlLCBsaWtlIHNvOgoKCQkJe2xlZnQ6IF9vZmZzZXRMZWZ0XywgdG9wOiBfb2Zmc2V0VG9wXywgd2lkdGg6IF9vZmZzZXRXaWR0aF8sIGhlaWdodDogX29mZnNldEhlaWdodF99CgkqLwoJZ2V0Qm91bmRzOiBmdW5jdGlvbihuKSB7CgkJaWYgKG4pIHsKCQkJcmV0dXJuIHtsZWZ0OiBuLm9mZnNldExlZnQsIHRvcDogbi5vZmZzZXRUb3AsIHdpZHRoOiBuLm9mZnNldFdpZHRoLCBoZWlnaHQ6IG4ub2Zmc2V0SGVpZ2h0fTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBudWxsOwoJCX0KCX0sCgkvLyogQHByb3RlY3RlZAoJLy8gdGhpcyBpcyBkZXNpZ25lZCB0byBiZSBjb3BpZWQgaW50byB0aGUgY29tcHV0ZWRTdHlsZSBvYmplY3QKCV9pZThHZXRDb21wdXRlZFN0eWxlOiBmdW5jdGlvbihwcm9wKSB7CgkJdmFyIHJlID0gLyhcLShbYS16XSl7MX0pL2c7CgkJaWYgKHByb3AgPT09ICdmbG9hdCcpIHsKCQkJcHJvcCA9ICdzdHlsZUZsb2F0JzsKCQl9IGVsc2UgaWYgKHJlLnRlc3QocHJvcCkpIHsKCQkJcHJvcCA9IHByb3AucmVwbGFjZShyZSwgZnVuY3Rpb24gKCkgewoJCQkJcmV0dXJuIGFyZ3VtZW50c1syXS50b1VwcGVyQ2FzZSgpOwoJCQl9KTsKCQl9CgkJcmV0dXJuIHRoaXNbcHJvcF0gIT09IHVuZGVmaW5lZCA/IHRoaXNbcHJvcF0gOiBudWxsOwoJfSwKCWdldENvbXB1dGVkU3R5bGU6IGZ1bmN0aW9uKGluTm9kZSkgewoJCWlmKGVueW8ucGxhdGZvcm0uaWUgPCA5ICYmIGluTm9kZSAmJiBpbk5vZGUuY3VycmVudFN0eWxlKSB7CgkJCS8vc2ltcGxlIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlIHBvbHlmaWxsIGZvciBJRTgKCQkJdmFyIGNvbXB1dGVkU3R5bGUgPSBlbnlvLmNsb25lKGluTm9kZS5jdXJyZW50U3R5bGUpOwoJCQljb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUgPSB0aGlzLl9pZThHZXRDb21wdXRlZFN0eWxlOwoJCQljb21wdXRlZFN0eWxlLnNldFByb3BlcnR5ID0gZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gaW5Ob2RlLmN1cnJlbnRTdHlsZS5zZXRFeHByZXNzaW9uLmFwcGx5KGluTm9kZS5jdXJyZW50U3R5bGUsIGFyZ3VtZW50cyk7CgkJCX07CgkJCWNvbXB1dGVkU3R5bGUucmVtb3ZlUHJvcGVydHkgPSBmdW5jdGlvbigpIHsKCQkJCXJldHVybiBpbk5vZGUuY3VycmVudFN0eWxlLnJlbW92ZUF0dHJpYnV0ZS5hcHBseShpbk5vZGUuY3VycmVudFN0eWxlLCBhcmd1bWVudHMpOwoJCQl9OwoJCQlyZXR1cm4gY29tcHV0ZWRTdHlsZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUgJiYgaW5Ob2RlICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGluTm9kZSwgbnVsbCk7CgkJfQoJfSwKCWdldENvbXB1dGVkU3R5bGVWYWx1ZTogZnVuY3Rpb24oaW5Ob2RlLCBpblByb3BlcnR5LCBpbkNvbXB1dGVkU3R5bGUpIHsKCQl2YXIgcyAgID0gaW5Db21wdXRlZFN0eWxlIHx8IHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZShpbk5vZGUpLAoJCQluSUUgPSBlbnlvLnBsYXRmb3JtLmllOwoKCQlzID0gcyA/IHMuZ2V0UHJvcGVydHlWYWx1ZShpblByb3BlcnR5KSA6IG51bGw7CgoJCWlmIChuSUUpIHsKCQkJdmFyIG9Db252ZXJzaW9uID0gewoJCQkJJ3RoaW4nICAgOiAobklFID4gOCA/IDIgOiAxKSArICdweCcsCgkJCQknbWVkaXVtJyA6IChuSUUgPiA4ID8gNCA6IDMpICsgJ3B4JywKCQkJCSd0aGljaycgIDogKG5JRSA+IDggPyA2IDogNSkgKyAncHgnLAoJCQkJJ25vbmUnICAgOiAnMCcKCQkJfTsKCQkJaWYgKHR5cGVvZiBvQ29udmVyc2lvbltzXSAhPSAndW5kZWZpbmVkJykgewoJCQkJcyA9IG9Db252ZXJzaW9uW3NdOwoJCQl9CgoJCQlpZiAocyA9PSAnYXV0bycpIHsKCQkJCXN3aXRjaCAoaW5Qcm9wZXJ0eSkgewoJCQkJY2FzZSAnd2lkdGgnOgoJCQkJCXMgPSBpbk5vZGUub2Zmc2V0V2lkdGg7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdoZWlnaHQnOgoJCQkJCXMgPSBpbk5vZGUub2Zmc2V0SGVpZ2h0OwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gczsKCX0sCglnZXRGaXJzdEVsZW1lbnRCeVRhZ05hbWU6IGZ1bmN0aW9uKGluVGFnTmFtZSkgewoJCXZhciBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaW5UYWdOYW1lKTsKCQlyZXR1cm4gZSAmJiBlWzBdOwoJfSwKCWFwcGx5Qm9keUZpdDogZnVuY3Rpb24oKSB7CgkJdmFyIGggPSB0aGlzLmdldEZpcnN0RWxlbWVudEJ5VGFnTmFtZSgiaHRtbCIpOwoJCWlmIChoKSB7CgkJCWguY2xhc3NOYW1lICs9ICIgZW55by1kb2N1bWVudC1maXQiOwoJCX0KCQl2YXIgYiA9IHRoaXMuZ2V0Rmlyc3RFbGVtZW50QnlUYWdOYW1lKCJib2R5Iik7CgkJaWYgKGIpIHsKCQkJYi5jbGFzc05hbWUgKz0gIiBlbnlvLWJvZHktZml0IjsKCQl9CgkJZW55by5ib2R5SXNGaXR0aW5nID0gdHJ1ZTsKCX0sCglnZXRXaW5kb3dXaWR0aDogZnVuY3Rpb24oKSB7CgkJaWYgKHdpbmRvdy5pbm5lcldpZHRoKSB7CgkJCXJldHVybiB3aW5kb3cuaW5uZXJXaWR0aDsKCQl9CgkJaWYgKGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCkgewoJCQlyZXR1cm4gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDsKCQl9CgkJaWYgKGRvY3VtZW50LmNvbXBhdE1vZGU9PSdDU1MxQ29tcGF0JyAmJgoJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYKCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoICkgewoJCQlyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoOwoJCX0KCQlyZXR1cm4gMzIwOwoJfSwKCWdldFdpbmRvd0hlaWdodDogZnVuY3Rpb24oKSB7CgkJaWYgKHdpbmRvdy5pbm5lckhlaWdodCkgewoJCQlyZXR1cm4gd2luZG93LmlubmVySGVpZ2h0OwoJCX0KCQlpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgewoJCQlyZXR1cm4gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7CgkJfQoJCWlmIChkb2N1bWVudC5jb21wYXRNb2RlPT0nQ1NTMUNvbXBhdCcgJiYKCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmCgkJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQgKSB7CgkJCXJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0OwoJCX0KCQlyZXR1cm4gNDgwOwoJfSwKCS8vIFdvcmthcm91bmQgZm9yIGxhY2sgb2YgY29tcGFyZURvY3VtZW50UG9zaXRpb24gc3VwcG9ydCBpbiBJRTgKCS8vIENvZGUgTUlUIExpY2Vuc2VkLCBKb2huIFJlc2lnOyBzb3VyY2U6IGh0dHA6Ly9lam9obi5vcmcvYmxvZy9jb21wYXJpbmctZG9jdW1lbnQtcG9zaXRpb24vCgljb21wYXJlRG9jdW1lbnRQb3NpdGlvbjogZnVuY3Rpb24oYSwgYikgewoJCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8KCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpIDoKCQlhLmNvbnRhaW5zID8KCQkJKGEgIT0gYiAmJiBhLmNvbnRhaW5zKGIpICYmIDE2KSArCgkJCShhICE9IGIgJiYgYi5jb250YWlucyhhKSAmJiA4KSArCgkJCShhLnNvdXJjZUluZGV4ID49IDAgJiYgYi5zb3VyY2VJbmRleCA+PSAwID8KCQkJCShhLnNvdXJjZUluZGV4IDwgYi5zb3VyY2VJbmRleCAmJiA0KSArCgkJCQkoYS5zb3VyY2VJbmRleCA+IGIuc291cmNlSW5kZXggJiYgMikgOgoJCQkJMSkgKwoJCQkwIDoKCQkJMDsKCX0sCgkvLyBtb3ZlZCBmcm9tIEZpdHRhYmxlTGF5b3V0LmpzIGludG8gY29tbW9uIHByb3RlY3RlZCBjb2RlCglfaWVDc3NUb1BpeGVsVmFsdWU6IGZ1bmN0aW9uKGluTm9kZSwgaW5WYWx1ZSkgewoJCXZhciB2ID0gaW5WYWx1ZTsKCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCgkJLy8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQoJCXZhciBzID0gaW5Ob2RlLnN0eWxlOwoJCS8vIHN0b3JlIHN0eWxlIGFuZCBydW50aW1lIHN0eWxlIHZhbHVlcwoJCXZhciBsID0gcy5sZWZ0OwoJCXZhciBybCA9IGluTm9kZS5ydW50aW1lU3R5bGUgJiYgaW5Ob2RlLnJ1bnRpbWVTdHlsZS5sZWZ0OwoJCS8vIHRoZW4gcHV0IGN1cnJlbnQgc3R5bGUgaW4gcnVudGltZSBzdHlsZS4KCQlpZiAocmwpIHsKCQkJaW5Ob2RlLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gaW5Ob2RlLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCX0KCQkvLyBhcHBseSBnaXZlbiB2YWx1ZSBhbmQgbWVhc3VyZSBpdHMgcGl4ZWwgdmFsdWUKCQlzLmxlZnQgPSB2OwoJCXYgPSBzLnBpeGVsTGVmdDsKCQkvLyBmaW5hbGx5IHJlc3RvcmUgcHJldmlvdXMgc3RhdGUKCQlzLmxlZnQgPSBsOwoJCWlmIChybCkgewoJCQlzLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcmw7CgkJfQoJCXJldHVybiB2OwoJfSwKCV9weE1hdGNoOiAvcHgvaSwKCWdldENvbXB1dGVkQm94VmFsdWU6IGZ1bmN0aW9uKGluTm9kZSwgaW5Qcm9wLCBpbkJvdW5kYXJ5LCBpbkNvbXB1dGVkU3R5bGUpIHsKCQl2YXIgcyA9IGluQ29tcHV0ZWRTdHlsZSB8fCB0aGlzLmdldENvbXB1dGVkU3R5bGUoaW5Ob2RlKTsKCQlpZiAocykgewoJCQl2YXIgcCA9IHMuZ2V0UHJvcGVydHlWYWx1ZShpblByb3AgKyAiLSIgKyBpbkJvdW5kYXJ5KTsKCQkJcmV0dXJuIHAgPT09ICJhdXRvIiA/IDAgOiBwYXJzZUludChwLCAxMCk7CgkJfSBlbHNlIGlmIChpbk5vZGUgJiYgaW5Ob2RlLmN1cnJlbnRTdHlsZSkgewoJCQl2YXIgdiA9IGluTm9kZS5jdXJyZW50U3R5bGVbaW5Qcm9wICsgZW55by5jYXAoaW5Cb3VuZGFyeSldOwoJCQlpZiAoIXYubWF0Y2godGhpcy5fcHhNYXRjaCkpIHsKCQkJCXYgPSB0aGlzLl9pZUNzc1RvUGl4ZWxWYWx1ZShpbk5vZGUsIHYpOwoJCQl9CgkJCXJldHVybiBwYXJzZUludCh2LCAwKTsKCQl9CgkJcmV0dXJuIDA7Cgl9LAoJLy8qIEBwdWJsaWMKCS8vKiBHZXRzIHRoZSBib3VuZGFyaWVzIG9mIGEgbm9kZSdzIG1hcmdpbiBvciBwYWRkaW5nIGJveC4KCWNhbGNCb3hFeHRlbnRzOiBmdW5jdGlvbihpbk5vZGUsIGluQm94KSB7CgkJdmFyIHMgPSB0aGlzLmdldENvbXB1dGVkU3R5bGUoaW5Ob2RlKTsKCQlyZXR1cm4gewoJCQl0b3A6IHRoaXMuZ2V0Q29tcHV0ZWRCb3hWYWx1ZShpbk5vZGUsIGluQm94LCAidG9wIiwgcyksCgkJCXJpZ2h0OiB0aGlzLmdldENvbXB1dGVkQm94VmFsdWUoaW5Ob2RlLCBpbkJveCwgInJpZ2h0IiwgcyksCgkJCWJvdHRvbTogdGhpcy5nZXRDb21wdXRlZEJveFZhbHVlKGluTm9kZSwgaW5Cb3gsICJib3R0b20iLCBzKSwKCQkJbGVmdDogdGhpcy5nZXRDb21wdXRlZEJveFZhbHVlKGluTm9kZSwgaW5Cb3gsICJsZWZ0IiwgcykKCQl9OwoJfSwKCS8vKiBHZXRzIHRoZSBjYWxjdWxhdGVkIHBhZGRpbmcgb2YgYSBub2RlLgoJY2FsY1BhZGRpbmdFeHRlbnRzOiBmdW5jdGlvbihpbk5vZGUpIHsKCQlyZXR1cm4gdGhpcy5jYWxjQm94RXh0ZW50cyhpbk5vZGUsICJwYWRkaW5nIik7Cgl9LAoJLy8qIEdldHMgdGhlIGNhbGN1bGF0ZWQgbWFyZ2luIG9mIGEgbm9kZS4KCWNhbGNNYXJnaW5FeHRlbnRzOiBmdW5jdGlvbihpbk5vZGUpIHsKCQlyZXR1cm4gdGhpcy5jYWxjQm94RXh0ZW50cyhpbk5vZGUsICJtYXJnaW4iKTsKCX0sCgkvKioKCQlSZXR1cm5zIGFuIG9iamVjdCBsaWtlIGB7dG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IDEwMCwgcmlnaHQ6IDEwMCwgaGVpZ2h0OiAxMCwgd2lkdGg6IDEwfWAKCQl0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIHBvc2l0aW9uIHJlbGF0aXZlIHRvIGByZWxhdGl2ZVRvTm9kZWAgKHN1aXRhYmxlIGZvciBhYnNvbHV0ZQoJCXBvc2l0aW9uaW5nIHdpdGhpbiB0aGF0IHBhcmVudCBub2RlKS4gTmVnYXRpdmUgdmFsdWVzIG1lYW4gcGFydCBvZiB0aGUgb2JqZWN0IGlzIG5vdCB2aXNpYmxlLgoJCUlmIHlvdSBsZWF2ZSBgcmVsYXRpdmVUb05vZGVgIHVuZGVmaW5lZCAob3IgaXQgaXMgbm90IGEgcGFyZW50IGVsZW1lbnQpLCB0aGVuIHRoZSBwb3NpdGlvbgoJCXdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIHZpZXdwb3J0IGFuZCBzdWl0YWJsZSBmb3IgYWJzb2x1dGUgcG9zaXRpb25pbmcgaW4gYSBmbG9hdGluZyBsYXllci4KCSovCgljYWxjTm9kZVBvc2l0aW9uOiBmdW5jdGlvbihpbk5vZGUsIHJlbGF0aXZlVG9Ob2RlKSB7CgkJLy8gUGFyc2UgdXB3YXJkIGFuZCBncmFiIG91ciBwb3NpdGlvbmluZyByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQKCQl2YXIgdG9wID0gMCwKCQkJbGVmdCA9IDAsCgkJCW5vZGUgPSBpbk5vZGUsCgkJCXdpZHRoID0gbm9kZS5vZmZzZXRXaWR0aCwKCQkJaGVpZ2h0ID0gbm9kZS5vZmZzZXRIZWlnaHQsCgkJCXRyYW5zZm9ybVByb3AgPSBlbnlvLmRvbS5nZXRTdHlsZVRyYW5zZm9ybVByb3AoKSwKCQkJeHJlZ2V4ID0gL3RyYW5zbGF0ZVhcKCgtP1xkKylweFwpL2ksCgkJCXlyZWdleCA9IC90cmFuc2xhdGVZXCgoLT9cZCspcHhcKS9pLAoJCQlib3JkZXJMZWZ0ID0gMCwgYm9yZGVyVG9wID0gMCwKCQkJdG90YWxIZWlnaHQgPSAwLCB0b3RhbFdpZHRoID0gMCwKCQkJb2Zmc2V0QWRqdXN0TGVmdCA9IDAsIG9mZnNldEFkanVzdFRvcCA9IDA7CgoJCWlmIChyZWxhdGl2ZVRvTm9kZSkgewoJCQl0b3RhbEhlaWdodCA9IHJlbGF0aXZlVG9Ob2RlLm9mZnNldEhlaWdodDsKCQkJdG90YWxXaWR0aCA9IHJlbGF0aXZlVG9Ob2RlLm9mZnNldFdpZHRoOwoJCX0gZWxzZSB7CgkJCXRvdGFsSGVpZ2h0ID0gKGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5vZmZzZXRIZWlnaHQgPiB0aGlzLmdldFdpbmRvd0hlaWdodCgpID8gdGhpcy5nZXRXaW5kb3dIZWlnaHQoKSAtIGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxUb3AgOiBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0KTsKCQkJdG90YWxXaWR0aCA9IChkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUub2Zmc2V0V2lkdGggPiB0aGlzLmdldFdpbmRvd1dpZHRoKCkgPyB0aGlzLmdldFdpbmRvd1dpZHRoKCkgLSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsTGVmdCA6IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5vZmZzZXRXaWR0aCk7CgkJfQoKCQlpZiAobm9kZS5vZmZzZXRQYXJlbnQpIHsKCQkJZG8gewoJCQkJLy8gQWRqdXN0IHRoZSBvZmZzZXQgaWYgcmVsYXRpdmVUb05vZGUgaXMgYSBjaGlsZCBvZiB0aGUgb2Zmc2V0UGFyZW50CgkJCQkvLyBGb3IgSUUgOCBjb21wYXRpYmlsaXR5LCBoYXZlIHRvIHVzZSBpbnRlZ2VyIDggaW5zdGVhZCBvZiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TCgkJCQlpZiAocmVsYXRpdmVUb05vZGUgJiYgdGhpcy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyZWxhdGl2ZVRvTm9kZSwgbm9kZS5vZmZzZXRQYXJlbnQpICYgOCkgewoJCQkJCW9mZnNldEFkanVzdExlZnQgPSByZWxhdGl2ZVRvTm9kZS5vZmZzZXRMZWZ0OwoJCQkJCW9mZnNldEFkanVzdFRvcCA9IHJlbGF0aXZlVG9Ob2RlLm9mZnNldFRvcDsKCQkJCX0KCQkJCS8vIEFqdXN0IG91ciB0b3AgYW5kIGxlZnQgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHBhcmVudAoJCQkJbGVmdCArPSBub2RlLm9mZnNldExlZnQgLSAobm9kZS5vZmZzZXRQYXJlbnQgPyBub2RlLm9mZnNldFBhcmVudC5zY3JvbGxMZWZ0IDogMCkgLSBvZmZzZXRBZGp1c3RMZWZ0OwoJCQkJaWYgKHRyYW5zZm9ybVByb3AgJiYgeHJlZ2V4LnRlc3Qobm9kZS5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSkpIHsKCQkJCQlsZWZ0ICs9IHBhcnNlSW50KG5vZGUuc3R5bGVbdHJhbnNmb3JtUHJvcF0ucmVwbGFjZSh4cmVnZXgsICckMScpLCAxMCk7CgkJCQl9CgkJCQl0b3AgKz0gbm9kZS5vZmZzZXRUb3AgLSAobm9kZS5vZmZzZXRQYXJlbnQgPyBub2RlLm9mZnNldFBhcmVudC5zY3JvbGxUb3AgOiAwKSAtIG9mZnNldEFkanVzdFRvcDsKCQkJCWlmICh0cmFuc2Zvcm1Qcm9wICYmIHlyZWdleC50ZXN0KG5vZGUuc3R5bGVbdHJhbnNmb3JtUHJvcF0pKSB7CgkJCQkJdG9wICs9IHBhcnNlSW50KG5vZGUuc3R5bGVbdHJhbnNmb3JtUHJvcF0ucmVwbGFjZSh5cmVnZXgsICckMScpLCAxMCk7CgkJCQl9CgkJCQkvLyBOZWVkIHRvIGNvcnJlY3QgZm9yIGJvcmRlcnMgaWYgYW55IGV4aXN0IG9uIHBhcmVudCBlbGVtZW50cwoJCQkJaWYgKG5vZGUgIT09IGluTm9kZSkgewoJCQkJCWlmIChub2RlLmN1cnJlbnRTdHlsZSkgewoJCQkJCQkvLyBPaCBJRSwgd2UgZG8gc28gbG92ZSB3b3JraW5nIGFyb3VuZCB5b3VyIGluY29tcGF0aWJpbGl0aWVzCgkJCQkJCWJvcmRlckxlZnQgPSBwYXJzZUludChub2RlLmN1cnJlbnRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKTsKCQkJCQkJYm9yZGVyVG9wID0gcGFyc2VJbnQobm9kZS5jdXJyZW50U3R5bGUuYm9yZGVyVG9wV2lkdGgsIDEwKTsKCQkJCQl9IGVsc2UgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKSB7CgkJCQkJCWJvcmRlckxlZnQgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCAnJykuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLWxlZnQtd2lkdGgnKSwgMTApOwoJCQkJCQlib3JkZXJUb3AgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCAnJykuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLXRvcC13aWR0aCcpLCAxMCk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gTm8gY29tcHV0ZWQgc3R5bGUgb3B0aW9ucywgc28gdHJ5IHRoZSBub3JtYWwgc3R5bGUgb2JqZWN0IChtdWNoIGxlc3Mgcm9idXN0KQoJCQkJCQlib3JkZXJMZWZ0ID0gcGFyc2VJbnQobm9kZS5zdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKTsKCQkJCQkJYm9yZGVyVG9wID0gcGFyc2VJbnQobm9kZS5zdHlsZS5ib3JkZXJUb3BXaWR0aCwgMTApOwoJCQkJCX0KCQkJCQlpZiAoYm9yZGVyTGVmdCkgewoJCQkJCQlsZWZ0ICs9IGJvcmRlckxlZnQ7CgkJCQkJfQoJCQkJCWlmIChib3JkZXJUb3ApIHsKCQkJCQkJdG9wICs9IGJvcmRlclRvcDsKCQkJCQl9CgkJCQl9CgkJCQkvLyBDb250aW51ZSBpZiB3ZSBoYXZlIGFuIGFkZGl0aW9uYWwgb2Zmc2V0UGFyZW50LCBhbmQgZWl0aGVyIGRvbid0IGhhdmUgYSByZWxhdGl2ZVRvTm9kZSBvciB0aGUgb2Zmc2V0UGFyZW50IGlzIGNvbnRhaW5lZCBieSB0aGUgcmVsYXRpdmVUb05vZGUgKGlmIG9mZnNldFBhcmVudCBjb250YWlucyByZWxhdGl2ZVRvTm9kZSwgdGhlbiB3ZSBoYXZlIGFscmVhZHkgY2FsY3VsYXRlZCB1cCB0byB0aGUgbm9kZSwgYW5kIGNhbiBzYWZlbHkgZXhpdCkKCQkJCS8vIEZvciBJRSA4IGNvbXBhdGliaWxpdHksIGhhdmUgdG8gdXNlIGludGVnZXIgMTYgaW5zdGVhZCBvZiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWQoJCQl9IHdoaWxlICgobm9kZSA9IG5vZGUub2Zmc2V0UGFyZW50KSAmJiAoIXJlbGF0aXZlVG9Ob2RlIHx8IHRoaXMuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocmVsYXRpdmVUb05vZGUsIG5vZGUpICYgMTYpKTsKCQl9CgkJcmV0dXJuIHsKCQkJJ3RvcCc6IHRvcCwKCQkJJ2xlZnQnOiBsZWZ0LAoJCQknYm90dG9tJzogdG90YWxIZWlnaHQgLSB0b3AgLSBoZWlnaHQsCgkJCSdyaWdodCc6IHRvdGFsV2lkdGggLSBsZWZ0IC0gd2lkdGgsCgkJCSdoZWlnaHQnOiBoZWlnaHQsCgkJCSd3aWR0aCc6IHdpZHRoCgkJfTsKCX0sCglzZXRJbm5lckh0bWw6IGZ1bmN0aW9uKG5vZGUsIGh0bWwpIHsKCQlub2RlLmlubmVySFRNTCA9IGh0bWw7Cgl9Cn07CgovLyBvdmVycmlkZSBzZXRJbm5lckh0bWwgZm9yIFdpbmRvd3MgOCBIVE1MIGFwcGxpY2F0aW9ucwppZiAodHlwZW9mIHdpbmRvdy5NU0FwcCAhPT0gInVuZGVmaW5lZCIpIHsKCWVueW8uZG9tLnNldElubmVySHRtbCA9IGZ1bmN0aW9uKG5vZGUsIGh0bWwpIHsKCQl3aW5kb3cuTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKSB7CgkJCW5vZGUuaW5uZXJIVE1MID0gaHRtbDsKCQl9KTsKCX07Cn0K
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/drag.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglFbnlvIHN1cHBvcnRzIGEgY3Jvc3MtcGxhdGZvcm0gc2V0IG9mIGRyYWcgZXZlbnRzLiAgVGhlc2UgZXZlbnRzIGFsbG93IHVzZXJzCgl0byB3cml0ZSBhIHNpbmdsZSBzZXQgb2YgZXZlbnQgaGFuZGxlcnMgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHJ1biBvbiBib3RoCgltb2JpbGUgYW5kIGRlc2t0b3AgcGxhdGZvcm1zLgoKCVRoZSBmb2xsb3dpbmcgZXZlbnRzIGFyZSBwcm92aWRlZDoKCgkqICJkcmFnc3RhcnQiCgkqICJkcmFnZmluaXNoIgoJKiAiZHJhZyIKCSogImRyb3AiCgkqICJkcmFnb3ZlciIKCSogImRyYWdvdXQiCgkqICJob2xkIgoJKiAicmVsZWFzZSIKCSogImhvbGRwdWxzZSIKCSogImZsaWNrIgoKCUZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIGV2ZW50cywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uCglbVXNlciBJbnB1dF0oaHR0cHM6Ly9naXRodWIuY29tL2VueW9qcy9lbnlvL3dpa2kvVXNlci1JbnB1dCkgaW4gdGhlIEVueW8KCURldmVsb3BlciBHdWlkZS4KKi8KCi8vKiBAcHJvdGVjdGVkCmVueW8uZGlzcGF0Y2hlci5mZWF0dXJlcy5wdXNoKAoJZnVuY3Rpb24oZSkgewoJCS8vIE5PVEU6IGJld2FyZSBvZiBwcm9wZXJ0aWVzIGluIGVueW8uZ2VzdHVyZSBpbmFkdmVydGVudGx5IG1hcHBlZCB0byBldmVudCB0eXBlcwoJCWlmIChlbnlvLmdlc3R1cmUuZHJhZ1tlLnR5cGVdKSB7CgkJCXJldHVybiBlbnlvLmdlc3R1cmUuZHJhZ1tlLnR5cGVdKGUpOwoJCX0KCX0KKTsKCi8vKiBAcHVibGljCmVueW8uZ2VzdHVyZS5kcmFnID0gewoJLy8qIEBwcm90ZWN0ZWQKCWh5c3RlcmVzaXNTcXVhcmVkOiAxNiwKCWhvbGRQdWxzZURlbGF5OiAyMDAsCgl0cmFja0NvdW50OiA1LAoJbWluRmxpY2s6IDAuMSwKCW1pblRyYWNrOiA4LAoJZG93bjogZnVuY3Rpb24oZSkgewoJCS8vIHRyYWNraW5nIGlmIHRoZSBtb3VzZSBpcyBkb3duCgkJLy9lbnlvLmxvZygidHJhY2tpbmcgT04iKTsKCQkvLyBOb3RlOiAndHJhY2tpbmcnIGZsYWcgaW5kaWNhdGVzIGludGVyZXN0IGluIG1vdXNlbW92ZSwgaXQncyB0dXJuZWQgb2ZmCgkJLy8gb24gbW91c2V1cAoJCS8vIG1ha2Ugc3VyZSB0byBzdG9wIGRyYWdnaW5nIGluIGNhc2UgdGhlIHVwIGV2ZW50IHdhcyBub3QgcmVjZWl2ZWQuCgkJdGhpcy5zdG9wRHJhZ2dpbmcoZSk7CgkJdGhpcy5jYW5jZWxIb2xkKCk7CgkJdGhpcy50YXJnZXQgPSBlLnRhcmdldDsKCQl0aGlzLnN0YXJ0VHJhY2tpbmcoZSk7CgkJdGhpcy5iZWdpbkhvbGQoZSk7Cgl9LAoJbW92ZTogZnVuY3Rpb24oZSkgewoJCWlmICh0aGlzLnRyYWNraW5nKSB7CgkJCXRoaXMudHJhY2soZSk7CgkJCS8vIElmIHRoZSBtb3VzZSBpcyBub3QgZG93biBhbmQgd2UncmUgdHJhY2tpbmcgYSBkcmFnLCBhYm9ydC4KCQkJLy8gdGhpcyBlcnJvciBjb25kaXRpb24gY2FuIG9jY3VyIG9uIElFL1dlYmtpdCBhZnRlciBpbnRlcmFjdGlvbiB3aXRoIGEgc2Nyb2xsYmFyLgoJCQlpZiAoIWUud2hpY2gpIHsKCQkJCXRoaXMuc3RvcERyYWdnaW5nKGUpOwoJCQkJdGhpcy5jYW5jZWxIb2xkKCk7CgkJCQl0aGlzLnRyYWNraW5nID0gZmFsc2U7CgkJCQkvL2VueW8ubG9nKCJlbnlvLmdlc3R1cmUuZHJhZzogbW91c2UgbXVzdCBiZSBkb3duIHRvIGRyYWcuIik7CgkJCQlyZXR1cm47CgkJCX0KCQkJaWYgKHRoaXMuZHJhZ0V2ZW50KSB7CgkJCQl0aGlzLnNlbmREcmFnKGUpOwoJCQl9IGVsc2UgaWYgKHRoaXMuZHkqdGhpcy5keSArIHRoaXMuZHgqdGhpcy5keCA+PSB0aGlzLmh5c3RlcmVzaXNTcXVhcmVkKSB7CgkJCQl0aGlzLnNlbmREcmFnU3RhcnQoZSk7CgkJCQl0aGlzLmNhbmNlbEhvbGQoKTsKCQkJfQoJCX0KCX0sCgl1cDogZnVuY3Rpb24oZSkgewoJCXRoaXMuZW5kVHJhY2tpbmcoZSk7CgkJdGhpcy5zdG9wRHJhZ2dpbmcoZSk7CgkJdGhpcy5jYW5jZWxIb2xkKCk7Cgl9LAoJbGVhdmU6IGZ1bmN0aW9uKGUpIHsKCQlpZiAodGhpcy5kcmFnRXZlbnQpIHsKCQkJdGhpcy5zZW5kRHJhZ091dChlKTsKCQl9Cgl9LAoJc3RvcERyYWdnaW5nOiBmdW5jdGlvbihlKSB7CgkJaWYgKHRoaXMuZHJhZ0V2ZW50KSB7CgkJCXRoaXMuc2VuZERyb3AoZSk7CgkJCXZhciBoYW5kbGVkID0gdGhpcy5zZW5kRHJhZ0ZpbmlzaChlKTsKCQkJZW55by5wb29sLnJlbGVhc2VPYmplY3QodGhpcy5kcmFnRXZlbnQpOwoJCQl0aGlzLmRyYWdFdmVudCA9IG51bGw7CgkJCXJldHVybiBoYW5kbGVkOwoJCX0KCX0sCgltYWtlRHJhZ0V2ZW50OiBmdW5jdGlvbihpblR5cGUsIGluVGFyZ2V0LCBpbkV2ZW50LCBpbkluZm8pIHsKCQl2YXIgYWR4ID0gTWF0aC5hYnModGhpcy5keCksIGFkeSA9IE1hdGguYWJzKHRoaXMuZHkpOwoJCXZhciBoID0gYWR4ID4gYWR5OwoJCS8vIHN1Z2dlc3QgbG9ja2luZyBpZiBvZmYtYXhpcyA8IDIyLjUgZGVncmVlcwoJCXZhciBsID0gKGggPyBhZHkvYWR4IDogYWR4L2FkeSkgPCAwLjQxNDsKCQl2YXIgZSA9IGVueW8ucG9vbC5jbGFpbU9iamVjdCgpOwoJCS8vIHZhciBlID0gewoJCWUudHlwZSA9IGluVHlwZTsKCQllLmR4ID0gdGhpcy5keDsKCQllLmR5ID0gdGhpcy5keTsKCQllLmRkeCA9IHRoaXMuZHggLSB0aGlzLmxhc3REeDsKCQllLmRkeSA9IHRoaXMuZHkgLSB0aGlzLmxhc3REeTsKCQllLnhEaXJlY3Rpb24gPSB0aGlzLnhEaXJlY3Rpb247CgkJZS55RGlyZWN0aW9uID0gdGhpcy55RGlyZWN0aW9uOwoJCWUucGFnZVggPSBpbkV2ZW50LnBhZ2VYOwoJCWUucGFnZVkgPSBpbkV2ZW50LnBhZ2VZOwoJCWUuY2xpZW50WCA9IGluRXZlbnQuY2xpZW50WDsKCQllLmNsaWVudFkgPSBpbkV2ZW50LmNsaWVudFk7CgkJZS5ob3Jpem9udGFsID0gaDsKCQllLnZlcnRpY2FsID0gIWg7CgkJZS5sb2NrYWJsZSA9IGw7CgkJZS50YXJnZXQgPSBpblRhcmdldDsKCQllLmRyYWdJbmZvID0gaW5JbmZvOwoJCWUuY3RybEtleSA9IGluRXZlbnQuY3RybEtleTsKCQllLmFsdEtleSA9IGluRXZlbnQuYWx0S2V5OwoJCWUubWV0YUtleSA9IGluRXZlbnQubWV0YUtleTsKCQllLnNoaWZ0S2V5ID0gaW5FdmVudC5zaGlmdEtleTsKCQllLnNyY0V2ZW50ID0gaW5FdmVudC5zcmNFdmVudDsKCQkvLyB9OwoJCS8vRml4IGZvciBJRTgsIHdoaWNoIGRvZXNuJ3QgaW5jbHVkZSBwYWdlWCBhbmQgcGFnZVkgcHJvcGVydGllcwoJCWlmKGVueW8ucGxhdGZvcm0uaWU9PTggJiYgZS50YXJnZXQpIHsKCQkJZS5wYWdlWCA9IGUuY2xpZW50WCArIGUudGFyZ2V0LnNjcm9sbExlZnQ7CgkJCWUucGFnZVkgPSBlLmNsaWVudFkgKyBlLnRhcmdldC5zY3JvbGxUb3A7CgkJfQoJCWUucHJldmVudERlZmF1bHQgPSBlbnlvLmdlc3R1cmUucHJldmVudERlZmF1bHQ7CgkJZS5kaXNhYmxlUHJldmVudGlvbiA9IGVueW8uZ2VzdHVyZS5kaXNhYmxlUHJldmVudGlvbjsKCQlyZXR1cm4gZTsKCX0sCglzZW5kRHJhZ1N0YXJ0OiBmdW5jdGlvbihlKSB7CgkJLy9lbnlvLmxvZygiZHJhZ3N0YXJ0Iik7CgkJdGhpcy5kcmFnRXZlbnQgPSB0aGlzLm1ha2VEcmFnRXZlbnQoImRyYWdzdGFydCIsIHRoaXMudGFyZ2V0LCBlKTsKCQllbnlvLmRpc3BhdGNoKHRoaXMuZHJhZ0V2ZW50KTsKCX0sCglzZW5kRHJhZzogZnVuY3Rpb24oZSkgewoJCS8vZW55by5sb2coInNlbmREcmFnIHRvICIgKyB0aGlzLmRyYWdFdmVudC50YXJnZXQuaWQgKyAiLCBvdmVyIHRvICIgKyBlLnRhcmdldC5pZCk7CgkJLy8gc2VuZCBkcmFnT3ZlciBldmVudCB0byB0aGUgc3RhbmRhcmQgZXZlbnQgdGFyZ2V0CgkJdmFyIHN5bnRoID0gdGhpcy5tYWtlRHJhZ0V2ZW50KCJkcmFnb3ZlciIsIGUudGFyZ2V0LCBlLCB0aGlzLmRyYWdFdmVudC5kcmFnSW5mbyk7CgkJZW55by5kaXNwYXRjaChzeW50aCk7CgkJLy8gc2VuZCBkcmFnIGV2ZW50IHRvIHRoZSBkcmFnIHNvdXJjZQoJCXN5bnRoLnR5cGUgPSAiZHJhZyI7CgkJc3ludGgudGFyZ2V0ID0gdGhpcy5kcmFnRXZlbnQudGFyZ2V0OwoJCWVueW8uZGlzcGF0Y2goc3ludGgpOwoJCWVueW8ucG9vbC5yZWxlYXNlT2JqZWN0KHN5bnRoKTsKCX0sCglzZW5kRHJhZ0ZpbmlzaDogZnVuY3Rpb24oZSkgewoJCS8vZW55by5sb2coImRyYWdmaW5pc2giKTsKCQl2YXIgc3ludGggPSB0aGlzLm1ha2VEcmFnRXZlbnQoImRyYWdmaW5pc2giLCB0aGlzLmRyYWdFdmVudC50YXJnZXQsIGUsIHRoaXMuZHJhZ0V2ZW50LmRyYWdJbmZvKTsKCQlzeW50aC5wcmV2ZW50VGFwID0gZnVuY3Rpb24oKSB7CgkJCWlmIChlLnByZXZlbnRUYXApIHsKCQkJCWUucHJldmVudFRhcCgpOwoJCQl9CgkJfTsKCQllbnlvLmRpc3BhdGNoKHN5bnRoKTsKCQllbnlvLnBvb2wucmVsZWFzZU9iamVjdChzeW50aCk7Cgl9LAoJc2VuZERyYWdPdXQ6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgc3ludGggPSB0aGlzLm1ha2VEcmFnRXZlbnQoImRyYWdvdXQiLCBlLnRhcmdldCwgZSwgdGhpcy5kcmFnRXZlbnQuZHJhZ0luZm8pOwoJCWVueW8uZGlzcGF0Y2goc3ludGgpOwoJCWVueW8ucG9vbC5yZWxlYXNlT2JqZWN0KHN5bnRoKTsKCX0sCglzZW5kRHJvcDogZnVuY3Rpb24oZSkgewoJCXZhciBzeW50aCA9IHRoaXMubWFrZURyYWdFdmVudCgiZHJvcCIsIGUudGFyZ2V0LCBlLCB0aGlzLmRyYWdFdmVudC5kcmFnSW5mbyk7CgkJc3ludGgucHJldmVudFRhcCA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoZS5wcmV2ZW50VGFwKSB7CgkJCQllLnByZXZlbnRUYXAoKTsKCQkJfQoJCX07CgkJZW55by5kaXNwYXRjaChzeW50aCk7CgkJZW55by5wb29sLnJlbGVhc2VPYmplY3Qoc3ludGgpOwoJfSwKCXN0YXJ0VHJhY2tpbmc6IGZ1bmN0aW9uKGUpIHsKCQl0aGlzLnRyYWNraW5nID0gdHJ1ZTsKCQkvLyBub3RlOiB1c2UgY2xpZW50WC9ZIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBpZTgKCQl0aGlzLnB4MCA9IGUuY2xpZW50WDsKCQl0aGlzLnB5MCA9IGUuY2xpZW50WTsKCQkvLyB0aGlzLmZsaWNrSW5mbyA9IHtzdGFydEV2ZW50OiBlLCBtb3ZlczogW119OwoJCXRoaXMuZmxpY2tJbmZvID0gZW55by5wb29sLmNsYWltT2JqZWN0KCk7CgkJdGhpcy5mbGlja0luZm8uc3RhcnRFdmVudCA9IGU7CgkJLy8gRklYTUU6IHNvIHdlJ3JlIHRyeWluZyB0byByZXVzZSBvYmplY3RzIHdoZXJlIHBvc3NpYmxlLCBzaG91bGQKCQkvLyBkbyB0aGUgc2FtZSBpbiBzY2VuYXJpb3MgbGlrZSB0aGlzIGZvciBhcnJheXMKCQl0aGlzLmZsaWNrSW5mby5tb3ZlcyA9IFtdOwoJCXRoaXMudHJhY2soZSk7Cgl9LAoJdHJhY2s6IGZ1bmN0aW9uKGUpIHsKCQl0aGlzLmxhc3REeCA9IHRoaXMuZHg7CgkJdGhpcy5sYXN0RHkgPSB0aGlzLmR5OwoJCXRoaXMuZHggPSBlLmNsaWVudFggLSB0aGlzLnB4MDsKCQl0aGlzLmR5ID0gZS5jbGllbnRZIC0gdGhpcy5weTA7CgkJdGhpcy54RGlyZWN0aW9uID0gdGhpcy5jYWxjRGlyZWN0aW9uKHRoaXMuZHggLSB0aGlzLmxhc3REeCwgMCk7CgkJdGhpcy55RGlyZWN0aW9uID0gdGhpcy5jYWxjRGlyZWN0aW9uKHRoaXMuZHkgLSB0aGlzLmxhc3REeSwgMCk7CgkJLy8KCQl2YXIgdGkgPSB0aGlzLmZsaWNrSW5mbzsKCQl0aS5tb3Zlcy5wdXNoKHsKCQkJeDogZS5jbGllbnRYLAoJCQl5OiBlLmNsaWVudFksCgkJCS8vIHQ6IGVueW8ubm93KCkKCQkJdDogZW55by5iZW5jaCgpCgkJfSk7CgkJLy8gdHJhY2sgc3BlY2lmaWVkICMgb2YgcG9pbnRzCgkJaWYgKHRpLm1vdmVzLmxlbmd0aCA+IHRoaXMudHJhY2tDb3VudCkgewoJCQl0aS5tb3Zlcy5zaGlmdCgpOwoJCX0KCX0sCgllbmRUcmFja2luZzogZnVuY3Rpb24oZSkgewoJCXRoaXMudHJhY2tpbmcgPSBmYWxzZTsKCQl2YXIgdGkgPSB0aGlzLmZsaWNrSW5mbzsKCQl2YXIgbW92ZXMgPSB0aSAmJiB0aS5tb3ZlczsKCQlpZiAobW92ZXMgJiYgbW92ZXMubGVuZ3RoID4gMSkgewoJCQkvLyBub3RlOiBpbXBvcnRhbnQgdG8gdXNlIHVwIHRpbWUgdG8gcmVkdWNlIGZsaWNrCgkJCS8vIHZlbG9jaXR5IGJhc2VkIG9uIHRpbWUgYmV0d2VlbiBtb3ZlIGFuZCB1cC4KCQkJdmFyIGwgPSBtb3Zlc1ttb3Zlcy5sZW5ndGgtMV07CgkJCS8vIHZhciBuID0gZW55by5ub3coKTsKCQkJdmFyIG4gPSBlbnlvLmJlbmNoKCk7CgkJCS8vIHRha2UgdGhlIGdyZWF0ZXN0IG9mIGZsaWNrIGJldHdlZW4gZWFjaCB0cmFja2VkIG1vdmUgYW5kIGxhc3QgbW92ZQoJCQlmb3IgKHZhciBpPW1vdmVzLmxlbmd0aC0yLCBkdD0wLCB4MT0wLCB5MT0wLCB4PTAsIHk9MCwgc3g9MCwgc3k9MCwgbTsgKG09bW92ZXNbaV0pOyBpLS0pIHsKCQkJCS8vIHRoaXMgZmxpY2sgKHRoaXMgbW92ZSAtIGxhc3QgbW92ZSkgLyAodGhpcyB0aW1lIC0gbGFzdCB0aW1lKQoJCQkJZHQgPSBuIC0gbS50OwoJCQkJeDEgPSAobC54IC0gbS54KSAvIGR0OwoJCQkJeTEgPSAobC55IC0gbS55KSAvIGR0OwoJCQkJLy8gZXN0YWJsaXNoIGZsaWNrIGRpcmVjdGlvbgoJCQkJc3ggPSBzeCB8fCAoeDEgPCAwID8gLTEgOiAoeDEgPiAwID8gMSA6IDApKTsKCQkJCXN5ID0gc3kgfHwgKHkxIDwgMCA/IC0xIDogKHkxID4gMCA/IDEgOiAwKSk7CgkJCQkvLyBpZiBlaXRoZXIgYXhpcyBpcyBhIGdyZWF0ZXIgZmxpY2sgdGhhbiBwcmV2aW91c2x5IHJlY29yZGVkIHVzZSB0aGlzIG9uZQoJCQkJaWYgKCh4MSAqIHN4ID4geCAqIHN4KSB8fCAoeTEgKiBzeSA+IHkgKiBzeSkpIHsKCQkJCQl4ID0geDE7CgkJCQkJeSA9IHkxOwoJCQkJfQoJCQl9CgkJCXZhciB2ID0gTWF0aC5zcXJ0KHgqeCArIHkqeSk7CgkJCWlmICh2ID4gdGhpcy5taW5GbGljaykgewoJCQkJLy8gZ2VuZXJhdGUgdGhlIGZsaWNrIHVzaW5nIHRoZSBzdGFydCBldmVudCBzbyBpdCBoYXMgdGhvc2UgY29vcmRpbmF0ZXMKCQkJCXRoaXMuc2VuZEZsaWNrKHRpLnN0YXJ0RXZlbnQsIHgsIHksIHYpOwoJCQl9CgkJfQoJCXRoaXMuZmxpY2tJbmZvID0gbnVsbDsKCQllbnlvLnBvb2wucmVsZWFzZU9iamVjdCh0aSk7Cgl9LAoJY2FsY0RpcmVjdGlvbjogZnVuY3Rpb24oaW5OdW0sIGluRGVmYXVsdCkgewoJCXJldHVybiBpbk51bSA+IDAgPyAxIDogKGluTnVtIDwgMCA/IC0xIDogaW5EZWZhdWx0KTsKCX0sCgliZWdpbkhvbGQ6IGZ1bmN0aW9uKGUpIHsKCQkvLyB0aGlzLmhvbGRTdGFydCA9IGVueW8ubm93KCk7CgkJdGhpcy5ob2xkU3RhcnQgPSBlbnlvLmJlbmNoKCk7CgkJLy8gY2xvbmUgdGhlIGV2ZW50IHRvIGVuc3VyZSBpdCBzdGF5cyBhbGl2ZSBvbiBJRSB1cG9uIHJldHVybmluZyB0byBldmVudCBsb29wCgkJLy8gdmFyIGNsb25lZEV2ZW50ID0gZW55by5jbG9uZShlKTsKCQl2YXIgJGNlID0gZW55by5taXhpbihlbnlvLnBvb2wuY2xhaW1PYmplY3QoKSwgZSk7CgkJLy8gJGNlLnNyY0V2ZW50ID0gZW55by5jbG9uZShlLnNyY0V2ZW50KTsKCQkkY2Uuc3JjRXZlbnQgPSBlbnlvLm1peGluKGVueW8ucG9vbC5jbGFpbU9iamVjdCgpLCBlLnNyY0V2ZW50KTsKCQl0aGlzLl9ob2xkSm9iRnVuY3Rpb24gPSBlbnlvLmJpbmQodGhpcywgInNlbmRIb2xkUHVsc2UiLCAkY2UpOwoJCXRoaXMuX2hvbGRKb2JGdW5jdGlvbi5jZSA9ICRjZTsKCQl0aGlzLmhvbGRKb2IgPSBzZXRJbnRlcnZhbCh0aGlzLl9ob2xkSm9iRnVuY3Rpb24sIHRoaXMuaG9sZFB1bHNlRGVsYXkpOwoJfSwKCWNhbmNlbEhvbGQ6IGZ1bmN0aW9uKCkgewoJCWNsZWFySW50ZXJ2YWwodGhpcy5ob2xkSm9iKTsKCQl0aGlzLmhvbGRKb2IgPSBudWxsOwoJCWlmICh0aGlzLl9ob2xkSm9iRnVuY3Rpb24pIHsKCQkJdmFyICRjZSA9IHRoaXMuX2hvbGRKb2JGdW5jdGlvbi5jZTsKCQkJdGhpcy5faG9sZEpvYkZ1bmN0aW9uID0gbnVsbDsKCQkJZW55by5wb29sLnJlbGVhc2VPYmplY3QoJGNlLnNyY0V2ZW50KTsKCQkJZW55by5wb29sLnJlbGVhc2VPYmplY3QoJGNlKTsKCQl9CgkJaWYgKHRoaXMuc2VudEhvbGQpIHsKCQkJdGhpcy5zZW50SG9sZCA9IGZhbHNlOwoJCQl0aGlzLnNlbmRSZWxlYXNlKHRoaXMuaG9sZEV2ZW50KTsKCQl9Cgl9LAoJc2VuZEhvbGRQdWxzZTogZnVuY3Rpb24oaW5FdmVudCkgewoJCWlmICghdGhpcy5zZW50SG9sZCkgewoJCQl0aGlzLnNlbnRIb2xkID0gdHJ1ZTsKCQkJdGhpcy5zZW5kSG9sZChpbkV2ZW50KTsKCQl9CgkJdmFyIGUgPSBlbnlvLmdlc3R1cmUubWFrZUV2ZW50KCJob2xkcHVsc2UiLCBpbkV2ZW50KTsKCQkvLyBlLmhvbGRUaW1lID0gZW55by5ub3coKSAtIHRoaXMuaG9sZFN0YXJ0OwoJCWUuaG9sZFRpbWUgPSBlbnlvLmJlbmNoKCkgLSB0aGlzLmhvbGRTdGFydDsKCQllbnlvLmRpc3BhdGNoKGUpOwoJCWVueW8ucG9vbC5yZWxlYXNlT2JqZWN0KGUpOwoJfSwKCXNlbmRIb2xkOiBmdW5jdGlvbihpbkV2ZW50KSB7CgkJdGhpcy5ob2xkRXZlbnQgPSBpbkV2ZW50OwoJCXZhciBlID0gZW55by5nZXN0dXJlLm1ha2VFdmVudCgiaG9sZCIsIGluRXZlbnQpOwoJCWVueW8uZGlzcGF0Y2goZSk7CgkJZW55by5wb29sLnJlbGVhc2VPYmplY3QoZSk7Cgl9LAoJc2VuZFJlbGVhc2U6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQl2YXIgZSA9IGVueW8uZ2VzdHVyZS5tYWtlRXZlbnQoInJlbGVhc2UiLCBpbkV2ZW50KTsKCQllbnlvLmRpc3BhdGNoKGUpOwoJCWVueW8ucG9vbC5yZWxlYXNlT2JqZWN0KGUpOwoJfSwKCXNlbmRGbGljazogZnVuY3Rpb24oaW5FdmVudCwgaW5YLCBpblksIGluVikgewoJCXZhciBlID0gZW55by5nZXN0dXJlLm1ha2VFdmVudCgiZmxpY2siLCBpbkV2ZW50KTsKCQllLnhWZWxvY2l0eSA9IGluWDsKCQllLnlWZWxvY2l0eSA9IGluWTsKCQllLnZlbG9jaXR5ID0gaW5WOwoJCWVueW8uZGlzcGF0Y2goZSk7CgkJZW55by5wb29sLnJlbGVhc2VPYmplY3QoZSk7Cgl9Cn07
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/gesture.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwdWJsaWMKLyoqCglFbnlvIHN1cHBvcnRzIGEgc2V0IG9mIG5vcm1hbGl6ZWQgZXZlbnRzIHRoYXQgd29yayBzaW1pbGFybHkgYWNyb3NzCWFsbAoJc3VwcG9ydGVkIHBsYXRmb3Jtcy4gVGhlc2UgZXZlbnRzIGFyZSBwcm92aWRlZCBzbyB0aGF0IHVzZXJzIGNhbiB3cml0ZSBhCglzaW5nbGUgc2V0IG9mIGV2ZW50IGhhbmRsZXJzIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBydW4gb24gYm90aCBtb2JpbGUgYW5kCglkZXNrdG9wIHBsYXRmb3Jtcy4gIFRoZXkgYXJlIG5lZWRlZCBiZWNhdXNlIGRlc2t0b3AgYW5kIG1vYmlsZSBwbGF0Zm9ybXMKCWhhbmRsZSBiYXNpYyBpbnB1dCBkaWZmZXJlbnRseS4KCglGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBub3JtYWxpemVkIGlucHV0IGV2ZW50cyBhbmQgdGhlaXIgYXNzb2NpYXRlZAoJcHJvcGVydGllcywJc2VlCXRoZSBkb2N1bWVudGF0aW9uIG9uCglbVXNlciBJbnB1dF0oaHR0cHM6Ly9naXRodWIuY29tL2VueW9qcy9lbnlvL3dpa2kvVXNlci1JbnB1dCkgaW4gdGhlIEVueW8KCURldmVsb3BlciBHdWlkZS4KKi8KZW55by5nZXN0dXJlID0gewoJLy8qIEBwcm90ZWN0ZWQKCWV2ZW50UHJvcHM6IFsidGFyZ2V0IiwgInJlbGF0ZWRUYXJnZXQiLCAiY2xpZW50WCIsICJjbGllbnRZIiwgInBhZ2VYIiwgInBhZ2VZIiwKCQkic2NyZWVuWCIsICJzY3JlZW5ZIiwgImFsdEtleSIsICJjdHJsS2V5IiwgIm1ldGFLZXkiLCAic2hpZnRLZXkiLAoJCSJkZXRhaWwiLCAiaWRlbnRpZmllciIsICJkaXNwYXRjaFRhcmdldCIsICJ3aGljaCIsICJzcmNFdmVudCJdLAoJbWFrZUV2ZW50OiBmdW5jdGlvbihpblR5cGUsIGluRXZlbnQpIHsKCQkvLyB2YXIgZSA9IHt0eXBlOiBpblR5cGV9OwoJCXZhciBlID0gZW55by5wb29sLmNsYWltT2JqZWN0KCk7CgkJZS50eXBlID0gaW5UeXBlOwoJCWZvciAodmFyIGk9MCwgcDsgKHA9dGhpcy5ldmVudFByb3BzW2ldKTsgaSsrKSB7CgkJCWVbcF0gPSBpbkV2ZW50W3BdOwoJCX0KCQllLnNyY0V2ZW50ID0gZS5zcmNFdmVudCB8fCBpbkV2ZW50OwoJCWUucHJldmVudERlZmF1bHQgPSB0aGlzLnByZXZlbnREZWZhdWx0OwoJCWUuZGlzYWJsZVByZXZlbnRpb24gPSB0aGlzLmRpc2FibGVQcmV2ZW50aW9uOwoJCS8vCgkJLy8gbm9ybWFsaXplIGV2ZW50LndoaWNoIGFuZCBldmVudC5wYWdlWC9ldmVudC5wYWdlWQoJCS8vIE5vdGUgdGhhdCB3aGlsZSAid2hpY2giIHdvcmtzIGluIElFOSwgaXQgaXMgYnJva2VuIGZvciBtb3VzZW1vdmUuIFRoZXJlZm9yZSwKCQkvLyBpbiBJRSwgdXNlIHdpbmRvdy5ldmVudC5idXR0b24KCQlpZiAoZW55by5wbGF0Zm9ybS5pZSA8IDEwKSB7CgkJCS8vRml4IGZvciBJRTgsIHdoaWNoIGRvZXNuJ3QgaW5jbHVkZSBwYWdlWCBhbmQgcGFnZVkgcHJvcGVydGllcwoJCQlpZihlbnlvLnBsYXRmb3JtLmllPT04ICYmIGUudGFyZ2V0KSB7CgkJCQllLnBhZ2VYID0gZS5jbGllbnRYICsgZS50YXJnZXQuc2Nyb2xsTGVmdDsKCQkJCWUucGFnZVkgPSBlLmNsaWVudFkgKyBlLnRhcmdldC5zY3JvbGxUb3A7CgkJCX0KCQkJdmFyIGIgPSB3aW5kb3cuZXZlbnQgJiYgd2luZG93LmV2ZW50LmJ1dHRvbjsKCQkJaWYgKGIpIHsKCQkJCS8vIG11bHRpLWJ1dHRvbiBub3Qgc3VwcG9ydGVkLCBwcmlvcml0eTogbGVmdCwgcmlnaHQsIG1pZGRsZQoJCQkJLy8gKG5vdGU6IElFIGJpdG1hc2sgaXMgMT1sZWZ0LCAyPXJpZ2h0LCA0PWNlbnRlcik7CgkJCQllLndoaWNoID0gYiAmIDEgPyAxIDogKGIgJiAyID8gMiA6IChiICYgNCA/IDMgOiAwKSk7CgkJCX0KCQl9IGVsc2UgaWYgKGVueW8ucGxhdGZvcm0ud2Vib3MgfHwgd2luZG93LlBhbG1TeXN0ZW0pIHsKCQkJLy8gVGVtcG9yYXJ5IGZpeCBmb3Igb3dvczogaXQgZG9lcyBub3QgY3VycmVudGx5IHN1cHBseSAnd2hpY2gnIG9uIG1vdmUgZXZlbnRzCgkJCS8vIGFuZCB0aGUgdXNlciBhZ2VudCBzdHJpbmcgZG9lc24ndCBpZGVudGlmeSBpdHNlbGYgc28gd2UgdGVzdCBmb3IgUGFsbVN5c3RlbQoJCQlpZiAoZS53aGljaCA9PT0gMCkgewoJCQkJZS53aGljaCA9IDE7CgkJCX0KCQl9CgkJcmV0dXJuIGU7Cgl9LAoJZG93bjogZnVuY3Rpb24oaW5FdmVudCkgewoJCS8vIGNhbmNlbCBhbnkgaG9sZCBzaW5jZSBpdCdzIHBvc3NpYmxlIGluIGNvcm5lciBjYXNlcyB0byBnZXQgYSBkb3duIHdpdGhvdXQgYW4gdXAKCQl2YXIgZSA9IHRoaXMubWFrZUV2ZW50KCJkb3duIiwgaW5FdmVudCk7CgkJZW55by5kaXNwYXRjaChlKTsKCQl0aGlzLmRvd25FdmVudCA9IGU7Cgl9LAoJbW92ZTogZnVuY3Rpb24oaW5FdmVudCkgewoJCXZhciBlID0gdGhpcy5tYWtlRXZlbnQoIm1vdmUiLCBpbkV2ZW50KTsKCQkvLyBpbmNsdWRlIGRlbHRhIGFuZCBkaXJlY3Rpb24gdi4gZG93biBpbmZvIGluIG1vdmUgZXZlbnQKCQllLmR4ID0gZS5keSA9IGUuaG9yaXpvbnRhbCA9IGUudmVydGljYWwgPSAwOwoJCWlmIChlLndoaWNoICYmIHRoaXMuZG93bkV2ZW50KSB7CgkJCWUuZHggPSBpbkV2ZW50LmNsaWVudFggLSB0aGlzLmRvd25FdmVudC5jbGllbnRYOwoJCQllLmR5ID0gaW5FdmVudC5jbGllbnRZIC0gdGhpcy5kb3duRXZlbnQuY2xpZW50WTsKCQkJZS5ob3Jpem9udGFsID0gTWF0aC5hYnMoZS5keCkgPiBNYXRoLmFicyhlLmR5KTsKCQkJZS52ZXJ0aWNhbCA9ICFlLmhvcml6b250YWw7CgkJfQoJCWVueW8uZGlzcGF0Y2goZSk7CgkJZW55by5wb29sLnJlbGVhc2VPYmplY3QoZSk7Cgl9LAoJdXA6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQl2YXIgZSA9IHRoaXMubWFrZUV2ZW50KCJ1cCIsIGluRXZlbnQpOwoJCXZhciB0YXBQcmV2ZW50ZWQgPSBmYWxzZTsKCQllLnByZXZlbnRUYXAgPSBmdW5jdGlvbigpIHsKCQkJdGFwUHJldmVudGVkID0gdHJ1ZTsKCQl9OwoJCWVueW8uZGlzcGF0Y2goZSk7CgkJaWYgKCF0YXBQcmV2ZW50ZWQgJiYgdGhpcy5kb3duRXZlbnQgJiYgdGhpcy5kb3duRXZlbnQud2hpY2ggPT0gMSkgewoJCQl0aGlzLnNlbmRUYXAoZSk7CgkJfQoJCWVueW8ucG9vbC5yZWxlYXNlT2JqZWN0KHRoaXMuZG93bkV2ZW50KTsKCQl0aGlzLmRvd25FdmVudCA9IG51bGw7CgkJZW55by5wb29sLnJlbGVhc2VPYmplY3QoZSk7Cgl9LAoJb3ZlcjogZnVuY3Rpb24oaW5FdmVudCkgewoJCXZhciBlID0gdGhpcy5tYWtlRXZlbnQoImVudGVyIiwgaW5FdmVudCk7CgkJZW55by5kaXNwYXRjaChlKTsKCQllbnlvLnBvb2wucmVsZWFzZU9iamVjdChlKTsKCX0sCglvdXQ6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQl2YXIgZSA9IHRoaXMubWFrZUV2ZW50KCJsZWF2ZSIsIGluRXZlbnQpOwoJCWVueW8uZGlzcGF0Y2goZSk7CgkJZW55by5wb29sLnJlbGVhc2VPYmplY3QoZSk7Cgl9LAoJc2VuZFRhcDogZnVuY3Rpb24oaW5FdmVudCkgewoJCS8vIFRoZSBjb21tb24gYW5jZXN0b3IgZm9yIHRoZSBkb3duL3VwIHBhaXIgaXMgdGhlIG9yaWdpbiBmb3IgdGhlIHRhcCBldmVudAoJCXZhciB0ID0gdGhpcy5maW5kQ29tbW9uQW5jZXN0b3IodGhpcy5kb3duRXZlbnQudGFyZ2V0LCBpbkV2ZW50LnRhcmdldCk7CgkJaWYgKHQpIHsKCQkJdmFyIGUgPSB0aGlzLm1ha2VFdmVudCgidGFwIiwgaW5FdmVudCk7CgkJCWUudGFyZ2V0ID0gdDsKCQkJZW55by5kaXNwYXRjaChlKTsKCQkJZW55by5wb29sLnJlbGVhc2VPYmplY3QoZSk7CgkJfQoJfSwKCWZpbmRDb21tb25BbmNlc3RvcjogZnVuY3Rpb24oaW5BLCBpbkIpIHsKCQl2YXIgcCA9IGluQjsKCQl3aGlsZSAocCkgewoJCQlpZiAodGhpcy5pc1RhcmdldERlc2NlbmRhbnRPZihpbkEsIHApKSB7CgkJCQlyZXR1cm4gcDsKCQkJfQoJCQlwID0gcC5wYXJlbnROb2RlOwoJCX0KCX0sCglpc1RhcmdldERlc2NlbmRhbnRPZjogZnVuY3Rpb24oaW5DaGlsZCwgaW5QYXJlbnQpIHsKCQl2YXIgYyA9IGluQ2hpbGQ7CgkJd2hpbGUoYykgewoJCQlpZiAoYyA9PSBpblBhcmVudCkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJYyA9IGMucGFyZW50Tm9kZTsKCQl9Cgl9Cn07CgovLyogQHByb3RlY3RlZAoKLy8gaW5zdGFsbGVkIG9uIGV2ZW50cyBhbmQgY2FsbGVkIGluIGV2ZW50IGNvbnRleHQKZW55by5nZXN0dXJlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7CglpZiAodGhpcy5zcmNFdmVudCkgewoJCXRoaXMuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTsKCX0KfTsKCmVueW8uZ2VzdHVyZS5kaXNhYmxlUHJldmVudGlvbiA9IGZ1bmN0aW9uKCkgewoJdGhpcy5wcmV2ZW50RGVmYXVsdCA9IGVueW8ubm9wOwoJaWYgKHRoaXMuc3JjRXZlbnQpIHsKCQl0aGlzLnNyY0V2ZW50LnByZXZlbnREZWZhdWx0ID0gZW55by5ub3A7Cgl9Cn07CgplbnlvLmRpc3BhdGNoZXIuZmVhdHVyZXMucHVzaCgKCWZ1bmN0aW9uKGUpIHsKCQkvLyBOT1RFOiBiZXdhcmUgb2YgcHJvcGVydGllcyBpbiBlbnlvLmdlc3R1cmUgaW5hZHZlcnRlbnRseSBtYXBwZWQgdG8gZXZlbnQgdHlwZXMKCQlpZiAoZW55by5nZXN0dXJlLmV2ZW50c1tlLnR5cGVdKSB7CgkJCXJldHVybiBlbnlvLmdlc3R1cmUuZXZlbnRzW2UudHlwZV0oZSk7CgkJfQoJfQopOwoKZW55by5nZXN0dXJlLmV2ZW50cyA9IHsKCW1vdXNlZG93bjogZnVuY3Rpb24oZSkgewoJCWVueW8uZ2VzdHVyZS5kb3duKGUpOwoJfSwKCW1vdXNldXA6IGZ1bmN0aW9uKGUpIHsKCQllbnlvLmdlc3R1cmUudXAoZSk7Cgl9LAoJbW91c2Vtb3ZlOiAgZnVuY3Rpb24oZSkgewoJCWVueW8uZ2VzdHVyZS5tb3ZlKGUpOwoJfSwKCW1vdXNlb3ZlcjogIGZ1bmN0aW9uKGUpIHsKCQllbnlvLmdlc3R1cmUub3ZlcihlKTsKCX0sCgltb3VzZW91dDogIGZ1bmN0aW9uKGUpIHsKCQllbnlvLmdlc3R1cmUub3V0KGUpOwoJfQp9OwoKLy8gRmlyZWZveCBtb3VzZXdoZWVsIGhhbmRsaW5nCmVueW8ucmVxdWlyZXNXaW5kb3coZnVuY3Rpb24oKSB7CglpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewoJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIiwgZnVuY3Rpb24oaW5FdmVudCkgewoJCQkvLyB2YXIgZSA9IGVueW8uY2xvbmUoaW5FdmVudCk7CgkJCXZhciBlID0gZW55by5taXhpbihlbnlvLnBvb2wuY2xhaW1PYmplY3QoKSwgaW5FdmVudCk7CgkJCWUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsKCQkJCWluRXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfTsKCQkJZS50eXBlID0gIm1vdXNld2hlZWwiOwoJCQl2YXIgcCA9IGUuVkVSVElDQUxfQVhJUyA9PSBlLmF4aXMgPyAid2hlZWxEZWx0YVkiIDogIndoZWVsRGVsdGFYIjsKCQkJZVtwXSA9ICBlLmRldGFpbCAqIC00MDsKCQkJZW55by5kaXNwYXRjaChlKTsKCQkJZW55by5wb29sLnJlbGVhc2VPYmplY3QoZSk7CgkJfSwgZmFsc2UpOwoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/modal.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwcm90ZWN0ZWQKCi8qKgoJRXZlbnQgbW9kYWwgY2FwdHVyZSBmZWF0dXJlOiBjYXB0dXJlIGV2ZW50cyB0byBhIHNwZWNpZmljCgljb250cm9sIHZpYSBlbnlvLmRpc3BhdGNoZXIuY2FwdHVyZShpbkNvbnRyb2wsIGluU2hvdWxkRm9yd2FyZCkKCXJlbGVhc2UgZXZlbnRzIHZpYSBlbnlvLmRpc3BhdGNoZXIucmVsZWFzZSgpCiovCmVueW8uZGlzcGF0Y2hlci5mZWF0dXJlcy5wdXNoKGZ1bmN0aW9uKGUpIHsKCXZhciBjID0gZS5kaXNwYXRjaFRhcmdldDsKCXZhciB3YW50cyA9IHRoaXMuY2FwdHVyZVRhcmdldCAmJiAhdGhpcy5ub0NhcHR1cmVFdmVudHNbZS50eXBlXTsKCXZhciBuZWVkcyA9IHdhbnRzICYmICEoYyAmJiBjLmlzRGVzY2VuZGFudE9mICYmIGMuaXNEZXNjZW5kYW50T2YodGhpcy5jYXB0dXJlVGFyZ2V0KSk7CglpZiAobmVlZHMpIHsKCQl2YXIgYzEgPSBlLmNhcHR1cmVUYXJnZXQgPSB0aGlzLmNhcHR1cmVUYXJnZXQ7CgkJLy8gTk9URTogV2UgZG8gbm90IHdhbnQgcmVsZWFzaW5nIGNhcHR1cmUgd2hpbGUgYW4gZXZlbnQgaXMgYmVpbmcgcHJvY2Vzc2VkIHRvIGFsdGVyCgkJLy8gdGhlIHdheSB0aGUgZXZlbnQgcHJvcGFnYXRlcy4gVGhlcmVmb3JlIGRlY2lkZSBpZiB0aGUgZXZlbnQgc2hvdWxkIGZvcndhcmQKCQkvLyBiZWZvcmUgdGhlIGNhcHR1cmUgdGFyZ2V0IHJlY2VpdmVzIHRoZSBldmVudCAoc2luY2UgaXQgbWF5IHJlbGVhc2UgY2FwdHVyZSkuCgkJdmFyIHNob3VsZEZvcndhcmQgPSAodGhpcy5hdXRvRm9yd2FyZEV2ZW50c1tlLnR5cGVdIHx8IHRoaXMuZm9yd2FyZEV2ZW50cyk7CgkJdGhpcy5kaXNwYXRjaEJ1YmJsZShlLCBjMSk7CgkJaWYgKCFzaG91bGRGb3J3YXJkKSB7CgkJCWUucHJldmVudERpc3BhdGNoID0gdHJ1ZTsKCQl9Cgl9Cn0pOwoKLy8KLy8JTk9URTogVGhpcyBvYmplY3QgaXMgYSBwbHVnLWluOyB0aGVzZSBtZXRob2RzIHNob3VsZAovLwliZSBjYWxsZWQgb24gX2VueW8uZGlzcGF0Y2hlcl8sIGFuZCBub3Qgb24gdGhlIHBsdWctaW4gaXRzZWxmLgovLwplbnlvLm1peGluKGVueW8uZGlzcGF0Y2hlciwgewoJbm9DYXB0dXJlRXZlbnRzOiB7bG9hZDogMSwgdW5sb2FkOjEsIGVycm9yOiAxfSwKCWF1dG9Gb3J3YXJkRXZlbnRzOiB7bGVhdmU6IDEsIHJlc2l6ZTogMX0sCgljYXB0dXJlczogW10sCgkvLyogQ2FwdHVyZSBldmVudHMgZm9yIGBpblRhcmdldGAgYW5kIG9wdGlvbmFsbHkgZm9yd2FyZCB0aGVtCgljYXB0dXJlOiBmdW5jdGlvbihpblRhcmdldCwgaW5TaG91bGRGb3J3YXJkKSB7CgkJdmFyIGluZm8gPSB7dGFyZ2V0OiBpblRhcmdldCwgZm9yd2FyZDogaW5TaG91bGRGb3J3YXJkfTsKCQl0aGlzLmNhcHR1cmVzLnB1c2goaW5mbyk7CgkJdGhpcy5zZXRDYXB0dXJlSW5mbyhpbmZvKTsKCX0sCgkvLyogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZyb20gdGhlIGNhcHR1cmUgbGlzdAoJcmVsZWFzZTogZnVuY3Rpb24oaW5UYXJnZXQpIHsKCQlmb3IgKHZhciBpID0gdGhpcy5jYXB0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQlpZiAodGhpcy5jYXB0dXJlc1tpXS50YXJnZXQgPT09IGluVGFyZ2V0KSB7CgkJCQl0aGlzLmNhcHR1cmVzLnNwbGljZShpLDEpOwoJCQkJdGhpcy5zZXRDYXB0dXJlSW5mbyh0aGlzLmNhcHR1cmVzW3RoaXMuY2FwdHVyZXMubGVuZ3RoLTFdKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfSwKCS8vKiBTZXQgdGhlIGluZm9ybWF0aW9uIGZvciBhIGNhcHR1cmVkIGV2ZW50CglzZXRDYXB0dXJlSW5mbzogZnVuY3Rpb24oaW5JbmZvKSB7CgkJdGhpcy5jYXB0dXJlVGFyZ2V0ID0gaW5JbmZvICYmIGluSW5mby50YXJnZXQ7CgkJdGhpcy5mb3J3YXJkRXZlbnRzID0gaW5JbmZvICYmIGluSW5mby5mb3J3YXJkOwoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJImRvbS5jc3MiLAoJImRvbS5qcyIsCgkidHJhbnNmb3JtLmpzIiwKCSJDb250cm9sLmpzIiwKCSJwbGF0Zm9ybS5qcyIsCgkiYW5pbWF0aW9uLmpzIiwKCSJjb3Jkb3ZhLmpzIiwKCSJkaXNwYXRjaGVyLmpzIiwKCSJwcmV2aWV3LmpzIiwKCSJtb2RhbC5qcyIsCgkiZ2VzdHVyZS5qcyIsCgkiZHJhZy5qcyIsCgkidHJhbnNpdGlvbi5qcyIKKTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/platform.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglEZXRlcm1pbmVzIE9TIHZlcnNpb25zIG9mIHBsYXRmb3JtcyB0aGF0IG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQuCglDYW4gaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgoKCSogYW5kcm9pZAoJKiBhbmRyb2lkQ2hyb21lIChDaHJvbWUgb24gQW5kcm9pZCwgc3RhbmRhcmQgc3RhcnRpbmcgaW4gNC4xKQoJKiBhbmRyb2lkRmlyZWZveAoJKiBpZQoJKiBpb3MKCSogd2Vib3MKCSogYmxhY2tiZXJyeQoJKiBzYWZhcmkgKGRlc2t0b3AgdmVyc2lvbikKCSogY2hyb21lIChkZXNrdG9wIHZlcnNpb24pCgkqIGZpcmVmb3ggKGRlc2t0b3AgdmVyc2lvbikKCglJZiB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZCwgaXRzIHZhbHVlIHdpbGwgYmUgdGhlIG1ham9yIHZlcnNpb24JbnVtYmVyCglvZiB0aGUgcGxhdGZvcm0uCgoJRXhhbXBsZToKCgkJLy8gYW5kcm9pZCAyIGRvZXMgbm90IGhhdmUgM2QgY3NzCgkJaWYgKGVueW8ucGxhdGZvcm0uYW5kcm9pZCA8IDMpIHsKCQkJdCA9ICJ0cmFuc2xhdGUoMzBweCwgNTBweCkiOwoJCX0gZWxzZSB7CgkJCXQgPSAidHJhbnNsYXRlM2QoMzBweCwgNTBweCwgMCkiOwoJCX0KCQl0aGlzLmFwcGx5U3R5bGUoIi13ZWJraXQtdHJhbnNmb3JtIiwgdCk7CiovCmVueW8ucGxhdGZvcm0gPSB7CgkvLyogVHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaGFzIG5hdGl2ZSBzaW5nbGUgZmluZ2VyIGV2ZW50cwoJdG91Y2g6IEJvb2xlYW4oKCJvbnRvdWNoc3RhcnQiIGluIHdpbmRvdykgfHwgd2luZG93Lm5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzKSwKCS8vKiBUcnVlIGlmIHRoZSBwbGF0Zm9ybSBoYXMgbmF0aXZlIGRvdWJsZSBmaW5nZXIgZXZlbnRzCglnZXN0dXJlOiBCb29sZWFuKCgib25nZXN0dXJlc3RhcnQiIGluIHdpbmRvdykgfHwgd2luZG93Lm5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzKQp9OwoKLy8qIEBwcm90ZWN0ZWQKKGZ1bmN0aW9uKCkgewoJdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKCXZhciBlcCA9IGVueW8ucGxhdGZvcm07Cgl2YXIgcGxhdGZvcm1zID0gWwoJCS8vIEFuZHJvaWQgNCsgdXNpbmcgQ2hyb21lCgkJe3BsYXRmb3JtOiAiYW5kcm9pZENocm9tZSIsIHJlZ2V4OiAvQW5kcm9pZCAuKiBDaHJvbWVcLyhcZCspWy5cZF0rL30sCgkJLy8gQW5kcm9pZCAyIC0gNAoJCXtwbGF0Zm9ybTogImFuZHJvaWQiLCByZWdleDogL0FuZHJvaWQgKFxkKykvfSwKCQkvLyBLaW5kbGUgRmlyZQoJCS8vIEZvcmNlIHZlcnNpb24gdG8gMiwgKGRlc2t0b3AgbW9kZSBkb2VzIG5vdCBsaXN0IGFuZHJvaWQgdmVyc2lvbikKCQl7cGxhdGZvcm06ICJhbmRyb2lkIiwgcmVnZXg6IC9TaWxrXC8xLi8sIGZvcmNlVmVyc2lvbjogMiwgZXh0cmE6IHtzaWxrOiAxfX0sCgkJLy8gS2luZGxlIEZpcmUgSEQKCQkvLyBGb3JjZSB2ZXJzaW9uIHRvIDQKCQl7cGxhdGZvcm06ICJhbmRyb2lkIiwgcmVnZXg6IC9TaWxrXC8yLi8sIGZvcmNlVmVyc2lvbjogNCwgZXh0cmE6IHtzaWxrOiAyfX0sCgkJLy8gV2luZG93cyBQaG9uZSA3IC0gOAoJCXtwbGF0Zm9ybTogIndpbmRvd3NQaG9uZSIsIHJlZ2V4OiAvV2luZG93cyBQaG9uZSAoPzpPUyApPyhcZCspWy5cZF0rL30sCgkJLy8gSUUgOCAtIDEwCgkJe3BsYXRmb3JtOiAiaWUiLCByZWdleDogL01TSUUgKFxkKykvfSwKCQkvLyBpT1MgMyAtIDUKCQkvLyBBcHBsZSBsaWtlcyB0byBtYWtlIHRoaXMgY29tcGxpY2F0ZWQKCQl7cGxhdGZvcm06ICJpb3MiLCByZWdleDogL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspL30sCgkJLy8gd2ViT1MgMSAtIDMKCQl7cGxhdGZvcm06ICJ3ZWJvcyIsIHJlZ2V4OiAvKD86d2VifGhwdylPU1wvKFxkKykvfSwKCQkvLyBkZXNrdG9wIFNhZmFyaQoJCXtwbGF0Zm9ybTogInNhZmFyaSIsIHJlZ2V4OiAvVmVyc2lvblwvKFxkKylbLlxkXStccytTYWZhcmkvfSwKCQkvLyBkZXNrdG9wIENocm9tZQoJCXtwbGF0Zm9ybTogImNocm9tZSIsIHJlZ2V4OiAvQ2hyb21lXC8oXGQrKVsuXGRdKy99LAoJCS8vIEZpcmVmb3ggb24gQW5kcm9pZAoJCXtwbGF0Zm9ybTogImFuZHJvaWRGaXJlZm94IiwgcmVnZXg6IC9BbmRyb2lkOy4qRmlyZWZveFwvKFxkKykvfSwKCQkvLyBGaXJlZm94T1MKCQl7cGxhdGZvcm06ICJmaXJlZm94T1MiLCByZWdleDogL01vYmlsZTsuKkZpcmVmb3hcLyhcZCspL30sCgkJLy8gZGVza3RvcCBGaXJlZm94CgkJe3BsYXRmb3JtOiAiZmlyZWZveCIsIHJlZ2V4OiAvRmlyZWZveFwvKFxkKykvfSwKCQkvLyBCbGFja2JlcnJ5IDEwKwoJCXtwbGF0Zm9ybTogImJsYWNrYmVycnkiLCByZWdleDogL0JCMVxkOy4qVmVyc2lvblwvKFxkK1wuXGQrKS99LAoJCS8vIFRpemVuCgkJe3BsYXRmb3JtOiAidGl6ZW4iLCByZWdleDogL1RpemVuIChcZCspL30KCV07Cglmb3IgKHZhciBpID0gMCwgcCwgbSwgdjsgKHAgPSBwbGF0Zm9ybXNbaV0pOyBpKyspIHsKCQltID0gcC5yZWdleC5leGVjKHVhKTsKCQlpZiAobSkgewoJCQlpZiAocC5mb3JjZVZlcnNpb24pIHsKCQkJCXYgPSBwLmZvcmNlVmVyc2lvbjsKCQkJfSBlbHNlIHsKCQkJCXYgPSBOdW1iZXIobVsxXSk7CgkJCX0KCQkJZXBbcC5wbGF0Zm9ybV0gPSB2OwoJCQlpZiAocC5leHRyYSkgewoJCQkJZW55by5taXhpbihlcCwgcC5leHRyYSk7CgkJCX0KCQkJYnJlYWs7CgkJfQoJfQoJLy8gdGhlc2UgcGxhdGZvcm1zIG9ubHkgYWxsb3cgb25lIGFyZ3VtZW50IGZvciBjb25zb2xlLmxvZwoJZW55by5kdW1iQ29uc29sZSA9IEJvb2xlYW4oZXAuYW5kcm9pZCB8fCBlcC5pb3MgfHwgZXAud2Vib3MpOwp9KSgpOw==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/preview.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglEaXNwYXRjaGVyIHByZXZpZXcgZmVhdHVyZTogYWxsb3cgY29udHJvbCBhbmNlc3RvcnMgb2YgdGhlIGV2ZW50Cgl0YXJnZXQgYSBjaGFuY2UgKGVsZGVzdCBmaXJzdCkgdG8gcmVhY3QgdmlhIGltcGxlbWVudGluZyAicHJldmlld0RvbUV2ZW50LiIKKi8KLy8qIEBwcm90ZWN0ZWQKKGZ1bmN0aW9uKCkgewoJdmFyIGZuID0gInByZXZpZXdEb21FdmVudCI7CgkvLwoJdmFyIHByZXZpZXcgPSB7CgkJZmVhdHVyZTogZnVuY3Rpb24oZSkgewoJCQlwcmV2aWV3LmRpc3BhdGNoKGUsIGUuZGlzcGF0Y2hUYXJnZXQpOwoJCX0sCgkJZGlzcGF0Y2g6IGZ1bmN0aW9uKGUsIGMpIHsKCQkJdmFyIGwkID0gdGhpcy5idWlsZExpbmVhZ2UoYyk7CgkJCS8vIGhhbmRsZXJzIHJldHVybiB0cnVlIHRvIGFib3J0IHByZXZpZXcgYW5kIHByZXZlbnQgZGVmYXVsdCBldmVudCBwcm9jZXNzaW5nLgoJCQlmb3IgKHZhciBpPTAsIGw7IChsPWwkW2ldKTsgaSsrKSB7CgkJCQlpZiAobFtmbl0gJiYgbFtmbl0oZSkgPT09IHRydWUpIHsKCQkJCQllLnByZXZlbnREaXNwYXRjaCA9IHRydWU7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQl9CgkJfSwKCQkvLyB3ZSBhc2NlbmQgbWFraW5nIGEgbGlzdCBvZiBlbnlvIGNvbnRyb2xzCgkJLy8gTk9URTogdGhlIGNvbnRyb2wgaXMgY29uc2lkZXJlZCBpdHMgb3duIGFuY2VzdG9yCgkJYnVpbGRMaW5lYWdlOiBmdW5jdGlvbihpbkNvbnRyb2wpIHsKCQkJdmFyIGwgPSBbXSwgYyA9IGluQ29udHJvbDsKCQkJd2hpbGUgKGMpIHsKCQkJCWwudW5zaGlmdChjKTsKCQkJCWMgPSBjLnBhcmVudDsKCQkJfQoJCQlyZXR1cm4gbDsKCQl9Cgl9OwoJLy8KCWVueW8uZGlzcGF0Y2hlci5mZWF0dXJlcy5wdXNoKHByZXZpZXcuZmVhdHVyZSk7Cn0pKCk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/transform.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwcm90ZWN0ZWQKKGZ1bmN0aW9uKCkgewoJZW55by5kb20uY2FsY0NhbkFjY2VsZXJhdGUgPSBmdW5jdGlvbigpIHsKCQkvKiBBbmRyb2lkIDIgaXMgYSBsaWFyOiBpdCBkb2VzIE5PVCBzdXBwb3J0IDNEIHRyYW5zZm9ybXMsIGV2ZW4gdGhvdWdoIFBlcnNwZWN0aXZlIGlzIHRoZSBiZXN0IGNoZWNrICovCgkJaWYgKGVueW8ucGxhdGZvcm0uYW5kcm9pZCA8PSAyKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJdmFyIHAkID0gWyJwZXJzcGVjdGl2ZSIsICJXZWJraXRQZXJzcGVjdGl2ZSIsICJNb3pQZXJzcGVjdGl2ZSIsICJtc1BlcnNwZWN0aXZlIiwgIk9QZXJzcGVjdGl2ZSJdOwoJCWZvciAodmFyIGk9MCwgcDsgKHA9cCRbaV0pOyBpKyspIHsKCQkJaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlW3BdICE9ICJ1bmRlZmluZWQiKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9OwoJdmFyIGNzc1RyYW5zZm9ybVByb3BzID0gWyJ0cmFuc2Zvcm0iLCAiLXdlYmtpdC10cmFuc2Zvcm0iLCAiLW1vei10cmFuc2Zvcm0iLCAiLW1zLXRyYW5zZm9ybSIsICItby10cmFuc2Zvcm0iXTsKCXZhciBzdHlsZVRyYW5zZm9ybVByb3BzID0gWyJ0cmFuc2Zvcm0iLCAid2Via2l0VHJhbnNmb3JtIiwgIk1velRyYW5zZm9ybSIsICJtc1RyYW5zZm9ybSIsICJPVHJhbnNmb3JtIl07CgllbnlvLmRvbS5nZXRDc3NUcmFuc2Zvcm1Qcm9wID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuX2Nzc1RyYW5zZm9ybVByb3ApIHsKCQkJcmV0dXJuIHRoaXMuX2Nzc1RyYW5zZm9ybVByb3A7CgkJfQoJCXZhciBpID0gZW55by5pbmRleE9mKHRoaXMuZ2V0U3R5bGVUcmFuc2Zvcm1Qcm9wKCksIHN0eWxlVHJhbnNmb3JtUHJvcHMpOwoJCXRoaXMuX2Nzc1RyYW5zZm9ybVByb3AgPSBjc3NUcmFuc2Zvcm1Qcm9wc1tpXTsKCQlyZXR1cm4gdGhpcy5fY3NzVHJhbnNmb3JtUHJvcDsKCX07CgllbnlvLmRvbS5nZXRTdHlsZVRyYW5zZm9ybVByb3AgPSBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5fc3R5bGVUcmFuc2Zvcm1Qcm9wIHx8ICFkb2N1bWVudC5ib2R5KSB7CgkJCXJldHVybiB0aGlzLl9zdHlsZVRyYW5zZm9ybVByb3A7CgkJfQoJCWZvciAodmFyIGkgPSAwLCBwOyAocCA9IHN0eWxlVHJhbnNmb3JtUHJvcHNbaV0pOyBpKyspIHsKCQkJaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlW3BdICE9ICJ1bmRlZmluZWQiKSB7CgkJCQl0aGlzLl9zdHlsZVRyYW5zZm9ybVByb3AgPSBwOwoJCQkJcmV0dXJuIHRoaXMuX3N0eWxlVHJhbnNmb3JtUHJvcDsKCQkJfQoJCX0KCX07CgllbnlvLmRvbS5kb21UcmFuc2Zvcm1zVG9Dc3MgPSBmdW5jdGlvbihpblRyYW5zZm9ybXMpIHsKCQl2YXIgbiwgdiwgdGV4dCA9ICcnOwoJCWZvciAobiBpbiBpblRyYW5zZm9ybXMpIHsKCQkJdiA9IGluVHJhbnNmb3Jtc1tuXTsKCQkJaWYgKCh2ICE9PSBudWxsKSAmJiAodiAhPT0gdW5kZWZpbmVkKSAmJiAodiAhPT0gIiIpKSB7CgkJCQl0ZXh0ICs9ICBuICsgJygnICsgdiArICcpICc7CgkJCX0KCQl9CgkJcmV0dXJuIHRleHQ7Cgl9OwoJZW55by5kb20udHJhbnNmb3Jtc1RvRG9tID0gZnVuY3Rpb24oaW5Db250cm9sKSB7CgkJdmFyIHQgPSB0aGlzLmRvbVRyYW5zZm9ybXNUb0NzcyhpbkNvbnRyb2wuZG9tVHJhbnNmb3Jtcyk7CgkJdmFyIHN0ID0gaW5Db250cm9sLmhhc05vZGUoKSA/IGluQ29udHJvbC5ub2RlLnN0eWxlIDogbnVsbDsKCQl2YXIgZHMgPSBpbkNvbnRyb2wuZG9tU3R5bGVzOwoJCXZhciBzcCA9IHRoaXMuZ2V0U3R5bGVUcmFuc2Zvcm1Qcm9wKCk7CgkJdmFyIGNwID0gdGhpcy5nZXRDc3NUcmFuc2Zvcm1Qcm9wKCk7CgkJaWYgKHNwICYmIGNwKSB7CgkJCWRzW2NwXSA9IHQ7CgkJCWlmIChzdCkgewoJCQkJc3Rbc3BdID0gdDsKCQkJfSBlbHNlIHsKCQkJCWluQ29udHJvbC5kb21TdHlsZXNDaGFuZ2VkKCk7CgkJCX0KCQl9Cgl9OwoJLy8qIEBwdWJsaWMKCS8qKgoJCVJldHVybnMgdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgQ1NTMyBUcmFuc2Zvcm1zCgkqLwoJZW55by5kb20uY2FuVHJhbnNmb3JtID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIEJvb2xlYW4odGhpcy5nZXRTdHlsZVRyYW5zZm9ybVByb3AoKSk7Cgl9OwoJLyoqCgkJUmV0dXJucyB0cnVlIGlmIHBsYXRmb3JtIHN1cHBvcnRzIENTUzMgM0QgVHJhbnNmb3Jtcy4KCgkJVHlwaWNhbGx5IHVzZWQgbGlrZSB0aGlzOgoKCQkJaWYgKGVueW8uZG9tLmNhbkFjY2VsZXJhdGUoKSkgewoJCQkJZW55by5kb20udHJhbnNmb3JtVmFsdWUodGhpcy4kLnNsaWRpbmdUaGluZywgInRyYW5zbGF0ZTNkIiwgeCArICIsIiArIHkgKyAiLCIgKyAiMCIpCgkJCX0gZWxzZSB7CgkJCQllbnlvLmRvbS50cmFuc2Zvcm1WYWx1ZSh0aGlzLiQuc2xpZGluZ1RoaW5nLCAidHJhbnNsYXRlIiwgeCArICIsIiArIHkpOwoJCQl9CgoJKi8KCWVueW8uZG9tLmNhbkFjY2VsZXJhdGUgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5hY2NlbGVyYW5kbyAhPT0gdW5kZWZpbmVkID8gdGhpcy5hY2NlbGVyYW5kbzogZG9jdW1lbnQuYm9keSAmJiAodGhpcy5hY2NlbGVyYW5kbyA9IHRoaXMuY2FsY0NhbkFjY2VsZXJhdGUoKSk7Cgl9OwoJLyoqCgkJQXBwbGllcyBhIHNlcmllcyBvZiB0cmFuc2Zvcm1zIHRvIF9pbkNvbnRyb2xfLCB1c2luZyB0aGUgcGxhdGZvcm0ncyBwcmVmaXhlZCB0cmFuc2Zvcm0gcHJvcGVydHkuCgoJCSoqTm90ZToqKiBUcmFuc2Zvcm1zIGFyZSBub3QgY29tbXV0YXRpdmUsIHNvIG9yZGVyIGlzIGltcG9ydGFudAoKCQlUcmFuc2Zvcm0gdmFsdWVzIGFyZSB1cGRhdGVkIGJ5IHN1Y2Nlc3NpdmUgY2FsbHM6CgoJCQllbnlvLmRvbS50cmFuc2Zvcm0oY29udHJvbCwge3RyYW5zbGF0ZTogIjMwcHgsIDQwcHgiLCBzY2FsZTogMiwgcm90YXRlOiAiMjBkZWcifSk7CgkJCWVueW8uZG9tLnRyYW5zZm9ybShjb250cm9sLCB7c2NhbGU6IDMsIHNrZXdYOiAiLTMwZGVnIn0pOwoKCQlpcyBlcXVpdmFsZW50IHRvOgoKCQkJZW55by5kb20udHJhbnNmb3JtKGNvbnRyb2wsIHt0cmFuc2xhdGU6ICIzMHB4LCA0MHB4Iiwgc2NhbGU6IDMsIHJvdGF0ZTogIjIwZGVnIiwgc2tld1g6ICItMzBkZWcifSk7CgoJCVdoZW4gYXBwbHlpbmcgdGhlc2UgdHJhbnNmb3JtcyBpbiB3ZWJraXQgYnJvd3NlciwgdGhpcyBpcyBlcXVpdmFsZW50IHRvOgoKCQkJY29udHJvbC5hcHBseVN0eWxlKCItd2Via2l0LXRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoMzBweCwgNDBweCkgc2NhbGUoMykgcm90YXRlKDIwZGVnKSBza2V3WCgtMzBkZWcpIik7CgoJCUFuZCBpbiBmaXJlZm94LCB0aGlzIGlzIGVxdWl2YWxlbnQgdG86CgoJCQljb250cm9sLmFwcGx5U3R5bGUoIi1tb3otdHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgzMHB4LCA0MHB4KSBzY2FsZSgzKSByb3RhdGUoMjBkZWcpIHNrZXdYKC0zMGRlZykiKTsKCgkqLwoJZW55by5kb20udHJhbnNmb3JtID0gZnVuY3Rpb24oaW5Db250cm9sLCBpblRyYW5zZm9ybXMpIHsKCQl2YXIgZCA9IGluQ29udHJvbC5kb21UcmFuc2Zvcm1zID0gaW5Db250cm9sLmRvbVRyYW5zZm9ybXMgfHwge307CgkJZW55by5taXhpbihkLCBpblRyYW5zZm9ybXMpOwoJCXRoaXMudHJhbnNmb3Jtc1RvRG9tKGluQ29udHJvbCk7Cgl9OwoKCS8qKgoJCUFwcGx5IGEgc2luZ2xlIHRyYW5zZm9ybSB0byBfaW5Db250cm9sXy4KCgkJRXhhbXBsZToKCgkJCXRhcDogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQkJCXZhciBjID0gaW5FdmVudC5vcmlnaW5hdG9yOwoJCQkJdmFyIHIgPSBjLnJvdGF0aW9uIHx8IDA7CgkJCQlyID0gKHIgKyA0NSkgJSAzNjA7CgkJCQljLnJvdGF0aW9uID0gcjsKCQkJCWVueW8uZG9tLnRyYW5zZm9ybVZhbHVlKGMsICJyb3RhdGUiLCByKTsKCQkJfQoKCQlUaGlzIHdpbGwgcm90YXRlIHRoZSB0YXBwZWQgY29udHJvbCBieSA0NSBkZWdyZWVzIGNsb2Nrd2lzZS4KCSovCgllbnlvLmRvbS50cmFuc2Zvcm1WYWx1ZSA9IGZ1bmN0aW9uKGluQ29udHJvbCwgaW5UcmFuc2Zvcm0sIGluVmFsdWUpIHsKCQl2YXIgZCA9IGluQ29udHJvbC5kb21UcmFuc2Zvcm1zID0gaW5Db250cm9sLmRvbVRyYW5zZm9ybXMgfHwge307CgkJZFtpblRyYW5zZm9ybV0gPSBpblZhbHVlOwoJCXRoaXMudHJhbnNmb3Jtc1RvRG9tKGluQ29udHJvbCk7Cgl9OwoJLy8qIEBwcm90ZWN0ZWQKCS8qKgoJCUFwcGxpZXMgYSB0cmFuc2Zvcm0gdGhhdCBzaG91bGQgdHJpZ2dlciBHUFUgY29tcG9zaXRpbmcgZm9yIF9pbkNvbnRyb2xfCgkqLwoJZW55by5kb20uYWNjZWxlcmF0ZSA9IGZ1bmN0aW9uKGluQ29udHJvbCwgaW5WYWx1ZSkgewoJCXZhciB2ID0gaW5WYWx1ZSA9PSAiYXV0byIgPyB0aGlzLmNhbkFjY2VsZXJhdGUoKSA6IGluVmFsdWU7CgkJdGhpcy50cmFuc2Zvcm1WYWx1ZShpbkNvbnRyb2wsICJ0cmFuc2xhdGVaIiwgdiA/IDAgOiBudWxsKTsKCX07Cn0pKCk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/dom/transition.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kb20udHJhbnNpdGlvbiA9IChlbnlvLnBsYXRmb3JtLmlvcyB8fCBlbnlvLnBsYXRmb3JtLmFuZHJvaWQgfHwgZW55by5wbGF0Zm9ybS5jaHJvbWUgfHwgZW55by5wbGF0Zm9ybS5hbmRyb2lkQ2hyb21lIHx8IGVueW8ucGxhdGZvcm0uc2FmYXJpKQoJPyAiLXdlYmtpdC10cmFuc2l0aW9uIgoJOiAoZW55by5wbGF0Zm9ybS5maXJlZm94IHx8IGVueW8ucGxhdGZvcm0uZmlyZWZveE9TIHx8IGVueW8ucGxhdGZvcm0uYW5kcm9pZEZpcmVmb3gpCgkJPyAiLW1vei10cmFuc2l0aW9uIgoJCTogInRyYW5zaXRpb24iOw==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/enyo.design"
Content-Type: application/octet-stream; x-encoding=base64
ewogICAgInBhbGV0dGUiOiBbCiAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogIkVueW8iLAogICAgICAgICAgICAiaXRlbXMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZW55by5TY3JvbGxlciIsCiAgICAgICAgICAgICAgICAgICAgImtpbmQiOiAiZW55by5TY3JvbGxlciIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc2Nyb2xsZXIiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJraW5kIjogImVueW8uU2Nyb2xsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZml0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiZW55by5SZXBlYXRlciIsCiAgICAgICAgICAgICAgICAgICAgImtpbmQiOiAiZW55by5SZXBlYXRlciIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgcmVwZWF0ZXIiLAogICAgICAgICAgICAgICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJraW5kIjogImVueW8uUmVwZWF0ZXIiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlzUmVwZWF0ZXIiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgfQogICAgXSwKICAgICJpbnNwZWN0b3IiOiBbCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJraW5kIiwKICAgICAgICAgICAgIm5hbWUiOiAiZW55by5SZXBlYXRlciIsCiAgICAgICAgICAgICJldmVudHMiOiB7CiAgICAgICAgICAgICAgICAib25TZXR1cEl0ZW0iOiB7CiAgICAgICAgICAgICAgICAgICAgImZpbHRlckxldmVsIjogInVzZWZ1bCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIF0KfQo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ext/BooleanBinding.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJX2VueW8uQm9vbGVhbkJpbmRpbmdfIGlzIGEgYmluZGluZyB0aGF0IHdpbGwgdHlwZS1jYXN0IGFueSB0cnV0aHkgb3IgZmFsc2V5CgkJdmFsdWUgdG8gYW4gZXhwbGljaXQgYm9vbGVhbiB2YWx1ZS4KCSovCgllbnlvLmtpbmQoewoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgUFJPUEVSVElFUwoKCQkvLypAcHVibGljCgkJbmFtZTogImVueW8uQm9vbGVhbkJpbmRpbmciLAoKCQkvLypAcHVibGljCgkJa2luZDogImVueW8uQmluZGluZyIsCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBNRVRIT0RTCgoJCS8vKkBwcm90ZWN0ZWQKCQl0cmFuc2Zvcm06IGZ1bmN0aW9uICh2YWx1ZSwgZGlyZWN0aW9uLCBiaW5kaW5nKSB7CgkJCXJldHVybiAhISB2YWx1ZTsKCQl9CgoJfSk7Cgp9KShlbnlvKTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ext/BooleanOnlyBinding.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJX2VueW8uQm9vbGVhbk9ubHlCaW5kaW5nXyBpcyBhIGJpbmRpbmcgdGhhdCB3aWxsIG9ubHkgY29udGludWUgcHJvcGFnYXRpb24KCQlpZiB0aGUgdmFsdWUgYmVpbmcgcGFzc2VkIGlzIGFuIGV4cGxpY2l0IGJvb2xlYW4gdmFsdWUuCgkqLwoJZW55by5raW5kKHsKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFVCTElDIFBST1BFUlRJRVMKCgkJLy8qQHB1YmxpYwoJCW5hbWU6ICJlbnlvLkJvb2xlYW5Pbmx5QmluZGluZyIsCgoJCS8vKkBwdWJsaWMKCQlraW5kOiAiZW55by5CaW5kaW5nIiwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIE1FVEhPRFMKCgkJLy8qQHByb3RlY3RlZAoJCXRyYW5zZm9ybTogZnVuY3Rpb24gKHZhbHVlLCBkaXJlY3Rpb24sIGJpbmRpbmcpIHsKCQkJaWYgKHZhbHVlICE9PSB0cnVlICYmIHZhbHVlICE9PSBmYWxzZSkgewoJCQkJYmluZGluZy5zdG9wKCk7CgkJCX0KCQkJcmV0dXJuIHZhbHVlOwoJCX0KCgl9KTsKCn0pKGVueW8pOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ext/InputBinding.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGhpcyBiaW5kaW5nIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBpdHMgc291cmNlIG9yIHRhcmdldAoJCWJlaW5nIGFuIF9pbnB1dF8gd2l0aCBhbiBvcHRpb25hbCBfcGxhY2Vob2xkZXJfIHZhbHVlLiBUaGlzCgkJd2lsbCBrZWVwIGFuIGlucHV0IGZyb20gc2hvd2luZyBhbiB1Z2x5IHVuZGVmaW5lZCB3aGVuIHRoZXJlCgkJaXMgbm8gY29udGVudCBhbmQgaW5zdGVhZCBwcm9wYWdhdGUgdGhlIF9wbGFjZWhvbGRlcl8gdmFsdWUKCQl0byB0aGUgb3Bwb3NpdGUgZW5kLgoJKi8KCWVueW8ua2luZCh7CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQluYW1lOiAiZW55by5JbnB1dEJpbmRpbmciLAoKCQkvLypAcHVibGljCgkJa2luZDogImVueW8uQmluZGluZyIsCgoJCS8vKkBwdWJsaWMKCQl0d29XYXk6IHRydWUsCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBNRVRIT0RTCgoJCS8vKkBwcm90ZWN0ZWQKCQl0cmFuc2Zvcm06IGZ1bmN0aW9uICh2YWx1ZSwgZGlyZWN0aW9uLCBiaW5kaW5nKSB7CgkJCXZhciBzb3VyY2UgPSBiaW5kaW5nLnNvdXJjZSB8fCB7fTsKCQkJdmFyIHRhcmdldCA9IGJpbmRpbmcudGFyZ2V0IHx8IHt9OwoJCQl2YXIgcGggPSBzb3VyY2UucGxhY2hvbGRlciB8fCB0YXJnZXQucGxhY2Vob2xkZXIgfHwgIiI7CgkJCWlmICghZW55by5leGlzdHModmFsdWUpIHx8IG51bGwgPT09IHZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgewoJCQkJcmV0dXJuIHBoOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHZhbHVlOwoJCQl9CgkJfQoKCX0pOwoKfSkoZW55byk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ext/macroize.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwdWJsaWMKCi8qKgoJUG9wdWxhdGVzIGEgc3RyaW5nIHRlbXBsYXRlIHdpdGggZGF0YSB2YWx1ZXMuCgoJUmV0dXJucyBhIGNvcHkgb2YgX2luVGV4dF8sIHdpdGggbWFjcm9zIGRlZmluZWQgYnkgX2luUGF0dGVybl8gcmVwbGFjZWQgYnkKCW5hbWVkIHZhbHVlcyBpbiBfaW5NYXBfLgoKCV9pblBhdHRlcm5fIG1heSBiZSBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IG1hY3JvIHBhdHRlcm4gaXMgdXNlZC4KCVRoZSBkZWZhdWx0IHBhdHRlcm4gbWF0Y2hlcyBtYWNyb3Mgb2YgdGhlIGZvcm0KCgkJeyRuYW1lfQoKCUV4YW1wbGU6CgoJCS8vIFJldHVybnMgIk15IG5hbWUgaXMgQmFybmV5LiIKCQllbnlvLm1hY3JvaXplKCJNeSBuYW1lIGlzIHskbmFtZX0uIiwge25hbWU6ICJCYXJuZXkifSk7CgoJRG90IG5vdGF0aW9uIGlzIHN1cHBvcnRlZCwgbGlrZSBzbzoKCgkJdmFyIGluZm8gPSB7CgkJCXByb2R1Y3RfMDogewoJCQkJbmFtZTogIkdpem1vIgoJCQkJd2VpZ2h0OiAzCgkJCX0KCQl9CgkJLy8gUmV0dXJucyAiRWFjaCBHaXptbyB3ZWlnaHMgMyBwb3VuZHMuIgoJCWVueW8ubWFjcm9pemUoIkVhY2ggeyRwcm9kdWN0XzAubmFtZX0gd2VpZ2hzIHskcHJvZHVjdF8wLndlaWdodH0gcG91bmRzLiIsIGluZm8pOwoqLwplbnlvLm1hY3JvaXplID0gZnVuY3Rpb24oaW5UZXh0LCBpbk1hcCwgaW5QYXR0ZXJuKSB7Cgl2YXIgdiwgd29ya2luZywgcmVzdWx0ID0gaW5UZXh0LCBwYXR0ZXJuID0gaW5QYXR0ZXJuIHx8IGVueW8ubWFjcm9pemUucGF0dGVybjsKCXZhciBmbiA9IGZ1bmN0aW9uKG1hY3JvLCBuYW1lKSB7CgkJdiA9IGVueW8uZ2V0UGF0aC5jYWxsKGluTWFwLCBuYW1lKTsKCQlpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIHsKCQkJcmV0dXJuICJ7JCIgKyBuYW1lICsgIn0iOwoJCX0KCQl3b3JraW5nID0gdHJ1ZTsKCQlyZXR1cm4gdjsKCX07Cgl2YXIgcHJldmVudCA9IDA7CglkbyB7CgkJd29ya2luZyA9IGZhbHNlOwoJCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHBhdHRlcm4sIGZuKTsKCQkvLyBpZiBpdGVyYXRpbmcgbW9yZSB0aGFuIDIwIHRpbWVzLCB3ZSBhc3N1bWUgYSByZWN1cnNpb24gKHdlIHNob3VsZCBwcm9iYWJseSB0aHJvdykKCQlpZiAoKytwcmV2ZW50ID49IDIwKSB7CgkJCXRocm93KCJlbnlvLm1hY3JvaXplOiByZWN1cnNpb24gdG9vIGRlZXAiKTsKCQl9Cgl9IHdoaWxlICh3b3JraW5nKTsKCXJldHVybiByZXN1bHQ7Cn07CgovKioKCVNpbWlsYXIgdG8gX2VueW8ubWFjcm9pemVfLCBidXQgcGVyZm9ybXMgb25seSBvbmUgaXRlcmF0aW9uIG9mIHRoZSBfcmVwbGFjZV8KCWNhbGwuIFRoaXMgbWVhbnMgdGhhdCByZWN1cnNpdmUgZXhwYW5zaW9uIG9mIG1hY3JvcyBpc24ndCBwb3NzaWJsZSwgYnV0IGl0Cglhdm9pZHMgdGhlIGV4dHJhIHByb2Nlc3NpbmcgbmVlZGVkIHRvIGZpbmQgcmVjdXJzaXZlIHVzZS4KKi8KZW55by5xdWlja01hY3JvaXplID0gZnVuY3Rpb24oaW5UZXh0LCBpbk1hcCwgaW5QYXR0ZXJuKSB7Cgl2YXIgdiwgcmVzdWx0ID0gaW5UZXh0LCBwYXR0ZXJuID0gaW5QYXR0ZXJuIHx8IGVueW8ubWFjcm9pemUucGF0dGVybjsKCXZhciBmbiA9IGZ1bmN0aW9uKG1hY3JvLCBuYW1lKSB7CgkJaWYgKG5hbWUgaW4gaW5NYXApIHsKCQkJdiA9IGluTWFwW25hbWVdOwoJCX0gZWxzZSB7CgkJCXYgPSBlbnlvLmdldFBhdGguY2FsbChpbk1hcCwgbmFtZSk7CgkJfQoJCXJldHVybiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpID8gInskIiArIG5hbWUgKyAifSIgOiB2OwoJfTsKCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHBhdHRlcm4sIGZuKTsKCXJldHVybiByZXN1bHQ7Cn07CgovLyogQHByb3RlY3RlZAoKLy8gTWF0Y2hlcyBtYWNyb3Mgb2YgdGhlIGZvcm0geyRuYW1lfS4KZW55by5tYWNyb2l6ZS5wYXR0ZXJuID0gL1x7XCQoW157fV0qKVx9L2c7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ext/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJIm1hY3JvaXplLmpzIiwKCSJJbnB1dEJpbmRpbmcuanMiLAoJIkJvb2xlYW5CaW5kaW5nLmpzIiwKCSJCb29sZWFuT25seUJpbmRpbmcuanMiCik7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/Application.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJVHJhY2tzIHRoZSBhcHBsaWNhdGlvbnMgcnVubmluZyBhdCBhbnkgZ2l2ZW4gdGltZS4gRm9yIHRoZSBzYWtlIG9mCgkJY29udmVuaWVuY2UsIGFuZCBpbiBvcmRlciB0byBwcm92aWRlIHNvbWUgZGVidWdnaW5nIHRvb2xzLCB3ZSBjb2xsZWN0CgkJdGhlIHJ1bm5pbmcgYXBwcyBoZXJlIGZvciBsYXRlciByZWZlcmVuY2UuIFdoZW4gX2VueW8uQXBwbGljYXRpb25fCgkJaW5zdGFuY2VzIGFyZSBkZXN0cm95ZWQsIHRoZXkga25vdyB0byByZW1vdmUgdGhlbXNlbHZlcyBmcm9tIHRoaXMgdGFibGUuCgkqLwoJdmFyIGFwcGxpY2F0aW9ucyA9IGVueW8uYXBwbGljYXRpb25zID0ge307CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJVXNlZCBpbnRlcm5hbGx5OyBtYWludGFpbnMgcmVnaXN0cmF0aW9uIG9mIGFwcGxpY2F0aW9ucyB3aXRoIHRoZQoJCWZyYW1ld29yay4KCSovCgl2YXIgcmVnaXN0ZXIgPSBmdW5jdGlvbiAoYXBwKSB7CgkJYXBwbGljYXRpb25zW2FwcC5pZF0gPSBhcHA7Cgl9OwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCVVzZWQgaW50ZXJuYWxseTsgdW5yZWdpc3RlcnMgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSBiZWVuIGRlc3Ryb3llZC4KCSovCgl2YXIgdW5yZWdpc3RlciA9IGZ1bmN0aW9uIChhcHApIHsKCQl2YXIga2luZCA9IGFwcC5raW5kTmFtZTsKCQl2YXIga2luZHMgPSBhcHBsaWNhdGlvbnNba2luZF0gfHwgW107CgkJdmFyIGlkeCA9IGVueW8uaW5kZXhPZihhcHAsIGtpbmRzKTsKCQlpZiAoIX5pZHgpIHsKCQkJa2luZHMuc3BsaWNlKGlkeCwgMSk7CgkJfQoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX2Rlc3Ryb3lfY29udHJvbGxlcnMgPSBmdW5jdGlvbiAoKSB7CgkJdmFyIG5hbWU7CgkJLy8gd2UgaXRlcmF0ZSBvdmVyIHRoZSBjb250cm9sbGVycyB0aGF0IGFyZSBzdG9yZWQgaW4KCQkvLyB0aGUgYXBwbGljYXRpb24gaGFzaAoJCWZvciAobmFtZSBpbiB0aGlzLmNvbnRyb2xsZXJzKSB7CgkJCS8vIHdlIGNhbid0IGtub3cgdGhhdCBhbGwgb2YgdGhvc2UgY29udHJvbGxlcnMgd2VyZSBwbGFjZWQKCQkJLy8gdGhlcmUgYnkgdGhpcyBhcHBsaWNhdGlvbiBvciB0aGF0IGl0cyBvd25lciBoYXNuJ3QgYmVlbgoJCQkvLyBzZXQgdG8gc29tZXRoaW5nIGVsc2UgKG93bmVyIGltcGx5aW5nIHRoaXMgYXBwbGljYXRpb24KCQkJLy8gaW5zdGFuY2VkIHRoZSBjb250cm9sbGVyIGFuZCB0aHVzIGlzIHJlc3BvbnNpYmxlIGZvciBpdHMKCQkJLy8gbGlmZS1jeWNsZSkgc28gd2UgdGVzdCBmb3IgdGhhdCBhbmQgZGVzdHJveSBpdCBpZiBpdCBpcwoJCQlpZiAodGhpcyA9PT0gdGhpcy5jb250cm9sbGVyc1tuYW1lXS5vd25lcikgewoJCQkJaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiB0aGlzLmNvbnRyb2xsZXJzW25hbWVdLmRlc3Ryb3kpIHsKCQkJCQl0aGlzLmNvbnRyb2xsZXJzW25hbWVdLmRlc3Ryb3koKTsKCQkJCX0KCQkJfQoJCQkvLyByZWdhcmRsZXNzIG9mIG93bmVyc2hpcCB3ZSByZWxlYXNlIHRoZSBjb250cm9sbGVyIHJlZmVyZW5jZQoJCQkvLyBhbmQgaG9wZSB3aG9ldmVyIHdhcyByZXNwb25zaWJsZSBmb3IgdGhlIGNvbnRyb2xsZXIgd2lsbAoJCQkvLyBjbGVhbiBpdCB1cAoJCQlkZWxldGUgdGhpcy5jb250cm9sbGVyc1tuYW1lXTsKCQl9CgkJLy8gcmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBlbnRpcmVseQoJCWRlbGV0ZSB0aGlzLmNvbnRyb2xsZXJzOwoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX3NldHVwX2NvbnRyb2xsZXJzID0gZnVuY3Rpb24gKCkgewoJCXZhciBraW5kcyA9IHRoaXMuY29udHJvbGxlcnMgfHwgW107CgkJdmFyIGNvbnRyb2xsZXJzID0gdGhpcy5jb250cm9sbGVycyA9IHt9OwoJCXZhciBsZW4gPSBraW5kcy5sZW5ndGg7CgkJdmFyIGlkeCA9IDA7CgkJdmFyIGtpbmQ7CgkJZm9yICg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJa2luZCA9IGtpbmRzW2lkeF07CgkJCS8vIHdlIG5lZWQgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgaXMgZ2xvYmFsCgkJCS8vIG9yIGFwcC1zcGVjaWZpYwoJCQl2YXIgbmFtZSA9IGtpbmQubmFtZTsKCQkJLy8gdGhlcmUgaXMgdGhlIG9wdGlvbmFsIGdsb2JhbCBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBjb250cm9sbGVyCgkJCS8vIGlzIHRvIGJlIGluc3RhbmNlZCBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUgYXBwbGljYXRpb24KCQkJdmFyIGdsb2JhbCA9IEJvb2xlYW4oa2luZC5nbG9iYWwpOwoJCQl2YXIgQ3RvcjsKCQkJdmFyIGluc3Q7CgkJCS8vIGNsZWFudXAKCQkJZGVsZXRlIGtpbmQuZ2xvYmFsOwoJCQlkZWxldGUga2luZC5uYW1lOwoJCQkvLyBpZiB0aGUgZGVmaW5pdGlvbiBkb2VzIG5vdCBzdXBwbHkgYSBjb250cm9sbGVyIGtpbmQsIHdlIGFkZCBvbmUKCQkJaWYgKCEoImtpbmQiIGluIGtpbmQpKSB7CgkJCQlraW5kLmtpbmQgPSAiZW55by5Db250cm9sbGVyIjsKCQkJfQoJCQkvLyBjcmVhdGUgYSBraW5kIGNvbnN0cnVjdG9yIGZvciB0aGUgY29udHJvbGxlciB3aXRoIGFsbCBvZiB0aGUgZ2l2ZW4KCQkJLy8gcHJvcGVydGllcwoJCQlDdG9yID0gZW55by5raW5kKGtpbmQpOwoJCQlpbnN0ID0gbmV3IEN0b3Ioe293bmVyOiB0aGlzLCBhcHA6IHRoaXN9KTsKCQkJLy8gaWYgdGhlIGNvbnRyb2xsZXIgaXMgbm90IGEgZ2xvYmFsIGNvbnRyb2xsZXIsIHdlIGNyZWF0ZSBpdCBhcyBwYXJ0CgkJCS8vIG9mIG91ciBhcHBsaWNhdGlvbnMgY29udHJvbGxlciBzdG9yZQoJCQlpZiAoZmFsc2UgPT09IGdsb2JhbCkgewoJCQkJY29udHJvbGxlcnNbbmFtZV0gPSBpbnN0OwoJCQl9IGVsc2UgewoJCQkJZW55by5zZXRQYXRoKG5hbWUsIGluc3QpOwoJCQl9CgkJfQoJfTsKCgkvLypAcHJvdGVjdGVkCgllbnlvLmtpbmQucG9zdENvbnN0cnVjdG9ycy5wdXNoKGZ1bmN0aW9uICgpIHsKCQlpZiAoIXRoaXMuX2lzX2FwcGxpY2F0aW9uKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIG5vdyB0aGF0IGFueSBjb250cm9sbGVycyBmb3IgdGhlIGFwcGxpY2F0aW9uIGhhdmUgYmVlbgoJCS8vIGluaXRpYWxpemVkLCB3ZSB0ZXN0IHRvIHNlZSBpZiB3ZSdyZSBzdXBwb3NlZCB0bwoJCS8vIGF1dG9tYXRpY2FsbHkgc3RhcnQKCQlpZiAodHJ1ZSA9PT0gdGhpcy5hdXRvU3RhcnQpIHsKCQkJdGhpcy5zdGFydCgpOwoJCX0KCX0pOwoKCS8vKkBwdWJsaWMKCS8qKgoJCV9lbnlvLkFwcGxpY2F0aW9uXyBpcyBhIGtpbmQgdXNlZCB0byBjb29yZGluYXRlIGV4ZWN1dGlvbiBvZiBhIGdpdmVuCgkJY29sbGVjdGlvbiBvZiBfZW55b18gb2JqZWN0cy4gVGhlcmUgbWF5IGJlIG9uZSBvciBtb3JlIGluc3RhbmNlcwoJCXJ1bm5pbmctLXdpdGggY2VydGFpbiBsaW1pdGF0aW9ucywgc3VjaCBhcyB3aGljaCBvbmUgaXMgcmVuZGVyZWQgaW50bwoJCXRoZSBfZG9jdW1lbnQuYm9keV8uIChUaGVyZSBpcyBubyBsaW1pdGF0aW9uIGlmIGVhY2ggaW5zdGFuY2UgaXMKCQlyZW5kZXJlZCBpbnRvIGEgc2VwYXJhdGUgRE9NIG5vZGUsIG9yIGlmIHRoZSBpbnN0YW5jZXMgYXJlIG5lc3RlZC4pCgoJCVRoaXMga2luZCBhbHNvIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIG5hbWVzcGFjZSBhbmQgYXV0b21hdGljYWxseQoJCWluaXRpYWxpemUgYW55IGNvbnRyb2xsZXJzIG9mIHRoZSBhcHBsaWNhdGlvbi4KCSovCgllbnlvLmtpbmQoewoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgUFJPUEVSVElFUwoKCQkvLypAcHVibGljCgkJbmFtZTogImVueW8uQXBwbGljYXRpb24iLAoKCQkvLypAcHVibGljCgkJa2luZDogImVueW8uVmlld0NvbnRyb2xsZXIiLAoKCQkvLypAcHVibGljCgkJYXV0b1N0YXJ0OiB0cnVlLAoKCQkvLypAcHVibGljCgkJcmVuZGVyT25TdGFydDogdHJ1ZSwKCgkJLy8qQHB1YmxpYwoJCWNvbnRyb2xsZXJzOiBudWxsLAoKCQkvLypAcHVibGljCgkJY29uY2F0OiBbImNvbnRyb2xsZXJzIl0sCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBQUk9QRVJUSUVTCgoJCS8vKkBwcm90ZWN0ZWQKCQlfaXNfYXBwbGljYXRpb246IHRydWUsCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBNRVRIT0RTCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJSWYgdGhlIF9hdXRvU3RhcnRfIGZsYWcgaXMgc2V0IHRvIHRydWUsIHRoaXMgbWV0aG9kIGlzCgkJCWF1dG9tYXRpY2FsbHkgZXhlY3V0ZWQgd2hlbiB0aGUgY29uc3RydWN0b3IgaXMgY2FsbGVkLiBPdGhlcndpc2UsCgkJCWl0IG1heSBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGJlZ2luIGV4ZWN1dGlvbi4KCQkqLwoJCXN0YXJ0OiBmdW5jdGlvbiAoKSB7CgkJCWlmICh0cnVlID09PSB0aGlzLnJlbmRlck9uU3RhcnQpIHsKCQkJCXRoaXMucmVuZGVyKCk7CgkJCX0KCQl9LAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgTUVUSE9EUwoKCQkvLypAcHJvdGVjdGVkCgkJY29uc3RydWN0b3I6IGZ1bmN0aW9uIChwcm9wcykgewoJCQlpZiAocHJvcHMgJiYgZW55by5leGlzdHMocHJvcHMubmFtZSkpIHsKCQkJCWVueW8uc2V0UGF0aChwcm9wcy5uYW1lLCB0aGlzKTsKCQkJCXRoaXMuaWQgPSBwcm9wcy5uYW1lOwoJCQkJZGVsZXRlIHByb3BzLm5hbWU7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmlkID0gZW55by51aWQoIl9hcHBsaWNhdGlvbl8iKTsKCQkJfQoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCQkvLyB3ZSByZWdpc3RlciBraW5kIG9mIGVhcmx5IGluIHRoZSBwcm9jZXNzIGluIGNhc2UgYW55IGNvbnRyb2xsZXJzCgkJCS8vIG9yIG90aGVyIGluaXRpYWxpemF0aW9uIGFzc3VtZXMgaXQgd2lsbCBiZSB0aGVyZS4uLgoJCQlyZWdpc3Rlcih0aGlzKTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJY29uc3RydWN0ZWQ6IGZ1bmN0aW9uICgpIHsKCQkJLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29udHJvbGxlcnMgYXJlIGFscmVhZHkgaW5pdGlhbGl6ZWQKCQkJLy8gYmVmb3JlIHdlIGNyZWF0ZSBvdXIgdmlldyBhY2NvcmRpbmcgdG8gdGhlIHZpZXcgY29udHJvbGxlcidzIEFQSQoJCQlfc2V0dXBfY29udHJvbGxlcnMuY2FsbCh0aGlzKTsKCQkJLy8gbm93IHdlIGxldCBpdCBjb250aW51ZSBhcyB1c3VhbAoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQkvKioKCQkJVGhlIG92ZXJsb2FkZWQgXF9jcmVhdGVfdmlldyBtZXRob2QgZW5zdXJlcyB0aGF0IHRoZSBhcHByb3ByaWF0ZQoJCQl2YWx1ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBuZXcgdmlldyBpbnN0YW5jZS4KCQkqLwoJCV9jcmVhdGVfdmlldzogZnVuY3Rpb24gKCkgewoJCQkvLyB0aGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHZpZXcga2luZAoJCQl2YXIgQ3RvciA9IHRoaXMuZ2V0KCJfdmlld19raW5kIik7CgkJCS8vIHRoZSBwcm9wZXJ0aWVzIHdlIHdhbnQgdG8gc3VwcGx5IHRvIHRoZSB2aWV3IGFyZSB0aGUKCQkJLy8gYXBwICh0aGUgcmVmZXJlbmNlIHRvIHRoaXMgYXBwbGljYXRpb24gaW5zdGFuY2UpIGFuZCB0aGUKCQkJLy8gXF9idWJibGVfdGFyZ2V0IHNvIGV2ZW50cyBhcmUgYnViYmxlZCB0byB1cwoJCQl0aGlzLnNldCgidmlldyIsIG5ldyBDdG9yKHthcHA6IHRoaXMsIF9idWJibGVfdGFyZ2V0OiB0aGlzfSkpOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlfbWFrZV92aWV3X25hbWU6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIGVueW8udWlkKCJfYXBwbGljYXRpb25fdmlld18iKTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJZGVzdHJveTogZnVuY3Rpb24gKCkgewoJCQkvLyByZWxlYXNlL2Rlc3Ryb3kgYWxsIGNvbnRyb2xsZXJzIGFzc29jaWF0ZWQgd2l0aAoJCQkvLyB0aGlzIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbgoJCQlfZGVzdHJveV9jb250cm9sbGVycy5jYWxsKHRoaXMpOwoJCQkvLyBkbyB0aGUgbm9ybWFsIGJyZWFrZG93bgoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCQkvLyB1bnJlZ2lzdGVyIHRoaXMgYXMgYW4gYWN0aXZlIGFwcGxpY2F0aW9uCgkJCXVucmVnaXN0ZXIodGhpcyk7CgkJfQoKCX0pOwoKfShlbnlvKSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/Binding.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uICgpIHsKCgkvLyBhZGQgYmluZGluZ3MgdG8gdGhlIGF1dG9tYXRpY2FsbHkgY29uY2F0ZW5hdGFibGUgcHJvcGVydGllcyBpbiBlbnlvCgllbnlvLmNvbmNhdC5wdXNoKCJiaW5kaW5ncyIpOwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCVVzZWQgaW50ZXJuYWxseSB0byB0cmFjayBiaW5kaW5ncy4KCSovCgl2YXIgbWFwID0ge307CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJVXNlZCBpbnRlcm5hbGx5IHRvIHRyYWNrIHJlZmVyZW5jZXMgdG8gYmluZGluZ3MgdG8gYWxsb3cgZm9yCgkJc2V2ZXJhbCBkaWZmZXJlbnQgZXZlbnRzIHRvIG9jY3VyIHRoYXQgd2lsbCBzdGlsbCBjbGVhbnVwCgkJYmluZGluZ3MuCgkqLwoJdmFyIHJlZ2lzdGVyID0gZnVuY3Rpb24gKGJpbmRpbmcpIHsKCQltYXBbYmluZGluZy5pZF0gPSBiaW5kaW5nOwoJCWJpbmRpbmcuX3JlZ2lzdGVyZWQgPSB0cnVlOwoJfTsKCgkvLypAcHJvdGVjdGVkCgkvKioKCQlVc2VkIGludGVybmFsbHkgdG8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gYmluZGluZ3MuCgkqLwoJdmFyIHVucmVnaXN0ZXIgPSBmdW5jdGlvbiAoaWQpIHsKCQlpZCA9IGlkICYmIGlkLmlkPyBpZC5pZDogaWQ7CgkJaWYgKG1hcFtpZF0pIHsKCQkJZGVsZXRlIG1hcFtpZF07CgkJfQoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgY291bnQgPSAwOwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCVVzZWQgaW50ZXJuYWxseSBhcyBwYXJ0IG9mIHRoZSBnZXRQYXJ0cyBtZXRob2QuCgkqLwoJdmFyIGZyb21Sb290ID0gZnVuY3Rpb24gKHJvb3QsIHBhcnRzKSB7CgkJLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBwYXJ0IG9mIHRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSByb290CgkJdmFyIHBpZWNlID0gcm9vdFsocGFydHMgfHwgW10pWzBdXTsKCQkvLyBpZiB0aGUgcm9vdCBoZXJlIGlzIGVueW8uZ2xvYmFsIHRoZW4gd2UgbmVlZCB0byBlbnN1cmUgdGhhdAoJCS8vIHRoZSBwaWVjZSBpcyBhY3R1YWxseSBhbiBvYmplY3QKCQkvLyB0aGlzIGlzIHZlcnksIHZlcnkgaW1wb3J0YW50CgkJaWYgKGVueW8uZXhpc3RzKHBpZWNlKSkgewoJCQlpZiAoZW55by5nbG9iYWwgPT09IHJvb3QpIHsKCQkJCXJldHVybiAib2JqZWN0IiA9PT0gdHlwZW9mIHBpZWNlPyByb290OiB1bmRlZmluZWQ7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gcm9vdDsKCQkJfQoJCX0KCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJVXNlZCBieSB0aGUgYmluZGluZydzIHNldHRlciBmb3IgYm90aCB0YXJnZXRzIGFuZCBzb3VyY2VzCgkJd2hlbiBkZXRlcm1pbmcgd2hldGhlciBvciBub3QgdG8gZm9yY2UgYSBub3RpZmljYXRpb24gdG8gZmlyZS4KCQlXZSBjYW5ub3QgZWFzaWx5IGRldGVybWluZSB0aGlzIGZvciB0eXBlcyB0aGF0IGFyZSBwYXNzZWQKCQlieSByZWZlcmVuY2UgKGUuZy4gYXJyYXlzIGFuZCBuYXRpdmUgSmF2YVNjcmlwdCBvYmplY3RzKS4gQnV0CgkJZm9yIHRoZXNlIHR5cGVzIGl0IG11Y2ggY2xlYXJlciBpbiBuZWFybHkgYWxsIGNhc2VzLgoJKi8KCXZhciBfZm9yY2VSZWdleCA9IC8oc3RyaW5nfG51bWJlcnxib29sZWFuKS87CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJVXNlZCBpbnRlcm5hbGx5IHRvIGRldGVybWluZSBmcm9tIHRoZSBnaXZlbiBpbmZvcm1hdGlvbiB3aGF0IHRoZQoJCXNvdXJjZSBhbmQgdGFyZ2V0IHBhdGhzIGFuZCBwcm9wZXJ0aWVzIGFyZS4gVGhlcmUgaXMgb25lIGV4Y2VwdGlvbiBjYXNlCgkJYmV0d2VlbiBkZXRlcm1pbmluZyBwYXJ0cyBmb3IgdGhlIHNvdXJjZSBhbmQgdGhlIHRhcmdldCBpbiBiaW5kaW5ncyBzbwoJCXRoZSBvcHRpb25hbCB0aGlyZCBwYXJhbWV0ZXIgaGVscHMgaXQgdG8gdXNlIHRoZSBjb3JyZWN0IGFsZ29yaXRobS4KCSovCgl2YXIgZ2V0UGFydHMgPSBmdW5jdGlvbiAocGF0aCwgY29udGV4dCkgewoJCS8qIGpzaGludCBkZWJ1ZzogdHJ1ZSAqLwoJCWlmICh0aGlzLmRlYnVnKSB7CgkJCWRlYnVnZ2VyOwoJCX0KCQl2YXIgcGFydHM7CgkJdmFyIGlkeCA9IDA7CgkJdmFyIHJldCA9IHt9OwoJCXZhciByb290OwoJCXZhciBjdXI7CgkJdmFyIHByb3A7CgkJdmFyIGJhc2U7CgkJdmFyIHBhcnQ7CgkJdmFyIG93bmVyID0gdGhpcy5vd25lcjsKCQl2YXIgbG9jYWwgPSBwYXRoWzBdID09PSAiLiI/IHRydWU6IGZhbHNlOwoJCXBhdGggPSBwYXRoWzBdID09PSAiLiI/IHBhdGguc2xpY2UoMSk6IHBhdGg7CgkJcGFydHMgPSBwYXRoLnNwbGl0KCIuIik7CgkJcm9vdCA9IGxvY2FsPyBjb250ZXh0IHx8IG93bmVyOiBjb250ZXh0IHx8IGZyb21Sb290KGVueW8uZ2xvYmFsLCBwYXJ0cykgfHwgb3duZXI7CgkJYmFzZSA9IHJvb3Q7CgkJcmV0LnByb3BlcnR5ID0gcHJvcCA9IHBhcnRzLmxlbmd0aCA+IDE/IHBhcnRzLnBvcCgpOiBwYXRoOwoJCWlmIChwcm9wID09PSBwYXRoIHx8ICghbG9jYWwgJiYgY29udGV4dCkpIHsKCQkJcmV0LmJhc2UgPSBiYXNlOwoJCX0gZWxzZSB7CgkJCWN1ciA9IGJhc2U7CgkJCWZvciAoOyBpZHggPCBwYXJ0cy5sZW5ndGg7ICsraWR4KSB7CgkJCQlwYXJ0ID0gcGFydHNbaWR4XTsKCQkJCWlmICghcGFydCkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJY3VyID0gY3VyW3BhcnRdOwoJCQkJaWYgKCFjdXIgfHwgInN0cmluZyIgPT09IHR5cGVvZiBjdXIpIHsKCQkJCQlpZiAocGFydCAhPT0gcHJvcCkgewoJCQkJCQlyZXQuYmFzZSA9IG51bGw7CgkJCQkJfQoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgkJCX0KCQkJaWYgKHBhcnQgIT09IHBhdGgpIHsKCQkJCWJhc2UgPSBjdXI7CgkJCX0KCQkJcmV0LmJhc2UgPSBiYXNlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKCgkvLypAcHJvdGVjdGVkCgkvKioKCQlJbml0aWFsbHkgY2FsbGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24gdG8gc2V0dXAgdGhlIHByb3BlcnRpZXMKCQlvZiB0aGUgYmluZGluZyBhcHByb3ByaWF0ZWx5IGV4aXRpbmcgb24gc3BlY2lmaWMgY29uZGl0aW9ucwoJCXNpbGVudGx5IGlmIHRoZSB0YXJnZXQgb3Igc291cmNlIGNvdWxkIG5vdCBiZSBwcm9wZXJseQoJCWRldGVybWluZWQgb3IgZm91bmQuCgkqLwoJdmFyIHNldHVwID0gZnVuY3Rpb24gKCkgewoJCS8qIGpzaGludCBkZWJ1ZzogdHJ1ZSAqLwoJCXZhciBkZWJ1ZyA9IHRoaXMuZGVidWc7CgkJLy8gZm9yIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0aGlzIGtpbmQgb2YgZGVidWdnaW5nCgkJaWYgKHRydWUgPT09IGRlYnVnKSB7CgkJCWRlYnVnZ2VyOwoJCX0KCQkvLyByZWdpc3RlciB0aGUgYmluZGluZyBnbG9iYWxseSBmb3IgY2xlYW51cCBwdXJwb3NlcwoJCXZhciBjb25uZWN0ID0gdGhpcy5hdXRvQ29ubmVjdDsKCQl2YXIgc3luYyA9IHRoaXMuYXV0b1N5bmM7CgkJdmFyIHNvdXJjZSA9IHRoaXMuc2V0dXBTb3VyY2UoKTsKCQl2YXIgdGFyZ2V0ID0gdGhpcy5zZXR1cFRhcmdldCgpOwoJCXZhciByZWZyZXNoaW5nID0gdGhpcy5fcmVmcmVzaGluZzsKCQlpZiAoIXRoaXMuX3JlZ2lzdGVyZWQpIHsKCQkJcmVnaXN0ZXIodGhpcyk7CgkJfQoJCS8vIHNldHVwIHRoZSB0cmFuc2Zvcm0gaWYgd2UgY2FuCgkJaWYgKHRydWUgIT09IHJlZnJlc2hpbmcpIHsKCQkJdGhpcy5zZXR1cFRyYW5zZm9ybSgpOwoJCX0KCQkvLyBpZiB3ZSBhcmUgcmVmcmVzaGluZyBhbmQgY2Fubm90IGZpbmQKCQkvLyBvbmUgb2YgdGhlc2UgcGFydHMgd2UgbmVlZCB0byByZXNldCB0aGUgdGFyZ2V0cwoJCS8vIHZhbHVlIGlmIHBvc3NpYmxlIChoYXBwZW5zIGZyZXF1ZW50bHkgaW4gcHJveHkvbW9kZWwtCgkJLy8gY29udHJvbGxlcnMgd2hvJ3MgbW9kZWwgaGFzIGJlZW4gc2V0IHRvIG51bGwpCgkJaWYgKCEoc291cmNlICYmIHRhcmdldCkpIHsKCQkJaWYgKHJlZnJlc2hpbmcpIHsKCQkJCWlmICh0YXJnZXQpIHsKCQkJCQkvLyBzZXQgdGhlIHRhcmdldCdzIHZhbHVlIHRvIG51bGwgdG8gbGV0CgkJCQkJLy8gaXQga25vdyB3ZSBjYW4ndCBzeW5jIHRoZSByZWFsIHZhbHVlIGZyb20KCQkJCQkvLyB0aGUgc291cmNlCgkJCQkJdGhpcy5zZXRUYXJnZXRWYWx1ZShudWxsKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm47CgkJfQoJCS8vIHRoaXMgd2lsbCBmYWlsIHNpbGVudGx5IGlmIHNldHVwIHdlbnQgYXVyeSBmb3IKCQkvLyBlaXRoZXIgdGhlIHRhcmdldCBvciBzb3VyY2UKCQkvLyB3ZSBhbGxvdyB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIHRoZSBlbmRzIHRvIGJlCgkJLy8gaW50ZXJydXB0ZWQgaWYgZWl0aGVyIGVuZCBoYXMgYmVlbiBkZXN0cm95ZWQsIHdlCgkJLy8gc2VsZi1kZXN0cnVjdAoJCXRyeSB7CgkJCWlmIChjb25uZWN0IHx8IHJlZnJlc2hpbmcpIHsKCQkJCXRoaXMuY29ubmVjdCgpOwoJCQl9CgkJfSBjYXRjaCAoZXJyKSB7CgkJCWlmICgiYmluZGluZy1kZXN0cm95ZWQiID09PSBlcnIpIHsKCQkJCXJldHVybjsKCQkJfQoJCQllbHNlIHsKCQkJCXRocm93IGVycjsKCQkJfQoJCX0KCQlpZiAoc3luYyB8fCByZWZyZXNoaW5nKSB7CgkJCXRoaXMuc3luYygpOwoJCX0KCX07CgoJLy8qQHByb3RlY3RlZAoJZnVuY3Rpb24gVHJhbnNmb3JtIChmbiwgYmluZGluZykgewoJCXRoaXMudHJhbnNmb3JtZXIgPSBmbjsKCQl0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwoJfQoKCS8vKkBwcm90ZWN0ZWQKCVRyYW5zZm9ybS5wcm90b3R5cGUgPSB7CgkJdHJhbnNmb3JtOiBmdW5jdGlvbiAodmFsdWUsIGRpcmVjdGlvbikgewoJCQl2YXIgZm4gPSB0aGlzLnRyYW5zZm9ybWVyOwoJCQl2YXIgYmluZGluZyA9IHRoaXMuYmluZGluZzsKCQkJdmFyIGNvbnRleHQgPSBiaW5kaW5nLm93bmVyIHx8IGVueW8uZ2xvYmFsOwoJCQlyZXR1cm4gZm4uY2FsbChjb250ZXh0LCB2YWx1ZSwgZGlyZWN0aW9uLCBiaW5kaW5nKTsKCQl9LAoJCWRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKCQkJdGhpcy50cmFuc2Zvcm1lciA9IG51bGw7CgkJCXRoaXMuYmluZGluZyA9IG51bGw7CgkJfQoJfTsKCgkvLypAcHVibGljCgllbnlvLmtpbmQoewoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgUFJPUEVSVElFUwoKCQkvLypAcHVibGljCgkJbmFtZTogImVueW8uQmluZGluZyIsCgoJCS8vKkBwdWJsaWMKCQlraW5kOiBudWxsLAoKCQkvLypAcHVibGljCgkJc291cmNlOiBudWxsLAoKCQkvLypAcHVibGljCgkJdGFyZ2V0OiBudWxsLAoKCQkvLypAcHVibGljCgkJdG86IG51bGwsCgoJCS8vKkBwdWJsaWMKCQlmcm9tOiBudWxsLAoKCQkvLypAcHVibGljCgkJYXV0b0Nvbm5lY3Q6IHRydWUsCgoJCS8vKkBwdWJsaWMKCQlhdXRvU3luYzogdHJ1ZSwKCgkJLy8qQHB1YmxpYwoJCW93bmVyOiBudWxsLAoKCQkvLypAcHVibGljCgkJdHJhbnNmb3JtOiBudWxsLAoKCQkvLypAcHVibGljCgkJb25lV2F5OiB0cnVlLAoKCQkvLypAcHVibGljCgkJdHdvV2F5OiBmYWxzZSwKCgkJLy8qQHB1YmxpYwoJCWRlc3Ryb3llZDogZmFsc2UsCgoJCS8vKkBwdWJsaWMKCQlkZWJ1ZzogZmFsc2UsCgoJCS8vKkBwdWJsaWMKCQlzdGF0aWNzOiB7CgkJCWZpbmQ6IGZ1bmN0aW9uIChpZCkgewoJCQkJcmV0dXJuIG1hcFtpZF07CgkJCX0KCQl9LAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgUFJPUEVSVElFUwoKCQkvLypAcHJvdGVjdGVkCgkJX3NvdXJjZVByb3BlcnR5OiBudWxsLAoKCQkvLypAcHJvdGVjdGVkCgkJX3RhcmdldFByb3BlcnR5OiBudWxsLAoKCQkvLypAcHJvdGVjdGVkCgkJX3NvdXJjZVJlc3BvbmRlcjogbnVsbCwKCgkJLy8qQHByb3RlY3RlZAoJCV90YXJnZXRSZXNwb25kZXI6IG51bGwsCgoJCS8vKkBwcm90ZWN0ZWQKCQlfaXNDb25uZWN0ZWQ6IGZhbHNlLAoKCQkvLypAcHJvdGVjdGVkCgkJX3N5bmNocm9uaXppbmc6IGZhbHNlLAoKCQkvLypAcHJvdGVjdGVkCgkJX3JlZnJlc2hpbmc6IGZhbHNlLAoKCQkvLypAcHJvdGVjdGVkCgkJX3JlZ2lzdGVyZWQ6IGZhbHNlLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBDT01QVVRFRCBQUk9QRVJUSUVTCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBNRVRIT0RTCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBNRVRIT0RTCgoJCS8vKkBwcm90ZWN0ZWQKCQlzeW5jOiBmdW5jdGlvbiAoKSB7CgkJCWlmICh0cnVlID09PSB0aGlzLl9pc0Nvbm5lY3RlZCkgewoJCQkJdGhpcy5zeW5jRnJvbVNvdXJjZSgpOwoJCQl9CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCXJlZnJlc2g6IGZ1bmN0aW9uICgpIHsKCQkJdGhpcy5fcmVmcmVzaGluZyA9IHRydWU7CgkJCXNldHVwLmNhbGwodGhpcyk7CgkJCXRoaXMuX3JlZnJlc2hpbmcgPSBmYWxzZTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJcmVidWlsZDogZnVuY3Rpb24oKSB7CgkJCXRoaXMuZGlzY29ubmVjdCgpOwoJCQl0aGlzLnNvdXJjZSA9IG51bGw7CgkJCXRoaXMuX3NvdXJjZVByb3BlcnR5ID0gbnVsbDsKCQkJdGhpcy50YXJnZXQgPSBudWxsOwoJCQl0aGlzLl90YXJnZXRQcm9wZXJ0eSA9IG51bGw7CgkJCXRoaXMucmVmcmVzaCgpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQ2FsbCB0aGlzIG1ldGhvZCB0byBjb25uZWN0IHRoaXMgYmluZGluZyB0byBpdHMKCQkJc291cmNlIChhbmQgdGFyZ2V0KS4gVGhpcyBvbmx5IHJlZ2lzdGVycyB0aGUgcmVzcG9uZGVycwoJCQlidXQgZG9lcyBub3QgYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZSB0aGUgdmFsdWVzLgoJCSovCgkJY29ubmVjdDogZnVuY3Rpb24gKCkgewoJCQlpZiAodHJ1ZSA9PT0gdGhpcy5faXNDb25uZWN0ZWQpIHsKCQkJCXJldHVybjsKCQkJfQoJCQlpZiAodHJ1ZSA9PT0gdGhpcy5kZXN0cm95ZWQpIHsKCQkJCXJldHVybjsKCQkJfQoJCQl0aGlzLmNvbm5lY3RTb3VyY2UoKTsKCQkJdGhpcy5jb25uZWN0VGFyZ2V0KCk7CgkJCWlmICh0aGlzLnNvdXJjZUNvbm5lY3RlZCAmJiB0aGlzLnRhcmdldENvbm5lY3RlZCkgewoJCQkJdGhpcy5faXNDb25uZWN0ZWQgPSB0cnVlOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5faXNDb25uZWN0ZWQgPSBmYWxzZTsKCQkJfQoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQ2FsbCB0aGlzIG1ldGhvZCB0byBkaXNjb25uZWN0IHRoaXMgYmluZGluZyBmcm9tCgkJCWl0cyBzb3VyY2UgKGFuZCB0YXJnZXQpLgoJCSovCgkJZGlzY29ubmVjdDogZnVuY3Rpb24gKCkgewoJCQlpZiAoZmFsc2UgPT09IHRoaXMuX2lzQ29ubmVjdGVkKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJdGhpcy5kaXNjb25uZWN0U291cmNlKCk7CgkJCXRoaXMuZGlzY29ubmVjdFRhcmdldCgpOwoJCQl0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlzZXR1cFNvdXJjZTogZnVuY3Rpb24gKCkgewoJCQl2YXIgcGFydHM7CgkJCXZhciBiYXNlOwoJCQl2YXIgcHJvcGVydHkgPSB0aGlzLl9zb3VyY2VQcm9wZXJ0eTsKCQkJdmFyIHNvdXJjZSA9IHRoaXMuc291cmNlOwoJCQl2YXIgZnJvbSA9IHRoaXMuZnJvbTsKCQkJaWYgKHNvdXJjZSAmJiBwcm9wZXJ0eSkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJaWYgKCFmcm9tKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJcGFydHMgPSBnZXRQYXJ0cy5jYWxsKHRoaXMsIGZyb20sIHNvdXJjZSk7CgkJCWJhc2UgPSBwYXJ0cy5iYXNlOwoJCQlwcm9wZXJ0eSA9IHBhcnRzLnByb3BlcnR5OwoJCQlpZiAoIWJhc2UgfHwgIm9iamVjdCIgIT09IHR5cGVvZiBiYXNlKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJdGhpcy5zb3VyY2UgPSBiYXNlOwoJCQl0aGlzLl9zb3VyY2VQcm9wZXJ0eSA9IHByb3BlcnR5OwoJCQlyZXR1cm4gdHJ1ZTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJc2V0dXBUYXJnZXQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIHBhcnRzOwoJCQl2YXIgYmFzZTsKCQkJdmFyIHByb3BlcnR5ID0gdGhpcy5fdGFyZ2V0UHJvcGVydHk7CgkJCXZhciB0YXJnZXQgPSB0aGlzLnRhcmdldDsKCQkJdmFyIHRvID0gdGhpcy50bzsKCQkJaWYgKHRhcmdldCAmJiBwcm9wZXJ0eSkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJaWYgKCF0bykgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXBhcnRzID0gZ2V0UGFydHMuY2FsbCh0aGlzLCB0bywgdGFyZ2V0KTsKCQkJYmFzZSA9IHBhcnRzLmJhc2U7CgkJCXByb3BlcnR5ID0gcGFydHMucHJvcGVydHk7CgkJCWlmICghYmFzZSB8fCAib2JqZWN0IiAhPT0gdHlwZW9mIGJhc2UpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl0aGlzLnRhcmdldCA9IGJhc2U7CgkJCXRoaXMuX3RhcmdldFByb3BlcnR5ID0gcHJvcGVydHk7CgkJCXJldHVybiB0cnVlOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlzdG9wOiBmdW5jdGlvbiAoKSB7CgkJCXRocm93ICJzdG9wLWJpbmRpbmciOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQljb25uZWN0U291cmNlOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZTsKCQkJdmFyIHByb3BlcnR5ID0gdGhpcy5fc291cmNlUHJvcGVydHk7CgkJCXZhciBmbiA9IHRoaXMuX3NvdXJjZVJlc3BvbmRlcjsKCQkJaWYgKCEoc291cmNlIGluc3RhbmNlb2YgZW55by5PYmplY3QpKSB7CgkJCQl0aGlzLnNvdXJjZUNvbm5lY3RlZCA9IGZhbHNlOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCS8vIG9ubHkgY3JlYXRlIHRoZSByZXNwb25kZXIgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0CgkJCWlmICghZW55by5leGlzdHMoZm4pIHx8ICJmdW5jdGlvbiIgIT09IHR5cGVvZiBmbikgewoJCQkJZm4gPSBlbnlvLmJpbmQodGhpcywgdGhpcy5zeW5jRnJvbVNvdXJjZSk7CgkJCQl0aGlzLl9zb3VyY2VSZXNwb25kZXIgPSBmbjsKCQkJfQoJCQkvLyBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgc291cmNlIGFjdHVhbGx5IGV4aXN0cyBidXQgaGFzIGJlZW4gZGVzdHJveWVkCgkJCWlmICh0cnVlID09PSBzb3VyY2UuZGVzdHJveWVkKSB7CgkJCQkvLyB3ZSBuZWVkIHRvIGJlIGRlc3Ryb3llZCBzbyB3ZSBjYW4gYWxzbyBiZSBjbGVhbmVkIHVwCgkJCQl0aGlzLmRlc3Ryb3koKTsKCQkJCXRocm93ICJiaW5kaW5nLWRlc3Ryb3llZCI7CgkJCX0KCQkJLy8gaWYgaXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgZG9uJ3QgZG8gYW55dGhpbmcKCQkJaWYgKHRydWUgPT09IHRoaXMuc291cmNlQ29ubmVjdGVkKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQlpZiAoIWVueW8uZXhpc3RzKHNvdXJjZSkpIHsKCQkJCXRoaXMuc291cmNlQ29ubmVjdGVkID0gZmFsc2U7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJLy8gYXNzaWduIHRoZSBiaW5kaW5nJ3MgaWQgdG8gdGhlIHJlc3BvbmRlciBmb3IgZGVidWdnaW5nCgkJCWZuLmJpbmRpbmdJZCA9IHRoaXMuaWQ7CgkJCS8vIGFkZCB0aGUgb2JzZXJ2ZXIgZm9yIHRoZSBwcm9wZXJ0eSBvbiB0aGUgc291cmNlIG9iamVjdAoJCQlzb3VyY2UuYWRkT2JzZXJ2ZXIocHJvcGVydHksIGZuKTsKCQkJdGhpcy5zb3VyY2VDb25uZWN0ZWQgPSB0cnVlOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJY29ubmVjdFRhcmdldDogZnVuY3Rpb24gKCkgewoJCQl2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7CgkJCXZhciBwcm9wZXJ0eSA9IHRoaXMuX3RhcmdldFByb3BlcnR5OwoJCQl2YXIgZm4gPSB0aGlzLl90YXJnZXRSZXNwb25kZXI7CgkJCXZhciBvbmVXYXkgPSB0aGlzLm9uZVdheTsKCQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgZW55by5PYmplY3QpKSB7CgkJCQl0aGlzLnRhcmdldENvbm5lY3RlZCA9IGZhbHNlOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCS8vIGluIHRoZSBldmVudCB0aGF0IHRoZSB0YXJnZXQgYWN0dWFsbHkgZXhpc3RzIGJ1dCBoYXMgYmVlbiBkZXN0cm95ZWQKCQkJaWYgKHRydWUgPT09IHRhcmdldC5kZXN0cm95ZWQpIHsKCQkJCS8vIHdlIG5lZWQgdG8gYmUgZGVzdHJveWVkIHNvIHdlIGNhbiBhbHNvIGJlIGNsZWFuZWQgdXAKCQkJCXRoaXMuZGVzdHJveSgpOwoJCQkJdGhyb3cgImJpbmRpbmctZGVzdHJveWVkIjsKCQkJfQoJCQkvLyBpZiB0aGlzIGlzIGEgb25lIHdheSBiaW5kaW5nIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KCQkJaWYgKHRydWUgPT09IG9uZVdheSkgewoJCQkJdGhpcy50YXJnZXRDb25uZWN0ZWQgPSB0cnVlOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJLy8gb25seSBjcmVhdGUgdGhlIHJlc3BvbmRlciBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QKCQkJaWYgKCFlbnlvLmV4aXN0cyhmbikgfHwgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGZuKSB7CgkJCQlmbiA9IGVueW8uYmluZCh0aGlzLCB0aGlzLnN5bmNGcm9tVGFyZ2V0KTsKCQkJCXRoaXMuX3RhcmdldFJlc3BvbmRlciA9IGZuOwoJCQl9CgkJCS8vIGlmIGl0IGlzIGFscmVhZHkgY29ubmVjdGVkIGRvbid0IGRvIGFueXRoaW5nIGVsc2UKCQkJaWYgKHRydWUgPT09IHRoaXMudGFyZ2V0Q29ubmVjdGVkKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQlpZiAoIWVueW8uZXhpc3RzKHRhcmdldCkpIHsKCQkJCXRoaXMudGFyZ2V0Q29ubmVjdGVkID0gZmFsc2U7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJZm4uYmluZGluZ0lkID0gdGhpcy5pZDsKCQkJdGFyZ2V0LmFkZE9ic2VydmVyKHByb3BlcnR5LCBmbik7CgkJCXRoaXMudGFyZ2V0Q29ubmVjdGVkID0gdHJ1ZTsKCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCXN5bmNGcm9tU291cmNlOiBmdW5jdGlvbiAoKSB7CgkJCXZhciB0d29XYXkgPSB0aGlzLnR3b1dheTsKCQkJdmFyIHZhbHVlID0gdGhpcy5nZXRTb3VyY2VWYWx1ZSgpOwoJCQl2YXIgdHJhbnNmb3JtZXIgPSB0aGlzLnRyYW5zZm9ybTsKCQkJLy8gaWYgdGhpcyBpcyBhIHR3byB3YXkgYmluZGluZyB3ZSBuZWVkIHRvCgkJCS8vIGRpc2Nvbm5lY3QgZnJvbSB0aGUgdGFyZ2V0IGZpcnN0IHRvIGVuc3VyZQoJCQkvLyB3ZSBkb24ndCBjYXRjaCB0aGUgdXBkYXRlIHJlc3BvbnNlCgkJCS8vIFRPRE86IHJldGhpbmsgdGhpcyBhcHByb2FjaCBhcyB0cnkvY2F0Y2ggYXJlCgkJCS8vIGNvc3RseSBpbiBnZW5lcmFsLi4uCgkJCXRyeSB7CgkJCQl2YWx1ZSA9IHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh2YWx1ZSwgInNvdXJjZSIpOwoJCQl9IGNhdGNoIChlcnIpIHsKCQkJCS8vIHRoZSB0cmFuc2Zvcm0gd2FzIGludGVycnVwdGVkLCBkbyBub3QgY29tcGxldGUKCQkJCWlmICgic3RvcC1iaW5kaW5nIiA9PT0gZXJyKSB7CgkJCQkJcmV0dXJuOwoJCQkJfSBlbHNlIHsKCQkJCQl0aHJvdyBlcnI7CgkJCQl9CgkJCX0KCQkJaWYgKHR3b1dheSkgewoJCQkJdGhpcy5fc3luY2hyb25pemluZyA9IHRydWU7CgkJCQl0aGlzLmRpc2Nvbm5lY3RUYXJnZXQoKTsKCQkJfQoJCQl0aGlzLnNldFRhcmdldFZhbHVlKHZhbHVlKTsKCQkJaWYgKHR3b1dheSkgewoJCQkJdGhpcy5jb25uZWN0VGFyZ2V0KCk7CgkJCQl0aGlzLl9zeW5jaHJvbml6aW5nID0gZmFsc2U7CgkJCX0KCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJc3luY0Zyb21UYXJnZXQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIHZhbHVlID0gdGhpcy5nZXRUYXJnZXRWYWx1ZSgpOwoJCQl2YXIgdHJhbnNmb3JtZXIgPSB0aGlzLnRyYW5zZm9ybTsKCQkJLy8gVE9ETzogc2FtZSBhcyBmb3Igc3luY0Zyb21Tb3VyY2UKCQkJdHJ5IHsKCQkJCXZhbHVlID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtKHZhbHVlLCAidGFyZ2V0Iik7CgkJCX0gY2F0Y2ggKGVycikgewoJCQkJLy8gdGhlIHRyYW5zZm9ybSB3YXMgaW50ZXJydXB0ZWQsIGRvIG5vdCBjb21wbGV0ZQoJCQkJaWYgKCJzdG9wLWJpbmRpbmciID09PSBlcnIpIHsKCQkJCQlyZXR1cm47CgkJCQl9IGVsc2UgewoJCQkJCXRocm93IGVycjsKCQkJCX0KCQkJfQoJCQl0aGlzLmRpc2Nvbm5lY3RTb3VyY2UoKTsKCQkJdGhpcy5zZXRTb3VyY2VWYWx1ZSh2YWx1ZSk7CgkJCXRoaXMuY29ubmVjdFNvdXJjZSgpOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlkaXNjb25uZWN0U291cmNlOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZTsKCQkJdmFyIHByb3BlcnR5ID0gdGhpcy5fc291cmNlUHJvcGVydHk7CgkJCXZhciBmbiA9IHRoaXMuX3NvdXJjZVJlc3BvbmRlcjsKCQkJaWYgKCFlbnlvLmV4aXN0cyhzb3VyY2UpKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJc291cmNlLnJlbW92ZU9ic2VydmVyKHByb3BlcnR5LCBmbik7CgkJCXRoaXMuc291cmNlQ29ubmVjdGVkID0gZmFsc2U7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCWRpc2Nvbm5lY3RUYXJnZXQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0OwoJCQl2YXIgZm4gPSB0aGlzLl90YXJnZXRSZXNwb25kZXI7CgkJCXZhciBwcm9wZXJ0eSA9IHRoaXMuX3RhcmdldFByb3BlcnR5OwoJCQlpZiAoIWVueW8uZXhpc3RzKHRhcmdldCkpIHsKCQkJCXJldHVybjsKCQkJfQoJCQlpZiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGZuKSB7CgkJCQl0YXJnZXQucmVtb3ZlT2JzZXJ2ZXIocHJvcGVydHksIGZuKTsKCQkJfQoJCQl0aGlzLnRhcmdldENvbm5lY3RlZCA9IGZhbHNlOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlzZXRTb3VyY2VWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7CgkJCXZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZTsKCQkJdmFyIHByb3BlcnR5ID0gdGhpcy5fc291cmNlUHJvcGVydHk7CgkJCXZhciBmb3JjZSA9ICFfZm9yY2VSZWdleC50ZXN0KHR5cGVvZiB2YWx1ZSk7CgkJCXNvdXJjZS5zZXQocHJvcGVydHksIHZhbHVlLCBmb3JjZSk7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCXNldFRhcmdldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHsKCQkJdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0OwoJCQl2YXIgcHJvcGVydHkgPSB0aGlzLl90YXJnZXRQcm9wZXJ0eTsKCQkJdmFyIGZvcmNlID0gIV9mb3JjZVJlZ2V4LnRlc3QodHlwZW9mIHZhbHVlKTsKCQkJdGFyZ2V0LnNldChwcm9wZXJ0eSwgdmFsdWUsIGZvcmNlKTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJZ2V0U291cmNlVmFsdWU6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIHNvdXJjZSA9IHRoaXMuc291cmNlOwoJCQl2YXIgcHJvcGVydHkgPSB0aGlzLl9zb3VyY2VQcm9wZXJ0eTsKCQkJcmV0dXJuIHNvdXJjZS5nZXQocHJvcGVydHkpOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlnZXRUYXJnZXRWYWx1ZTogZnVuY3Rpb24gKCkgewoJCQl2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7CgkJCXZhciBwcm9wZXJ0eSA9IHRoaXMuX3RhcmdldFByb3BlcnR5OwoJCQlyZXR1cm4gdGFyZ2V0LmdldChwcm9wZXJ0eSk7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCXNldHVwVHJhbnNmb3JtOiBmdW5jdGlvbiAoKSB7CgkJCXZhciB0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybTsKCQkJdmFyIG93bmVyID0gdGhpcy5vd25lciB8fCB7fTsKCQkJLy8gaWYgaXQgaXMgYSBzdHJpbmcgd2UgdHJ5IGFuZCBsb2NhdGUgaXQgb24gdGhlIG93bmVyCgkJCS8vIG9yIGFzIGEgZ2xvYmFsIG1ldGhvZAoJCQlpZiAoInN0cmluZyIgPT09IHR5cGVvZiB0cmFuc2Zvcm0pIHsKCQkJCXRyYW5zZm9ybSA9IG93bmVyW3RyYW5zZm9ybV0gfHwgZW55by5nZXRQYXRoLmNhbGwob3duZXIsIHRyYW5zZm9ybSkKCQkJCQl8fCBlbnlvLmdldFBhdGguY2FsbChlbnlvLmdsb2JhbCwgdHJhbnNmb3JtKTsKCQkJfQoJCQkvLyBpZiB3ZSBjb3VsZG4ndCBmaW5kIGFueXRoaW5nIGdvIGFoZWFkIGFuZCBzZXR1cCBhIGRlZmF1bHQKCQkJLy8gdG8gc2ltcGx5IHJldHVybiB0aGUgdmFsdWUKCQkJaWYgKCJmdW5jdGlvbiIgIT09IHR5cGVvZiB0cmFuc2Zvcm0pIHsKCQkJCXRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtID0gZnVuY3Rpb24odmFsdWUpIHsKCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQl9OwoJCQl9CgkJCWlmICghKHRyYW5zZm9ybSBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHsKCQkJCXRoaXMudHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybSh0cmFuc2Zvcm0sIHRoaXMpOwoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlDYWxsIHRoaXMgbWV0aG9kIHRvIHByZXBhcmUgdGhpcyBvYmplY3QgdG8gYmUKCQkJY2xlYW5lZCB1cCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCgkJKi8KCQlkZXN0cm95OiBmdW5jdGlvbiAoKSB7CgkJCWlmICh0cnVlID09PSB0aGlzLmRlc3Ryb3llZCkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCS8vIHdlIHNldCB0aGlzIHJpZ2h0IGF3YXkgc28gdGhhdCB3ZSBkb24ndCB3aW5kIHVwCgkJCS8vIGluIGFuIGluZmluaXRlIGxvb3AKCQkJdGhpcy5kZXN0cm95ZWQgPSB0cnVlOwoJCQl0aGlzLmRpc2Nvbm5lY3QoKTsKCQkJdGhpcy5zb3VyY2UgPSBudWxsOwoJCQl0aGlzLnRhcmdldCA9IG51bGw7CgkJCXRoaXMuX3NvdXJjZVJlc3BvbmRlciA9IG51bGw7CgkJCXRoaXMuX3RhcmdldFJlc3BvbmRlciA9IG51bGw7CgkJCWVueW8uQmluZGluZy5iaW5kaW5nQ291bnQtLTsKCQkJaWYgKHRoaXMudHJhbnNmb3JtKSB7CgkJCQl0aGlzLnRyYW5zZm9ybS5kZXN0cm95KCk7CgkJCQl0aGlzLnRyYW5zZm9ybSA9IG51bGw7CgkJCX0KCQkJaWYgKHRoaXMub3duZXIpIHsKCQkJCXRoaXMub3duZXIucmVtb3ZlQmluZGluZyh0aGlzKTsKCQkJfQoJCQkvLyBtYWtlIHN1cmUgdG8gdW5yZWdpc3RlciB0aGUgYmluZGluZyByZWZlcmVuY2UKCQkJdW5yZWdpc3Rlcih0aGlzKTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJY29uc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGlkeCA9IDA7CgkJCXZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOwoJCQl2YXIgb25lV2F5OwoJCQl2YXIgdHdvV2F5OwoJCQkvLyBpbmNyZW1lbnQgb3VyIGJpbmRpbmcgY291bnRlciBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCgkJCWNvdW50Kys7CgkJCS8vIHRha2UgYW55IHByb3BlcnRpZXMgdGhhdCB3ZXJlIHBhc3NlZCBpbiBhbmQgYXBwbHkgdGhlbQoJCQkvLyB0byB0aGlzIGJpbmRpbmcgaW5zdGFuY2UKCQkJZm9yICg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJCWVueW8ubWl4aW4odGhpcywgYXJndW1lbnRzW2lkeF0pOwoJCQl9CgkJCS8vIGdlbmVyYXRlIGEgbmV3IGlkIGZvciB0aGlzIGJpbmRpbmcKCQkJdGhpcy5pZCA9IGVueW8udWlkKCJiaW5kaW5nIik7CgkJCS8vIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBiaW5kaW5nJ3Mgc2V0dXAgdW5kZXJzdGFuZHMgaWYKCQkJLy8gdGhpcyBpcyBhIG9uZS13YXkgb3IgdHdvLXdheSBiaW5kaW5nCgkJCW9uZVdheSA9IHRoaXMub25lV2F5OwoJCQl0d29XYXkgPSB0aGlzLnR3b1dheTsKCQkJLy8gcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBvbmVXYXkgZmxhZyBpcyBzZXQgdG8sIHByaW9yaXR5CgkJCS8vIHJlc29sdXRpb24gZGVmZXJzIHRvIHRoZSB0d29XYXkgZmxhZyBpbml0aWFsbHkKCQkJaWYgKHRydWUgPT09IHR3b1dheSkgewoJCQkJdGhpcy5vbmVXYXkgPSBmYWxzZTsKCQkJfQoJCQkvLyBub3cgd2UgY2hlY2sgb3VyIGRlZmVycmVkIGZsYWcgdG8gc2VlIGlmIHRoaXMgaXMgYSB0d28td2F5CgkJCS8vIGJpbmRpbmcgaGF2aW5nIGJlZW4gc2V0IHZpYSB0aGUgb25lV2F5IGZsYWcKCQkJZWxzZSBpZiAoZmFsc2UgPT09IG9uZVdheSkgewoJCQkJdGhpcy50d29XYXkgPSB0cnVlOwoJCQl9CgkJCS8vIHJ1biBvdXIgaW5pdGlhbGl6YXRpb24gcm91dGluZXMKCQkJc2V0dXAuY2FsbCh0aGlzKTsKCQl9CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIE9CU0VSVkVSUwoKCX0pOwoKfSgpKTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/Component.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5Db21wb25lbnRfIGlzIHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9jayBmb3IgRW55byBhcHBsaWNhdGlvbnMuCglDb21wb25lbnRzIGFyZSBkZXNpZ25lZCB0byBmaXQgdG9nZXRoZXIsIGFsbG93aW5nIGNvbXBsZXggYmVoYXZpb3JzIHRvIGJlCglmYXNoaW9uZWQgZnJvbSBzbWFsbGVyIGJpdHMgb2YgZnVuY3Rpb25hbGl0eS4KCglDb21wb25lbnQgY29uc3RydWN0b3JzIHRha2UgYSBzaW5nbGUgYXJndW1lbnQgKHNvbWV0aW1lcyBjYWxsZWQgYQoJX0NvbXBvbmVudCBjb25maWd1cmF0aW9uXyksIGEgSmF2YVNjcmlwdCBvYmplY3QgdGhhdCBkZWZpbmVzIHZhcmlvdXMKCXByb3BlcnRpZXMgdG8gYmUgaW5pdGlhbGl6ZWQgb24gdGhlIENvbXBvbmVudC4gRm9yIGV4YW1wbGU6CgoJCS8vIGNyZWF0ZSBhIG5ldyBjb21wb25lbnQsIGluaXRpYWxpemUgaXRzIG5hbWUgcHJvcGVydHkgdG8gJ21lJy4KCQl2YXIgYyA9IG5ldyBlbnlvLkNvbXBvbmVudCh7CgkJCW5hbWU6ICJtZSIKCQl9KTsKCglXaGVuIGEgQ29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCwgaXRlbXMgY29uZmlndXJlZCBpbiBpdHMgX2NvbXBvbmVudHNfCglwcm9wZXJ0eSBhcmUgaW5zdGFudGlhdGVkLCB0b286CgoJCS8vIGNyZWF0ZSBhIG5ldyBjb21wb25lbnQsIHdoaWNoIGl0c2VsZiBoYXMgYSBjb21wb25lbnQKCQl2YXIgYyA9IG5ldyBlbnlvLkNvbXBvbmVudCh7CgkJCW5hbWU6ICJtZSIsCgkJCWNvbXBvbmVudHM6IFsKCQkJCXtraW5kOiAiQ29tcG9uZW50IiwgbmFtZTogIm90aGVyIn0KCQkJXQoJCX0pOwoKCUluIHRoaXMgY2FzZSwgd2hlbiBfbWVfIGlzIGNyZWF0ZWQsIF9vdGhlcl8gaXMgYWxzbyBjcmVhdGVkLCBhbmQgd2Ugc2F5IHRoYXQKCV9tZSBvd25zIG90aGVyXy4gSW4gb3RoZXIgd29yZHMsIHRoZSBfb3duZXJfIHByb3BlcnR5IG9mIF9vdGhlcl8gZXF1YWxzCglfbWVfLiBOb3RpY2UgdGhhdCB5b3UgY2FuIHNwZWNpZnkgdGhlIF9raW5kXyBvZiBfb3RoZXJfIGV4cGxpY2l0bHkgaW4gaXRzCgljb25maWd1cmF0aW9uIGJsb2NrLCB0byB0ZWxsIF9tZV8gd2hhdCBjb25zdHJ1Y3RvciB0byB1c2UgdG8gY3JlYXRlIF9vdGhlcl8uCgoJTm90ZSB0aGF0IF9raW5kXyB2YWx1ZXMgbWF5IGJlIHJlZmVyZW5jZXMgdG8gYWN0dWFsIGtpbmRzIG9yIHN0cmluZy1uYW1lcyBvZgoJa2luZHMuIEtpbmQgbmFtZXMgdGhhdAlkbyBub3QgcmVzb2x2ZSBkaXJlY3RseSB0byBraW5kcyBhcmUgbG9va2VkIHVwIGluCglkZWZhdWx0IG5hbWVzcGFjZXMuIEluIHRoaXMgY2FzZSwgX2tpbmQ6ICJDb21wb25lbnQiXyByZXNvbHZlcyB0bwoJX2VueW8uQ29tcG9uZW50Xy4KCglUbyBtb3ZlIGEgY29tcG9uZW50LCB1c2UgdGhlIF9zZXRPd25lcl8gbWV0aG9kIHRvIGNoYW5nZSB0aGUgY29tcG9uZW50J3Mgb3duZXIuCglJZiB5b3Ugd2FudCB0byBtYWtlIGEgY29tcG9uZW50IHVub3duZWQsIHVzZSBfc2V0T3duZXIobnVsbClfLgoKCUlmIHlvdSBtYWtlIGNoYW5nZXMgdG8gX2VueW8uQ29tcG9uZW50XywgYmUgc3VyZSB0byBhZGQgb3IgdXBkYXRlIHRoZQoJYXBwcm9wcmlhdGUgW3VuaXQgdGVzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvanMvZW55by90cmVlL21hc3Rlci90b29scy90ZXN0L2NvcmUvdGVzdHMpLgoKCUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb24KCVtDb21wb25lbnRzXShodHRwczovL2dpdGh1Yi5jb20vZW55b2pzL2VueW8vd2lraS9DcmVhdGluZy1Db21wb25lbnRzKQoJaW4gdGhlIEVueW8gRGV2ZWxvcGVyIEd1aWRlLgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uQ29tcG9uZW50IiwKCWtpbmQ6ICJlbnlvLk9iamVjdCIsCglwdWJsaXNoZWQ6IHsKCQkvKioKCQkJQSB1bmlxdWUgbmFtZSBmb3IgdGhlIGNvbXBvbmVudCB3aXRoaW4gaXRzIG93bmVyLiBUaGlzIGlzIHVzZWQgdG8KCQkJc2V0IHRoZSBhY2Nlc3MgbmFtZSBpbiB0aGUgb3duZXIncyBfJF8gaGFzaC4gIElmIG5vdCBzcGVjaWZpZWQsIGEKCQkJZGVmYXVsdCBuYW1lIHdpbGwgYmUgcHJvdmlkZWQgYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlIG9iamVjdCdzCgkJCWtpbmQsIG9wdGlvbmFsbHkgd2l0aCBhIG51bWJlciBzdWZmaXggaWYgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZQoJCQlleGlzdHMgaW4gdGhlIG93bmVyLgoJCSovCgkJbmFtZTogIiIsCgkJLyoqCgkJCUEgdW5pcXVlIGlkIGZvciB0aGUgY29tcG9uZW50LCB1c3VhbGx5IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJhc2VkCgkJCW9uIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIGNvbXBvbmVudCBoaWVyYXJjaHksIGFsdGhvdWdoIGl0IG1heSBhbHNvCgkJCWJlIGRpcmVjdGx5IHNwZWNpZmllZC4gX2VueW8uQ29udHJvbF8gdXNlcyB0aGlzIGlkIHZhbHVlIGZvciB0aGUgRE9NCgkJCWlkIGF0dHJpYnV0ZS4KCQkqLwoJCWlkOiAiIiwKCQkvKioKCQkJVGhlIGNvbXBvbmVudCB0aGF0IG93bnMgdGhpcyBjb21wb25lbnQuIEl0IGlzIHVzdWFsbHkgaW1wbGljaXRseQoJCQlkZWZpbmVkIGR1cmluZyBjcmVhdGlvbiBiYXNlZCBvbiB0aGUgX2NyZWF0ZUNvbXBvbmVudF8gY2FsbCBvcgoJCQlfY29tcG9uZW50c18gaGFzaC4KCQkqLwoJCW93bmVyOiBudWxsCgl9LAoJLy8qIEBwcm90ZWN0ZWQKCXByb3RlY3RlZFN0YXRpY3M6IHsKCQkvLyBmb3IgbWVtb2l6aW5nIGtpbmQtcHJlZml4IG5hbWVzIGluIG5hbWVDb21wb25lbnQKCQlfa2luZFByZWZpeGk6IHt9LAoJCS8vIGZvciBuYW1pbmcgdGhlIHVubmFtZWQKCQlfdW5uYW1lZEtpbmROdW1iZXI6IDAKCX0sCglkZWZhdWx0S2luZDogIkNvbXBvbmVudCIsCglub0RlZmVyOiB0cnVlLAoJaGFuZGxlcnM6IHt9LAoJbWl4aW5zOiBbImVueW8uTWl4aW5Db21wb25lbnRTdXBwb3J0IiwgImVueW8uQXBwbGljYXRpb25TdXBwb3J0Il0sCglfX2pvYnM6IHt9LAoJdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmtpbmROYW1lOwoJfSwKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihwcm9wcykgewoJCS8vIGluaXRpYWxpemUgaW5zdGFuY2Ugb2JqZWN0cwoJCXRoaXMuX2NvbXBvbmVudE5hbWVNYXAgPSB7fTsKCQl0aGlzLiQgPSB7fTsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCWNvbnN0cnVjdGVkOiBmdW5jdGlvbihpblByb3BzKSB7CgkJdGhpcy5oYW5kbGVycyA9IGVueW8ubWl4aW4oZW55by5jbG9uZSh0aGlzLmtpbmRIYW5kbGVycyksIHRoaXMuaGFuZGxlcnMpOwoJCS8vIHBlcmZvcm0gaW5pdGlhbGl6YXRpb24KCQl0aGlzLmNyZWF0ZShpblByb3BzKTsKCX0sCgljcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMub3duZXJDaGFuZ2VkKCk7CgkJdGhpcy5pbml0Q29tcG9uZW50cygpOwoJfSwKCWluaXRDb21wb25lbnRzOiBmdW5jdGlvbigpIHsKCQkvLyBUaGUgX2NvbXBvbmVudHNfIHByb3BlcnR5IGluIGtpbmQgZGVjbGFyYXRpb25zIGlzIHJlbmFtZWQgdG8KCQkvLyBfa2luZENvbXBvbmVudHNfIGJ5IHRoZSBDb21wb25lbnQgc3ViY2xhc3MgbWVjaGFuaXNtLiAgVGhpcyBtYWtlcyBpdAoJCS8vIGVhc3kgZm9yIHRoZSBkZXZlbG9wZXIgdG8gZGlzdGluZ3Vpc2gga2luZENvbXBvbmVudHMgZnJvbSB0aGUgY29tcG9uZW50cwoJCS8vIGluIF90aGlzLmNvbXBvbmVudHNfLCB3aXRob3V0IGhhdmluZyB0byB3b3JyeSBhYm91dCB0aGUgYWN0dWFsIGRpZmZlcmVuY2UuCgkJLy8KCQkvLyBTcGVjaWZpY2FsbHksIHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQga2luZENvbXBvbmVudHMgYXJlIGNvbnN0cnVjdGVkIGFzCgkJLy8gb3duZWQgYnkgdGhpcyBjb250cm9sICh3aGVyZWFzIGNvbXBvbmVudHMgaW4gX3RoaXMuY29tcG9uZW50c18gYXJlIG5vdCkuCgkJLy8gSW4gYWRkaXRpb24sIGtpbmRDb21wb25lbnRzIGFyZSBtYXJrZWQgd2l0aCB0aGUgX2lzQ2hyb21lOiB0cnVlXyBmbGFnLgoJCXRoaXMuY3JlYXRlQ2hyb21lKHRoaXMua2luZENvbXBvbmVudHMpOwoJCXRoaXMuY3JlYXRlQ2xpZW50Q29tcG9uZW50cyh0aGlzLmNvbXBvbmVudHMpOwoJfSwKCWNyZWF0ZUNocm9tZTogZnVuY3Rpb24oaW5Db21wb25lbnRzKSB7CgkJdGhpcy5jcmVhdGVDb21wb25lbnRzKGluQ29tcG9uZW50cywge2lzQ2hyb21lOiB0cnVlfSk7Cgl9LAoJY3JlYXRlQ2xpZW50Q29tcG9uZW50czogZnVuY3Rpb24oaW5Db21wb25lbnRzKSB7CgkJdGhpcy5jcmVhdGVDb21wb25lbnRzKGluQ29tcG9uZW50cywge293bmVyOiB0aGlzLmdldEluc3RhbmNlT3duZXIoKX0pOwoJfSwKCWdldEluc3RhbmNlT3duZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiAoIXRoaXMub3duZXIgfHwgdGhpcy5vd25lci5ub3RJbnN0YW5jZU93bmVyKSA/IHRoaXMgOiB0aGlzLm93bmVyOwoJfSwKCS8vKiBAcHVibGljCgkvKioKCQlSZW1vdmVzIHRoaXMgY29tcG9uZW50IGZyb20gaXRzIG93bmVyIChzZXRzIF9vd25lcl8gdG8gbnVsbCkgYW5kIGRvZXMKCQlhbnkgbmVjZXNzYXJ5IGNsZWFudXAuIFRoZSBjb21wb25lbnQgaXMgZmxhZ2dlZCB3aXRoIGEgX2Rlc3Ryb3llZDogdHJ1ZV8KCQlwcm9wZXJ0eS4gVXN1YWxseSwgdGhlIGNvbXBvbmVudCB3aWxsIGJlIHN1aXRhYmxlIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24KCQlhZnRlciBiZWluZyBkZXN0cm95ZWQsIHVubGVzcyB1c2VyIGNvZGUga2VlcHMgYSByZWZlcmVuY2UgdG8gaXQuCgkqLwoJZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5kZXN0cm95Q29tcG9uZW50cygpOwoJCXRoaXMuc2V0T3duZXIobnVsbCk7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl0aGlzLnN0b3BBbGxKb2JzKCk7Cgl9LAoJLyoqCgkJRGVzdHJveXMgYWxsIG93bmVkIGNvbXBvbmVudHMuCgkqLwoJZGVzdHJveUNvbXBvbmVudHM6IGZ1bmN0aW9uKCkgewoJCWVueW8uZm9yRWFjaCh0aGlzLmdldENvbXBvbmVudHMoKSwgZnVuY3Rpb24oYykgewoJCQkvLyBUaGlzIGxvY2FsIGNvbXBvbmVudHMgbGlzdCBtYXkgYmUgc3RhbGUgYXMgY29tcG9uZW50cwoJCQkvLyB3ZSBvd25lZCB3aGVuIHRoZSBsb29wIHN0YXJ0ZWQgY291bGQgaGF2ZSBiZWVuIGRlc3Ryb3llZAoJCQkvLyBieSBjb250YWluZXJzLiBBdm9pZCByZWRlc3Ryb3lpbmcgY29tcG9uZW50cyBieSB0ZXN0aW5nCgkJCS8vIGRlc3Ryb3llZCBmbGFnLgoJCQlpZiAoIWMuZGVzdHJveWVkKSB7CgkJCQljLmRlc3Ryb3koKTsKCQkJfQoJCX0pOwoJfSwKCS8vKiBAcHJvdGVjdGVkCgltYWtlSWQ6IGZ1bmN0aW9uKCkgewoJCXZhciBkZWxpbSA9ICJfIiwgcHJlID0gdGhpcy5vd25lciAmJiB0aGlzLm93bmVyLmdldElkKCk7CgkJdmFyIGJhc2VOYW1lID0gdGhpcy5uYW1lIHx8ICgiQEAiICsgKCsrZW55by5Db21wb25lbnQuX3VubmFtZWRLaW5kTnVtYmVyKSk7CgkJcmV0dXJuIChwcmUgPyBwcmUgKyBkZWxpbSA6ICIiKSArIGJhc2VOYW1lOwoJfSwKCW93bmVyQ2hhbmdlZDogZnVuY3Rpb24oaW5PbGRPd25lcikgewoJCWlmIChpbk9sZE93bmVyICYmIGluT2xkT3duZXIucmVtb3ZlQ29tcG9uZW50KSB7CgkJCWluT2xkT3duZXIucmVtb3ZlQ29tcG9uZW50KHRoaXMpOwoJCX0KCQlpZiAodGhpcy5vd25lciAmJiB0aGlzLm93bmVyLmFkZENvbXBvbmVudCkgewoJCQl0aGlzLm93bmVyLmFkZENvbXBvbmVudCh0aGlzKTsKCQl9CgkJaWYgKCF0aGlzLmlkKSB7CgkJCXRoaXMuaWQgPSB0aGlzLm1ha2VJZCgpOwoJCX0KCQkvL3RoaXMuaWQgPSB0aGlzLm1ha2VJZCgpOwoJfSwKCW5hbWVDb21wb25lbnQ6IGZ1bmN0aW9uKGluQ29tcG9uZW50KSB7CgkJdmFyIHByZWZpeCA9IGVueW8uQ29tcG9uZW50LnByZWZpeEZyb21LaW5kTmFtZShpbkNvbXBvbmVudC5raW5kTmFtZSk7CgkJLy8gZ2V0IGxhc3QgbWVtb2l6ZWQgbmFtZSBpbmRleAoJCXZhciBuLCBpID0gdGhpcy5fY29tcG9uZW50TmFtZU1hcFtwcmVmaXhdIHx8IDA7CgkJLy8gZmluZCBhbiBhdmFpbGFibGUgbmFtZQoJCWRvIHsKCQkJbiA9IHByZWZpeCArICgrK2kgPiAxID8gU3RyaW5nKGkpIDogIiIpOwoJCX0gd2hpbGUgKHRoaXMuJFtuXSk7CgkJLy8gbWVtb2l6ZSBuZXh0IGxpa2VseS11bmlxdWUgaWQgdGFnIGZvciB0aGlzIHByZWZpeAoJCXRoaXMuX2NvbXBvbmVudE5hbWVNYXBbcHJlZml4XSA9IE51bWJlcihpKTsKCQkvLyBzZXQgYW5kIHJldHVybgoJCWluQ29tcG9uZW50Lm5hbWUgPSBuOwoJCXJldHVybiBpbkNvbXBvbmVudC5uYW1lOwoJfSwKCS8qKgoJCUFkZHMgX2luQ29tcG9uZW50XyB0byB0aGUgbGlzdCBvZiBjb21wb25lbnRzIG93bmVkIGJ5IHRoZSBjdXJyZW50CgkJY29tcG9uZW50IChpLmUuLCBfdGhpcy4kXykuCgkqLwoJYWRkQ29tcG9uZW50OiBmdW5jdGlvbihpbkNvbXBvbmVudCkgewoJCXZhciBuID0gaW5Db21wb25lbnQuZ2V0TmFtZSgpOwoJCWlmICghbikgewoJCQluID0gdGhpcy5uYW1lQ29tcG9uZW50KGluQ29tcG9uZW50KTsKCQl9CgkJaWYgKHRoaXMuJFtuXSkgewoJCQl0aGlzLndhcm4oJ0R1cGxpY2F0ZSBjb21wb25lbnQgbmFtZSAiJyArIG4gKyAnIiBpbiBvd25lciAiJyArIHRoaXMuaWQgKyAnIiB2aW9sYXRlcyAnICsKCQkJCSd1bmlxdWUtbmFtZS11bmRlci1vd25lciBydWxlLCByZXBsYWNpbmcgZXhpc3RpbmcgY29tcG9uZW50IGluIHRoZSBoYXNoIGFuZCBjb250aW51aW5nLCAnICsKCQkJCSdidXQgdGhpcyBpcyBhbiBlcnJvciBjb25kaXRpb24gYW5kIHNob3VsZCBiZSBmaXhlZC4nKTsKCQl9CgkJdGhpcy4kW25dID0gaW5Db21wb25lbnQ7Cgl9LAoJLy8qIFJlbW92ZXMgX2luQ29tcG9uZW50XyBmcm9tIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgb3duZWQgYnkgdGhlIGN1cnJlbnQKCS8vKiBjb21wb25lbnQgKGkuZS4sIF90aGlzLiRfKS4KCXJlbW92ZUNvbXBvbmVudDogZnVuY3Rpb24oaW5Db21wb25lbnQpIHsKCQlkZWxldGUgdGhpcy4kW2luQ29tcG9uZW50LmdldE5hbWUoKV07Cgl9LAoJLy8qIEBwdWJsaWMKCS8qKgoJCVJldHVybnMgYW4gYXJyYXkgb2Ygb3duZWQgY29tcG9uZW50czsgaW4gb3RoZXIgd29yZHMsIGNvbnZlcnRzIHRoZSBfJF8KCQloYXNoIGludG8gYW4gYXJyYXkgYW5kIHJldHVybnMgdGhlIGFycmF5LgoJKi8KCWdldENvbXBvbmVudHM6IGZ1bmN0aW9uKCkgewoJCXZhciByZXN1bHRzID0gW107CgkJZm9yICh2YXIgbiBpbiB0aGlzLiQpIHsKCQkJcmVzdWx0cy5wdXNoKHRoaXMuJFtuXSk7CgkJfQoJCXJldHVybiByZXN1bHRzOwoJfSwKCS8vKiBAcHJvdGVjdGVkCglhZGp1c3RDb21wb25lbnRQcm9wczogZnVuY3Rpb24oaW5Qcm9wcykgewoJCWlmICh0aGlzLmRlZmF1bHRQcm9wcykgewoJCQllbnlvLm1peGluKGluUHJvcHMsIHRoaXMuZGVmYXVsdFByb3BzKTsKCQl9CgkJaW5Qcm9wcy5raW5kID0gaW5Qcm9wcy5raW5kIHx8IGluUHJvcHMuaXNhIHx8IHRoaXMuZGVmYXVsdEtpbmQ7CgkJaW5Qcm9wcy5vd25lciA9IGluUHJvcHMub3duZXIgfHwgdGhpczsKCX0sCglfY3JlYXRlQ29tcG9uZW50OiBmdW5jdGlvbihpbkluZm8sIGluTW9yZUluZm8pIHsKCQlpZiAoIWluSW5mby5raW5kICYmICgia2luZCIgaW4gaW5JbmZvKSkgewoJCQl0aHJvdyAiZW55by5jcmVhdGU6IEF0dGVtcHQgdG8gY3JlYXRlIGEgbnVsbCBraW5kLiBDaGVjayBkZXBlbmRlbmNpZXMgZm9yIFsiICsgaW5JbmZvLm5hbWUgKyAiXS4iOwoJCX0KCQkvLyBDQVZFQVQ6IGluSW5mbyBhbmQgaW5Nb3JlSW5mbyBhcmUgY29waWVkIGJlZm9yZSBtdXRhdGlvbiwgYnV0IGl0J3Mgb25seSBhIHNoYWxsb3cgY29weQoJCXZhciBwcm9wcyA9IGVueW8ubWl4aW4oZW55by5jbG9uZShpbk1vcmVJbmZvKSwgaW5JbmZvKTsKCQl0aGlzLmFkanVzdENvbXBvbmVudFByb3BzKHByb3BzKTsKCQlyZXR1cm4gZW55by5Db21wb25lbnQuY3JlYXRlKHByb3BzKTsKCX0sCgkvLyogQHB1YmxpYwoJLyoqCgkJQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNvbXBvbmVudCBhcyBkZWZpbmVkIGJ5IHRoZSBjb21iaW5hdGlvbiBvZgoJCV9pbkluZm9fIGFuZCBfaW5Nb3JlSW5mb18uIFByb3BlcnRpZXMgaW4gX2luSW5mb18gb3ZlcnJpZGUgcHJvcGVydGllcyBpbgoJCV9pbk1vcmVJbmZvXy4KCgkJVGhlIGNyZWF0ZWQgY29tcG9uZW50IHBhc3NlcyB0aHJvdWdoIGluaXRpYWxpemF0aW9uIG1hY2hpbmVyeSBwcm92aWRlZAoJCWJ5IHRoZSBjcmVhdGluZyBjb21wb25lbnQsIHdoaWNoIG1heSBzdXBwbHkgc3BlY2lhbCBoYW5kbGluZy4KCQlVbmxlc3MgdGhlIG93bmVyIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCB0aGUgbmV3IGNvbXBvbmVudCB3aWxsIGJlCgkJb3duZWQgYnkgdGhlIGluc3RhbmNlIG9uIHdoaWNoIF9jcmVhdGVDb21wb25lbnRfIGlzIGNhbGxlZC4KCgkJCS8vIENyZWF0ZSBhIG5ldyBjb21wb25lbnQgbmFtZWQgX2R5bmFtaWNfIG93bmVkIGJ5IF90aGlzXwoJCQkvLyAod2lsbCBiZSBhdmFpbGFibGUgYXMgdGhpcy4kLmR5bmFtaWMpLgoJCQl0aGlzLmNyZWF0ZUNvbXBvbmVudCh7bmFtZTogImR5bmFtaWMifSk7CgoJCQkvLyBDcmVhdGUgYSBuZXcgY29tcG9uZW50IG5hbWVkIF9hbm90aGVyXyBvd25lZCBieSBfb3RoZXJfCgkJCS8vICh3aWxsIGJlIGF2YWlsYWJsZSBhcyBvdGhlci4kLmFub3RoZXIpLgoJCQl0aGlzLmNyZWF0ZUNvbXBvbmVudCh7bmFtZTogImFub3RoZXIifSwge293bmVyOiBvdGhlcn0pOwoJKi8KCWNyZWF0ZUNvbXBvbmVudDogZnVuY3Rpb24oaW5JbmZvLCBpbk1vcmVJbmZvKSB7CgkJLy8gY3JlYXRlQ29tcG9uZW50IGFuZCBjcmVhdGVDb21wb25lbnRzIGJvdGggZGVsZWdhdGUgdG8gdGhlIHByb3RlY3RlZCBtZXRob2QgKF9jcmVhdGVDb21wb25lbnQpLAoJCS8vIGFsbG93aW5nIG92ZXJyaWRlcyB0byBjdXN0b21pemUgY3JlYXRlQ29tcG9uZW50IGFuZCBjcmVhdGVDb21wb25lbnRzIHNlcGFyYXRlbHkuCgkJcmV0dXJuIHRoaXMuX2NyZWF0ZUNvbXBvbmVudChpbkluZm8sIGluTW9yZUluZm8pOwoJfSwKCS8qKgoJCUNyZWF0ZXMgQ29tcG9uZW50IG9iamVjdHMgYXMgZGVmaW5lZCBieSB0aGUgYXJyYXkgb2YgY29uZmlndXJhdGlvbnMKCQlfaW5JbmZvc18uIEVhY2ggY29uZmlndXJhdGlvbiBpbiBfaW5JbmZvc18gaXMgY29tYmluZWQgd2l0aCBfaW5Db21tb25JbmZvXywKCQlhcyBkZXNjcmliZWQgaW4gX2NyZWF0ZUNvbXBvbmVudF8uCgoJCVJldHVybnMgYW4gYXJyYXkgb2YgcmVmZXJlbmNlcyB0byB0aGUgY3JlYXRlZCBjb21wb25lbnRzLgoKCQkJLy8gYXNrIGZvbyB0byBjcmVhdGUgY29tcG9uZW50cyBfYmFyXyBhbmQgX3pvdF8sIGJ1dCBzZXQgdGhlIG93bmVyIG9mCgkJCS8vIGJvdGggY29tcG9uZW50cyB0byBfdGhpc18uCgkJCXRoaXMuJC5mb28uY3JlYXRlQ29tcG9uZW50cyhbCgkJCQl7bmFtZTogImJhciJ9LAoJCQkJe25hbWU6ICJ6b3QifQoJCQldLCB7b3duZXI6IHRoaXN9KTsKCSovCgljcmVhdGVDb21wb25lbnRzOiBmdW5jdGlvbihpbkluZm9zLCBpbkNvbW1vbkluZm8pIHsKCQlpZiAoaW5JbmZvcykgewoJCQl2YXIgY3MgPSBbXTsKCQkJZm9yICh2YXIgaT0wLCBjaTsgKGNpPWluSW5mb3NbaV0pOyBpKyspIHsKCQkJCWNzLnB1c2godGhpcy5fY3JlYXRlQ29tcG9uZW50KGNpLCBpbkNvbW1vbkluZm8pKTsKCQkJfQoJCQlyZXR1cm4gY3M7CgkJfQoJfSwKCS8vKiBAcHJvdGVjdGVkCglnZXRCdWJibGVUYXJnZXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLl9idWJibGVfdGFyZ2V0IHx8IHRoaXMub3duZXI7Cgl9LAoJLy8qIEBwdWJsaWMKCS8qKgoJCUJ1YmJsZXMgYW4gZXZlbnQgdXAgYW4gb2JqZWN0IGNoYWluLCBzdGFydGluZyB3aXRoIF90aGlzXy4KCgkJSWYgYSBoYW5kbGVyIGZvciB0aGlzIGV2ZW50IHJldHVybnMgdHJ1ZSAoYWthIF9oYW5kbGVkXyksCgkJYnViYmxpbmcgaXMgc3RvcHBlZC4KCgkJSGFuZGxlcnMgYWx3YXlzIGhhdmUgdGhpcyBzaWduYXR1cmU6CgoJCQlmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkKCgkJd2hlcmUgX2luU2VuZGVyXyByZWZlcnMgdG8gdGhlIGNvbXBvbmVudCB0aGF0IG1vc3QgcmVjZW50bHkKCQlwcm9wYWdhdGVkIHRoZSBldmVudCBhbmQgX2luRXZlbnRfIGlzIGFuIG9iamVjdCBjb250YWluaW5nCgkJZXZlbnQgaW5mb3JtYXRpb24uCgoJCV9pbkV2ZW50XyB3aWxsIGhhdmUgYXQgbGVhc3Qgb25lIHByb3BlcnR5LCBfb3JpZ2luYXRvcl8sIHdoaWNoCgkJcmVmZXJlbmNlcyB0aGUgY29tcG9uZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudCBpbiB0aGUgZmlyc3QgcGxhY2UuCgkqLwoJYnViYmxlOiBmdW5jdGlvbihpbkV2ZW50TmFtZSwgaW5FdmVudCwgaW5TZW5kZXIpIHsKCQlpZiAodGhpcy5fc2lsZW5jZWQpIHsKCQkJcmV0dXJuOwoJCX0KCQl2YXIgZSA9IGluRXZlbnQgfHwge307CgkJLy8gRklYTUU6IGlzIHRoaXMgdGhlIHJpZ2h0IHBsYWNlPwoJCS8vIGlmICghKCJvcmlnaW5hdG9yIiBpbiBlKSkgewoJCWlmICghZW55by5leGlzdHMoZS5vcmlnaW5hdG9yKSkgewoJCQllLm9yaWdpbmF0b3IgPSBpblNlbmRlciB8fCB0aGlzOwoJCQkvLyBGSVhNRTogdXNlIGluZGlyZWN0aW9uIGhlcmU/CgkJCS8vZS5kZWxlZ2F0ZSA9IGUub3JpZ2luYXRvci5kZWxlZ2F0ZSB8fCBlLm9yaWdpbmF0b3Iub3duZXI7CgkJfQoJCXJldHVybiB0aGlzLmRpc3BhdGNoQnViYmxlKGluRXZlbnROYW1lLCBlLCBpblNlbmRlciB8fCB0aGlzKTsKCX0sCgkvKioKCQlCdWJibGVzIGFuIGV2ZW50IHVwIGFuIG9iamVjdCBjaGFpbiwgc3RhcnRpbmcgPGI+YWJvdmU8L2I+IF90aGlzXy4KCgkJSWYgYSBoYW5kbGVyIGZvciB0aGlzIGV2ZW50IHJldHVybnMgdHJ1ZSAoaS5lLiwgX2hhbmRsZWRfKSwKCQlidWJibGluZyBpcyBzdG9wcGVkLgoKCQlIYW5kbGVycyBhbHdheXMgaGF2ZSB0aGlzIHNpZ25hdHVyZToKCgkJCWZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KQoKCQl3aGVyZSBfaW5TZW5kZXJfIHJlZmVycyB0byB0aGUgY29tcG9uZW50IHRoYXQgbW9zdCByZWNlbnRseQoJCXByb3BhZ2F0ZWQgdGhlIGV2ZW50IGFuZCBfaW5FdmVudF8gaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcKCQlldmVudCBpbmZvcm1hdGlvbi4KCgkJX2luRXZlbnRfIHdpbGwgaGF2ZSBhdCBsZWFzdCBvbmUgcHJvcGVydHksIF9vcmlnaW5hdG9yXywgd2hpY2gKCQlyZWZlcmVuY2VzIHRoZSBjb21wb25lbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50IGluIHRoZSBmaXJzdCBwbGFjZS4KCSovCglidWJibGVVcDogZnVuY3Rpb24oaW5FdmVudE5hbWUsIGluRXZlbnQsIGluU2VuZGVyKSB7CgkJaWYgKHRoaXMuX3NpbGVuY2VkKSB7CgkJCXJldHVybjsKCQl9CgkJLy8gQnViYmxlIHRvIG5leHQgdGFyZ2V0CgkJdmFyIG5leHQgPSB0aGlzLmdldEJ1YmJsZVRhcmdldCgpOwoJCXZhciBkZWxlZ2F0ZSA9IGluRXZlbnQuZGVsZWdhdGU7CgkJaWYgKG5leHQpIHsKCQkJcmV0dXJuIG5leHQuZGlzcGF0Y2hCdWJibGUoaW5FdmVudE5hbWUsIGluRXZlbnQsIGRlbGVnYXRlIHx8IHRoaXMpOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9LAoJLy8qIEBwcm90ZWN0ZWQKCS8qKgoJCVNlbmRzIGFuIGV2ZW50IHRvIGEgbmFtZWQgZGVsZWdhdGUuIFRoaXMgb2JqZWN0IG1heSBkaXNwYXRjaCBhbiBldmVudAoJCXRvIGl0c2VsZiB2aWEgYSBoYW5kbGVyLCBvciB0byBpdHMgb3duZXIgdmlhIGFuIGV2ZW50IHByb3BlcnR5LCBlLmcuOgoKCQkJaGFuZGxlcnMgewoJCQkJLy8gJ3RhcCcgZXZlbnRzIGRpc3BhdGNoZWQgdG8gdGhpcy50YXBIYW5kbGVyCgkJCQlvbnRhcDogInRhcEhhbmRsZXIiCgkJCX0KCgkJCS8vICd0YXAnIGV2ZW50cyBkaXNwYXRjaGVkIHRvICd0YXBIYW5kbGVyJyBkZWxlZ2F0ZSBpbiB0aGlzLm93bmVyCgkJCW9udGFwOiAidGFwSGFuZGxlciIKCSovCglkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbihuYW1lLCBldmVudCwgc2VuZGVyKSB7CgkJaWYgKHRoaXMuX3NpbGVuY2VkKSB7CgkJCXJldHVybjsKCQl9CgkJLy8gaWYgdGhlIGV2ZW50IGhhcyBhIGRlbGVnYXRlIGFzc29jaWF0ZWQgd2l0aCBpdCB3ZSBncmFiIHRoYXQKCQkvLyBmb3IgcmVmZXJlbmNlCgkJdmFyIGRlbGVnYXRlID0gKGV2ZW50IHx8IChldmVudCA9IGVueW8ucG9vbC5jbGFpbU9iamVjdCgpKSkuZGVsZWdhdGU7CgkJdmFyIHJldDsKCQkvLyBib3R0bGVuZWNrIGV2ZW50IGRlY29yYXRpb24KCQl0aGlzLmRlY29yYXRlRXZlbnQobmFtZSwgZXZlbnQsIHNlbmRlcik7CgkJLy8gZGlzcGF0Y2ggdmlhIHRoZSBoYW5kbGVycyBibG9jayBpZiBwb3NzaWJsZQoJCWlmICh0aGlzLmhhbmRsZXJzICYmIHRoaXMuaGFuZGxlcnNbbmFtZV0gJiYKCQkJdGhpcy5kaXNwYXRjaCh0aGlzLmhhbmRsZXJzW25hbWVdLCBldmVudCwgc2VuZGVyKSkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCWlmICh0aGlzW25hbWVdKSB7CgkJCWlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgdGhpc1tuYW1lXSkgewoJCQkJaWYgKHRoaXMuX2lzQ29udHJvbGxlciB8fCAoZGVsZWdhdGUgJiYgdGhpcyA9PT0gZGVsZWdhdGUub3duZXIpKSB7CgkJCQkJcmV0dXJuIHRoaXMuZGlzcGF0Y2gobmFtZSwgZXZlbnQsIHNlbmRlcik7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBvdGhlcndpc2Ugd2UgZGlzcGF0Y2ggaXQgdXAgYmVjYXVzZSBpdCBpcyBhIHJlbWFwIG9mIGFub3RoZXIgZXZlbnQKCQkJCWlmICghZGVsZWdhdGUpIHsKCQkJCQlldmVudC5kZWxlZ2F0ZSA9IHRoaXM7CgkJCQl9CgkJCQlyZXQgPSB0aGlzLmJ1YmJsZVVwKHRoaXNbbmFtZV0sIGV2ZW50LCBzZW5kZXIpOwoJCQkJZGVsZXRlIGV2ZW50LmRlbGVnYXRlOwoJCQkJcmV0dXJuIHJldDsKCQkJfQoJCX0KCX0sCgkvLyBpbnRlcm5hbCAtIHRyeSBkaXNwYXRjaGluZyBldmVudCB0byBzZWxmLCBpZiB0aGF0IGZhaWxzIGJ1YmJsZSBpdCB1cCB0aGUgdHJlZQoJZGlzcGF0Y2hCdWJibGU6IGZ1bmN0aW9uKGluRXZlbnROYW1lLCBpbkV2ZW50LCBpblNlbmRlcikgewoJCWlmICh0aGlzLl9zaWxlbmNlZCkgewoJCQlyZXR1cm47CgkJfQoJCS8vIFRyeSB0byBkaXNwYXRjaCBmcm9tIGhlcmUsIHN0b3AgYnViYmxpbmcgb24gdHJ1dGh5IHJldHVybiB2YWx1ZQoJCWlmICh0aGlzLmRpc3BhdGNoRXZlbnQoaW5FdmVudE5hbWUsIGluRXZlbnQsIGluU2VuZGVyKSkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJLy8gQnViYmxlIHRvIG5leHQgdGFyZ2V0CgkJcmV0dXJuIHRoaXMuYnViYmxlVXAoaW5FdmVudE5hbWUsIGluRXZlbnQsIGluU2VuZGVyKTsKCX0sCglkZWNvcmF0ZUV2ZW50OiBmdW5jdGlvbihpbkV2ZW50TmFtZSwgaW5FdmVudCwgaW5TZW5kZXIpIHsKCQkvLyBhbiBldmVudCBtYXkgZmxvYXQgYnkgdXMgYXMgcGFydCBvZiBhIGRpc3BhdGNoRXZlbnQgY2hhaW4gb3IgZGVsZWdhdGVFdmVudAoJCS8vIGJvdGggY2FsbCB0aGlzIG1ldGhvZCBzbyBpbnRlcm1lZGlhcmllcyBjYW4gZGVjb3JhdGUgaW5FdmVudAoJfSwKCWJ1YmJsZURlbGVnYXRpb246IGZ1bmN0aW9uKGluRGVsZWdhdGUsIGluTmFtZSwgaW5FdmVudE5hbWUsIGluRXZlbnQsIGluU2VuZGVyKSB7CgkJaWYgKHRoaXMuX3NpbGVuY2VkKSB7CgkJCXJldHVybjsKCQl9CgkJLy8gbmV4dCB0YXJnZXQgaW4gYnViYmxlIHNlcXVlbmNlCgkJdmFyIG5leHQgPSB0aGlzLmdldEJ1YmJsZVRhcmdldCgpOwoJCWlmIChuZXh0KSB7CgkJCXJldHVybiBuZXh0LmRlbGVnYXRlRXZlbnQoaW5EZWxlZ2F0ZSwgaW5OYW1lLCBpbkV2ZW50TmFtZSwgaW5FdmVudCwgaW5TZW5kZXIpOwoJCX0KCX0sCglkZWxlZ2F0ZUV2ZW50OiBmdW5jdGlvbihpbkRlbGVnYXRlLCBpbk5hbWUsIGluRXZlbnROYW1lLCBpbkV2ZW50LCBpblNlbmRlcikgewoJCWlmICh0aGlzLl9zaWxlbmNlZCkgewoJCQlyZXR1cm47CgkJfQoJCS8vIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBsYXkgdHJpY2tzIHdpdGggZGVsZWdhdGlvbgoJCS8vIGJvdHRsZW5lY2sgZXZlbnQgZGVjb3JhdGlvbgoJCXRoaXMuZGVjb3JhdGVFdmVudChpbkV2ZW50TmFtZSwgaW5FdmVudCwgaW5TZW5kZXIpOwoJCS8vIGJ5IGRlZmF1bHQsIGRpc3BhdGNoIHRoaXMgZXZlbnQgaWYgd2UgYXJlIGluIGZhY3QgdGhlIGRlbGVnYXRlCgkJaWYgKGluRGVsZWdhdGUgPT0gdGhpcykgewoJCQlyZXR1cm4gdGhpcy5kaXNwYXRjaChpbk5hbWUsIGluRXZlbnQsIGluU2VuZGVyKTsKCQl9CgkJcmV0dXJuIHRoaXMuYnViYmxlRGVsZWdhdGlvbihpbkRlbGVnYXRlLCBpbk5hbWUsIGluRXZlbnROYW1lLCBpbkV2ZW50LCBpblNlbmRlcik7Cgl9LAoJc3RvcEFsbEpvYnM6IGZ1bmN0aW9uKCkgewoJCWZvciAodmFyIGpvYk5hbWUgaW4gdGhpcy5fX2pvYnMpIHsKCQkJdGhpcy5zdG9wSm9iKGpvYk5hbWUpOwoJCX0KCX0sCgkvLyogQHB1YmxpYwoJLyoqCgkJRGlzcGF0Y2hlcyB0aGUgZXZlbnQgdG8gbmFtZWQgZGVsZWdhdGUgX2luTWV0aG9kTmFtZV8sIGlmIGl0IGV4aXN0cy4KCQlTdWJraW5kcyBtYXkgcmUtcm91dGUgZGlzcGF0Y2hlcy4KCQlOb3RlIHRoYXQgYm90aCAnaGFuZGxlcnMnIGV2ZW50cyBhbmQgZXZlbnRzIGRlbGVnYXRlZCBmcm9tIG93bmVkIGNvbnRyb2xzCgkJYXJyaXZlIGhlcmUuIElmIHlvdSBuZWVkIHRvIGhhbmRsZSB0aGVzZSBkaWZmZXJlbnRseSwgeW91IG1heSBhbHNvIG5lZWQKCQl0byBvdmVycmlkZSBfZGlzcGF0Y2hFdmVudF8uCgkqLwoJZGlzcGF0Y2g6IGZ1bmN0aW9uKGluTWV0aG9kTmFtZSwgaW5FdmVudCwgaW5TZW5kZXIpIHsKCQlpZiAodGhpcy5fc2lsZW5jZWQpIHsKCQkJcmV0dXJuOwoJCX0KCQl2YXIgZm4gPSBpbk1ldGhvZE5hbWUgJiYgdGhpc1tpbk1ldGhvZE5hbWVdOwoJCWlmIChmbiAmJiAiZnVuY3Rpb24iID09PSB0eXBlb2YgZm4pIHsKCQkJLy8gVE9ETzogd2UgdXNlIGluU2VuZGVyIHx8IHRoaXMgYnV0IHRoZSBpblNlbmRlciBhcmd1bWVudAoJCQkvLyB0byBrZWVwIHVuaXQgdGVzdHMgd29ya2luZyB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZQoJCQlyZXR1cm4gZm4uY2FsbCh0aGlzLCBpblNlbmRlciB8fCB0aGlzLCBpbkV2ZW50KTsKCQl9Cgl9LAoJLyoqCgkJU2VuZHMgYSBtZXNzYWdlIHRvIG15c2VsZiBhbmQgYWxsIG9mIG15IGNvbXBvbmVudHMuCgkJWW91IGNhbiBzdG9wIGEgd2F0ZXJmYWxsIGludG8gY29tcG9uZW50cyBvd25lZCBieSBhCgkJcmVjZWl2aW5nIG9iamVjdCBieSByZXR1cm5pbmcgYSB0cnV0aHkgdmFsdWUgZnJvbQoJCXRoZSBldmVudCBoYW5kbGVyLgoJKi8KCXdhdGVyZmFsbDogZnVuY3Rpb24obmFtZSwgZXZlbnQsIHNlbmRlcikgewoJCWlmICh0aGlzLl9zaWxlbmNlZCkgewoJCQlyZXR1cm47CgkJfQoJCWV2ZW50ID0gZXZlbnQgfHwge307CgkJLy90aGlzLmxvZyhuYW1lLCAoc2VuZGVyIHx8IHRoaXMpLm5hbWUsICI9PiIsIHRoaXMubmFtZSk7CgkJaWYgKHRoaXMuZGlzcGF0Y2hFdmVudChuYW1lLCBldmVudCwgc2VuZGVyKSkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJdGhpcy53YXRlcmZhbGxEb3duKG5hbWUsIGV2ZW50LCBzZW5kZXIgfHwgdGhpcyk7Cgl9LAoJLyoqCgkJU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCBvZiBteSBjb21wb25lbnRzLCBidXQgbm90IG15c2VsZi4KCQlZb3UgY2FuIHN0b3AgYSB3YXRlcmZhbGwgaW50byBjb21wb25lbnRzIG93bmVkIGJ5IGEKCQlyZWNlaXZpbmcgb2JqZWN0IGJ5IHJldHVybmluZyBhIHRydXRoeSB2YWx1ZSBmcm9tCgkJdGhlIGV2ZW50IGhhbmRsZXIuCgkqLwoJd2F0ZXJmYWxsRG93bjogZnVuY3Rpb24obmFtZSwgZXZlbnQsIHNlbmRlcikgewoJCWlmICh0aGlzLl9zaWxlbmNlZCkgewoJCQlyZXR1cm47CgkJfQoJCWZvciAodmFyIG4gaW4gdGhpcy4kKSB7CgkJCXRoaXMuJFtuXS53YXRlcmZhbGwobmFtZSwgZXZlbnQsIHNlbmRlcik7CgkJfQoJfSwKCS8vKkBwcm90ZWN0ZWQKCV9zaWxlbmNlZDogZmFsc2UsCgkvLypAcHJvdGVjdGVkCglfc2lsZW5jZV9jb3VudDogMCwKCS8vKkBwdWJsaWMKCS8qKgoJCVNldHMgYSBmbGFnIHRoYXQgZGlzYWJsZXMgZXZlbnQgcHJvcGFnYXRpb24gZm9yIHRoaXMgY29tcG9uZW50LiBBbHNvCgkJaW5jcmVtZW50cyBhbiBpbnRlcm5hbCBjb3VudGVyIHRoYXQgdHJhY2tzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCgkJX3Vuc2lsZW5jZV8gbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBldmVudCBwcm9wYWdhdGlvbiB3aWxsIGNvbnRpbnVlLgoJKi8KCXNpbGVuY2U6IGZ1bmN0aW9uICgpIHsKCQl0aGlzLl9zaWxlbmNlZCA9IHRydWU7CgkJdGhpcy5fc2lsZW5jZV9jb3VudCArPSAxOwoJfSwKCgkvLypAcHVibGljCgkvKioKCQlBbGxvd3MgZXZlbnQgcHJvcGFnYXRpb24gZm9yIHRoaXMgY29tcG9uZW50IGlmIHRoZSBpbnRlcm5hbCBzaWxlbmNlIGNvdW50ZXIKCQlpcyAwOyBvdGhlcndpc2UsIGRlY3JlbWVudHMgdGhlIGNvdW50ZXIgYnkgb25lLiAgRm9yIGV2ZW50IHByb3BhZ2F0aW9uIHRvCgkJcmVzdW1lLCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmUgdGltZSBmb3IgZWFjaCBjYWxsIHRvIF9zaWxlbmNlXy4KCSovCgl1bnNpbGVuY2U6IGZ1bmN0aW9uICgpIHsKCQlpZiAoMCAhPT0gdGhpcy5fc2lsZW5jZV9jb3VudCkgewoJCQktLXRoaXMuX3NpbGVuY2VfY291bnQ7CgkJfQoJCWlmICgwID09PSB0aGlzLl9zaWxlbmNlX2NvdW50KSB7CgkJCXRoaXMuX3NpbGVuY2VkID0gZmFsc2U7CgkJfQoJfSwKCS8qKgoJCUNyZWF0ZXMgYSBuZXcgam9iIHRpZWQgdG8gdGhpcyBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiBJZiB0aGUgY29tcG9uZW50CgkJaXMgZGVzdHJveWVkLCBhbnkgam9icyBhc3NvY2lhdGVkIHdpdGggaXQgd2lsbCBiZSBzdG9wcGVkLgoKCQlJZiB5b3Ugc3RhcnQgYSBqb2Igd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgcGVuZGluZyBqb2IsIHRoZSBvcmlnaW5hbCBqb2IKCQl3aWxsIGJlIHN0b3BwZWQ7IHRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgcmVzZXR0aW5nIHRpbWVvdXRzLgoJKi8KCXN0YXJ0Sm9iOiBmdW5jdGlvbihpbkpvYk5hbWUsIGluSm9iLCBpbldhaXQpIHsKCQkvLyBhbGxvdyBzdHJpbmdzIGFzIGpvYiBuYW1lcywgdGhleSBtYXAgdG8gbG9jYWwgbWV0aG9kIG5hbWVzCgkJaWYgKGVueW8uaXNTdHJpbmcoaW5Kb2IpKSB7CgkJCWluSm9iID0gdGhpc1tpbkpvYl07CgkJfQoJCS8vIHN0b3AgYW55IGV4aXN0aW5nIGpvYnMgd2l0aCBzYW1lIG5hbWUKCQl0aGlzLnN0b3BKb2IoaW5Kb2JOYW1lKTsKCQl0aGlzLl9fam9ic1tpbkpvYk5hbWVdID0gc2V0VGltZW91dCh0aGlzLmJpbmRTYWZlbHkoZnVuY3Rpb24oKSB7CgkJCXRoaXMuc3RvcEpvYihpbkpvYk5hbWUpOwoJCQkvLyBjYWxsICJpbkpvYiIgd2l0aCB0aGlzIGJvdW5kIHRvIHRoZSBjb21wb25lbnQuCgkJCWluSm9iLmNhbGwodGhpcyk7CgkJfSksIGluV2FpdCk7Cgl9LAoJLyoqCgkJU3RvcHMgYSBjb21wb25lbnQtc3BlY2lmaWMgam9iIGJlZm9yZSBpdCBoYXMgYmVlbiBhY3RpdmF0ZWQuCgkqLwoJc3RvcEpvYjogZnVuY3Rpb24oaW5Kb2JOYW1lKSB7CgkJaWYgKHRoaXMuX19qb2JzW2luSm9iTmFtZV0pIHsKCQkJY2xlYXJUaW1lb3V0KHRoaXMuX19qb2JzW2luSm9iTmFtZV0pOwoJCQlkZWxldGUgdGhpcy5fX2pvYnNbaW5Kb2JOYW1lXTsKCQl9Cgl9LAoJLyoqCgkJRXhlY3V0ZSB0aGUgbWV0aG9kIF9pbkpvYl8gaW1tZWRpYXRlbHksIHRoZW4gcHJldmVudAoJCWFueSBvdGhlciBjYWxscyB0byB0aHJvdHRsZUpvYiB3aXRoIHRoZSBzYW1lIF9pbkpvYk5hbWVfIGZyb20gcnVubmluZwoJCWZvciB0aGUJbmV4dCBfaW5XYWl0XyBtaWxsaXNlY29uZHMuCgkqLwoJdGhyb3R0bGVKb2I6IGZ1bmN0aW9uKGluSm9iTmFtZSwgaW5Kb2IsIGluV2FpdCkgewoJCS8vIGlmIHdlIHN0aWxsIGhhdmUgYSBqb2Igd2l0aCB0aGlzIG5hbWUgcGVuZGluZywgcmV0dXJuIGltbWVkaWF0ZWx5CgkJaWYgKHRoaXMuX19qb2JzW2luSm9iTmFtZV0pIHsKCQkJcmV0dXJuOwoJCX0KCQkvLyBhbGxvdyBzdHJpbmdzIGFzIGpvYiBuYW1lcywgdGhleSBtYXAgdG8gbG9jYWwgbWV0aG9kIG5hbWVzCgkJaWYgKGVueW8uaXNTdHJpbmcoaW5Kb2IpKSB7CgkJCWluSm9iID0gdGhpc1tpbkpvYl07CgkJfQoJCWluSm9iLmNhbGwodGhpcyk7CgkJdGhpcy5fX2pvYnNbaW5Kb2JOYW1lXSA9IHNldFRpbWVvdXQodGhpcy5iaW5kU2FmZWx5KGZ1bmN0aW9uKCkgewoJCQl0aGlzLnN0b3BKb2IoaW5Kb2JOYW1lKTsKCQl9KSwgaW5XYWl0KTsKCX0KfSk7CgovLyogQHByb3RlY3RlZAoKZW55by5kZWZhdWx0Q3RvciA9IGVueW8uQ29tcG9uZW50OwoKLy8gQ3JlYXRlcyBuZXcgaW5zdGFuY2VzIGZyb20gY29uZmlnIG9iamVjdHMuIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZQovLyBwcm9wZXIgY29uc3RydWN0b3IgYmFzZWQgb24gdGhlIHByb3ZpZGVkIF9raW5kXyBhdHRyaWJ1dGUuCmVueW8uY3JlYXRlID0gZW55by5Db21wb25lbnQuY3JlYXRlID0gZnVuY3Rpb24oaW5Db25maWcpIHsKCWlmICghaW5Db25maWcua2luZCAmJiAoImtpbmQiIGluIGluQ29uZmlnKSkgewoJCXRocm93ICJlbnlvLmNyZWF0ZTogQXR0ZW1wdCB0byBjcmVhdGUgYSBudWxsIGtpbmQuIENoZWNrIGRlcGVuZGVuY2llcyBmb3IgWyIgKyAoaW5Db25maWcubmFtZSB8fCAiIikgKyAiXS4iOwoJfQoJdmFyIGtpbmQgPSBpbkNvbmZpZy5raW5kIHx8IGluQ29uZmlnLmlzYSB8fCBlbnlvLmRlZmF1bHRDdG9yOwoJdmFyIEN0b3IgPSBlbnlvLmNvbnN0cnVjdG9yRm9yS2luZChraW5kKTsKCWlmICghQ3RvcikgewoJCWVueW8uZXJyb3IoJ25vIGNvbnN0cnVjdG9yIGZvdW5kIGZvciBraW5kICInICsga2luZCArICciJyk7CgkJQ3RvciA9IGVueW8uQ29tcG9uZW50OwoJfQoJcmV0dXJuIG5ldyBDdG9yKGluQ29uZmlnKTsKfTsKCmVueW8uQ29tcG9uZW50LnN1YmNsYXNzID0gZnVuY3Rpb24oY3RvciwgcHJvcHMpIHsKCS8vIE5vdGU6IFRvIHJlZHVjZSBBUEkgc3VyZmFjZSBhcmVhLCBzdWItY29tcG9uZW50cyBhcmUgZGVjbGFyZWQgb25seSBhcwoJLy8gJ2NvbXBvbmVudHMnIGluIGJvdGgga2luZCBhbmQgaW5zdGFuY2UgZGVjbGFyYXRpb25zLgoJLy8KCS8vIEhvd2V2ZXIsICdjb21wb25lbnRzJyBmcm9tIGtpbmQgZGVjbGFyYXRpb25zIG11c3QgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5CgkvLyBhdCBjcmVhdGlvbiB0aW1lLgoJLy8KCS8vIFdlIHJlbmFtZSB0aGUgcHJvcGVydHkgaGVyZSB0byBhdm9pZCBoYXZpbmcKCS8vIHRvIGludGVycm9nYXRlIHRoZSBwcm90b3R5cGUgYXQgY3JlYXRpb24gdGltZS4KCS8vCgl2YXIgcHJvdG8gPSBjdG9yLnByb3RvdHlwZTsKCS8vCglpZiAocHJvcHMuY29tcG9uZW50cykgewoJCXByb3RvLmtpbmRDb21wb25lbnRzID0gcHJvcHMuY29tcG9uZW50czsKCQlkZWxldGUgcHJvdG8uY29tcG9uZW50czsKCX0KCS8vCgkvLyBoYW5kbGVycyBhcmUgbWVyZ2VkIHdpdGggc3VwZXJ0eXBlIGhhbmRsZXJzCgkvLyBhbmQga2luZCB0aW1lLgoJLy8KCWlmIChwcm9wcy5oYW5kbGVycykgewoJCXZhciBraCA9IHByb3RvLmtpbmRIYW5kbGVyczsKCQlwcm90by5raW5kSGFuZGxlcnMgPSBlbnlvLm1peGluKGVueW8uY2xvbmUoa2gpLCBwcm90by5oYW5kbGVycyk7CgkJcHJvdG8uaGFuZGxlcnMgPSBudWxsOwoJfQoJLy8gZXZlbnRzIHByb3BlcnR5IGRlZmluZXMgcHVibGlzaGVkIGV2ZW50cyBmb3IgQ29tcG9uZW50IGtpbmRzCglpZiAocHJvcHMuZXZlbnRzKSB7CgkJdGhpcy5wdWJsaXNoRXZlbnRzKGN0b3IsIHByb3BzKTsKCX0KfTsKCmVueW8uQ29tcG9uZW50LnB1Ymxpc2hFdmVudHMgPSBmdW5jdGlvbihjdG9yLCBwcm9wcykgewoJdmFyIGVzID0gcHJvcHMuZXZlbnRzOwoJaWYgKGVzKSB7CgkJdmFyIGNwID0gY3Rvci5wcm90b3R5cGU7CgkJZm9yICh2YXIgbiBpbiBlcykgewoJCQl0aGlzLmFkZEV2ZW50KG4sIGVzW25dLCBjcCk7CgkJfQoJfQp9OwoKZW55by5Db21wb25lbnQuYWRkRXZlbnQgPSBmdW5jdGlvbihpbk5hbWUsIGluVmFsdWUsIGluUHJvdG8pIHsKCXZhciB2LCBmbjsKCWlmICghZW55by5pc1N0cmluZyhpblZhbHVlKSkgewoJCXYgPSBpblZhbHVlLnZhbHVlOwoJCWZuID0gaW5WYWx1ZS5jYWxsZXI7Cgl9IGVsc2UgewoJCWlmIChpbk5hbWUuc2xpY2UoMCwgMikgIT0gJ29uJykgewoJCQllbnlvLndhcm4oImVueW8uQ29tcG9uZW50LmFkZEV2ZW50OiBldmVudCBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggJ29uJy4gIiArIGluUHJvdG8ua2luZE5hbWUgKwoJCQkJIiBldmVudCAnIiArIGluTmFtZSArICInIHdhcyBhdXRvLWNvcnJlY3RlZCB0byAnb24iICsgaW5OYW1lICsgIicuIik7CgkJCWluTmFtZSA9ICJvbiIgKyBpbk5hbWU7CgkJfQoJCXYgPSBpblZhbHVlOwoJCWZuID0gImRvIiArIGVueW8uY2FwKGluTmFtZS5zbGljZSgyKSk7Cgl9CglpblByb3RvW2luTmFtZV0gPSB2OwoJaWYgKCFpblByb3RvW2ZuXSkgewoJCWluUHJvdG9bZm5dID0gZnVuY3Rpb24ocGF5bG9hZCkgewoJCQkvLyBidWJibGUgdGhpcyBldmVudAoJCQl2YXIgJGUgPSBwYXlsb2FkIHx8IGVueW8ucG9vbC5jbGFpbU9iamVjdCgpOwoJCQl2YXIgJGQgPSAkZS5kZWxlZ2F0ZTsKCQkJLy8gZGVsZXRlIHBheWxvYWQuZGVsZWdhdGU7CgkJCSRlLmRlbGVnYXRlID0gdW5kZWZpbmVkOwoJCQl0aGlzLmJ1YmJsZShpbk5hbWUsICRlKTsKCQkJaWYgKCRkKSB7CgkJCQkkZS5kZWxlZ2F0ZSA9ICRkOwoJCQl9CgkJCWlmICghcGF5bG9hZCB8fCAhcGF5bG9hZC5fcG9vbGVkKSB7CgkJCQllbnlvLnBvb2wucmVsZWFzZU9iamVjdCgkZSk7CgkJCX0KCQl9OwoJCS8vIE5PVEU6IE1hcmsgdGhpcyBmdW5jdGlvbiBhcyBhIGdlbmVyYXRlZCBldmVudCBoYW5kbGVyIHRvIGFsbG93IHVzIHRvCgkJLy8gZG8gZXZlbnQgY2hhaW5pbmcuIElzIHRoaXMgdG9vIGNvbXBsaWNhdGVkPwoJCS8vaW5Qcm90b1tmbl0uX2Rpc3BhdGNoZXIgPSB0cnVlOwoJfQp9OwoKZW55by5Db21wb25lbnQucHJlZml4RnJvbUtpbmROYW1lID0gZnVuY3Rpb24oaW5LaW5kTmFtZSkgewoJdmFyIHByZWZpeCA9IGVueW8uQ29tcG9uZW50Ll9raW5kUHJlZml4aVtpbktpbmROYW1lXTsKCWlmICghcHJlZml4KSB7CgkJLy8gbWVtb2l6ZSBuYW1pbmcgaW5mb3JtYXRpb24gZm9yIHRoaXMga2luZAoJCXZhciBsID0gaW5LaW5kTmFtZS5sYXN0SW5kZXhPZigiLiIpOwoJCXByZWZpeCA9IChsID49IDApID8gaW5LaW5kTmFtZS5zbGljZShsKzEpIDogaW5LaW5kTmFtZTsKCQkvLyBsb3dlci1jYXNlIHRoZSBsZWFkaW5nIGNoYXIKCQlwcmVmaXggPSBwcmVmaXguY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBwcmVmaXguc2xpY2UoMSk7CgkJLy8gbWVtb2l6ZSByZXN1bHQKCQllbnlvLkNvbXBvbmVudC5fa2luZFByZWZpeGlbaW5LaW5kTmFtZV0gPSBwcmVmaXg7Cgl9CglyZXR1cm4gcHJlZml4Owp9Owo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/Controller.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qQHB1YmxpYwovKioKCV9lbnlvLkNvbnRyb2xsZXJfIGlzIHRoZSBiYXNlIGtpbmQgZm9yIGFsbCBjb250cm9sbGVycyBpbiBFbnlvLiBBbgoJYWJzdHJhY3Qga2luZCwgaXQgaXMgYSBkZWxlZ2F0ZS9jb21wb25lbnQgdGhhdCBpcyBkZXNpZ25lZCB0byBiZSBhCglwcm94eSBmb3IgaW5mb3JtYXRpb24uCiovCmVueW8ua2luZCh7CgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBQVUJMSUMgUFJPUEVSVElFUwoKCS8vKkBwdWJsaWMKCW5hbWU6ICJlbnlvLkNvbnRyb2xsZXIiLAoKCS8vKkBwdWJsaWMKCWtpbmQ6ICJlbnlvLk11bHRpcGxlRGlzcGF0Y2hDb21wb25lbnQiLAoKCS8vKkBwdWJsaWMKCS8qKgoJCVRoZSBkZWZhdWx0IHNvdXJjZSBvZiBpbmZvcm1hdGlvbiBmb3IgYWxsIGluc3RhbmNlcyBvZiBfZW55by5Db250cm9sbGVyXwoJCWFuZCBpdHMgc3Via2luZHMuIEluIHNvbWUgY2FzZXMsIHRoaXMgd2lsbCBiZSBhIGNvbXB1dGVkIHByb3BlcnR5IHRvCgkJZmFjaWxpdGF0ZSBvdmVybG9hZGluZy4gSXQgbWF5IGNvbnRhaW4gYW55IHR5cGUgb2YgZGF0YS4KCSovCglkYXRhOiBudWxsLAoKCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJLy8gUFJPVEVDVEVEIFBST1BFUlRJRVMKCgkvLypAcHJvdGVjdGVkCglfaXNDb250cm9sbGVyOiB0cnVlCgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBDT01QVVRFRCBQUk9QRVJUSUVTCgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBQVUJMSUMgTUVUSE9EUwoKCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJLy8gUFJPVEVDVEVEIE1FVEhPRFMKCgkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCS8vIE9CU0VSVkVSUwoKfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/Layout.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5MYXlvdXRfIGlzIHRoZSBiYXNlIGtpbmQgZm9yIGxheW91dCBraW5kcy4gIFRoZXNlIGFyZSB1c2VkIGJ5Cgk8YSBocmVmPSIjZW55by5VaUNvbXBvbmVudCI+ZW55by5VaUNvbXBvbmVudDwvYT4tYmFzZWQgY29udHJvbHMgdG8gYWxsb3cgZm9yCglhcnJhbmdpbmcgb2YgdGhlIGNoaWxkcmVuIGJ5IHNldHRpbmcgdGhlIF9sYXlvdXRLaW5kXyBwcm9wZXJ0eS4KCglEZXJpdmVkIGtpbmRzIHdpbGwgdXN1YWxseSBwcm92aWRlIHRoZWlyIG93biBfbGF5b3V0Q2xhc3NfIHByb3BlcnR5IHRvCglhZmZlY3QgdGhlIENTUyBydWxlcyB1c2VkLCBhbmQgbWF5IGFsc28gaW1wbGVtZW50IHRoZSBfZmxvd18gYW5kIF9yZWZsb3dfCgltZXRob2RzLiBfZmxvd18gaXMgY2FsbGVkIGR1cmluZyBjb250cm9sIHJlbmRlcmluZywgd2hpbGUgX3JlZmxvd18gaXMgY2FsbGVkCgl3aGVuIHRoZSBhc3NvY2lhdGVkIGNvbnRyb2wgaXMgcmVzaXplZC4KKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLkxheW91dCIsCglraW5kOiBudWxsLAoJLy8qIENTUyBjbGFzcyB0aGF0J3MgYWRkZWQgdG8gdGhlIGNvbnRyb2wgdXNpbmcgdGhpcyBsYXlvdXQga2luZAoJbGF5b3V0Q2xhc3M6ICIiLAoJLy8qIEBwcm90ZWN0ZWQKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihpbkNvbnRhaW5lcikgewoJCXRoaXMuY29udGFpbmVyID0gaW5Db250YWluZXI7CgkJaWYgKGluQ29udGFpbmVyKSB7CgkJCWluQ29udGFpbmVyLmFkZENsYXNzKHRoaXMubGF5b3V0Q2xhc3MpOwoJCX0KCX0sCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5jb250YWluZXIpIHsKCQkJdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5sYXlvdXRDbGFzcyk7CgkJfQoJfSwKCS8vIHN0YXRpYyBwcm9wZXJ0eSBsYXlvdXQKCWZsb3c6IGZ1bmN0aW9uKCkgewoJfSwKCS8vIGR5bmFtaWMgbWVhc3VyaW5nIGxheW91dAoJcmVmbG93OiBmdW5jdGlvbigpIHsKCX0KfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/MultipleDispatchComponent.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qQHB1YmxpYwovKioKCVRoZSBgZW55by5NdWx0aXBsZURpc3BhdGNoQ29tcG9uZW50YCBpcyBhIHB1cmVseSBhYnN0cmFjdCBraW5kCglhbmQgc2ltcGx5IGFkZHMgYSBjb21tb24gYW5jZXN0b3IgZm9yIGBlbnlvLkNvbXBvbmVudHNgIHRoYXQKCW5lZWQgdGhlIGBlbnlvLk11bHRpcGxlRGlzcGF0Y2hTdXBwb3J0YCBtaXhpbi4KKi8KZW55by5raW5kKHsKCQoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBQVUJMSUMgUFJPUEVSVElFUwoKCS8vKkBwdWJsaWMKCW5hbWU6ICJlbnlvLk11bHRpcGxlRGlzcGF0Y2hDb21wb25lbnQiLAoJCgkvLypAcHVibGljCglraW5kOiAiZW55by5Db21wb25lbnQiLAoJCgkvLypAcHVibGljCgltaXhpbnM6IFsKCQkiZW55by5NdWx0aXBsZURpc3BhdGNoU3VwcG9ydCIKCV0KCQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/Object.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCl9lbnlvLk9iamVjdF8gbGllcyBhdCB0aGUgaGVhcnQgb2YgdGhlIEVueW8gZnJhbWV3b3JrJ3MgaW1wbGVtZW50YXRpb25zIG9mCnByb3BlcnR5IHB1Ymxpc2hpbmcsIGNvbXB1dGVkIHByb3BlcnRpZXMgKHZpYSB0aGUgX0NvbXB1dGVkUHJvcGVydHlTdXBwb3J0XwptaXhpbiksIGFuZCBkYXRhIGJpbmRpbmcgKHZpYSB0aGUgX0JpbmRpbmdTdXBwb3J0XyBtaXhpbikuIEl0IGFsc28gcHJvdmlkZXMKc2V2ZXJhbCB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgaXRzIHN1YmtpbmRzLgoKUHVibGlzaGVkIHByb3BlcnRpZXMgYXJlIGRlY2xhcmVkIGluIGEgaGFzaCBjYWxsZWQgX3B1Ymxpc2hlZF8gd2l0aGluIGEgY2FsbAp0byBfZW55by5raW5kXy4gVG8gZ2V0IGFuZCBzZXQgdmFsdWVzIGZvciB0aGVzZSBwcm9wZXJ0aWVzLCBjYWxsCl9nZXQoJmx0O3Byb3BlcnR5TmFtZSZndDspXyBhbmQgX3NldCgmbHQ7cHJvcGVydHlOYW1lJmd0OywgJmx0O3ZhbHVlJmd0OylfLApyZXNwZWN0aXZlbHkuCgpCeSBjb252ZW50aW9uLCB0aGUgc2V0dGVyIGZvciBhIHB1Ymxpc2hlZCBwcm9wZXJ0eSB3aWxsIHRyaWdnZXIgYW4gb3B0aW9uYWwKXyZsdDtwcm9wZXJ0eU5hbWUmZ3Q7Q2hhbmdlZF8gbWV0aG9kIHdoZW4gY2FsbGVkLgoKRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW2RvY3VtZW50YXRpb24gb24gUHVibGlzaGVkClByb3BlcnRpZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvanMvZW55by93aWtpL1B1Ymxpc2hlZC1Qcm9wZXJ0aWVzKSBpbiB0aGUKRW55byBEZXZlbG9wZXIgR3VpZGUuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5PYmplY3QiLAoJLy8qIEBwcm90ZWN0ZWQKCS8vIGhhcyBubyBiYXNlIGtpbmQKCWtpbmQ6IG51bGwsCglub0RlZmVyOiB0cnVlLAoJLy8qQHB1YmxpYwoJLy8gY29uY2F0ZW5hdGVkIHByb3BlcnRpZXMgKGRlZmF1bHQpCgljb25jYXQ6IGVueW8uY29uY2F0LAoJLy8qQHB1YmxpYwoJLyoqCgkJQW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgbWl4aW5zIHRvIGJlIGFwcGxpZWQKCQl0byB0aGlzIGtpbmQgYXQgdGhlIGVuZCBvZiB0aGUgY29uc3RydWN0b3Igcm91dGluZS4KCSovCgltaXhpbnM6IFsKCQkiZW55by5NaXhpblN1cHBvcnQiLAoJCSJlbnlvLk9ic2VydmVyU3VwcG9ydCIsCgkJImVueW8uQ29tcHV0ZWRTdXBwb3J0IiwKCQkiZW55by5CaW5kaW5nU3VwcG9ydCIKCV0sCgoJY29uc3RydWN0b3I6IGZ1bmN0aW9uKHByb3BzKSB7CgkJZW55by5fb2JqZWN0Q291bnQrKzsKCQl0aGlzLmltcG9ydFByb3BzKHByb3BzKTsKCX0sCgoJaW1wb3J0UHJvcHM6IGZ1bmN0aW9uIChwcm9wcykgewoJCWlmIChwcm9wcykgewoJCQlmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHsKCQkJCWlmICghcHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJdGhpc1trZXldID0gcHJvcHNba2V5XTsKCQkJfQoJCX0KCX0sCgoJLy8qIEBwdWJsaWMKCS8vKiBEZXN0cm95cyBvYmplY3Qgd2l0aCBwYXNzZWQtaW4gbmFtZS4KCWRlc3Ryb3lPYmplY3Q6IGZ1bmN0aW9uKGluTmFtZSkgewoJCWlmICh0aGlzW2luTmFtZV0gJiYgdGhpc1tpbk5hbWVdLmRlc3Ryb3kpIHsKCQkJdGhpc1tpbk5hbWVdLmRlc3Ryb3koKTsKCQl9CgkJdGhpc1tpbk5hbWVdID0gbnVsbDsKCX0sCgkvKioKCQlTZW5kcyBhIGxvZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLCBwcmVwZW5kZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUga2luZAoJCWFuZCBtZXRob2QgZnJvbSB3aGljaCBfbG9nXyB3YXMgaW52b2tlZC4gIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgY29lcmNlZAoJCXRvIFN0cmluZyBhbmQgam9pbmVkIHdpdGggc3BhY2VzLgoKCQkJZW55by5raW5kKHsKCQkJCW5hbWU6ICJNeU9iamVjdCIsCgkJCQlraW5kOiAiZW55by5PYmplY3QiLAoJCQkJaGVsbG86IGZ1bmN0aW9uKCkgewoJCQkJCXRoaXMubG9nKCJzYXlzIiwgImhpIik7CgkJCQkJLy8gc2hvd3MgaW4gdGhlIGNvbnNvbGU6IE15T2JqZWN0LmhlbGxvOiBzYXlzIGhpCgkJCQl9CgkJCX0pOwoJKi8KCWxvZzogZnVuY3Rpb24oKSB7CgkJdmFyIGFjYyA9IGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyOwoJCXZhciBub20gPSAoKGFjYyA/IGFjYy5ub20gOiAiIikgfHwgIihpbnN0YW5jZSBtZXRob2QpIikgKyAiOiI7CgkJZW55by5sb2dnaW5nLmxvZygibG9nIiwgW25vbV0uY29uY2F0KGVueW8uY2xvbmVBcnJheShhcmd1bWVudHMpKSk7Cgl9LAoJLy8qIFNhbWUgYXMgX2xvZ18sIGV4Y2VwdCB1c2VzIHRoZSBjb25zb2xlJ3Mgd2FybiBtZXRob2QgKGlmIGl0IGV4aXN0cykuCgl3YXJuOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9sb2coIndhcm4iLCBhcmd1bWVudHMpOwoJfSwKCS8vKiBTYW1lIGFzIF9sb2dfLCBleGNlcHQgdXNlcyB0aGUgY29uc29sZSdzIGVycm9yIG1ldGhvZCAoaWYgaXQgZXhpc3RzKS4KCWVycm9yOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9sb2coImVycm9yIiwgYXJndW1lbnRzKTsKCX0sCgkvLyogQHByb3RlY3RlZAoJX2xvZzogZnVuY3Rpb24oaW5NZXRob2QsIGluQXJncykgewoJCWlmIChlbnlvLmxvZ2dpbmcuc2hvdWxkTG9nKGluTWV0aG9kKSkgewoJCQl0cnkgewoJCQkJdGhyb3cgbmV3IEVycm9yKCk7CgkJCX0gY2F0Y2goeCkgewoJCQkJZW55by5sb2dnaW5nLl9sb2coaW5NZXRob2QsIFtpbkFyZ3MuY2FsbGVlLmNhbGxlci5ub20gKyAiOiAiXS5jb25jYXQoZW55by5jbG9uZUFycmF5KGluQXJncykpKTsKCQkJCWVueW8ubG9nKHguc3RhY2spOwoJCQl9CgkJfQoJfSwKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCUFjY2VwdHMgYSBzdHJpbmcgcHJvcGVydHkgYXMgaXRzIG9ubHkgcGFyYW1ldGVyLiBFdmFsdWF0ZXMgdGhlCgkJcHJvcGVydHkgYW5kLCBpZiB0aGUgdmFsdWUgaXMgaXRzZWxmIGEgc3RyaW5nLCBhdHRlbXB0cyB0byByZXNvbHZlCgkJYW4gb2JqZWN0IGZyb20gdGhlIHN0cmluZy4gVGhlIGdvYWwgaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCgkJcHJvcGVydHkgaXMgYSBjb25zdHJ1Y3RvciwgYW4gaW5zdGFuY2UsIG9yIG5laXRoZXIuIFNlZQoJCV9sYW5nLmpzI2VueW8uZmluZEFuZEluc3RhbmNlXyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCgkJSWYgYSBtZXRob2QgZXhpc3RzIG9mIHRoZSBmb3JtIGB7cHJvcGVydHl9RmluZEFuZEluc3RhbmNlYCwgaXQgd2lsbAoJCWJlIHVzZWQgYXMgdGhlIGNhbGxiYWNrLCB3aXRoIHR3byBwYXJhbWV0ZXJzIGFjY2VwdGVkLS10aGUgY29uc3RydWN0b3IKCQkoaWYgaXQgd2FzIGZvdW5kKSBhbmQgdGhlIGluc3RhbmNlIChpZiBpdCB3YXMgZm91bmQgb3IgY3JlYXRlZCkuIFRoaXMKCQlhbGxvd3MgZm9yIHRob3NlIG1ldGhvZHMgdG8gYmUgb3ZlcmxvYWRlZCBieSBzdWJraW5kcy4KCSovCglmaW5kQW5kSW5zdGFuY2U6IGZ1bmN0aW9uIChwcm9wZXJ0eSkgewoJCS8vIGlmIHRoZXJlIGlzbid0IGEgcHJvcGVydHksIGRvIG5vdGhpbmcKCQlpZiAoIWVueW8uZXhpc3RzKHByb3BlcnR5KSkgewoJCQlyZXR1cm47CgkJfQoJCXZhciBmbiA9IHRoaXNbcHJvcGVydHkgKyAiRmluZEFuZEluc3RhbmNlIl07CgkJLy8gZ28gYWhlYWQgYW5kIGNhbGwgdGhlIGVueW8tc2NvcGVkIHZlcnNpb24gb2YgdGhpcyBtZXRob2QKCQlyZXR1cm4gZW55by5maW5kQW5kSW5zdGFuY2UuY2FsbCh0aGlzLCBwcm9wZXJ0eSwgZm4sIHRoaXMpOwoJfSwKCgkvLypAcHVibGljCgkvKioKCQlSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgb3IgY29tcHV0ZWQgcHJvcGVydHkuICBQYXNzIGluIHRoZQoJCW5hbWUgb2YgKG9yIHBhdGggdG8pIHRoZSBkZXNpcmVkIHByb3BlcnR5IG9yIGNvbXB1dGVkIHByb3BlcnR5LiBGb3IKCQljb21wdXRlZCBwcm9wZXJ0aWVzLCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIHJldHVybmVkLCBub3QgdGhlCgkJZnVuY3Rpb24uIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSByZXF1ZXN0ZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUKCQlvYmplY3QgY2Fubm90IGJlIGZvdW5kIG9yIHJlc29sdmVkLgoKCQlUaGlzIG1ldGhvZCBpcyBiYWNrd2FyZHMtY29tcGF0aWJsZSBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwgYW55CgkJZXhpc3RpbmcgX2dldHRlcl8gbWV0aG9kIHRoYXQgdXNlcyB0aGUgZ2V0UHJvcGVydHkgbmFtaW5nIGNvbnZlbnRpb24uCgkJKE1vdmluZyBmb3J3YXJkLCBob3dldmVyLCBFbnlvIGNvZGUgc2hvdWxkIHVzZSBjb21wdXRlZCBwcm9wZXJ0aWVzCgkJaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoZSBnZXR0ZXIgbmFtaW5nIGNvbnZlbnRpb24uKQoJKi8KCWdldDogZnVuY3Rpb24gKHBhdGgpIHsKCQlyZXR1cm4gZW55by5nZXRQYXRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cgl9LAoJLy8qQHB1YmxpYwoJLyoqCgkJU2V0cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSAob3IgcGF0aCkuIFBhc3MgaW4gdGhlIHByb3BlcnR5IChvciBwYXRoKQoJCWFuZCB0aGUgdmFsdWUgdG8gYmUgc2V0LiBJZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHByZXZpb3VzCgkJdmFsdWUsIGFueSBvYnNlcnZlcnMgb2YgdGhlIHByb3BlcnR5IHdpbGwgYmUgYXV0b21hdGljYWxseSBub3RpZmllZCBvZgoJCXRoZSBjaGFuZ2UuCgoJCVRoZSBfZm9yY2VfIHBhcmFtZXRlciBpcyBvcHRpb25hbDsgaWYgdHJ1ZSwgdGhlIHByb3BlcnR5J3MgdmFsdWUgd2lsbCBiZQoJCXVwZGF0ZWQgZXZlbiBpZiB0aGUgcGFzc2VkLWluIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHZhbHVlLAoJCWFuZCBvYnNlcnZlcnMgd2lsbCBiZSBub3RpZmllZCBvZiB0aGUgdXBkYXRlLgoKCQlUaGUgZm9yY2UgcGFyYW1ldGVyIGlzIG9wdGlvbmFsOyBpZiB0cnVlLCB0aGUgdmFsdWUgd2lsbCBiZSB1cGRhdGVkCgkJZXZlbiBpZiBpdCdzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHZhbHVlLCBhbmQgb2JzZXJ2ZXJzIHdpbGwgYmUKCQlub3RpZmllZCBvZiB0aGUgdXBkYXRlLgoKCQlJZiB0aGUgcHJvcGVydHkgaXMgYSBjb21wdXRlZCBwcm9wZXJ0eSwgdGhlIGludGVuZGVkIHZhbHVlIHdpbGwgYmUKCQlwYXNzZWQgdG8gdGhlIGNvbXB1dGVkIHByb3BlcnR5IChidXQgd2lsbCBub3QgYmUgcmV0dXJuZWQpLgoKCQlUaGlzIG1ldGhvZCBpcyBiYWNrd2FyZHMtY29tcGF0aWJsZSBhbmQgd2lsbCBjYWxsIGFueSBzZXR0ZXIgdGhhdCB1c2VzCgkJdGhlIHNldFByb3BlcnR5IG5hbWluZyBjb252ZW50aW9uLiAoTW92aW5nIGZvcndhcmQsIGhvd2V2ZXIsIEVueW8gY29kZQoJCXNob3VsZCB1c2UgY29tcHV0ZWQgcHJvcGVydGllcyBvciBvYnNlcnZlcnMgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoZQoJCXNldHRlciBuYW1pbmcgY29udmVudGlvbi4pCgkqLwoJc2V0OiBmdW5jdGlvbiAocGF0aCwgdmFsdWUsIGZvcmNlKSB7CgkJcmV0dXJuIGVueW8uc2V0UGF0aC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoJfSwKCgkvLypAcHVibGljCgkvKioKCQlCaW5kcyBhIGNhbGxiYWNrIHRvIHRoaXMgb2JqZWN0LiBJZiB0aGUgb2JqZWN0IGhhcyBiZWVuIGRlc3Ryb3llZCwgdGhlCgkJYm91bmQgbWV0aG9kIHdpbGwgYmUgYWJvcnRlZCBjbGVhbmx5IHdpdGggbm8gdmFsdWUgcmV0dXJuZWQuCgoJCVRoaXMgbWV0aG9kIHNob3VsZCBnZW5lcmFsbHkgYmUgdXNlZCBpbnN0ZWFkIG9mIGBlbnlvLmJpbmRgIGZvciBydW5uaW5nCgkJY29kZSBpbiB0aGUgY29udGV4dCBvZiBhbiBpbnN0YW5jZSBvZiBfZW55by5PYmplY3RfIG9yIG9uZSBvZiBpdHMKCQlzdWJraW5kcy4KCSovCgliaW5kU2FmZWx5OiBmdW5jdGlvbihtZXRob2QvKiwgYm91bmQgYXJndW1lbnRzKi8pIHsKCQl2YXIgc2NvcGUgPSB0aGlzOwoJCWlmIChlbnlvLmlzU3RyaW5nKG1ldGhvZCkpIHsKCQkJaWYgKHRoaXNbbWV0aG9kXSkgewoJCQkJbWV0aG9kID0gdGhpc1ttZXRob2RdOwoJCQl9IGVsc2UgewoJCQkJdGhyb3coWydlbnlvLk9iamVjdC5iaW5kU2FmZWx5OiB0aGlzWyInLCBtZXRob2QsICciXSBpcyBudWxsICh0aGlzPSInLCB0aGlzLCAnIiknXS5qb2luKCcnKSk7CgkJCX0KCQl9CgkJaWYgKGVueW8uaXNGdW5jdGlvbihtZXRob2QpKSB7CgkJCXZhciBhcmdzID0gZW55by5jbG9uZUFycmF5KGFyZ3VtZW50cywgMSk7CgkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCWlmIChzY29wZS5kZXN0cm95ZWQpIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQl2YXIgbmFyZ3MgPSBlbnlvLmNsb25lQXJyYXkoYXJndW1lbnRzKTsKCQkJCXJldHVybiBtZXRob2QuYXBwbHkoc2NvcGUsIGFyZ3MuY29uY2F0KG5hcmdzKSk7CgkJCX07CgkJfSBlbHNlIHsKCQkJdGhyb3coWydlbnlvLk9iamVjdC5iaW5kU2FmZWx5OiB0aGlzWyInLCBtZXRob2QsICciXSBpcyBub3QgYSBmdW5jdGlvbiAodGhpcz0iJywgdGhpcywgJyIpJ10uam9pbignJykpOwoJCX0KCX0sCgkvLypAcHJvdGVjdGVkCglkZXN0cm95OiBmdW5jdGlvbiAoKSB7CgkJLy8gU2luY2UgSlMgb2JqZWN0cyBhcmUgbmV2ZXIgdHJ1bHkgZGVzdHJveWVkIChHQydkKSB1bnRpbCBhbGwgcmVmZXJlbmNlcyBhcmUKCQkvLyBnb25lLCB3ZSBtaWdodCBoYXZlIHNvbWUgZGVsYXllZCBhY3Rpb24gb24gdGhpcyBvYmplY3QgdGhhdCBuZWVkcyBhY2Nlc3MKCQkvLyB0byB0aGlzIGZsYWcuCgkJdGhpcy5kZXN0cm95ZWQgPSB0cnVlOwoJfSwKCglfaXNPYmplY3Q6IHRydWUKfSk7CgovLyogQHByb3RlY3RlZAoKZW55by5fb2JqZWN0Q291bnQgPSAwOwoKZW55by5PYmplY3Quc3ViY2xhc3MgPSBmdW5jdGlvbihjdG9yLCBwcm9wcykgewoJdGhpcy5wdWJsaXNoKGN0b3IsIHByb3BzKTsKCXRoaXMub3ZlcmxvYWQoY3RvciwgcHJvcHMpOwp9OwoKZW55by5PYmplY3QucHVibGlzaCA9IGZ1bmN0aW9uKGN0b3IsIHByb3BzKSB7Cgl2YXIgcHAgPSBwcm9wcy5wdWJsaXNoZWQ7CglpZiAocHApIHsKCQl2YXIgY3AgPSBjdG9yLnByb3RvdHlwZTsKCQlmb3IgKHZhciBuIGluIHBwKSB7CgkJCS8vIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgZXZlbiB0aG91Z2ggYSBwcm9wZXJ0eSBpcyAicHVibGlzaGVkIgoJCQkvLyBpdCBkb2VzIG5vdCBvdmVyd3JpdGUgYW55IGNvbXB1dGVkIHByb3BlcnRpZXMKCQkJaWYgKHByb3BzW25dICYmIGVueW8uaXNGdW5jdGlvbihwcm9wc1tuXSkgJiYgcHJvcHNbbl0uaXNQcm9wZXJ0eSkgewoJCQkJY29udGludWU7CgkJCX0KCQkJZW55by5PYmplY3QuYWRkR2V0dGVyU2V0dGVyKG4sIHBwW25dLCBjcCk7CgkJfQoJfQp9OwoKLy8qQHByb3RlY3RlZAovKioKCVdlIG5lZWQgdG8gZmluZCBzcGVjaWFsIGNhc2VzIGFuZCBlbnN1cmUgdGhhdCB0aGUgb3ZlcmxvYWRlZAoJZ2V0dGVyIG9mIGEgcHVibGlzaGVkIHByb3BlcnR5IG9mIGEgcGFyZW50IGtpbmQgaXMgZmxhZ2dlZCBmb3IKCXRoZSBnbG9iYWwgZ2V0dGVyIGFuZCBzZXR0ZXIuCiovCmVueW8uT2JqZWN0Lm92ZXJsb2FkID0gZnVuY3Rpb24gKGN0b3IsIHByb3BzKSB7Cgl2YXIgcHJvdG8gPSBjdG9yLnByb3RvdHlwZS5iYXNlPyBjdG9yLnByb3RvdHlwZS5iYXNlLnByb3RvdHlwZToge307Cgl2YXIgcmVnZXggPSAvXihnZXR8c2V0KS4qLzsKCXZhciBuYW1lOwoJdmFyIHByb3A7Cglmb3IgKG5hbWUgaW4gcHJvcHMpIHsKCQlpZiAoIXJlZ2V4LnRlc3QobmFtZSkpIHsKCQkJY29udGludWU7CgkJfQoJCXByb3AgPSBwcm9wc1tuYW1lXTsKCQlpZiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHByb3ApIHsKCQkJaWYgKHByb3RvW25hbWVdKSB7CgkJCQlwcm9wLm92ZXJsb2FkZWQgPSB0cnVlOwoJCQl9CgkJfQoJfQp9OwoKLy8qQHByb3RlY3RlZAovKioKCVRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBnZXR0ZXIvc2V0dGVyIGZvciBhIHB1Ymxpc2hlZCBwcm9wZXJ0eSBvZgoJYW4gX2VueW8uT2JqZWN0XywgYnV0IGlzIGRlcHJlY2F0ZWQuIEl0IGlzIG1haW50YWluZWQgZm9yIHB1cnBvc2VzCglvZiBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4gVGhlIHByZWZlcnJlZCBtZXRob2QgaXMgdG8gbWFyayBwdWJsaWMKCWFuZCBwcm90ZWN0ZWQgKHByaXZhdGUpIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdXNpbmcgZG9jdW1lbnRhdGlvbiBvcgoJb3RoZXIgbWVhbnMgYW5kIHJlbHkgb24gdGhlIF9nZXRfIGFuZCBfc2V0XyBtZXRob2RzIG9mIF9lbnlvLk9iamVjdF8KCWluc3RhbmNlcy4KKi8KZW55by5PYmplY3QuYWRkR2V0dGVyU2V0dGVyID0gZnVuY3Rpb24gKHByb3BlcnR5LCB2YWx1ZSwgcHJvdG8pIHsKCXZhciBnZXR0ZXIgPSAiZ2V0IiArIGVueW8uY2FwKHByb3BlcnR5KTsKCXZhciBzZXR0ZXIgPSAic2V0IiArIGVueW8uY2FwKHByb3BlcnR5KTsKCXZhciBmbjsKCS8vIHNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIHByb3RvdHlwZQoJcHJvdG9bcHJvcGVydHldID0gdmFsdWU7CglmbiA9IHByb3RvW2dldHRlcl07CgkvLyBpZiB0aGVyZSBpc24ndCBhbHJlYWR5IGEgZ2V0dGVyIHByb3ZpZGVkIGNyZWF0ZSBvbmUKCWlmICgiZnVuY3Rpb24iICE9PSB0eXBlb2YgZm4pIHsKCQlmbiA9IHByb3RvW2dldHRlcl0gPSBmdW5jdGlvbiAoKSB7cmV0dXJuIHRoaXMuZ2V0KHByb3BlcnR5KTt9OwoJCWZuLm92ZXJsb2FkZWQgPSBmYWxzZTsKCX0gZWxzZSBpZiAoZmFsc2UgIT09IGZuLm92ZXJsb2FkZWQpIHsKCQkvLyBvdGhlcndpc2Ugd2UgbmVlZCB0byBtYXJrIGl0IGFzIGhhdmluZyBiZWVuIG92ZXJsb2FkZWQKCQkvLyBzbyB0aGUgZ2xvYmFsIGdldHRlciBrbm93cyBub3QgdG8gaWdub3JlIGl0CgkJZm4ub3ZlcmxvYWRlZCA9IHRydWU7Cgl9CgkvLyBpZiB0aGVyZSBpc24ndCBhbHJlYWR5IGEgc2V0dGVyIHByb3ZpZGVkLCBjcmVhdGUgb25lCglmbiA9IHByb3RvW3NldHRlcl07CglpZiAoImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGZuKSB7CgkJZm4gPSBwcm90b1tzZXR0ZXJdID0gZnVuY3Rpb24gKCkge3JldHVybiB0aGlzLnNldChwcm9wZXJ0eSwgYXJndW1lbnRzWzBdKTt9OwoJCWZuLm92ZXJsb2FkZWQgPSBmYWxzZTsKCX0gZWxzZSBpZiAoZmFsc2UgIT09IGZuLm92ZXJsb2FkZWQpIHsKCQkvLyBvdGhlcndpc2Ugd2UgbmVlZCB0byBtYXJrIGl0IGFzIGhhdmluZyBiZWVuIG92ZXJsb2FkZWQKCQkvLyBzbyB0aGUgZ2xvYmFsIHNldHRlciBrbm93cyBub3QgdG8gaWdub3JlIGl0CgkJZm4ub3ZlcmxvYWRlZCA9IHRydWU7Cgl9Cn07Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/Oop.js"
Content-Type: application/octet-stream; x-encoding=base64
77u/Ly8qQHByb3RlY3RlZAovKioKCURlZmF1bHQgcHJvcGVydGllcyBvZiBlbnlvIGtpbmRzIHRvIGNvbmNhdGVuYXRlIGFzIG9wcG9zZWQgdG8KCW92ZXJ3cml0aW5nLiBUaGVzZSBhcmUgYXV0b21hdGljYWxseSB1c2VkIHVubGVzcyBleHBsaWNpdGx5CglyZW1vdmVkLgoqLwplbnlvLmNvbmNhdCA9IFsiY29uY2F0Il07CgovLypAcHJvdGVjdGVkCi8qKgoJSXMgY2FsbGVkIGR1cmluZyBraW5kLWluaXRpYWxpemF0aW9uIHRvIG1ha2Ugc3VyZSB0aGF0IGFueSBwcm9wZXJ0eQoJbm90ZWQgdG8gYmUgY29uY2F0ZW5hdGVkIHdpbGwgYmUgKG11c3QgYmUgYW4gYXJyYXkpIHNvIHRoYXQgdGhvc2UgdmFsdWVzCgl3aWxsIG5vdCBiZSBsb3N0IGJ5IHN1YmNsYXNzZXMgb3ZlcnJpZGluZyB0aGF0IHByb3BlcnR5LgoqLwplbnlvLmhhbmRsZUNvbmNhdGVuYXRlZFByb3BlcnRpZXMgPSBmdW5jdGlvbiAoY3RvciwgcHJvdG8pIHsKCXZhciBwcm9wZXJ0aWVzID0gZW55by5tZXJnZShjdG9yLmNvbmNhdCB8fCBbXSwgcHJvdG8uY29uY2F0IHx8IFtdKTsKCXZhciBwcm9wOwoJdmFyIHJpZ2h0OwoJdmFyIGxlZnQ7Cgl3aGlsZSAocHJvcGVydGllcy5sZW5ndGgpIHsKCQlwcm9wID0gcHJvcGVydGllcy5zaGlmdCgpOwoJCWxlZnQgPSBjdG9yW3Byb3BdOwoJCXJpZ2h0ID0gcHJvdG9bcHJvcF07CgkJaWYgKChsZWZ0IGluc3RhbmNlb2YgQXJyYXkpICYmIChyaWdodCBpbnN0YW5jZW9mIEFycmF5KSkgewoJCQljdG9yW3Byb3BdID0gZW55by5tZXJnZShsZWZ0LCByaWdodCk7CgkJCS8vIHJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSBzbyBpdCB3aWxsIG5vdAoJCQkvLyBjb25mbGljdCBsYXRlcgoJCQlkZWxldGUgcHJvdG9bcHJvcF07CgkJfQoJfQp9OwoKLy8qIEBwdWJsaWMKLyoqCglDcmVhdGVzIGEgSmF2YVNjcmlwdCBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aXRoIGEgcHJvdG90eXBlIGRlZmluZWQgYnkKCV9pblByb3BzXy4gX19BbGwgY29uc3RydWN0b3JzIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lX18uCgoJX2VueW8ua2luZF8gbWFrZXMgaXQgZWFzeSB0byBidWlsZCBhIGNvbnN0cnVjdG9yLXdpdGgtcHJvdG90eXBlIChsaWtlIGEKCWNsYXNzKSB0aGF0IGhhcyBhZHZhbmNlZCBmZWF0dXJlcyBsaWtlIHByb3RvdHlwZS1jaGFpbmluZyAoaW5oZXJpdGFuY2UpLgoKCUEgcGx1Zy1pbiBzeXN0ZW0gaXMgaW5jbHVkZWQgZm9yIGV4dGVuZGluZyB0aGUgYWJpbGl0aWVzIG9mIHRoZSBraW5kCglnZW5lcmF0b3IsIGFuZCBjb25zdHJ1Y3RvcnMgYXJlIGFsbG93ZWQgdG8gcGVyZm9ybSBjdXN0b20gb3BlcmF0aW9ucyB3aGVuCglzdWJjbGFzc2VkLgoKCUlmIHlvdSBtYWtlIGNoYW5nZXMgdG8gX2VueW8ua2luZF8sIGJlIHN1cmUgdG8gYWRkIG9yIHVwZGF0ZSB0aGUgYXBwcm9wcmlhdGUKCVt1bml0IHRlc3RzXShodHRwczovL2dpdGh1Yi5jb20vZW55b2pzL2VueW8vdHJlZS9tYXN0ZXIvdG9vbHMvdGVzdC9jb3JlL3Rlc3RzKS4KCglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uCglbQ3JlYXRpbmcgS2luZHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvanMvZW55by93aWtpL0NyZWF0aW5nLUtpbmRzKQoJaW4gdGhlIEVueW8gRGV2ZWxvcGVyIEd1aWRlLgoqLwplbnlvLmtpbmQgPSBmdW5jdGlvbihpblByb3BzKSB7Cgl2YXIgbmFtZSA9IGluUHJvcHMubmFtZSB8fCAiIjsKCS8vIGNhbm5vdCBkZWZlciB1bm5hbWVkIGtpbmRzLCBraW5kcyB3aXRoIHN0YXRpYyBzZWN0aW9ucywgb3Igb25lcyB3aXRoCgkvLyBub0RlZmVyIGZsYWcgc2V0CglpZiAobmFtZSAmJiAhaW5Qcm9wcy5ub0RlZmVyICYmICFpblByb3BzLnN0YXRpY3MpIHsKCQkvLyBtYWtlIGEgZGVmZXJyZWQgY29uc3RydWN0b3IgdG8gYXZvaWQgYSBsb3Qgb2Yga2luZAoJCS8vIHByb2Nlc3NpbmcgaWYgd2UncmUgbmV2ZXIgdXNlZAoJCXZhciBjdG9yID0gZnVuY3Rpb24gRGVmZXJyZWRDdG9yKCkgewoJCQl2YXIgRmluYWxDdG9yOwoJCQkvLyBjaGVjayBmb3IgY2FjaGVkIGZpbmFsIGNvbnN0cnVjdG9yIGZpcnN0LCB1c2VkIG1haW5seSB3aGVuCgkJCS8vIGRldmVsb3BlcnMgZGlyZWN0bHkgdXNlIGtpbmQgbmFtZXMgaW4gdGhlaXIgY29tcG9uZW50cyBpbnN0ZWFkIG9mCgkJCS8vIHN0cmluZ3MgdGhhdCBhcmUgcmVzb2x2ZWQgYXQgcnVudGltZS4KCQkJaWYgKERlZmVycmVkQ3Rvci5fRmluYWxDdG9yKSB7CgkJCQlGaW5hbEN0b3IgPSBEZWZlcnJlZEN0b3IuX0ZpbmFsQ3RvcjsKCQkJfSBlbHNlIHsKCQkJCWlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZlcnJlZEN0b3IpKSB7CgkJCQkJdGhyb3cgImVueW8ua2luZDogY29uc3RydWN0b3IgY2FsbGVkIGRpcmVjdGx5LCBub3QgdXNpbmcgJ25ldyciOwoJCQkJfQoJCQkJRmluYWxDdG9yID0gRGVmZXJyZWRDdG9yLl9maW5pc2hLaW5kQ3JlYXRpb24oKTsKCQkJfQoJCQl2YXIgb2JqID0gZW55by5kZWxlZ2F0ZShGaW5hbEN0b3IucHJvdG90eXBlKTsKCQkJRmluYWxDdG9yLmFwcGx5KG9iaiwgYXJndW1lbnRzKTsKCQkJcmV0dXJuIG9iajsKCQl9OwoJCWN0b3IuX2ZpbmlzaEtpbmRDcmVhdGlvbiA9IGZ1bmN0aW9uKCkgewoJCQljdG9yLl9maW5pc2hLaW5kQ3JlYXRpb24gPSB1bmRlZmluZWQ7CgkJCWVueW8uc2V0UGF0aChuYW1lLCB1bmRlZmluZWQpOwoJCQl2YXIgRmluYWxDdG9yID0gZW55by5raW5kLmZpbmlzaChpblByb3BzKTsKCQkJY3Rvci5fRmluYWxDdG9yID0gRmluYWxDdG9yOwoJCQlpblByb3BzID0gbnVsbDsKCQkJcmV0dXJuIEZpbmFsQ3RvcjsKCQl9OwoJCWlmICgobmFtZSAmJiAhZW55by5nZXRQYXRoKG5hbWUpKSB8fCBlbnlvLmtpbmQuYWxsb3dPdmVycmlkZSkgewoJCQllbnlvLnNldFBhdGgobmFtZSwgY3Rvcik7CgkJfQoJCWVsc2UgaWYgKG5hbWUpIHsKCQkJZW55by5lcnJvcigiZW55by5raW5kOiAiICsgbmFtZSArICIgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciAiICsKCQkJCSJraW5kLCBhbGwga2luZCBkZWZpbml0aW9ucyBtdXN0IGhhdmUgdW5pcXVlIG5hbWVzLiIpOwoJCX0KCQlyZXR1cm4gY3RvcjsKCX0gZWxzZSB7CgkJLy8gY3JlYXRlIGFub255bW91cyBraW5kcyBpbW1lZGlhdGVseQoJCXJldHVybiBlbnlvLmtpbmQuZmluaXNoKGluUHJvcHMpOwoJfQp9OwovLyogQHByb3RlY3RlZAplbnlvLmtpbmQuZmluaXNoID0gZnVuY3Rpb24oaW5Qcm9wcykgewoJLy8ga2luZC1uYW1lIHRvIGNvbnN0cnVjdG9yIG1hcCBjb3VsZCBiZSBmYXVsdHkgbm93IHRoYXQgYSBuZXcga2luZCBleGlzdHMsIHNvIHdlIHNpbXBseSBkZXN0cm95IHRoZSBtZW1vaXphdGlvbnMKCWVueW8uX2tpbmRDdG9ycyA9IHt9OwoJLy8gZXh0cmFjdCAnbmFtZScgcHJvcGVydHkKCXZhciBuYW1lID0gaW5Qcm9wcy5uYW1lIHx8ICIiOwoJZGVsZXRlIGluUHJvcHMubmFtZTsKCS8vIGV4dHJhY3QgJ2tpbmQnIHByb3BlcnR5Cgl2YXIgaGFzS2luZCA9ICgia2luZCIgaW4gaW5Qcm9wcyk7Cgl2YXIga2luZCA9IGluUHJvcHMua2luZDsKCWRlbGV0ZSBpblByb3BzLmtpbmQ7CgkvLyBlc3RhYmxpc2ggYmFzZSBjbGFzcyByZWZlcmVuY2UKCXZhciBiYXNlID0gZW55by5jb25zdHJ1Y3RvckZvcktpbmQoa2luZCk7Cgl2YXIgaXNhID0gYmFzZSAmJiBiYXNlLnByb3RvdHlwZSB8fCBudWxsOwoJLy8gaWYgd2UgaGF2ZSBhbiBleHBsaWNpdCBraW5kIHByb3BlcnR5IHdpdGggdmFsdWUgdW5kZWZpbmVkLCB3ZSBwcm9iYWJseQoJLy8gdHJpZWQgdG8gcmVmZXJlbmNlICBhIGtpbmQgdGhhdCBpcyBub3QgeWV0IGluIHNjb3BlCglpZiAoaGFzS2luZCAmJiBraW5kID09PSB1bmRlZmluZWQgfHwgYmFzZSA9PT0gdW5kZWZpbmVkKSB7CgkJdmFyIHByb2JsZW0gPSBraW5kID09PSB1bmRlZmluZWQgPyAndW5kZWZpbmVkIGtpbmQnIDogJ3Vua25vd24ga2luZCAoJyArIGtpbmQgKyAnKSc7CgkJdGhyb3cgImVueW8ua2luZDogQXR0ZW1wdCB0byBzdWJjbGFzcyBhbiAiICsgcHJvYmxlbSArICIuIENoZWNrIGRlcGVuZGVuY2llcyBmb3IgWyIgKyAobmFtZSB8fCAiPHVubmFtZWQ+IikgKyAiXS4iOwoJfQoJLy8gbWFrZSBhIGJvaWxlcnBsYXRlIGNvbnN0cnVjdG9yCgl2YXIgY3RvciA9IGVueW8ua2luZC5tYWtlQ3RvcigpOwoJLy8gc2VtaS1yZXNlcnZlZCB3b3JkICdjb25zdHJ1Y3RvcicgY2F1c2VzIHByb2JsZW1zIHdpdGggUHJvdG90eXBlIGFuZCBJRSwgc28gd2UgcmVuYW1lIGl0IGhlcmUKCWlmIChpblByb3BzLmhhc093blByb3BlcnR5KCJjb25zdHJ1Y3RvciIpKSB7CgkJaW5Qcm9wcy5fY29uc3RydWN0b3IgPSBpblByb3BzLmNvbnN0cnVjdG9yOwoJCWRlbGV0ZSBpblByb3BzLmNvbnN0cnVjdG9yOwoJfQoJLy8gY3JlYXRlIG91ciBwcm90b3R5cGUKCS8vY3Rvci5wcm90b3R5cGUgPSBpc2EgPyBlbnlvLmRlbGVnYXRlKGlzYSkgOiB7fTsKCWVueW8uc2V0UHJvdG90eXBlKGN0b3IsIGlzYSA/IGVueW8uZGVsZWdhdGUoaXNhKSA6IHt9KTsKCgkvLyB0aGVyZSBhcmUgc3BlY2lhbCBjYXNlcyB3aGVyZSBhIGJhc2UgY2xhc3MgaGFzIGEgcHJvcGVydHkKCS8vIHRoYXQgbWF5IG5lZWQgdG8gYmUgY29uY2F0ZW5hdGVkIHdpdGggYSBzdWJjbGFzc2VzIGltcGxlbWVudGF0aW9uCgkvLyBhcyBvcHBvc2VkIHRvIGNvbXBsZXRlbHkgb3ZlcndyaXRpbmcgaXQuLi4KCWVueW8uaGFuZGxlQ29uY2F0ZW5hdGVkUHJvcGVydGllcyhjdG9yLnByb3RvdHlwZSwgaW5Qcm9wcyk7CgoJLy8gcHV0IGluIG91ciBwcm9wcwoJZW55by5taXhpbihjdG9yLnByb3RvdHlwZSwgaW5Qcm9wcyk7CgkvLyBhbGlhcyBjbGFzcyBuYW1lIGFzICdraW5kJyBpbiB0aGUgcHJvdG90eXBlCgkvLyBidXQgd2UgYWN0dWFsbHkgb25seSBuZWVkIHRvIHNldCB0aGlzIGlmIGEgbmV3IG5hbWUgd2FzIHVzZWQKCS8vIG5vdCBpZiBpdCBpcyBpbmhlcml0aW5nIGZyb20gYSBraW5kIGFub255bW91c2x5CglpZiAobmFtZSkgewoJCWN0b3IucHJvdG90eXBlLmtpbmROYW1lID0gbmFtZTsKCX0KCS8vIHRoaXMgaXMgZm9yIGFub255bW91cyBjb25zdHJ1Y3RvcnMKCWVsc2UgewoJCWN0b3IucHJvdG90eXBlLmtpbmROYW1lID0gYmFzZSAmJiBiYXNlLnByb3RvdHlwZT8gYmFzZS5wcm90b3R5cGUua2luZE5hbWU6ICIiOwoJfQoJLy8gY2FjaGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcgoJY3Rvci5wcm90b3R5cGUuYmFzZSA9IGJhc2U7CgkvLyByZWZlcmVuY2Ugb3VyIHJlYWwgY29uc3RydWN0b3IKCWN0b3IucHJvdG90eXBlLmN0b3IgPSBjdG9yOwoJLy8gc3VwcG9ydCBwbHVnZ2FibGUgJ2ZlYXR1cmVzJwoJZW55by5mb3JFYWNoKGVueW8ua2luZC5mZWF0dXJlcywgZnVuY3Rpb24oZm4peyBmbihjdG9yLCBpblByb3BzKTsgfSk7CgkvLyBwdXQgcmVmZXJlbmNlIGludG8gbmFtZXNwYWNlCglpZiAoKG5hbWUgJiYgIWVueW8uZ2V0UGF0aChuYW1lKSkgfHwgZW55by5raW5kLmFsbG93T3ZlcnJpZGUpIHsKCQllbnlvLnNldFBhdGgobmFtZSwgY3Rvcik7Cgl9CgllbHNlIGlmIChuYW1lKSB7CgkJZW55by5lcnJvcigiZW55by5raW5kOiAiICsgbmFtZSArICIgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciAiICsKCQkJImtpbmQsIGFsbCBraW5kIGRlZmluaXRpb25zIG11c3QgaGF2ZSB1bmlxdWUgbmFtZXMuIik7Cgl9CglyZXR1cm4gY3RvcjsKfTsKCi8vKiBAcHVibGljCi8qKgoJQ3JlYXRlcyBhIFNpbmdsZXRvbiBvZiBhIGdpdmVuIGtpbmQgd2l0aCBhIGdpdmVuIGRlZmluaXRpb24uCglfX1RoZSBuYW1lIHByb3BlcnR5IHdpbGwgYmUgdGhlIGluc3RhbmNlIG5hbWUgb2YgdGhlIHNpbmdsZXRvbgoJYW5kIG11c3QgYmUgdW5pcXVlX18uCgoJCWVueW8uc2luZ2xldG9uKHsKCQkJa2luZDogImVueW8uQ29udHJvbCIsCgkJCW5hbWU6ICJhcHAuTXlTaW5nbGV0b24iLAoJCQlwdWJsaXNoZWQ6IHsKCQkJCXZhbHVlOiAiZm9vIgoJCQl9LAoJCQltYWtlU29tZXRoaW5nOiBmdW5jdGlvbigpIHsKCQkJCS8vLi4uCgkJCX0KCQl9KTsKCgkJYXBwLk15U2luZ2xldG9uLm1ha2VTb21ldGhpbmcoKTsKCQlhcHAuTXlTaW5nbGV0b24uc2V0VmFsdWUoImJhciIpOwoqLwplbnlvLnNpbmdsZXRvbiA9IGZ1bmN0aW9uKGNvbmYsIGNvbnRleHQpIHsKCS8vIGV4dHJhY3QgJ25hbWUnIHByb3BlcnR5ICh0aGUgbmFtZSBvZiBvdXIgc2luZ2xldG9uKQoJdmFyIG5hbWUgPSBjb25mLm5hbWU7CglkZWxldGUoY29uZi5uYW1lKTsKCS8vIGNyZWF0ZSBhbiB1bm5hbWVkIGtpbmQgYW5kIHNhdmUgaXRzIGNvbnN0cnVjdG9yJ3MgZnVuY3Rpb24KCXZhciBLaW5kID0gZW55by5raW5kKGNvbmYpOwoJdmFyIGluc3Q7CgkvLyBjcmVhdGUgdGhlIHNpbmdsZXRvbiB3aXRoIHRoZSBwcmV2aW91cyBuYW1lIGFuZCBjb25zdHJ1Y3RvcgoJZW55by5zZXRQYXRoLmNhbGwoY29udGV4dCB8fCBlbnlvLmdsb2JhbCwgbmFtZSwgKGluc3QgPSBuZXcgS2luZCgpKSk7CglyZXR1cm4gaW5zdDsKfTsKCi8vKiBAcHJvdGVjdGVkCmVueW8ua2luZC5tYWtlQ3RvciA9IGZ1bmN0aW9uKCkgewoJcmV0dXJuIGZ1bmN0aW9uIGN0b3IoKSB7CgkJaWYgKCEodGhpcyBpbnN0YW5jZW9mIGN0b3IpKSB7CgkJCXRocm93ICJlbnlvLmtpbmQ6IGNvbnN0cnVjdG9yIGNhbGxlZCBkaXJlY3RseSwgbm90IHVzaW5nICduZXcnIjsKCQl9CgoJCS8vIHR3by1wYXNzIGluc3RhbnRpYXRpb24KCQl2YXIgcmVzdWx0OwoJCXZhciBjYXJncyA9IGFyZ3VtZW50czsKCQlpZiAodGhpcy5fY29uc3RydWN0b3IpIHsKCQkJLy8gcHVyZSBjb25zdHJ1Y3Rpb24KCQkJcmVzdWx0ID0gdGhpcy5fY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCQl9CgkJLy8gZGVmZXIgaW5pdGlhbGl6YXRpb24gdW50aWwgZW50aXJlIGNvbnN0cnVjdG9yIGNoYWluIGhhcyBmaW5pc2hlZAoJCWlmICh0aGlzLmNvbnN0cnVjdGVkKSB7CgkJCS8vIHBvc3QtY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24KCQkJdGhpcy5jb25zdHJ1Y3RlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoJCX0KCgkJZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgZW55by5raW5kLnBvc3RDb25zdHJ1Y3RvcnMubGVuZ3RoOyArK2lkeCkgewoJCQllbnlvLmtpbmQucG9zdENvbnN0cnVjdG9yc1tpZHhdLmFwcGx5KHRoaXMsIGNhcmdzKTsKCQl9CgoJCWlmIChyZXN1bHQpIHsKCQkJcmV0dXJuIHJlc3VsdDsKCQl9Cgl9Owp9OwoKLy8gY2xhc3NlcyByZWZlcmVuY2VkIGJ5IG5hbWUgY2FuIG9taXQgdGhpcyBuYW1lc3BhY2UgKGUuZy4gIkJ1dHRvbiIgaW5zdGVhZCBvZiAiZW55by5CdXR0b24iKQplbnlvLmtpbmQuZGVmYXVsdE5hbWVzcGFjZSA9ICJlbnlvIjsKCi8vCi8vIGZlYXR1cmUgaG9va3MgZm9yIHRoZSBvb3Agc3lzdGVtCi8vCmVueW8ua2luZC5mZWF0dXJlcyA9IFtdOwoKCi8vKkBwcm90ZWN0ZWQKLyoqCglQb3N0LWluaXRpYWxpemUgZnVuY3Rpb25zIChhZnRlciBjb25zdHJ1Y3RvciBoYXMgY29tcGxldGVkKS4KKi8KZW55by5raW5kLnBvc3RDb25zdHJ1Y3RvcnMgPSBbXTsKCi8vCi8vICdpbmhlcml0ZWQnIGZlYXR1cmUKLy8KZW55by5raW5kLmZlYXR1cmVzLnB1c2goZnVuY3Rpb24oY3RvciwgcHJvcHMpIHsKCXZhciBwcm90byA9IGN0b3IucHJvdG90eXBlOwoJaWYgKCFwcm90by5pbmhlcml0ZWQpIHsKCQlwcm90by5pbmhlcml0ZWQgPSBlbnlvLmtpbmQuaW5oZXJpdGVkOwoJfQoJaWYgKHByb3RvLmJhc2UpIHsKCQkvLyBkZWNvcmF0ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzIHRvIHN1cHBvcnQgaW5oZXJpdGVkIChkbyB0aGlzIGV4IHBvc3QgZmFjdG8gc28gdGhhdAoJCS8vIGN0b3IucHJvdG90eXBlIGlzIGtub3duLCByZWxpZXMgb24gZWxlbWVudHMgaW4gcHJvcHMgYmVpbmcgY29waWVkIGJ5IHJlZmVyZW5jZSkKCQlmb3IgKHZhciBuIGluIHByb3BzKSB7CgkJCXZhciBwID0gcHJvcHNbbl07CgkJCWlmIChlbnlvLmlzRnVuY3Rpb24ocCkpIHsKCQkJCXAuX2luaGVyaXRlZCA9IHByb3RvLmJhc2UucHJvdG90eXBlW25dOwoJCQkJLy8gRklYTUU6IHdlIHVzZWQgdG8gbmVlZCBzb21lIGV4dHJhIHZhbHVlcyBmb3IgaW5oZXJpdGVkLCB0aGVuIGluaGVyaXRlZCBnb3QgY2xlYW5lcgoJCQkJLy8gYnV0IGluIHRoZSBtZWFudGltZSB3ZSB1c2VkIHRoZXNlIHZhbHVlcyB0byBzdXBwb3J0IGxvZ2dpbmcgaW4gT2JqZWN0LgoJCQkJLy8gRm9yIG5vdyB3ZSBzdXBwb3J0IHRoaXMgbGVnYWN5IHNpdHVhdGlvbiwgYnkgc3VwcGxpbmcgbG9nZ2luZyBpbmZvcm1hdGlvbiBoZXJlLgoJCQkJcC5ub20gPSBwcm90by5raW5kTmFtZSArICcuJyArIG4gKyAnKCknOwoJCQl9CgkJfQoJfQp9KTsKCi8vKkBwcm90ZWN0ZWQKLyoqCglUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZW55by5PYmplY3QncyBhdHRlbXB0aW5nIHRvCglhY2Nlc3Mgc3VwZXItbWV0aG9kcyBvZiBhIHBhcmVudCBjbGFzcyAoa2luZCkgYnkgY2FsbGluZwoJX3RoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cylfIGZyb20gd2l0aGluIGEga2luZCBtZXRob2QuIFRoaXMKCWNhbiBvbmx5IGJlIGRvbmUgc2FmZWx5IHdoZW4gdGhlcmUgaXMga25vd24gdG8gYmUgYSBzdXBlcgoJY2xhc3Mgd2l0aCB0aGUgc2FtZSBtZXRob2QuCiovCmVueW8ua2luZC5pbmhlcml0ZWQgPSBmdW5jdGlvbiAob3JpZ2luYWxzLCByZXBsYWNlbWVudHMpIHsKCS8vIG9uZS1vZmYgbWV0aG9kcyBhcmUgdGhlIGZhc3QgdHJhY2sKCXZhciB0YXJnZXQgPSBvcmlnaW5hbHMuY2FsbGVlOwoJdmFyIGZuID0gdGFyZ2V0Ll9pbmhlcml0ZWQ7CgoJLy8gcmVnYXJkbGVzcyBvZiBob3cgd2UgZ290IGhlcmUsIGp1c3QgZW5zdXJlIHdlIGFjdHVhbGx5CgkvLyBoYXZlIGEgZnVuY3Rpb24gdG8gY2FsbCBvciBlbHNlIHdlIHRocm93IGEgY29uc29sZQoJLy8gd2FybmluZyB0byBub3RpZnkgZGV2ZWxvcGVycyB0aGV5IGFyZSBjYWxsaW5nIGEKCS8vIHN1cGVyIG1ldGhvZCB0aGF0IGRvZXNuJ3QgZXhpc3QKCWlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgZm4pIHsKCQlyZXR1cm4gZm4uYXBwbHkodGhpcywgcmVwbGFjZW1lbnRzPyBlbnlvLm1peGluKG9yaWdpbmFscywgcmVwbGFjZW1lbnRzKTogb3JpZ2luYWxzKTsKCX0gZWxzZSB7CgkJZW55by53YXJuKCJlbnlvLmtpbmQuaW5oZXJpdGVkOiB1bmFibGUgdG8gZmluZCByZXF1ZXN0ZWQgIiArCgkJCSJzdXBlci1tZXRob2QgZnJvbSAtPiAiICsgb3JpZ2luYWxzLmNhbGxlZS5ub20gKyAiIGluICIgKyB0aGlzLmtpbmROYW1lKTsKCX0KfTsKCi8vCi8vICdzdGF0aWNzJyBmZWF0dXJlCi8vCmVueW8ua2luZC5mZWF0dXJlcy5wdXNoKGZ1bmN0aW9uKGN0b3IsIHByb3BzKSB7CgkvLyBpbnN0YWxsIGNvbW1vbiBzdGF0aWNzCglpZiAoIWN0b3Iuc3ViY2xhc3MpIHsKCQljdG9yLnN1YmNsYXNzID0gZW55by5raW5kLnN0YXRpY3Muc3ViY2xhc3M7Cgl9CglpZiAoIWN0b3IuZXh0ZW5kKSB7CgkJY3Rvci5leHRlbmQgPSBlbnlvLmtpbmQuc3RhdGljcy5leHRlbmQ7Cgl9CgkvLyBtb3ZlIHByb3BzIHN0YXRpY3MgdG8gY29uc3RydWN0b3IKCWlmIChwcm9wcy5zdGF0aWNzKSB7CgkJZW55by5taXhpbihjdG9yLCBwcm9wcy5zdGF0aWNzKTsKCQlkZWxldGUgY3Rvci5wcm90b3R5cGUuc3RhdGljczsKCX0KCS8vIGFsc28gc3VwcG9ydCBwcm90ZWN0ZWRTdGF0aWNzIHdoaWNoIHdvbid0IGludGVyZmVyZSB3aXRoIGRlZmVyCglpZiAocHJvcHMucHJvdGVjdGVkU3RhdGljcykgewoJCWVueW8ubWl4aW4oY3RvciwgcHJvcHMucHJvdGVjdGVkU3RhdGljcyk7CgkJZGVsZXRlIGN0b3IucHJvdG90eXBlLnByb3RlY3RlZFN0YXRpY3M7Cgl9CgkvLyBhbGxvdyBzdXBlcmNsYXNzIGN1c3RvbWl6YXRpb24KCXZhciBiYXNlID0gY3Rvci5wcm90b3R5cGUuYmFzZTsKCXdoaWxlIChiYXNlKSB7CgkJYmFzZS5zdWJjbGFzcyhjdG9yLCBwcm9wcyk7CgkJYmFzZSA9IGJhc2UucHJvdG90eXBlLmJhc2U7Cgl9Cn0pOwoKZW55by5raW5kLnN0YXRpY3MgPSB7CglzdWJjbGFzczogZnVuY3Rpb24oY3RvciwgcHJvcHMpIHsKCQkvL2VueW8ubG9nKCJzdWJjbGFzc2luZyBbIiArIGN0b3IucHJvdG90eXBlLmtpbmQgKyAiXSBmcm9tIFsiLCB0aGlzLnByb3RvdHlwZS5raW5kICsgIl0iKTsKCX0sCglleHRlbmQ6IGZ1bmN0aW9uKHByb3BzKSB7CgkJLy8gbWFrZSBzdXJlIHRvIGFsbG93IGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVzIHRvIGZ1bmN0aW9uCgkJLy8gYXMgZXhwZWN0ZWQKCQllbnlvLmhhbmRsZUNvbmNhdGVuYXRlZFByb3BlcnRpZXModGhpcy5wcm90b3R5cGUsIHByb3BzKTsKCQllbnlvLm1peGluKHRoaXMucHJvdG90eXBlLCBwcm9wcyk7CgkJLy8gc3VwcG9ydCBwbHVnZ2FibGUgJ2ZlYXR1cmVzJwoJCXZhciBjdG9yID0gdGhpczsKCQllbnlvLmZvckVhY2goZW55by5raW5kLmZlYXR1cmVzLCBmdW5jdGlvbihmbil7IGZuKGN0b3IsIHByb3BzKTsgfSk7Cgl9Cn07CgplbnlvLmNoZWNrQ29uc3RydWN0b3IgPSBmdW5jdGlvbihpbktpbmQpIHsKCWlmIChlbnlvLmlzRnVuY3Rpb24oaW5LaW5kKSkgewoJCS8vIGlmIGEgZGVmZXJyZWQgZW55byBraW5kLCBmaW5pc2ggdGhhdCB3b3JrIGZpcnN0CgkJaWYgKGluS2luZC5fRmluYWxDdG9yKSB7CgkJCXJldHVybiBpbktpbmQuX0ZpbmFsQ3RvcjsKCQl9CgkJaWYgKGluS2luZC5fZmluaXNoS2luZENyZWF0aW9uKSB7CgkJCXJldHVybiBpbktpbmQuX2ZpbmlzaEtpbmRDcmVhdGlvbigpOwoJCX0KCX0KCXJldHVybiBpbktpbmQ7Cn07CgovLwovLyBmYWN0b3J5IGZvciBraW5kcyBpZGVudGlmaWVkIGJ5IHN0cmluZ3MKLy8KZW55by5fa2luZEN0b3JzID0ge307CgplbnlvLmNvbnN0cnVjdG9yRm9yS2luZCA9IGZ1bmN0aW9uKGluS2luZCkgewoJaWYgKGluS2luZCA9PT0gbnVsbCkgewoJCXJldHVybiBpbktpbmQ7Cgl9IGVsc2UgaWYgKGluS2luZCA9PT0gdW5kZWZpbmVkKSB7CgkJcmV0dXJuIGVueW8uZGVmYXVsdEN0b3I7Cgl9CgllbHNlIGlmIChlbnlvLmlzRnVuY3Rpb24oaW5LaW5kKSkgewoJCXJldHVybiBlbnlvLmNoZWNrQ29uc3RydWN0b3IoaW5LaW5kKTsKCX0KCgkvLyB1c2UgbWVtb2l6ZWQgY29uc3RydWN0b3IgaWYgYXZhaWxhYmxlLi4uCgl2YXIgY3RvciA9IGVueW8uX2tpbmRDdG9yc1tpbktpbmRdOwoJaWYgKGN0b3IpIHsKCQlyZXR1cm4gY3RvcjsKCX0KCS8vIG90aGVyd2lzZSBsb29rIGl0IHVwIGFuZCBtZW1vaXplIHdoYXQgd2UgZmluZAoJLy8KCS8vIGlmIGluS2luZCBpcyBhbiBvYmplY3QgaW4gZW55bywgc2F5ICJDb250cm9sIiwgdGhlbiBjdG9yID0gZW55b1siQ29udHJvbCJdCgkvLyBpZiBpbktpbmQgaXMgYSBwYXRoIHVuZGVyIGVueW8sIHNheSAiSGVyaXRhZ2UuQnV0dG9uIiwgdGhlbiBjdG9yID0gZW55b1siSGVyaXRhZ2UuQnV0dG9uIl0gfHwgZW55by5IZXJpdGFnZS5CdXR0b24KCS8vIGlmIGluS2luZCBpcyBhIGZ1bGx5IHF1YWxpZmllZCBwYXRoLCBzYXkgImVueW8uSGVyaXRhZ2UuQnV0dG9uIiwgdGhlbiBjdG9yID0gZW55b1siZW55by5IZXJpdGFnZS5CdXR0b24iXSB8fCBlbnlvLmVueW8uSGVyaXRhZ2UuQnV0dG9uIHx8IGVueW8uSGVyaXRhZ2UuQnV0dG9uCgkvLwoJLy8gTm90ZSB0aGF0IGtpbmQgIkZvbyIgd2lsbCByZXNvbHZlIHRvIGVueW8uRm9vIGJlZm9yZSByZXNvbHZpbmcgdG8gZ2xvYmFsICJGb28iLgoJLy8gVGhpcyBpcyBpbXBvcnRhbnQgc28gIkltYWdlIiB3aWxsIG1hcCB0byBidWlsdC1pbiBJbWFnZSBvYmplY3QsIGluc3RlYWQgb2YgZW55by5JbWFnZSBjb250cm9sLgoJY3RvciA9IGVueW8uVGhlbWVbaW5LaW5kXSB8fCBlbnlvW2luS2luZF0gfHwgZW55by5nZXRQYXRoLmNhbGwoZW55bywgaW5LaW5kLCB0cnVlKSB8fCB3aW5kb3dbaW5LaW5kXSB8fCBlbnlvLmdldFBhdGgoaW5LaW5kKTsKCS8vIGlmIHRoaXMgaXMgYSBkZWZlcnJlZCBraW5kLCBydW4gdGhlIGZvbGxvdy11cCBjb2RlIHRoZW4gcmVmZXRjaCB0aGUga2luZCdzIGNvbnN0cnVjdG9yCglpZiAoY3RvciAmJiBjdG9yLl9maW5pc2hLaW5kQ3JlYXRpb24pIHsKCQljdG9yID0gY3Rvci5fZmluaXNoS2luZENyZWF0aW9uKCk7Cgl9CgllbnlvLl9raW5kQ3RvcnNbaW5LaW5kXSA9IGN0b3I7CglyZXR1cm4gY3RvcjsKfTsKCi8vCi8vIG5hbWVzcGFjZSBmb3IgY3VycmVudCB0aGVtZSAoImVueW8uVGhlbWUuQnV0dG9uIiByZWZlcmVuY2VzIHRoZSBCdXR0b24gc3BlY2lhbGl6YXRpb24gZm9yIHRoZSBjdXJyZW50IHRoZW1lKQovLwplbnlvLlRoZW1lID0ge307CgplbnlvLnJlZ2lzdGVyVGhlbWUgPSBmdW5jdGlvbihpbk5hbWVzcGFjZSkgewoJZW55by5taXhpbihlbnlvLlRoZW1lLCBpbk5hbWVzcGFjZSk7Cn07Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/Router.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJQW55IGluc3RhbmNlIG9mIGEgcm91dGVyIHdpbGwgYmUgcmVmZXJlbmNlZCBoZXJlIGZvciB0aGUgZ2xvYmFsCgkJaGFzaCBjaGFuZ2UgaGFuZGxlci4KCSovCgl2YXIgbGlzdGVuZXJzID0gW107CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJVGhpcyBpcyB0aGUgaW50ZW5kZWQgZ2xvYmFsIHdpbmRvdy5oYXNoY2hhbmdlIGV2ZW50IGhhbmRsZXIuIElmCgkJYW5vdGhlciBoYW5kbGVyIGlzIGFyYml0cmFyaWx5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZXZlbnQgdGhlbiBpdAoJCXdpbGwgbm90IGZpcmUuCgkqLwoJdmFyIGhhc2hEaWRDaGFuZ2UgPSBmdW5jdGlvbiAoaGFzaCkgewoJCXZhciBsaXN0ID0gbGlzdGVuZXJzOwoJCXZhciBsZW4gPSBsaXN0Lmxlbmd0aDsKCQl2YXIgaWR4ID0gMDsKCQlmb3IgKDsgaWR4IDwgbGVuOyArK2lkeCkgewoJCQlsaXN0W2lkeF0uX2hhc2hDaGFuZ2VkKGhhc2gpOwoJCX0KCX07CgoJLy8qQHByb3RlY3RlZAoJdmFyIHRva2VuID0gL1w6W2EtekEtWjAtOV0qL2c7CgoJLy8qQHByb3RlY3RlZAoJdmFyIHByZXBhcmUgPSBmdW5jdGlvbiAoc3RyKSB7CgkJcmV0dXJuIHN0clswXSA9PT0gIiMiPyBzdHIuc2xpY2UoMSk6IHN0cjsKCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJQWxsIG9mIG91ciBhY3RpdmVseS1zdXBwb3J0ZWQgYnJvd3NlcnMgc3VwcG9ydCB0aGlzIG1ldGhvZCBvZgoJCXJlZ2lzdGVyaW5nIGZvciBoYXNoY2hhbmdlIGV2ZW50cy4KCSovCgllbnlvLnJlYWR5KGZ1bmN0aW9uICgpIHsKCQllbnlvLmRpc3BhdGNoZXIubGlzdGVuKHdpbmRvdywgImhhc2hjaGFuZ2UiLCBoYXNoRGlkQ2hhbmdlKTsKCX0pOwoKCS8vKkBwdWJsaWMKCS8qKgoJCV9lbnlvLlJvdXRlcl8gaXMgYSBjb250cm9sbGVyIHdpdGggdGhlIGFiaWxpdHkgdG8gaW50ZXJwcmV0IGNoYW5nZXMKCQlpbiB0aGUgdXJsIGFzIHdlbGwgYXMgc2V0IGNoYW5nZXMgdG8gdGhlIHVybCBpbiBhIG1hbm5lciB0aGF0IGlzCgkJY29tcGF0aWJsZSBhY3Jvc3MgYnJvd3NlcnMuIFdpdGggZGVmaW5lZCByb3V0ZSBoYW5kbGluZywgdGhlCgkJYXBwbGljYXRpb24gc3RhdGUgY2FuIGJlIG1hbmFnZWQgbW9yZSBjbG9zZWx5IHdpdGggcmVzcGVjdCB0byB0aGUKCQlsb2NhdGlvbiBzdGF0ZSBvZiB0aGUgYnJvd3Nlci4gVGhlcmUgbWF5IGJlIG11bHRpcGxlIHJvdXRlciBpbnN0YW5jZXMKCQlhY3RpdmUgYXQgYW55IG9uZSB0aW1lLiBSb3V0ZXJzIG9ubHkgaW50ZXJhY3Qgd2l0aCB0aGUgaGFzaCBwb3J0aW9uCgkJb2YgdGhlIGJyb3dzZXIgbG9jYXRpb24gYW5kIHdpbGwgbm90IGZvcmNlIGEgcmVsb2FkIG9mIHRoZSBjdXJyZW50CgkJcGFnZS4KCgkJUm91dGVzIG1heSBiZSBkZWZpbmVkIGluIHNldmVyYWwgd2F5cyBhbmQgbWF5IGJlIGFkZGVkIGF0IHN0YXJ0dXAgb3IKCQlhZGRlZCBwcm9ncmFtbWF0aWNhbGx5IGF0IGEgbGF0ZXIgdGltZS4KCgkJQSByb3V0ZSBpcyBhIGRlY2xhcmF0aXZlIGhhc2ggd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKCgkJCXtwYXRoOiAic29tZS9wYXRoIiwgaGFuZGxlcjogImZ1bmN0aW9uIiwgY29udGV4dDogImNvbnRleHQifQoKCQlUaGUgcGF0aCBpcyBhIHN0cmluZyB0aGF0IG1heSBiZSBzdGF0aWMgKGV4cGxpY2l0bHkgbWF0Y2hlZCkgb3IKCQlkeW5hbWljIChtYXRjaGVkIGJhc2VkIG9uIGR5bmFtaWMgcGxhY2Vob2xkZXJzKS4gRHluYW1pYyBwYXRocwoJCW1heSBuYW1lIGVsZW1lbnRzIHRvIGJlIG1hdGNoZWQsIGUuZy46CgoJCQl7cGF0aDogIjp1c2VyLzppZCJ9CgoJCUluIHRoaXMgY2FzZSwgdGhlIGhhbmRsZXIgd291bGQgYmUgY2FsbGVkIHdpdGggdHdvIHBhcmFtZXRlcnMKCQlmaWxsZWQgd2l0aCB0aGUgdmFsdWVzIG1hdGNoZWQgYnkgdGhhdCBzdHJ1Y3R1cmUuIEl0IGlzIGltcG9ydGFudAoJCXRvIG5vdGUgdGhhdCBhIGR5bmFtaWMgcm91dGUgd2lsbCBhcHBseSB0aGUgZmlyc3QgbWF0Y2ggaXQgZmluZHMsCgkJc28gY2FyZSBtdXN0IGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3Qgcm91dGUgaXMgbWF0Y2hlZAoJCShlLmcuLCBgL3VzZXJzLzp1c2VyLzppZGAgaXMgbW9yZSBleGFjdCBiZWNhdXNlIG9mIHRoZSBzdGF0aWMKCQlgdXNlcnNgIHBvcnRpb24gb2YgdGhlIHBhdGgpLgoKCQlUaGUgaGFuZGxlciBtYXkgYmUgYSBmdW5jdGlvbiByZWZlcmVuY2Ugb3IgYSBzdHJpbmcgdGhhdCB3aWxsIGJlCgkJbWFwcGVkIHRvIGEgZnVuY3Rpb24uIEEgY2hlY2sgZm9yIHRoZSBmdW5jdGlvbidzIGV4aXN0ZW5jZSBpcwoJCWNvbmR1Y3RlZCBmaXJzdCBvbiB0aGUgcm91dGVyLCB0aGVuIG9uIGFueSBwcm92aWRlZCBjb250ZXh0LCBhbmQKCQlmaW5hbGx5IGluIHRoZSBnbG9iYWwgc2NvcGUuIElmIGEgY29udGV4dCBpcyBwcm92aWRlZCwgdGhlCgkJZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB1bmRlciB0aGF0IGNvbnRleHQgcmVnYXJkbGVzcyBvZiB3aGVyZQoJCXRoZSBmdW5jdGlvbiB3YXMgZm91bmQuCgoJCVRoZSBjb250ZXh0IHByb3BlcnR5IG1heSBiZSBhbiBvYmplY3QsIGFuIGluc3RhbmNlIG9yIGEgc3RyaW5nIHRoYXQKCQl3aWxsIGJlIG1hcHBlZCB0byBhbiBvYmplY3QgaWYgcG9zc2libGUuCgoJCU5vdGUgdGhhdCwgY3VycmVudGx5LCBvbmx5IGxldHRlcnMgYW5kIG51bWJlcnMgYXJlIHN1cHBvcnRlZCBpbgoJCWR5bmFtaWMgcm91dGVzLgoJKi8KCWVueW8ua2luZCh7CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQluYW1lOiAiZW55by5Sb3V0ZXIiLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUlmIHRydWUsIHRoZSByb3V0ZXIgd2lsbCByZXNwb25kIHRvIGhhc2ggY2hhbmdlcyBvciBpbnRlcm5hbCBldmVudHMuCgkJCUlmIHRoaXMgZmxhZyBpcyBzZXQgdG8gZmFsc2UsIGl0IHdpbGwgc3RvcCByZXNwb25kaW5nLiBUaGlzIG1heSBiZQoJCQljaGFuZ2VkIGF0IGFueSB0aW1lLgoJCSovCgkJbGlzdGVuaW5nOiB0cnVlLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUlmIHRydWUsIHRoZSByb3V0ZXIgd2lsbCBuZWl0aGVyIHJlc3BvbmQgdG8gaGFzaCBjaGFuZ2VzIGluIHRoZQoJCQlicm93c2VyIG5vciBiZSBhYmxlIHRvIHRyaWdnZXIgdGhlbS4gSW5zdGVhZCwgaXQgbWF5IGJlIHVzZWQKCQkJaW50ZXJuYWxseSB0byBtYWludGFpbiBvciB0cmlnZ2VyIHN0YXRlIGNoYW5nZXMgaW4gYW4gYXBwbGljYXRpb24KCQkJd2l0aG91dCBjaGFuZ2luZyBsb2NhdGlvbi4KCQkqLwoJCWludGVybmFsT25seTogZmFsc2UsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJSWYgdGhlIGRlc2lyZSBpcyB0byBmb3JjZSB0aGUgY3VycmVudCBicm93c2VyIGxvY2F0aW9uIHRvIGEgcGFydGljdWxhcgoJCQlwYXRoIG9uIHN0YXJ0dXAgc2V0IHRoaXMgdmFsdWUgdG8gdHJ1ZS4gV2lsbCBiZSBpZ25vcmVkIGlmIF90cmlnZ2VyT25TdGFydF8KCQkJaXMgZmFsc2UuCgkJKi8KCQlkZWZhdWx0UGF0aE9uU3RhcnQ6IGZhbHNlLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRoZSBfZGVmYXVsdFJvdXRlXyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgYSBub3JtYWwKCQkJcm91dGUgKGhhc2gpLiBJdCBtYXkgYmUgYXJiaXRyYXJpbHkgYXNzaWduZWQgdG8gdGhpcyBwcm9wZXJ0eQoJCQlvciBtaXhlZCBpbnRvIHRoZSByb3V0ZXMgYXJyYXkgd2l0aCBhIHNwZWNpYWwgX2RlZmF1bHQ6IHRydWVfCgkJCWZsYWcgc2V0LiBGb3IgYW55IHVubWF0Y2hlZCBoYXNoIGNoYW5nZXMsIHRoaXMgcm91dGUgd2lsbCBiZQoJCQlleGVjdXRlZCBhbmQgcGFzc2VkIHRoZSBwYXRoIHRoYXQgd2FzIG5vdCBtYXRjaGVkLgoJCSovCgkJZGVmYXVsdFJvdXRlOiBudWxsLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUJ5IGRlZmF1bHQsIHdoZW4gYSByb3V0ZXIgaXMgY3JlYXRlZCwgaXQgd2lsbCBhdHRlbXB0IHRvIHRyaWdnZXIKCQkJdGhlIGNvcnJlY3Qgcm91dGUgZm9yIHRoZSBjdXJyZW50IGJyb3dzZXIgbG9jYXRpb24uIFNldCB0aGlzCgkJCXRvIGZhbHNlIHRvIHByZXZlbnQgdGhpcyBmcm9tIGhhcHBlbmluZy4KCQkqLwoJCXRyaWdnZXJPblN0YXJ0OiB0cnVlLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRoZSByb3V0ZXIgd2lsbCBhdHRlbXB0IHRvIHRyYWNrIGhpc3RvcnkgYmFzZWQgb24gdGhlIGV2ZW50cwoJCQl0aGF0IGhhdmUgYmVlbiBnZW5lcmF0ZWQgdGhyb3VnaCBpdC4KCQkqLwoJCXVzZUhpc3Rvcnk6IGZhbHNlLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRoZSBfcm91dGVzXyBhcnJheSBjb25zdGl0dXRlcyB0aGUgaGFuZGxlcnMgZm9yIHRoaXMgcm91dGVyLgoJCQlSb3V0ZXMgYXJlIHN0cmluZyBwYXRocywgc3RhdGljIG9yIGR5bmFtaWMsIHRoYXQgcm91dGUgcGFydGljdWxhcgoJCQloYXNoIGNoYW5nZSBldmVudHMuIFRoZXkgYXJlIGRlZmluZWQgaW4gYW4gYXJyYXkgb2YgaGFzaGVzIHdpdGgKCQkJYSBfaGFuZGxlcl8gKGZ1bmN0aW9uKSwgX3BhdGhfIChmb3Igc3RhdGljIGFuZCBkeW5hbWljIHBhdGhzKSwgYW4KCQkJb3B0aW9uYWwgX2NvbnRleHRfIChmb3IgdGhlIGhhbmRsZXIpLCBvciBhIF9kZWZhdWx0XyBib29sZWFuIHRydWV8ZmFsc2UKCQkJd2hlcmUgdGhhdCBoYW5kbGVyIHdpbGwgYmUgdXNlZCB3aGVuIG5vIG90aGVyIHJvdXRlIGNhbiBoYW5kbGUgdGhlCgkJCWhhc2hjaGFuZ2UgZXZlbnQuCgkJKi8KCQlyb3V0ZXM6IG51bGwsCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBQUk9QRVJUSUVTCgoJCS8vKkBwcm90ZWN0ZWQKCQlraW5kOiAiZW55by5Db250cm9sbGVyIiwKCgkJLy8qQHByb3RlY3RlZAoJCV9zdGF0aWNSb3V0ZXM6IG51bGwsCgoJCS8vKkBwcm90ZWN0ZWQKCQlfZHluYW1pY1JvdXRlczogbnVsbCwKCgkJLy8qQHByb3RlY3RlZAoJCV9jdXJyZW50OiAiIiwKCgkJLy8qQHByb3RlY3RlZAoJCV9oaXN0b3J5OiBudWxsLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBDT01QVVRFRCBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHdpbGwgcmV0dXJuIHRoZSBsb2NhdGlvbiBhcwoJCQlrbm93biBieSB0aGlzIHJvdXRlci4gVGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHN5bmNocm9uaXplZAoJCQl3aXRoIF93aW5kb3cubG9jYXRpb24uaGFzaF8gdW5sZXNzIGl0J3MgX2ludGVybmFsT25seV8KCQkJZmxhZyB3YXMgc2V0IHRvIHRydWUuIFBhc3NpbmcgYSBzdHJpbmcgdG8gdGhpcyBwcm9wZXJ0eQoJCQl2aWEgX3NldCgibG9jYXRpb24iLCAibXlsb2NhdGlvbiIpXyB3aWxsIHVwZGF0ZSB0aGUgaW5uZXIKCQkJbG9jYXRpb24ga25vd24gYnkgdGhpcyByb3V0ZXIuCgkJKi8KCQlsb2NhdGlvbjogZW55by5jb21wdXRlZChmdW5jdGlvbiAobG9jKSB7CgkJCWlmIChsb2MpIHsKCQkJCWxvYyA9IHByZXBhcmUobG9jKTsKCQkJCWlmICghdGhpcy5pbnRlcm5hbE9ubHkpIHsKCQkJCQllbnlvLmFzeW5jTWV0aG9kKHRoaXMsICJ0cmlnZ2VyIiwge2xvY2F0aW9uOiBsb2MsIGNoYW5nZTogdHJ1ZX0pOwoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLnNldCgiX2N1cnJlbnQiLCBsb2MpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHByZXBhcmUodGhpcy5nZXQoIl9jdXJyZW50IikpOwoJCQl9CgkJfSwgIl9jdXJyZW50Iiwge2NhY2hlZDogdHJ1ZX0pLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVJldHVybnMgdGhlIHN0cmluZyBmb3IgdGhlIGRlZmF1bHQgcGF0aCAoaWYgYW55IG90aGVyd2lzZSBlbXB0eQoJCQlzdHJpbmcpLgoJCSovCgkJZGVmYXVsdFBhdGg6IGVueW8uY29tcHV0ZWQoZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gdGhpcy5kZWZhdWx0Um91dGU/IHRoaXMuZGVmYXVsdFJvdXRlLnBhdGg6ICIiOwoJCX0pLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgTUVUSE9EUwoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRyaWdnZXJzIGEgY2hhbmdlIHdpdGhvdXQgbmVjZXNzYXJpbHkgcmVxdWlyaW5nIGEgY2hhbmdlIHRvCW9jY3VyLgoJCQlJZiBjYWxsZWQgd2l0aG91dCBhIHBhcmFtZXRlciwgaXQgd2lsbCBmb3JjZSB0aGUgcm91dGUgdGhhdCBtYXRjaGVzCgkJCXRoZSBjdXJyZW50IGJyb3dzZXIgbG9jYXRpb24gdG8gZmlyZS4gSWYgYSBzdHJpbmcgaXMgcGFzc2VkIGluLCB0aGlzCgkJCW1ldGhvZCB3aWxsIHRyaWdnZXIgYW4gaW50ZXJuYWwtb25seSBldmVudCAoaS5lLiwgdGhlCWJyb3dzZXIKCQkJbG9jYXRpb24gd2lsbCBub3QgYmUgY2hhbmdlZCkuIElmIGl0IGlzIHBhc3NlZCBhIGhhc2gsIHRoZSBtZXRob2QKCQkJd2lsbCB0cnkgdG8gdXNlIGEgX2xvY2F0aW9uXyBwcm9wZXJ0eSB3aGlsZSBsb29raW5nIGZvciBvcHRpb25hbAoJCQlfY2hhbmdlXyBhbmQgX2dsb2JhbF8gcHJvcGVydGllcy4KCgkJCUlmIHRoZSBfY2hhbmdlXyBwcm9wZXJ0eSBpcyBwcmVzZW50IGFuZCB0cnVlLCBpdCB3aWxsIGZvcmNlIGEKCQkJX2xvY2F0aW9uLmhhc2hfIGNoYW5nZSBpbiB0aGUgYnJvd3NlciAodGhpcyBpcyBhbHdheXMgZ2xvYmFsKS4KCQkJSWYgdGhlIF9nbG9iYWxfIHByb3BlcnR5IGlzIHByZXNlbnQgYW5kIHRydWUgYW5kIF9jaGFuZ2VfIGlzCgkJCW5vdCBwcmVzZW50IG9yIGZhbHNlLCBpdCB3aWxsIHRyaWdnZXIgYW4gaW50ZXJuYWwgZXZlbnQgdGhhdAoJCQlhbGwgcm91dGVycyB3aWxsIHJlc3BvbmQgdG8gKG5vdCBqdXN0IHRoaXMgaW5zdGFuY2UpLgoJCSovCgkJdHJpZ2dlcjogZnVuY3Rpb24gKHBhcmFtcykgewoJCQlpZiAoIXBhcmFtcykgewoJCQkJcGFyYW1zID0ge2xvY2F0aW9uOiB0aGlzLmdldCgiX2N1cnJlbnQiKX07CgkJCX0gZWxzZSBpZiAoInN0cmluZyIgPT09IHR5cGVvZiBwYXJhbXMpIHsKCQkJCXBhcmFtcyA9IHtsb2NhdGlvbjogcGFyYW1zfTsKCQkJfQoJCQl2YXIgbG9jID0gcGFyYW1zLmxvY2F0aW9uOwoJCQl2YXIgZ2xvYmFsID0gcGFyYW1zLmdsb2JhbDsKCQkJdmFyIGNoYW5nZSA9IHBhcmFtcy5jaGFuZ2U7CgkJCXZhciBjdXJyZW50ID0gdGhpcy5nZXQoImxvY2F0aW9uIik7CgkJCWlmIChjaGFuZ2UpIHsKCQkJCWlmIChjdXJyZW50ICE9PSBsb2MpIHsKCQkJCQl3aW5kb3cubG9jYXRpb24uaGFzaCA9IGxvYzsKCQkJCX0gZWxzZSB7CgkJCQkJdGhpcy5faGFzaENoYW5nZWQobG9jKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmIChnbG9iYWwpIHsKCQkJCQloYXNoRGlkQ2hhbmdlKGxvYyk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMuX2hhc2hDaGFuZ2VkKGxvYyk7CgkJCQl9CgkJCX0KCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUluIHZlcnkgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IG1heSBiZSB1c2VmdWwgdG8gcGFzcyBhIHBhdGgKCQkJdG8gdGhlIHJvdXRlcyB3aXRob3V0IHVzaW5nIHRyaWdnZXIgb3IgZ2xvYmFsIGhhc2ggY2hhbmdlcwoJCQl3aXRoIF9wYXRoXyBiZWluZyBhIHN0cmluZyB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGFnYWluc3QKCQkJdGhlIHJvdXRlcyBvd25lZCBieSB0aGlzIHJvdXRlci4KCQkqLwoJCWhhbmRsZTogZnVuY3Rpb24gKHBhdGgpIHsKCQkJLy8gZmFzdCB0cmFjayBpcyB0byBjaGVjayBhZ2FpbnN0IHN0YXRpYyByb3V0ZXMgZmlyc3QKCQkJaWYgKHRoaXMuX2hhbmRsZVN0YXRpYyhwYXRoKSkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCS8vIHRoZW4gd2UgY2hlY2sgYWdhaW5zdCBkeW5hbWljIHBhdGhzIGluIHRoaXMgc2ltcGxlIHNjaGVtZQoJCQllbHNlIGlmICh0aGlzLl9oYW5kbGVEeW5hbWljKHBhdGgpKSB7CgkJCQkvKiBkbyBub3RoaW5nICovCgkJCX0KCQkJZWxzZSB7CgkJCQl0aGlzLl9oYW5kbGVEZWZhdWx0KHBhdGgpOwoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlJZiBoaXN0b3J5IGlzIGVuYWJsZWQgYW5kIHNvbWUgaGlzdG9yeSBleGlzdHMgd2lsbCBhdHRlbXB0CgkJCXRvIHJldmVydCB0aGUgY3VycmVudCBrbm93biBsb2NhdGlvbiB0byB0aGUgcHJldmlvdXMgb25lIGluCgkJCXRoZSBzdGFjay4KCQkqLwoJCWJhY2s6IGZ1bmN0aW9uICgpIHsKCQkJaWYgKHRoaXMudXNlSGlzdG9yeSkgewoJCQkJaWYgKHRoaXMuX2hpc3RvcnkubGVuZ3RoID49IDIpIHsKCQkJCQkvLyB3ZSBzaGlmdCB0aGUgY3VycmVudCBsb2NhdGlvbiBvZmYgdGhlIHN0YWNrCgkJCQkJdGhpcy5faGlzdG9yeS5zaGlmdCgpOwoJCQkJCS8vIHdlIHNoaWZ0IHRoZSByZXF1ZXN0ZWQgbG9jYXRpb24gb2ZmIHRoZSBzdGFjawoJCQkJCS8vIGJ1dCByZWFwcGx5IGl0CgkJCQkJdGhpcy5zZXQoImxvY2F0aW9uIiwgdGhpcy5faGlzdG9yeS5zaGlmdCgpKTsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJVG8gYXJiaXRyYXJpbHkgYWRkIGhpc3RvcnkuIE9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXIgY2FuIGJlCgkJCWEgYm9vbGVhbiB0cnVlIHRvIHBsYWNlIHRoZSBsb2NhdGlvbiBhdCB0aGUgbG93ZXN0IChmaXJzdCkgcG9zaXRpb24KCQkJb2YgdGhlIHN0YWNrIG9yIGFuIGludGVnZXIgaW5kaWNhdGluZyBpdHMgZXhhY3QgbG9jYXRpb24gaW4gdGhlCgkJCXN0YWNrLiBJZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyBpdCB3aWxsIGJlIGFkZGVkIGF0IHRoZSBsb3dlc3QKCQkJcG9zaXRpb24gKHNhbWUgYXMgYm9vbGVhbiB0cnVlIGZvciBzZWNvbmQgcGFyYW1ldGVyKS4gUmV0dXJucyBjYWxsZWUKCQkJZm9yIGNoYWluaW5nLgoJCSovCgkJYWRkSGlzdG9yeTogZnVuY3Rpb24gKGxvY2F0aW9uLCBpZHgpIHsKCQkJaWYgKHRoaXMudXNlSGlzdG9yeSkgewoJCQkJc3dpdGNoICh0eXBlb2YgaWR4KSB7CgkJCQljYXNlICJ1bmRlZmluZWQiOgoJCQkJCXRoaXMuX2hpc3RvcnkudW5zaGlmdChsb2NhdGlvbik7CgkJCQkJYnJlYWs7CgkJCQljYXNlICJudW1iZXIiOgoJCQkJCWlmIChpZHggPj0gMCAmJiBpZHggPCB0aGlzLl9oaXN0b3J5Lmxlbmd0aCkgewoJCQkJCQl0aGlzLl9oaXN0b3J5LnNwbGljZShpZHgsIDAsIGxvY2F0aW9uKTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlICJib29sZWFuIjoKCQkJCQl0aGlzLl9oaXN0b3J5LnB1c2gobG9jYXRpb24pOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQ2xlYXJzIGFueSBoaXN0b3J5IHRoZSByb3V0ZXIgaGFzIGN1cnJlbnRseSBzdG9yZWQuIFJldHVybnMKCQkJY2FsbGVlIGZvciBjaGFpbmluZy4KCQkqLwoJCWNsZWFySGlzdG9yeTogZnVuY3Rpb24gKCkgewoJCQl0aGlzLl9oaXN0b3J5ID0gW107CgkJCXJldHVybiB0aGlzOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQ2FuIGJlIHVzZWQgdG8gcHJvZ3JhbW1hdGljYWxseSBhZGQgcm91dGVzIHRvIHRoZSByb3V0ZXIKCQkJd2hlcmUgX3JvdXRlXyBpcyBhIGhhc2ggYXMgZGVzY3JpYmVkIGJ5IHRoZSBfcm91dGVzXyBhcnJheS4KCQkJUmV0dXJucyBjYWxsZWUgZm9yIGNoYWluaW5nLgoJCSovCgkJYWRkUm91dGU6IGZ1bmN0aW9uIChyb3V0ZSkgewoJCQl2YXIgc3RhdGljcyA9IHRoaXMuX3N0YXRpY1JvdXRlczsKCQkJdmFyIGR5bmFtaWMgPSB0aGlzLl9keW5hbWljUm91dGVzOwoJCQl2YXIgcmVnZXg7CgkJCWlmICh0cnVlID09PSByb3V0ZVsnZGVmYXVsdCddKSB7CgkJCQl0aGlzLmRlZmF1bHRSb3V0ZSA9IHJvdXRlOwoJCQl9CgkJCWVsc2UgaWYgKHRva2VuLnRlc3Qocm91dGUucGF0aCkpIHsKCQkJCXJlZ2V4ID0gbmV3IFJlZ0V4cChyb3V0ZS5wYXRoLnJlcGxhY2UodG9rZW4sICIoW2EtekEtWjAtOS1dKikiKSk7CgkJCQlyb3V0ZS5yZWdleCA9IHJlZ2V4OwoJCQkJZHluYW1pYy5wdXNoKHJvdXRlKTsKCQkJfSBlbHNlIHsKCQkJCXN0YXRpY3Nbcm91dGUucGF0aF0gPSByb3V0ZTsKCQkJfQoJCQlyZXR1cm4gdGhpczsKCQl9LAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgTUVUSE9EUwoKCQkvLypAcHJvdGVjdGVkCgkJY29uc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsKCQkJdGhpcy5fc3RhdGljUm91dGVzID0ge307CgkJCXRoaXMuX2R5bmFtaWNSb3V0ZXMgPSBbXTsKCQkJdGhpcy5yb3V0ZXMgPSB0aGlzLnJvdXRlcyB8fCBbXTsKCQkJdGhpcy5faGlzdG9yeSA9IHRoaXMuX2hpc3RvcnkgfHwgW107CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCWNyZWF0ZTogZnVuY3Rpb24gKCkgewoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCQkvLyBtYWtlIHN1cmUgdG8gaW5pdGlhbGl6ZSBvdXIgcm91dGVzIHByaW9yCgkJCS8vIHRvIHJlZ2lzdGVyaW5nIGZvciBldmVudHMKCQkJdGhpcy5fc2V0dXBSb3V0ZXMoKTsKCQkJLy8gbWFrZSBzdXJlIHdlJ3JlIHVwIHRvIGRhdGUKCQkJdGhpcy5zZXQoIl9jdXJyZW50IiwgcHJlcGFyZSh3aW5kb3cubG9jYXRpb24uaGFzaCkpOwoJCQkvLyBvaywgcmVnaXN0ZXIgZm9yIGV2ZW50cwoJCQlsaXN0ZW5lcnMucHVzaCh0aGlzKTsKCQkJLy8gb2ssIGlmIHdlIG5lZWQgdG8gZ28gYWhlYWQgYW5kIHJvdXRlIG91ciBjdXJyZW50CgkJCS8vIGxvY2F0aW9uLCBsZXRzIGRvIGl0CgkJCWlmICh0aGlzLnRyaWdnZXJPblN0YXJ0KSB7CgkJCQlpZiAodGhpcy5kZWZhdWx0UGF0aE9uU3RhcnQpIHsKCQkJCQl0aGlzLnRyaWdnZXIoe2NoYW5nZTogdHJ1ZSwgbG9jYXRpb246IHRoaXMuZ2V0KCJkZWZhdWx0UGF0aCIpfSk7CgkJCQl9IGVsc2UgewoJCQkJCXRoaXMudHJpZ2dlcigpOwoJCQkJfQoJCQl9CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCWRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGlkeCA9IGVueW8uaW5kZXhPZih0aGlzLCBsaXN0ZW5lcnMpOwoJCQlpZiAoIX5pZHgpIHsKCQkJCWxpc3RlbmVycy5zcGxpY2UoaWR4LCAxKTsKCQkJfQoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlfaGFzaENoYW5nZWQ6IGZ1bmN0aW9uIChoYXNoKSB7CgkJCXZhciAkaGFzaCA9IChmdW5jdGlvbiAocHJvcCkgewoJCQkJaWYgKCFlbnlvLmlzU3RyaW5nKHByb3ApKSB7CgkJCQkJLy8gc29tZSBicm93c2VycyBkbyBub3Qgc3VwcG9ydCB0aGUgbmV3VXJsIHByb3BlcnR5CgkJCQkJLy8gc28gd2UncmUgZm9yY2VkIHRvIGxvb2sgYXQgdGhlIGN1cnJlbnQgaGFzaAoJCQkJCXByb3AgPSBwcm9wLm5ld1VybCB8fCB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJCX0KCQkJCXJldHVybiBwcmVwYXJlKHByb3ApOwoJCQl9KShoYXNoKTsKCQkJaWYgKHRoaXMubGlzdGVuaW5nKSB7CgkJCQl0aGlzLnNldCgiX2N1cnJlbnQiLCAkaGFzaCk7CgkJCQl0aGlzLmhhbmRsZSgkaGFzaCk7CgkJCX0KCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJX2V4ZWNIYW5kbGVyOiBmdW5jdGlvbiAoY29udGV4dCwgaGFuZGxlciwgYXJncywgcm91dGUpIHsKCQkJdmFyICRmbiA9IGhhbmRsZXI7CgkJCXZhciAkY3R4ID0gInN0cmluZyIgPT09IHR5cGVvZiBjb250ZXh0PyBlbnlvLmdldFBhdGguY2FsbCh0aGlzLCBjb250ZXh0KTogY29udGV4dCB8fCB0aGlzOwoJCQkvLyBpZiB0aGUgaGFuZGxlciBpcyBkZWZpbmVkIGFzIGEgc3RyaW5nLCB3ZSBuZWVkIHRvIGRldGVybWluZSBpZgoJCQkvLyBpdCBpcyByZWxhdGl2ZSB0byB0aGUgcm91dGVyLCByZWxhdGl2ZSB0byB0aGUgY29udGV4dCwgb3IgYSBuYW1lZAoJCQkvLyBmdW5jdGlvbiBpbiB0aGUgZ2xvYmFsIHNjb3BlCgkJCWlmICgic3RyaW5nIiA9PT0gdHlwZW9mIGhhbmRsZXIpIHsKCQkJCS8vIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiB0aGUgaGFuZGxlciBpcyBhIG5hbWVkIHByb3BlcnR5CgkJCQkvLyBvbiB0aGUgcm91dGVyOyBvdGhlcndpc2UsIHRyeSB0aGUgY29udGV4dCBpdHNlbGYKCQkJCSRmbiA9IHRoaXNbaGFuZGxlcl0gfHwgJGN0eFtoYW5kbGVyXTsKCQkJCWlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgJGZuKSB7CgkJCQkJLy8gaW4gY2FzZSB3ZSBhY3R1YWxseSBmb3VuZCBpdCwgbGV0J3Mgbm90IGdvIGh1bnRpbmcKCQkJCQkvLyBuZXh0IHRpbWUKCQkJCQlyb3V0ZS5oYW5kbGVyID0gJGZuOwoJCQkJCXJvdXRlLmNvbnRleHQgPSAkY3R4OwoJCQkJfQoJCQl9CgkJCS8vIGlmIHdlIGhhdmUgYW4gYWN0dWFsIGhhbmRsZXIsIGxldCdzIGV4ZWN1dGUgaXQgbm93CgkJCWlmICgkZm4gJiYgImZ1bmN0aW9uIiA9PT0gdHlwZW9mICRmbikgewoJCQkJJGZuLmFwcGx5KCRjdHgsIGFyZ3MpOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJLy8gb3RoZXJ3aXNlIHdlIGNvdWxkbid0IGRldGVybWluZSB3aGF0IHdlIHdlcmUgc3VwcG9zZWQgdG8KCQkJLy8gZG8gaGVyZQoJCQlyZXR1cm4gZmFsc2U7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCV9oYW5kbGVTdGF0aWM6IGZ1bmN0aW9uIChwYXRoKSB7CgkJCXZhciBzdGF0aWNzID0gdGhpcy5fc3RhdGljUm91dGVzOwoJCQl2YXIgcm91dGU7CgkJCXZhciBoYW5kbGVyOwoJCQl2YXIgY29udGV4dDsKCQkJaWYgKChyb3V0ZSA9IHN0YXRpY3NbcGF0aF0pKSB7CgkJCQloYW5kbGVyID0gcm91dGUuaGFuZGxlcjsKCQkJCWNvbnRleHQgPSByb3V0ZS5jb250ZXh0OwoJCQkJcmV0dXJuIHRoaXMuX2V4ZWNIYW5kbGVyKGNvbnRleHQsIGhhbmRsZXIsIFtwYXRoXSwgcm91dGUpOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJX2hhbmRsZUR5bmFtaWM6IGZ1bmN0aW9uIChwYXRoKSB7CgkJCXZhciBkeW5hbWljID0gdGhpcy5fZHluYW1pY1JvdXRlczsKCQkJdmFyIHJlZ2V4OwoJCQl2YXIgcm91dGU7CgkJCXZhciBoYW5kbGVyOwoJCQl2YXIgY29udGV4dDsKCQkJdmFyIG1hdGNoZXM7CgkJCXZhciBpZHggPSAwOwoJCQl2YXIgbGVuID0gZHluYW1pYy5sZW5ndGg7CgkJCWZvciAoOyBpZHggPCBsZW47ICsraWR4KSB7CgkJCQlyb3V0ZSA9IGR5bmFtaWNbaWR4XTsKCQkJCXJlZ2V4ID0gcm91dGUucmVnZXg7CgkJCQlpZiAoKG1hdGNoZXMgPSByZWdleC5leGVjKHBhdGgpKSkgewoJCQkJCS8vIHdlIG5lZWQgdG8gc3RyaXAgb2ZmIHRoZSBmdWxsIG1hdGNoIHNvIHdlIGNhbgoJCQkJCS8vIHVzZSB0aGUgb3RoZXIgbWF0Y2hlcyBhcyBwYXJhbWV0ZXJzCgkJCQkJbWF0Y2hlcyA9IG1hdGNoZXMuc2xpY2UoMSk7CgkJCQkJaGFuZGxlciA9IHJvdXRlLmhhbmRsZXI7CgkJCQkJY29udGV4dCA9IHJvdXRlLmNvbnRleHQ7CgkJCQkJcmV0dXJuIHRoaXMuX2V4ZWNIYW5kbGVyKGNvbnRleHQsIGhhbmRsZXIsIG1hdGNoZXMsIHJvdXRlKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCV9oYW5kbGVEZWZhdWx0OiBmdW5jdGlvbiAocGF0aCkgewoJCQl2YXIgcm91dGUgPSB0aGlzLmRlZmF1bHRSb3V0ZSB8fCB7fTsKCQkJdmFyIGNvbnRleHQgPSByb3V0ZS5jb250ZXh0OwoJCQl2YXIgaGFuZGxlciA9IHJvdXRlLmhhbmRsZXI7CgkJCXJldHVybiB0aGlzLl9leGVjSGFuZGxlcihjb250ZXh0LCBoYW5kbGVyLCBbcGF0aF0sIHJvdXRlKTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJX3NldHVwUm91dGVzOiBmdW5jdGlvbiAoKSB7CgkJCXZhciByb3V0ZXMgPSB0aGlzLnJvdXRlczsKCQkJdmFyIGlkeCA9IDA7CgkJCXZhciBsZW4gPSByb3V0ZXMubGVuZ3RoOwoJCQl2YXIgcm91dGU7CgkJCWZvciAoOyBpZHggPCBsZW47ICsraWR4KSB7CgkJCQlyb3V0ZSA9IHJvdXRlc1tpZHhdOwoJCQkJaWYgKCFyb3V0ZSkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJdGhpcy5hZGRSb3V0ZShyb3V0ZSk7CgkJCX0KCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJX2N1cnJlbnRDaGFuZ2VkOiBmdW5jdGlvbiAoKSB7CgkJCWlmICh0aGlzLnVzZUhpc3RvcnkpIHsKCQkJCXRoaXMuX2hpc3RvcnkudW5zaGlmdCh0aGlzLmdldCgibG9jYXRpb24iKSk7CgkJCX0KCQl9CgoJfSk7Cgp9KGVueW8pKTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/Signals.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5TaWduYWxzXyBjb21wb25lbnRzIGFyZSB1c2VkIHRvIGxpc3RlbiB0byBnbG9iYWwgbWVzc2FnZXMuCgoJQW4gb2JqZWN0IHdpdGggYSBTaWduYWxzIGNvbXBvbmVudCBjYW4gbGlzdGVuIHRvIG1lc3NhZ2VzIHNlbnQgZnJvbSBhbnl3aGVyZQoJYnkgZGVjbGFyaW5nIGhhbmRsZXJzIGZvciB0aGVtLgoKCURPTSBldmVudHMgdGhhdCBoYXZlIG5vIG5vZGUgdGFyZ2V0cyBhcmUgYnJvYWRjYXN0IGFzIHNpZ25hbHMuIFRoZXNlIGV2ZW50cwoJaW5jbHVkZSBXaW5kb3cgZXZlbnRzLCBsaWtlIF9vbmxvYWRfIGFuZCBfb25iZWZvcmV1bmxvYWRfLCBhbmQgZXZlbnRzIHRoYXQKCW9jY3VyIGRpcmVjdGx5IG9uIF9kb2N1bWVudF8sIGxpa2UgX29ua2V5cHJlc3NfIGlmIF9kb2N1bWVudF8gaGFzIHRoZSBmb2N1cy4KCglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZQoJPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2VueW9qcy9lbnlvL3dpa2kvU2lnbmFscyI+U2lnbmFscyBkb2N1bWVudGF0aW9uPC9hPgoJaW4gdGhlIEVueW8gRGV2ZWxvcGVyIEd1aWRlLgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uU2lnbmFscyIsCglraW5kOiAiZW55by5Db21wb25lbnQiLAoJLy8qIEBwcm90ZWN0ZWQKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQllbnlvLlNpZ25hbHMuYWRkTGlzdGVuZXIodGhpcyk7Cgl9LAoJZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJZW55by5TaWduYWxzLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJbm90aWZ5OiBmdW5jdGlvbihpbk1zZywgaW5QYXlsb2FkKSB7CgkJdGhpcy5kaXNwYXRjaEV2ZW50KGluTXNnLCBpblBheWxvYWQpOwoJfSwKCXByb3RlY3RlZFN0YXRpY3M6IHsKCQlsaXN0ZW5lcnM6IFtdLAoJCWFkZExpc3RlbmVyOiBmdW5jdGlvbihpbkxpc3RlbmVyKSB7CgkJCXRoaXMubGlzdGVuZXJzLnB1c2goaW5MaXN0ZW5lcik7CgkJfSwKCQlyZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24oaW5MaXN0ZW5lcikgewoJCQllbnlvLnJlbW92ZShpbkxpc3RlbmVyLCB0aGlzLmxpc3RlbmVycyk7CgkJfSwKCX0sCglzdGF0aWNzOiB7CgkJc2VuZDogZnVuY3Rpb24oaW5Nc2csIGluUGF5bG9hZCkgewoJCQllbnlvLmZvckVhY2godGhpcy5saXN0ZW5lcnMsIGZ1bmN0aW9uKGwpIHsKCQkJCWwubm90aWZ5KGluTXNnLCBpblBheWxvYWQpOwoJCQl9KTsKCQl9Cgl9Cn0pOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/UiComponent.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5VaUNvbXBvbmVudF8gaW1wbGVtZW50cyBhIGNvbnRhaW5lciBzdHJhdGVneSBzdWl0YWJsZSBmb3IgcHJlc2VudGF0aW9uCglsYXllcnMuCgoJVWlDb21wb25lbnQgaXRzZWxmIGlzIGFic3RyYWN0LiBDb25jcmV0ZSBzdWJraW5kcyBpbmNsdWRlCgk8YSBocmVmPSIjZW55by5Db250cm9sIj5lbnlvLkNvbnRyb2w8L2E+IChmb3IgSFRNTC9ET00pIGFuZAoJPGEgaHJlZj0iI2VueW8uY2FudmFzLkNvbnRyb2wiPmVueW8uY2FudmFzLkNvbnRyb2w8L2E+CgkoZm9yIENhbnZhcyBjb250ZXh0cykuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5VaUNvbXBvbmVudCIsCglraW5kOiAiZW55by5Db21wb25lbnQiLAoJcHVibGlzaGVkOiB7CgkJLy8qIFRoZSBVaUNvbXBvbmVudCB0aGF0IHBoeXNpY2FsbHkgY29udGFpbnMgdGhpcyBjb21wb25lbnQgaW4gdGhlIERPTQoJCWNvbnRhaW5lcjogbnVsbCwKCQkvKioKCQkJVGhlIFVpQ29tcG9uZW50IHRoYXQgb3ducyB0aGlzIGNvbXBvbmVudCBmb3IgcHVycG9zZXMgb2YgZXZlbnQKCQkJcHJvcGFnYXRpb24KCQkqLwoJCXBhcmVudDogbnVsbCwKCQkvKioKCQkJVGhlIFVpQ29tcG9uZW50IHRoYXQgd2lsbCBwaHlzaWNhbGx5IGNvbnRhaW4gbmV3IGl0ZW1zIGFkZGVkIGJ5CgkJCWNhbGxzIHRvIF9jcmVhdGVDb21wb25lbnRfCgkJKi8KCQljb250cm9sUGFyZW50TmFtZTogImNsaWVudCIsCgkJLy8qIEEga2luZCB1c2VkIHRvIG1hbmFnZSB0aGUgc2l6ZSBhbmQgcGxhY2VtZW50IG9mIGNoaWxkIGNvbXBvbmVudHMKCQlsYXlvdXRLaW5kOiAiIgoJfSwKCWhhbmRsZXJzOiB7CgkJb25yZXNpemU6ICJyZXNpemVIYW5kbGVyIgoJfSwKCS8qKgoJCVdoZW4gc2V0LCBwcm92aWRlcyBhIGNvbnRyb2wgcmVmZXJlbmNlIHVzZWQgdG8gaW5kaWNhdGUgd2hlcmUgYQoJCW5ld2x5LWNyZWF0ZWQgY29tcG9uZW50IHNob3VsZCBiZSBhZGRlZCBpbiB0aGUgVWlDb21wb25lbnQncyBhcnJheSBvZgoJCWNoaWxkcmVuLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gZHluYW1pY2FsbHkgY3JlYXRpbmcgY2hpbGRyZW4KCQkocmF0aGVyIHRoYW4gYXQgZGVzaWduIHRpbWUpLiBJZiBzZXQgdG8gbnVsbCwgdGhlIG5ldyBjb250cm9sIHdpbGwgYmUKCQlhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheTsgaWYgc2V0IHRvIGEgc3BlY2lmaWMgZXhpc3RpbmcKCQljb250cm9sLCB0aGUgbmV3IGNvbnRyb2wgd2lsbCBiZSBhZGRlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBjb250cm9sLiBJZgoJCWxlZnQgdW5kZWZpbmVkLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBhZGQgdGhlIG5ldyBjb250cm9sIGF0IHRoZQoJCWVuZCBvZiB0aGUgYXJyYXkuCgkqLwoJYWRkQmVmb3JlOiB1bmRlZmluZWQsCgkvLyogQHByb3RlY3RlZAoJcHJvdGVjdGVkU3RhdGljczogewoJCV9yZXNpemVGbGFnczoge3Nob3dpbmdPbmx5OiB0cnVlfSAvLyBkb24ndCB3YXRlcmZhbGwgdGhlc2UgZXZlbnRzIGludG8gaGlkZGVuIGNvbnRyb2xzCgl9LAoKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb250cm9scyA9IFtdOwoJCXRoaXMuY2hpbGRyZW4gPSBbXTsKCQl0aGlzLmNvbnRhaW5lckNoYW5nZWQoKTsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXRoaXMubGF5b3V0S2luZENoYW5nZWQoKTsKCX0sCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQkvLyBEZXN0cm95cyBhbGwgbm9uLWNocm9tZSBjb250cm9scyAocmVnYXJkbGVzcyBvZiBvd25lcikuCgkJdGhpcy5kZXN0cm95Q2xpZW50Q29udHJvbHMoKTsKCQkvLyBSZW1vdmVzIHVzIGZyb20gb3VyIGNvbnRhaW5lci4KCQl0aGlzLnNldENvbnRhaW5lcihudWxsKTsKCQkvLyBEZXN0cm95cyBjaHJvbWUgY29udHJvbHMgb3duZWQgYnkgdGhpcy4KCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCWltcG9ydFByb3BzOiBmdW5jdGlvbihpblByb3BzKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQlpZiAoIXRoaXMub3duZXIpIHsKCQkJLy90aGlzLmxvZygicmVnaXN0ZXJpbmcgb3duZXJsZXNzIGNvbnRyb2wgWyIgKyB0aGlzLmtpbmROYW1lICsgIl0gd2l0aCBlbnlvLm1hc3RlciIpOwoJCQl0aGlzLm93bmVyID0gZW55by5tYXN0ZXI7CgkJfQoJfSwKCS8vIEFzIGltcGxlbWVudGVkLCBfY29udHJvbFBhcmVudE5hbWVfIG9ubHkgd29ya3MgdG8gaWRlbnRpZnkgYW4gb3duZWQKCS8vIGNvbnRyb2wgY3JlYXRlZCB2aWEgX2NyZWF0ZUNvbXBvbmVudHNfIChpLmUuLCB1c3VhbGx5IGluIG91ciBfY29tcG9uZW50c18KCS8vIGJsb2NrKS4JVG8gYXR0YWNoIGEgX2NvbnRyb2xQYXJlbnRfIHZpYSBvdGhlciBtZWFucywgb25lIG11c3QgY2FsbAoJLy8gX2Rpc2NvdmVyQ29udHJvbFBhcmVudF8gb3Igc2V0IF9jb250cm9sUGFyZW50XyBkaXJlY3RseS4KCS8vCgkvLyBXZSBjb3VsZCBjYWxsIF9kaXNjb3ZlckNvbnRyb2xQYXJlbnRfIGluIF9hZGRDb21wb25lbnRfLCBidXQgaXQgd291bGQKCS8vIGNhdXNlIGEgbG90IG9mIHVzZWxlc3MgY2hlY2tpbmcuCgljcmVhdGVDb21wb25lbnRzOiBmdW5jdGlvbigpIHsKCQl2YXIgcmVzdWx0cyA9IHRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJdGhpcy5kaXNjb3ZlckNvbnRyb2xQYXJlbnQoKTsKCQlyZXR1cm4gcmVzdWx0czsKCX0sCglkaXNjb3ZlckNvbnRyb2xQYXJlbnQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29udHJvbFBhcmVudCA9IHRoaXMuJFt0aGlzLmNvbnRyb2xQYXJlbnROYW1lXSB8fCB0aGlzLmNvbnRyb2xQYXJlbnQ7Cgl9LAoJYWRqdXN0Q29tcG9uZW50UHJvcHM6IGZ1bmN0aW9uKGluUHJvcHMpIHsKCQkvLyBDb21wb25lbnRzIHdlIGNyZWF0ZSBoYXZlIHVzIGFzIGEgY29udGFpbmVyIGJ5IGRlZmF1bHQuCgkJaW5Qcm9wcy5jb250YWluZXIgPSBpblByb3BzLmNvbnRhaW5lciB8fCB0aGlzOwoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJLy8gY29udGFpbm1lbnQKCWNvbnRhaW5lckNoYW5nZWQ6IGZ1bmN0aW9uKGluT2xkQ29udGFpbmVyKSB7CgkJaWYgKGluT2xkQ29udGFpbmVyKSB7CgkJCWluT2xkQ29udGFpbmVyLnJlbW92ZUNvbnRyb2wodGhpcyk7CgkJfQoJCWlmICh0aGlzLmNvbnRhaW5lcikgewoJCQl0aGlzLmNvbnRhaW5lci5hZGRDb250cm9sKHRoaXMsIHRoaXMuYWRkQmVmb3JlKTsKCQl9Cgl9LAoJLy8gcGFyZW50YWdlCglwYXJlbnRDaGFuZ2VkOiBmdW5jdGlvbihpbk9sZFBhcmVudCkgewoJCWlmIChpbk9sZFBhcmVudCAmJiBpbk9sZFBhcmVudCAhPSB0aGlzLnBhcmVudCkgewoJCQlpbk9sZFBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKCQl9Cgl9LAoJLy8qIEBwdWJsaWMKCS8vIE5vdGU6IE9kZGx5LCBhIENvbnRyb2wgaXMgY29uc2lkZXJlZCBhIGRlc2NlbmRhbnQgb2YgaXRzZWxmLgoJaXNEZXNjZW5kYW50T2Y6IGZ1bmN0aW9uKGluQW5jZXN0b3IpIHsKCQl2YXIgcCA9IHRoaXM7CgkJd2hpbGUgKHAgJiYgcCE9aW5BbmNlc3RvcikgewoJCQlwID0gcC5wYXJlbnQ7CgkJfQoJCXJldHVybiBpbkFuY2VzdG9yICYmIChwID09IGluQW5jZXN0b3IpOwoJfSwKCS8qKgoJCVJldHVybnMgYWxsIGNvbnRyb2xzLgoJKi8KCWdldENvbnRyb2xzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5jb250cm9sczsKCX0sCgkvKioKCQlSZXR1cm5zIGFsbCBub24tY2hyb21lIGNvbnRyb2xzLgoJKi8KCWdldENsaWVudENvbnRyb2xzOiBmdW5jdGlvbigpIHsKCQl2YXIgcmVzdWx0cyA9IFtdOwoJCWZvciAodmFyIGk9MCwgY3M9dGhpcy5jb250cm9scywgYzsgKGM9Y3NbaV0pOyBpKyspIHsKCQkJaWYgKCFjLmlzQ2hyb21lKSB7CgkJCQlyZXN1bHRzLnB1c2goYyk7CgkJCX0KCQl9CgkJcmV0dXJuIHJlc3VsdHM7Cgl9LAoJLyoqCgkJRGVzdHJveXMgImNsaWVudCBjb250cm9scyIsIHRoZSBzYW1lIHNldCBvZiBjb250cm9scyByZXR1cm5lZCBieQoJCV9nZXRDbGllbnRDb250cm9sc18uCgkqLwoJZGVzdHJveUNsaWVudENvbnRyb2xzOiBmdW5jdGlvbigpIHsKCQl2YXIgYyQgPSB0aGlzLmdldENsaWVudENvbnRyb2xzKCk7CgkJZm9yICh2YXIgaT0wLCBjOyAoYz1jJFtpXSk7IGkrKykgewoJCQljLmRlc3Ryb3koKTsKCQl9Cgl9LAoJLy8qIEBwcm90ZWN0ZWQKCWFkZENvbnRyb2w6IGZ1bmN0aW9uKGluQ29udHJvbCwgaW5CZWZvcmUpIHsKCQkvLyBDYWxsZWQgdG8gYWRkIGFuIGFscmVhZHkgY3JlYXRlZCBjb250cm9sIHRvIHRoZSBvYmplY3QncyBjb250cm9sIGxpc3QuIEl0IGlzCgkJLy8gbm90IHVzZWQgdG8gY3JlYXRlIGNvbnRyb2xzIGFuZCBzaG91bGQgbGlrZWx5IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCgkJLy8gSXQgY2FuIGJlIG92ZXJyaWRkZW4gdG8gZGV0ZWN0IHdoZW4gY29udHJvbHMgYXJlIGFkZGVkLgoJCWlmIChpbkJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7CgkJCXZhciBpZHggPSAoaW5CZWZvcmUgPT09IG51bGwpID8gMCA6IHRoaXMuaW5kZXhPZkNoaWxkKGluQmVmb3JlKTsKCQkJdGhpcy5jb250cm9scy5zcGxpY2UoaWR4LCAwLCBpbkNvbnRyb2wpOwoJCX0gZWxzZSB7CgkJCXRoaXMuY29udHJvbHMucHVzaChpbkNvbnRyb2wpOwoJCX0KCQkvLyBXaGVuIHdlIGFkZCBhIENvbnRyb2wsIHdlIGFsc28gZXN0YWJsaXNoIGEgcGFyZW50LgoJCXRoaXMuYWRkQ2hpbGQoaW5Db250cm9sLCBpbkJlZm9yZSk7Cgl9LAoJcmVtb3ZlQ29udHJvbDogZnVuY3Rpb24oaW5Db250cm9sKSB7CgkJLy8gQ2FsbGVkIHRvIHJlbW92ZSBhIGNvbnRyb2wgZnJvbSB0aGUgb2JqZWN0J3MgY29udHJvbCBsaXN0LiBBcyB3aXRoIGFkZENvbnRyb2wgaXQKCQkvLyBjYW4gYmUgb3ZlcnJpZGRlbiB0byBkZXRlY3Qgd2hlbiBjb250cm9scyBhcmUgcmVtb3ZlZC4KCQkvLyBXaGVuIHdlIHJlbW92ZSBhIENvbnRyb2wsIHdlIGFsc28gcmVtb3ZlIGl0IGZyb20gaXRzIHBhcmVudC4KCQlpbkNvbnRyb2wuc2V0UGFyZW50KG51bGwpOwoJCXJldHVybiBlbnlvLnJlbW92ZShpbkNvbnRyb2wsIHRoaXMuY29udHJvbHMpOwoJfSwKCWluZGV4T2ZDb250cm9sOiBmdW5jdGlvbihpbkNvbnRyb2wpIHsKCQlyZXR1cm4gZW55by5pbmRleE9mKGluQ29udHJvbCwgdGhpcy5jb250cm9scyk7Cgl9LAoJaW5kZXhPZkNsaWVudENvbnRyb2w6IGZ1bmN0aW9uKGluQ29udHJvbCkgewoJCXJldHVybiBlbnlvLmluZGV4T2YoaW5Db250cm9sLCB0aGlzLmdldENsaWVudENvbnRyb2xzKCkpOwoJfSwKCWluZGV4SW5Db250YWluZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmNvbnRhaW5lci5pbmRleE9mQ29udHJvbCh0aGlzKTsKCX0sCgljbGllbnRJbmRleEluQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5jb250YWluZXIuaW5kZXhPZkNsaWVudENvbnRyb2wodGhpcyk7Cgl9LAoJY29udHJvbEF0SW5kZXg6IGZ1bmN0aW9uKGluSW5kZXgpIHsKCQlyZXR1cm4gdGhpcy5jb250cm9sc1tpbkluZGV4XTsKCX0sCgkvLyBjaGlsZHJlbgoJYWRkQ2hpbGQ6IGZ1bmN0aW9uKGluQ2hpbGQsIGluQmVmb3JlKSB7CgkJLy8gaWYgaW5CZWZvcmUgaXMgdW5kZWZpbmVkLCBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgY2hpbGQgbGlzdC4KCQkvLyBJZiBpdCdzIG51bGwsIGFkZCB0byBmcm9udCBvZiBsaXN0LCBvdGhlcndpc2UgYWRkIGJlZm9yZSB0aGUKCQkvLyBzcGVjaWZpZWQgY29udHJvbC4KCQkvLwoJCS8vIGFsbG93IGRlbGVnYXRpbmcgdGhlIGNoaWxkIHRvIGEgZGlmZmVyZW50IGNvbnRhaW5lcgoJCWlmICh0aGlzLmNvbnRyb2xQYXJlbnQgLyomJiAhaW5DaGlsZC5pc0Nocm9tZSovKSB7CgkJCS8vIHRoaXMuY29udHJvbFBhcmVudCBtaWdodCBoYXZlIGEgY29udHJvbFBhcmVudCwgYW5kIHNvIG9uOyBzZWVrIHRoZSB1bHRpbWF0ZSBwYXJlbnQKCQkJLy8gaW5CZWZvcmUgaXMgbm90IHBhc3NlZCBiZWNhdXNlIHRoYXQgY29udHJvbCB3b24ndCBiZSBpbiB0aGUgY29udHJvbFBhcmVudCdzIHNjb3BlCgkJCXRoaXMuY29udHJvbFBhcmVudC5hZGRDaGlsZChpbkNoaWxkKTsKCQl9IGVsc2UgewoJCQkvLyBOT1RFOiBhZGRDaGlsZCBkcml2ZXMgc2V0UGFyZW50LgoJCQkvLyBJdCdzIHRoZSBvcHBvc2l0ZSBmb3Igc2V0Q29udGFpbmVyLCB3aGVyZSBjb250YWluZXJDaGFuZ2VkIChpbiBDb250YWluYWJsZSkKCQkJLy8gZHJpdmVzIGFkZENvbnRyb2wuCgkJCS8vIEJlY2F1c2Ugb2YgdGhlIHdheSAncGFyZW50JyBpcyBkZXJpdmVkIGZyb20gJ2NvbnRhaW5lcicsIHRoaXMgZGlmZmVyZW5jZSBpcwoJCQkvLyBoZWxwZnVsIGZvciBpbXBsZW1lbnRpbmcgY29udHJvbFBhcmVudC4KCQkJLy8gQnkgdGhlIHNhbWUgdG9rZW4sIHNpbmNlICdwYXJlbnQnIGlzIGRlcml2ZWQgZnJvbSAnY29udGFpbmVyJywgc2V0UGFyZW50IGlzCgkJCS8vIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgY2xpZW50IGNvZGUuIFRoZXJlZm9yZSwgdGhlIGxhY2sgb2YgcGFyYWxsZWxpc20KCQkJLy8gc2hvdWxkIGJlIHByaXZhdGUgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KCQkJLy8gU2V0IHRoZSBjaGlsZCdzIHBhcmVudCBwcm9wZXJ0eSB0byB0aGlzCgkJCWluQ2hpbGQuc2V0UGFyZW50KHRoaXMpOwoJCQkvLyB0cmFjayBpbiBjaGlsZHJlbiBhcnJheQoJCQlpZiAoaW5CZWZvcmUgIT09IHVuZGVmaW5lZCkgewoJCQkJdmFyIGlkeCA9IChpbkJlZm9yZSA9PT0gbnVsbCkgPyAwIDogdGhpcy5pbmRleE9mQ2hpbGQoaW5CZWZvcmUpOwoJCQkJdGhpcy5jaGlsZHJlbi5zcGxpY2UoaWR4LCAwLCBpbkNoaWxkKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuY2hpbGRyZW4ucHVzaChpbkNoaWxkKTsKCQkJfQoJCX0KCX0sCglyZW1vdmVDaGlsZDogZnVuY3Rpb24oaW5DaGlsZCkgewoJCXJldHVybiBlbnlvLnJlbW92ZShpbkNoaWxkLCB0aGlzLmNoaWxkcmVuKTsKCX0sCglpbmRleE9mQ2hpbGQ6IGZ1bmN0aW9uKGluQ2hpbGQpIHsKCQlyZXR1cm4gZW55by5pbmRleE9mKGluQ2hpbGQsIHRoaXMuY2hpbGRyZW4pOwoJfSwKCWxheW91dEtpbmRDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5sYXlvdXQpIHsKCQkJdGhpcy5sYXlvdXQuZGVzdHJveSgpOwoJCX0KCQl0aGlzLmxheW91dCA9IGVueW8uY3JlYXRlRnJvbUtpbmQodGhpcy5sYXlvdXRLaW5kLCB0aGlzKTsKCQlpZiAodGhpcy5nZW5lcmF0ZWQpIHsKCQkJdGhpcy5yZW5kZXIoKTsKCQl9Cgl9LAoJZmxvdzogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMubGF5b3V0KSB7CgkJCXRoaXMubGF5b3V0LmZsb3coKTsKCQl9Cgl9LAoJLy8gQ0FWRUFUOiBjdXJyZW50bHkgd2UgdXNlIHRoZSBlbnRyeSBwb2ludCBmb3IgYm90aAoJLy8gcG9zdC1yZW5kZXIgbGF5b3V0IHdvcmsgKmFuZCogcG9zdC1yZXNpemUgbGF5b3V0IHdvcmsuCglyZWZsb3c6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmxheW91dCkgewoJCQl0aGlzLmxheW91dC5yZWZsb3coKTsKCQl9Cgl9LAoJLyoqCgkJQ2FsbCBhZnRlciB0aGlzIGNvbnRyb2wgaGFzIGJlZW4gcmVzaXplZCB0byBhbGxvdyBpdCB0byBwcm9jZXNzIHRoZSBzaXplIGNoYW5nZS4KCQlUbyByZXNwb25kIHRvIGEgcmVzaXplLCBvdmVycmlkZSBfcmVzaXplSGFuZGxlcl8gaW5zdGVhZC4KCSovCgkvLyBzeW50YWN0aWMgc3VnYXIgZm9yICd3YXRlcmZhbGwoIm9ucmVzaXplIiknCglyZXNpemVkOiBmdW5jdGlvbigpIHsKCQl0aGlzLndhdGVyZmFsbCgib25yZXNpemUiLCBlbnlvLlVpQ29tcG9uZW50Ll9yZXNpemVGbGFncyk7CgkJdGhpcy53YXRlcmZhbGwoIm9ucG9zdHJlc2l6ZSIsIGVueW8uVWlDb21wb25lbnQuX3Jlc2l6ZUZsYWdzKTsKCX0sCgkvLyogQHByb3RlY3RlZAoJcmVzaXplSGFuZGxlcjogZnVuY3Rpb24oKSB7CgkJLy8gRklYTUU6IG9uY2Ugd2UgYXJlIGluIHRoZSBidXNpbmVzcyBvZiByZWZsb3dpbmcgbGF5b3V0cyBvbiByZXNpemUsIHRoZW4gd2UgaGF2ZSBhbgoJCS8vIGluc2lkZS9vdXRzaWRlIHByb2JsZW06IHNvbWUgc2NlbmFyaW9zIHdpbGwgbmVlZCB0byByZWZsb3cgYmVmb3JlIGNoaWxkCgkJLy8gY29udHJvbHMgcmVmbG93LCBhbmQgc29tZSB3aWxsIG5lZWQgdG8gcmVmbG93IGFmdGVyLiBFdmVuIG1vcmUgY29tcGxleCBzY2VuYXJpb3MKCQkvLyBoYXZlIGNpcmN1bGFyIGRlcGVuZGVuY2llcywgYW5kIGNhbiByZXF1aXJlIG11bHRpcGxlIHBhc3NlcyBvciBvdGhlciByZXNvbHV0aW9uLgoJCS8vIFdoZW4gd2UgY2FuIHJlbHkgb24gQ1NTIHRvIG1hbmFnZSByZWZsb3dzIHdlIGRvIG5vdCBoYXZlIHRoZXNlIHByb2JsZW1zLgoJCXRoaXMucmVmbG93KCk7Cgl9LAoJLyoqCgkJU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCBteSBkZXNjZW5kZW50cy4KCSovCgl3YXRlcmZhbGxEb3duOiBmdW5jdGlvbihuYW1lLCBldmVudCwgc2VuZGVyKSB7CgkJZXZlbnQgPSBldmVudCB8fCB7fTsKCQkvLyBOb3RlOiBDb250cm9scyB3aWxsIGdlbmVyYWxseSBiZSBib3RoIGluIGEgJCBoYXNoIGFuZCBhIGNoaWxkIGxpc3Qgc29tZXdoZXJlLgoJCS8vIEF0dGVtcHQgdG8gYXZvaWQgZHVwbGljYXRlZCBtZXNzYWdlcyBieSBzZW5kaW5nIG9ubHkgdG8gY29tcG9uZW50cyB0aGF0IGFyZSBub3QKCQkvLyBVaUNvbXBvbmVudCwgYXMgdGhvc2UgY29tcG9uZW50cyBhcmUgZ3VhcmFudGVlZCBub3QgdG8gYmUgaW4gYSBjaGlsZCBsaXN0LgoJCS8vIE1heSBjYXVzZSBhIHByb2JsZW0gaWYgdGhlcmUgaXMgYSBzY2VuYXJpbyB3aGVyZSBhIFVpQ29tcG9uZW50IG93bnMgYSBwdXJlCgkJLy8gQ29tcG9uZW50IHRoYXQgaW4gdHVybiBvd25zIENvbnRyb2xzLgoJCS8vCgkJLy8gd2F0ZXJmYWxsIHRvIGFsbCBwdXJlIGNvbXBvbmVudHMKCQlmb3IgKHZhciBuIGluIHRoaXMuJCkgewoJCQlpZiAoISh0aGlzLiRbbl0gaW5zdGFuY2VvZiBlbnlvLlVpQ29tcG9uZW50KSkgewoJCQkJdGhpcy4kW25dLndhdGVyZmFsbChuYW1lLCBldmVudCwgc2VuZGVyKTsKCQkJfQoJCX0KCQkvLyB3YXRlcmZhbGwgdG8gbXkgY2hpbGRyZW4KCQlmb3IgKHZhciBpPTAsIGNzPXRoaXMuY2hpbGRyZW4sIGM7IChjPWNzW2ldKTsgaSsrKSB7CgkJCS8vIERvIG5vdCBzZW5kIHtzaG93aW5nT25seTogdHJ1ZX0gZXZlbnRzIHRvIGhpZGRlbiBjb250cm9scy4gVGhpcyBmbGFnIGlzIHNldCBmb3IgcmVzaXplIGV2ZW50cwoJCQkvLyB3aGljaCBhcmUgYnJvYWRjYXN0IGZyb20gd2l0aGluIHRoZSBmcmFtZXdvcmsuIFRoaXMgc2F2ZXMgYSAqbG90KiBvZiB1bm5lY2Vzc2FyeSBsYXlvdXQuCgkJCS8vIFRPRE86IE1heWJlIHJlbWVtYmVyIHRoYXQgd2UgZGlkIHRoaXMsIGFuZCByZS1zZW5kIHRob3NlIG1lc3NhZ2VzIG9uIHNldFNob3dpbmcodHJ1ZSk/CgkJCS8vIE5vIG9idmlvdXMgcHJvYmxlbXMgd2l0aCBpdCBhcy1pcywgdGhvdWdoCgkJCWlmIChjLnNob3dpbmcgfHwgIShldmVudCAmJiBldmVudC5zaG93aW5nT25seSkpIHsKCQkJCWMud2F0ZXJmYWxsKG5hbWUsIGV2ZW50LCBzZW5kZXIpOwoJCQl9CgkJfQoJfSwKCWdldEJ1YmJsZVRhcmdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX2J1YmJsZV90YXJnZXQgfHwgdGhpcy5wYXJlbnQgfHwgdGhpcy5vd25lcjsKCX0KfSk7CgplbnlvLmNyZWF0ZUZyb21LaW5kID0gZnVuY3Rpb24oaW5LaW5kLCBpblBhcmFtKSB7Cgl2YXIgQ3RvciA9IGluS2luZCAmJiBlbnlvLmNvbnN0cnVjdG9yRm9yS2luZChpbktpbmQpOwoJaWYgKEN0b3IpIHsKCQlyZXR1cm4gbmV3IEN0b3IoaW5QYXJhbSk7Cgl9Cn07CgovLwovLyBEZWZhdWx0IG93bmVyIGZvciBvd25lcmxlc3MgVWlDb21wb25lbnRzIHRvIGFsbG93IG5vdGlmeWluZyBzdWNoIFVpQ29tcG9uZW50cwovLyBvZiBpbXBvcnRhbnQgc3lzdGVtIGV2ZW50cyBsaWtlIHdpbmRvdyByZXNpemUuCi8vCi8vIE5PVEU6IE93bmVybGVzcyBVaUNvbXBvbmVudHMgd2lsbCBub3QgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgdW5sZXNzIGV4cGxpY2l0bHkKLy8gZGVzdHJveWVkLCBhcyB0aGV5IHdpbGwgYmUgcmVmZXJlbmNlZCBieSBfZW55by5tYXN0ZXJfLgovLwplbnlvLm1hc3RlciA9IG5ldyBlbnlvLkNvbXBvbmVudCh7CgluYW1lOiAibWFzdGVyIiwKCW5vdEluc3RhbmNlT3duZXI6IHRydWUsCglldmVudEZsYWdzOiB7c2hvd2luZ09ubHk6IHRydWV9LCAvLyBkb24ndCB3YXRlcmZhbGwgdGhlc2UgZXZlbnRzIGludG8gaGlkZGVuIGNvbnRyb2xzCglnZXRJZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICcnOwoJfSwKCWlzRGVzY2VuZGFudE9mOiBlbnlvLm5vcCwKCWJ1YmJsZTogZnVuY3Rpb24oaW5FdmVudE5hbWUsIGluRXZlbnQsIGluU2VuZGVyKSB7CgkJLy9lbnlvLmxvZygibWFzdGVyIGV2ZW50OiAiICsgaW5FdmVudE5hbWUpOwoJCWlmIChpbkV2ZW50TmFtZSA9PSAib25yZXNpemUiKSB7CgkJCS8vIFJlc2l6ZSBpcyBzcGVjaWFsOyB3YXRlcmZhbGwgdGhpcyBtZXNzYWdlLgoJCQkvLyBUaGlzIHdvcmtzIGJlY2F1c2UgbWFzdGVyIGlzIGEgQ29tcG9uZW50LCBzbyBpdCB3YXRlcmZhbGxzCgkJCS8vIHRvIGl0cyBvd25lZCBDb21wb25lbnRzIChpLmUuLCBtYXN0ZXIgaGFzIG5vIGNoaWxkcmVuKS4KCQkJZW55by5tYXN0ZXIud2F0ZXJmYWxsRG93bigib25yZXNpemUiLCB0aGlzLmV2ZW50RmxhZ3MpOwoJCQllbnlvLm1hc3Rlci53YXRlcmZhbGxEb3duKCJvbnBvc3RyZXNpemUiLCB0aGlzLmV2ZW50RmxhZ3MpOwoJCX0gZWxzZSB7CgkJCS8vIEFsbCBvdGhlciB0b3AtbGV2ZWwgZXZlbnRzIGFyZSBzZW50IG9ubHkgdG8gaW50ZXJlc3RlZCBTaWduYWwKCQkJLy8gcmVjZWl2ZXJzLgoJCQllbnlvLlNpZ25hbHMuc2VuZChpbkV2ZW50TmFtZSwgaW5FdmVudCk7CgkJfQoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/ViewController.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJX2VueW8uVmlld0NvbnRyb2xsZXJfIGlzIGFuIGFic3RyYWN0IGtpbmQgZGVzaWduZWQgZm9yIHVzZSBpbiBhCgkJdGlnaHRseS1jb3VwbGVkIGNvbnRyb2xsZXIgYW5kIHZpZXcsIGluIHdoaWNoIHRoZSBjb250cm9sbGVyIG93bnMKCQl0aGUgdmlldyBhbmQgbWFpbnRhaW5zIGl0cyBzdGF0ZSBhbmQgbGlmZWN5Y2xlLgoJKi8KCWVueW8ua2luZCh7CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQluYW1lOiAiZW55by5WaWV3Q29udHJvbGxlciIsCgoJCS8vKkBwdWJsaWMKCQlraW5kOiAiZW55by5Db250cm9sbGVyIiwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGlzIG1heSBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBraW5kLCBhIGNvbnN0cnVjdG9yIGZvciBhIGtpbmQsCgkJCW9yIGFuIG9iamVjdCBsaXRlcmFsIGRlZmluaW5nIHRoZSB2aWV3IHN0cnVjdHVyZSB0byBiZSBpbnN0YW5jZWQuCgkJCU9uY2UgdGhlIHZpZXcgY29udHJvbGxlciBoYXMgYmVlbiBpbml0aWFsaXplZCwgdGhpcyBwcm9wZXJ0eSB3aWxsCgkJCWJlIGEgcmVmZXJlbmNlIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgdmlldyBvd25lZCBieSB0aGlzIGNvbnRyb2xsZXIuCgkJKi8KCQl2aWV3OiBudWxsLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgdGFyZ2V0IERPTSBlbGVtZW50IGluIHdoaWNoIHRvIHJlbmRlcgoJCQl0aGUgY29udHJvbGxlcidzIHZpZXcuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgc2V0IHRvIHRoZSBzcGVjaWFsCgkJCWlkZW50aWZpZXI6IGAiZG9jdW1lbnQuYm9keSJgLiBJdCBtYXkgYWxzbyBiZSBzZXQgdG8gYSB1bmlxdWUgRE9NCgkJCWVsZW1lbnQgX19pZF9fIGF0dHJpYnV0ZS4KCQkqLwoJCXJlbmRlclRhcmdldDogImRvY3VtZW50LmJvZHkiLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgUFJPUEVSVElFUwoKCQkvLypAcHJvdGVjdGVkCgkJX2lzX3ZpZXdfY29udHJvbGxlcjogdHJ1ZSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gQ09NUFVURUQgUFJPUEVSVElFUwoKCQkvLypAcHJvdGVjdGVkCgkJLyoqCgkJCU9uIG9iamVjdCBpbml0aWFsaXphdGlvbiwgZmluZHMgb3IgY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUKCQkJa2luZCBmb3IgdGhlIHZpZXcgb2YgdGhpcyBjb250cm9sbGVyLgoJCSovCgkJX3ZpZXdfa2luZDogZW55by5jb21wdXRlZChmdW5jdGlvbiAoKSB7CgkJCS8vIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIGFzIHN1cHBsaWVkIGJ5IHRoZSBjb250cm9sbGVyJ3MKCQkJLy8gb3duIGRlZmluaXRpb24KCQkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJCS8vIGlmIGl0IGlzIGEgZnVuY3Rpb24sIHdlIGFzc3VtZSBpdCBpcyBhIGNvbnN0cnVjdG9yCgkJCWlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgdmlldykgewoJCQkJcmV0dXJuIHZpZXc7CgkJCX0KCQkJLy8gaWYgaXQgaXMgYW4gb2JqZWN0IGxpdGVyYWwsIHdlIGFzc3VtZSBpdCBpcyBhIGRlZmluaXRpb24KCQkJLy8gYW5kIG5vdGUgdGhhdCB3ZSBjcmVhdGUgYW4gYW5vbnltb3VzIGtpbmQgZm9yIHRoZSB2aWV3CgkJCS8vIHNvIGl0IGhhcyBhbGwgb2YgdGhlIG5vcm1hbCBzZXR1cCBvZiBhIGZ1bGwga2luZAoJCQlpZiAoIm9iamVjdCIgPT09IHR5cGVvZiB2aWV3KSB7CgkJCQlpZiAoIXZpZXcubmFtZSkgewoJCQkJCXZpZXcubmFtZSA9IHRoaXMuX21ha2Vfdmlld19uYW1lKCk7CgkJCQl9CgkJCQlyZXR1cm4gZW55by5raW5kKHZpZXcpOwoJCQl9CgkJCS8vIGlmIGl0IGlzIGEgc3RyaW5nLCB3ZSBhdHRlbXB0IHRvIGZpbmQgdGhlIGNvbnN0cnVjdG9yCgkJCS8vIGl0IHNob3VsZCBiZSBwb2ludGluZyB0bwoJCQlpZiAoInN0cmluZyIgPT09IHR5cGVvZiB2aWV3KSB7CgkJCQl2aWV3ID0gZW55by5nZXRQYXRoKHZpZXcpOwoJCQkJaWYgKCF2aWV3LnByb3RvdHlwZS5raW5kTmFtZSkgewoJCQkJCXZpZXcucHJvdG90eXBlLmtpbmROYW1lID0gdGhpcy5fbWFrZV92aWV3X25hbWUoKTsKCQkJCX0KCQkJCXJldHVybiB2aWV3OwoJCQl9CgkJCS8vIGlmIHdlIGdldCBoZXJlLCB3ZSBoYWQgbm90aGluZywgYW5kIGluIHRoYXQgY2FzZSB3ZQoJCQkvLyBjYW4ndCBkbyBhbnl0aGluZwoJCQl0aHJvdyB0aGlzLmtpbmROYW1lICsgIiBjYW5ub3QgaW5pdGlhbGl6ZSB3aXRob3V0IGEgdmFsaWQgdmlldyBkZWZpbmVkIjsKCQl9LCB7Y2FjaGVkOiB0cnVlfSksCgoJCS8vKkBwcm90ZWN0ZWQKCQkvKioKCQkJRmluZHMgdGhlIGFwcHJvcHJpYXRlIGZvcm0gb2YgdGhlIHJlbmRlciB0YXJnZXQuCgkJKi8KCQlfcmVuZGVyX3RhcmdldDogZW55by5jb21wdXRlZChmdW5jdGlvbiAoKSB7CgkJCS8vIHRoZSBvcmlnaW5hbCBzdXBwbGllZCB2YXJpYWJsZSBmb3IgdGhlIHJlbmRlciB0YXJnZXQKCQkJdmFyIHRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0OwoJCQkvLyB3ZSBhdHRlbXB0IHRvIGZpbmQgdGhlIGFjdHVhbCB0YXJnZXQgbm9kZQoJCQl0YXJnZXQgPSBlbnlvLmRvbS5ieUlkKHRhcmdldCkgfHwgZW55by5nZXRQYXRoKHRhcmdldCk7CgkJCWlmICh0YXJnZXQpIHsKCQkJCXJldHVybiB0YXJnZXQ7CgkJCX0KCQkJLy8gaWYgd2UgY2FuJ3QgZmluZCB0aGUgdGFyZ2V0LCB3ZSBjYW4ndCByZW5kZXIgaXQgaW50byBhbnl0aGluZzsKCQkJLy8gYmV0dGVyIHRvIGZpbmQgb3V0IG5vdwoJCQl0aHJvdyB0aGlzLmtpbmROYW1lICsgIiBjYW5ub3QgZmluZCB0aGUgcmVuZGVyIHRhcmdldDogIiArIHRoaXMucmVuZGVyVGFyZ2V0OwoJCX0sICJyZW5kZXJUYXJnZXQiLCB7Y2FjaGVkOiB0cnVlfSksCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBNRVRIT0RTCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJUmVuZGVycyB0aGUgY29udHJvbGxlcidzIHZpZXcgaW50byB0aGUgRE9NLiBJZiB0aGUgdmlldyBpcyBhbHJlYWR5CgkJCWluIHRoZSBET00sIHRoZSBlbGVtZW50IGlzIHJlLXJlbmRlcmVkIGluIHBsYWNlLgoJCSovCgkJcmVuZGVyOiBmdW5jdGlvbiAoKSB7CgkJCS8vIGluc3RhbmNlIG9mIHRoZSB2aWV3CgkJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCQl2YXIgdGFyZ2V0ID0gdGhpcy5nZXQoIl9yZW5kZXJfdGFyZ2V0Iik7CgkJCS8vIGlmIHRoZSB2aWV3IGFscmVhZHkgaGFzIGEgRE9NIG5vZGUsIHdlIGRvbid0IG5lZWQgdG8KCQkJLy8gYXR0ZW1wdCB0byByZS1pbnNlcnQgaXQKCQkJaWYgKHZpZXcuaGFzTm9kZSgpKSB7CgkJCQl2aWV3LnJlbmRlcigpOwoJCQl9IGVsc2UgewoJCQkJLy8gb3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIHJlbmRlciBpdCBpbnRvIHRoZSBET00KCQkJCXZpZXcucmVuZGVySW50byh0YXJnZXQpOwoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlJbW1lZGlhdGVseSByZW5kZXJzIHRoZSBjb250cm9sbGVyJ3MgdmlldyBpbnRvIHRoZSBwYXNzZWQtaW4gdGFyZ2V0CgkJCShlaXRoZXIgYSBub2RlIHJlZmVyZW5jZSBvciBzIHN0cmluZyByZXByZXNlbnRpbmcgYSBub2RlIGlkIGF0dHJpYnV0ZQoJCQlpbiB0aGUgRE9NKS4KCQkqLwoJCXJlbmRlckludG86IGZ1bmN0aW9uICh0YXJnZXQpIHsKCQkJLy8gdXBkYXRlIHRoZSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgY29udHJvbGxlcgoJCQl0aGlzLnNldCgicmVuZGVyVGFyZ2V0IiwgdGFyZ2V0KTsKCQkJLy8gbm93IHdlIHJlbmRlciBhcyB1c3VhbAoJCQl0aGlzLnJlbmRlcigpOwoJCX0sCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBNRVRIT0RTCgoJCS8vKkBwcm90ZWN0ZWQKCQljb25zdHJ1Y3RlZDogZnVuY3Rpb24gKCkgewoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCQkvLyBlbnN1cmUgd2UgaGF2ZSBjcmVhdGVkIHRoZSB2aWV3IGluc3RhbmNlLCBub3RlIHRoYXQKCQkJLy8gdGhpcyBpcyBkb25lIGhlcmUgX3ByaW9yXyB0byBtaXhpbiBpbml0aWFsaXphdGlvbgoJCQkvLyAod2hpY2ggdGFrZXMgcGxhY2UgYWZ0ZXIgYWxsIGNvbnN0cnVjdGlvbiBpcyBkb25lKQoJCQkvLyBidXQgdGhpcyBhbGxvd3Mgc3Via2luZHMgdG8gb3ZlcmxvYWQgdGhlIGNvbnN0cnVjdGVkCgkJCS8vIG1ldGhvZCB0byBjb250cm9sIHRoZSBmbG93CgkJCXRoaXMuX2NyZWF0ZV92aWV3KCk7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCS8qKgoJCQlDcmVhdGVzIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGNvbnRyb2xsZXIncyB2aWV3LiBTaG91bGQKCQkJYmUgb3ZlcmxvYWRlZCBmb3Igc3BlY2lhbCBiZWhhdmlvcnMuCgkJKi8KCQlfY3JlYXRlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKCQkJLy8gcmV0cmlldmUgdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdmlldyBhbmQgaW1tZWRpYXRlbHkKCQkJLy8gaW5zdGFuY2UgaXQgd2hpbGUgYWxzbyB1cGRhdGluZyB0aGUgX3ZpZXdfIHByb3BlcnR5IHRvCgkJCS8vIHRoZSByZWZlcmVuY2UgZm9yIHRoaXMgbmV3IHZpZXcKCQkJdGhpcy5zZXQoInZpZXciLCBuZXcgdGhpcy5nZXQoIl92aWV3X2tpbmQiKSk7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCV9tYWtlX3ZpZXdfbmFtZTogZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gZW55by51aWQoIl92aWV3X2NvbnRyb2xsZXJfdmlld18iKTsKCQl9CgoJfSk7Cgp9KGVueW8pKTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/data/Collection.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGhlIGBlbnlvLkNvbGxlY3Rpb25gIF9raW5kXyBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggX2FycmF5c18gb2YgYGVueW8uTW9kZWxzYC4KCQlPdXQgb2YgdGhlIGJveCB0aGV5IHdvcmsgd2l0aCBgdG9NYW55YCBfcmVsYXRpb25zXyBiZXR3ZWVuIF9tb2RlbHNfIHdpdGggYSBfZGVmaW5lZCBzY2hlbWFfLgoJCVRoZXkgaGF2ZSB0aGVpciBvd24gZGVmYXVsdCBtZWNoYW5pc21zIGZvciByZXRyaWV2aW5nIGFycmF5cyBvZiBkYXRhIGFzIHdlbGwgYXMgZmlsdGVyaW5nCgkJaXRzIGNvbnRlbnQuIFRoZXkgaGF2ZSB0aGUgYWJpbGl0eSBvZiBiZWluZyB1c2VkIGFzIGFuIGV4cG9zZWQgX2NvbnRyb2xsZXJfIG9yIGFuIGF1dG9tYXRpY2FsbHkKCQlnZW5lcmF0ZWQgcmVsYXRpb25hbCBjb250YWluZXIgZGVwZW5kaW5nIG9uIHlvdXIgbmVlZC4gTGlrZSB0aGUgb3RoZXIgY29tcG9uZW50cyBvZiB0aGUgZGF0YQoJCWxheWVyIGluIF9lbnlvXyBpdCBkZWZhdWx0cyB0byBmdW5jdGlvbmluZyB3aXRoIHR5cGljYWwgX1JFU1RfIHJlcXVlc3RzLgoKCQlbc2VlIGVueW8uTW9kZWxdKCMpLCBbc2VlIGVueW8uU3RvcmVdKCMpLCBbc2VlIGVueW8uU291cmNlXSgjKQoJKi8KCWVueW8ua2luZCh7CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQluYW1lOiAiZW55by5Db2xsZWN0aW9uIiwKCgkJLy8qQHB1YmxpYwoJCWtpbmQ6ICJlbnlvLkNvbnRyb2xsZXIiLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUEgY29sbGVjdGlvbiB1c2VzIHRoZSBgbW9kZWxgIHByb3BlcnR5IHRvIGtub3cgd2hhdCBjb25zdHJ1Y3RvcgoJCQl0byB1c2Ugd2hlbiBfZGF0YV8gaXMgaGFuZGVkIHRvIGl0LiBJZiBhbiBhcnJheSBvZiByZWNvcmRzIGFyZQoJCQlhZGRlZCB0aGF0IGFyZSBub3JtYWwgZGF0YSBoYXNoZXMgaXQgd2lsbCBjb252ZXJ0IHRoZW0gdXNpbmcgdGhpcwoJCQlfa2luZF8uIEl0IGNhbiBiZSBhIF9zdHJpbmdfIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB0byBhIF9jb25zdHJ1Y3Rvcl8KCQkJb3IgYSBfY29uc3RydWN0b3JfIGRpcmVjdGx5LgoJCSovCgkJbW9kZWw6ICJlbnlvLk1vZGVsIiwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlMaWtlIGBlbnlvLk1vZGVsYCBhbiBgZW55by5Db2xsZWN0aW9uYCBoYXMgc2V2ZXJhbCBzdGF0dXNlcyBpdCB3aWxsCgkJCXNldCBkZXBlbmRpbmcgb24gaXRzIGN1cnJlbnQgYWN0aW9uLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgYXZhaWxhYmxlCgkJCW9wdGlvbnMgZm9yIHN0YXR1cy4KCgkJCS0gQlVTWS5GRVRDSElORwoJCQktIEJVU1kuREVTVFJPWUlORwoJCQktIENMRUFOCgkJCS0gRVJST1IuU09VUkNFCgkJCS0gRVJST1IuUkVTUE9OU0UKCQkJLSBFUlJPUi5UWVBFCgoJCQlbc2VlIGVueW8uTW9kZWwuc3RhdHVzXSgjKQoJCSovCgkJc3RhdHVzOiBlbnlvLk1vZGVsLkNMRUFOLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIF9jb2xsZWN0aW9uXy4KCQkqLwoJCWxlbmd0aDogMCwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlVc2VkIGJ5IHRoZSBgZW55by5Tb3VyY2VgIGluIHRoZSBhcHBsaWNhdGlvbiB0byBnZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUKCQkJcmVxdWVzdC4gQnkgZGVmYXVsdCBpdCB1c2VzIGEgc2ltcGxlIF9SRVNUXyBzY2hlbWUuIFRoZSBgdXJsYCBpcyBhIHN0YXRpYwoJCQlfc3RyaW5nXyB0aGF0IHdpbGwgYmUgcG9zdC1maXhlZCB0byB0aGUgcm9vdCBkb21haW4gZm9yIHRoZSBgZW55by5Tb3VyY2VgLgoJCQlJbiBtb3JlIGNvbXBsZXggc2V0dXBzIFtzZWUgYHF1ZXJ5YF0oIykgZm9yIG92ZXJsb2FkaW5nIGltcGxpY2F0aW9ucyBhbmQKCQkJYWRkaW5nIGR5bmFtaWMgYHVybGAgaGFuZGxpbmcgcG9zc2liaWxpdGllcy4KCQkqLwoJCXVybDogIiIsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQSBgcmVsYXRpb25gIGlzIGFuIG9wdGlvbmFsIF9yZWxhdGlvbmFsXyBkZWZpbml0aW9uIG9iamVjdCBhbmQgbXVzdCBiZSBvZgoJCQl0aGUgdHlwZSBgZW55by50b09uZWAgKFtzZWUgZW55by50b09uZV0oIykpIGFzIGRlZmluZWQgaW4gdGhlIGBlbnlvLk1vZGVsYAoJCQlkb2N1bWVudGF0aW9uLiBJZiBhIGByZWxhdGlvbktleWAgaXMgZGVmaW5lZCBpdCB3aWxsIGtub3cgdG8gd2F0Y2ggZm9yIHRoZQoJCQlfdmFsdWUgY2hhbmdlXyBub3RpZmljYXRpb25zIGZyb20gdGhlIHJlbGF0ZWQgX21vZGVsXyBhbmQgdXBkYXRlIGFjY29yZGluZ2x5LgoJCSovCgkJcmVsYXRpb246IG51bGwsCgoJCS8vKkBwdWJsaWMKCQlldmVudHM6IHsKCQkJb25Nb2RlbENoYW5nZWQ6ICIiLAoJCQlvbk1vZGVsQWRkZWQ6ICIiLAoJCQlvbk1vZGVsc0FkZGVkOiAiIiwKCQkJb25Nb2RlbFJlbW92ZWQ6ICIiLAoJCQlvbk1vZGVsc1JlbW92ZWQ6ICIiLAoJCQlvbk1vZGVsRGVzdHJveWVkOiAiIgoJCX0sCgoJCS8vKkBwdWJsaWMKCQloYW5kbGVyczogewoJCQlvbkNoYW5nZTogIl9tb2RlbENoYW5nZWQiLAoJCQlvbkRlc3Ryb3k6ICJfbW9kZWxEZXN0cm95ZWQiCgkJfSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIFBST1BFUlRJRVMKCgkJLy8qQHByb3RlY3RlZAoJCV9zdG9yZTogbnVsbCwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gQ09NUFVURUQgUFJPUEVSVElFUwoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRoaXMgY29tcHV0ZWQgcHJvcGVydHkgcmVwcmVzZW50cyB0aGUgdW5kZXJseWluZyBhcnJheSBvZiBfbW9kZWxzXy4KCQkJVGhlIGBkYXRhYCBwcm9wZXJ0eSBtYXkgYmUgc2V0IGRpcmVjdGx5IC0gYnV0IGl0IHdpbGwgYXV0b21hdGljYWxseQoJCQlyZXBsYWNlIGFsbCBvZiB0aGUgY3VycmVudCBjb250ZW50IChpZiBhbnkpLiBbU2VlIGFkZF0oIykgaWYgdGhlCgkJCWRlc2lyZSBpcyBub3QgdG8gcmVwbGFjZSBidXQgZXh0ZW5kIHRoZSBjdXJyZW50IGRhdGFzZXQuIFRoaXMKCQkJX2NvbXB1dGVkIHByb3BlcnR5XyBtYXkgYmUgb3ZlcmxvYWRlZCBpbiBtb3JlIGNvbXBsZXggc2NlbmFyaW9zCgkJCXJlcXVpcmluZyBmaWx0ZXJpbmcgYW5kIGNvbmRpdGlvbmFsbHkgc3VwcGxpZWQgZGF0YXNldHMuCgkJKi8KCQlkYXRhOiBlbnlvLmNvbXB1dGVkKGZ1bmN0aW9uIChkYXRhKSB7CgkJCWlmIChkYXRhKSB7CgkJCQl0aGlzLnJlbW92ZUFsbCgpOwoJCQkJdGhpcy5hZGQoZGF0YSk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gdGhpcy5fc3RvcmU7CgkJCX0KCQl9LCAibGVuZ3RoIiwge2NhY2hlZDogdHJ1ZSwgZGVmZXI6IHRydWV9KSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlVc2VkIGJ5IGBlbnlvLlNvdXJjZWAgdG8gZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIHJlcXVlc3QgZm9yCgkJCWBmZXRjaGluZ2AuIE1heSBiZSBvdmVybG9hZGVkIHRvIHByb2R1Y2UgZHluYW1pYyBfcXVlcmllc18uCgkJKi8KCQlxdWVyeTogZW55by5jb21wdXRlZChmdW5jdGlvbiAoKSB7CgkJCXJldHVybiB0aGlzLnVybCB8fCB0aGlzLm1vZGVsLnByb3RvdHlwZS5nZXQoInF1ZXJ5Iik7CgkJfSksCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBNRVRIT0RTCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQ2FsbGVkIGJ5IHRoZSBgZW55by5Tb3VyY2VgIGZvciB0aGUgYXBwbGljYXRpb24gYW5kIHVzZWQgdG8KCQkJYnVpbGQgcXVlcnkgcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgYXBwbGllZCBhcyBhIHF1ZXJ5LXN0cmluZwoJCQl0byB0aGUgcmVzdWx0aW5nIHJlcXVlc3QuIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgoJCQlUbyBhZGQgb3IgbW9kaWZ5IHBhcmFtZXRlcnMgYWxyZWFkeSBzZXQgZm9yIHRoZSBxdWVyeSwgdXNlIHRoZQoJCQlfb3B0aW9ucy5xdWVyeVBhcmFtc18gaGFzaCAod2lsbCBhbHdheXMgZXhpc3QpLiBUaGVzZSBvcHRpb25zCgkJCWFyZSBrZXktdmFsdWUgcGFpcnMgdGhhdCB3aWxsIGJlIHNlcmlhbGl6ZWQgYWNjb3JkaW5nIHRvIHRoZQoJCQlgcmVxdWVzdEtpbmRgIG9mIHRoZSBgZW55by5Tb3VyY2VgLgoJCSovCgkJYnVpbGRRdWVyeVBhcmFtczogZnVuY3Rpb24gKG1vZGVsLCBvcHRpb25zKSB7CgkJCS8vIGxvb2sgYXQgb3B0aW9ucy5xdWVyeVBhcmFtcyBmb3IgYSBoYXNoIHRvIGFkZC10byBvciBtb2RpZnkKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVJldHVybnMgYW4gYXJyYXkgb2YgYWxsIG9mIHRoZSByYXcgZGF0YXNldHMgZm9yIGFueSByZWNvcmRzCgkJCWluIHRoZSBfY29sbGVjdGlvbl8uIE1heSBiZSBvdmVybG9hZGVkIHRvIHByb3BlcnRseSBzdXBwbHkKCQkJc3Vic2V0cyBvZiBkYXRhIG9uIHJlcXVlc3QuIE9wdGlvbmFsIHBhcmFtZXRlciBgbG9jYWxgIHdpbGwKCQkJZW5zdXJlIHRoYXQgYWxsIF9tb2RlbHNfIHVzZSB0aGVpciBsb2NhbCBrZXlzIChkZWZhdWx0IGlzIHRvCgkJCXVzZSByZW1vdGUga2V5cyBpZiB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZSBzY2hlbWEpLgoJCSovCgkJcmF3OiBmdW5jdGlvbiAobG9jYWwpIHsKCQkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChtb2RlbCkgewoJCQkJcmV0dXJuIG1vZGVsLnJhdyhsb2NhbCk7CgkJCX0pOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJUmV0dXJucyBhIEpTT04gc3RyaW5naWZpZWQgdmVyc2lvbiBvZiB0aGUgX2NvbGxlY3Rpb25fIGFycmF5LgoJCQlPcHRpb25hbCBgbG9jYWxgIHBhcmFtZXRlciB3aWxsIGVuc3VyZSB0aGF0IF9tb2RlbHNfIHVzZSB0aGVpcgoJCQlsb2NhbCBrZXlzIChkZWZhdWx0IGlzIHRvIHVzZSByZW1vdGUga2V5cyBpZiBkZWZpbmVkIGluIHRoZSBzY2hlbWEpLgoJCSovCgkJdG9KU09OOiBmdW5jdGlvbiAodXNlTG9jYWxLZXlzKSB7CgkJCXJldHVybiBlbnlvLmpzb24uc3RyaW5naWZ5KHRoaXMucmF3KHVzZUxvY2FsS2V5cykpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJRmV0Y2ggdGhpcyBfY29sbGVjdGlvbl8uIEFjY2VwdHMgYW4gb3B0aW9ucyBoYXNoIGluY2x1ZGluZyBhCgkJCWBzdWNjZXNzYCBtZXRob2QgYW5kL29yIGFuIGBlcnJvcmAgbWV0aG9kLiBBIGBmZXRjaGAgcmVxdWVzdCB3aXRoCgkJCXJlc3VsdHMgd2lsbCBfYWRkXyB0aG9zZSByZXN1bHRzIHRvIHRoZSBfY29sbGVjdGlvbl8uIElmIHlvdSB3YW50CgkJCXRvIHJlcGxhY2UgdGhlIGNvbnRlbnRzIHVzZSB0aGUgYHJlcGxhY2VgIG9wdGlvbnMga2V5IG9yIGNhbGwKCQkJYGZldGNoQW5kUmVwbGFjZWAuCgkJKi8KCQlmZXRjaDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKCQkJdmFyICRvcHRpb25zID0gb3B0aW9ucz8gZW55by5jbG9uZShvcHRpb25zKToge307CgkJCSRvcHRpb25zLnN1Y2Nlc3MgPSB0aGlzLmJpbmRTYWZlbHkoImRpZEZldGNoIiwgb3B0aW9ucyB8fCB7fSk7CgkJCSRvcHRpb25zLmVycm9yID0gdGhpcy5iaW5kU2FmZWx5KCJkaWRGYWlsIiwgImZldGNoIiwgb3B0aW9ucyB8fCB7fSk7CgkJCXRoaXMuc2V0KCJzdGF0dXMiLCBlbnlvLk1vZGVsLkJVU1kuRkVUQ0hJTkcpOwoJCQllbnlvLnN0b3JlLmZldGNoKHRoaXMsICRvcHRpb25zKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUJ5IGRlZmF1bHQgYGZldGNoYCB3aWxsIGFkZCB0byB0aGUgX2NvbGxlY3Rpb25fIGFuZCBrZWVwIGFueSBleGlzdGluZwoJCQljb250ZW50LiBJZiB5b3Ugd2lzaCB0byByZXBsYWNlIGFsbCBjb250ZW50IHdpdGggdGhlIHJlc3VsdHMgY2FsbCB0aGlzCgkJCW1ldGhvZCB1c2luZyB0aGUgc2FtZSBvcHRpb25zLgoJCSovCgkJZmV0Y2hBbmRSZXBsYWNlOiBmdW5jdGlvbiAob3B0aW9ucykgewoJCQl2YXIgJG9wdGlvbnMgPSBvcHRpb25zPyBlbnlvLmNsb25lKG9wdGlvbnMpOiB7fTsKCQkJJG9wdGlvbnMucmVwbGFjZSA9IHRydWU7CgkJCXRoaXMuZmV0Y2goJG9wdGlvbnMpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJTm90IHR5cGljYWxseSBjYWxsZWQgZGlyZWN0bHkgYnV0IG92ZXJsb2FkYWJsZSBmb3IgZXh0ZW5zaWJpbGl0eS4KCQkqLwoJCWRpZEZldGNoOiBmdW5jdGlvbiAob3B0aW9ucywgcmVzdWx0KSB7CgkJCXZhciBkYXRhID0gdGhpcy5maWx0ZXJEYXRhKHJlc3VsdCk7CgoJCQlpZiAob3B0aW9ucy5yZXBsYWNlKSB7CgkJCQl0aGlzLnJlbW92ZUFsbCgpOwoJCQl9CgkJCXRoaXMuYWRkKGRhdGEpOwoJCQl0aGlzLnN0YXJ0Tm90aWZpY2F0aW9ucygpOwoJCQlpZiAob3B0aW9ucy5zdWNjZXNzKSB7CgkJCQlvcHRpb25zLnN1Y2Nlc3Mob3B0aW9ucywgcmVzdWx0KTsKCQkJfQoJCQl0aGlzLnNldCgic3RhdHVzIiwgZW55by5Nb2RlbC5DTEVBTik7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlPdmVybG9hZCB0aGlzIG1ldGhvZCBmb3IgaGFuZGxpbmcgZmFpbC1zdGF0ZXMuIFRoZSBgd2hpY2hgCgkJCXBhcmFtZXRlciB3aWxsIGJlIGAiZmFpbCJgLiBTZXRzIHRoZSBgc3RhdHVzYCB0byBgRVJST1IuUkVTUE9OU0VgLgoJCSovCgkJZGlkRmFpbDogZnVuY3Rpb24gKHdoaWNoLCBvcHRpb25zKSB7CgkJCXRoaXMuc2V0KCJzdGF0dXMiLCBlbnlvLk1vZGVsLkVSUk9SLlJFU1BPTlNFKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRPRE86IE5vdCBpbXBsZW1lbnRlZAoJCSovCgkJcHVzaDogZnVuY3Rpb24gKCkgewoJCQllbnlvLndhcm4oImVueW8uQ29sbGVjdGlvbi5wdXNoOiBub3QgY3VycmVudGx5IGltcGxlbWVudGVkIik7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUT0RPOiBOb3QgaW1wbGVtZW50ZWQKCQkqLwoJCXBvcDogZnVuY3Rpb24gKCkgewoJCQllbnlvLndhcm4oImVueW8uQ29sbGVjdGlvbi5wb3A6IG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQiKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRPRE86IE5vdCBpbXBsZW1lbnRlZAoJCSovCgkJc2hpZnQ6IGZ1bmN0aW9uICgpIHsKCQkJZW55by53YXJuKCJlbnlvLkNvbGxlY3Rpb24uc2hpZnQ6IG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQiKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRPRE86IE5vdCBpbXBsZW1lbnRlZAoJCSovCgkJdW5zaGlmdDogZnVuY3Rpb24gKCkgewoJCQllbnlvLndhcm4oImVueW8uQ29sbGVjdGlvbi51bnNoaWZ0OiBub3QgY3VycmVudGx5IGltcGxlbWVudGVkIik7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIGB2YWx1ZWAgaW4gdGhlIF9jb2xsZWN0aW9uXwoJCQlzdGFydGluZyBmcm9tIHRoZSBvcHRpb25hbCBgaWR4YC4KCQkqLwoJCWluZGV4T2Y6IGZ1bmN0aW9uICh2YWx1ZSwgaWR4KSB7CgkJCXJldHVybiBlbnlvLmluZGV4T2YodmFsdWUsIHRoaXMuX3N0b3JlLCBpZHgpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJUmV0dXJucyB0aGUgbGFzdCBpbmRleCBvZiB0aGUgYHZhbHVlYCBpbiB0aGUgX2NvbGxlY3Rpb25fIHN0YXJ0aW5nCgkJCWZyb20gdGhlIG9wdGlvbmFsIGBpZHhgLgoJCSovCgkJbGFzdEluZGV4T2Y6IGZ1bmN0aW9uICh2YWx1ZSwgaWR4KSB7CgkJCXJldHVybiBlbnlvLmxhc3RJbmRleE9mKHZhbHVlLCB0aGlzLl9zdG9yZSwgaWR4KTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRPRE86IE5vdCBpbXBsZW1lbnRlZAoJCSovCgkJc3BsaWNlOiBmdW5jdGlvbiAoKSB7CgkJCWVueW8ud2FybigiZW55by5Db2xsZWN0aW9uLnNwbGljZTogbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCIpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJUmV0dXJucyBhIG1hcHBlZCBhcnJheSBhY2NvcmRpbmcgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgZm5gIGFuZAoJCQl0aGUgb3B0aW9uYWwgYGNvbnRleHRgIHRvIGV4ZWN1dGUgYGZuYCB3aXRoIChkZWZhdWx0IGlzIHRoZSBfY29sbGVjdGlvbl8pLgoKCQkJW3NlZSBlbnlvLm1hcF0oIykKCQkqLwoJCW1hcDogZnVuY3Rpb24gKGZuLCBjb250ZXh0KSB7CgkJCXJldHVybiBlbnlvLm1hcCh0aGlzLl9zdG9yZSwgZm4sIGNvbnRleHQgfHwgdGhpcyk7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlSZXR1cm5zIGEgZmlsdGVyZWQgYXJyYXkgb2YgX21vZGVsc18gZnJvbSB0aGUgX2NvbGxlY3Rpb25fIGFjY29yZGluZwoJCQl0byB0aGUgYHRydWVgIG9yIGBmYWxzZWAgcmV0dXJuIG9mIGBmbmAgYW5kIHRoZSBvcHRpb25hbCBgY29udGV4dGAKCQkJKGRlZmF1bHQgaXMgdGhlIF9jb2xsZWN0aW9uXykuCgoJCQlbc2VlIGVueW8uZmlsdGVyXSgjKQoJCSovCgkJZmlsdGVyOiBmdW5jdGlvbiAoZm4sIGNvbnRleHQpIHsKCQkJcmV0dXJuIGVueW8uZmlsdGVyKHRoaXMuX3N0b3JlLCBmbiwgY29udGV4dCB8fCB0aGlzKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUluIGltcGxlbWVudGF0aW9ucyB3aGVyZSB0aGUgcmVzdWx0IG9mIGEgYGZldGNoYCBtYXkgbm90IGJlIHRoZSBhcnJheQoJCQlvZiByZWNvcmRzIGFuZCBuZWVkcyB0byBmaXJzdCBiZSBmaWx0ZXJlZCBvdmVybG9hZCB0aGlzIG1ldGhvZC4gUmV0dXJuCgkJCXRoZSBhcnJheSBvZiByZWNvcmRzIHRvIGJlIHN1cHBsaWVkIGR1cmluZyBhIGBkaWRGZXRjaGAuCgkJKi8KCQlmaWx0ZXJEYXRhOiBmdW5jdGlvbiAoZGF0YSkgewoJCQlyZXR1cm4gZGF0YTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVJldHVybnMgYHRydWVgIG9yIGBmYWxzZWAgd2hldGhlciB0aGUgX2NvbGxlY3Rpb25fIGNvbnRhaW5zIGB2YWx1ZWAuCgkJKi8KCQljb250YWluczogZnVuY3Rpb24gKHZhbHVlKSB7CgkJCXJldHVybiAhIX5lbnlvLmluZGV4T2YodGhpcy5fc3RvcmUsIHZhbHVlKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVJldHVybnMgdGhlIF9tb2RlbF8gYXQgYGlkeGAgaW4gdGhlIF9jb2xsZWN0aW9uXy4KCQkqLwoJCWF0OiBmdW5jdGlvbiAoaWR4KSB7CgkJCXJldHVybiB0aGlzLl9zdG9yZVtpZHhdOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQWRkIGEgc2luZ2xlIHJlY29yZCB0byB0aGUgX2NvbGxlY3Rpb25fLiBUaGUgYHJlY29yZGAgcGFyYW1ldGVyCgkJCW1heSBiZSBhbiBpbnN0YW5jZSBvZiBgZW55by5Nb2RlbGAgb3IgYW4gb2JqZWN0IGxpdGVyYWwuIElmIGl0IGlzCgkJCWFuIG9iamVjdCBsaXRlcmFsIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBfa2luZF8gZGVmaW5lZCBieSB0aGUKCQkJYG1vZGVsYCBwcm9wZXJ0eSBvZiB0aGlzIF9jb2xsZWN0aW9uXy4KCQkqLwoJCWFkZDogZnVuY3Rpb24gKHJlY29yZCkgewoJCQl2YXIgaWR4ID0gdGhpcy5fc3RvcmUubGVuZ3RoOwoJCQlpZiAoZW55by5pc0FycmF5KHJlY29yZCkpIHsKCQkJCXJldHVybiB0aGlzLmFkZE1hbnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCQkJfQoJCQlpZiAoIShyZWNvcmQgaW5zdGFuY2VvZiB0aGlzLm1vZGVsKSkgewoJCQkJcmVjb3JkID0gbmV3IHRoaXMubW9kZWwocmVjb3JkKTsKCQkJfQoJCQlyZWNvcmQuX2FkZENvbGxlY3Rpb24odGhpcyk7CgkJCXRoaXMuX3N0b3JlLnB1c2gocmVjb3JkKTsKCQkJdGhpcy5zZXQoImxlbmd0aCIsIHRoaXMuX3N0b3JlLmxlbmd0aCk7CgkJCWlmICghdGhpcy5fc2lsZW5jZWQpIHsKCQkJCXRoaXMuZG9Nb2RlbEFkZGVkKHsKCQkJCQltb2RlbDogcmVjb3JkLAoJCQkJCWluZGV4OiBpZHgsCgkJCQkJY29sbGVjdGlvbjogdGhpcwoJCQkJfSk7CgkJCX0KCQkJcmV0dXJuIGlkeDsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRPRE86IE5vdCBpbXBsZW1lbnRlZAoJCSovCgkJYWRkQXQ6IGZ1bmN0aW9uICgpIHsKCQkJZW55by53YXJuKCJlbnlvLkNvbGxlY3Rpb24uYWRkQXQ6IG5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUFjY2VwdHMgYW4gYXJyYXkgb2YgcmVjb3JkcyB0byBiZSBhZGRlZCB0byB0aGUgX2NvbGxlY3Rpb25fLiBJZiB0aGUKCQkJcmVjb3JkcyBhcmUgb2JqZWN0IGxpdGVyYWxzIHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIF9raW5kXyBkZWZpbmVkCgkJCWJ5IHRoZSBgbW9kZWxgIHByb3BlcnR5IG9mIHRoZSBfY29sbGVjdGlvbl8uCgkJKi8KCQlhZGRNYW55OiBmdW5jdGlvbiAocmVjb3JkcykgewoJCQl2YXIgYWRkZWQgPSBbXTsKCQkJdGhpcy5zaWxlbmNlKCk7CgkJCWVueW8uZm9yRWFjaChyZWNvcmRzLCBmdW5jdGlvbiAocmVjb3JkKSB7CgkJCQl2YXIgaWR4ID0gdGhpcy5hZGQocmVjb3JkKTsKCQkJCWlmICghaXNOYU4oaWR4KSkgewoJCQkJCWFkZGVkLnB1c2goewoJCQkJCQltb2RlbDogdGhpcy5hdChpZHgpLAoJCQkJCQlpbmRleDogaWR4LAoJCQkJCQljb2xsZWN0aW9uOiB0aGlzCgkJCQkJfSk7CgkJCQl9CgkJCX0sIHRoaXMpOwoJCQl0aGlzLnVuc2lsZW5jZSgpOwoJCQlpZiAoYWRkZWQubGVuZ3RoKSB7CgkJCQl0aGlzLmRvTW9kZWxzQWRkZWQoe21vZGVsczogYWRkZWR9KTsKCQkJfQoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJUmVtb3ZlZCBgcmVjb3JkYCBmcm9tIHRoZSBfY29sbGVjdGlvbl8gaWYgaXQgZXhpc3RzIGFuZCBlbWl0cwoJCQlhIGBvbk1vZGVsUmVtb3ZlZGAgZXZlbnQuCgkJKi8KCQlyZW1vdmU6IGZ1bmN0aW9uIChyZWNvcmQpIHsKCQkJaWYgKGVueW8uaXNBcnJheShyZWNvcmQpKSB7CgkJCQlyZXR1cm4gdGhpcy5yZW1vdmVNYW55LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgkJCX0KCQkJdmFyIGlkeCA9IHRoaXMuaW5kZXhPZihyZWNvcmQpOwoJCQlpZiAoISF+aWR4KSB7CgkJCQl0aGlzLl9zdG9yZS5zcGxpY2UoaWR4LCAxKTsKCQkJCXRoaXMuc2V0KCJsZW5ndGgiLCB0aGlzLl9zdG9yZS5sZW5ndGgpOwoJCQkJcmVjb3JkLl9yZW1vdmVDb2xsZWN0aW9uKHRoaXMpOwoJCQkJaWYgKCF0aGlzLl9zaWxlbmNlZCkgewoJCQkJCXRoaXMuZG9Nb2RlbFJlbW92ZWQoewoJCQkJCQltb2RlbDogcmVjb3JkLAoJCQkJCQlpbmRleDogaWR4LAoJCQkJCQljb2xsZWN0aW9uOiB0aGlzCgkJCQkJfSk7CgkJCQl9CgkJCQlyZXR1cm4gaWR4OwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVJlbW92ZXMgYWxsIG1vZGVscyBpbiB0aGUgX2NvbGxlY3Rpb25fLiBOb3RlIHRoZXNlIF9tb2RlbHNfIGFyZSBub3QKCQkJZGVzdHJveWVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgYGVueW8uU3RvcmVgLgoJCSovCgkJcmVtb3ZlQWxsOiBmdW5jdGlvbiAoKSB7CgkJCXZhciAkY29weSA9IGVueW8uY2xvbmUodGhpcy5fc3RvcmUpOwoJCQl0aGlzLnJlbW92ZSgkY29weSk7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUT0RPOiBOb3QgaW1wbGVtZW50ZWQKCQkqLwoJCXJlbW92ZUF0OiBmdW5jdGlvbiAoKSB7CgkJCWVueW8ud2FybigiZW55by5Db2xsZWN0aW9uLnJlbW92ZUF0OiBub3QgaW1wbGVtZW50ZWQgeWV0Iik7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlSZW1vdmVzIGFsbCBtb2RlbHMgaW4gdGhlIGByZWNvcmRzYCBhcnJheSBpZiB0aGV5IGFyZSBmb3VuZCBpbgoJCQl0aGUgX2NvbGxlY3Rpb25fLiBOb3RlIHRoZXNlIF9tb2RlbHNfIGFyZSBub3QgZGVzdHJveWVkIG9yIHJlbW92ZWQKCQkJZnJvbSB0aGUgYGVueW8uU3RvcmVgLgoJCSovCgkJcmVtb3ZlTWFueTogZnVuY3Rpb24gKHJlY29yZHMpIHsKCQkJdmFyIHJlbW92ZWQgPSBbXTsKCQkJdGhpcy5zaWxlbmNlKCk7CgkJCWVueW8uZm9yRWFjaChyZWNvcmRzLCBmdW5jdGlvbiAocmVjb3JkKSB7CgkJCQl2YXIgaWR4ID0gdGhpcy5yZW1vdmUocmVjb3JkKTsKCQkJCWlmICghaXNOYU4oaWR4KSkgewoJCQkJCXJlbW92ZWQucHVzaCh7CgkJCQkJCW1vZGVsOiByZWNvcmQsCgkJCQkJCWluZGV4OiBpZHgsCgkJCQkJCWNvbGxlY3Rpb246IHRoaXMKCQkJCQl9KTsKCQkJCX0KCQkJfSwgdGhpcyk7CgkJCXRoaXMudW5zaWxlbmNlKCk7CgkJCWlmIChyZW1vdmVkLmxlbmd0aCkgewoJCQkJdGhpcy5kb01vZGVsc1JlbW92ZWQoe21vZGVsczogcmVtb3ZlZH0pOwoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlPdmVybG9hZGVkIGBzZXR0ZXJgIHRoYXQgYWNjZXB0cyBhbiBvYmplY3QgbGl0ZXJhbCBhbmQKCQkJd2lsbCBhcHBseSBhbGwga2V5cyBhbmQgdmFsdWVzIHRvIHRoZSBfY29sbGVjdGlvbl8gYWxzbyB0aGUKCQkJbm9ybWFsIGtleSBhbmQgdmFsdWUgcGFpciBjb21iaW5hdGlvbi4KCQkqLwoJCXNldDogZnVuY3Rpb24gKHByb3AsIHZhbCkgewoJCQlpZiAoIm9iamVjdCIgPT09IHR5cGVvZiBwcm9wKSB7CgkJCQl0aGlzLnN0b3BOb3RpZmljYXRpb25zKCk7CgkJCQlmb3IgKHZhciBrZXkgaW4gcHJvcCkgewoJCQkJCXRoaXMuc2V0KGtleSwgcHJvcFtrZXldKTsKCQkJCX0KCQkJCXRoaXMuc3RhcnROb3RpZmljYXRpb25zKCk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSBlbHNlIGlmICh1bmRlZmluZWQgPT09IHZhbCkgewoJCQkJcmV0dXJuOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCX0KCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCU92ZXJsb2FkZWQgYG93bmVyQ2hhbmdlZGAgdG8gcHJldmVudCB0aGUgbm9ybWFsIGhhbmRsZXJzCgkJCWZyb20gZXhlY3V0aW5nLiBPdmVybG9hZCB3aXRoIGNhcmUuCgkJKi8KCQlvd25lckNoYW5nZWQ6IGZ1bmN0aW9uKG9sZCkgewoJCQlpZiAob2xkICYmIG9sZC5yZW1vdmVDb21wb25lbnQpIHsKCQkJCW9sZC5yZW1vdmVDb21wb25lbnQodGhpcyk7CgkJCX0KCQkJaWYgKHRoaXMub3duZXIgJiYgdGhpcy5vd25lci5hZGRDb21wb25lbnQpIHsKCQkJCXRoaXMub3duZXIuYWRkQ29tcG9uZW50KHRoaXMpOwoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlBY2NlcHRzIGFuIGFycmF5IG9mIG1vZGVscyB0byBhZGQgdG8gdGhlIF9jb2xsZWN0aW9uXyBhdCBjcmVhdGlvbi4KCQkqLwoJCWNvbnN0cnVjdG9yOiBmdW5jdGlvbiAocHJvcHMpIHsKCQkJdGhpcy5fZGlydHlNb2RlbHMgPSBbXTsKCQkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQkJLy8gaWYgdGhlIGluaXRpYWwgcGFyYW1ldGVyIGlzIGFuIGFycmF5IHdlIHVzZSB0aGF0IGFzCgkJCS8vIG91ciBzdGFydGluZyBwcm9wZXJ0aWVzCgkJCWlmIChwcm9wcyAmJiBwcm9wcyBpbnN0YW5jZW9mIEFycmF5KSB7CgkJCQl0aGlzLl9zdG9yZSA9IHRoaXMuX3N0b3JlPyB0aGlzLl9zdG9yZS5jb25jYXQocHJvcHMpOiBwcm9wczsKCQkJfQoJCQkvLyBpbml0aWFsaXplIG91ciBzdG9yZQoJCQl0aGlzLl9zdG9yZSA9IHRoaXMuX3N0b3JlIHx8IFtdOwoJCQl0aGlzLmxlbmd0aCA9IHRoaXMuX3N0b3JlLmxlbmd0aDsKCQkJdGhpcy5faW5pdE1vZGVsKCk7CgkJCWlmICh0aGlzLl9zdG9yZS5sZW5ndGgpIHsKCQkJCXRoaXMuX3N0b3JlID0gdGhpcy5tYXAoZnVuY3Rpb24gKHJlY29yZCkgewoJCQkJCXZhciAkcmVjID0gcmVjb3JkIGluc3RhbmNlb2YgdGhpcy5tb2RlbD8gcmVjb3JkOiBuZXcgdGhpcy5tb2RlbChyZWNvcmQpOwoJCQkJCSRyZWMuX2FkZENvbGxlY3Rpb24odGhpcyk7CgkJCQkJcmV0dXJuICRyZWM7CgkJCQl9LCB0aGlzKTsKCQkJfQoJCQl0aGlzLl9pbml0UmVsYXRpb24oKTsKCQl9LAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgTUVUSE9EUwoKCQkvLypAcHJvdGVjdGVkCgkJX2luaXRNb2RlbDogZnVuY3Rpb24gKCkgewoJCQl2YXIgJG1vZGVsID0gdGhpcy5tb2RlbDsKCQkJaWYgKCJzdHJpbmciID09PSB0eXBlb2YgJG1vZGVsKSB7CgkJCQkkbW9kZWwgPSBlbnlvLmdldFBhdGgoJG1vZGVsKTsKCQkJfQoJCQl0aGlzLm1vZGVsID0gJG1vZGVsOwoJCQlpZiAoJG1vZGVsICYmIHRoaXMucmVsYXRpb24pIHsKCQkJCSRtb2RlbCA9ICRtb2RlbC5wcm90b3R5cGU7CgkJCQlpZiAodGhpcy5yZWxhdGlvbi5pbnZlcnNlS2V5KSB7CgkJCQkJaWYgKCRtb2RlbC5fcmVsYXRpb25zW3RoaXMucmVsYXRpb24uaW52ZXJzZUtleV0pIHsKCQkJCQkJZW55by5taXhpbih0aGlzLnJlbGF0aW9uLCAkbW9kZWwuX3JlbGF0aW9uc1t0aGlzLnJlbGF0aW9uLmludmVyc2VLZXldKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJX2luaXRSZWxhdGlvbjogZnVuY3Rpb24gKCkgewoJCQl2YXIga2V5LCAkcmVsID0gdGhpcy5yZWxhdGlvbjsKCQkJaWYgKCRyZWwpIHsKCQkJCWlmICgoa2V5ID0gJHJlbC5yZWxhdGlvbktleSkpIHsKCQkJCQlpZiAoIXRoaXNba2V5XSkgewoJCQkJCQl0aGlzLmFkZE9ic2VydmVyKGtleSwgdGhpcy5fcmVsYXRpb25PYnNlcnZlciwgdGhpcyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGhpcy5fcmVsYXRpb25PYnNlcnZlcihrZXksIG51bGwsIHRoaXNba2V5XSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCV9yZWxhdGlvbk9ic2VydmVyOiBmdW5jdGlvbiAocHJvcCwgcHJldiwgdmFsKSB7CgkJCXZhciAkcmVsID0gdGhpcy5yZWxhdGlvbiwga2V5ID0gJHJlbC5pbnZlcnNlS2V5OwoJCQlpZiAoa2V5ID09PSBwcm9wICYmIHZhbCkgewoJCQkJdGhpc1skcmVsLnJlbGF0aW9uS2V5XS5yZW1vdmVPYnNlcnZlcihrZXksIHRoaXMuX3JlbGF0aW9uT2JzZXJ2ZXIpOwoJCQkJaWYgKCRyZWwuYXV0b0ZldGNoKSB7CgkJCQkJdGhpcy5mZXRjaCgpOwoJCQkJfQoJCQl9IGVsc2UgaWYgKCRyZWwucmVsYXRpb25LZXkgPT09IHByb3ApIHsKCQkJCWlmICh2YWwgJiYgJHJlbC5hdXRvRmV0Y2gpIHsKCQkJCQlpZiAodmFsW2tleV0pIHsKCQkJCQkJdGhpcy5mZXRjaCgpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXZhbC5hZGRPYnNlcnZlcihrZXksIHRoaXMuX3JlbGF0aW9uT2JzZXJ2ZXIsIHRoaXMpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlfcmVsYXRpb25DaGFuZ2VkOiBlbnlvLm9ic2VydmVyKGZ1bmN0aW9uIChwcm9wLCBwcmV2LCB2YWwpIHsKCQkJaWYgKHZhbCkgewoJCQkJdGhpcy5faW5pdFJlbGF0aW9uKCk7CgkJCX0KCQl9LCAicmVsYXRpb24iKSwKCgkJLy8qQHByb3RlY3RlZAoJCV9tb2RlbENoYW5nZWQ6IGZ1bmN0aW9uIChzZW5kZXIsIGV2ZW50KSB7CgkJCXZhciBpZHggPSB0aGlzLmluZGV4T2Yoc2VuZGVyKTsKCQkJdGhpcy5zZXQoInN0YXR1cyIsIGVueW8uTW9kZWwuRElSVFkpOwoJCQlpZiAoISF+aWR4KSB7CgkJCQl0aGlzLmRvTW9kZWxDaGFuZ2VkKHsKCQkJCQltb2RlbDogc2VuZGVyLAoJCQkJCWluZGV4OiBpZHgsCgkJCQkJY29sbGVjdGlvbjogdGhpcwoJCQkJfSk7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCV9tb2RlbERlc3Ryb3llZDogZnVuY3Rpb24gKHNlbmRlciwgZXZlbnQpIHsKCQkJdmFyIGlkeCA9IHRoaXMuaW5kZXhPZihzZW5kZXIpOwoJCQlpZiAoISF+aWR4KSB7CgkJCQl0aGlzLnJlbW92ZShzZW5kZXIpOwoJCQkJdGhpcy5kb01vZGVsRGVzdHJveWVkKHsKCQkJCQltb2RlbDogc2VuZGVyLAoJCQkJCWluZGV4OiBpZHgsCgkJCQkJY29sbGVjdGlvbjogdGhpcwoJCQkJfSk7CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gT0JTRVJWRVJTCgoJCV9zdGF0dXNDaGFuZ2VkOiBlbnlvLm9ic2VydmVyKGZ1bmN0aW9uIChwcm9wLCBwcmV2LCB2YWwpIHsKCQkJaWYgKHByZXYgPT0gZW55by5Nb2RlbC5ESVJUWSAmJiB2YWwgPT0gZW55by5Nb2RlbC5DTEVBTikgewoJCQkJZW55by5mb3JFYWNoKGVueW8uY2xvbmUodGhpcy5fZGlydHlNb2RlbHMpLCBmdW5jdGlvbiAocmVjKSB7CgkJCQkJcmVjLnNldCgic3RhdHVzIiwgZW55by5Nb2RlbC5DTEVBTik7CgkJCQl9KTsKCQkJfQoJCX0sICJzdGF0dXMiKQoKCX0pOwoKfSkoZW55byk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/data/Model.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGFrZXMgYW4gb2JqZWN0IGFuZCByZXR1cm5zIGEgX0Jvb2xlYW5fIGB0cnVlYCB8IGBmYWxzZWAgaWYKCQl0aGUgb2JqZWN0IGlzIGEgYGVueW8uTW9kZWxgIG9yIF9zdWJraW5kXy4KCSovCgllbnlvLmlzTW9kZWwgPSBmdW5jdGlvbiAob2JqKSB7CgkJcmV0dXJuICEhIChvYmogJiYgb2JqLl9pc01vZGVsKTsKCX07CgkvLypAcHJvdGVjdGVkCgl2YXIgaXNNb2RlbCA9IGVueW8uaXNNb2RlbDsKCgkvLypAcHJvdGVjdGVkCgl2YXIgcmVsYXRpb25Jbml0aWFsaXplcnMgPSB7CgkJYXV0b0ZldGNoOiBmdW5jdGlvbiAocHJvcHMpIHsKCQkJaWYgKCFlbnlvLmV4aXN0cyhwcm9wcy5hdXRvRmV0Y2gpKSB7CgkJCQlwcm9wcy5hdXRvRmV0Y2ggPSB0cnVlOwoJCQl9CgkJfSwKCQltb2RlbDogZnVuY3Rpb24gKHByb3BzKSB7CgkJCWlmICghZW55by5leGlzdHMocHJvcHMubW9kZWwpKSB7CgkJCQlwcm9wcy5tb2RlbCA9IGVueW8uTW9kZWwgfHwgImVueW8uTW9kZWwiOwoJCQl9CgkJfSwKCQlpc093bmVyOiBmdW5jdGlvbiAocHJvcHMpIHsKCQkJaWYgKCFlbnlvLmV4aXN0cyhwcm9wcy5pc093bmVyKSkgewoJCQkJcHJvcHMuaXNPd25lciA9IHRydWU7CgkJCX0KCQl9LAoJCWluQ29tbWl0OiBmdW5jdGlvbiAocHJvcHMpIHsKCQkJaWYgKCFwcm9wcy5pc093bmVyICYmICFlbnlvLmV4aXN0cyhwcm9wcy5pbkNvbW1pdCkpIHsKCQkJCXByb3BzLmluQ29tbWl0ID0gdHJ1ZTsKCQkJfSBlbHNlIGlmICghZW55by5leGlzdHMocHJvcHMuaW5Db21taXQpKSB7CgkJCQlwcm9wcy5pbkNvbW1pdCA9IGZhbHNlOwoJCQl9CgkJfSwKCQlpbnZlcnNlS2V5OiBmdW5jdGlvbiAocHJvcHMpIHsKCQkJLy8gbm9wIGZvciBub3cKCQl9LAoJCXJlbGF0aW9uS2V5OiBmdW5jdGlvbiAocHJvcHMpIHsKCQkJaWYgKCFlbnlvLmV4aXN0cyhwcm9wcy5yZWxhdGlvbktleSkpIHsKCQkJCXByb3BzLnJlbGF0aW9uS2V5ID0gImlkIjsKCQkJfQoJCX0sCgkJY29sbGVjdGlvbjogZnVuY3Rpb24gKHByb3BzKSB7CgkJCWlmIChwcm9wcy5fa2luZCA9PSAidG9PbmUiKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJaWYgKCFlbnlvLmV4aXN0cyhwcm9wcy5jb2xsZWN0aW9uKSkgewoJCQkJLy8gd2Uga25vdyB0aGVyZSBleGlzdHMgYSBtb2RlbCBwcm9wZXJ0eSBiZWNhdXNlIGl0CgkJCQkvLyB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIG5vcm1hbGl6ZWQKCQkJCXByb3BzLmNvbGxlY3Rpb24gPSBlbnlvLmtpbmQoe2tpbmQ6ICJlbnlvLkNvbGxlY3Rpb24iLCBtb2RlbDogcHJvcHMubW9kZWx9KTsKCQkJfQoJCX0KCX07CgoJLy8qQHByb3RlY3RlZAoJdmFyIHJlbGF0aW9uS2V5cyA9IGVueW8ua2V5cyhyZWxhdGlvbkluaXRpYWxpemVycyk7CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJSGFuZGxlcyBjb21tb24gZmVhdHVyZXMgb2YgYWxsIHJlbGF0aW9ucy4KCSovCgl2YXIgaW5pdFJlbGF0aW9uID0gZnVuY3Rpb24gKHByb3BzKSB7CgkJdmFyICRwcm9wcyA9IHByb3BzOwoJCWVueW8uZm9yRWFjaChyZWxhdGlvbktleXMsIGZ1bmN0aW9uIChmbikgewoJCQlyZWxhdGlvbkluaXRpYWxpemVyc1tmbl0oJHByb3BzKTsKCQl9KTsKCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJRXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlY29yZC4KCSovCgl2YXIgdG9PbmVIYW5kbGVyID0gZnVuY3Rpb24gKGtleSwgcmVsLCB2YWwpIHsKCQl2YXIgJHJlYyA9IHRoaXNba2V5XTsKCQlpZiAoISRyZWMpIHsKCQkJaWYgKHJlbC5pc093bmVyKSB7CgkJCQkvLyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgYW4gb2JqZWN0IGl0IGlzIGFzc3VtZWQgdG8gYmUKCQkJCS8vIHRoZSBwcm9wZXJ0eSBoYXNoIGZvciB0aGUgcmVjb3JkIHNvIHdlIGNyZWF0ZSBpdCBpbi1wbGFjZQoJCQkJaWYgKGVueW8uaXNPYmplY3QodmFsKSkgewoJCQkJCXZhbFtyZWwuaW52ZXJzZUtleV0gPSB0aGlzOwoJCQkJCSRyZWMgPSB0aGlzW2tleV0gPSBuZXcgcmVsLm1vZGVsKHZhbCk7CgkJCQkJJHJlYy5fcmVsYXRpb25LZXkgPSBrZXk7CgkJCQl9IGVsc2UgewoJCQkJCS8vIGhhdmUgdG8gYXNrIHRoZSBzdG9yZSB0byBsb29rIGZvciB0aGUgY29ycmVjdCByZWNvcmQgZmlyc3QKCQkJCQkvLyBqdXN0IHRvIGJlIHN1cmUgaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQgdGhhdCB3ZSB1c2UgdGhlIHNhbWUKCQkJCQkvLyBvbmUKCQkJCQl2YXIgJG9wdHMgPSB7fTsKCQkJCQkkb3B0cy5wYXJhbXMgPSB7fTsKCQkJCQkkb3B0cy5wYXJhbXNbcmVsLmludmVyc2VLZXldID0gdGhpc1tyZWwucmVsYXRpb25LZXldOwoJCQkJCS8vIG5vdGUgdGhpcyBpcyBhIHN5bmNocm9ub3VzIGNhbGwgYmVjYXVzZSB3ZSBkb24ndCBzdXBwbHkKCQkJCQkvLyB0aGUgYXN5bmNocm9ub3VzIHN1Y2Nlc3MvZXJyb3IgY2FsbGJhY2tzIGFuZCB0aGF0IGl0IGlzCgkJCQkJLy8gb25seSBhIGxvY2FsIGZpbmQgd2hlbiBleGVjdXRlZCB0aGlzIHdheQoJCQkJCSRyZWMgPSBlbnlvLnN0b3JlLmZpbmRPbmUocmVsLm1vZGVsLCAkb3B0cyk7CgkJCQkJLy8gaWYgaXQgaXNuJ3QgbG9jYWwgYWxyZWFkeSB3ZSBjcmVhdGUgaXQgYW5kIGlmIGl0cyBhdXRvCgkJCQkJLy8gZmV0Y2hhYmxlIGNhbGwgZmV0Y2gKCQkJCQlpZiAoISRyZWMpIHsKCQkJCQkJJHJlYyA9IG5ldyByZWwubW9kZWwoKTsKCQkJCQkJJHJlYy5fcmVsYXRpb25LZXkgPSBrZXk7CgkJCQkJCSRyZWMuc2V0KHJlbC5pbnZlcnNlS2V5LCB0aGlzKTsKCQkJCQkJaWYgKHJlbC5hdXRvRmV0Y2gpIHsKCQkJCQkJCSRyZWMuZmV0Y2goKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIHdlIGFyZW4ndCB0aGUgb3duZXIgYnV0IHNob3VsZCBoYXZlIGJlZW4gaGFuZGVkIHRoZSBhY3R1YWwKCQkJCS8vIHJlY29yZAoJCQkJJHJlYyA9IHRoaXNba2V5XSA9IHZhbDsKCQkJCS8vIHNpbmNlIHdlIGFyZW4ndCB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uIHdlIHJlZ2lzdGVyIHRoZSBvd25lcgoJCQkJLy8gYXMgYSBsaXN0ZW5lciB0byBvdXIgZXZlbnRzCgkJCQl0aGlzLmFkZERpc3BhdGNoVGFyZ2V0KCRyZWMpOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gd2VsbCwgdGhpcyB3b3VsZCBiZSBvZGQgYnV0IHBvc3NpYmxlCgkJCWlmIChyZWwuaXNPd25lcikgewoJCQkJJHJlYy5kaWRGZXRjaCh7fSwgdmFsKTsKCQkJfQoJCX0KCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJRXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlY29yZC4KCSovCgl2YXIgdG9NYW55SGFuZGxlciA9IGZ1bmN0aW9uIChrZXksIHJlbCwgdmFsKSB7CgkJdmFyICRyZWMgPSB0aGlzW2tleV07CgkJaWYgKCEkcmVjKSB7CgkJCXZhciAkcHIgPSByZWwuY29sbGVjdGlvbi5wcm90b3R5cGUucmVsYXRpb24gfHwgcmVsOwoJCQkkcmVjID0gdGhpc1trZXldID0gZW55by5zaW5nbGV0b24oe2tpbmQ6IHJlbC5jb2xsZWN0aW9uLCByZWxhdGlvbjogZW55by5jbG9uZSgkcHIpfSk7CgkJCSRyZWMuX3JlbGF0aW9uS2V5ID0ga2V5OwoJCQkkcmVjLmFkZERpc3BhdGNoVGFyZ2V0KHRoaXMpOwoJCQlpZiAocmVsLmludmVyc2VLZXkpIHsKCQkJCSRyZWMuc2V0KHJlbC5pbnZlcnNlS2V5LCB0aGlzKTsKCQkJfQoJCQlpZiAodmFsKSB7CgkJCQlpZiAoZW55by5pc0FycmF5KHZhbCkpIHsKCQkJCQkkcmVjLmFkZCh2YWwpOwoJCQkJfSBlbHNlIGlmIChlbnlvLmlzT2JqZWN0KHZhbCkpIHsKCQkJCQkkcmVjLmRpZEZldGNoKHt9LCB2YWwpOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKHZhbCkgewoJCQkJJHJlYy5kaWRGZXRjaCh7fSwgdmFsKTsKCQkJfQoJCX0KCX07CgoJLy8gVE9ETzogRm9yIHRoZSByZXN1bHRpbmcgZG9jdW1lbnRhdGlvbiB0byBwcm9wZXJseSBvcmdhbml6ZSB0aGVzZSBtZXRob2RzCgkvLyBpbiBhc3NvY2lhdGlvbiB3aXRoIGVueW8uTW9kZWwgd2UgbmVlZCBhIG1vcmUgcG93ZXJmdWwgZG9jdW1lbnRhdGlvbiB0b29sLAoJLy8gZW55by5Nb2RlbC50b09uZSwgZXRjLiBpcyB1Z2x5IGFuZCBjdW1iZXJzb21lLgoKCS8vKkBwdWJsaWMKCWVueW8udG9PbmUgPSBmdW5jdGlvbiAocHJvcHMpIHsKCQl2YXIgJHByb3BzID0gcHJvcHM7CgkJJHByb3BzLl9raW5kID0gInRvT25lIjsKCQkkcHJvcHMuaGFuZGxlciA9ICRwcm9wcy5oYW5kbGVyIHx8IHRvT25lSGFuZGxlcjsKCQlpbml0UmVsYXRpb24oJHByb3BzKTsKCQlyZXR1cm4gJHByb3BzOwoJfTsKCgkvLypAcHVibGljCgllbnlvLnRvTWFueSA9IGZ1bmN0aW9uIChwcm9wcykgewoJCXZhciAkcHJvcHMgPSBwcm9wczsKCQkkcHJvcHMuX2tpbmQgPSAidG9NYW55IjsKCQkkcHJvcHMuaGFuZGxlciA9ICRwcm9wcy5oYW5kbGVyIHx8IHRvTWFueUhhbmRsZXI7CgkJaW5pdFJlbGF0aW9uKCRwcm9wcyk7CgkJcmV0dXJuICRwcm9wczsKCX07CgoJLy8qQHByb3RlY3RlZAoJdmFyIGRlZmF1bHRGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWN0aW9uLCBwYXlsb2FkKSB7CgkJcmV0dXJuIHZhbHVlOwoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgZGVmYXVsdFR5cGVXcmFuZ2xlciA9IGZ1bmN0aW9uIChhdHRyLCBrZXksIHZhbHVlLCBhY3Rpb24sIHBheWxvYWQpIHsKCQlpZiAoYXR0ciAmJiBhdHRyLnR5cGUgJiYgdmFsdWUpIHsKCQkJaWYgKGVueW8uaXNTdHJpbmcoYXR0ci50eXBlKSkgewoJCQkJLy8gaXQgaGFzbid0IGJlZW4gcmVzb2x2ZWQgeWV0CgkJCQl2YXIgJHR5cGUgPSBlbnlvLmdldFBhdGgoYXR0ci50eXBlKTsKCQkJCWlmICgkdHlwZSkgewoJCQkJCWF0dHIudHlwZSA9ICR0eXBlOwoJCQkJfQoJCQl9CgkJCXN3aXRjaCAoYWN0aW9uKSB7CgkJCWNhc2UgImZldGNoIjoKCQkJCS8vIFRPRE86IEFsbCBuYXRpdmUgdHlwZXMgbmVlZCB0byBiZSBhZGRlZCBoZXJlIGFuZCB0ZXN0ZWQKCQkJCWlmIChhdHRyLnR5cGUpIHsKCQkJCQlpZiAoU3RyaW5nID09PSBhdHRyLnR5cGUpIHsKCQkJCQkJaWYgKCFlbnlvLmlzU3RyaW5nKHZhbHVlKSkgewoJCQkJCQkJdmFsdWUgPSB2YWx1ZSAmJiB2YWx1ZS50b1N0cmluZz8gdmFsdWUudG9TdHJpbmcoKTogU3RyaW5nKHZhbHVlKTsKCQkJCQkJfQoJCQkJCX0gZWxzZSBpZiAoISh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIGF0dHIudHlwZSkpIHsKCQkJCQkJdmFsdWUgPSBuZXcgYXR0ci50eXBlKHZhbHVlKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWU7CgkJCWNhc2UgImNvbW1pdCI6CgkJCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKCQkJfQoJCX0KCQlyZXR1cm4gdmFsdWU7Cgl9OwoKCS8vKkBwcm90ZWN0ZWQKCXZhciBpbml0aWFsaXplcnMgPSB7CgkJLyoqCgkJCUlmIHRoZXJlIGlzIGEgcmVtb3RlIGtleSBkZWZpbmVkIHdlIHRyYWNrIHRoYXQgYW5kIGNyZWF0ZQoJCQl0aGUgYXBwcm9wcmlhdGUgbWFwIGJldHdlZW4gdGhlIGxvY2FsIGFuZCByZW1vdGUga2V5LgoJCSovCgkJcmVtb3RlS2V5OiBmdW5jdGlvbiAocHJvdG8sIGtleSwgYXR0cikgewoJCQl2YXIgJGtleXMgPSBwcm90by5fcmVtb3RlS2V5cyB8fCAocHJvdG8uX3JlbW90ZUtleXMgPSB7fSk7CgkJCWlmIChhdHRyLnJlbW90ZUtleSkgewoJCQkJLy8gc28gbm93IHdlIGtub3cgaXQgaXMgYSByZW1vdGUga2V5IGFuZCB3ZSBoYXZlIG1hcHBlZAoJCQkJLy8gaXQgdG8gdGhlIGxvY2FsIGtleQoJCQkJJGtleXNbYXR0ci5yZW1vdGVLZXldID0ga2V5OwoJCQl9CgkJfSwKCQl0eXBlOiBmdW5jdGlvbiAocHJvdG8sIGtleSwgYXR0cikgewoJCQkvLyBub3AgZm9yIG5vdwoJCX0sCgkJLyoqCgkJCUlmIGEgdHlwZVdyYW5nbGVyIHdhcyBkZWZpbmVkIGFzIGEgc3RyaW5nIGl0IGlzIGF0dGVtcHRlZCB0byBiZQoJCQlncmFiYmVkIGZyb20gdGhlIHByb3RvdHlwZSBmb3IgdGhlIG1vZGVsIGFuZCBpZiBpdCBpc24ndCBmb3VuZAoJCQlpdCB1c2VzIHRoZSBkZWZhdWx0LgoJCSovCgkJdHlwZVdyYW5nbGVyOiBmdW5jdGlvbiAocHJvdG8sIGtleSwgYXR0cikgewoJCQlpZiAoYXR0ci50eXBlV3JhbmdsZXIpIHsKCQkJCWlmIChlbnlvLmlzU3RyaW5nKGF0dHIudHlwZVdyYW5nbGVyKSkgewoJCQkJCWlmICghKGF0dHIudHlwZVdyYW5nbGVyID0gcHJvdG9bYXR0ci50eXBlV3JhbmdsZXJdKSkgewoJCQkJCQllbnlvLndhcm4oImVueW8uTW9kZWw6IGF0dHJpYnV0ZSBkZWZpbmVkIHdpdGggdHlwZVdyYW5nbGVyIGJ1dCBubyAiICsKCQkJCQkJCSJzdWNoIHR5cGVXcmFuZ2xlciB3YXMgZm91bmQgb24gdGhlIG1vZGVsIHByb3RvdHlwZSAtPiAiICsKCQkJCQkJCWtleSArICIgaW4gIiArIHByb3RvLmtpbmROYW1lICsgIiwgdXNpbmcgdGhlIGRlZmF1bHQgdHlwZVdyYW5nbGVyIik7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKGVueW8uaXNGdW5jdGlvbihhdHRyLnR5cGVXcmFuZ2xlcikpIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCX0KCQkJLy8gd2UgYmluZCBpdCBpbmNsdWRpbmcgdGhlIGF0dHJpYnV0ZSBoYXMgc28gaXQgY2FuIGF0dGVtcHQgdG8gdXNlCgkJCS8vIHRoZSB0eXBlIGlmIGl0IHdhcyBkZWZpbmVkIGV2ZW4gaWYgaXQgY291bGRuJ3QgYmUgcmVzb2x2ZWQgYXQgdGhpcwoJCQkvLyBtb21lbnQgZHVyaW5nIGluaXRpYWxpemF0aW9uCgkJCWF0dHIudHlwZVdyYW5nbGVyID0gZW55by5iaW5kKG51bGwsIGRlZmF1bHRUeXBlV3JhbmdsZXIsIGF0dHIpOwoJCX0sCgkJLyoqCgkJCUlmIGEgZm9ybWF0dGVyIHdhcyBkZWZpbmVkIGFzIGEgc3RyaW5nIGl0IGlzIGF0dGVtcHRlZCB0byBiZQoJCQlncmFiYmVkIGZyb20gdGhlIHByb3RvdHlwZSBmb3IgdGhlIG1vZGVsIGFuZCBpZiBpdCBpc24ndCBmb3VuZAoJCQlpdCB1c2VzIHRoZSBkZWZhdWx0LgoJCSovCgkJZm9ybWF0dGVyOiBmdW5jdGlvbiAocHJvdG8sIGtleSwgYXR0cikgewoJCQlpZiAoYXR0ci5mb3JtYXR0ZXIpIHsKCQkJCWlmIChlbnlvLmlzU3RyaW5nKGF0dHIuZm9ybWF0dGVyKSkgewoJCQkJCWlmICghKGF0dHIuZm9ybWF0dGVyID0gcHJvdG9bYXR0ci5mb3JtYXR0ZXJdKSkgewoJCQkJCQllbnlvLndhcm4oImVueW8uTW9kZWw6IGF0dHJpYnV0ZSBkZWZpbmVkIHdpdGggZm9ybWF0dGVyIGJ1dCBubyAiICsKCQkJCQkJCSJzdWNoIGZvcm1hdHRlciB3YXMgZm91bmQgb24gdGhlIG1vZGVsIHByb3RvdHlwZSAtPiAiICsKCQkJCQkJCWtleSArICIgaW4gIiArIHByb3RvLmtpbmROYW1lICsgIiwgdXNpbmcgdGhlIGRlZmF1bHQgZm9ybWF0dGVyIik7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKGVueW8uaXNGdW5jdGlvbihhdHRyLmZvcm1hdHRlcikpIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCX0KCQkJLy8gbm90aGluZyB3ZSBjYW4gZG8gcmVhbGx5IGV4Y2VwdCBhc3N1bWUgdGhhdCB0aGUgc3RydWN0dXJlIGl0CgkJCS8vIGlzIGNvbWluZyBpbiBhcyB3aWxsIGJlIGNvcnJlY3QKCQkJYXR0ci5mb3JtYXR0ZXIgPSBkZWZhdWx0Rm9ybWF0dGVyOwoJCX0sCgkJLyoqCgkJCUlmIGEgcmVsYXRpb24gaXMgZGVmaW5lIGZvciB0aGUgYXR0cmlidXRlIHdlIGdvIGFoZWFkIGFuZAoJCQlpbml0aWFsaXplIHdoYXQgd2UgY2FuLgoJCSovCgkJcmVsYXRpb246IGZ1bmN0aW9uIChwcm90bywga2V5LCBhdHRyKSB7CgkJCXZhciAkcmVscyA9IHByb3RvLl9yZWxhdGlvbnMgfHwgKHByb3RvLl9yZWxhdGlvbnMgPSB7fSk7CgkJCWlmIChhdHRyLnJlbGF0aW9uKSB7CgkJCQkkcmVsc1trZXldID0gYXR0ci5yZWxhdGlvbjsKCQkJfQoJCX0KCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJVGhlIGtub3duIGFuZCBhdmFpbGFibGUgYXR0cmlidXRlIGtleXMuIEFsbCBvdGhlcnMgYXJlIGlnbm9yZWQgKHJlbW92ZWQpLgoJCUEgc2VwYXJhdGUgaW5pdGlhbGl6ZXIgaXMgc2V0dXAgZm9yIGVhY2ggb2YgdGhlc2UgZm9yIG1vZHVsYXJpdHkgYW5kCgkJKGludGVybmFsKSBleHRlbnNpYmlsaXR5IGluIHRoZSBmdXR1cmUgYW5kIGVhc2llciBkZWJ1Z2dpbmcuIFRoZXkgYXJlIHJldHJpZXZlZAoJCWZyb20gdGhlIGluaXRpYWxpemVycyBiZWNhdXNlIGZvciBmdXR1cmUgb3B0aW9ucyB5b3Ugb25seSBuZWVkIHRvIGFkZCB0aGUKCQllbnRyeSB0aGVyZSBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGhhbmRsZWQuCgkqLwoJdmFyIGF0dHJpYnV0ZUtleXMgPSBlbnlvLmtleXMoaW5pdGlhbGl6ZXJzKTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgbm9ybWFsaXplQXR0cmlidXRlID0gZnVuY3Rpb24gKHByb3RvLCBrZXksIGF0dHIsIGF0dHJzKSB7CgkJdmFyICRwcm9wID0gYXR0cnNba2V5XSA9IGF0dHI/IGVueW8ub25seShhdHRyaWJ1dGVLZXlzLCBhdHRyKToge307CgkJdmFyICRwcm90byA9IHByb3RvOwoJCXZhciAka2V5ID0ga2V5OwoJCWVueW8uZm9yRWFjaChhdHRyaWJ1dGVLZXlzLCBmdW5jdGlvbiAoZm4pIHsKCQkJaW5pdGlhbGl6ZXJzW2ZuXSgkcHJvdG8sICRrZXksICRwcm9wKTsKCQl9KTsKCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJQXR0ZW1wdCB0byBkbyBhbGwgdGhlIG5lY2Vzc2FyeSBzZXR1cCBvbiBvdXIgYXR0cmlidXRlcyBpbiBhIHNpbmdsZQoJCXBhc3MgYXMgb3Bwb3NlZCB0byBzZXZlcmFsLiBBY3Rpb25zIGFyZSBicm9rZW4gdXAgZm9yIG1vZHVsYXJpdHksCgkJYmV0dGVyIChpbnRlcm5hbCkgZXh0ZW5zaWJpbGl0eSBpbiB0aGUgZnV0dXJlIGFuZCBlYXNpZXIgZGVidWdnaW5nLgoJKi8KCXZhciBub3JtYWxpemVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKHByb3RvLCBhdHRycykgewoJCXZhciBrZXksICRwcm9wLCAka2V5cyA9IHByb3RvLl9hdHRyaWJ1dGVLZXlzOwoJCWlmICgka2V5cykgewoJCQkka2V5cyA9IChwcm90by5fYXR0cmlidXRlS2V5cyA9IGVueW8uY2xvbmUoJGtleXMpKTsKCQl9IGVsc2UgewoJCQkka2V5cyA9IChwcm90by5fYXR0cmlidXRlS2V5cyA9IFtdKTsKCQl9CgkJZm9yIChrZXkgaW4gYXR0cnMpIHsKCQkJaWYgKCF+ZW55by5pbmRleE9mKGtleSwgJGtleXMpKSB7CgkJCQkka2V5cy5wdXNoKGtleSk7CgkJCX0KCQkJJHByb3AgPSBhdHRyc1trZXldID0gZW55by5jbG9uZShhdHRyc1trZXldKTsKCQkJbm9ybWFsaXplQXR0cmlidXRlKHByb3RvLCBrZXksICRwcm9wLCBhdHRycyk7CgkJfQoJfTsKCgkvLypAcHJvdGVjdGVkCgoJdmFyIGluaXRSZWxhdGlvbnMgPSBmdW5jdGlvbiAoKSB7CgkJdmFyIGtleSwgJHJlbCwgJHJlbHMgPSB0aGlzLl9yZWxhdGlvbnM7CgkJLy8gc2luY2UgYXQgbG9hZCB0aW1lIHdlIGNhbid0IGJlIHN1cmUgYWxsIHRoZSBjb25zdHJ1Y3RvcnMgYXJlIGxvYWRlZAoJCS8vIHdlIGhhdmUgdG8gcmVzb3J0IHRvIGRvaW5nIHRoaXMgYXQgcnVudGltZQoJCS8vIFRPRE86IENvdWxkIHJlZ2lzdGVyIHJlbGF0aW9ucyBnbG9iYWxseSBhbmQgaGF2ZSBhbiBlbnlvLnJlYWR5IGNhbGwKCQkvLyB0aGF0IGRvZXMgdGhpcyBvbmNlIGZvciBhbGwga25vd24gcmVsYXRpb25zIGFzIG9wcG9zZWQgdG8gZXZlcnkgdGltZQoJCS8vIGEgbmV3IG1vZGVsIGlzIGluc3RhbmNlZCAod2l0aCBwb3RlbnRpYWxseSBmYXIgbW9yZSBvdmVyaGVhZCkKCQlmb3IgKGtleSBpbiAkcmVscykgewoJCQkkcmVsID0gJHJlbHNba2V5XTsKCQkJaWYgKCRyZWwuaXNPd25lcikgewoJCQkJc3dpdGNoICgkcmVsLl9raW5kKSB7CgkJCQljYXNlICJ0b09uZSI6CgkJCQkJaWYgKCFlbnlvLmlzRnVuY3Rpb24oJHJlbC5tb2RlbCkpIHsKCQkJCQkJJHJlbC5tb2RlbCA9IGVueW8uZ2V0UGF0aCgkcmVsLm1vZGVsKTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlICJ0b01hbnkiOgoJCQkJCWlmICghZW55by5pc0Z1bmN0aW9uKCRyZWwuY29sbGVjdGlvbikpIHsKCQkJCQkJJHJlbC5jb2xsZWN0aW9uID0gZW55by5nZXRQYXRoKCRyZWwuY29sbGVjdGlvbik7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfTsKCgkvLypAcHJvdGVjdGVkCgkvKioKCQlVc2VkIHRvIGJyZWFrZG93biBhIGRlc3Ryb3llZCBtb2RlbC4KCSovCgl2YXIgYnJlYWtkb3duID0gZnVuY3Rpb24gKG1vZGVsKSB7CgkJLy8gbWFrZSBzdXJlIHRvIGNsZWFudXAgYW55IHJlbGF0aW9ucyB0aGF0IGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQKCQkvLyBmb3IgdGhpcyB3aGVyZSB0aGlzIG1vZGVsIHdhcyB0aGUgb3duZXIKCQl2YXIga2V5LCAkcmVsLCAkcmVscyA9IG1vZGVsLl9yZWxhdGlvbnM7CgkJZm9yIChrZXkgaW4gJHJlbHMpIHsKCQkJJHJlbCA9ICRyZWxzW2tleV07CgkJCWlmICgkcmVsLmlzT3duZXIpIHsKCQkJCS8vIFRPRE86IEZvciBub3cgd2UganVzdCBvcnBoYW4gcmVsYXRlZCBtb2RlbHMgYnV0IHBvc3NpYmx5CgkJCQkvLyBzaG91bGQgZGV0ZXJtaW5lIGEgd2F5IHRvIGtub3cgd2hldGhlciBvciBub3QgdG8gZGVzdHJveQoJCQkJLy8gdGhlbSBhcyB3ZWxsCgkJCQkvLyBpZiB0aGUgcmVsYXRpb24gaXMgYSB0b01hbnkgdGhhbiB3ZSBzaG91bGQgYmUgbG9va2luZyBhdAoJCQkJLy8gYSBjb2xsZWN0aW9uLCBzaW5jZSB3ZSBvd24gdGhhdCBjb2xsZWN0aW9uLCB3ZSBkZXN0cm95IGl0CgkJCQkvLyBidXQgdGhlIG1vZGVscyB3aWxsIHN0aWxsIGV4aXN0CgkJCQlpZiAoJHJlbC5fa2luZCA9PSAidG9NYW55IikgewoJCQkJCWlmIChtb2RlbFtrZXldKSB7CgkJCQkJCW1vZGVsW2tleV0uZGVzdHJveSgpOwoJCQkJCQltb2RlbFtrZXldID0gbnVsbDsKCQkJCQl9CgkJCQl9IGVsc2UgaWYgKCRyZWwuX2tpbmQgPT0gInRvT25lIikgewoJCQkJCWlmIChtb2RlbFtrZXldKSB7CgkJCQkJCW1vZGVsW2tleV0ucmVtb3ZlRGlzcGF0Y2hUYXJnZXQobW9kZWwpOwoJCQkJCQlpZiAoJHJlbC5pbnZlcnNlS2V5KSB7CgkJCQkJCQltb2RlbFtrZXldLnNldCgkcmVsLmludmVyc2VLZXksIG51bGwpOwoJCQkJCQl9CgkJCQkJCW1vZGVsW2tleV0gPSBudWxsOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQkvLyBjb250aW51ZSB0aGUgbm9ybWFsIGNvbXBvbmVudCBicmVha2Rvd24gZm9yIHRoZSByZXN0CgkJZW55by5Db21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbChtb2RlbCk7Cgl9OwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCUluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGFsbCBtb2RlbCBraW5kcy4gSXMgYWJzdHJhY3RlZCBzdWNoIHRoYXQKCQlpdCBjYW4gYmUgdXNlZCBhdCBydW4tdGltZSBmb3IgZ2VuZXJpYyBtb2RlbHMgdGhhdCBhcmUgYXR0ZW1wdGluZyB0bwoJCWluZmVyIHRoZWlyIG93biBzY2hlbWFzIGZyb20gdGhlIGRhdGEgc3RydWN0dXJlIHRoZXkgZW5jb3VudGVyZWQuCgkqLwoJdmFyIGluaXRNb2RlbCA9IGZ1bmN0aW9uIChwcm90bywgcHJvcHMpIHsKCgkJLy8gdGhlIHByb3RvdHlwZSBvZiB0aGUgZ2l2ZW4gY29uc3RydWN0b3IKCQl2YXIgJHByb3RvID0gcHJvdG87CgoJCS8vIHdlIGJyZWFrIHRoZXNlIG9wZXJhdGlvbnMgZm9yIGNsYXJpdHkKCQkvLyBmaXJzdCB3ZSBoYW5kbGUgdGhlIGF0dHJpYnV0ZXMKCQkvLyBpZiB0aGlzIGlzIGEgc3Via2luZCBvZiBhbm90aGVyIG1vZGVsIHRoZQoJCS8vIGF0dHJpYnV0ZXMgaGFzaCB3aWxsIGFscmVhZHkgZXhpc3QgYW5kIHdlCgkJLy8gd2UgbmVlZCB0byBjbG9uZSBpdCBmb3IgcG9zdGVyaXR5CgkJaWYgKCRwcm90by5fYXR0cmlidXRlcykgewoJCQkkcHJvdG8uX2F0dHJpYnV0ZXMgPSBlbnlvLmNsb25lKCRwcm90by5fYXR0cmlidXRlcyk7CgkJfSBlbHNlIHsKCQkJLy8gb3RoZXJ3aXNlIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9uZSB0byB3b3JrIHdpdGgKCQkJJHByb3RvLl9hdHRyaWJ1dGVzID0ge307CgkJfQoJCWlmICgkcHJvdG8uX3JlbGF0aW9ucykgewoJCQkkcHJvdG8uX3JlbGF0aW9ucyA9IGVueW8uY2xvbmUoJHByb3RvLl9yZWxhdGlvbnMpOwoJCX0KCQkvLyB0aGUgYXR0cmlidXRlcyBzZXJ2ZSBhcyBhIHdheSB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwKCQkvLyBkZWZpbml0aW9uIG9mIGEgbW9kZWwKCgkJLy8gd2UgdGFrZSB0aGUgbmV3IGF0dHJpYnV0ZXMgYW5kIHByZXNlcnZlIHRoZW0gYWxvbmcgd2l0aAoJCS8vIGFueSBjdXJyZW50IHZhbHVlcwoJCWVueW8ubWl4aW4oJHByb3RvLl9hdHRyaWJ1dGVzLCBwcm9wcyk7CgkJLy8gd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBubyBtYXR0ZXIgd2hhdCB3ZSBpbmNsdWRlIHRoZSBwcmltYXJ5S2V5CgkJLy8gYXR0cmlidXRlIGluIHRoZSBwYXlsb2FkCgkJaWYgKCEoJHByb3RvLnByaW1hcnlLZXkgaW4gJHByb3RvLl9hdHRyaWJ1dGVzKSkgewoJCQkkcHJvdG8uX2F0dHJpYnV0ZXNbJHByb3RvLnByaW1hcnlLZXldID0gbnVsbDsKCQl9CgkJLy8gZG8gdGhlIHJlc3Qgb2YgdGhlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgb24gdGhlIGF0dHJpYnV0ZXMKCQkvLyBpbiBhIHNpbmdsZSBwYXNzCgkJbm9ybWFsaXplQXR0cmlidXRlcygkcHJvdG8sICRwcm90by5fYXR0cmlidXRlcyk7Cgl9OwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCVdoZW4gdGhlIGtpbmQgZmVhdHVyZXMgY2hhaW4gY29tZXMgYWNyb3NzIGEgbW9kZWwgZGVmaW5pdGlvbgoJCXdlIG5lZWQgdG8gZW5zdXJlIHNvbWUgc2V0dXAgc28gd2UgZG8gdGhpcyBvbmNlIGZvciBhbnkga2luZAoJCXVwIGZyb250IHRvIGJlIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KCSovCgllbnlvLmtpbmQuZmVhdHVyZXMucHVzaChmdW5jdGlvbiAoY3RvciwgcHJvcHMpIHsKCQlpZiAoIWlzTW9kZWwoY3Rvci5wcm90b3R5cGUpKSB7CgkJCXJldHVybjsKCQl9CgkJdmFyICRwcm90byA9IGN0b3IucHJvdG90eXBlOwoJCS8vIHJlZ2lzdGVyIHRoaXMga2luZCBmb3IgdXNlIGluIGEgc3RvcmUKCQllbnlvLm1vZGVscy5hZGQoY3Rvcik7CgkJaW5pdE1vZGVsKCRwcm90bywgcHJvcHMuYXR0cmlidXRlcyB8fCB7fSk7CgoJCS8vIHdlIGFyZSBubyBsb25nZXIgY29uY2VybmVkIHdpdGggdGhlIGF0dHJpYnV0ZXMgcHJvcGVydHkgb2YgdGhlCgkJLy8gcHJvcGVydGllcyBmb3IgdGhpcyBraW5kIGFuZCBkbyBub3Qgd2lzaCB0aGVtIHRvIGJlIGFkZGVkIHRvCgkJLy8gdG8gdGhlIGtpbmQgYm9keSBzbyB3ZSByZW1vdmUgaXQKCQlkZWxldGUgJHByb3RvLmF0dHJpYnV0ZXM7CgoJCS8vIHdlIGF0dGVtcHQgdG8gYXV0byBnZW5lcmF0ZSBhIHVybCB3aGVuIG5lY2Vzc2FyeQoJCSRwcm90by51cmwgPSBwcm9wcy51cmwgfHwgISRwcm90by5ub1VybD8gKCRwcm90by5uYW1lIHx8ICRwcm90by5raW5kTmFtZSkKCQkJLnJlcGxhY2UoL14oLiopXC4vZywgIiIpLnRvTG93ZXJDYXNlKCk6ICIiOwoJfSk7CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJV2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIHRoZSBjb25zdHJ1Y3Rpb24gY2hhaW4gd2UgbmVlZCB0byByZWdpc3RlcgoJCXRoZSByZWNvcmQgd2l0aCB0aGUgc3RvcmUuIFRoaXMgY2Fubm90IGJlIGRvbmUgaW4gZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24KCQljaGFpbi4KCSovCgllbnlvLmtpbmQucG9zdENvbnN0cnVjdG9ycy5wdXNoKGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5faXNNb2RlbCAmJiBlbnlvLnN0b3JlKSB7CgkJCWVueW8uc3RvcmUuaW5pdE1vZGVsKHRoaXMpOwoJCX0KCX0pOwoKCS8vKkBwdWJsaWMKCS8qKgoJCVRoZSBfc3RhdHVzXyBvZiBhbiBgZW55by5Nb2RlbGAgd2lsbCBiZSBvbmUgb2YgdGhvc2UgZGVmaW5lZCBieSB2YWx1ZXMgaW4KCQlgZW55by5Nb2RlbGAuIFRoZXkgY2FuIGJlIGNoZWNrZWQgZXhwbGljaXRseSBhZ2FpbnN0IHRoZXNlIHN0YXR1YyBnbG9iYWxzCgkJKGUuZy4gYGVueW8uTW9kZWwuRVJST1IuVFlQRWApLgoJKi8KCXZhciBTVEFURVMgPSB7fTsKCgkvLypAcHVibGljCgkvKioKCQlUaGVyZSBhcmUgbXVsdGlwbGUgZXJyb3Igc3RhdGVzIGVhY2ggd2l0aCBhIGRpZmZlcmVudCBtZWFuaW5nLgoJKi8KCXZhciBFUlJPUiA9IFNUQVRFUy5FUlJPUiA9IHt9OwoKCS8qKgoJCVdoZW4gYW4gYXR0cmlidXRlIHdpdGggYSBkZWZpbmVkIGB0eXBlYCBpcyBgc2V0YCBvbiBhIG1vZGVsIGFuZCBmYWlscwoJCXRvIGJlIG9yIGJlY29tZSAoYWZ0ZXIgYmVpbmcgcnVuIHRocm91Z2ggdGhlIGB0eXBlV3JhbmdsZXJgKSB0aGUgY29ycmVjdAoJCWB0eXBlYCB0aGUgbW9kZWwgZW50ZXJzIHRoaXMgc3RhdGUuCgkqLwoJRVJST1IuVFlQRSA9CQkJCQkJMHgwMTsKCgkvKioKCQlXaGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYmVjYXVzZSB0aGUgbW9kZWwgY291bGQgbm90CgkJZGV0ZXJtaW5lIHRoZSBfc2NoZW1hXyBmb3IgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGVpciBkZWZpbml0aW9uIG9yIGltcGxpZWQKCQlmcm9tIGBkZWZhdWx0c2Agb3IgZGF0YSBzdXBwbGllZCB0byB0aGUgY29uc3RydWN0b3IgdGhlIG1vZGVsIGVudGVycyB0aGlzCgkJc3RhdGUuCgkqLwoJRVJST1IuU0NIRU1BID0JCQkJCQkweDAyOwoKCS8qKgoJCVdoZW4gYSBtb2RlbCByZWNlaXZlcyBhIGJhZCByZXNwb25zZSBmcm9tIHRoZSBgZW55by5Tb3VyY2VgIGZvciB0aGUgYXBwbGljYXRpb24KCQlpdCB3aWxsIGVudGVyIHRoaXMgc3RhdGUuCgkqLwoJRVJST1IuUkVTUE9OU0UgPQkJCQkJMHgwMzsKCgkvKioKCQlXaGVuIGEgbW9kZWwgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBhbiBhY3Rpb24gYWdhaW5zdCBhIHJlbW90ZSBhbmQgdGhlIHN0b3JlIGRvZXMKCQlub3QgZXhpc3Qgb3IgdGhlIHNvdXJjZSBpcyB1bmF2YWlsYWJsZSBpdCB3aWxsIGVudGVyIHRoaXMgc3RhdGUuCgkqLwoJRVJST1IuU09VUkNFID0JCQkJCQkweDA0OwoKCS8vKkBwdWJsaWMKCS8qKgoJCVdoZW4gdGhlIG1vZGVsIGlzIGF0dGVtcHRpbmcgdG8gZmV0Y2gsIGNvbW1pdCBvciBkZXN0cm95IGl0IHdpbGwgYmUgaW4gYSBidXN5CgkJc3RhdGUsIG9uZSBvZiB0aGUgZm9sbG93aW5nLgoJKi8KCXZhciBCVVNZID0gU1RBVEVTLkJVU1kgPSB7fTsKCgkvKioKCQlXaGVuIHRoZSBtb2RlbCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBmZXRjaGluZyBkYXRhIGZyb20gdGhlIGBlbnlvLlNvdXJjZWAgZm9yIHRoZQoJCWFwcGxpY2F0aW9uIGl0IHdpbGwgZW50ZXIgdGhpcyBzdGF0ZS4KCSovCglCVVNZLkZFVENISU5HCQk9CQkJCTB4MTE7CgoJLyoqCgkJV2hlbiB0aGUgbW9kZWwgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29tbWl0dGluZyBkYXRhIHRvIHRoZSBgZW55by5Tb3VyY2VgIGZvciB0aGUKCQlhcHBsaWNhdGlvbiBpdCB3aWxsIGVudGVyIHRoaXMgc3RhdGUuCgkqLwoJQlVTWS5DT01NSVRUSU5HCQk9CQkJCTB4MTI7CgoJLyoqCgkJV2hlbiB0aGUgbW9kZWwgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVzdHJveWVkIGl0IHdpbGwgYmUgaW4gdGhpcyBzdGF0ZS4KCSovCglCVVNZLkRFU1RST1lJTkcJCT0JCQkJMHgxMzsKCgkvLypAcHVibGljCgkvKioKCQlUaGUgQ0xFQU4gc3RhdGUgaW1wbGllcyB0aGF0IHRoZSBtb2RlbCBoYXMgaGFkIHZhbHVlcyBhcHBsaWUgdG8gaXQgYnV0IHRoZXkKCQlhcmUgc3luY2hyb25pemVkIHdpdGggdGhlIGdpdmVuIGBzb3VyY2VgIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGNvbW1pdHRlZC4KCQlUaGlzIGlzIGFsc28gdHJ1ZSBvZiBhIG1vZGVsIHdob3NlIHZhbHVlcyB3ZXJlIHNldCBkdXJpbmcgY29uc3RydWN0aW9uIG9yIGlmCgkJaXQgaGFkIGRlZmF1bHQgdmFsdWVzIGRlZmluZWQgYW5kIGFwcGxpZWQuCgkqLwoJdmFyIENMRUFOID0gU1RBVEVTLkNMRUFOID0JCQkweDIxOwoKCS8vKkBwdWJsaWMKCS8qKgoJCUlmIGEgbW9kZWwgaGFzIGJlZW4gZGVzdHJveWVkIGl0IHdpbGwgbm8gbG9uZ2VyIGV4aXN0IGluIHRoZSBgZW55by5zdG9yZWAgb3IKCQlpbiB0aGUgcmVtb3RlLiBDaGFuZ2VzIHdpbGwgbm90IGJlIHRyYWNrZWQuCgkqLwoJdmFyIERFU1RST1lFRCA9IFNUQVRFUy5ERVNUUk9ZRUQgPQkweDMxOwoKCS8vKkBwdWJsaWMKCS8qKgoJCUEgbW9kZWwgd2lsbCBiZSBpbiB0aGUgTkVXIHN0YXRlIGlmIGl0IGlzIHJlY2VudGx5IGNyZWF0ZWQgYW5kIGhhcyBoYWQgbm8KCQl2YWx1ZXMgYXBwbGllZCB0byBpdCB0aGF0IGFyZSBpbiB0aGUgZGVmaW5lZCBzY2hlbWEgKGVpdGhlciB2aWEgYXR0cmlidXRlcwoJCWV4cGxpY2l0bHkgb3IgZGVmYXVsdHMvaW5pdGlhbCB2YWx1ZXMgaW1wbGljaXRseSkuIElmIGRlZmF1bHQgdmFsdWVzIGFyZSB1c2VkCgkJZHVyaW5nIHNldHVwIG9yIHZhbHVlcyBhcHBsaWVkIHRoZSBtb2RlbCB3aWxsIG5vdCBiZSBpbiB0aGUgTkVXIHN0YXRlLgoJKi8KCXZhciBORVcgPSBTVEFURVMuTkVXID0JCQkJMHg0MTsKCgkvLypAcHVibGljCgkvKioKCQlBIG1vZGVsIHdpbGwgYmUgaW4gdGhlIERJUlRZIHN0YXRlIGlmIGl0IGhhcyBhIGRlZmluZWQgc2NoZW1hIGFuZCBhbiBhdHRyaWJ1dGUKCQlvZiB0aGUgc2NoZW1hIGhhcyBiZWVuIG1vZGlmaWVkIGFuZCBpdCBuZWVkcyB0byBiZSBzeW5jaHJvbml6ZWQuIFRoZSBvbmx5CgkJZXhjZXB0aW9uIGlzIGlmIGEgbW9kZWwgaXMgY3JlYXRlZCBhbmQgdXNlcyBkZWZhdWx0IHZhbHVlcyBpdCB3aWxsIG5vdCBiZSBpbgoJCXRoZSBESVJUWSBzdGF0ZSB1bnRpbCBhIG1vZGlmaWNhdGlvbiB0YWtlcyBwbGFjZS4KCSovCgl2YXIgRElSVFkgPSBTVEFURVMuRElSVFkgPQkJCTB4NTE7CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGhlIGBlbnlvLk1vZGVsYCBfa2luZF8gaXMsIHNpbXBseSBwdXQsIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgZGF0YS4gSXQKCQloYXMgYSBjb21tb24gYW5kIGFic3RyYWN0ZWQgaW50ZXJmYWNlIGJ5IHdoaWNoIGl0IGNhbiBiZSBtYW5pcHVsYXRlZCBhbmQKCQlwZXJzaXN0ZWQuIFdoZW4gdXNlZCBpbiB0YW5kZW0gd2l0aCBgZW55by5Db2xsZWN0aW9uYCwgYGVueW8uU3RvcmVgIGFuZAoJCWBlbnlvLlNvdXJjZWAgaXQgY2FuIGJlIGEgd2VsbCBkZWZpbmVkIF9zY2hlbWFfIHJlcHJlc2VudGluZyBfb2JqZWN0c18gdGhhdAoJCWluIHlvdXIgYXBwbGljYXRpb24uIFRoZXkgY2FuIGhhdmUgYW4gaW1wbGljaXRseSBkZXJpdmVkIF9zY2hlbWFfIG9yIGFuCgkJZXhwbGljaXRseSBkZWZpbmVkIF9zY2hlbWFfIGFjY29yZGluZyB0byB5b3VyIGltcGxlbWVudGF0aW9uIGFuZCBuZWVkcy4KCgkJW3NlZSBlbnlvLkNvbGxlY3Rpb25dKCMpLCBbc2VlIGVueW8uU3RvcmVdKCMpLCBbc2VlIGVueW8uU291cmNlXSgjKQoKCQlfX1RPRE86IFRoZXJlIGFyZSBzdGlsbCBmZWF0dXJlcyBsZWZ0IHRvIGJlIGltcGxlbWVudGVkIGluY2x1ZGluZyBidXQgbm90CgkJbGltaXRlZCB0byB0aGUgZm9sbG93aW5nOl9fCgoJCS0gZmllbGQgdmFsaWRhdG9ycyBhbmQgZXJyb3Igc3RhdGUgYmFzZWQgb24gdmFsaWRhdGlvbgoJCS0gb3B0aW9uYWwgY2hhbmdlIHNldCBjb21taXRzIChhcyBvcHBvc2VkIHRvIGV2ZXJ5IGZpZWxkIG9uIGV2ZXJ5IGNvbW1pdCkKCgkJQSBfc2NoZW1hXyBmb3IgYSBfbW9kZWxfIGlzIGRlZmluZWQgaW4gdGhlIGBhdHRyaWJ1dGVzYCBwcm9wZXJ0eSAoaGFzaCkuIEVhY2gKCQlrZXkgaW4gdGhpcyBoYXNoIHJlcHJlc2VudHMgYW4gZW50cnkgaW4gdGhlIF9zY2hlbWFfLiBJdCBjYW4gYmUgYmV0dGVyIGRlZmluZWQKCQl3aXRoIHRoZSBfc2NoZW1hIG9wdGlvbnNfIGhhc2guIFRoZSBfc2NoZW1hIG9wdGlvbnNfIGFyZSBhIHNldCBvZiBwcm9wZXJ0aWVzCgkJdGhhdCBkZXNjcmliZSB3aGF0IHRoaXMgX2F0dHJpYnV0ZV8gaXMgYW5kIGluIHNvbWUgY2FzZXMgaG93IGl0IGludGVyYWN0cyB3aXRoCgkJb3RoZXIgX3NjaGVtYXNfLiBUaGUgX3NjaGVtYSBvcHRpb25zXyBhcmUgYXMgZm9sbG93cy4KCgkJIyMjIyMjIFtTY2hlbWEgT3B0aW9uc10oaWQ6c2NoZW1hLW9wdGlvbnMpCgoJCSMjIyMjIFtgcmVtb3RlS2V5YF0oaWQ6cmVtb3RlS2V5KSAtIF9TdHJpbmdfCgoJCUluIGNhc2VzIHdoZXJlIHRoZSByZW1vdGUga2V5IHNob3VsZCBkaWZmZXIgZnJvbSB0aGUgbG9jYWwga2V5IHNwZWNpZnkgd2hhdAoJCWByZW1vdGVLZXlgIHNob3VsZCBiZSBwYWlyZWQgd2l0aCB0aGlzIGxvY2FsIGtleS4gRm9yIGV4YW1wbGUsIGEgdGFibGUgaW4geW91cgoJCVJEQk1TIF9zY2hlbWFfIGhhcyBhbiBpbmRleCBfbXlcX3RhYmxlXF9pZF8gYnV0IHRoaXMgaXMgdWdseSB0byByZWZlcmVuY2UgaW4KCQl0aGUgY2xpZW50LXNpZGUgc291cmNlIHlvdSBjb3VsZCBtYXAgaXQgdG8gKGxvY2FsKSBfaWRfLgoKCQlgYGAKCQlhdHRyaWJ1dGVzOiB7CgkJCS8vIHRoZSBrZXkgZGVmaW5lZCBoZXJlIGlzIHRoZSBhdHRyaWJ1dGUgd2Ugd2FudCB0byB1c2UKCQkJLy8gaW4gb3VyIGFwcGxpY2F0aW9uCgkJCWlkOiB7CgkJCQkvLyBoZXJlIHdlIHRlbGwgaXQgdGhhdCB0aGUgcmVtb3RlIGtleSBpdCBzaG91bGQgdXNlCgkJCQkvLyBmb3IgdGhpcyB3aWxsIGhhdmUgYSBkaWZmZXJlbnQgbmFtZQoJCQkJcmVtb3RlS2V5OiAibXlfdGFibGVfaWQiCgkJCX0KCQl9CgkJYGBgCgoJCSMjIyMjIFtgdHlwZWBdKGlkOnR5cGUpIC0gX0Z1bmN0aW9uIChvYmplY3QgY29uc3RydWN0b3IpXyBvciBfU3RyaW5nXwoKCQlXaGVuIHNwZWNpZmllZCB0aGUgaW5jb21pbmcgZGF0YSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IgZGVmaW5lZCBieQoJCWB0eXBlYC4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgZGF0YWJhc2UgcHJvdmlkZXMgYSB2YWx1ZSByZXByZXNlbnRpbmcgYSBkYXRlIGJ1dAoJCWlzIHN0b3JlZCBhcyBhIHVuaXggdGltZXN0YW1wIHlvdSBjb3VsZCBzcGVjaWZ5IGBEYXRlYCBhcyB0aGUgYHR5cGVgIGFuZCB3aGVuCgkJZGF0YSBpcyByZXRyaWV2ZWQvYWRkZWQgZm9yIHRoaXMga2V5IGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBfY29uc3RydWN0b3JfIGZvcgoJCXRoZSBuYW1lZCBgdHlwZWAuIFRoaXMgY2FuIGJlIGEgY29uc3RydWN0b3Igb3IgYSBTdHJpbmcgcGxhY2Vob2xkZXIgZm9yIGEKCQljb25zdHJ1Y3Rvci4gX19JZiB0aGUgYHR5cGVgIGlzIGEgY3VzdG9tIF9raW5kXyB0aGF0IHJlcXVpcmVzIGEgZGlmZmVyZW50CgkJYXBwcm9hY2ggdGhhbiBzaW1wbHkgc3VwcGx5aW5nIHRoZSBkYXRhIHRvIHRoZSBjb25zdHJ1Y3RvciB5b3Ugd2lsbCBoYXZlIHRvIHVzZQoJCXRoZSBgdHlwZVdyYW5nbGVyYCAoW3NlZSB0eXBlV3JhbmdsZXJdKCN0eXBlV3JhbmdsZXIpKSBfc2NoZW1hIG9wdGlvbl8gZm9yIHR5cGUKCQljb2VyY2lvbi5fXyBOb3RlIHRoYXQgaWYgYSBgdHlwZWAgaXMgc3BlY2lmaWVkIGJ1dCBjb2VyY2lvbiBmYWlscyB0aGUgX21vZGVsXwoJCXdpbGwgX190aHJvdyBhbiBleGNlcHRpb25fXy4gVGhpcyBzaG91bGQgYmUgdXNlZCwgaG93ZXZlciwgYXMgYSBzYW5pdHkgY2hlY2sgYW5kCgkJY2FuIGhlbHAgdG8gZmluZCBmbGF3cyBpbiBfc2NoZW1hXyBkZXNpZ25zIGJvdGggbG9jYWwgYW5kIHJlbW90ZS4KCgkJYGBgCgkJYXR0cmlidXRlczogewoJCQlwdWJsaXNoZWQ6IHsKCQkJCXR5cGU6IERhdGUKCQkJfQoJCX0KCQlgYGAKCgkJIyMjIyMgW2B0eXBlV3JhbmdsZXJgXShpZDp0eXBlV3JhbmdsZXIpIC0gX0Z1bmN0aW9uXyBvciBfU3RyaW5nXwoKCQlUaGUgYHR5cGVXcmFuZ2xlcmAgX21ldGhvZF8gb3IgX3N0cmluZ18gcmVwcmVzZW50aW5nIHRoZSBfbWV0aG9kXyBvbiB0aGUgbW9kZWwKCQl0aGF0LCB3aGVuIHN1cHBsaWVkLCB3aWxsIGJlIGNhbGxlZCBvbmNlIGZvciBpbmNvbWluZyBkYXRhICh2aWEgX2ZldGNoXykgYW5kCgkJb25jZSBmb3Igb3V0Z29pbmcgZGF0YSAodmlhIF9jb21taXRfKS4gVGhlIF9mdW5jdGlvbl8gdGFrZXMgdGhlIGZvcm0gb2YKCQlgZnVuY3Rpb24gKGtleSwgdmFsdWUsIGFjdGlvbiwgcGF5bG9hZClgIHdoZXJlIGBrZXlgIGlzIHRoZSBfYXR0cmlidXRlXyBpbiB0aGUKCQlzY2hlbWEsIGB2YWx1ZWAgaXMgdGhlIGVudHJ5IGZvciB0aGF0IGBrZXlgIGluIHRoZSBgcGF5bG9hZGAsIGBhY3Rpb25gIGlzIGVpdGhlcgoJCSJmZXRjaCIgb3IgImNvbW1pdCIgd2hlcmUgImZldGNoIiBtZWFucyB0aGUgZGF0YSB3YXMganVzdCBmZXRjaGVkIGFuZCAiY29tbWl0IgoJCW1lYW5zIHRoZSBfbW9kZWxfIGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZCwgYW5kIGBwYXlsb2FkYCBpcyB0aGUgbXV0YWJsZSBmdWxsCgkJZGF0YXNldCAoY29taW5nIGluIG9yIGdvaW5nIG91dCkuIEluIGJvdGggY2FzZXMgaXQgc2hvdWxkIHJldHVybiB0aGUgZGF0YSBhcwoJCXRoZSBfY29ycmVjdCB0eXBlXyAoc3BlY2lmaWVkIGJ5IHRoZSBgdHlwZWAgW1tzZWUgdHlwZV0oI3R5cGUpXSBfc2NoZW1hIG9wdGlvbl8pLgoKCQkjIyMjIyBbYGZvcm1hdHRlcmBdKGlkOmZvcm1hdHRlcikgLSBfRnVuY3Rpb25fIG9yIF9TdHJpbmdfCgoJCVRoZXJlIGFyZSB0aW1lcyB3aGVuIGluY29taW5nIGRhdGEgd2lsbCBiZSBpbiBhbiB1bnVzZWZ1bCBmb3JtIG9yIHN0cnVjdHVyZS4KCQlXaGlsZSBib3RoIHRoZSBgZW55by5Tb3VyY2VgIGFuZCBgZW55by5Nb2RlbGAgX2tpbmRzXyBzdXBwbHkgYSBnZW5lcmljIGBmaWx0ZXJgCgkJbWV0aG9kIGZvciBpbmNvbWluZyBkYXRhIGl0IG1heSBiZSBtb3JlIGNvbnZlbmllbnQgdG8gc3VwcGx5IGEgc2VwYXJhdGUgZGF0YQoJCWZvcm1hdHRlciBmb3IgYSBwYXJ0aWN1bGFyIGtleS4gRm9yIGV4YW1wbGUsIGlmIHlvdSdyZSB1c2luZyBhIHB1YmxpYyBBUEkgdG8KCQlyZXRyaWV2ZSBkYXRhIGFuZCBpdCBjb21lcyBiYWNrIGFzIGEgbmVzdGVkIG9iamVjdCBpbiB3aGljaCB0aGUgdXNlZnVsIGRhdGEgaXMKCQlkZWVwZXIgaW4gdGhlIHRyZWUgeW91IGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gcmV0cmlldmUganVzdCB0aGUgdXNlZnVsCgkJaW5mb3JtYXRpb24uIFRoaXMgX21ldGhvZF8gbXVzdCByZXR1cm4gdGhlIGRlc2lyZWQgZGF0YS4gSWYgYSBgdHlwZVdyYW5nbGVyYAoJCShbc2VlIHR5cGVXcmFuZ2xlcl0oI3R5cGVXcmFuZ2xlcikpIGV4aXN0cyBmb3IgdGhpcyBfc2NoZW1hIG9wdGlvbl8gdGhlCgkJYGZvcm1hdHRlcmAgd2lsbCBiZSBleGVjdXRlZCBmaXJzdC4gVGhlIF9mdW5jdGlvbl8gdGFrZXMgdGhlIGZvcm0gb2YKCQlgZnVuY3Rpb24gKGtleSwgdmFsdWUsIGFjdGlvbiwgcGF5bG9hZClgIHdoZXJlIGBrZXlgIGlzIHRoZSBfYXR0cmlidXRlXyBpbiB0aGUKCQlzY2hlbWEsIGB2YWx1ZWAgaXMgdGhlIGVudHJ5IGZvciB0aGF0IGBrZXlgIGluIHRoZSBgcGF5bG9hZGAsIGBhY3Rpb25gIGlzIGVpdGhlcgoJCSJmZXRjaCIgb3IgImNvbW1pdCIgd2hlcmUgImZldGNoIiBtZWFucyB0aGUgZGF0YSB3YXMganVzdCBmZXRjaGVkIGFuZCAiY29tbWl0IgoJCW1lYW5zIHRoZSBfbW9kZWxfIGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZCwgYW5kIGBwYXlsb2FkYCBpcyB0aGUgbXV0YWJsZSBmdWxsCgkJZGF0YXNldCAoY29taW5nIGluIG9yIGdvaW5nIG91dCkuCgoKCQkjIyMjIyBbYHJlbGF0aW9uYF0oaWQ6cmVsYXRpb24pIC0gX0VudW1fCgkJX19UT0RPOiBXaGlsZSByZWxhdGlvbnNoaXBzIGRvIGZ1bmN0aW9uIHRoZWlyIEFQSSBpcyBjb25zaWRlcmVkIF92b2xhdGlsZV8gdW50aWwKCQlhIGZ1dHVyZSByZWxlYXNlIGFuZCBpcyBvbmx5IHBhcnRpYWxseSBpbXBsZW1lbnRlZCBpbiBgZW55by5TdG9yZWAKCQkoW3NlZSBlbnlvLlN0b3JlXSgjKSlfXwoKCQlSZWxhdGlvbnNoaXBzIGJldHdlZW4gX3NjaGVtYXNfIChfbW9kZWxzXykgYXJlIGRlZmluZWQgYnkgc3VwcGx5aW5nIF9yZWxhdGlvbgoJCW9wdGlvbnNfIHRvIHRoZSAyIGtub3duIF9yZWxhdGlvbiB0eXBlc18gYGVueW8udG9PbmVgIGFuZCBgZW55by50b01hbnlgIGFuZC4KCQlUaGVzZSBfcmVsYXRpb24gdHlwZXNfIGFyZSBfZnVuY3Rpb25zXyB0aGF0IHRha2UgeW91cgoJCV9yZWxhdGlvbiBvcHRpb25zXyBhbmQgdXNlcyB0aGVtIHRvIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSBoYW5kbGVyIGZvciB0aGUKCQlgcmVsYXRpb25gLgoKCQlgYGAKCQlhdHRyaWJ1dGVzOiB7CgkJCWNvbW1lbnRzOiB7CgkJCQlyZWxhdGlvbjogZW55by50b01hbnkoewoJCQkJCWF1dG9GZXRjaDogdHJ1ZSwKCQkJCQlpbkNvbW1pdDogZmFsc2UsCgkJCQkJaW52ZXJzZUtleTogIm93bmVySWQiLAoJCQkJCXJlbGF0aW9uS2V5OiAiaWQiLAoJCQkJCW1vZGVsOiAibW9kZWxzLkNvbW1lbnRNb2RlbCIKCQkJCX0pCgkJCX0KCQl9CgkJYGBgCgoJCSMjIyMjIyBbUmVsYXRpb24gT3B0aW9uc10oaWQ6cmVsYXRpb24tb3B0aW9ucykKCgkJIyMjIyMgW2BhdXRvRmV0Y2hgXShpZDphdXRvRmV0Y2gpIC0gX0Jvb2xlYW5fIChfZGVmYXVsdF8gYHRydWVgKQoKCQlXaGVuIHRoZSBpbmNvbWluZyBkYXRhIGZvciBhIHBhcnRpY3VsYXIgcmVsYXRpb24gaXMgbm90IGluY2x1ZGVkIGluIHRoZQoJCV9kYXRhc2V0XyBhbmQgbmVlZHMgdG8gYmUgX2ZldGNoZWRfIHNlcGFyYXRlbHkgdGhpcyBfcmVsYXRpb24gb3B0aW9uXyBjYW4gYmUgc2V0CgkJdG8gYHRydWVgLiBTb21ldGltZXMgaXQgaXMgZGVzaXJhYmxlIHRvIHBvc3QtcG9uZSBmZXRjaGluZyBvZiBhIHJlbGF0aW9uc2hpcAoJCXRoYXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBvcmlnaW5hbCBwYXlsb2FkIGFuZCBpbiBzdWNoIGEgY2FzZSBgYXV0b0ZldGNoYAoJCXNob3VsZCBiZSBleHBsaWNpdGx5IHNldCB0byBgZmFsc2VgLgoKCQkjIyMjIyBbYG1vZGVsYF0oaWQ6bW9kZWwpIC0gX0Z1bmN0aW9uIChvYmplY3QgY29uc3RydWN0b3IpXyBvciBfU3RyaW5nXwoKCQlUaGlzIGlzIHRoZSBfY29uc3RydWN0b3JfIG9yIF9zdHJpbmdfIHBsYWNlaG9sZGVyIGZvciB0aGUgX2NvbnN0cnVjdG9yXyBvZiB0aGUKCQlfa2luZF8gb2YgX21vZGVsXyB0byB1c2UgZm9yIHRoaXMgYHJlbGF0aW9uYC4gSWYgYG1vZGVsYCBpcyBzdXBwbGllZCBmb3IgYQoJCWBlbnlvLnRvTWFueWAgYHJlbGF0aW9uYCBpdCB3aWxsIHVzZSBhIGdlbmVyaWMgYGVueW8uQ29sbGVjdGlvbmAgd2l0aCB0aGF0CgkJX21vZGVsIGtpbmRfLiBJZiB0aGVyZSBpcyBhIGN1c3RvbSBfY29sbGVjdGlvbiBraW5kXyB1c2UgdGhlIGBjb2xsZWN0aW9uYAoJCV9yZWxhdGlvbiBvcHRpb25fIGluc3RlYWQgKFtzZWUgY29sbGVjdGlvbl0oI2NvbGxlY3Rpb24pKS4KCgkJIyMjIyMgW2Bjb2xsZWN0aW9uYF0oaWQ6Y29sbGVjdGlvbikgLSBfRnVuY3Rpb24gKG9iamVjdCBjb25zdHJ1Y3RvcilfIG9yIF9TdHJpbmdfCgoJCVRoaXMgaXMgb25seSB1c2VkIGluIGBlbnlvLnRvTWFueWAgYHJlbGF0aW9uc2AgYW5kIHdpbGwgYmUKCQlpZ25vcmVkIGluIGBlbnlvLnRvT25lYCBgcmVsYXRpb25zYC4gVGhpcyBfY29uc3RydWN0b3JfIG9yIF9zdHJpbmdfIHBsYWNlaG9sZGVyCgkJZm9yIHRoZSBfY29uc3RydWN0b3JfIG9mIHRoZSBfa2luZF8gb2YgX2NvbGxlY3Rpb25fIHRvIHVzZSBmb3IgdGhpcyBgcmVsYXRpb25gLgoJCVdoZW4gc3VwcGx5aW5nIGEgY3VzdG9tIF9jb2xsZWN0aW9uIGtpbmRfIHRoYXQgX2tpbmRfIGlzIHJlc3BvbnNpYmxlIGZvciBiZWluZwoJCWNvbmZpZ3VyZWQgdG8gdXNlIHRoZSBjb3JyZWN0IF9tb2RlbCBraW5kXy4KCgkJIyMjIyMgW2BpbkNvbW1pdGBdKGlkOmluQ29tbWl0KSAtIF9Cb29sZWFuXyAoX2RlZmF1bHRfIGBmYWxzZWApCgoJCVNldCB0aGlzIF9yZWxhdGlvbiBvcHRpb25fIHRvIGB0cnVlYCB0byBpbmNsdWRlIHRoaXMgYHJlbGF0aW9uYCBpbiBhIF9jb21taXRfCgkJcGF5bG9hZCB0byB0aGUgX3NvdXJjZV8uCgoJCSMjIyMjIFtgaW52ZXJzZUtleWBdKGlkOmludmVyc2VLZXkpIC0gX1N0cmluZ18KCgkJVGhlIF9zdHJpbmdfIHJlcHJlc2VudGluZyB0aGUga2V5IG9uIHRoZSBfcmVsYXRlZCBtb2RlbF8gdG8gZGVzaWduYXRlIHRoZQoJCXJlbGF0aW9uc2hpcCAoaWYgYW55KS4KCgkJIyMjIyMgW2ByZWxhdGlvbktleWBdKGlkOnJlbGF0aW9uS2V5KSAtIF9TdHJpbmdfIChfZGVmYXVsdF8gYGlkYCkKCgkJVGhlIF9zdHJpbmdfIHJlcHJlc2VudGluZyB0aGUga2V5IG9uIHRoaXMgX21vZGVsXyB0byBjb21wYXJlIGFnYWluc3QgdGhlCgkJYGludmVyc2VLZXlgIChpZiBhbnkpLgoKCQkjIyMjIyBbYGlzT3duZXJgXShpZDppc093bmVyKSAtIF9Cb29sZWFuXyAoX2RlZmF1bHRfIGB0cnVlYCkKCgkJSW4gcmVsYXRpb25zaGlwcyBpdCBpcyBpbXBvcnRhbnQgdG8gaW5kaWNhdGUgdGhlIF9kaXJlY3Rpb24gb2Ygb3duZXJzaGlwXy4gVGhlIG93bmVyCgkJb2YgdGhlIHJlbGF0aW9uc2hpcCB3aWxsIHJlY2VpdmUgdGhlIF9jaGFuZ2UgZXZlbnRzXyBvZiB0aGUgcmVsYXRlZCBfbW9kZWwocylfCgkJd2hlcmVhcyB0aGUgX25vbi1vd25lcl8gd2lsbCBub3QuIEFsc28gbm90ZSB0aGF0IGlmIGBpc093bmVyYCBpcyBgZmFsc2VgIHRoZSBgaW5Db21taXRgCgkJb3B0aW9uIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGBmYWxzZWAgZXZlbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQgdG8gYHRydWVgLgoKCQktLS0KCgkJSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgY29tcGxldGVkIGBlbnlvLk1vZGVsYCBfc2NoZW1hXyBkZWZpbml0aW9uLiBfX05vdGUgbm90CgkJZXZlcnkgX21vZGVsXyBuZWVkcyB0byB1c2UgYWxsIG9mIHRoZXNlIGZlYXR1cmVzLl9fCgoJCWBgYAoJCWVueW8ua2luZCh7CgkJCW5hbWU6ICJtb2RlbHMuQ29udGFjdCIsCgkJCWtpbmQ6ICJlbnlvLk1vZGVsIiwKCQkJYXR0cmlidXRlczogewoJCQkJLy8gZXhhbXBsZSBvZiBtYXBwaW5nIGEgcmVtb3RlIGtleSB0byBhIGRpZmZlcmVudAoJCQkJLy8gbG9jYWwga2V5IGFuZCBlbnN1cmluZyBpdCB3aWxsIGJlIGEgbnVtYmVyCgkJCQlpZDogewoJCQkJCXJlbW90ZUtleTogImNvbnRhY3RfaWQiLAoJCQkJCXR5cGU6IE51bWJlcgoJCQkJfSwKCQkJCS8vIGV4YW1wbGUgb2YgY3JlYXRpbmcgYSBtZXRhIGF0dHJpYnV0ZSB0aGF0IGhhcyBubwoJCQkJLy8gZGlyZWN0IG1hcHBpbmcgdG8gYSByZW1vdGUga2V5IGJ1dCBjb21iaW5lcyB0d28KCQkJCS8vIHJlbW90ZSBrZXlzIGludG8gb25lIGxvY2FsbHkgYW5kIG9uIGNvbW1pdCB3aWxsCgkJCQkvLyBwYXJzZSB0aGVtIGFuZCBtYXAgdGhlbSBiYWNrIHRvIHRoZSBhcHByb3ByaWF0ZQoJCQkJLy8gc3RydWN0dXJlIGluIHRoZSBwYXlsb2FkLCBoZXJlIHdlIGhhdmUgdGhlIG1ldGhvZAoJCQkJLy8gaW5saW5lZCBpbiB0aGUgYXR0cmlidXRlcyBkZWZpbml0aW9uIGJ1dCBpdCBjb3VsZAoJCQkJLy8gaGF2ZSBiZWVuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCgkJCQkvLyBvbiB0aGUgbW9kZWwgaXRzZWxmCgkJCQluYW1lOiB7CgkJCQkJdHlwZTogU3RyaW5nLAoJCQkJCXR5cGVXcmFuZ2xlcjogZnVuY3Rpb24gKGZpZWxkLCBhY3Rpb24sIHBheWxvYWQpIHsKCQkJCQkJc3dpdGNoIChhY3Rpb24pIHsKCQkJCQkJY2FzZSAiZmV0Y2giOgoJCQkJCQkJLy8gZmllbGQgd2lsbCBiZSB1bmRlZmluZWQgb24gZmV0Y2ggc2luY2UgaXQKCQkJCQkJCS8vIGlzbid0IHJlcHJlc2VudGVkIGJ5IGFuIGFjdHVhbCBrZXkgaW4gdGhlIGRhdGFzZXQKCQkJCQkJCXJldHVybiBwYXlsb2FkLmZpcnN0X25hbWUgKyAiICIgKyBwYXlsb2FkLmxhc3RfbmFtZTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICJjb21taXQiOgoJCQkJCQkJLy8gZmllbGQgd2lsbCBiZSBkZWZpbmVkIGFzIHdoYXRldmVyIHRoZSBsYXN0IHN0YXRlCgkJCQkJCQkvLyBvZiB0aGUgcmVjb3JkIHdhcyBpbiB0aGUgYXBwbGljYXRpb24gYnV0IHJldHVybmluZwoJCQkJCQkJLy8gYSB2YWx1ZSBpbiB0aGlzIGNhc2Ugd2lsbCBkbyBub3RoaW5nIHNpbmNlIHdlIGRvbid0CgkJCQkJCQkvLyBoYXZlIGFuIGFjdHVhbCBrZXkgY2FsbGVkICJuYW1lIiBzbyB3ZSBtb2RpZnkgdGhlCgkJCQkJCQkvLyBwYXlsb2FkIGRpcmVjdGx5CgkJCQkJCQl2YXIgcGFydHMgPSBmaWVsZC5zcGxpdCgiICIpOwoJCQkJCQkJcGF5bG9hZC5maXJzdF9uYW1lID0gcGFydHNbMF07CgkJCQkJCQlwYXlsb2FkLmxhc3RfbmFtZSA9IHBhcnRzWzFdOwoJCQkJCQkJLy8gcmV0dXJuaW5nIGFueXRoaW5nIHdvbid0IGRvIGFueXRoaW5nIGJ1dCBmb3IgY2xhcml0eQoJCQkJCQkJLy8gd2UgcmV0dXJuIHVuZGVmaW5lZAoJCQkJCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSwKCQkJCS8vIGV4YW1wbGUgb2YgYSBtZXRhIGFzc29jaWF0aW9uIHdpdGggb3RoZXIgZGF0YSB0aGF0IGlzCgkJCQkvLyBub3QgaW5jbHVkZWQgaW4gdGhlIHBheWxvYWQgYXNzb2NpYXRlZCB3aXRoIGEgZmV0Y2ggcmVxdWVzdAoJCQkJLy8gYW5kIG5vdGUgd2UgZG8gbm90IHdpc2ggdG8gaW5jbHVkZSBpdCBpbiBhIHBheWxvYWQgZm9yIGNvbW1pdAoJCQkJLy8gb24gdGhpcyBtb2RlbAoJCQkJY29tbWVudHM6IHsKCQkJCQlyZWxhdGlvbjogZW55by50b01hbnkoewoJCQkJCQlhdXRvRmV0Y2g6IHRydWUsCgkJCQkJCWluQ29tbWl0OiBmYWxzZSwKCQkJCQkJaW52ZXJzZUtleTogIm93bmVySWQiLAoJCQkJCQlyZWxhdGlvbktleTogImlkIiwKCQkJCQkJbW9kZWw6ICJtb2RlbHMuQ29tbWVudE1vZGVsIgoJCQkJCX0pCgkJCQl9CgkJCX0KCQl9KTsKCQlgYGAKCSovCgllbnlvLmtpbmQoewoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgUFJPUEVSVElFUwoKCQkvLypAcHVibGljCgkJbmFtZTogImVueW8uTW9kZWwiLAoKCQkvLypAcHVibGljCgkJa2luZDogImVueW8uTXVsdGlwbGVEaXNwYXRjaENvbXBvbmVudCIsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJVGhlIGRlZmluZWQgX3NjaGVtYV8gZm9yIHRoaXMgX21vZGVsXy4gSWYgbm90IGRlZmluZWQgdGhlIF9tb2RlbF8KCQkJd2lsbCBhdHRlbXB0IHRvIGluZmVyIHRoZSB0aGUgX3NjaGVtYV8gZnJvbSB0aGUgc3RydWN0dXJlIG9mIHRoZQoJCQlkYXRhIHBhc3NlZCB0byBpdCBhdCBjb25zdHJ1Y3Rpb24gdGltZS4KCQkqLwoJCWF0dHJpYnV0ZXM6IG51bGwsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJVGhlIGBkZWZhdWx0c2AgaGFzaCBvZiBfZGVmYXVsdF8gdmFsdWVzIHRvIGJlIHN1cHBsaWVkIHRvIHRoZQoJCQlfbW9kZWxfIHVwb24gaW5zdGFudGlhdGlvbi4gV2hlbiBubyBfc2NoZW1hXyAoYXR0cmlidXRlcykgYXJlCgkJCWV4cGxpY2l0bHkgZGVmaW5lZCBidXQgZGVmYXVsdHMgYXJlLCB0aGUgX3NjaGVtYV8gd2lsbCBiZSBpbmZlcmVkCgkJCWZyb20gdGhlc2UgcHJvcGVydGllcy4gVGhleSBhcmUgaW4ga2V5LXZhbHVlIHBhaXJzIHdoZXJlIHRoZSB2YWx1ZQoJCQljYW4gYmUgb2YgYW55IHR5cGUsIGV2ZW4gYSBfZnVuY3Rpb25fLiBJZiB0aGUgX3ZhbHVlXyBpcyBhIF9mdW5jdGlvbl8KCQkJaXQgd2lsbCBiZSBleGVjdXRlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gdW5kZXIgdGhlIGNvbnRleHQgb2YgdGhlCgkJCW1vZGVsIChhcyBgdGhpc2ApIGFuZCBpcyBleHBlY3RlZCB0byBfX3JldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IKCQkJaXRzIGFzc2lnbmVkIHByb3BlcnR5X18uCgkJKi8KCQlkZWZhdWx0czogbnVsbCwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGUgYHVybGAgcHJvcGVydHkgaXMgYSBzdGF0aWMgcm9vdCBmb3IgdGhpcyBwYXJ0aWN1bGFyIF9tb2RlbF8uCgkJCUluIGEgc3lzdGVtIHdpdGggYSBzaW1wbGUgUkVTVCBiYWNrZW5kIHdpdGggYSAxIHRvIDEgbWFwcGluZyBvZgoJCQljbGllbnQgX21vZGVsXyB0byBiYWNrZW5kIHNlcnZlci9zZXJ2aWNlIHRoZSBgdXJsYCBjb3VsZCBiZSBvZgoJCQl0aGUgZm9ybSBgL21vZGVscy9hcnRpc3RgLiBJdCBjYW4gYWxzbyBiZSB1c2VkIGluIG1vcmUgY29tcGxleAoJCQlzY2VuYXJpb3MuIE5vdGUgdGhpcyBgdXJsYCBwcm9wZXJ0eSBpcyBhcHBlbmRlZCB0byB0aGUgX2RvbWFpbiB1cmxfCgkJCWdlbmVyZWF0ZWQgYnkgdGhlIGBlbnlvLlNvdXJjZWAgZm9yIHRoZSBgZW55by5TdG9yZWAgb2YgdGhlIGN1cnJlbnQKCQkJYXBwbGljYXRpb24uIElmIHRoZSBgbm9VcmxgIHByb3BlcnR5IGlzIHNldCB0byBgZmFsc2VgIGFuZCBubwoJCQlgdXJsYCBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUKCQkJbmFtZSBvZiB0aGUgX21vZGVsIGtpbmRfLgoJCSovCgkJdXJsOiAiIiwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGUgYHN0YXR1c2Agb2YgdGhlIG1vZGVsIGlzIGRlZmluZWQgYnkgYSBmaXhlZC1zZXQgb2YgZW51bWVyYXRlZAoJCQl2YWx1ZXMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBgZW55by5Nb2RlbGAgc3RhdGVzLgoJCSovCgkJc3RhdHVzOiBORVcsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQSBzaW1wbGUgX0Jvb2xlYW5fIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBfbW9kZWxfCgkJCWlzIGEgbG9jYWxseSBjcmVhdGVkIF9uZXdfIHJlY29yZC4gT25jZSBhIF9tb2RlbF8gaGFzIGJlZW4gX2NvbW1pdHRlZF8KCQkJb3Igd2FzIF9mZXRjaGVkXyB0aGlzIHdpbGwgYmUgYGZhbHNlYC4KCQkqLwoJCWlzTmV3OiB0cnVlLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRoZSBfU3RyaW5nXyByZXByZXNlbnRpbmcgd2hpY2ggYXR0cmlidXRlIHRvIHVzZSBhcyB0aGUgaW5kZXhhYmxlCgkJCXByaW1hcnkga2V5IGZvciB0aGlzIF9tb2RlbF8uIERlZmF1bHQgaXMgYGlkYC4KCQkqLwoJCXByaW1hcnlLZXk6ICJpZCIsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJSW4gc29tZSBjYXNlcyBjb3JyZWN0IHJlbW90ZSBjYWxscyBhcmUgZ2VuZXJhdGVkIGJ5IHNvbWUgb3RoZXIgbWVhbnMKCQkJdGhhbiB0aGUgbm9ybWFsIHVybCBnZW5lcmF0aW9uLiBJbiB0aG9zZSBjYXNlcyB0aGlzIF9Cb29sZWFuXyBmbGFnIG5lZWRzCgkJCXRvIGJlIHNldCB0byBgdHJ1ZWAuIERlZmF1bHQgaXMgYGZhbHNlYC4KCQkqLwoJCW5vVXJsOiBmYWxzZSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGUgYGVueW8uTW9kZWxgIHdpbGwgZ2VuZXJhdGUgaXRzIG93biBldmVudHMuIFdoZW4gYSBkZWZpbmVkIGBhdHRyaWJ1dGVgCgkJCW9mIHRoZSBfbW9kZWwgc2NoZW1hXyBpcyBtb2RpZmllZCBhbiBldmVudCB3aWxsIGJlIGVtaXR0ZWQgdG8gYW55CgkJCWxpc3RlbmVycyB3aXRoIGFuIGV2ZW50IHBheWxvYWQgd2l0aCB0aGUgYGNoYW5nZWRgIHByb3BlcnR5IHdpdGggdGhlCgkJCWNoYW5nZXNldCwgdGhlIGBwcmV2aW91c2AgcHJvcGVydHkgd2l0aCB0aGUgcHJldmlvdXMgdmFsdWVzIG9mIHRob3NlIGluCgkJCXRoZSBjaGFuZ2VzZXQgYW5kIHRoZSBgbW9kZWxgIHByb3BlcnR5IHRoYXQgaXMgYSByZWZlcmVuY2UgdG8gdGhpcyBfbW9kZWxfLgoKCQkJV2hlbiB0aGUgX21vZGVsXyBpcyBkZXN0cm95ZWQgaXQgd2lsbCBhbHNvIGVtaXQgYW4gZXZlbnQgd2l0aCB0aGUgcHJvcGVydHkKCQkJYG1vZGVsYCB0aGF0IGlzIGEgcmVmZXJlbmNlIHRvIHRoaXMgX21vZGVsXyAoZXZlbiB0aG91Z2ggaXQgd2lsbCBhbHJlYWR5CgkJCWhhdmUgYmVlbiBkZXN0cm95ZWQpLgoJCSovCgkJZXZlbnRzOiB7CgkJCW9uQ2hhbmdlOiAiIiwKCQkJb25EZXN0cm95OiAiIiwKCQkJb25FcnJvcjogIiIKCQl9LAoKCQkvLypAcHVibGljCgkJaGFuZGxlcnM6IHsKCQkJb25DaGFuZ2U6ICJfcmVsYXRpb25DaGFuZ2VkIiwKCQkJb25Nb2RlbENoYW5nZWQ6ICJfcmVsYXRpb25DaGFuZ2VkIgoJCX0sCgoJCS8vKkBwdWJsaWMKCQlzdGF0aWNzOiBTVEFURVMsCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBQUk9QRVJUSUVTCgoJCV9pc01vZGVsOiB0cnVlLAoJCV9jb2xsZWN0aW9uczogbnVsbCwKCQlfcmVsYXRpb25zOiBudWxsLAoJCV9hdHRyaWJ1dGVzOiBudWxsLAoJCV9hdHRyaWJ1dGVLZXlzOiBudWxsLAoJCV9wcmV2aW91czogbnVsbCwKCQlfY2hhbmdlZDogbnVsbCwKCQlfZXV1aWQ6IG51bGwsCgkJX2lzQ2hpbGQ6IGZhbHNlLAoJCV9kZWZhdWx0TW9kZWw6IGZhbHNlLAoJCV9ub0FwcGx5TWl4aW5EZXN0cm95OiB0cnVlLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBDT01QVVRFRCBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJVXNlZCBpbnRlcm5hbGx5IGJ5IGBlbnlvLlNvdXJjZWAgdG8gZ2VuZXJhdGUgYW4gYXBwcm9wcmlhdGUgcmVxdWVzdCBgdXJsYC4KCQkJT3ZlcmxvYWQgdGhpcyBtZXRob2QgaW4gY3VzdG9tIHNldHVwcy4KCQkqLwoJCXF1ZXJ5OiBlbnlvLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuICF0aGlzLm5vVXJsPyB0aGlzLmdldCgidXJsIikgKyAiLyIgKyB0aGlzLmdldCh0aGlzLnByaW1hcnlLZXkpIHx8ICIiOiAiIjsKCQl9KSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFVCTElDIE1FVEhPRFMKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlPdmVybG9hZCB0aGUgYGZpbHRlckRhdGFgIG1ldGhvZCB3aGljaCB0YWtlcyBhIHNpbmdsZSBwYXJhbWV0ZXIsIHRoZQoJCQlpbmNvbWluZyBwYXlsb2FkIGZyb20gYSBfZmV0Y2hfIHJlcXVlc3QsIGFuZCByZXR1cm4gaXQgaGF2aW5nIG1hZGUKCQkJYW55IG5lY2Vzc2FyeSBtb2RpZmljYXRpb25zIHRvIGl0LiBfX1RoaXMgbWV0aG9kIGlzIGV4ZWN1dGVkIG9uIHRoZQoJCQl0aGUgdG9wLWxldmVsIHBheWxvYWQgcHJpb3IgdG8gaW5kaXZpZHVhbCBmb3JtYXR0ZXJzIGZvciBkZWZpbmVkCgkJCWF0dHJpYnV0ZXMgaW4gYSBrbm93biBzY2hlbWFfXy4KCQkqLwoJCWZpbHRlckRhdGE6IGZ1bmN0aW9uIChkYXRhKSB7CgkJCXJldHVybiBkYXRhOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJV2hlbiB0aGUgYGVueW8uU291cmNlYCBpcyBjb25zdHJ1Y3RpbmcgdGhlIHJlcXVlc3QgZm9yIHRoaXMgX21vZGVsXwoJCQkocmVnYXJkbGVzcyBvZiB0aGUgYWN0aW9uKSBpdCB3aWxsIGNhbGwgdGhpcyBtZXRob2Qgd2hpY2ggeW91IGNhbgoJCQlvdmVybG9hZCB0byBhZGQgY3VzdG9tIHBhcmFtZXRlcnMgdG8gdGhlIGBxdWVyeVBhcmFtc2AgaGFzaCBvZiB0aGUKCQkJYG9wdGlvbnNgIHBhcmFtZXRlci4gVGhlc2UgcGFyYW1ldGVycyBhcmUga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlCgkJCXVzZWQgdG8gZ2VuZXJhdGUgdGhlIG9wdGlvbnMgaW4gYSBxdWVyeSBzdHJpbmcgaW4gZGVmYXVsdCBzZXR1cHMuIEl0CgkJCWNvdWxkIGFsc28gYmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgaW4gb3ZlcmxvYWRlZCBhbmQgY3VzdG9tIHNldHVwcy4KCQkqLwoJCWJ1aWxkUXVlcnlQYXJhbXM6IGZ1bmN0aW9uIChtb2RlbCwgb3B0aW9ucykgewoJCQkvLyB0aGUgb3B0aW9ucyBwYXJhbWV0ZXIgd2lsbCBoYXZlIGEgaGFzaCBhdCBwcm9wZXJ0eSBxdWVyeVBhcmFtcwoJCQkvLyB0aGF0IGNhbiBiZSBtb2RpZmllZCBkaXJlY3RseSBieSBhZGRpbmcgcHJvcGVydGllcyBvciB1c2luZwoJCQkvLyBlbnlvLm1peGluIGZvciBleGFtcGxlCgkJfSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gQVNZTkNIUk9OT1VTIE1FVEhPRFMKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGUgbW9kZWwgc2hvdWxkIGV4ZWN1dGUgYSBfY29tbWl0XyBvZiBpdHMgY3VycmVudCBzdGF0ZS4gVGhlIG9wdGlvbmFsCgkJCV9vcHRpb25zXyBoYXNoIGNhbiBoYXZlIGEgYHN1Y2Nlc3NgIG1ldGhvZCBhbmQvb3IgYW4gYGVycm9yYCBtZXRob2QKCQkJdG8gYmUgZXhlY3V0ZWQgb24gdGhlIGFwcHJvcHJpYXRlIHJlc3VsdCBhc3luY2hyb25vdXNseS4KCQkqLwoJCWNvbW1pdDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKCQkJdmFyICRvcHRpb25zID0gb3B0aW9ucz8gZW55by5jbG9uZShvcHRpb25zKToge307CgkJCSRvcHRpb25zLnBvc3RCb2R5ID0gdGhpcy5yYXcoKTsKCQkJdGhpcy5zZXQoInN0YXR1cyIsIEJVU1kuQ09NTUlUVElORyk7CgkJCXRoaXMuZXhlYygiY29tbWl0IiwgJG9wdGlvbnMpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJVGhlIG1vZGVsIHNob3VsZCBleGVjdXRlIGEgX2ZldGNoXy4gVGhlIG9wdGlvbmFsIF9vcHRpb25zXyBoYXNoIGNhbgoJCQloYXZlIGEgYHN1Y2Nlc3NgIG1ldGhvZCBhbmQvb3IgYW4gYGVycm9yYCBtZXRob2QgdG8gYmUgZXhlY3V0ZWQgb24gdGhlCgkJCWFwcHJvcHJpYXRlIHJlc3VsdCBhc3luY2hyb25vdXNseS4KCQkqLwoJCWZldGNoOiBmdW5jdGlvbiAob3B0aW9ucykgewoJCQl0aGlzLnNldCgic3RhdHVzIiwgQlVTWS5GRVRDSElORyk7CgkJCXRoaXMuZXhlYygiZmV0Y2giLCBvcHRpb25zKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRoZSBtb2RlbCBzaG91bGQgZXhlY3V0ZSBhIF9kZXN0cm95XyB0aGF0IGRlc3Ryb3lzIGl0IGluIHRoZSBjbGllbnQKCQkJYW5kIGFsc28gKGJ5IGRlZmF1bHQpIGEgX0RFTEVURV8gcmVxdWVzdCB0byB0aGUgX3NvdXJjZV8uIFRoZSBvcHRpb25hbAoJCQlfb3B0aW9uc18gaGFzaCBtYXkgaGF2ZSBhIGBzdWNjZXNzYCBtZXRob2QgYW5kL29yIGFuIGBlcnJvcmAgbWV0aG9kIHRvCgkJCWJlIGV4ZWN1dGVkIG9uIHRoZSBhcHByb3ByaWF0ZSByZXN1bHQgYXN5bmNocm9ub3VzbHkuCgkJKi8KCQlkZXN0cm95OiBmdW5jdGlvbiAob3B0aW9ucykgewoJCQl0aGlzLnNldCgic3RhdHVzIiwgQlVTWS5ERVNUUk9ZSU5HKTsKCQkJdGhpcy5leGVjKCJkZXN0cm95Iiwgb3B0aW9ucyk7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlXaGlsZSB0aGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGRpcmVjdGx5IGl0IGlzIG92ZXJsb2FkYWJsZQoJCQlpbiBjdXN0b20gc2V0dXBzLgoJCSovCgkJZXhlYzogZnVuY3Rpb24gKGFjdGlvbiwgb3B0aW9ucykgewoJCQlpZiAoZW55by5zdG9yZSkgewoJCQkJdmFyICRvcHRpb25zID0gb3B0aW9ucz8gZW55by5jbG9uZShvcHRpb25zKToge307CgkJCQkkb3B0aW9ucy5zdWNjZXNzID0gdGhpcy5iaW5kU2FmZWx5KCJkaWQiICsgZW55by5jYXAoYWN0aW9uKSwgb3B0aW9ucyB8fCB7fSk7CgkJCQkkb3B0aW9ucy5lcnJvciA9IHRoaXMuYmluZFNhZmVseSgiZGlkRmFpbCIsIGFjdGlvbiwgb3B0aW9ucyB8fCB7fSk7CgkJCQllbnlvLnN0b3JlW2FjdGlvbl0odGhpcywgJG9wdGlvbnMpOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5zZXQoInN0YXR1cyIsIEVSUk9SLlNPVVJDRSk7CgkJCX0KCQl9LAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJV2hpbGUgdGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBleGVjdXRlZCBkaXJlY3RseSBpdCBpcyBvdmVybG9hZGFibGUKCQkJaW4gY3VzdG9tIHNldHVwcy4gTm90ZSB0aGF0IG1hbnkgb2YgdGhlIGRldGFpbHMgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbgoJCQltYWtlIF9tb2RlbHNfIHdvcmsgcHJvcGVybHkgYW5kIGdyZWF0IGNhcmUgc2hvdWxkIGJlIHRha2VuIHdoZW4gbW9kaWZ5aW5nCgkJCWl0IG9yIHlvdSBtYXkgZW5jb3VudGVyIHVuZXhwZWN0ZWQgb3IgdW5wcmVkaWN0YWJsZSByZXN1bHRzLiBUaGUgdGhpcmQKCQkJcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gdHJ1ZSBpZiB5b3UgZG8gbm90IHdpc2ggdGhlIHJlc3VsdCB0byBiZSBwYXNzZWQKCQkJdGhyb3VnaCB0aGUgZmlsdGVyLgoJCSovCgkJZGlkRmV0Y2g6IGZ1bmN0aW9uIChvcHRpb25zLCByZXN1bHQsIG5vRmlsdGVyKSB7CgkJCXZhciAkZGF0YSA9IG5vRmlsdGVyPyAocmVzdWx0IHx8IHt9KTogdGhpcy5maWx0ZXJEYXRhKHJlc3VsdCB8fCB7fSk7CgkJCXZhciAkYXR0cnMgPSB0aGlzLl9hdHRyaWJ1dGVzOwoJCQl2YXIgcmVtLCBsb2MsICRwcm9wLCAkdmFsLCAkcmVsLCAkcmVscyA9IHRoaXMuX3JlbGF0aW9uczsKCQkJdmFyIHF1ZXVlID0gW10sICRmbjsKCQkJLy8gZW5zdXJlIHRoYXQgbm8gZXZlbnRzIG9yIG5vdGlmaWNhdGlvbnMgcHJvcGFnYXRlIHdoaWxlIHdlIGFyZQoJCQkvLyBpdGVyYXRpbmcgb3ZlciB0aGVzZSBlbnRyaWVzIGluIHRoZSByZXN1bHQgc2V0CgkJCXRoaXMuc2lsZW5jZSgpOwoJCQl0aGlzLnN0b3BOb3RpZmljYXRpb25zKCk7CgkJCWZvciAobG9jIGluICRhdHRycykgewoJCQkJJHByb3AgPSAkYXR0cnNbbG9jXTsKCQkJCXJlbSA9ICRwcm9wLnJlbW90ZUtleSB8fCBsb2M7CgkJCQkkdmFsID0gJGRhdGFbcmVtXSB8fCAkZGF0YVtsb2NdOwoJCQkJJHJlbCA9ICRyZWxzW2xvY107CgoJCQkJLy8gZmlyc3Qgd2UgcnVuIGl0IHRocm91Z2ggaXRzIGZvcm1hdHRlciB0byBlbnN1cmUgaXQgaXMKCQkJCS8vIG9mIHRoZSBhcHByb3ByaWF0ZSBzdHJ1Y3R1cmUKCQkJCSR2YWwgPSAkcHJvcC5mb3JtYXR0ZXIuY2FsbCh0aGlzLCBsb2MsICR2YWwsICJmZXRjaCIsICRkYXRhKTsKCQkJCS8vIG5vdyB3ZSBydW4gaXQgdGhyb3VnaCB0aGUgdHlwZVdyYW5nbGVyIHRvIGVuc3VyZSB0aGF0CgkJCQkvLyB0aGUgdHlwZSBjb252ZXJzaW9uIHRha2VzIHBsYWNlIGlmIG5lY2Vzc2FyeQoJCQkJJHZhbCA9ICRwcm9wLnR5cGVXcmFuZ2xlci5jYWxsKHRoaXMsIGxvYywgJHZhbCwgImZldGNoIiwgJGRhdGEpOwoJCQkJLy8gbm90ZSB0aGF0IHZhbGlkYXRpb24gb2YgdGhlIHR5cGUgd2lsbCB0YWtlIHBsYWNlIHdoZW4KCQkJCS8vIHRoZSB2YWx1ZSBpcyBzZXQsIG5vdCBoZXJlIChzaW5nbGUgZW50cnkgcG9pbnQgb2YgZmFpbHVyZSkKCgkJCQkvLyBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBhIHJlbGF0aW9uIGl0IG5lZWRzIHRvIGJlIGhhbmRsZWQKCQkJCS8vIHNlcGFyYXRlbHkgYW5kIHdlIG5lZWQgdG8gcG9zdHBvbmUgaXQgdW50aWwgd2UgaGF2ZSBhbHJlYWR5CgkJCQkvLyBzZXQgYWxsIG9mIHRoZSBsb2NhbCBwcm9wcyB0byBlbnN1cmUgaWYgb25lIGlzIG5lZWRlZCBieSB0aGUKCQkJCS8vIHJlbGF0ZWQgbW9kZWwgaXQgd2lsbCBiZSBhdmFpbGFibGUKCQkJCWlmICgkcmVsKSB7CgkJCQkJcXVldWUucHVzaChlbnlvLmJpbmQodGhpcywgJHJlbC5oYW5kbGVyLCBsb2MsICRyZWwsICR2YWwpKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBvdGhlcndpc2Ugd2Ugc2ltcGx5IHNldCB0aGUgcHJvcGVydHkgZGlyZWN0bHkKCQkJCXRoaXMuc2V0KGxvYywgJHZhbCk7CgkJCX0KCgkJCS8vIG5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYWRkaW5nIGFsbCBvZiB0aGUgZXh0cmFuZW91cyBkYXRhCgkJCS8vIChpZiBhbnkpIGFzIHdlbGwgZnJvbSB0aGUgcGF5bG9hZAoJCQlmb3IgKHJlbSBpbiAkZGF0YSkgewoJCQkJaWYgKHRoaXMuaXNBdHRyaWJ1dGUocmVtKSkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJdGhpcy5zZXQocmVtLCAkZGF0YVtyZW1dKTsKCQkJfQoKCQkJLy8gbm93IHdlIGV4ZWN1dGUgYW55IHF1ZXVlZCByZWxhdGlvbiBoYW5kbGVycwoJCQl3aGlsZSAocXVldWUubGVuZ3RoKSB7CgkJCQkkZm4gPSBxdWV1ZS5wb3AoKTsKCQkJCSRmbigpOwoJCQl9CgoJCQl0aGlzLnNldCgiaXNOZXciLCBmYWxzZSk7CgkJCXRoaXMuc2V0KCJzdGF0dXMiLCBDTEVBTik7CgkJCXRoaXMudW5zaWxlbmNlKCk7CgkJCXRoaXMuc3RhcnROb3RpZmljYXRpb25zKCk7CgkJCXRoaXMuX2ZsdXNoQ2hhbmdlcygpOwoJCQlpZiAob3B0aW9ucyAmJiBvcHRpb25zLnN1Y2Nlc3MpIHsKCQkJCW9wdGlvbnMuc3VjY2VzcyhyZXN1bHQpOwoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlXaGlsZSB0aGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGRpcmVjdGx5IGl0IGlzIG92ZXJsb2FkYWJsZQoJCQlpbiBjdXN0b20gc2V0dXBzLgoJCSovCgkJZGlkQ29tbWl0OiBmdW5jdGlvbiAob3B0aW9ucywgcmVzdWx0KSB7CgkJCWlmIChyZXN1bHQgJiYgIm9iamVjdCIgPT09IHR5cGVvZiByZXN1bHQpIHsKCQkJCXRoaXMuc2V0KHJlc3VsdCk7CgkJCX0KCQkJdGhpcy5zZXQoImlzTmV3IiwgZmFsc2UpOwoJCQl0aGlzLnNldCgic3RhdHVzIiwgQ0xFQU4pOwoJCQl0aGlzLl9jaGFuZ2VkID0ge307CgkJCWZvciAodmFyIGtleSBpbiB0aGlzLl9yZWxhdGlvbnMpIHsKCQkJCWlmICh0aGlzLl9yZWxhdGlvbnNba2V5XS5pc093bmVyKSB7CgkJCQkJaWYgKHRoaXNba2V5XSkgewoJCQkJCQl0aGlzW2tleV0uc2V0KCJzdGF0dXMiLCBDTEVBTik7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlXaGlsZSB0aGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGRpcmVjdGx5IGl0IGlzIG92ZXJsb2FkYWJsZQoJCQlpbiBjdXN0b20gc2V0dXBzLgoJCSovCgkJZGlkRGVzdHJveTogZnVuY3Rpb24gKG9wdGlvbnMsIHJlc3VsdCkgewoJCQl0aGlzLnNldCgic3RhdHVzIiwgREVTVFJPWUVEKTsKCQkJdGhpcy5kb0Rlc3Ryb3koe21vZGVsOiB0aGlzfSk7CgkJCWJyZWFrZG93bih0aGlzKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVdoaWxlIHRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgZXhlY3V0ZWQgZGlyZWN0bHkgaXQgaXMgb3ZlcmxvYWRhYmxlCgkJCWluIGN1c3RvbSBzZXR1cHMuIFRoZSBgYWN0aW9uYCBwYXJhbWV0ZXIgaXMgb25lIG9mIGAiZmV0Y2giYCwgYCJkZXN0cm95ImAsCgkJCWAiY29tbWl0ImAgb3IgYCJ1cGRhdGUiYCBkZXBpY3Rpbmcgd2hpY2ggYWN0aW9uIGZhaWxlZC4KCQkqLwoJCWRpZEZhaWw6IGZ1bmN0aW9uIChhY3Rpb24sIG9wdGlvbnMsIHJlc3VsdCkgewoJCQl0aGlzLnNldCgic3RhdHVzIiwgRVJST1IuUkVTUE9OU0UpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJUmV0dXJucyBhbiBfT2JqZWN0XyBsaXRlcmFsIHRoYXQgcmVwcmVzZW50cyB0aGUgSlNPTiBwYXJzYWJsZSBmb3JtCgkJCW9mIHRoZSBfbW9kZWxfIGluIGl0cyBjdXJyZW50IHN0YXRlLiBUYWtlcyBhbiBvcHRpb25hbCBfQm9vbGVhbl8gdGhhdAoJCQlpZiBgdHJ1ZWAgd2lsbCByZXR1cm4gdGhlIGhhc2ggd2l0aCBsb2NhbCAoY2xpZW50KSBrZXlzIGJ1dCBkZWZhdWx0cwoJCQl0byByZW1vdGUga2V5cyBpZiB0aGV5IGFyZSBkZWZpbmVkIHN1Y2ggdGhhdCBpdCBjb3VsZCBiZSB1c2VkIGFzIGEKCQkJcGF5bG9hZCB0byB0aGUgX3NvdXJjZV8uIElmIG5vIHJlbW90ZSBrZXlzIGFyZSBkZWZpbmVkIGl0IGRlZmF1bHRzIHRvCgkJCXVzaW5nIHRoZSBsb2NhbCAoY2xpZW50KSBrZXlzLgoKCQkJLy8gVE9ETzogTmVlZHMgdG8gdXNlIHRoZSB0eXBlV3JhbmdsZXIgYW5kIGZvcm1hdHRlcgoJCSovCgkJcmF3OiBmdW5jdGlvbiAobG9jYWwpIHsKCQkJdmFyICRhdHRycyA9IHRoaXMuX2F0dHJpYnV0ZXM7CgkJCXZhciBrZXksIHJlbSwgJHJlbCwgJGlyZWwsICRyZWxzID0gdGhpcy5fcmVsYXRpb25zLCAkcmV0ID0ge30sICRya2V5cyA9IGVueW8ua2V5cygkcmVscyk7CgkJCWlmIChsb2NhbCkgewoJCQkJJHJldCA9IGVueW8ub25seSh0aGlzLl9hdHRyaWJ1dGVLZXlzLCBlbnlvLmV4Y2VwdCgkcmtleXMpLCB0aGlzKTsKCQkJfSBlbHNlIHsKCQkJCWZvciAoa2V5IGluICRhdHRycykgewoJCQkJCXJlbSA9ICRhdHRyc1trZXldLnJlbW90ZUtleSB8fCBrZXk7CgkJCQkJaWYgKCEhfmVueW8uaW5kZXhPZihrZXksICRya2V5cykpIHsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCSRyZXRbcmVtXSA9IHRoaXMuZ2V0KGtleSk7CgkJCQl9CgkJCX0KCQkJLy8gbm93IHRvIGluY2x1ZGUgYW55IHJlbGF0aW9ucyB0aGF0IGFyZSBzZXQgdG8gYmUgaW5jbHVkZWQKCQkJZm9yIChrZXkgaW4gJHJlbHMpIHsKCQkJCSRyZWwgPSAkcmVsc1trZXldOwoJCQkJJGlyZWwgPSB0aGlzW2tleV0gJiYgJHJlbC5pbnZlcnNlS2V5PyB0aGlzW2tleV0uX3JlbGF0aW9uc1skcmVsLmludmVyc2VLZXldOiB7fTsKCQkJCWlmICghJHJlbC5pc093bmVyKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQlpZiAoIWVueW8uZXhpc3RzKHRoaXNba2V5XSkgfHwgKCEkcmVsLmluQ29tbWl0ICYmICEkaXJlbC5pbkNvbW1pdCkpIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCSRyZXRbbG9jYWw/IGtleTogJGF0dHJzW2tleV0ucmVtb3RlS2V5IHx8IGtleV0gPSB0aGlzW2tleV0ucmF3KGxvY2FsKTsKCQkJfQoJCQlyZXR1cm4gJHJldDsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVJldHVybnMgdGhlIEpTT04gcGFyc2VkIF9zdHJpbmdfIHZhbHVlIGZvciB0aGlzIF9tb2RlbF8gaW4gaXRzCgkJCWN1cnJlbnQgc3RhdGUgYXMgd291bGQgYmUgYXBwcm9wcmlhdGUgdG8gc2VuZCBpbiBhIHBheWxvYWQgdG8gdGhlIF9zb3VyY2VfLgoJCQlJZiB0aGUgb3B0aW9uYWwgX2xvY2FsXyBpcyBgdHJ1ZWAgdGhlbiBpdCB3aWxsIHJldHVybiB3aXRoIGxvY2FsIGtleXMKCQkJaW5zdGVhZCBvZiByZW1vdGUga2V5cyAoaWYgYW55KS4KCQkqLwoJCXRvSlNPTjogZnVuY3Rpb24gKGxvY2FsKSB7CgkJCXJldHVybiBlbnlvLmpzb24uc3RyaW5naWZ5KHRoaXMucmF3KGxvY2FsKSk7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlSZXR1cm5zIF9Cb29sZWFuXyBgdHJ1ZWAgb3IgYGZhbHNlYCBmb3Igd2hldGhlciB0aGUgX3Byb3BfCgkJCWlzIGFuIF9hdHRyaWJ1dGVfIG9mIHRoZSBfc2NoZW1hXyBmb3IgdGhpcyBfbW9kZWxfLgoJCSovCgkJaXNBdHRyaWJ1dGU6IGZ1bmN0aW9uIChwcm9wKSB7CgkJCXJldHVybiAhIX5lbnlvLmluZGV4T2YocHJvcCwgdGhpcy5fYXR0cmlidXRlS2V5cyk7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlSZXR1cm5zIF9Cb29sZWFuXyBgdHJ1ZWAgb3IgYGZhbHNlYCBmb3Igd2hldGhlciB0aGUgX3Byb3BfCgkJCWlzIGtub3duIGJ5IHRoZSBfbW9kZWwgc2NoZW1hXyBhcyBhIF9yZW1vdGVLZXlfLgoJCSovCgkJaXNSZW1vdGVBdHRyaWJ1dGU6IGZ1bmN0aW9uIChwcm9wKSB7CgkJCXJldHVybiBwcm9wIGluIHRoaXMuX3JlbW90ZUtleXM7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlSZXR1cm5zIF9Cb29sZWFuXyBgdHJ1ZWAgb3IgYGZhbHNlYCBmb3Igd2hldGhlciBfcHJvcF8KCQkJaXMgYSBfcmVsYXRpb25fIG9yIG5vdC4KCQkqLwoJCWlzUmVsYXRpb246IGZ1bmN0aW9uIChwcm9wKSB7CgkJCXJldHVybiAhISAocHJvcCBpbiB0aGlzLl9yZWxhdGlvbnMpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJUmV0cmlldmUgdGhlIHByZXZpb3VzIHZhbHVlIGZvciBfcHJvcF8gKHdoZW4gaXQgZXhpc3RzKS4KCQkqLwoJCXByZXZpb3VzOiBmdW5jdGlvbiAocHJvcCkgewoJCQlyZXR1cm4gdGhpcy5fcHJldmlvdXNbcHJvcF07CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGlzIGlzIGEgc3BlY2lhbGx5IG92ZXJsb2FkZWQgdmVyc2lvbiBvZiBgZW55by5PYmplY3Quc2V0YC4gSXQKCQkJdGFrZXMgZWl0aGVyIGEgX2hhc2hfIG9yIGEgX3N0cmluZ18gYW5kIF92YWx1ZV8gY29tYmluZWQgYXMgaXRzCgkJCXBhcmFtZXRlcnMuCgkJKi8KCQlzZXQ6IGZ1bmN0aW9uIChwcm9wLCB2YWwpIHsKCQkJaWYgKGVueW8uaXNPYmplY3QocHJvcCkpIHsKCQkJCXRoaXMuc2lsZW5jZSgpOwoJCQkJdGhpcy5zdG9wTm90aWZpY2F0aW9ucygpOwoJCQkJZm9yICh2YXIga2V5IGluIHByb3ApIHsKCQkJCQl0aGlzLnNldChrZXksIHByb3Bba2V5XSk7CgkJCQl9CgkJCQl0aGlzLnN0YXJ0Tm90aWZpY2F0aW9ucygpOwoJCQkJdGhpcy51bnNpbGVuY2UoKTsKCQkJCXRoaXMuX2ZsdXNoQ2hhbmdlcygpOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0gZWxzZSBpZiAodGhpcy5pc1JlbGF0aW9uKHByb3ApKSB7CgkJCQlyZXR1cm4gdGhpcy5zZXRSZWxhdGlvbihwcm9wLCB2YWwpOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQkJCWlmIChwcm9wICE9IHRoaXMucHJpbWFyeUtleSAmJiB0aGlzLmlzQXR0cmlidXRlKHByb3ApKSB7CgkJCQkJdGhpcy5zZXQoInN0YXR1cyIsIERJUlRZKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlVc2VkIHRvIHNldCB2YWx1ZXMgZm9yIGEgZ2l2ZW4gKGFuZCBkZWZpbmVkKSBfcmVsYXRpb25fIGZvciBhbiBfYXR0cmlidXRlXwoJCQlvZiB0aGUgX3NjaGVtYV8uIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJdCBtYXkgYmUgb3ZlcmxvYWRlZCBpbgoJCQlub24tc3RhbmRhcmQgdXNlLWNhc2VzLgoJCSovCgkJc2V0UmVsYXRpb246IGZ1bmN0aW9uIChwcm9wLCB2YWwpIHsKCQkJdmFyICRyZWwgPSB0aGlzLl9yZWxhdGlvbnNbcHJvcF07CgkJCSRyZWwuaGFuZGxlci5jYWxsKHRoaXMsIHByb3AsICRyZWwsIHZhbCk7CgkJCXRoaXMuc2V0KCJzdGF0dXMiLCBESVJUWSk7CgkJCXJldHVybiB0aGlzOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJVGhlIGNvbnN0cnVjdG9yIG5lZWRzIHRvIGJlIGFibGUgdG8gcHJvcGVybHkgaW5pdGlhbGl6ZSB0aGUKCQkJaW50ZXJuYWwgKHByb3RlY3RlZCkgcHJvcGVydGllcyBidXQgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IKCQkJZGV0ZXJtaW5pbmcgaWYgdGhlIF9zY2hlbWFfIGlzIGRlZmluZWQgYW5kIGlmIG5vdCBhdHRlbXB0IHRvCgkJCWltcGxpY2l0bHkgZGVyaXZlIGl0IGZyb20gdGhlIHBhc3NlZCBpbiB2YWx1ZXMuIElmIHRoZXJlIGlzCgkJCW5vIF9zY2hlbWFfIGRlZmluZWQgYW5kIG5vIGluaXRpYWwgX3ZhbHVlc18gcGFzc2VkIGluIG11Y2ggb2YKCQkJaXRzIGZ1bmN0aW9uYWxpdHkgd2lsbCBub3Qgd29yayBhcyBpbnRlbmRlZC4KCQkqLwoJCWNvbnN0cnVjdG9yOiBmdW5jdGlvbiAodmFsdWVzLCByZWN1cnNpbmcpIHsKCQkJLy8gZmlyc3Qgd2UgaGF2ZSBhIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCS8vIHBhc3NlZCBpbnRvIHRoZSBvYmplY3QgKGlmIHRoZXJlIHdlcmUgYW55KQoJCQl2YXIgJHZhbHVlcyA9IHZhbHVlczsKCQkJdmFyICRkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdHM7CgkJCS8vIGhlcmUgd2UgaGFuZGxlIGRlZmF1bHRzIHNvIHdlIGNhbiBhdHRlbXB0IGJvdGggc2NlbmFyaW9zCgkJCS8vIChpbmNvbWluZyB2YWx1ZXMgYW5kIGRlZmF1bHQgdmFsdWVzKSBhdCB0aGUgc2FtZSB0aW1lCgkJCWlmICghcmVjdXJzaW5nKSB7CgkJCQlpZiAoJGRlZmF1bHRzKSB7CgkJCQkJdGhpcy5kZWZhdWx0cyA9IG51bGw7CgkJCQkJLy8gd2UgZ28gYWhlYWQgYW5kIGxvb2sgZm9yIGZ1bmN0aW9ucyBpbiB0aGUgZGVmYXVsdHMgYW5kIGV4ZWN1dGUgdGhlbQoJCQkJCS8vIG5vdyBzbyB3ZSBjYW4ga2VlcCBhbGwgb2YgdGhpcyBoYW5kbGluZyBpbiBvbmUgcGxhY2UKCQkJCQlmb3IgKHZhciBrZXkgaW4gJGRlZmF1bHRzKSB7CgkJCQkJCWlmIChlbnlvLmlzRnVuY3Rpb24oJGRlZmF1bHRzW2tleV0pKSB7CgkJCQkJCQkkZGVmYXVsdHNba2V5XSA9ICRkZWZhdWx0c1trZXldLmNhbGwodGhpcyk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJJHZhbHVlcyA9ICR2YWx1ZXM/IGVueW8ubWl4aW4oJHZhbHVlcywgJGRlZmF1bHRzLCB0cnVlKTogJGRlZmF1bHRzOwoJCQkJfQoJCQkJLy8gaW5pdGlhbGl6ZSBvdXIgcmVsYXRpb25zIChpZiBhbnkpCgkJCQlpbml0UmVsYXRpb25zLmNhbGwodGhpcyk7CgkJCX0KCQkJLy8gd2Ugc2V0IHRoZSBvYmplY3QgdG8gdW5kZWZpbmVkIHNvIHdlIGNhbiBhbGxvdyB0aGUgY29uc3RydWN0b3IKCQkJLy8gY2hhaW4gdG8gY29udGludWUgd2l0aG91dCBhdXRvbWF0aWNhbGx5IGFwcGx5aW5nIHRoZXNlIHZhbHVlcwoJCQkvLyB0byB0aGlzIHJlY29yZAoJCQlpZiAoIXJlY3Vyc2luZykgewoJCQkJdmFsdWVzID0gdW5kZWZpbmVkOwoJCQkJLy8gYWxsb3cgdGhlIHJlbWFpbmluZyBjb25zdHJ1Y3RvcnMgdG8gY29tcGxldGUgdGhlaXIgaW5pdGlhbGl6YXRpb24KCQkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCQkvLyBpbml0aWFsaXplIG91ciB2YXJpYWJsZXMKCQkJCXRoaXMuX2NvbGxlY3Rpb25zID0gW107CgkJCQl0aGlzLl9wcmV2aW91cyA9IHt9OwoJCQkJdGhpcy5fY2hhbmdlZCA9IHt9OwoJCQl9CgkJCS8vIG5vdyB3ZSBjYW4gc2FmZWx5IGFwcGx5IGFueSBpbml0aWFsIHZhbHVlcyBpZiB3ZSBoYXZlIHNvbWUKCQkJLy8gbm90ZSB0aGF0IGlmIHRoZXJlIGFyZSB2YWx1ZXMgd2UgYXJlIG5vIGxvbmdlciBhIG5ldyBzdGF0dXMKCQkJLy8gd2UgYXJlIGNsZWFuIGJlY2F1c2Ugd2UgYXJlbid0IGVtcHR5CgkJCWlmICgkdmFsdWVzKSB7CgkJCQkvLyBpZiB3ZSBoYXZlIGEgZGVmaW5lZCBzdHJ1Y3R1cmUgd2UgYWRoZXJlIHRvIHRoZSBzdHJ1Y3R1cmUKCQkJCS8vIG90aGVyd2lzZSB3ZSBpbXBsaWNpdGx5IGRlcml2ZSB0aGUgc3RydWN0dXJlIGJ1dCBubyBzcGVjaWFsCgkJCQkvLyByZWxhdGlvbnNoaXBzCgkJCQlpZiAodGhpcy5fYXR0cmlidXRlS2V5cy5sZW5ndGggPiAxKSB7CgkJCQkJdGhpcy5kaWRGZXRjaCh7fSwgJHZhbHVlcywgdHJ1ZSk7CgkJCQl9IGVsc2UgaWYgKHJlY3Vyc2luZykgewoJCQkJCS8vIHRoaXMgaXMgYW4gZXJyb3Igc3RhdGUgYmVjYXVzZSB3ZSBkaWQgbm90IGRldGVybWluZSBhbnkKCQkJCQkvLyBzY2hlbWEgZm9yIHRoZSB2YWx1ZXMgcGFzc2VkIGluCgkJCQkJdGhpcy5zZXQoInN0YXRlIiwgRVJST1IuU0NIRU1BKTsKCQkJCQlyZXR1cm47CgkJCQl9IGVsc2UgewoJCQkJCS8vIHdpbGwgYXR0ZW1wdCB0byBmaWd1cmUgb3V0IHdoYXQgb3VyIHNjaGVtYSBzaG91bGQgYmUgd2l0aAoJCQkJCS8vIGFsbCBkZWZhdWx0cwoJCQkJCXZhciAkc2NoZW1hID0ge307CgkJCQkJLy8gd2UgY3JlYXRlIGFuIG9iamVjdCB3aXRoIGFsbCBvZiB0aGUga2V5cyBidXQgbm8gdmFsdWVzIHNvCgkJCQkJLy8gaXQgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIGluaXRpYWxpemF0aW9uCgkJCQkJZW55by5mb3JFYWNoKGVueW8ua2V5cygkdmFsdWVzKSwgZnVuY3Rpb24gKGtleSkgewoJCQkJCQkkc2NoZW1hW2tleV0gPSBudWxsOwoJCQkJCX0pOwoJCQkJCS8vIGluIGNhc2UgaXQgaXMgdXNlZnVsIGxhdGVyIHdlIGRlbm90ZSB0aGlzIHJlY29yZCBhcyBiZWluZyBhIG1vZGVsCgkJCQkJLy8gd2hvc2Ugc2NoZW1hIHdhcyBkZXJpdmVkIGltcGxpY2l0bHkgYW5kIG5vdCBkZWZpbmVkIGV4cGxpY2l0bHkKCQkJCQl0aGlzLl9kZWZhdWx0TW9kZWwgPSB0cnVlOwoJCQkJCS8vIHJ1biB0aGUgbmV3IHNjaGVtYSB0aHJvdWdoIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKCQkJCQlpbml0TW9kZWwodGhpcywgJHNjaGVtYSk7CgkJCQkJLy8gbm93IHJlcnVuIHRoaXMgc2FtZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBuZXcgc2NoZW1hIGFscmVhZHkgZGVmaW5lZAoJCQkJCXJldHVybiB0aGlzLl9jb25zdHJ1Y3RvcigkdmFsdWVzLCB0cnVlKTsKCQkJCX0KCQkJCS8vIHdlIHNldCBvdXIgc3RhdHVzIHRvIGNsZWFuIGJlY2F1c2Ugd2UgaGF2ZSB2YWx1ZXMKCQkJCXRoaXMuc3RhdHVzID0gQ0xFQU47CgkJCQkvLyBjbGVhciBvdXIgY2hhbmdlZCBoYXNoCgkJCQl0aGlzLl9jaGFuZ2VkID0ge307CgkJCQkvLyBzZXQgb3VyIHByZXZpb3VzIHVwIGluaXRpYWxseQoJCQkJdGhpcy5fcHJldmlvdXMgPSBlbnlvLm9ubHkodGhpcy5fYXR0cmlidXRlS2V5cywgdGhpcyk7CgkJCQkvLyB3ZSBmbHVzaCBub3RpZmljYXRpb25zCgkJCQl0aGlzLnN0YXJ0Tm90aWZpY2F0aW9ucygpOwoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGlzIG1ldGhvZCB3YXMgZGVsaWJlcmF0ZWx5IG92ZXJsb2FkZWQgdG8gYXZvaWQgYSBkZWVwZXIgbmVzdGVkCgkJCWNhbGwgaW4gdGhlIGluaGVyaXRhbmNlIHN0YWNrLiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gb3ZlcmxvYWQgaXQKCQkJYWdhaW4gdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkgd2hhdCB5b3UgYXJlIGRvaW5nLgoJCSovCgkJb3duZXJDaGFuZ2VkOiBmdW5jdGlvbihvbGQpIHsKCQkJaWYgKG9sZCAmJiBvbGQucmVtb3ZlQ29tcG9uZW50KSB7CgkJCQlvbGQucmVtb3ZlQ29tcG9uZW50KHRoaXMpOwoJCQl9CgkJCWlmICh0aGlzLm93bmVyICYmIHRoaXMub3duZXIuYWRkQ29tcG9uZW50KSB7CgkJCQl0aGlzLm93bmVyLmFkZENvbXBvbmVudCh0aGlzKTsKCQkJfQoJCX0sCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBNRVRIT0RTCgoJCS8vKkBwcm90ZWN0ZWQKCQkvKioKCQkJVXNlZCBpbnRlcm5hbGx5IHRvIHJlZ2lzdGVyIGFueSBjb2xsZWN0aW9ucyB0aGF0IG1pZ2h0IGhhdmUKCQkJYSByZWZlcmVuY2UgdG8gdGhpcyBtb2RlbCBpbiBpdC4gVGh1cyBlbnN1cmluZyB0aGF0IGVhY2ggY29sbGVjdGlvbgoJCQl3aWxsIHJlY2VpdmUgYW55IGV2ZW50cyBwcm9wYWdhdGVkIGZyb20gdGhpcyBfbW9kZWxfLgoJCSovCgkJX2FkZENvbGxlY3Rpb246IGZ1bmN0aW9uIChjb2wpIHsKCQkJaWYgKCF+ZW55by5pbmRleE9mKGNvbCwgdGhpcy5fY29sbGVjdGlvbnMpKSB7CgkJCQl0aGlzLl9jb2xsZWN0aW9ucy5wdXNoKGNvbCk7CgkJCQl0aGlzLmFkZERpc3BhdGNoVGFyZ2V0KGNvbCk7CgkJCQlmb3IgKHZhciBrZXkgaW4gdGhpcy5fcmVsYXRpb25zKSB7CgkJCQkJaWYgKGNvbFtrZXldKSB7CgkJCQkJCXRoaXMuc3RvcE5vdGlmaWNhdGlvbnModHJ1ZSk7CgkJCQkJCXRoaXMuc2V0KGtleSwgY29sW2tleV0pOwoJCQkJCQl0aGlzLnNldCgic3RhdHVzIiwgQ0xFQU4pOwoJCQkJCQl0aGlzLnN0YXJ0Tm90aWZpY2F0aW9ucyh0cnVlKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJLyoqCgkJCVVzZWQgaW50ZXJuYWxseSB0byByZW1vdmUgcmVnaXN0ZXJlZCBjb2xsZWN0aW9ucyBmcm9tIHRoZSBfbW9kZWxfLgoJCSovCgkJX3JlbW92ZUNvbGxlY3Rpb246IGZ1bmN0aW9uIChjb2wpIHsKCQkJdmFyIGlkeCA9IGVueW8uaW5kZXhPZihjb2wsIHRoaXMuX2NvbGxlY3Rpb25zKTsKCQkJaWYgKCEhfmlkeCkgewoJCQkJdGhpcy5fY29sbGVjdGlvbnMuc3BsaWNlKGlkeCwgMSk7CgkJCQl0aGlzLnJlbW92ZURpc3BhdGNoVGFyZ2V0KGNvbCk7CgkJCX0KCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJLyoqCgkJCVVzZWQgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgdG8gZW1pdCBhIF9vbkNoYW5nZV8gZXZlbnQgd2l0aCB0aGUKCQkJY2hhbmdlc2V0LCBwcmV2aW91cyB2YWx1ZXMgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBtb2RlbCB0aGF0IGNoYW5nZWQKCQkJKHRoaXMgX21vZGVsXykuCgkJKi8KCQlfZmx1c2hDaGFuZ2VzOiBmdW5jdGlvbiAoKSB7CgkJCWlmICghdGhpcy5fc2lsZW5jZWQpIHsKCQkJCXRoaXMuZG9DaGFuZ2UoewoJCQkJCXByZXZpb3VzOiB0aGlzLl9wcmV2aW91cywKCQkJCQljaGFuZ2VkOiB0aGlzLl9jaGFuZ2VkLAoJCQkJCW1vZGVsOiB0aGlzCgkJCQl9KTsKCQkJfQoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlfcmVsYXRpb25DaGFuZ2VkOiBmdW5jdGlvbiAoc2VuZGVyLCBldmVudCkgewoJCQl2YXIgJG0gPSBldmVudC5tb2RlbCB8fCBzZW5kZXIsIGtleSA9ICRtLl9yZWxhdGlvbktleTsKCQkJaWYgKCFrZXkgJiYgZXZlbnQuY29sbGVjdGlvbikgewoJCQkJJG0gPSBldmVudC5jb2xsZWN0aW9uOwoJCQkJa2V5ID0gJG0uX3JlbGF0aW9uS2V5OwoJCQl9CgkJCWlmIChrZXkpIHsKCQkJCWlmICh0aGlzW2tleV0gPT0gJG0pIHsKCQkJCQl0aGlzLl9jaGFuZ2VkW2tleV0gPSAkbTsKCQkJCQl0aGlzLnNldCgic3RhdHVzIiwgRElSVFkpOwoJCQkJfQoJCQl9CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCS8qKgoJCQlSZXRyaWV2ZXMgdGhlIGF0dHJpYnV0ZSBvYmplY3QgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlIGBwcm9wZXJ0eWAKCQkJaWYgaXQgZXhpc3RzLgoJCSovCgkJX2F0dHJpYnV0ZUZvcjogZnVuY3Rpb24gKHByb3ApIHsKCQkJcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXNbcHJvcF07CgkJfSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gT0JTRVJWRVJTCgoJCS8vKkBwcm90ZWN0ZWQKCQkvKioKCQkJU3BpZXMgb24gYWxsIGNoYW5nZSBub3RpZmljYXRpb25zIGFuZCBhZGRzIHRvIHRoZSBjaGFuZ2VzZXQgZm9yCgkJCXRoZSBtb2RlbC4gSXQgd2lsbCBleGVjdXRlIGEgX2ZsdXNoQ2hhbmdlc18gdGhhdCB3aWxsIGVtaXQgdGhlCgkJCV9vbkNoYW5nZV8gZXZlbnQgaWYgdGhlIF9tb2RlbF8gaXNuJ3QgY3VycmVudGx5IHNpbGVuY2VkLgoJCSovCgkJX2F0dHJpYnV0ZVNweTogZW55by5vYnNlcnZlcihmdW5jdGlvbiAocHJvcCwgcHJldiwgdmFsKSB7CgkJCXZhciBhdHRyOwoJCQlpZiAoKGF0dHIgPSB0aGlzLl9hdHRyaWJ1dGVGb3IocHJvcCkpIHx8IHRoaXMuaXNSZWxhdGlvbihwcm9wKSkgewoJCQkJLy8gVE9ETzogVHlwZSBjaGVja2luZyBoYXMgYmVlbiB0ZW1wb3JhcmlseSByZW1vdmVkCgkJCQkvLyBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIGFkZGVkIGFzIHZhbGlkYXRpb24gaW5zdGVhZAoJCQkJdGhpcy5fcHJldmlvdXNbcHJvcF0gPSBwcmV2OwoJCQkJdGhpcy5fY2hhbmdlZFtwcm9wXSA9IHZhbDsKCQkJCXRoaXMuX2ZsdXNoQ2hhbmdlcygpOwoJCQl9CgkJfSwgIioiKSwKCgkJLy8qQHByb3RlY3RlZAoJCV9zdGF0dXNDaGFuZ2VkOiBlbnlvLm9ic2VydmVyKGZ1bmN0aW9uIChwcm9wLCBwcmV2LCB2YWwpIHsKCQkJaWYgKHZhbCA9PSBESVJUWSkgewoJCQkJZW55by5mb3JFYWNoKHRoaXMuX2NvbGxlY3Rpb25zLCBmdW5jdGlvbiAoY29sKSB7CgkJCQkJaWYgKCF+ZW55by5pbmRleE9mKGNvbC5fZGlydHlNb2RlbHMsIHRoaXMpKSB7CgkJCQkJCWNvbC5fZGlydHlNb2RlbHMucHVzaCh0aGlzKTsKCQkJCQl9CgkJCQl9LCB0aGlzKTsKCQkJfSBlbHNlIGlmICh2YWwgPT0gQ0xFQU4pIHsKCQkJCWVueW8uZm9yRWFjaCh0aGlzLl9jb2xsZWN0aW9ucywgZnVuY3Rpb24gKGNvbCkgewoJCQkJCXZhciBpZHggPSBlbnlvLmluZGV4T2YoY29sLl9kaXJ0eU1vZGVscywgdGhpcyk7CgkJCQkJaWYgKGlkeCA+PSAwKSB7CgkJCQkJCWNvbC5fZGlydHlNb2RlbHMuc3BsaWNlKGlkeCwgMSk7CgkJCQkJfQoJCQkJfSwgdGhpcyk7CgkJCX0KCQl9LCAic3RhdHVzIikKCgl9KTsKCn0pKGVueW8pOw==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/data/ModelController.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgkKCXZhciBfc2VsZWN0ZWQgPSAvXnNlbGVjdGVkLzsKCQoJZW55by5raW5kKHsKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFVCTElDIFBST1BFUlRJRVMKCgkJLy8qQHB1YmxpYwoJCW5hbWU6ICJlbnlvLk1vZGVsQ29udHJvbGxlciIsCgoJCS8vKkBwdWJsaWMKCQltb2RlbDogbnVsbCwKCQkKCQkvLypAcHVibGljCgkJZXZlbnRzOiB7CgkJCW9uTW9kZWxTZWxlY3RlZDogIiIsCgkJCW9uTW9kZWxEZXNlbGVjdGVkOiAiIgoJCX0sCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQlraW5kOiAiZW55by5Db250cm9sbGVyIiwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gQ09NUFVURUQgUFJPUEVSVElFUwoKCQkvLypAcHJvdGVjdGVkCgkJX2F0dHJpYnV0ZUtleXM6IGVueW8uY29tcHV0ZWQoZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gdGhpcy5tb2RlbD8gdGhpcy5tb2RlbC5fYXR0cmlidXRlS2V5czogbnVsbDsKCQl9LCAibW9kZWwiLCB7Y2FjaGVkOiB0cnVlLCBkZWZlcjogdHJ1ZX0pLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgTUVUSE9EUwoKCQkvLypAcHVibGljCgkJaXNBdHRyaWJ1dGU6IGZ1bmN0aW9uIChwcm9wZXJ0eSkgewoJCQlyZXR1cm4gdGhpcy5tb2RlbD8gdGhpcy5tb2RlbC5pc0F0dHJpYnV0ZShwcm9wZXJ0eSk6IGZhbHNlOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQlnZXQ6IGZ1bmN0aW9uIChwcm9wZXJ0eSkgewoJCQlpZiAoIm1vZGVsIiA9PT0gcHJvcGVydHkgfHwgIXRoaXMuaXNBdHRyaWJ1dGUocHJvcGVydHkpKSB7CgkJCQlyZXR1cm4gdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQkJfQoJCQlyZXR1cm4gdGhpcy5tb2RlbD8gdGhpcy5tb2RlbC5nZXQocHJvcGVydHkpOiB1bmRlZmluZWQ7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCXNldDogZnVuY3Rpb24gKHByb3BlcnR5LCB2YWx1ZSkgewoJCQlpZiAoIm1vZGVsIiAhPT0gcHJvcGVydHkgJiYgIXRoaXMuaXNBdHRyaWJ1dGUocHJvcGVydHkpKSB7CgkJCQlyZXR1cm4gdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQkJfQoJCQlpZiAoIm1vZGVsIiA9PT0gcHJvcGVydHkpIHsKCQkJCXZhciAkbW9kZWwgPSB0aGlzLm1vZGVsOwoJCQkJaWYgKCRtb2RlbCkgewoJCQkJCXRoaXMuX3JlbW92ZU1vZGVsKCRtb2RlbCk7CgkJCQl9CgkJCQlpZiAoKCRtb2RlbCA9IHZhbHVlKSkgewoJCQkJCXRoaXMuc3RvcE5vdGlmaWNhdGlvbnMoKTsKCQkJCQl0aGlzLl9pbml0TW9kZWwoJG1vZGVsKTsKCQkJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCQkJCXRoaXMuc3RhcnROb3RpZmljYXRpb25zKCk7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRoaXMubW9kZWw/IHRoaXMubW9kZWwuc2V0KHByb3BlcnR5LCB2YWx1ZSk6IHRoaXM7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCXN5bmM6IGZ1bmN0aW9uICgpIHsKCQkJZW55by5mb3JFYWNoKHRoaXMuYmluZGluZ3MsIGZ1bmN0aW9uIChiaW5kaW5nKSB7CgkJCQliaW5kaW5nLnN5bmMoKTsKCQkJfSk7CgkJCWVueW8uZm9yRWFjaCh0aGlzLmdldCgiX2F0dHJpYnV0ZUtleXMiKSwgZnVuY3Rpb24gKGtleSkgewoJCQkJdGhpcy5ub3RpZnlPYnNlcnZlcnMoa2V5LCBudWxsLCB0aGlzLm1vZGVsLmdldChrZXkpKTsKCQkJfSwgdGhpcyk7CgkJfSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIE1FVEhPRFMKCgkJY3JlYXRlOiBmdW5jdGlvbiAoKSB7CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCWlmICh0aGlzLm1vZGVsKSB7CgkJCQl0aGlzLl9pbml0TW9kZWwodGhpcy5tb2RlbCk7CgkJCX0KCQl9LAoJCQoJCV9yZW1vdmVNb2RlbDogZnVuY3Rpb24gKG1vZGVsKSB7CgkJCXZhciAkbW9kZWwgPSBtb2RlbCB8fCB0aGlzLm1vZGVsOwoJCQlpZiAoJG1vZGVsKSB7CgkJCQkkbW9kZWwucmVtb3ZlRGlzcGF0Y2hUYXJnZXQodGhpcyk7CgkJCQkkbW9kZWwucmVtb3ZlT2JzZXJ2ZXIoIioiLCB0aGlzLm5vdGlmeU9ic2VydmVycyk7CgkJCX0KCQl9LAoJCQoJCV9pbml0TW9kZWw6IGZ1bmN0aW9uIChtb2RlbCkgewoJCQl2YXIgJG1vZGVsID0gbW9kZWw7CgkJCWlmICgkbW9kZWwpIHsKCQkJCSRtb2RlbC5hZGREaXNwYXRjaFRhcmdldCh0aGlzKTsKCQkJCSRtb2RlbC5hZGRPYnNlcnZlcigiKiIsIHRoaXMubm90aWZ5T2JzZXJ2ZXJzLCB0aGlzKTsKCQkJCXRoaXMuc3RvcE5vdGlmaWNhdGlvbnMoKTsKCQkJCXRoaXMuc3luYygpOwoJCQkJdGhpcy5zdGFydE5vdGlmaWNhdGlvbnMoKTsKCQkJfQoJCX0sCgkJCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gT0JTRVJWRVJTCgoJCV9zZWxlY3Rpb25TcHk6IGVueW8ub2JzZXJ2ZXIoZnVuY3Rpb24gKHByb3BlcnR5LCBwcmV2aW91cywgdmFsdWUpIHsKCQkJaWYgKF9zZWxlY3RlZC50ZXN0KHByb3BlcnR5KSkgewoJCQkJaWYgKHRydWUgPT09IHZhbHVlKSB7CgkJCQkJdGhpcy5kb01vZGVsU2VsZWN0ZWQoKTsKCQkJCX0gZWxzZSBpZiAoZmFsc2UgPT09IHZhbHVlKSB7CgkJCQkJdGhpcy5kb01vZGVsRGVzZWxlY3RlZCgpOwoJCQkJfQoJCQl9CgkJfSwgIioiKQoJCQoJfSk7Cgp9KShlbnlvKTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/data/Source.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLyoqCgkJVGhlIF9lbnlvLlNvdXJjZV8ga2luZCBpcyBhbiBwc2V1ZG8tYWJzdHJhY3QgQVBJIGZvciBjb21tdW5jYXRpbmcKCQl3aXRoIGEgYmFja2VuZCAoY291bGQgYmUgbG9jYWwgb3IgcmVtb3RlKS4gX2VueW8uU3RvcmVfIHJlcXVpcmVzIGEKCQlfc291cmNlXyB0byBmdW5jdGlvbiBwcm9wZXJseS4gQW4gX2VueW8uU291cmNlXyBjYW4gZWFzaWx5IGJlIG92ZXJsb2FkZWQKCQl0byB3b3JrIHdpdGggc3BlY2lmaWMgYmFja2VuZCBpbXBsZW1lbnRhdGlvbnMgYW5kIGRhdGEgZm9ybWF0cy4KCgkJVGhlIGJ1aWxkLWluIGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBhIHJlbW90ZSBSRVNUIEFQSQoJCXJlbHlpbmcgb24gR0VULCBQT1NULCBQVVQgYW5kIERFTEVURSB0byBjb21tdW5pY2F0ZSB3aXRoIChyZW1vdGUpIHNvdXJjZS4KCQlGb3IgX2ZldGNoXyByZXF1ZXN0cyBpdCB3aWxsIHVzZSBHRVQuIFNlZSBfZW55by5Db2xsZWN0aW9uXyBhbmQgX2VueW8uTW9kZWxfCgkJZm9yIHNwZWNpZmljcy4KCSovCgoJdmFyIG5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh1cmwpIHsKCQlyZXR1cm4gdXJsLnJlcGxhY2UoLyhbXjpdXC8pKFwvKykvZywgIiQxIik7Cgl9OwoKCWVueW8ua2luZCh7CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJCW5hbWU6ICJlbnlvLlNvdXJjZSIsCgkJa2luZDogImVueW8uQ29tcG9uZW50IiwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGUgdHlwZSBvZiBvYmplY3QgdG8gdXNlIGZvciByZXF1ZXN0cy4gQXMgbG9uZyBhcyB0aGUga2luZCBoYXMgdGhlCgkJCXNhbWUgQVBJIGFzIF9lbnlvLkFzeW5jXyBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdXNlIGl0IHdpdGggX2VueW8uU291cmNlXy4KCQkqLwoJCXJlcXVlc3RLaW5kOiAiZW55by5BamF4IiwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGUgcm9vdCBkb21haW4gZm9yIGFsbCByZXF1ZXN0cy4gRG9lcyBub3QgbmVlZCB0aGUgX2h0dHBfIGJ1dCBtYXkKCQkJaW5jbHVkZSBpdC4gRm9yIHNlY3VyZSAoX2h0dHBzXykgc2VlIHRoZSBfc2VjdXJlXyBwcm9wZXJ0eS4KCQkqLwoJCWRvbWFpbjogIiIsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQW4gb3B0aW9uYWwgc3RyaW5nIHRvIGJlIGFwcGVuZGVkIGFmdGVyIHRoZSBfdXJsXyBpcyBjb25zdHJ1Y3RlZC4KCQkqLwoJCXVybFBvc3RmaXg6ICIiLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRoZSBwb3J0IHRvIHVzZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUgX3VybF8uIE9ubHkgc3BlY2lmeSBpZiB0aGUgbmVjZXNzYXJ5CgkJCXBvcnQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgZG9tYWluIHBvcnQgKGUuZy4gaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHVzZQoJCQlkb2N1bWVudC5sb2NhdGlvbi5wb3J0IHVubGVzcyB0aGUgX2lnbm9yZVBvcnRfIG9wdGlvbiBpcyBzZXQgdG8gX3RydWVfKS4KCQkqLwoJCXBvcnQ6IG51bGwsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJSWYgdGhlIGN1cnJlbnQgZG9tYWluIGZvciB0aGUgY2xpZW50IGlzIHJ1bm5pbmcgb24gYSBfcG9ydF8gZGlmZmVyZW50IHRoYW4KCQkJODAgKGUuZy4gaHR0cDovL2xvY2FsaG9zdDo4MDgwKSB0aGlzIHdpbGwgY29uc3RydWN0IHJlcXVlc3RzIHdpdGhvdXQgdGhlCgkJCXBvcnQuCgkJKi8KCQlpZ25vcmVQb3J0OiBmYWxzZSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlJZiBhIHNlY3VyZSB1cmwgaXMgbmVjZXNzYXJ5IChfaHR0cHNfKSBzZXQgdGhpcyB0byBfdHJ1ZV8uCgkJKi8KCQlzZWN1cmU6IGZhbHNlLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUlmIHRoZSAocmVtb3RlKSBiYWNrZW5kIGlzIHJlYWQtb25seSBzZXQgdGhpcyB0byBfdHJ1ZV8gdG8gZGlzc2FsbG93IGFueQoJCQljYWxscyB0byBQT1NULCBQVVQgb3IgREVMRVRFLgoJCSovCgkJcmVhZE9ubHk6IGZhbHNlLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUEgYmluZGFibGUgcHJvcGVydHkgdG8ga25vdyB3aGVuIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaXMgdGFraW5nIHBsYWNlLgoJCSovCgkJYnVzeTogZmFsc2UsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJVGhlIGRlZmF1bHQgb3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIHJlcXVlc3Qgb2JqZWN0LiBQcmVzZWRlbmNlIGlzIGdpdmVuCgkJCXRvIF9tb2RlbHNfIG9yIF9jb2xsZWN0aW9uc18gdGhhdCBwcm92aWRlIHRoZWlyIG93biBvcHRpb25zIHRoYXQgb3ZlcnJpZGUgYW55CgkJCWRlZmF1bHQgb3B0aW9ucy4KCgkJCURlZmF1bHRzIHdpdGggY2FjaGVCdXN0IHRydWUgYW5kIGNvbnRlbnRUeXBlIGFwcGxpY2F0aW9uL2pzb24uCgkJKi8KCQlkZWZhdWx0T3B0aW9uczogewoJCQljYWNoZUJ1c3Q6IGZhbHNlLAoJCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL2pzb24iCgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGUgZGVmYXVsdCBoZWFkZXJzIHRvIGJlIHVzZWQgaW4gcmVxdWVzdHMgaWYgdGhleSBkaWZmZXIgZnJvbSB0aG9zZQoJCQlpbiBfZW55by5BamF4UHJvcGVydGllc18uCgkJKi8KCQlkZWZhdWx0SGVhZGVyczogbnVsbCwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIFBST1BFUlRJRVMKCgkJX25vQXBwbHlNaXhpbkRlc3Ryb3k6IHRydWUsCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIENPTVBVVEVEIFBST1BFUlRJRVMKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFVCTElDIE1FVEhPRFMKCQlidWlsZFVybDogZnVuY3Rpb24gKG1vZGVsLCBvcHRpb25zKSB7CgkJCWlmICghb3B0aW9ucy51cmwpIHsKCQkJCXZhciB1cmwgPSAhfnRoaXMuZG9tYWluLmluZGV4T2YoImh0dHAiKT8gImh0dHAiICsgKHRoaXMuc2VjdXJlPyAicyI6ICIiKSArICI6Ly8iICsgdGhpcy5kb21haW46IHRoaXMuZG9tYWluOwoJCQkJaWYgKCF0aGlzLmlnbm9yZVBvcnQgJiYgKHRoaXMucG9ydCB8fCBsb2NhdGlvbi5wb3J0KSkgewoJCQkJCXVybCArPSAoIjoiICsgKHRoaXMucG9ydD8gdGhpcy5wb3J0OiBsb2NhdGlvbi5wb3J0KSArICIvIik7CgkJCQl9CgkJCQl1cmwgKz0gIi8iICsgdGhpcy51cmxQb3N0Zml4ICsgbW9kZWwuZ2V0KCJxdWVyeSIpOwoJCQkJb3B0aW9ucy51cmwgPSBub3JtYWxpemUodXJsKTsKCQkJfSBlbHNlIHsKCQkJCW9wdGlvbnMudXJsUHJvdmlkZWQgPSB0cnVlOwoJCQl9CgkJfSwKCQlidWlsZEhlYWRlcnM6IGZ1bmN0aW9uIChtb2RlbCwgb3B0aW9ucykgewoJCQlvcHRpb25zLmhlYWRlcnMgPSBlbnlvLm1peGluKG1vZGVsLmdldCgiaGVhZGVycyIpLCB0aGlzLmRlZmF1bHRIZWFkZXJzLCB0cnVlKTsKCQl9LAoJCWJ1aWxkUXVlcnlQYXJhbXM6IGZ1bmN0aW9uIChtb2RlbCwgb3B0aW9ucykgewoJCQkvLyBhZGQgcHJvcGVydHkgdG8gb3B0aW9ucyBjYWxsZWQgcXVlcnlQYXJhbXMgYXMKCQkJLy8gb2JqZWN0IGxpdGVyYWwgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIHF1ZXJ5IHN0cmluZwoJCQlvcHRpb25zLnF1ZXJ5UGFyYW1zID0gb3B0aW9ucy5xdWVyeVBhcmFtcyB8fCB7fTsKCQkJbW9kZWwuYnVpbGRRdWVyeVBhcmFtcyhtb2RlbCwgb3B0aW9ucyk7CgkJfSwKCQlidWlsZFJlcXVlc3Q6IGZ1bmN0aW9uIChtb2RlbCwgb3B0aW9ucykgewoJCQl0aGlzLmJ1aWxkVXJsKG1vZGVsLCBvcHRpb25zKTsKCQkJdGhpcy5idWlsZEhlYWRlcnMobW9kZWwsIG9wdGlvbnMpOwoJCQl0aGlzLmJ1aWxkUXVlcnlQYXJhbXMobW9kZWwsIG9wdGlvbnMpOwoJCQllbnlvLm1peGluKG9wdGlvbnMsIHRoaXMuZGVmYXVsdE9wdGlvbnMsIHRydWUpOwoJCX0sCgkJY29tbWl0OiBmdW5jdGlvbiAobW9kZWwsIG9wdGlvbnMpIHsKCQkJaWYgKHRoaXMucmVhZE9ubHkpIHsKCQkJCWlmIChvcHRpb25zICYmIG9wdGlvbnMuZXJyb3IpIHsKCQkJCQlvcHRpb25zLmVycm9yKHt9KTsKCQkJCX0KCQkJCXJldHVybjsKCQkJfQoJCQl0aGlzLmJ1aWxkUmVxdWVzdChtb2RlbCwgb3B0aW9ucyk7CgkJCXN3aXRjaCAobW9kZWwuaXNOZXcpIHsKCQkJY2FzZSB0cnVlOgoJCQkJb3B0aW9ucy5tZXRob2QgPSAiUE9TVCI7CgkJCQlicmVhazsKCQkJY2FzZSBmYWxzZToKCQkJCW9wdGlvbnMubWV0aG9kID0gIlBVVCI7CgkJCQlicmVhazsKCQkJfQoJCQl0aGlzLmV4ZWMoImNvbW1pdCIsIG9wdGlvbnMpOwoJCX0sCgkJZmV0Y2g6IGZ1bmN0aW9uIChtb2RlbCwgb3B0aW9ucykgewoJCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKCQkJCXRoaXMuYnVpbGRSZXF1ZXN0KG1vZGVsLCBvcHRpb25zKTsKCQkJCW9wdGlvbnMubWV0aG9kID0gIkdFVCI7CgkJCX0gZWxzZSB7CgkJCQlvcHRpb25zID0gbW9kZWw7CgkJCX0KCQkJdGhpcy5zZXQoImJ1c3kiLCB0cnVlKTsKCQkJdGhpcy5leGVjKCJmZXRjaCIsIG9wdGlvbnMpOwoJCX0sCgkJZGVzdHJveTogZnVuY3Rpb24gKG1vZGVsLCBvcHRpb25zKSB7CgkJCWlmICh0aGlzLnJlYWRPbmx5KSB7CgkJCQlpZiAob3B0aW9ucyAmJiBvcHRpb25zLnN1Y2Nlc3MpIHsKCQkJCQlvcHRpb25zLnN1Y2Nlc3Moe30pOwoJCQkJfQoJCQkJcmV0dXJuOwoJCQl9CgkJCXRoaXMuYnVpbGRSZXF1ZXN0KG1vZGVsLCBvcHRpb25zKTsKCQkJb3B0aW9ucy5tZXRob2QgPSAiREVMRVRFIjsKCQkJdGhpcy5leGVjKCJkZXN0cm95Iiwgb3B0aW9ucyk7CgkJfSwKCQlleGVjOiBmdW5jdGlvbiAod2hpY2gsIG9wdGlvbnMpIHsKCQkJdmFyICRvcHRpb25zID0gZW55by5vbmx5KHRoaXMuX2FqYXhPcHRpb25zLCBvcHRpb25zKTsKCQkJdmFyICRzdWNjZXNzID0gdGhpcy5iaW5kU2FmZWx5KCJvblN1Y2Nlc3MiLCB3aGljaCwgb3B0aW9ucyk7CgkJCXZhciAkZmFpbCA9IHRoaXMuYmluZFNhZmVseSgib25GYWlsIiwgd2hpY2gsIG9wdGlvbnMpOwoJCQl2YXIgJGNvbSA9IG5ldyB0aGlzLnJlcXVlc3RLaW5kKCRvcHRpb25zKTsKCQkJdmFyICRwYXJhbXMgPSBvcHRpb25zLnF1ZXJ5UGFyYW1zOwoJCQlpZiAob3B0aW9ucy5tZXRob2QgIT09ICJHRVQiICYmIHRoaXMucmVhZE9ubHkpIHsKCQkJCXJldHVybiAkZmFpbCgpOwoJCQl9CgkJCSRjb20ucmVzcG9uc2UoJHN1Y2Nlc3MpOwoJCQkkY29tLmVycm9yKCRmYWlsKTsKCQkJJGNvbS5nbygkcGFyYW1zKTsKCQl9LAoJCWZpbHRlckRhdGE6IGZ1bmN0aW9uIChkYXRhKSB7CgkJCXJldHVybiBkYXRhOwoJCX0sCgkJb25TdWNjZXNzOiBmdW5jdGlvbiAod2hpY2gsIG9wdGlvbnMsIHJlcXVlc3QsIHJlc3BvbnNlKSB7CgkJCWlmICgiZmV0Y2giID09PSB3aGljaCkgewoJCQkJdGhpcy5zZXQoImJ1c3kiLCBmYWxzZSk7CgkJCX0KCQkJdmFyIHJlc3VsdCA9IHRoaXMuZmlsdGVyRGF0YShyZXNwb25zZSksICRmbjsKCgkJCWlmICgoJGZuID0gdGhpc1siZGlkIiArIGVueW8uY2FwKHdoaWNoKV0pKSB7CgkJCQlpZiAoZW55by5pc0Z1bmN0aW9uKCRmbikpIHsKCQkJCQlpZiAoISRmbi5jYWxsKHRoaXMsIG9wdGlvbnMsIHJlc3VsdCkpIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYgKG9wdGlvbnMuc3VjY2VzcykgewoJCQkJb3B0aW9ucy5zdWNjZXNzKHJlc3VsdCk7CgkJCX0KCQl9LAoJCW9uRmFpbDogZnVuY3Rpb24gKHdoaWNoLCBvcHRpb25zLCByZXF1ZXN0LCBlcnJvcikgewoJCQlpZiAoImZldGNoIiA9PT0gd2hpY2gpIHsKCQkJCXRoaXMuc2V0KCJidXN5IiwgZmFsc2UpOwoJCQl9CgkJCWlmIChvcHRpb25zLmVycm9yKSB7CgkJCQlvcHRpb25zLmVycm9yKHJlcXVlc3QsIGVycm9yKTsKCQkJfQoJCX0sCgoJCWNvbnN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCXRoaXMuZGVmYXVsdE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRPcHRpb25zIHx8IHt9OwoJCQl0aGlzLmRlZmF1bHRIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycyB8fCB7fTsKCQkJdGhpcy5kb21haW4gPSB0aGlzLmRvbWFpbiB8fCAoZnVuY3Rpb24gKCkgewoJCQkJcmV0dXJuIGxvY2F0aW9uLnBhdGhuYW1lLmxlbmd0aCA+IDEKCQkJCQk/IGxvY2F0aW9uLmhyZWYuc3BsaXQoIi8iKS5zbGljZSgwLC0xKS5qb2luKCIvIikKCQkJCQk6IGxvY2F0aW9uLm9yaWdpbjsKCQkJfSgpKTsKCQl9LAoJCWNvbnN0cnVjdGVkOiBmdW5jdGlvbiAoKSB7CgkJCXZhciAka2luZCA9IHRoaXMucmVxdWVzdEtpbmQgfHwgZW55by5BamF4OwoJCQl0aGlzLnJlcXVlc3RLaW5kID0gInN0cmluZyIgPT09IHR5cGVvZiAka2luZD8gZW55by5nZXRQYXRoKCRraW5kKTogJGtpbmQ7CgkJCXRoaXMuX2FqYXhPcHRpb25zID0gZW55by5rZXlzKGVueW8uQWpheFByb3BlcnRpZXMpOwoJCX0KCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIE1FVEhPRFMKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gT0JTRVJWRVJTCgoJfSk7CgoJLy8qQHByb3RlY3RlZAoJZW55by5yZWFkeShmdW5jdGlvbiAoKSB7CgkJZW55by5zaW5nbGV0b24oewoJCQluYW1lOiAiZW55by5Tb3VyY2UuZGVmYXVsdFNvdXJjZSIsCgkJCWtpbmQ6ICJlbnlvLlNvdXJjZSIsCgkJCWZldGNoOiBmdW5jdGlvbiAobW9kZWwsIG9wdGlvbnMpIHsKCQkJCWlmIChvcHRpb25zICYmIG9wdGlvbnMuZXJyb3IpIHsKCQkJCQl2YXIgZm4gPSBvcHRpb25zLmVycm9yOwoJCQkJCW9wdGlvbnMuZXJyb3IgPSBudWxsOwoJCQkJCWZuKG9wdGlvbnMpOwoJCQkJfQoJCQl9LAoJCQljb21taXQ6IGZ1bmN0aW9uIChtb2RlbCwgb3B0aW9ucykgewoJCQkJaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lcnJvcikgewoJCQkJCXZhciBmbiA9IG9wdGlvbnMuZXJyb3I7CgkJCQkJb3B0aW9ucy5lcnJvciA9IG51bGw7CgkJCQkJZm4ob3B0aW9ucyk7CgkJCQl9CgkJCX0sCgkJCWRlc3Ryb3k6IGZ1bmN0aW9uIChtb2RlbCwgb3B0aW9ucykgewoJCQkJaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zdWNjZXNzKSB7CgkJCQkJdmFyIGZuID0gb3B0aW9ucy5zdWNjZXNzOwoJCQkJCW9wdGlvbnMuc3VjY2VzcyA9IG51bGw7CgkJCQkJZm4ob3B0aW9ucyk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwoKfSkoZW55byk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/data/Store.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGhlIF9lbnlvLlN0b3JlXyBraW5kIGlzIGEgc2luZ2xldG9uICh3aGVuIHVzZWQpIHRoYXQgYWlkcyBpbgoJCW1hbmFnaW5nIGxvY2FsaXplZCBkYXRhIHJlY29yZHMgYXQgcnVudGltZS4gSXQgdHJhY2tzIG1vZGVscyBhbmQKCQlpcyBhbiBpbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGRhdGEgc2NoZW1hIGZvciBhbnkgYXBwbGljYXRpb24uCgoJCUFuIF9lbnlvLlN0b3JlXyBtdXN0IGhhdmUgYW4gX2VueW8uU291cmNlXyB0byBiZSBmdWxseSBmdW5jdGlvbmFsLiBUaGUKCQlfc3RvcmVfIGlzIGFnbm9zdGljIHRvIGhvdyB0aGUgX3NvdXJjZV8gcmV0cmlldmVzIG9yIHVwZGF0ZXMgcmVjb3Jkcy4gSXQKCQlwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBBUEkgZm9yIGZpbmRpbmcgcGFydGljdWxhciByZWNvcmRzLiBJdCBpcyBhbHdheXMKCQlhY2Nlc3NpYmxlIGZyb20gdGhlIGdsb2JhbGx5IGF2YWlsYWJsZSBfZW55by5zdG9yZV8gdmFyaWFibGUuCgoJCUl0IGlzIGluc3RhbnRpYXRlZCBxdWl0ZSBzaW1wbHkgYW5kIHdvdWxkIHR5cGljYWxseSBiZSBkb25lIGJlZm9yZSBpbnN0YW50aWF0aW5nCgkJdGhlIF9lbnlvLkFwcGxpY2F0aW9uXyBmb3IgeW91ciBhcHAuCgoJCW5ldyBlbnlvLlN0b3JlKHtzb3VyY2U6ICJlbnlvLlNvdXJjZSJ9KTsgLy8gbm93IGF2YWlsYWJsZSBmcm9tIGVueW8uc3RvcmUKCgkJTk9URTogTXVjaCBvZiB0aGUgcHVibGljIEFQSSBvZiBfZW55by5TdG9yZV8gbmVlZG4ndCBiZSBjYWxsZWQgZGlyZWN0bHkgZXhjZXB0CgkJaW4gdmVyeSBjb21wbGV4IHJlbW90ZS1iYWNrZW5kIGltcGxlbWVudGF0aW9ucyByZXF1aXJpbmcgc3BlY2lhbGl6ZWQgaGFuZGxpbmcuCgkJTW9zdCBvZiB0aGUgQVBJIGlzIGNhbGxlZCBieSBfZW55by5Nb2RlbF8gYW5kIF9lbnlvLkNvbGxlY3Rpb25fIGZvciB5b3UuCgoJCVRPRE86IE11Y2ggb2YgdGhlIGltcGxlbWVudGF0aW9uIGlzIHdvcmtpbmcgYnV0IGluIHNvbWUgY2FzZXMgaXMgZWl0aGVyIGFic2VudAoJCW9yIG9ubHkgcGFydGlhbGx5IGNvbXBsZXRlZC4gUGxlYXNlIGJlYXIgd2l0aCB1cyBhcyB3ZSBjb21wbGV0ZSB0aGlzIG1vdmluZwoJCWZvcndhcmQuCgkqLwoKCgllbnlvLnN0b3JlID0gbnVsbDsKCWVueW8ubW9kZWxzID0gewoJCWtpbmRzOiBbXSwKCQlhZGQ6IGZ1bmN0aW9uIChjdG9yKSB7CgkJCWlmICghfmVueW8uaW5kZXhPZihjdG9yLCB0aGlzLmtpbmRzKSkgewoJCQkJdGhpcy5raW5kcy5wdXNoKGN0b3IpOwoJCQl9CgkJCWlmIChlbnlvLnN0b3JlKSB7CgkJCQllbnlvLnN0b3JlLl9hZGRNb2RlbEtpbmQoY3Rvcik7CgkJCX0KCQl9Cgl9OwoKCS8qKgoJCUFzIHNlZW4gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vamN4cGxvcmVyLzgyMzg3OCwgYnkgamN4cGxvcmVyLgoJCVRPRE86IHJlcGxhY2Ugd2l0aCBmYXN0ZXIgaW1wbGVtZW50YXRpb24KCSovCgl2YXIgdXVpZCA9IGZ1bmN0aW9uICgpIHsKCQl2YXIgdXVpZCA9ICIiLCBpZHggPSAwLCByYW5kOwoJCWZvciAoOyBpZHggPCAzMjsgKytpZHgpIHsKCQkJcmFuZCA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7CgkJCWlmIChpZHggPT0gOCB8fCBpZHggPT0gMTIgfHwgaWR4ID09IDE2IHx8IGlkeCA9PSAyMCkgewoJCQkJdXVpZCArPSAiLSI7CgkJCX0KCQkJdXVpZCArPSAoaWR4ID09IDEyPyA0OiAoaWR4ID09IDE2PyAocmFuZCAmIDMgfCA4KTogcmFuZCkpLnRvU3RyaW5nKDE2KTsKCQl9CgkJcmV0dXJuIHV1aWQ7Cgl9OwoKCWVueW8ua2luZCh7CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJCW5hbWU6ICJlbnlvLlN0b3JlIiwKCQlraW5kOiAiZW55by5NdWx0aXBsZURpc3BhdGNoQ29tcG9uZW50IiwKCQlzb3VyY2U6IG51bGwsCgkJYnVzeTogZmFsc2UsCgkJaGFuZGxlcnM6IHsKCQkJb25DaGFuZ2U6ICJfbW9kZWxDaGFuZ2VkIiwKCQkJb25EZXN0cm95OiAiX21vZGVsRGVzdHJveWVkIgoJCX0sCgkJYmluZGluZ3M6IFsKCQkJe2Zyb206ICIuc291cmNlLmJ1c3kiLCB0bzogIi5idXN5In0KCQldLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgUFJPUEVSVElFUwoKCQlfcmVjb3JkczogbnVsbCwKCQlfbm9BcHBseU1peGluRGVzdHJveTogdHJ1ZSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gQ09NUFVURUQgUFJPUEVSVElFUwoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgTUVUSE9EUwoKCQl1dWlkOiBmdW5jdGlvbiAoKSB7CgkJCXJldHVybiB1dWlkKCk7CgkJfSwKCQkvKioKCQkJQSBzaW1wbGUgZmluZCBtZWNoYW5pc20gdG8gcXVlcnkgdmFsaWQgcmVjb3JkcyBpbiB0aGUgc3RvcmUuCgkJCUlmIHRoZSBfb3B0aW9uc18gX3JlbW90ZV8gcHJvcGVydHkgZXhpc3RzIGFuZCBpcyB0cnVlIGl0IHdpbGwKCQkJZXhlY3V0ZSBhc3luY2hyb25vdXNseSBhbmQgcnVuIHRoZSBxdWVyeSBhZ2FpbnN0IHRoZSBjb21iaW5lZAoJCQlyZXN1bHQgc2V0IG9mIHJlY29yZHMgYXMgcmV0dXJuZWQgZnJvbSB0aGUgcmVtb3RlIHNvdXJjZSBhbmQKCQkJYW55IGV4aXN0aW5nIGxvY2FsIHJlY29yZHMuIElmIG5vIF9yZW1vdGVfIHByb3BlcnR5IGV4aXN0cyBvcgoJCQlpdCBpcyBmYWxzZSAoZGVmYXVsdCkgaXQgd2lsbCByZXR1cm4gc3luY2hyb25vdXNseSByZXN1bHRpbmcgaW4KCQkJYW4gYXJyYXkgb2YgcmVjb3JkcyBpZiBhbnkgd2VyZSBmb3VuZCBvciBmYWxzZSBvdGhlcndpc2UuIFRoZQoJCQlmaXJzdCBwYXJhbWV0ZXIgY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBjb25zdHJ1Y3RvciBtYXRjaGluZwoJCQl0aGUgbmFtZSBvciBraW5kIG9mIHRoZSBtb2RlbCBiZWluZyBxdWVyaWVkIHdpdGggYW4gb3B0aW9uYWwKCQkJX29wdGlvbnNfIHBhcmFtZXRlciBvZiBhbiBvYmplY3QgbGl0ZXJhbC4gVGhlc2Ugb3B0aW9ucyB3aWxsIGJlCgkJCXBhc3NlZCB0byB0aGUgX3F1ZXJ5UmVzb2x2ZXJfIG1ldGhvZC4gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4KCQkJdG8gaGFuZGxlIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgZm9yIGFkdmFuY2VkIHF1ZXJ5aW5nIG5lZWRzLgoKCQkJVE9ETzogbm90IGltcGxlbWVudGVkIGFzIHN0YXRlZAoJCSovCgkJZmluZDogZnVuY3Rpb24gKGN0b3IsIG9wdGlvbnMpIHsKCQkJdmFyIHJldCA9IHRoaXMuX3JlY29yZHNGb3JUeXBlKGN0b3IpOwoJCQlpZiAoIXJldCkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXJldHVybiB0aGlzLnF1ZXJ5UmVzb2x2ZXIoZW55by5jbG9uZShyZXQuYWxsKSwgb3B0aW9ucyk7CgkJfSwKCQkvKioKCQkJUGFzcyBhIGNvbnN0cnVjdG9yIGFuZCBvcHRpb25zIHRvIHRoaXMgYXN5bmNocm9ub3VzIG1ldGhvZCB0byByZXRyaWV2ZQoJCQlhIHNpbmdsZSByZWNvcmQgKHdpbGwgdXNlIGxvY2FsbHkgaWYgZm91bmQpIGFuZCB3aWxsIGV4ZWN1dGUgYSBmZXRjaAoJCQlpZiBuZWVkZWQuIElmIG5vIF9zdWNjZXNzXyBtZXRob2QgaXMgcHJvdmlkZWQgYnV0IHRoZSByZWNvcmQgd2FzIGZvdW5kCgkJCWxvY2FsbHkgaXQgd2lsbCBiZSByZXR1cm5lZCBzeW5jaHJvbm91c2x5LiBUaGUgX29wdGlvbnNfIGhhc2ggY2FuIGhhdmUKCQkJYSBfc3VjY2Vzc18gbWV0aG9kLCBfZXJyb3JfIG1ldGhvZCBhbmQgYSBfcGFyYW1zXyBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydGllcwoJCQl1c2VkIHRvIGZpbmQgdGhlIGNvcnJlY3QgcmVjb3JkLgoKCQkJVE9ETzogbm90IGZ1bGx5IGltcGxlbWVudGVkCgkJKi8KCQlmaW5kT25lOiBmdW5jdGlvbiAoY3Rvciwgb3B0aW9ucykgewoJCQl2YXIgJG9wdGlvbnMgPSBvcHRpb25zPyBlbnlvLmNsb25lKG9wdGlvbnMpOiB7fTsKCQkJdmFyICRwYXJhbXMgPSBvcHRpb25zLnBhcmFtcyB8fCB7fTsKCQkJdmFyICRtb2RlbHMgPSB0aGlzLl9yZWNvcmRzRm9yVHlwZShjdG9yKTsKCQkJdmFyIHBrID0gKCJzdHJpbmciID09PSB0eXBlb2YgY3Rvcj8gZW55by5nZXRQYXRoKGN0b3IpOiBjdG9yKS5wcm90b3R5cGUucHJpbWFyeUtleTsKCQkJdmFyICRyZXQ7CgkJCWlmIChwayBpbiAkcGFyYW1zKSB7CgkJCQlpZiAoKCRyZXQgPSAkbW9kZWxzLmJ5UHJpbWFyeUtleVskcGFyYW1zW3BrXV0pKSB7CgkJCQkJaWYgKG9wdGlvbnMuc3VjY2VzcykgewoJCQkJCQlvcHRpb25zLnN1Y2Nlc3MoJHJldCk7CgkJCQkJfQoJCQkJCXJldHVybiAkcmV0OwoJCQkJfQoJCQl9CgkJCS8qIGpzaGludCAtVzA1NSAqLwoJCQkkcmV0ID0gbmV3IGN0b3IoJHBhcmFtcyk7CgkJCS8qIGpzaGludCArVzA1NSAqLwoJCQkkcmV0LmZldGNoKHtzdWNjZXNzOiB0aGlzLmJpbmRTYWZlbHkoZnVuY3Rpb24gKG9wdGlvbnMsIG1vZGVsKSB7CgkJCQlpZiAob3B0aW9ucy5zdWNjZXNzKSB7CgkJCQkJb3B0aW9ucy5zdWNjZXNzKG1vZGVsKTsKCQkJCX0KCQkJfSwgJG9wdGlvbnMsICRyZXQpfSk7CgkJfSwKCQkvKioKCQkJVE9ETzogbm90IGltcGxlbWVudGVkCgkJKi8KCQlmaW5kUmVtb3RlOiBmdW5jdGlvbiAoY3Rvciwgb3B0aW9ucykgewoJCQkvLyBUT0RPOiBub3QgaW1wbGVtZW50ZWQgeWV0CgkJCWVueW8ud2FybigiZW55by5TdG9yZS5maW5kUmVtb3RlOiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Iik7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCS8qKgoJCQlUT0RPOiBub3QgaW1wbGVtZW50ZWQKCQkqLwoJCXF1ZXJ5UmVzb2x2ZXI6IGZ1bmN0aW9uIChtb2RlbHMsIG9wdGlvbnMpIHsKCQkJcmV0dXJuIG1vZGVsczsKCQl9LAoJCWluaXRNb2RlbDogZnVuY3Rpb24gKG1vZGVsKSB7CgkJCXZhciBpZCA9IG1vZGVsLmV1dWlkID0gdGhpcy51dWlkKCk7CgkJCWlmICghbW9kZWxbbW9kZWwucHJpbWFyeUtleV0gJiYgIW1vZGVsLl9kaWRBdHRlbXB0RmV0Y2hJZCkgewoJCQkJbW9kZWwuX2RpZEF0dGVtcHRGZXRjaElkID0gdHJ1ZTsKCQkJCXZhciAkb3B0aW9ucyA9IHsKCQkJCQlzdWNjZXNzOiB0aGlzLmJpbmRTYWZlbHkoImluaXRNb2RlbCIsIG1vZGVsKQoJCQkJfTsKCQkJCXJldHVybiB0aGlzLmZldGNoSWQobW9kZWwsICRvcHRpb25zKTsKCQkJfQoJCQl0aGlzLl9yZWNvcmRzW2lkXSA9IG1vZGVsOwoJCQl0aGlzLl9yZWNvcmRzW21vZGVsLmtpbmROYW1lXS5hbGwucHVzaChtb2RlbCk7CgkJCW1vZGVsLmFkZERpc3BhdGNoVGFyZ2V0KHRoaXMpOwoJCQlpZiAobW9kZWxbbW9kZWwucHJpbWFyeUtleV0pIHsKCQkJCXRoaXMuX3JlY29yZHNbbW9kZWwua2luZE5hbWVdLmJ5UHJpbWFyeUtleVttb2RlbFttb2RlbC5wcmltYXJ5S2V5XV0gPSBtb2RlbDsKCQkJfQoJCX0sCgkJZmV0Y2g6IGZ1bmN0aW9uIChtb2RlbCwgb3B0aW9ucykgewoJCQl2YXIgJG9wdGlvbnMgPSBvcHRpb25zPyBlbnlvLmNsb25lKG9wdGlvbnMpOiB7fTsKCQkJJG9wdGlvbnMuc3VjY2VzcyA9IHRoaXMuYmluZFNhZmVseSgiZGlkRmV0Y2giLCBtb2RlbCwgb3B0aW9ucyk7CgkJCSRvcHRpb25zLmVycm9yID0gdGhpcy5iaW5kU2FmZWx5KCJkaWRGYWlsIiwgImZldGNoIiwgbW9kZWwsIG9wdGlvbnMpOwoKCQkJLy8gaWYgdGhlIG1vZGVsIGlzIE5FVyB3ZSBnZW5lcmF0ZSBhbiBpZCBmb3IgaXQgb25seQoJCQlpZiAobW9kZWwuc3RhdHVzID09PSAiTkVXIikgewoJCQkJcmV0dXJuIHRoaXMuZmV0Y2hJZChtb2RlbCwgb3B0aW9ucyk7CgkJCX0KCgkJCXRoaXMuc291cmNlLmZldGNoKG1vZGVsLCAkb3B0aW9ucyk7CgkJfSwKCQljb21taXQ6IGZ1bmN0aW9uIChtb2RlbCwgb3B0aW9ucykgewoJCQl2YXIgJG9wdGlvbnMgPSBvcHRpb25zPyBlbnlvLmNsb25lKG9wdGlvbnMpOiB7fTsKCQkJJG9wdGlvbnMuc3VjY2VzcyA9IHRoaXMuYmluZFNhZmVseSgiZGlkQ29tbWl0IiwgbW9kZWwsIG9wdGlvbnMpOwoJCQkkb3B0aW9ucy5lcnJvciA9IHRoaXMuYmluZFNhZmVseSgiZGlkRmFpbCIsICJjb21taXQiLCBtb2RlbCwgb3B0aW9ucyk7CgkJCXRoaXMuc291cmNlLmNvbW1pdChtb2RlbCwgJG9wdGlvbnMpOwoJCX0sCgkJZGVzdHJveTogZnVuY3Rpb24gKG1vZGVsLCBvcHRpb25zKSB7CgkJCXZhciAkb3B0aW9ucyA9IG9wdGlvbnM/IGVueW8uY2xvbmUob3B0aW9ucyk6IHt9OwoJCQkkb3B0aW9ucy5zdWNjZXNzID0gdGhpcy5iaW5kU2FmZWx5KCJkaWREZXN0cm95IiwgbW9kZWwsIG9wdGlvbnMpOwoJCQkkb3B0aW9ucy5lcnJvciA9IHRoaXMuYmluZFNhZmVseSgiZGlkRmFpbCIsICJkZXN0cm95IiwgbW9kZWwsIG9wdGlvbnMpOwoJCQl0aGlzLnNvdXJjZS5kZXN0cm95KG1vZGVsLCAkb3B0aW9ucyk7CgkJfSwKCQlmZXRjaElkOiBmdW5jdGlvbiAobW9kZWwsIG9wdGlvbnMpIHsKCQkJdmFyICRvcHRpb25zID0gb3B0aW9ucz8gZW55by5jbG9uZShvcHRpb25zKToge307CgkJCSRvcHRpb25zLnN1Y2Nlc3MgPSB0aGlzLmJpbmRTYWZlbHkoImRpZEZldGNoSWQiLCBtb2RlbCwgb3B0aW9ucyk7CgkJCWlmIChtb2RlbC5mZXRjaElkKSB7CgkJCQlyZXR1cm4gbW9kZWwuZmV0Y2hJZCgkb3B0aW9ucyk7CgkJCX0KCQkJLy8gVE9ETzogdGhpcyBtYXkgbm90IGJlIHVzZWZ1bCBpbiBhbmQgb2YgaXRzZWxmIHNpbmNlCgkJCS8vIG1vc3QgYmFja2VuZHMgd2lsbCBoYXZlIHRoZWlyIG93biBzY2hlbWUgZm9yIGdlbmVyYXRpbmcKCQkJLy8gYW4gaWQgdmlhIHNlcXVlbmNlIGV0Yy4KCQkJJG9wdGlvbnMuc3VjY2Vzcyhtb2RlbC5ldXVpZCk7CgkJfSwKCQljb25zdHJ1Y3RvcjogZnVuY3Rpb24gKCkgewoJCQkvLyB0aGVyZSBjYW4gb25seSBiZSBvbmUgc3RvcmUgZXhlY3V0aW5nIGF0IGEgdGltZQoJCQlpZiAoZW55by5zdG9yZSkgewoJCQkJdGhyb3cgIlRoZXJlIGNhbiBvbmx5IGJlIG9uZSBlbnlvLlN0b3JlIGFjdGl2ZSI7CgkJCX0KCQkJZW55by5zdG9yZSA9IHRoaXM7CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCXRoaXMuX3JlY29yZHMgPSB7fTsKCQkJZW55by5mb3JFYWNoKGVueW8ubW9kZWxzLmtpbmRzLCB0aGlzLl9hZGRNb2RlbEtpbmQsIHRoaXMpOwoJCQlpZiAoIXRoaXMuc291cmNlKSB7CgkJCQl0aGlzLnNvdXJjZSA9IGVueW8uU291cmNlLmRlZmF1bHRTb3VyY2U7CgkJCX0KCQl9LAoJCWNvbnN0cnVjdGVkOiBmdW5jdGlvbiAoKSB7CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCXRoaXMuZmluZEFuZEluc3RhbmNlKCJzb3VyY2UiKTsKCQl9LAoJCXNvdXJjZUZpbmRBbmRJbnN0YW5jZTogZnVuY3Rpb24gKGN0b3IsIGluc3QpIHsKCQkJaWYgKGluc3QpIHsKCQkJCWluc3Quc2V0KCJvd25lciIsIHRoaXMpOwoJCQl9CgkJfSwKCQlkaWRGZXRjaDogZnVuY3Rpb24gKG1vZGVsLCBvcHRpb25zLCByZXN1bHQpIHsKCQkJLy8gVE9ETzogLi4uCgkJCWlmIChvcHRpb25zLnN1Y2Nlc3MpIHsKCQkJCW9wdGlvbnMuc3VjY2VzcyhyZXN1bHQpOwoJCQl9CgkJfSwKCQlkaWRDb21taXQ6IGZ1bmN0aW9uIChtb2RlbCwgb3B0aW9ucywgcmVzdWx0KSB7CgkJCS8vIFRPRE86IC4uLgoJCQlpZiAob3B0aW9ucy5zdWNjZXNzKSB7CgkJCQlvcHRpb25zLnN1Y2Nlc3MocmVzdWx0KTsKCQkJfQoJCX0sCgkJZGlkRGVzdHJveTogZnVuY3Rpb24gKG1vZGVsLCBvcHRpb25zLCByZXN1bHQpIHsKCQkJLy8gVE9ETzogLi4uCgkJCWlmIChvcHRpb25zLnN1Y2Nlc3MpIHsKCQkJCW9wdGlvbnMuc3VjY2VzcyhyZXN1bHQpOwoJCQl9CgkJfSwKCQlkaWRGZXRjaElkOiBmdW5jdGlvbiAobW9kZWwsIG9wdGlvbnMsIHJlc3VsdCkgewoJCQltb2RlbC5zZXQobW9kZWwucHJpbWFyeUtleSwgcmVzdWx0KTsKCQkJaWYgKG9wdGlvbnMuc3VjY2VzcykgewoJCQkJb3B0aW9ucy5zdWNjZXNzKHJlc3VsdCk7CgkJCX0KCQl9LAoJCWRpZEZhaWw6IGZ1bmN0aW9uICh3aGljaCwgbW9kZWwsIG9wdGlvbnMsIHJlcXVlc3QsIGVycm9yKSB7CgkJCS8vIFRPRE86IC4uLgoJCQlpZiAob3B0aW9ucy5lcnJvcikgewoJCQkJb3B0aW9ucy5lcnJvcihyZXF1ZXN0LCBlcnJvcik7CgkJCX0KCQl9LAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgTUVUSE9EUwoKCQlfYWRkTW9kZWxLaW5kOiBmdW5jdGlvbiAoY3RvcikgewoJCQlpZiAoIXRoaXMuX3JlY29yZHNbY3Rvci5wcm90b3R5cGUua2luZE5hbWVdKSB7CgkJCQl0aGlzLl9yZWNvcmRzW2N0b3IucHJvdG90eXBlLmtpbmROYW1lXSA9IHsKCQkJCQlhbGw6IFtdLAoJCQkJCWJ5UHJpbWFyeUtleToge30KCQkJCX07CgkJCX0KCQl9LAoJCV9tb2RlbENoYW5nZWQ6IGZ1bmN0aW9uIChzZW5kZXIsIGV2ZW50KSB7CgkJCWlmIChldmVudC5tb2RlbCkgewoJCQkJdmFyICRtb2RlbCA9IGV2ZW50Lm1vZGVsOwoJCQkJdmFyICRjaGFuZ2VkID0gZXZlbnQuY2hhbmdlZDsKCQkJCXZhciAkcHJldiA9IGV2ZW50LnByZXZpb3VzOwoJCQkJdmFyIGtleSA9ICRtb2RlbC5wcmltYXJ5S2V5OwoJCQkJdmFyIGtpbmQgPSAkbW9kZWwua2luZE5hbWU7CgkJCQlpZiAoa2V5IGluICRjaGFuZ2VkKSB7CgkJCQkJLy8gd2UgaGF2ZSB0byByZW1vdmUgdGhlIGVudHJ5IGFsdG9nZXRoZXIKCQkJCQlkZWxldGUgdGhpcy5fcmVjb3Jkc1traW5kXS5ieVByaW1hcnlLZXlbJHByZXZba2V5XV07CgkJCQkJLy8gb25seSByZS1hZGQgaXQgaWYgdGhlcmUgaXMgYWN0dWFsbHkgYSB2YWx1ZQoJCQkJCWlmICgkY2hhbmdlZFtrZXldKSB7CgkJCQkJCXRoaXMuX3JlY29yZHNba2luZF0uYnlQcmltYXJ5S2V5WyRjaGFuZ2VkW2tleV1dID0gJG1vZGVsOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0sCgkJX21vZGVsRGVzdHJveWVkOiBmdW5jdGlvbiAoc2VuZGVyLCBldmVudCkgewoJCQl2YXIgZXV1aWQgPSBzZW5kZXIuZXV1aWQ7CgkJCXZhciBpZCA9IHNlbmRlcltzZW5kZXIucHJpbWFyeUtleV07CgkJCXZhciBraW5kID0gc2VuZGVyLmtpbmROYW1lOwoJCQl2YXIgaWR4ID0gZW55by5pbmRleE9mKHNlbmRlciwgdGhpcy5fcmVjb3Jkc1traW5kXS5hbGwpOwoJCQlkZWxldGUgdGhpcy5fcmVjb3Jkc1tldXVpZF07CgkJCWRlbGV0ZSB0aGlzLl9yZWNvcmRzW2tpbmRdLmJ5UHJpbWFyeUtleVtpZF07CgkJCXRoaXMuX3JlY29yZHNba2luZF0uYWxsLnNwbGljZShpZHgsIDEpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9LAoJCV9yZWNvcmRzRm9yVHlwZTogZnVuY3Rpb24gKGN0b3IpIHsKCQkJcmV0dXJuIHRoaXMuX3JlY29yZHNbInN0cmluZyIgPT09IHR5cGVvZiBjdG9yPyBjdG9yOiBjdG9yLnByb3RvdHlwZS5raW5kTmFtZV07CgkJfSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gT0JTRVJWRVJTCgoJCV9zb3VyY2VDaGFuZ2VkOiBlbnlvLm9ic2VydmVyKGZ1bmN0aW9uIChwcm9wLCBwcmV2LCB2YWwpIHsKCQkJaWYgKHZhbCkgewoJCQkJdmFsLnNldCgib3duZXIiLCB0aGlzKTsKCQkJCXRoaXMucmVidWlsZEJpbmRpbmdzKCk7CgkJCX0KCQl9LCAic291cmNlIikKCgl9KTsKCgp9KShlbnlvKTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/data/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJIlN0b3JlLmpzIiwKCSJTb3VyY2UuanMiLAoJIk1vZGVsLmpzIiwKCSJDb2xsZWN0aW9uLmpzIiwKCSJNb2RlbENvbnRyb2xsZXIuanMiCik7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/dev.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uICgpIHsKCSJ1c2Ugc3RyaWN0IjsKCgkvLypAcHJvdGVjdGVkCgkvKioKCQlXaGVuIGF2YWlsYWJsZSwgc3VwcGx5IGEgaGlnaC1wcmVjaXNpb24sIGhpZ2ggcGVyZm9ybWFuY2UKCQltb25vdG9uaWMgYmVuY2htYXJrIGZvciBzb21lIGludGVybmFsIHVzYWdlIGFuZCBiZW5jaG1hcmsgdGVzdGluZy4KCSovCgllbnlvLmJlbmNoID0gKGZ1bmN0aW9uICgpIHsKCQkvLyB3ZSBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBicm93c2VyIGhhcyBzdXBwbGllZCBhIHZhbGlkCgkJLy8gbWV0aG9kIHRvIHVzZQoJCXZhciBwZXJmID0gd2luZG93LnBlcmZvcm1hbmNlIHx8IHt9OwoJCS8vIHRlc3QgYWdhaW5zdCBhbGwga25vd24gdmVuZG9yLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucywgYnV0IHVzZQoJCS8vIGEgZmFsbGJhY2sganVzdCBpbiBjYXNlCgkJcGVyZi5ub3cgPSBwZXJmLm5vdyB8fCBwZXJmLm1vek5vdyB8fCBwZXJmLm1zTm93IHx8IHBlcmYub05vdyB8fCBwZXJmLndlYmtpdE5vdyB8fCBlbnlvLm5vdzsKCQlyZXR1cm4gZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gcGVyZi5ub3coKTsKCQl9OwoJfSgpKTsKCgkvLypAcHJvdGVjdGVkCgkvKioKCQlUaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBtZXRob2RzIHRvIGFzc2lzdCBpbiBzaW1wbGUgYmVuY2htYXJraW5nLgoJCVRoZSBnb2FsIHdhcyB0byBzdXBwbHkgdXNlZnVsIGZ1bmN0aW9uYWxpdHkgd2hpbGUgaW1wYWN0aW5nIHRoZSByZXN1bHRzCgkJYXMgbGl0dGxlIGFzIHBvc3NpYmxlICh0aGUgbW9yZSBjYWxjdWxhdGlvbnMgd2UgZG8gZHVyaW5nIGJlbmNobWFya2luZywKCQl0aGUgZ3JlYXRlciB0aGUgb3Bwb3J0dW5pdHkgdG8gc2tldyByZXN1bHRzKS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50CgkJd2hlbiB1c2luZyBwb3RlbnRpYWxseS1uZXN0ZWQgYmVuY2htYXJrIHNlcmllcyAoaS5lLiwgYmVuY2htYXJraW5nIGEgbWV0aG9kCgkJdGhhdCBleGVjdXRlcyBvdGhlciBiZW5jaG1hcmtlZCBtZXRob2RzKS4KCSovCgoJLy8gVHJhY2sgdGhlIGFjdGl2ZSB0ZXN0cwoJdmFyIHRlc3RzID0ge307CgkvLyBUcmFjayBhdmVyYWdlcwoJdmFyIGF2ZXJhZ2VzID0ge307CgoJLy8gRGVmYXVsdCByZXBvcnQgdGVtcGxhdGUgc3RyaW5nCgl2YXIgcmVwb3J0X3RlbXBsYXRlID0gIi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLVxuIiArCgkJCQkJIkJFTkNITUFSSyBSRVBPUlQgKCUuKTogJS5cbiIgKwoJCQkJCSJUT1RBTCBUSU1FIChtcyk6ICUuXG4iICsKCQkJCQkiQVZFUkFHRSBUSU1FIChtcyk6ICUuXG4iICsKCQkJCQkiTUlOSU1VTSBUSU1FIChtcyk6ICUuXG4iICsKCQkJCQkiTUFYSU1VTSBUSU1FIChtcyk6ICUuXG4iICsKCQkJCQkiTlVNQkVSIE9GIEVOVFJJRVM6ICUuXG4iICsKCQkJCQkiLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtXG4iOwoKCS8vIENhbGN1bGF0ZXMgYXZlcmFnZSBhbmQgYmFzaWMgc3RhdGlzdGljcy4KCXZhciBjYWxjID0gZnVuY3Rpb24gKG51bWJlcnMpIHsKCQl2YXIgdG90YWwgPSAwOwoJCXZhciBtaW4gPSBJbmZpbml0eTsKCQl2YXIgbWF4ID0gLUluZmluaXR5OwoJCXZhciBudW1iZXIgPSBudW1iZXJzLmxlbmd0aDsKCQl2YXIgc3RhdHMgPSB7dG90YWw6IG51bGwsIGF2ZXJhZ2U6IG51bGwsIG51bWJlcjogbnVtYmVyLCBtaW46IG51bGwsIG1heDogbnVsbH07CgkJZW55by5mb3JFYWNoKG51bWJlcnMsIGZ1bmN0aW9uIChudW0pIHsKCQkJdG90YWwgKz0gbnVtOwoJCQltaW4gPSBNYXRoLm1pbihudW0sIG1pbik7CgkJCW1heCA9IE1hdGgubWF4KG51bSwgbWF4KTsKCQl9KTsKCQlzdGF0cy50b3RhbCA9IHRvdGFsOwoJCXN0YXRzLm1pbiA9IG1pbjsKCQlzdGF0cy5tYXggPSBtYXg7CgkJc3RhdHMuYXZlcmFnZSA9IE1hdGguYWJzKHRvdGFsLyhudW1iZXIgfHwgMSkpOwoJCXJldHVybiBzdGF0czsKCX07CgoJLy8qQHB1YmxpYwoJZW55by5kZXYgPSB7CgoJCS8vKkBwdWJsaWMKCQkvLyogY2FuIGJlIHNldCB0byBmYWxzZSB0byBkaXNhYmxlIGFsbCBiZW5jaG1hcmtpbmcgY29kZQoJCWVuYWJsZWQ6IHRydWUsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQ3JlYXRlIGEgbmV3IGJlbmNobWFyayB0ZXN0LgoJCQlUaGUgb3B0cyBvYmplY3QgcGFzc2VkIGluIGhhcyB0aGUgcHJvcGVydGllcwoKCQkJKiBuYW1lOiBvcHRpb25hbCBuYW1lIGZvciB0ZXN0CgkJCSogYXZlcmFnZTogaWYgdHJ1ZSwgY2FsY3VsYXRlIGFuIGF2ZXJhZ2Ugb2YgcmVwZWF0ZWQgc3RhcnQvc3RvcHMgZm9yIHRoZSB0ZXN0CgkJCSogbG9nZ2luZzogaWYgdHJ1ZSwgd3JpdGUgc3RhcnQgYW5kIHN0b3AgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUgKGRlZmF1bHRzIHRvIHRydWUpCgkJCSogYXV0b3N0YXJ0OiBpZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHN0YXJ0IHRoZSBiZW5jaG1hcmsgKGRlZmF1bHRzIHRvIHRydWUpCgoJCQlUaGlzIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgaGFzIHN0YXJ0IGFuZCBzdG9wIG1ldGhvZHMgdXNlZAoJCQl0byB0cmFjayBhIHRlc3QuCgkJKi8KCQliZW5jaDogZnVuY3Rpb24gKG9wdHMpIHsKCQkJaWYgKHRydWUgIT09IHRoaXMuZW5hYmxlZCkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXZhciBvcHRpb25zID0gb3B0cyB8fCB7bmFtZTogZW55by51aWQoImJlbmNoIil9OwoJCQlyZXR1cm4gbmV3IEJlbmNobWFyayhvcHRpb25zKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLy8qIE91dHB1dCB0byB0aGUgY29uc29sZSBpbmZvcm1hdGlvbiBhYm91dCBhIGJlbmNobWFyayBuYW1lZCBfbmFtZV8uCgkJcmVwb3J0OiBmdW5jdGlvbiAobmFtZSkgewoJCQl2YXIgYmVuY2ggPSBhdmVyYWdlc1tuYW1lXSB8fCB0ZXN0c1tuYW1lXTsKCQkJaWYgKCFiZW5jaCkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWlmIChiZW5jaC5yZXBvcnQgJiYgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGJlbmNoLnJlcG9ydCkgewoJCQkJcmV0dXJuIGJlbmNoLnJlcG9ydCgpOwoJCQl9IGVsc2UgewoJCQkJdmFyIHN0YXRzID0gY2FsYyhiZW5jaCk7CgkJCQllbnlvLmxvZygKCQkJCQllbnlvLmZvcm1hdCgKCQkJCQkJcmVwb3J0X3RlbXBsYXRlLAoJCQkJCQkiYXZlcmFnZXMiLAoJCQkJCQluYW1lLAoJCQkJCQlzdGF0cy50b3RhbCwKCQkJCQkJc3RhdHMuYXZlcmFnZSwKCQkJCQkJc3RhdHMubWluLAoJCQkJCQlzdGF0cy5tYXgsCgkJCQkJCXN0YXRzLm51bWJlcgoJCQkJCSkKCQkJCSk7CgkJCX0KCQl9LAoKCQkvLypAcHVibGljCgkJLy8qIFJlbW92ZSBzdG9yZWQgZGF0YSBmb3IgYSBiZW5jaG1hcmsgbmFtZWQgX25hbWVfLgoJCWNsZWFyOiBmdW5jdGlvbiAobmFtZSkgewoJCQl2YXIgc291cmNlID0gdGVzdHNbbmFtZV0/IHRlc3RzOiBhdmVyYWdlc1tuYW1lXT8gYXZlcmFnZXM6IG51bGw7CgkJCWlmICghc291cmNlKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJaWYgKHNvdXJjZS5jb21wbGV0ZSkgewoJCQkJc291cmNlLmNvbXBsZXRlKCk7CgkJCX0KCQkJaWYgKHNvdXJjZVtuYW1lXSBpbnN0YW5jZW9mIEFycmF5KSB7CgkJCQlzb3VyY2VbbmFtZV0gPSBbXTsKCQkJfQoJCQllbHNlIHsKCQkJCWRlbGV0ZSBzb3VyY2VbbmFtZV07CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfQoKCX07CgoJLy8qQHByb3RlY3RlZAoJZnVuY3Rpb24gQmVuY2htYXJrIChvcHRpb25zKSB7CgkJZW55by5taXhpbih0aGlzLCBvcHRpb25zKTsKCQl0ZXN0c1t0aGlzLm5hbWVdID0gdGhpczsKCQlpZiAodHJ1ZSA9PT0gdGhpcy5hdmVyYWdlICYmICFhdmVyYWdlc1t0aGlzLm5hbWVdKSB7CgkJCWF2ZXJhZ2VzW3RoaXMubmFtZV0gPSBbXTsKCQl9CgkJaWYgKGF2ZXJhZ2VzW3RoaXMubmFtZV0gJiYgZmFsc2UgIT09IHRoaXMuYXZlcmFnZSkgewoJCQl0aGlzLl9hdmVyYWdpbmcgPSB0cnVlOwoJCX0KCQlpZiAodHJ1ZSA9PT0gdGhpcy5hdXRvU3RhcnQpIHsKCQkJdGhpcy5zdGFydCgpOwoJCX0KCX0KCgkvLypAcHJvdGVjdGVkCglCZW5jaG1hcmsucHJvdG90eXBlID0gewoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgUFJPUEVSVElFUwoKCQlsb2dnaW5nOiB0cnVlLAoJCWF1dG9TdGFydDogdHJ1ZSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIFBST1BFUlRJRVMKCgkJX3N0YXJ0ZWQ6IGZhbHNlLAoJCV9hdmVyYWdpbmc6IGZhbHNlLAoJCV9iZWdpbjogbnVsbCwKCQlfZW5kOiBudWxsLAoJCV90aW1lOiBudWxsLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgTUVUSE9EUwoKCQlzdGFydDogZnVuY3Rpb24gKCkgewoJCQlpZiAodHJ1ZSA9PT0gdGhpcy5fc3RhcnRlZCkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCXRoaXMuX2xvZygic3RhcnRpbmcgYmVuY2htYXJrIik7CgkJCXRoaXMuX2JlZ2luID0gZW55by5iZW5jaCgpOwoJCQl0aGlzLl9zdGFydGVkID0gdHJ1ZTsKCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc3RvcDogZnVuY3Rpb24gKCkgewoJCQlpZiAoIXRoaXMuX3N0YXJ0ZWQpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl0aGlzLl9lbmQgPSBlbnlvLmJlbmNoKCk7CgkJCXRoaXMuX3RpbWUgPSB0aGlzLl9lbmQgLSB0aGlzLl9iZWdpbjsKCQkJdGhpcy5fbG9nKCJiZW5jaG1hcmsgY29tcGxldGU6ICIgKyB0aGlzLl90aW1lKTsKCQkJaWYgKHRydWUgPT09IHRoaXMuX2F2ZXJhZ2luZykgewoJCQkJYXZlcmFnZXNbdGhpcy5uYW1lXS5wdXNoKHRoaXMuX3RpbWUpOwoJCQl9CgkJCXRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIE1FVEhPRFMKCgkJX2xvZzogZnVuY3Rpb24gKG1lc3NhZ2UpIHsKCQkJaWYgKCF0aGlzLmxvZ2dpbmcpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQllbnlvLmxvZygiYmVuY2ggKCIgKyB0aGlzLm5hbWUgKyAiKTogIiArIG1lc3NhZ2UpOwoJCX0KCgl9Owp9KCkpOw==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/job.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglJbnZva2VzIGZ1bmN0aW9uIF9pbkpvYl8gYWZ0ZXIgX2luV2FpdF8gbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUKCWxhc3QgdGltZSBfaW5Kb2JOYW1lXyB3YXMgcmVmZXJlbmNlZC4KCglKb2JzIGNhbiBiZSB1c2VkIHRvIHRocm90dGxlIGJlaGF2aW9ycy4gIElmIHNvbWUgZXZlbnQgbWF5IG9jY3VyIG9uY2Ugb3IKCW11bHRpcGxlIHRpbWVzLCBidXQgd2Ugd2FudCBhIHJlc3BvbnNlIHRvIG9jY3VyIG9ubHkgb25jZSBldmVyeSBfbl8Jc2Vjb25kcywKCXdlIGNhbiB1c2UgYSBqb2IuCgoJCW9uc2Nyb2xsOiBmdW5jdGlvbigpIHsKCQkJLy8gdXBkYXRlVGh1bWIgd2lsbCBiZSBjYWxsZWQsIGJ1dCBvbmx5IHdoZW4gMXMgaGFzIGVsYXBzZWQgc2luY2UgdGhlCgkJCS8vIGxhc3Qgb25zY3JvbGwKCQkJZW55by5qb2IoInVwZGF0ZVRodW1iIiwgdGhpcy5iaW5kU2FmZWx5KCJ1cGRhdGVUaHVtYiIpLCAxMDAwKTsKCQl9CiovCmVueW8uam9iID0gZnVuY3Rpb24oaW5Kb2JOYW1lLCBpbkpvYiwgaW5XYWl0KSB7CgllbnlvLmpvYi5zdG9wKGluSm9iTmFtZSk7CgllbnlvLmpvYi5fam9ic1tpbkpvYk5hbWVdID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQllbnlvLmpvYi5zdG9wKGluSm9iTmFtZSk7CgkJaW5Kb2IoKTsKCX0sIGluV2FpdCk7Cn07CgovKioKCUNhbmNlbHMgdGhlIG5hbWVkIGpvYiwgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGZpcmVkLgoqLwplbnlvLmpvYi5zdG9wID0gZnVuY3Rpb24oaW5Kb2JOYW1lKSB7CglpZiAoZW55by5qb2IuX2pvYnNbaW5Kb2JOYW1lXSkgewoJCWNsZWFyVGltZW91dChlbnlvLmpvYi5fam9ic1tpbkpvYk5hbWVdKTsKCQlkZWxldGUgZW55by5qb2IuX2pvYnNbaW5Kb2JOYW1lXTsKCX0KfTsKCi8qKgoJSW52b2tlIF9pbkpvYl8gaW1tZWRpYXRlbHksIHRoZW4gcHJldmVudCBhbnkgb3RoZXIgY2FsbHMgdG8KCWVueW8uam9iLnRocm90dGxlIHdpdGggdGhlIHNhbWUgX2luSm9iTmFtZV8gZnJvbSBydW5uaW5nIGZvcgoJdGhlIG5leHQgX2luV2FpdF8gbWlsbGlzZWNvbmRzLgoKCVRoaXMgaXMgdXNlZCBmb3IgdGhyb3R0bGluZyB1c2VyIGV2ZW50cyB3aGVuIHlvdSB3YW50IGFuCglpbW1lZGlhdGUgcmVzcG9uc2UsIGJ1dCBsYXRlciBpbnZvY2F0aW9ucyBtaWdodCBqdXN0IGJlIG5vaXNlCglpZiB0aGV5IGFycml2ZSB0b28gb2Z0ZW4uCiovCmVueW8uam9iLnRocm90dGxlID0gZnVuY3Rpb24oaW5Kb2JOYW1lLCBpbkpvYiwgaW5XYWl0KSB7CgkvLyBpZiB3ZSBzdGlsbCBoYXZlIGEgam9iIHdpdGggdGhpcyBuYW1lIHBlbmRpbmcsIHJldHVybiBpbW1lZGlhdGVseQoJaWYgKGVueW8uam9iLl9qb2JzW2luSm9iTmFtZV0pIHsKCQlyZXR1cm47Cgl9CglpbkpvYigpOwoJZW55by5qb2IuX2pvYnNbaW5Kb2JOYW1lXSA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJZW55by5qb2Iuc3RvcChpbkpvYk5hbWUpOwoJfSwgaW5XYWl0KTsKfTsKCmVueW8uam9iLl9qb2JzID0ge307Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/lang.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uKCl7CgkvLyogQHByb3RlY3RlZAoJZW55by5nbG9iYWwgPSB0aGlzOwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCVVzZWQgaW50ZXJuYWxseSBieSB0aGUgZW55by51aWQgbWV0aG9kIHRvIGJlIGFibGUgdG8gcHJvZHVjZQoJCWEgcnVudGltZSB1bmlxdWUgaWRlbnRpZmllci4KCSovCgl2YXIgdWlkQ291bnRlciA9IDA7CgoJLy8qQHB1YmxpYwoJLyoqCgkJUmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGEgdGFyZ2V0IGlzIHVuZGVmaW5lZC4KCSovCgllbnlvLmV4aXN0cyA9IGZ1bmN0aW9uICh0YXJnZXQpIHsKCQlyZXR1cm4gKHVuZGVmaW5lZCAhPT0gdGFyZ2V0KTsKCX07Cgl2YXIgZXhpc3RzID0gZW55by5leGlzdHM7CgoJLy8qQHB1YmxpYwoJLyoqCgkJTG9va3MgZm9yIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBfKG5lZWRsZSlfIGluc2lkZSBhbiBhcnJheSBvciBzdHJpbmcKCQlfKGhheXN0YWNrKV8uIEFuIElFOC1zYWZlIGZhbGxiYWNrIGZvciB0aGUgZGVmYXVsdCBfbGFzdEluZGV4T2ZfIG1ldGhvZC4KCSovCgllbnlvLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gKG5lZWRsZSwgaGF5c3RhY2ssIGluZGV4KSB7CgkJaWYgKGhheXN0YWNrLmxhc3RJbmRleE9mKSB7CgkJCXJldHVybiBoYXlzdGFjay5sYXN0SW5kZXhPZihuZWVkbGUsIGluZGV4IHx8IGhheXN0YWNrLmxlbmd0aCk7CgkJfQoJCS8vIGluIElFOCB0aGVyZSBpcyBubyBsYXN0SW5kZXhPZiBmb3IgYXJyYXlzIG9yIHN0cmluZ3MgYnV0IHdlCgkJLy8gdHJlYXQgdGhlbSBzbGlnaHRseSBkaWZmZXJlbnRseSwgdGhpcyBpcyB3cml0dGVuIGZvciBtaW5pbWFsLQoJCS8vIGNvZGUgYXMgYSBzbGlnaHQgdHJhZGVvZmYgaW4gcGVyZm9ybWFuY2UgYnV0IHNob3VsZCByYXJlbHkgYmUKCQkvLyBoaXQgYXMgaXQgaXMKCQl2YXIgc3RyaW5nID0gKCJzdHJpbmciID09PSB0eXBlb2YgaGF5c3RhY2spOwoJCXZhciByZXYgPSAoc3RyaW5nPyBoYXlzdGFjay5zcGxpdCgiIik6IGhheXN0YWNrKS5yZXZlcnNlKCk7CgkJdmFyIGNhcCA9IHJldi5sZW5ndGgtMTsKCQl2YXIgbGVuID0gaGF5c3RhY2subGVuZ3RoOwoJCXZhciBpZHg7CgkJLy8gaWYgaXQgaXMgYSBzdHJpbmcgd2UgbmVlZCB0byBtYWtlIGl0IGEgc3RyaW5nIGFnYWluIGZvcgoJCS8vIHRoZSBpbmRleE9mIG1ldGhvZAoJCWlmIChzdHJpbmcpIHsKCQkJcmV2ID0gcmV2LmpvaW4oIiIpOwoJCX0KCQlpZHggPSBlbnlvLmluZGV4T2YobmVlZGxlLCByZXYsIGxlbiAtIChpbmRleCB8fCBsZW4pKTsKCQkvLyBwdXQgdGhlIGFycmF5IGJhY2sgdGhlIHdheSBpdCB3YXMKCQlpZiAoIXN0cmluZykgewoJCQlyZXYucmV2ZXJzZSgpOwoJCX0KCQlyZXR1cm4gLTEgPT09IGlkeD8gaWR4OiAoY2FwIC0gaWR4KTsKCX07Cgl2YXIgbGFzdEluZGV4T2YgPSBlbnlvLmxhc3RJbmRleE9mOwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCUludGVybmFsbHktdXNlZCBtZXRob2QgdG8gc3RyaXAgbGVhZGluZyAnLicgZnJvbSBzdHJpbmcgcGF0aHMuCgkqLwoJdmFyIHByZXBhcmVQYXRoID0gZnVuY3Rpb24gKHBhdGgpIHsKCQl2YXIgaWR4ID0gMDsKCQl3aGlsZSAoIi4iID09PSBwYXRoW2lkeF0pIHsKCQkJKytpZHg7CgkJfQoJCWlmICgwICE9PSBpZHgpIHsKCQkJcGF0aCA9IHBhdGguc2xpY2UoaWR4KTsKCQl9CgkJcmV0dXJuIHBhdGg7Cgl9OwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCUludGVybmFsbHktdXNlZCBtZXRob2QgdG8gZGV0ZWN0IGlmIHRoZSBnaXZlbiB2YWx1ZSBleGlzdHMsCgkJaXMgYSBmdW5jdGlvbiBhbmQgYW4gb3ZlcmxvYWRlZCBnZXR0ZXIuIFJldHVybnMgdHJ1ZSBpZiB0aGVzZQoJCXRlc3RzIGFyZSBzdWNjZXNzZnVsOyBmYWxzZSBvdGhlcndpc2UuCgkqLwoJdmFyIGlzT3ZlcmxvYWRlZCA9IGZ1bmN0aW9uICh0YXJnZXQpIHsKCQlyZXR1cm4gdGFyZ2V0ICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiB0YXJnZXQgJiYgdHJ1ZSA9PT0gdGFyZ2V0Lm92ZXJsb2FkZWQ7Cgl9OwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCUludGVybmFsbHktdXNlZCBtZXRob2QgdG8gZGV0ZWN0IGRlZmVycmVkIGtpbmQgY29uc3RydWN0b3JzLgoJKi8KCXZhciBpc0RlZmVycmVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbih0YXJnZXQpIHsKCQlyZXR1cm4gdGFyZ2V0ICYmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgdGFyZ2V0KSAmJgoJCQkodGFyZ2V0Ll9GaW5hbEN0b3IgfHwgdGFyZ2V0Ll9maW5pc2hLaW5kQ3JlYXRpb24pOwoJfTsKCgkvLypAcHVibGljCgkvKioKCQlBIGZhc3QtcGF0aCBlbmFibGVkIGdsb2JhbCBnZXR0ZXIgdGhhdCB0YWtlcyBhIHN0cmluZyBwYXRoIHRoYXQKCQljYW4gYmUgYSBmdWxsIHBhdGggKGZyb20gY29udGV4dCB3aW5kb3cvRW55bykgb3IgYSByZWxhdGl2ZSBwYXRoCgkJKHRvIHRoZSBleGVjdXRpb24gY29udGV4dCBvZiB0aGUgbWV0aG9kKS4gSXQga25vd3MgaG93IHRvIGNoZWNrIGZvcgoJCWFuZCBjYWxsIHRoZSBiYWNrd2FyZHMtY29tcGF0aWJsZSBnZW5lcmF0ZWQgZ2V0dGVycyBhcyB3ZWxsIGFzCgkJaGFuZGxlIGNvbXB1dGVkIHByb3BlcnRpZXMuIFBlcmZvcm1zIGFuIG9wdGltaXplZCByZWN1cnNpdmUgc2VhcmNoLgoJCVJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIHBhdGggY2FuIG5vdCBiZQoJCWZvdW5kLiBDYW4gc2FmZWx5IGJlIGNhbGxlZCBvbiBub24tZXhpc3RlbnQgcGF0aHMuCgkqLwoJZW55by5nZXRQYXRoID0gZnVuY3Rpb24gKHBhdGgpIHsKCQkvLyBpZiB3ZSBkb24ndCBoYXZlIGEgcGF0aCB3ZSBjYW4ndCBkbyBhbnl0aGluZwoJCWlmICghZXhpc3RzKHBhdGgpIHx8IG51bGwgPT09IHBhdGgpIHsKCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQl9CgkJdmFyIGlkeCA9IDA7CgkJdmFyIHZhbDsKCQl2YXIgcGFydDsKCQl2YXIgZm47CgkJdmFyIHJlY3Vyc2luZyA9ICh0cnVlID09PSBhcmd1bWVudHNbMV0pIHx8ICgib2JqZWN0IiA9PT0gdHlwZW9mIHBhdGggJiYgcGF0aC5yZWN1cnNpbmcpPyB0cnVlOiBmYWxzZTsKCQkvLyBvbiByYXJlIG9jY2FzaW9ucyB0aGlzIG1ldGhvZCB3b3VsZCBiZSBjYWxsZWQgdW5kZXIgdGhlIGNvbnRleHQKCQkvLyBvZiBlbnlvIGl0c2VsZiwgdGhlIHByb2JsZW0gaXMgZGV0ZWN0aW5nIHdoZW4gdGhpcyBpcyBpbnRlbmRlZCBzaW5jZQoJCS8vIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzIGEgZ2VuZXJhbCBjYWxsIHdvdWxkIGFzc3VtZSBhIHdpbmRvdwoJCS8vIGNvbnRleHQgLSBoZXJlIHdlIHNlZSB0aGUgX3JlY3Vyc2luZ18gcGFyYW1ldGVyIHRha2luZyBhIGRvdWJsZQoJCS8vIG1lYW5pbmcgYXMgZW55byBzaG91bGQgX25ldmVyIGJlIHVzZWQgYXMgYSByZWZlcmVuY2Ugb24gYW5vdGhlciBvYmplY3RfCgkJLy8gYW5kIGFzIGxvbmcgYXMgdGhhdCBpcyB0cnVlIHRoaXMgd2lsbCBuZXZlciBmYWlsCgkJdmFyIGN1ciA9IHRoaXMgPT09IGVueW8gJiYgdHJ1ZSAhPT0gcmVjdXJzaW5nPyB3aW5kb3c6IHRoaXM7CgkJLy8gaWYgd2Ugd2VyZSByZWN1cnNpbmcgdGhlbiB3ZSByZWFzc2lnbiBwYXRoIHRvIHRoZSBzdHJpbmcgcGFydCBvZiB0aGUKCQkvLyBvYmplY3QvcGFyYW1ldGVyIHBhc3NlZCBpbgoJCWlmICgib2JqZWN0IiA9PT0gdHlwZW9mIHBhdGgpIHsKCQkJaWYgKHBhdGgucGF0aCAmJiAic3RyaW5nIiA9PT0gdHlwZW9mIHBhdGgucGF0aCkgewoJCQkJcGF0aCA9IHBhdGgucGF0aDsKCQkJfQoJCQkvLyBvdGhlcndpc2UgaXQgd2FzIGFuIGludmFsaWQgcmVxdWVzdAoJCQkvLyBidXQgd2UgcmV0dXJuIHRoZSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGluCgkJCWVsc2UgewoJCQkJcmV0dXJuIHBhdGg7CgkJCX0KCQl9CgkJLy8gY2xlYXIgYW55IGxlYWRpbmcgcGVyaW9kcwoJCXBhdGggPSBwcmVwYXJlUGF0aChwYXRoKTsKCQkvLyBmaW5kIHRoZSBpbml0aWFsIHBlcmlvZCBpZiBhbnkKCQlpZHggPSBwYXRoLmluZGV4T2YoIi4iKTsKCgkJaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7CgkJCXJldHVybiBjdXI7CgkJfQoKCQkvLyBpZiB0aGVyZSBpc24ndCBhbnkgdHJ5IGFuZCBmaW5kIHRoZSBwYXRoIHJlbGF0aXZlIHRvIG91cgoJCS8vIGN1cnJlbnQgY29udGV4dCwgdGhpcyBpcyB0aGUgZmFzdCBwYXRoCgkJaWYgKC0xID09PSBpZHgpIHsKCQkJLy8gZmlndXJlIG91dCB3aGF0IG91ciBkZWZhdWx0L2JhY2t3YXJkcy1jb21wYXRpYmxlIGdldHRlcgoJCQkvLyBmdW5jdGlvbiB3b3VsZCBiZQoJCQlmbiA9ICJnZXQiICsgZW55by5jYXAocGF0aCk7CgkJCS8vIGlmIHRoYXQgcGF0aCBleGlzdHMgcmVsYXRpdmUgdG8gb3VyIGNvbnRleHQgY2hlY2sgdG8gc2VlCgkJCS8vIGlmIGl0IGlzIGFuIG92ZXJsb2FkZWQgZ2V0dGVyIGFuZCBjYWxsIHRoYXQgaWYgaXQgaXMgb3RoZXJ3aXNlCgkJCS8vIGp1c3QgZ3JhYiB0aGF0IHBhdGgga25vd2luZyBpZiB3ZSBnZXQgdW5kZWZpbmVkIHRoYXQgaXMgb2sKCQkJdmFsID0gaXNPdmVybG9hZGVkKGN1cltmbl0pPyBjdXJbZm5dLmNhbGwodGhpcyk6IGN1cltwYXRoXTsKCQl9IGVsc2UgewoJCQkvLyBiZWdpbiBvdXIgcmVjdXJzaXZlIHNlYXJjaAoJCQlwYXJ0ID0gcGF0aC5zdWJzdHJpbmcoMCwgaWR4KTsKCQkJcGF0aCA9IHBhdGguc2xpY2UoaWR4KzEpOwoKCQkJdmFyIHJvb3QgPSBjdXJbcGFydF07CgkJCWlmIChpc0RlZmVycmVkQ29uc3RydWN0b3Iocm9vdCkpIHsKCQkJCXJvb3QgPSBlbnlvLmNoZWNrQ29uc3RydWN0b3Iocm9vdCk7CgkJCX0KCQkJaWYgKHJvb3QgJiYgdHlwZW9mIHJvb3QgaW4geyJvYmplY3QiOiIiLCJmdW5jdGlvbiI6IiJ9KSB7CgkJCQlpZiAocm9vdC5faXNPYmplY3QpIHsKCQkJCQlyZXR1cm4gcm9vdC5nZXQocGF0aCk7CgkJCQl9IGVsc2UgewoJCQkJCXZhbCA9IGVueW8uZ2V0UGF0aC5jYWxsKHJvb3QsIHtwYXRoOiBwYXRoLCByZWN1cnNpbmc6IHRydWV9KTsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKGlzRGVmZXJyZWRDb25zdHJ1Y3Rvcih2YWwpKSB7CgkJCXZhbCA9IGVueW8uY2hlY2tDb25zdHJ1Y3Rvcih2YWwpOwoJCX0KCQkvLyBvdGhlcndpc2Ugd2UndmUgcmVhY2hlZCB0aGUgZW5kIHNvIHJldHVybiB3aGF0ZXZlciB3ZSBoYXZlCgkJcmV0dXJuIHZhbDsKCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJQSBnbG9iYWwgc2V0dGVyIHRoYXQgdGFrZXMgYSBzdHJpbmcgcGF0aCAocmVsYXRpdmUgdG8gdGhlIG1ldGhvZCdzCgkJZXhlY3V0aW9uIGNvbnRleHQpIG9yIGEgZnVsbCBwYXRoIChyZWxhdGl2ZSB0byB3aW5kb3cpLiBBdHRlbXB0cwoJCXRvIGF1dG9tYXRpY2FsbHkgcmV0cmlldmUgYW55IHByZXZpb3VzbHkgZXhpc3RpbmcgdmFsdWUgdG8gc3VwcGx5CgkJdG8gYW55IG9ic2VydmVycy4gSWYgdGhlIGNvbnRleHQgaXMgYW4gX2VueW8uT2JqZWN0XyBvciBzdWJraW5kLAoJCXRoZSBfbm90aWZ5T2JzZXJ2ZXJzXyBtZXRob2QgaXMgdXNlZCB0byBub3RpZnkgbGlzdGVuZXJzIGZvciB0aGUgcGF0aCdzCgkJYmVpbmcgc2V0LiBJZiB0aGUgcHJldmlvdXMgdmFsdWUgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIG5ld2x5IHNldAoJCXZhbHVlLCBvYnNlcnZlcnMgd2lsbCBub3QgYmUgdHJpZ2dlcmVkIGJ5IGRlZmF1bHQuIElmIHRoZSB0aGlyZAoJCXBhcmFtZXRlciBpcyBwcmVzZW50IGFuZCBpcyBhbiBleHBsaWNpdCBib29sZWFuIHRydWUsIGl0IHRyaWdnZXJzCgkJdGhlIG9ic2VydmVycyByZWdhcmRsZXNzLiBPcHRpb25hbGx5LCB0aGUgdGhpcmQgcGFyYW1ldGVyIG1heSBiZSBhCgkJZnVuY3Rpb24gY29tcGFyYXRvciB0aGF0IGFjY2VwdHMgdHdvIHBhcmFtZXRlcnMgYW5kIGlzIGV4cGVjdGVkIHRvCgkJcmV0dXJuIGEgdHJ1dGh5LWZhbHN5IHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIG5vdGlmaWNhdGlvbnMKCQl3aWxsIGJlIGZpcmVkLiBSZXR1cm5zIHRoZSBjb250ZXh0IGZyb20gd2hpY2ggdGhlIG1ldGhvZCB3YXMgZXhlY3V0ZWQuCgkJVW5saWtlIGl0cyBnZXR0ZXIgY291bnRlcnBhcnQsIHRoaXMgaXMgbm90IGEgcmVjdXJzaXZlIG1ldGhvZC4KCSovCgllbnlvLnNldFBhdGggPSBmdW5jdGlvbiAocGF0aCwgdmFsdWUsIGZvcmNlKSB7CgkJLy8gaWYgdGhlcmUgYXJlIGxlc3MgdGhhbiAyIHBhcmFtZXRlcnMgd2UgY2FuJ3QgZG8gYW55dGhpbmcKCQlpZighZXhpc3RzKHBhdGgpIHx8ICJzdHJpbmciICE9PSB0eXBlb2YgcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCkgewoJCQlyZXR1cm4gdGhpczsKCQl9CgkJdmFyIGN1ciA9IGVueW8gPT09IHRoaXM/IGVueW8uZ2xvYmFsOiB0aGlzOwoJCXZhciBpZHg7CgkJdmFyIHRhcmdldDsKCQl2YXIgcGFydHM7CgkJdmFyIG5vdGlmeSA9IHRydWUgPT09IGZvcmNlPyB0cnVlOiBmYWxzZTsKCQl2YXIgY29tcGFyYXRvciA9ICJmdW5jdGlvbiIgPT09IHR5cGVvZiBmb3JjZT8gZm9yY2U6IHVuZGVmaW5lZDsKCQkvLyBhdHRlbXB0IHRvIHJldHJpZXZlIHRoZSBwcmV2aW91cyB2YWx1ZSBpZiBpdCBleGlzdHMKCQl2YXIgcHJldiA9IGVueW8uZ2V0UGF0aC5jYWxsKGN1ciwgcGF0aCk7CgkJLy8gY2xlYXIgYW55IGxlYWRpbmcgcGVyaW9kcwoJCXBhdGggPSBwcmVwYXJlUGF0aChwYXRoKTsKCQkvLyBmaW5kIHRoZSBpbml0YWwgaW5kZXggb2YgYW55IHBlcmlvZCBpbiB0aGUgcGF0aAoJCWlkeCA9IHBhdGguaW5kZXhPZigiLiIpOwoJCS8vIGlmIHRoZXJlIHdhc24ndCBvbmUgd2UgY2FuIGF0dGVtcHQgdG8gZmFzdC1wYXRoIHRoaXMgc2V0dGVyCgkJaWYgKC0xID09PSBpZHgpIHsKCQkJLy8gb3RoZXJ3aXNlIHdlIGp1c3QgcGxhaW4gb3ZlcndyaXRlIHRoZSBtZXRob2QsIHRoaXMgaXMgdGhlCgkJCS8vIGV4cGVjdGVkIGJlaGF2aW9yCgkJCWN1cltwYXRoXSA9IHZhbHVlOwoJCX0gZWxzZSB7CgkJCS8vIHdlIGhhdmUgdG8gd2FsayB0aGUgcGF0aCB1bnRpbCB3ZSBmaW5kIHRoZSBlbmQKCQkJcGFydHMgPSBwYXRoLnNwbGl0KCIuIik7CgkJCS8vIHdoaWxlIHdlIGhhdmUgYW55IG90aGVyIHBhcnRzIHRvIGluc3BlY3QKCQkJd2hpbGUgKHBhcnRzLmxlbmd0aCkgewoJCQkJdGFyZ2V0ID0gcGFydHMuc2hpZnQoKTsKCQkJCS8vIHRoZSByYXJlIGNhc2Ugd2hlcmUgdGhlIHBhdGggY291bGQgc3BlY2lmeSBlbnlvCgkJCQkvLyBhbmQgaXMgZXhlY3V0ZWQgdW5kZXIgdGhlIGNvbnRleHQgb2YgZW55bwoJCQkJaWYgKCJlbnlvIiA9PT0gdGFyZ2V0ICYmIGVueW8gPT09IGN1cikgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJLy8gaWYgdGhpcyBpcyB0aGUgbGFzdCBwaWVjZSB3ZSB0ZXN0IHRvIHNlZSBpZiBpdCBpcyBhIGNvbXB1dGVkCgkJCQkvLyBwcm9wZXJ0eSBhbmQgaWYgaXQgaXMgd2UgY2FsbCBpdCB3aXRoIHRoZSBuZXcgdmFsdWUKCQkJCS8vIGFzIGluIHRoZSBmYXN0IHBhdGgKCQkJCWlmICgwID09PSBwYXJ0cy5sZW5ndGgpIHsKCQkJCQkvLyBvdGhlcndpc2Ugd2Ugb3ZlcndyaXRlIGl0IGp1c3QgbGlrZSBpbiB0aGUgZmFzdC1wYXRoCgkJCQkJY3VyW3RhcmdldF0gPSB2YWx1ZTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gd2UgdXBkYXRlIG91ciBjdXJyZW50IHJlZmVyZW5jZSBjb250ZXh0IGFuZCBpZiBpdCBkb2VzCgkJCQkJLy8gbm90IGV4aXN0IGF0IHRoZSByZXF1ZXN0ZWQgcGF0aCBpdCB3aWxsIGJlIGNyZWF0ZWQKCQkJCQlpZiAoISh0eXBlb2YgY3VyW3RhcmdldF0gaW4geyJvYmplY3QiOiIiLCJmdW5jdGlvbiI6IiJ9KSkgewoJCQkJCQljdXJbdGFyZ2V0XSA9IHt9OwoJCQkJCX0KCQkJCQlpZiAodHJ1ZSA9PT0gY3VyW3RhcmdldF0uX2lzT2JqZWN0KSB7CgkJCQkJCXJldHVybiBjdXJbdGFyZ2V0XS5zZXQocGFydHMuam9pbigiLiIpLCB2YWx1ZSk7CgkJCQkJfQoJCQkJCWN1ciA9IGN1clt0YXJnZXRdOwoJCQkJfQoJCQl9CgkJfQoJCS8vIG5vdyB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gaXNzdWUgbm90aWZpY2F0aW9ucwoJCS8vIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiBub3RpZnkgaXMgYWxyZWFkeSBmb3JjZWQgdHJ1ZQoJCWlmICh0cnVlICE9PSBub3RpZnkpIHsKCQkJLy8gbm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgY29tcGFyYXRvciBhbmQgaWYgc28gdXNlIGl0CgkJCS8vIHRvIGRldGVybWluZSBpZiB3ZSdyZSBnb2luZyB0byB0cmlnZ2VyIG9ic2VydmVycwoJCQlpZiAoY29tcGFyYXRvcikgewoJCQkJbm90aWZ5ID0gY29tcGFyYXRvcihwcmV2LCB2YWx1ZSk7CgkJCX0gZWxzZSB7CgkJCQkvLyBkbyB0aGUgZGVmYXVsdCB3aGljaCBpcyB0byB0ZXN0IHRoZSBwcmV2aW91cyB2YWx1ZQoJCQkJLy8gdmVyc3VzIHRoZSBuZXcgdmFsdWUKCQkJCW5vdGlmeSA9IChwcmV2ICE9PSB2YWx1ZSk7CgkJCX0KCQl9CgkJaWYgKHRydWUgPT09IG5vdGlmeSkgewoJCQlpZiAoY3VyLm5vdGlmeU9ic2VydmVycykgewoJCQkJY3VyLm5vdGlmeU9ic2VydmVycyhwYXRoLCBwcmV2LCB2YWx1ZSk7CgkJCX0KCQl9CgkJLy8gcmV0dXJuIHRoZSBjYWxsZWUKCQlyZXR1cm4gY3VyOwoJfTsKCgkvLypAcHJvdGVjdGVkCgkvKioKCQlDYWxsZWQgYnkgaW5zdGFuY2VzIG9mIF9lbnlvLk9iamVjdF8gaW4gdGhlaXIgb3duIGNvbnRleHQgdmlhIHRoZWlyCgkJbG9jYWwgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZC4gQXR0ZW1wdHMgdG8gZmluZCB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YKCQl0aGUgY3VycmVudCBjb250ZXh0IGFuZCBpbnN0YW5jZSB0aGUgcHJvcGVydHkgaWYgaXQgaXMgbm90IGFscmVhZHkgYW4KCQlpbnN0YW5jZS4gSWYgaXQgaXMgYSBzdHJpbmcsIHRoZSBtZXRob2QgYXR0ZW1wdHMgdG8gZmluZCB0aGUKCQljb25zdHJ1Y3RvciBmb3IgdGhlIG5hbWVkIGtpbmQgb3IgdGhlIGluc3RhbmNlIGF0IHRoZSBnaXZlbiBwYXRoLgoJCVdoZW4gY29tcGxldGUsIGl0IGNhbGxzIHRoZSBjYWxsYmFjayBtZXRob2QsIHBhc3NpbmcgaXQgdHdvCgkJcGFyYW1ldGVycy0tdGhlIGNvbnN0cnVjdG9yIChpZiBpdCB3YXMgZm91bmQpIGFuZCB0aGUgaW5zdGFuY2UgKGlmIGl0CgkJY291bGQgYmUgZGV0ZXJtaW5lZCkuCgkqLwoJZW55by5maW5kQW5kSW5zdGFuY2UgPSBmdW5jdGlvbiAocHJvcGVydHksIGZuLCBjb250ZXh0KSB7CgkJdmFyIEN0b3I7CgkJdmFyIGluc3Q7CgkJdmFyIHBhdGg7CgkJZm4gPSBleGlzdHMoZm4pICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBmbj8gZm46IGVueW8ubm9wOwoJCS8vIGF0dGVtcHQgdG8gZmluZCB0aGUgc3RyaW5nIHBhdGggaWRlbnRpZmllciBvbiB0aGUga2luZAoJCS8vIGRlZmluaXRpb24gaWYgcG9zc2libGUKCQlwYXRoID0gZW55by5nZXRQYXRoLmNhbGwodGhpcywgcHJvcGVydHkpOwoJCS8vIGlmIHRoZXJlIGlzIG5vdGhpbmcgYXQgdGhlIGdpdmVuIHByb3BlcnR5IGZhc3QtcGF0aCBvdXQKCQkvLyBhbmQgcmV0dXJuIHVuZGVmaW5lZCBldmVyeXRoaW5nCgkJaWYgKCFwYXRoKSB7CgkJCXJldHVybiBmbi5jYWxsKGNvbnRleHQgfHwgdGhpcyk7CgkJfQoJCS8vIGlmIHRoZSBwYXRoIGlzIGEgc3RyaW5nIChhcyBpbiBtb3N0IGNhc2VzKSBnbyBhaGVhZCBhbmQKCQkvLyBhdHRlbXB0IHRvIGdldCB0aGUga2luZCBkZWZpbml0aW9uIG9yIGluc3RhbmNlIGF0IHRoZQoJCS8vIGdpdmVuIHBhdGgKCQlpZiAoInN0cmluZyIgPT09IHR5cGVvZiBwYXRoKSB7CgkJCS8vIHdlIGNhbiBmYXN0LXRyYWNrIHRoaXMgZm9yIHJlbGF0aXZlIHBhdGhzIHRoYXQgZXhwbGljaXRseSBzdGF0ZQoJCQkvLyBpdCBpcyByZWxhdGl2ZSB3aXRoIGEgIi4iIHByZWZpeCwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gZ3Vlc3MKCQkJQ3RvciA9ICIuIiA9PT0gcGF0aFswXT8gZW55by5nZXRQYXRoLmNhbGwodGhpcywgcGF0aCk6CgkJCQllbnlvLmdldFBhdGgocGF0aCkgfHwgZW55by5nZXRQYXRoLmNhbGwodGhpcywgcGF0aCk7CgkJCS8vIGlmIGl0IGlzbid0IGEgZnVuY3Rpb24gd2UgYXNzdW1lIGl0IGlzIGFuIGluc3RhbmNlCgkJCWlmIChleGlzdHMoQ3RvcikgJiYgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIEN0b3IpIHsKCQkJCWluc3QgPSBDdG9yOwoJCQkJQ3RvciA9IHVuZGVmaW5lZDsKCQkJfQoJCX0gZWxzZSBpZiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHBhdGgpIHsKCQkJLy8gaW5zdGVhZCBvZiBhIHN0cmluZyB3ZSB3ZXJlIGhhbmRlZCBhIGNvbnN0cnVjdG9yCgkJCS8vIHNvIHJlYXNzaWduIHRoYXQKCQkJQ3RvciA9IHBhdGg7CgkJfSBlbHNlIHsKCQkJLy8gdGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IHdlIHdlcmUgaGFuZGVkIGFuCgkJCS8vIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBvYmplY3QKCQkJaW5zdCA9IHBhdGg7CgkJfQoJCS8vIGlmIHdlIGhhdmUgYSBjb25zdHJ1Y3RvciBhbmQgbm8gaW5zdGFuY2Ugd2UgbmVlZCB0bwoJCS8vIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgb2JlamN0CgkJaWYgKGV4aXN0cyhDdG9yKSAmJiAhZXhpc3RzKGluc3QpKSB7CgkJCWluc3QgPSBuZXcgQ3RvcigpOwoJCX0KCQkvLyBpZiB3ZSBkbyBoYXZlIGFuIGluc3RhbmNlIGFzc2lnbiBpdCB0byB0aGUgYmFzZSBvYmplY3QKCQlpZiAoZXhpc3RzKGluc3QpKSB7CgkJCXRoaXNbcHJvcGVydHldID0gaW5zdDsKCQl9CgkJLy8gbm93IHVzZSB0aGUgY2FsYmFjayBhbmQgcGFzcyBpdCB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzCgkJcmV0dXJuIGZuLmNhbGwoY29udGV4dCB8fCB0aGlzLCBDdG9yLCBpbnN0KTsKCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJQ3JlYXRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyICh3aXRoIGFuIG9wdGlvbmFsIHByZWZpeCkgYW5kIHJldHVybnMKCQl0aGUgaWRlbnRpZmllciBhcyBhIHN0cmluZy4KCSovCgllbnlvLnVpZCA9IGZ1bmN0aW9uIChwcmVmaXgpIHsKCQlyZXR1cm4gU3RyaW5nKChwcmVmaXg/IHByZWZpeDogIiIpICsgdWlkQ291bnRlcisrKTsKCX07CgoJLy8qIEBwdWJsaWMKCS8vKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiAwIGFuZCBhIHNwZWNpZmllZCB1cHBlciBib3VuZGFyeTsKCS8vKiBpLmUuLCAwIDw9IHJldHVybiB2YWx1ZSA8IF9pbkJvdW5kXy4KCS8vCgkvLwkJdmFyIHJhbmRvbUxldHRlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZW55by5pcmFuZCgyNikgKyA5Nyk7CgkvLwoJZW55by5pcmFuZCA9IGZ1bmN0aW9uKGluQm91bmQpIHsKCQlyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogaW5Cb3VuZCk7Cgl9OwoKCS8vKiBSZXR1cm5zIF9pblN0cmluZ18gd2l0aCB0aGUgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgoJZW55by5jYXAgPSBmdW5jdGlvbihpblN0cmluZykgewoJCXJldHVybiBpblN0cmluZy5zbGljZSgwLCAxKS50b1VwcGVyQ2FzZSgpICsgaW5TdHJpbmcuc2xpY2UoMSk7Cgl9OwoKCS8vKiBSZXR1cm5zIF9pblN0cmluZ18gd2l0aCB0aGUgZmlyc3QgbGV0dGVyIGxvd2VyLWNhc2VkLgoJZW55by51bmNhcCA9IGZ1bmN0aW9uKGluU3RyaW5nKSB7CgkJcmV0dXJuIGluU3RyaW5nLnNsaWNlKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBpblN0cmluZy5zbGljZSgxKTsKCX07CgoJZW55by5mb3JtYXQgPSBmdW5jdGlvbihpblZhckFyZ3MpIHsKCQl2YXIgcGF0dGVybiA9IC9cJS4vZzsKCQl2YXIgYXJnID0gMCwgdGVtcGxhdGUgPSBpblZhckFyZ3MsIGFyZ3MgPSBhcmd1bWVudHM7CgkJdmFyIHJlcGxhY2VyID0gZnVuY3Rpb24oaW5Db2RlKSB7CgkJCXJldHVybiBhcmdzWysrYXJnXTsKCQl9OwoJCXJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VyKTsKCX07CgoJdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCgkvLyogUmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIHN0cmluZy4KCWVueW8uaXNTdHJpbmcgPSBmdW5jdGlvbihpdCkgewoJCXJldHVybiB0b1N0cmluZy5jYWxsKGl0KSA9PT0gIltvYmplY3QgU3RyaW5nXSI7Cgl9OwoKCS8vKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24uCgllbnlvLmlzRnVuY3Rpb24gPSBmdW5jdGlvbihpdCkgewoJCXJldHVybiB0b1N0cmluZy5jYWxsKGl0KSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKCX07CgoJLy8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYXJyYXkuCgllbnlvLmlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKGl0KSB7CgkJcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpID09PSAiW29iamVjdCBBcnJheV0iOwoJfTsKCgkvLyogUmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBvYmplY3QuCgllbnlvLmlzT2JqZWN0ID0gT2JqZWN0LmlzT2JqZWN0IHx8IGZ1bmN0aW9uIChpdCkgewoJCXJldHVybiB0b1N0cmluZy5jYWxsKGl0KSA9PT0gIltvYmplY3QgT2JqZWN0XSI7Cgl9OwoKCS8vKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIHRydWUuCgllbnlvLmlzVHJ1ZSA9IGZ1bmN0aW9uKGl0KSB7CgkJcmV0dXJuICEoaXQgPT09ICJmYWxzZSIgfHwgaXQgPT09IGZhbHNlIHx8IGl0ID09PSAwIHx8IGl0ID09PSBudWxsIHx8IGl0ID09PSB1bmRlZmluZWQpOwoJfTsKCgkvLypAcHVibGljCgkvKioKCQlSZXR1cm5zIHRoZSBpbmRleCBvZiBhbnkgZW50cnkgaW4gX2FycmF5XyB3aG9zZSBfY2FsbGJhY2tfIHJldHVybnMKCQlhIHRydXRoeSB2YWx1ZS4gQ2FuIHBhc3MgYW4gb3B0aW9uYWwgX2NvbnRleHRfIGZvciB0aGUgX2NhbGxiYWNrXy4gRWFjaCBfY2FsbGJhY2tfCgkJd2lsbCByZWNlaXZlIDMgcGFyYW1ldGVycywgdGhlIF92YWx1ZV8gYXQgX2luZGV4XyBhbmQgYW4gaW1tdXRhYmxlIGNvcHkKCQlvZiB0aGUgb3JpZ2luYWwgYXJyYXkuIElmIG5vIF9jYWxsYmFja18gcmV0dXJucyB0cnVlIG9yIF9hcnJheV8gaXMgbm90CgkJYW4gQXJyYXkgd2lsbCByZXR1cm4gZmFsc2UuCgkqLwoJZW55by5maW5kID0gZnVuY3Rpb24gKGFycmF5LCBjYWxsYmFjaywgY29udGV4dCkgewoJCXZhciAkc291cmNlID0gZW55by5pc0FycmF5KGFycmF5KSAmJiBhcnJheTsKCQl2YXIgJGN0eCA9IGNvbnRleHQgfHwgZW55by5nbG9iYWw7CgkJdmFyICRmbiA9IGNhbGxiYWNrOwoJCXZhciBpZHggPSAwLCBsZW4sICRjb3B5LCByZXQ7CgkJaWYgKCRzb3VyY2UgJiYgJGZuICYmIGVueW8uaXNGdW5jdGlvbigkZm4pKSB7CgkJCSRjb3B5ID0gZW55by5jbG9uZSgkc291cmNlKTsKCQkJbGVuID0gJHNvdXJjZS5sZW5ndGg7CgkJCWZvciAoOyBpZHggPCBsZW47ICsraWR4KSB7CgkJCQlyZXQgPSAkZm4uY2FsbCgkY3R4LCAkc291cmNlW2lkeF0sIGlkeCwgJGNvcHkpOwoJCQkJaWYgKCEhIHJldCkgewoJCQkJCXJldHVybiBpZHg7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfTsKCgkvLyogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4gX2luQXJyYXlfIHRoYXQgaXMgZXF1aXZhbGVudAoJLy8qICg9PSkgdG8gX2luRWxlbWVudF8sIG9yIC0xIGlmIG5vIHN1Y2ggZWxlbWVudCBpcyBmb3VuZC4KCWVueW8uaW5kZXhPZiA9IGZ1bmN0aW9uKGluRWxlbWVudCwgaW5BcnJheSwgZnJvbUluZGV4KSB7CgkJaWYgKGluQXJyYXkuaW5kZXhPZikgewoJCQlyZXR1cm4gaW5BcnJheS5pbmRleE9mKGluRWxlbWVudCwgZnJvbUluZGV4KTsKCQl9CgoJCWlmIChmcm9tSW5kZXgpIHsKCQkJaWYgKGZyb21JbmRleCA8IDApIHsKCQkJCWZyb21JbmRleCA9IDA7CgkJCX0KCgkJCWlmIChmcm9tSW5kZXggPiBpbkFycmF5Lmxlbmd0aCkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoKCQlmb3IgKHZhciBpPWZyb21JbmRleCB8fCAwLCBsPWluQXJyYXkubGVuZ3RoLCBlOyAoZT1pbkFycmF5W2ldKSB8fCAoaTxsKTsgaSsrKSB7CgkJCWlmIChlID09IGluRWxlbWVudCkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfTsKCgkvLyogUmVtb3ZlcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcGFzc2VkLWluIGFycmF5IHRoYXQgaXMgZXF1aXZhbGVudAoJLy8qICg9PSkgdG8gX2luRWxlbWVudF8uCgllbnlvLnJlbW92ZSA9IGZ1bmN0aW9uKGluRWxlbWVudCwgaW5BcnJheSkgewoJCXZhciBpID0gZW55by5pbmRleE9mKGluRWxlbWVudCwgaW5BcnJheSk7CgkJaWYgKGkgPj0gMCkgewoJCQlpbkFycmF5LnNwbGljZShpLCAxKTsKCQl9Cgl9OwoKCS8qKgoJCUludm9rZXMgX2luRnVuY18gb24gZWFjaCBlbGVtZW50IG9mIF9pbkFycmF5Xy4KCQlJZiBfaW5Db250ZXh0XyBpcyBzcGVjaWZpZWQsIF9pbkZ1bmNfIGlzIGNhbGxlZCB3aXRoIF9pbkNvbnRleHRfIGFzIF90aGlzXy4KCSovCgllbnlvLmZvckVhY2ggPSBmdW5jdGlvbihpbkFycmF5LCBpbkZ1bmMsIGluQ29udGV4dCkgewoJCWlmIChpbkFycmF5KSB7CgkJCXZhciBjID0gaW5Db250ZXh0IHx8IHRoaXM7CgkJCWlmIChlbnlvLmlzQXJyYXkoaW5BcnJheSkgJiYgaW5BcnJheS5mb3JFYWNoKSB7CgkJCQlpbkFycmF5LmZvckVhY2goaW5GdW5jLCBjKTsKCQkJfSBlbHNlIHsKCQkJCXZhciBhID0gT2JqZWN0KGluQXJyYXkpOwoJCQkJdmFyIGFsID0gYS5sZW5ndGggPj4+IDA7CgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGFsOyBpKyspIHsKCQkJCQlpZiAoaSBpbiBhKSB7CgkJCQkJCWluRnVuYy5jYWxsKGMsIGFbaV0sIGksIGEpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX07CgoJLyoqCgkJSW52b2tlcyBfaW5GdW5jXyBvbiBlYWNoIGVsZW1lbnQgb2YgX2luQXJyYXlfLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cyBhcyBhbiBBcnJheS4KCQlJZiBfaW5Db250ZXh0XyBpcyBzcGVjaWZpZWQsIF9pbkZ1bmNfIGlzIGNhbGxlZCB3aXRoIF9pbkNvbnRleHRfIGFzIF90aGlzXy4KCSovCgllbnlvLm1hcCA9IGZ1bmN0aW9uKGluQXJyYXksIGluRnVuYywgaW5Db250ZXh0KSB7CgkJdmFyIGMgPSBpbkNvbnRleHQgfHwgdGhpczsKCQlpZiAoZW55by5pc0FycmF5KGluQXJyYXkpICYmIGluQXJyYXkubWFwKSB7CgkJCXJldHVybiBpbkFycmF5Lm1hcChpbkZ1bmMsIGMpOwoJCX0gZWxzZSB7CgkJCXZhciByZXN1bHRzID0gW107CgkJCXZhciBhZGQgPSBmdW5jdGlvbihlLCBpLCBhKSB7CgkJCQlyZXN1bHRzLnB1c2goaW5GdW5jLmNhbGwoYywgZSwgaSwgYSkpOwoJCQl9OwoJCQllbnlvLmZvckVhY2goaW5BcnJheSwgYWRkLCBjKTsKCQkJcmV0dXJuIHJlc3VsdHM7CgkJfQoJfTsKCgkvLypAcHVibGljCgkvKioKCQlDb25jYXRlbmF0ZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJyYXlzLCByZW1vdmluZyBhbnkgZHVwbGljYXRlCgkJZW50cmllcy4KCSovCgllbnlvLm1lcmdlID0gZnVuY3Rpb24gKC8qIF9hcnJheXNfICovKSB7CgkJdmFyIG1lcmdlciA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIGFyZ3VtZW50cyk7CgkJcmV0dXJuIHVuaXF1ZShtZXJnZXIpOwoJfTsKCXZhciBtZXJnZSA9IGVueW8ubWVyZ2U7CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJyYXlzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mCgkJdmFsdWVzIHRoYXQgYXJlIHVuaXF1ZSBhY3Jvc3MgYWxsIG9mIHRoZSBhcnJheXMuIE5vdGUgdGhhdAoJCXRoaXMgaXMgbm90IGEgcGFydGljdWxhcmx5IGNoZWFwIG1ldGhvZCBhbmQgc2hvdWxkIG5ldmVyIGJlCgkJY2FsbGVkIHJlY3Vyc2l2ZWx5LgoKCQlUT0RPOiB0ZXN0IGluIElFOAoJCVRPRE86IGZpZ3VyZSBvdXQgd2h5IHRoZSBvbmUtaGl0IHJldmVyc2FsIHdhc24ndCB3b3JraW5nCgkqLwoJZW55by51bmlvbiA9IGZ1bmN0aW9uICgvKiBfYXJyYXlzXyAqLykgewoJCS8vIGNyZWF0ZSBvbmUgbGFyZ2UgYXJyYXkgb2YgYWxsIG9mIHRoZSBhcnJheXMgcGFzc2VkIHRvCgkJLy8gdGhlIG1ldGhvZCBmb3IgY29tcGFyaXNvbgoJCXZhciB2YWx1ZXMgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcmd1bWVudHMpOwoJCS8vIHRoZSBhcnJheSBvZiBzZWVuIHZhbHVlcwoJCXZhciBzZWVuID0gW107CgkJLy8gdGhlIGFycmF5IG9mIHZhbHVlcyBhY3R1YWxseSB0byBiZSByZXR1cm5lZAoJCXZhciByZXQgPSBbXTsKCQl2YXIgaWR4ID0gMDsKCQl2YXIgbGVuID0gdmFsdWVzLmxlbmd0aDsKCQl2YXIgdmFsdWU7CgkJZm9yICg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJdmFsdWUgPSB2YWx1ZXNbaWR4XTsKCQkJLy8gaWYgd2UgaGF2ZW4ndCBzZWVuIHRoaXMgdmFsdWUgYmVmb3JlIGdvIGFoZWFkIGFuZAoJCQkvLyBwdXNoIGl0IHRvIHRoZSBzZWVuIGFycmF5CgkJCWlmICghfmVueW8uaW5kZXhPZih2YWx1ZSwgc2VlbikpIHsKCQkJCXNlZW4ucHVzaCh2YWx1ZSk7CgkJCQkvLyBoZXJlIHdlIGNoZWNrIGFnYWluc3QgdGhlIGVudGlyZXR5IG9mIGFueSBvdGhlciB2YWx1ZXMKCQkJCS8vIGluIHRoZSB2YWx1ZXMgYXJyYXkgc3RhcnRpbmcgZnJvbSB0aGUgZW5kCgkJCQlpZiAoaWR4ID09PSBsYXN0SW5kZXhPZih2YWx1ZSwgdmFsdWVzKSkgewoJCQkJCS8vIGlmIHRoaXMgdHVybmVkIG91dCB0byBiZSB0cnVlIHRoZW4gaXQgaXMgYSB1bmlxdWUgZW50cnkKCQkJCQkvLyBzbyBnbyBhaGVhZCBhbmQgcHVzaCBpdCB0byBvdXIgdW5pb24gYXJyYXkKCQkJCQlyZXQucHVzaCh2YWx1ZSk7CgkJCQl9CgkJCX0KCQl9CgkJLy8gd2Ugc2hvdWxkIGhhdmUgYSBmbGF0dGVuZWQvdW5pcXVlIGFycmF5IG5vdywgcmV0dXJuIGl0CgkJcmV0dXJuIHJldDsKCX07Cgl2YXIgdW5pb24gPSBlbnlvLnVuaW9uOwoJLy8qQHB1YmxpYwoJLyoqCgkJUmV0dXJucyB0aGUgdW5pcXVlIHZhbHVlcyBmb3VuZCBpbiBvbmUgb3IgbW9yZSBhcnJheXMuCgkqLwoJZW55by51bmlxdWUgPSB1bmlvbjsKCXZhciB1bmlxdWUgPSBlbnlvLnVuaXF1ZTsKCgkvLypAcHVibGljCgkvKioKCQlSZWR1Y2VzIG9uZSBvciBtb3JlIGFycmF5cywgcmVtb3ZpbmcgYW55IGR1cGxpY2F0ZSBlbnRyaWVzCgkJYWNyb3NzIHRoZW0uCgkqLwoJZW55by5yZWR1Y2UgPSBtZXJnZTsKCgkvLypAcHVibGljCgkvKioKCQlDb252ZW5pZW5jZSBtZXRob2QgdGhhdCB0YWtlcyBhbiBhcnJheSBvZiBwcm9wZXJ0aWVzIGFuZCBhbiBvYmplY3QKCQlhcyBwYXJhbWV0ZXJzLiBSZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIGp1c3QgdGhvc2UgcHJvcGVydGllcyBuYW1lZAoJCWluIHRoZSBhcnJheSB0aGF0IGFyZSBmb3VuZCB0byBleGlzdCBvbiB0aGUgYmFzZSBvYmplY3QuIElmIHRoZSB0aGlyZAoJCXBhcmFtZXRlciBpcyB0cnVlLCBmYWxzeSB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkLgoJKi8KCWVueW8ub25seSA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzLCBvYmplY3QsIGlnbm9yZSkgewoJCXZhciByZXQgPSB7fTsKCQl2YXIgaWR4ID0gMDsKCQl2YXIgbGVuOwoJCXZhciBwcm9wZXJ0eTsKCQkvLyBzYW5pdHkgY2hlY2sgdGhlIHByb3BlcnRpZXMgYXJyYXkKCQlpZiAoIWV4aXN0cyhwcm9wZXJ0aWVzKSB8fCAhKHByb3BlcnRpZXMgaW5zdGFuY2VvZiBBcnJheSkpIHsKCQkJcmV0dXJuIHJldDsKCQl9CgkJLy8gc2FuaXR5IGNoZWNrIHRoZSBvYmplY3QKCQlpZiAoIWV4aXN0cyhvYmplY3QpIHx8ICJvYmplY3QiICE9PSB0eXBlb2Ygb2JqZWN0KSB7CgkJCXJldHVybiByZXQ7CgkJfQoJCS8vIHJlZHVjZSB0aGUgcHJvcGVydGllcyBhcnJheSB0byBqdXN0IHVuaXF1ZSBlbnRyaWVzCgkJcHJvcGVydGllcyA9IHVuaXF1ZShwcm9wZXJ0aWVzKTsKCQkvLyBpdGVyYXRlIG92ZXIgdGhlIHByb3BlcnRpZXMgZ2l2ZW4gYW5kIGlmIHRoZSBwcm9wZXJ0eSBleGlzdHMgb24KCQkvLyB0aGUgb2JqZWN0IGNvcHkgaXRzIHZhbHVlIHRvIHRoZSByZXR1cm4gYXJyYXkKCQlmb3IgKGxlbiA9IHByb3BlcnRpZXMubGVuZ3RoOyBpZHggPCBsZW47ICsraWR4KSB7CgkJCXByb3BlcnR5ID0gcHJvcGVydGllc1tpZHhdOwoJCQlpZiAocHJvcGVydHkgaW4gb2JqZWN0KSB7CgkJCQlpZiAodHJ1ZSA9PT0gaWdub3JlICYmICFvYmplY3RbcHJvcGVydHldKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQlyZXRbcHJvcGVydHldID0gb2JqZWN0W3Byb3BlcnR5XTsKCQkJfQoJCX0KCQkvLyByZXR1cm4gdGhlIGFycmF5IG9mIHZhbHVlcyB3ZSBmb3VuZCBmb3IgdGhlIGdpdmVuIHByb3BlcnRpZXMKCQlyZXR1cm4gcmV0OwoJfTsKCgkvLypAcHVibGljCgkvKioKCQlDb252ZW5pZW5jZSBtZXRob2QgdGhhdCB0YWtlcyB0d28gb2JqZWN0cyBhcyBwYXJhbWV0ZXJzLiBGb3IgZWFjaCBrZXkKCQlmcm9tIHRoZSBmaXJzdCBvYmplY3QsIGlmIHRoZSBrZXkgYWxzbyBleGlzdHMgaW4gdGhlIHNlY29uZCBvYmplY3QsIGEKCQltYXBwaW5nIG9mIHRoZSBrZXkgZnJvbSB0aGUgZmlyc3Qgb2JqZWN0IHRvIHRoZSBrZXkgZnJvbSB0aGUgc2Vjb25kCgkJb2JqZWN0IGlzIGFkZGVkIHRvIGEgcmVzdWx0IG9iamVjdCwgd2hpY2ggaXMgZXZlbnR1YWxseSByZXR1cm5lZC4gSW4KCQlvdGhlciB3b3JkcywgdGhlIHJldHVybmVkIG9iamVjdCBtYXBzIHRoZSBuYW1lZCBwcm9wZXJ0aWVzIG9mIHRoZQoJCWZpcnN0IG9iamVjdCB0byB0aGUgbmFtZWQgcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kIG9iamVjdC4gVGhlIG9wdGlvbmFsCgkJdGhpcmQgcGFyYW1ldGVyIGlzIGEgYm9vbGVhbiBkZXNpZ25hdGluZyB3aGV0aGVyIHRvIHBhc3MgdW5rbm93biBrZXkvdmFsdWUKCQlwYWlycyB0aHJvdWdoIHRvIHRoZSBuZXcgb2JqZWN0LiBJZiB0cnVlLCB0aG9zZSBrZXlzIHdpbGwgZXhpc3Qgb24gdGhlCgkJcmV0dXJuZWQgb2JqZWN0LgoJKi8KCWVueW8ucmVtYXAgPSBmdW5jdGlvbiAobWFwLCBvYmosIHBhc3MpIHsKCQl2YXIgJGtleSwgJHZhbCwgJHJldCA9IHBhc3M/IGVueW8uY2xvbmUob2JqKToge307CgkJZm9yICgka2V5IGluIG1hcCkgewoJCQkkdmFsID0gbWFwWyRrZXldOwoJCQlpZiAoJGtleSBpbiBvYmopIHsKCQkJCSRyZXRbJHZhbF0gPSBvYmouZ2V0PyBvYmouZ2V0KCRrZXkpOiBvYmpbJGtleV07CgkJCX0KCQl9CgkJcmV0dXJuICRyZXQ7Cgl9OwoKCS8vKkBwdWJsaWMKCS8qKgoJCUNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHRha2VzIGFuIGFycmF5IG9mIHByb3BlcnRpZXMgYW5kIGFuIG9iamVjdAoJCWFzIHBhcmFtZXRlcnMuIFJldHVybnMgYSBuZXcgb2JqZWN0IHdpdGggYWxsIG9mIHRoZSBrZXlzIGluIHRoZQoJCW9iamVjdCBleGNlcHQgdGhvc2Ugc3BlY2lmaWVkIGluIHRoZSBfcHJvcGVydGllc18gYXJyYXkuIFRoZSB2YWx1ZXMKCQlhcmUgc2hhbGxvdyBjb3BpZXMuCgkqLwoJZW55by5leGNlcHQgPSBmdW5jdGlvbiAocHJvcGVydGllcywgb2JqZWN0KSB7CgkJLy8gdGhlIG5ldyBvYmplY3QgdG8gcmV0dXJuIHdpdGgganVzdCB0aGUgcmVxdWVzdGVkIGtleXMKCQl2YXIgcmV0ID0ge307CgkJdmFyIGtlZXA7CgkJdmFyIGlkeCA9IDA7CgkJdmFyIGxlbjsKCQl2YXIga2V5OwoJCS8vIHNhbml0eSBjaGVjayB0aGUgcHJvcGVydGllcyBhcnJheQoJCWlmICghZXhpc3RzKHByb3BlcnRpZXMpIHx8ICEocHJvcGVydGllcyBpbnN0YW5jZW9mIEFycmF5KSkgewoJCQlyZXR1cm4gcmV0OwoJCX0KCQkvLyBzYW5pdHkgY2hlY2sgdGhlIG9iamVjdAoJCWlmICghZXhpc3RzKG9iamVjdCkgfHwgIm9iamVjdCIgIT09IHR5cGVvZiBvYmplY3QpIHsKCQkJcmV0dXJuIHJldDsKCQl9CgkJLy8gd2Ugd2FudCB0byBvbmx5IHVzZSB0aGUgdW5pb24gb2YgdGhlIHByb3BlcnRpZXMgYW5kIHRoZQoJCS8vIGF2YWlsYWJsZSBrZXlzIG9uIHRoZSBvYmplY3QKCQlrZWVwID0gdW5pb24ocHJvcGVydGllcywga2V5cyhvYmplY3QpKTsKCQkvLyBmb3IgZXZlcnkgcHJvcGVydHkgaW4gdGhlIGtlZXAgYXJyYXkgbm93IGNvcHkgdGhhdCB0byB0aGUgbmV3CgkJLy8gaGFzaAoJCWZvciAobGVuID0ga2VlcC5sZW5ndGg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJa2V5ID0ga2VlcFtpZHhdOwoJCQkvLyBpZiB0aGUga2V5IHdhcyBzcGVjaWZpZWQgaW4gdGhlIHByb3BlcnRpZXMgYXJyYXkgYnV0IGRvZXMgbm90CgkJCS8vIGV4aXN0IGluIHRoZSBvYmplY3QgaWdub3JlIGl0CgkJCWlmICghKGtleSBpbiBvYmplY3QpKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQlyZXRba2V5XSA9IG9iamVjdFtrZXldOwoJCX0KCQkvLyByZXR1cm4gdGhlIG5ldyBoYXNoCgkJcmV0dXJuIHJldDsKCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJSGVscGVyIG1ldGhvZCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBhbmQgcmV0dXJucwoJCWEgaGFzaCBvZiB0aG9zZSBvYmplY3RzIGluZGV4ZWQgYnkgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4gSWYgYSBmaWx0ZXIKCQlpcyBwcm92aWRlZCwgaXQgc2hvdWxkIGFjY2VwdCBmb3VyIHBhcmFtZXRlcnM6IHRoZSBrZXksIHRoZSB2YWx1ZQoJCShvYmplY3QpLCB0aGUgY3VycmVudCBtdXRhYmxlIG1hcCByZWZlcmVuY2UsIGFuZCBhbiBpbW11dGFibGUKCQljb3B5IG9mIHRoZSBvcmlnaW5hbCBhcnJheSBvZiBvYmplY3RzIGZvciBjb21wYXJpc29uLgoJKi8KCWVueW8uaW5kZXhCeSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSwgYXJyYXksIGZpbHRlcikgewoJCS8vIHRoZSByZXR1cm4gdmFsdWUgLSBpbmRleGVkIG1hcCBmcm9tIHRoZSBnaXZlbiBhcnJheQoJCXZhciBtYXAgPSB7fTsKCQl2YXIgdmFsdWU7CgkJdmFyIGxlbjsKCQl2YXIgaWR4ID0gMDsKCQkvLyBzYW5pdHkgY2hlY2sgZm9yIHRoZSBhcnJheSB3aXRoIGFuIGVmZmljaWVudCBuYXRpdmUgYXJyYXkgY2hlY2sKCQlpZiAoIWV4aXN0cyhhcnJheSkgfHwgIShhcnJheSBpbnN0YW5jZW9mIEFycmF5KSkgewoJCQlyZXR1cm4gbWFwOwoJCX0KCQkvLyBzYW5pdHkgY2hlY2sgdGhlIHByb3BlcnR5IGFzIGEgc3RyaW5nCgkJaWYgKCFleGlzdHMocHJvcGVydHkpIHx8ICJzdHJpbmciICE9PSB0eXBlb2YgcHJvcGVydHkpIHsKCQkJcmV0dXJuIG1hcDsKCQl9CgkJLy8gdGhlIGltbXV0YWJsZSBjb3B5IG9mIHRoZSBhcnJheQoJCXZhciBjb3B5ID0gZW55by5jbG9uZShhcnJheSk7CgkJLy8gdGVzdCB0byBzZWUgaWYgZmlsdGVyIGFjdHVhbGx5IGV4c2l0cwoJCWZpbHRlciA9IGV4aXN0cyhmaWx0ZXIpICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBmaWx0ZXI/IGZpbHRlcjogdW5kZWZpbmVkOwoJCWZvciAobGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47ICsraWR4KSB7CgkJCS8vIGdyYWIgdGhlIHZhbHVlIGZyb20gdGhlIGFycmF5CgkJCXZhbHVlID0gYXJyYXlbaWR4XTsKCQkJLy8gbWFrZSBzdXJlIHRoYXQgaXQgZXhpc3RzIGFuZCBoYXMgdGhlIHJlcXVlc3RlZCBwcm9wZXJ0eSBhdCBhbGwKCQkJaWYgKGV4aXN0cyh2YWx1ZSkgJiYgZXhpc3RzKHZhbHVlW3Byb3BlcnR5XSkpIHsKCQkJCWlmIChmaWx0ZXIpIHsKCQkJCQkvLyBpZiB0aGVyZSB3YXMgYSBmaWx0ZXIgdXNlIGl0IC0gaXQgaXMgcmVzcG9uc2libGUgZm9yCgkJCQkJLy8gdXBkYXRpbmcgdGhlIG1hcCBhY2NvcmRpbmdseQoJCQkJCWZpbHRlcihwcm9wZXJ0eSwgdmFsdWUsIG1hcCwgY29weSk7CgkJCQl9IGVsc2UgewoJCQkJCS8vIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvciAtIGNoZWNrIHRvIHNlZSBpZiB0aGUga2V5CgkJCQkJLy8gYWxyZWFkeSBleGlzdHMgb24gdGhlIG1hcCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCgkJCQkJbWFwW3ZhbHVlW3Byb3BlcnR5XV0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCQkvLyBnbyBhaGVhZCBhbmQgcmV0dXJuIG91ciBtb2RpZmllZCBtYXAKCQlyZXR1cm4gbWFwOwoJfTsKCgkvLypAcHVibGljCgkvKioKCQlFeHBlY3RzIGFzIHBhcmFtZXRlcnMgYSBzdHJpbmcsIF9wcm9wZXJ0eV8sIGFuZCBhbiBhcnJheSBvZiBvYmplY3RzCgkJdGhhdCBtYXkgaGF2ZSB0aGUgbmFtZWQgcHJvcGVydHkuIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSB2YWx1ZXMKCQlvZiB0aGUgbmFtZWQgcHJvcGVydHkgaW4gdGhlIG9iamVjdHMgaW4gdGhlIGFycmF5LgoJKi8KCWVueW8ucGx1Y2sgPSBmdW5jdGlvbiAocHJvcGVydHksIGFycmF5KSB7CgkJdmFyIHJldCA9IFtdOwoJCXZhciBpZHggPSAwOwoJCXZhciBsZW47CgkJLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIHByb3BlcnR5IHRvIGxvb2sgZm9yIG9yIGFuIGFycmF5IG9mCgkJLy8gb2JqZWN0cyB0byBzZWFyY2ggdGhyb3VnaCB3ZSBoYXZlIHRvIHJldHVybiBhbiBlbXB0eSBhcnJheQoJCWlmICghKGV4aXN0cyhwcm9wZXJ0eSkgJiYgZXhpc3RzKGFycmF5KSkpIHsKCQkJcmV0dXJuIHJldDsKCQl9CgkJLy8gaWYgaXQgaXNuJ3QgYWN0dWFsbHkgYW4gYXJyYXksIHJldHVybiBhbiBlbXB0eSBhcnJheQoJCWlmICghKGFycmF5IGluc3RhbmNlb2YgQXJyYXkpKSB7CgkJCXJldHVybiByZXQ7CgkJfQoJCS8vIGlmIHByb3BlcnR5IGlzbid0IGEgc3RyaW5nLCB0aGVuIHJldHVybiBhbiBlbXB0eSBhcnJheQoJCWlmICgic3RyaW5nIiAhPT0gdHlwZW9mIHByb3BlcnR5KSB7CgkJCXJldHVybiByZXQ7CgkJfQoJCS8vIG5vdyB0aGF0IHNhbml0eSBpcyBlc3RhYmxpc2hlZCB0byBzb21lIGV4dGVudCwgbGV0J3MgZ2V0CgkJLy8gdG8gd29yawoJCWZvciAobGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47ICsraWR4KSB7CgkJCS8vIGlmIHRoZSBvYmplY3QgaW4gdGhlIGFycmF5IGlzIGFjdHVhbGx5IHVuZGVmaW5lZCwgc2tpcAoJCQlpZiAoIWV4aXN0cyhhcnJheVtpZHhdKSkgewoJCQkJY29udGludWU7CgkJCX0KCQkJLy8gaWYgaXQgd2FzIGZvdW5kLCB0aGVuIGNoZWNrIHRvIHNlZSBpZiB0aGUgcHJvcGVydHkKCQkJLy8gZXhpc3RzIG9uIGl0CgkJCWlmIChleGlzdHMoYXJyYXlbaWR4XVtwcm9wZXJ0eV0pKSB7CgkJCQlyZXQucHVzaChhcnJheVtpZHhdW3Byb3BlcnR5XSk7CgkJCX0KCQl9CgkJLy8gcmV0dXJuIHdoYXRldmVyIHdlIGZvdW5kLCBpZiBhbnl0aGluZwoJCXJldHVybiByZXQ7Cgl9OwoKCS8qKgoJCUNyZWF0ZXMgYSBuZXcgYXJyYXkgd2l0aCBhbGwgZWxlbWVudHMgb2YgX2luQXJyYXlfIHRoYXQgcGFzcyB0aGUgdGVzdAoJCWRlZmluZWQgYnkgX2luRnVuY18uIElmIF9pbkNvbnRleHRfIGlzIHNwZWNpZmllZCwgX2luRnVuY18gaXMgY2FsbGVkCgkJd2l0aCBfaW5Db250ZXh0XyBhcyBfdGhpc18uCgkqLwoJZW55by5maWx0ZXIgPSBmdW5jdGlvbihpbkFycmF5LCBpbkZ1bmMsIGluQ29udGV4dCkgewoJCXZhciBjID0gaW5Db250ZXh0IHx8IHRoaXM7CgkJaWYgKGVueW8uaXNBcnJheShpbkFycmF5KSAmJiBpbkFycmF5LmZpbHRlcikgewoJCQlyZXR1cm4gaW5BcnJheS5maWx0ZXIoaW5GdW5jLCBjKTsKCQl9IGVsc2UgewoJCQl2YXIgcmVzdWx0cyA9IFtdOwoJCQl2YXIgZiA9IGZ1bmN0aW9uKGUsIGksIGEpIHsKCQkJCXZhciBlbyA9IGU7CgkJCQlpZiAoaW5GdW5jLmNhbGwoYywgZSwgaSwgYSkpIHsKCQkJCQlyZXN1bHRzLnB1c2goZW8pOwoJCQkJfQoJCQl9OwoJCQllbnlvLmZvckVhY2goaW5BcnJheSwgZiwgYyk7CgkJCXJldHVybiByZXN1bHRzOwoJCX0KCX07CgoJLyoqCgkJUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBmb3VuZCBvbiBfaW5PYmplY3RfLgoJKi8KCWVueW8ua2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uKGluT2JqZWN0KSB7CgkJdmFyIHJlc3VsdHMgPSBbXTsKCQl2YXIgaG9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKCQlmb3IgKHZhciBwcm9wIGluIGluT2JqZWN0KSB7CgkJCWlmIChob3AuY2FsbChpbk9iamVjdCwgcHJvcCkpIHsKCQkJCXJlc3VsdHMucHVzaChwcm9wKTsKCQkJfQoJCX0KCQkvLyAqc2lnaCogSUUgOAoJCWlmICghKHt0b1N0cmluZzogbnVsbH0pLnByb3BlcnR5SXNFbnVtZXJhYmxlKCJ0b1N0cmluZyIpKSB7CgkJCXZhciBkb250RW51bXMgPSBbCgkJCQkndG9TdHJpbmcnLAoJCQkJJ3RvTG9jYWxlU3RyaW5nJywKCQkJCSd2YWx1ZU9mJywKCQkJCSdoYXNPd25Qcm9wZXJ0eScsCgkJCQknaXNQcm90b3R5cGVPZicsCgkJCQkncHJvcGVydHlJc0VudW1lcmFibGUnLAoJCQkJJ2NvbnN0cnVjdG9yJwoJCQldOwoJCQlmb3IgKHZhciBpID0gMCwgcDsgKHAgPSBkb250RW51bXNbaV0pOyBpKyspIHsKCQkJCWlmIChob3AuY2FsbChpbk9iamVjdCwgcCkpIHsKCQkJCQlyZXN1bHRzLnB1c2gocCk7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIHJlc3VsdHM7Cgl9OwoJdmFyIGtleXMgPSBlbnlvLmtleXM7CgoJLyoqCgkJQ2xvbmVzIGFuIGV4aXN0aW5nIEFycmF5LCBvciBjb252ZXJ0cyBhbiBhcnJheS1saWtlIG9iamVjdCBpbnRvIGFuIEFycmF5LgoKCQlJZiBfaW5PZmZzZXRfIGlzIG5vbi16ZXJvLCB0aGUgY2xvbmluZyBzdGFydHMgZnJvbSB0aGF0IGluZGV4IGluIHRoZSBzb3VyY2UgQXJyYXkuCgkJVGhlIGNsb25lIG1heSBiZSBhcHBlbmRlZCB0byBhbiBleGlzdGluZyBBcnJheSBieSBwYXNzaW5nIHRoZSBleGlzdGluZyBBcnJheSBhcyBfaW5TdGFydFdpdGhfLgoKCQlBcnJheS1saWtlIG9iamVjdHMgaGF2ZSBfbGVuZ3RoXyBwcm9wZXJ0aWVzLCBhbmQgc3VwcG9ydCBzcXVhcmUtYnJhY2tldCBub3RhdGlvbiAoW10pLgoJCU9mdGVuLCBhcnJheS1saWtlIG9iamVjdHMgZG8gbm90IHN1cHBvcnQgQXJyYXkgbWV0aG9kcywgc3VjaCBhcyBfcHVzaF8gb3IgX2NvbmNhdF8sIGFuZAoJCXNvIG11c3QgYmUgY29udmVydGVkIHRvIEFycmF5cyBiZWZvcmUgdXNlLgoKCQlUaGUgc3BlY2lhbCBfYXJndW1lbnRzXyB2YXJpYWJsZSBpcyBhbiBleGFtcGxlIG9mIGFuIGFycmF5LWxpa2Ugb2JqZWN0LgoJKi8KCWVueW8uY2xvbmVBcnJheSA9IGZ1bmN0aW9uKGluQXJyYXlMaWtlLCBpbk9mZnNldCwgaW5TdGFydFdpdGgpIHsKCQl2YXIgYXJyID0gaW5TdGFydFdpdGggfHwgW107CgkJZm9yKHZhciBpID0gaW5PZmZzZXQgfHwgMCwgbCA9IGluQXJyYXlMaWtlLmxlbmd0aDsgaTxsOyBpKyspewoJCQlhcnIucHVzaChpbkFycmF5TGlrZVtpXSk7CgkJfQoJCXJldHVybiBhcnI7Cgl9OwoJZW55by50b0FycmF5ID0gZW55by5jbG9uZUFycmF5OwoKCS8qKgoJCVNoYWxsb3ctY2xvbmVzIGFuIG9iamVjdCBvciBhbiBhcnJheS4KCSovCgllbnlvLmNsb25lID0gZnVuY3Rpb24ob2JqKSB7CgkJcmV0dXJuIGVueW8uaXNBcnJheShvYmopID8gZW55by5jbG9uZUFycmF5KG9iaikgOiBlbnlvLm1peGluKHt9LCBvYmopOwoJfTsKCgkvLyogQHByb3RlY3RlZAoJdmFyIGVtcHR5ID0ge307CgoJLy8qIEBwdWJsaWMKCS8qKgoJCVdpbGwgdGFrZSBhIHZhcmlldHkgb2Ygb3B0aW9ucyB0byB1bHRpbWF0ZWx5IG1peCBhIHNldCBvZiBwcm9wZXJ0aWVzCgkJZnJvbSBvYmplY3RzIGludG8gc2luZ2xlIG9iamVjdC4gQWxsIGNvbmZpZ3VyYXRpb25zIGFjY2VwdCBhIGJvb2xlYW4gYXMKCQl0aGUgZmluYWwgcGFyYW1ldGVyIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRvIGlnbm9yZSBfdHJ1dGh5Xy9fZXhpc3RpbmdfCgkJdmFsdWVzIG9uIGFueSBfb2JqZWN0c18gcHJpb3IuCgoJCUlmIGB0YXJnZXRgIGV4aXN0cyBhbmQgaXMgYW4gb2JqZWN0IHdpbGwgYmUgdGhlIGJhc2UgZm9yIGFsbCBwcm9wZXJ0aWVzCgkJYW5kIHRoZSByZXR1cm5lZCB2YWx1ZS4gSWYgdGhlIHBhcmFtZXRlciBpcyB1c2VkIGJ1dCBpcyBfZmFsc3lfIGEgbmV3CgkJb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQuIElmIG5vIHN1Y2ggcGFyYW1ldGVyIGV4aXN0cyB0aGUgZmlyc3QKCQlwYXJhbWV0ZXIgbXVzdCBiZSBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCBhIG5ldyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIGFzCgkJdGhlIGB0YXJnZXRgLgoKCQlUaGUgYHNvdXJjZWAgcGFyYW1ldGVyIG1heSBiZSBhbiBvYmplY3Qgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cy4gSWYgbm8gYHRhcmdldGAKCQlwYXJhbWV0ZXIgaXMgcHJvdmlkZWQgYHNvdXJjZWAgbXVzdCBiZSBhbiBhcnJheSBvZiBvYmplY3RzLgoKCQlUaGUgYG9wdGlvbnNgIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIHNldCB0aGUgYGlnbm9yZWAgYW5kL29yIGBleGlzdHNgIGZsYWdzCgkJc3VjaCB0aGF0IGlmIGBpZ25vcmVgIGlzIHRydWUgaXQgd2lsbCBub3Qgb3ZlcnJpZGUgYW55IHRydXRoeSB2YWx1ZXMgaW4gdGhlCgkJdGFyZ2V0IGFuZCBpZiBgZXhpc3RzYCBpcyB0cnVlIGl0IHdpbGwgb25seSB1c2UgdHJ1dGh5IHZhbHVlcyBmcm9tIGFueSBvZgoJCXRoZSBzb3VyY2VzLgoKCQlTZXR0aW5nIGBvcHRpb25zYCB0byB0cnVlIHdpbGwgc2V0IGFsbCBvcHRpb25zIHRvIHRydWUuCgkqLwoJZW55by5taXhpbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7CgkJLy8gdGhlIHJldHVybiBvYmplY3QvdGFyZ2V0CgkJdmFyICR0OwoJCS8vIHRoZSBzb3VyY2Ugb3Igc291cmNlcyB0byB1c2UKCQl2YXIgJHM7CgkJdmFyICRvLCAkaSwgJG4sIHMkOwoJCWlmIChlbnlvLmlzQXJyYXkodGFyZ2V0KSkgewoJCQkkdCA9IHt9OwoJCQkkcyA9IHRhcmdldDsKCQkJaWYgKHNvdXJjZSAmJiBlbnlvLmlzT2JqZWN0KHNvdXJjZSkpIHsKCQkJCSRvID0gc291cmNlOwoJCQl9CgkJfSBlbHNlIHsKCQkJJHQgPSB0YXJnZXQgfHwge307CgkJCSRzID0gc291cmNlOwoJCQkkbyA9IG9wdGlvbnM7CgkJfQoJCXZhciByZWxlYXNlID0gZmFsc2U7CgkJaWYgKCFlbnlvLmlzT2JqZWN0KCRvKSkgewoJCQkkbyA9IGVueW8ucG9vbC5jbGFpbU9iamVjdCgpOwoJCQlyZWxlYXNlID0gdHJ1ZTsKCQl9CgkJaWYgKHRydWUgPT09IG9wdGlvbnMpIHsKCQkJJG8uaWdub3JlID0gdHJ1ZTsKCQkJJG8uZXhpc3RzID0gdHJ1ZTsKCQl9CgkJLy8gaGVyZSB3ZSBoYW5kbGUgdGhlIGFycmF5IG9mIHNvdXJjZXMKCQlpZiAoZW55by5pc0FycmF5KCRzKSkgewoJCQlmb3IgKCRpPTA7IChzJD0kc1skaV0pOyArKyRpKSB7CgkJCQllbnlvLm1peGluKCR0LCBzJCwgJG8pOwoJCQl9CgkJfSBlbHNlIHsKCQkvLyBvdGhlcndpc2Ugd2UgZXhlY3V0ZSBzaW5ndWxhcmx5CgkJCWZvciAoJG4gaW4gJHMpIHsKCQkJCXMkID0gJHNbJG5dOwoJCQkJaWYgKGVtcHR5WyRuXSAhPT0gcyQpIHsKCQkJCQlpZiAoKCEkby5leGlzdHMgfHwgcyQpICYmICghJG8uaWdub3JlIHx8ICEkdFskbl0pKSB7CgkJCQkJCSR0WyRuXSA9IHMkOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQlpZiAocmVsZWFzZSkgewoJCQllbnlvLnBvb2wucmVsZWFzZU9iamVjdCgkbyk7CgkJfQoJCXJldHVybiAkdDsKCX07CgoJLy8qIEBwdWJsaWMKCS8qKgoJCVJldHVybnMgYSBmdW5jdGlvbiBjbG9zdXJlIHRoYXQgd2lsbCBjYWxsIChhbmQgcmV0dXJuIHRoZSB2YWx1ZSBvZikKCQlmdW5jdGlvbiBfbWV0aG9kXywgd2l0aCBfc2NvcGVfIGFzIF90aGlzXy4KCgkJX21ldGhvZF8gbWF5IGJlIGEgZnVuY3Rpb24gb3IgdGhlIHN0cmluZyBuYW1lIG9mIGEgZnVuY3Rpb24tdmFsdWVkCgkJcHJvcGVydHkgb24gX3Njb3BlXy4KCgkJQXJndW1lbnRzIHRvIHRoZSBjbG9zdXJlIGFyZSBwYXNzZWQgaW50byB0aGUgYm91bmQgZnVuY3Rpb24uCgoJCQkvLyBhIGZ1bmN0aW9uIHRoYXQgYmluZHMgdGhpcyB0byB0aGlzLmZvbwoJCQl2YXIgZm4gPSBlbnlvLmJpbmQodGhpcywgImZvbyIpOwoJCQkvLyB0aGUgdmFsdWUgb2YgdGhpcy5mb28oMykKCQkJdmFyIHZhbHVlID0gZm4oMyk7CgoJCU9wdGlvbmFsbHksIGFueSBudW1iZXIgb2YgYXJndW1lbnRzIG1heSBiZSBwcmVmaXhlZCB0byB0aGUgYm91bmQgZnVuY3Rpb24uCgoJCQkvLyBhIGZ1bmN0aW9uIHRoYXQgYmluZHMgdGhpcyB0byB0aGlzLmJhciwgd2l0aCBhcmd1bWVudHMgKCJoZWxsbyIsIDQyKQoJCQl2YXIgZm4gPSBlbnlvLmJpbmQodGhpcywgImJhciIsICJoZWxsbyIsIDQyKTsKCQkJLy8gdGhlIHZhbHVlIG9mIHRoaXMuYmFyKCJoZWxsbyIsIDQyLCAiZ29vZGJ5ZSIpOwoJCQl2YXIgdmFsdWUgPSBmbigiZ29vZGJ5ZSIpOwoKCQlGdW5jdGlvbnMgbWF5IGJlIGJvdW5kIHRvIGFueSBzY29wZS4KCgkJCS8vIGJpbmRzIGZ1bmN0aW9uICdiYXInIHRvIHNjb3BlICdmb28nCgkJCXZhciBmbiA9IGVueW8uYmluZChmb28sIGJhcik7CgkJCS8vIHRoZSB2YWx1ZSBvZiBiYXIuY2FsbChmb28pOwoJCQl2YXIgdmFsdWUgPSBmbigpOwoJKi8KCWVueW8uYmluZCA9IGZ1bmN0aW9uKHNjb3BlLCBtZXRob2QvKiwgYm91bmQgYXJndW1lbnRzKi8pewoJCWlmICghbWV0aG9kKSB7CgkJCW1ldGhvZCA9IHNjb3BlOwoJCQlzY29wZSA9IG51bGw7CgkJfQoJCXNjb3BlID0gc2NvcGUgfHwgZW55by5nbG9iYWw7CgkJaWYgKGVueW8uaXNTdHJpbmcobWV0aG9kKSkgewoJCQlpZiAoc2NvcGVbbWV0aG9kXSkgewoJCQkJbWV0aG9kID0gc2NvcGVbbWV0aG9kXTsKCQkJfSBlbHNlIHsKCQkJCXRocm93KFsnZW55by5iaW5kOiBzY29wZVsiJywgbWV0aG9kLCAnIl0gaXMgbnVsbCAoc2NvcGU9IicsIHNjb3BlLCAnIiknXS5qb2luKCcnKSk7CgkJCX0KCQl9CgkJaWYgKGVueW8uaXNGdW5jdGlvbihtZXRob2QpKSB7CgkJCXZhciBhcmdzID0gZW55by5jbG9uZUFycmF5KGFyZ3VtZW50cywgMik7CgkJCWlmIChtZXRob2QuYmluZCkgewoJCQkJcmV0dXJuIG1ldGhvZC5iaW5kLmFwcGx5KG1ldGhvZCwgW3Njb3BlXS5jb25jYXQoYXJncykpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJCXZhciBuYXJncyA9IGVueW8uY2xvbmVBcnJheShhcmd1bWVudHMpOwoJCQkJCS8vIGludm9rZSB3aXRoIGNvbGxlY3RlZCBhcmdzCgkJCQkJcmV0dXJuIG1ldGhvZC5hcHBseShzY29wZSwgYXJncy5jb25jYXQobmFyZ3MpKTsKCQkJCX07CgkJCX0KCQl9IGVsc2UgewoJCQl0aHJvdyhbJ2VueW8uYmluZDogc2NvcGVbIicsIG1ldGhvZCwgJyJdIGlzIG5vdCBhIGZ1bmN0aW9uIChzY29wZT0iJywgc2NvcGUsICciKSddLmpvaW4oJycpKTsKCQl9Cgl9OwoKCS8qKgoJCUNhbGxzIG1ldGhvZCBfaW5NZXRob2RfIG9uIF9pblNjb3BlXyBhc3luY2hyb25vdXNseS4KCgkJVXNlcyBfd2luZG93LnNldFRpbWVvdXRfIHdpdGggbWluaW11bSBkZWxheSwgdXN1YWxseSBhcm91bmQgMTBtcy4KCgkJQWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byBfaW5NZXRob2RfIHdoZW4gaXQgaXMgaW52b2tlZC4KCSovCgllbnlvLmFzeW5jTWV0aG9kID0gZnVuY3Rpb24oaW5TY29wZSwgaW5NZXRob2QvKiwgaW5BcmdzKi8pIHsKCQlyZXR1cm4gc2V0VGltZW91dChlbnlvLmJpbmQuYXBwbHkoZW55bywgYXJndW1lbnRzKSwgMSk7Cgl9OwoKCS8qKgoJCUNhbGxzIG5hbWVkIG1ldGhvZCBfaW5NZXRob2RfIChTdHJpbmcpIG9uIF9pbk9iamVjdF8gd2l0aCBvcHRpb25hbAoJCWFyZ3VtZW50cyBfaW5Bcmd1bWVudHNfIChBcnJheSksIGlmIHRoZSBvYmplY3QgYW5kIG1ldGhvZCBleGlzdC4KCgkJCWVueW8uY2FsbChteVdvcmtPYmplY3QsICJkb1dvcmsiLCBbMywgImZvbyJdKTsKCSovCgllbnlvLmNhbGwgPSBmdW5jdGlvbihpbk9iamVjdCwgaW5NZXRob2QsIGluQXJndW1lbnRzKSB7CgkJdmFyIGNvbnRleHQgPSBpbk9iamVjdCB8fCB0aGlzOwoJCWlmIChpbk1ldGhvZCkgewoJCQl2YXIgZm4gPSBjb250ZXh0W2luTWV0aG9kXSB8fCBpbk1ldGhvZDsKCQkJaWYgKGZuICYmIGZuLmFwcGx5KSB7CgkJCQlyZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgaW5Bcmd1bWVudHMgfHwgW10pOwoJCQl9CgkJfQoJfTsKCgkvKioKCQlSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUuCgoJCVRoZSByZXR1cm5lZCB2YWx1ZSBpcyBlcXVpdmFsZW50IHRvIF9uZXcgRGF0ZSgpLmdldFRpbWUoKV8uCgkqLwoJZW55by5ub3cgPSBEYXRlLm5vdyB8fCBmdW5jdGlvbigpIHsKCQlyZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7Cgl9OwoKCS8vKiBAcHJvdGVjdGVkCgoJZW55by5ub3AgPSBmdW5jdGlvbigpe307CgllbnlvLm5vYiA9IHt9OwoJZW55by5uYXIgPSBbXTsKCgkvLyB0aGlzIG5hbWUgaXMgcmVwb3J0ZWQgaW4gaW5zcGVjdG9ycyBhcyB0aGUgdHlwZSBvZiBvYmplY3RzIGNyZWF0ZWQgdmlhIGRlbGVnYXRlLAoJLy8gb3RoZXJ3aXNlIHdlIHdvdWxkIGp1c3QgdXNlIGVueW8ubm9wCgllbnlvLmluc3RhbmNlID0gZnVuY3Rpb24oKSB7fTsKCgkvLyBzb21lIHBsYXRmb3JtcyBuZWVkIGFsdGVybmF0aXZlIHN5bnRheCAoZS5nLiwgd2hlbiBjb21waWxlZCBhcyBhIHY4IGJ1aWx0aW4pCglpZiAoIWVueW8uc2V0UHJvdG90eXBlKSB7CgkJZW55by5zZXRQcm90b3R5cGUgPSBmdW5jdGlvbihjdG9yLCBwcm90bykgewoJCQljdG9yLnByb3RvdHlwZSA9IHByb3RvOwoJCX07Cgl9CgoJLy8gYm9vZG1hbi9jcm9ja2ZvcmQgZGVsZWdhdGlvbiB3L2Nvcm5mb3JkIG9wdGltaXphdGlvbgoJZW55by5kZWxlZ2F0ZSA9IGZ1bmN0aW9uKHByb3RvKSB7CgkJZW55by5zZXRQcm90b3R5cGUoZW55by5pbnN0YW5jZSwgcHJvdG8pOwoJCXJldHVybiBuZXcgZW55by5pbnN0YW5jZSgpOwoJfTsKCgkvLyogQHB1YmxpYwoKCS8qKgoJCVByb3ZpZGVzIGEgc3R1YiBmdW5jdGlvbiBmb3IgX2cxMW5fIHN0cmluZyB0cmFuc2xhdGlvbi4gVGhpcyBhbGxvd3MKCQlzdHJpbmdzIHRvIGJlIHdyYXBwZWQgaW4gcHJlcGFyYXRpb24gZm9yIGxvY2FsaXphdGlvbi4gSWYgdGhlIF9nMTFuXwoJCWxpYnJhcnkgaXMgbm90IGxvYWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgc3RyaW5nIGFzIGlzLgoKCQkJJEwoJ1dlbGNvbWUnKQoKCQlJZiB0aGUgX2cxMW5fIGxpYnJhcnkgaXMgbG9hZGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlCgkJX2cxMW5fIGxpYnJhcnkgdmVyc2lvbiwgd2hpY2ggdHJhbnNsYXRlcyB3cmFwcGVkIHN0cmluZ3MgdG8gc3RyaW5ncyBmcm9tCgkJYSBkZXZlbG9wZXItcHJvdmlkZWQgcmVzb3VyY2UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHVzZXIKCQlsb2NhbGUuCgkqLwoJd2luZG93LiRMID0gZnVuY3Rpb24oc3RyaW5nKSB7CgkJcmV0dXJuIHN0cmluZzsKCX07Cn0pKCk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/log.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwcm90ZWN0ZWQKCmVueW8ubG9nZ2luZyA9IHsKCS8vIGxvZyBsZXZlbHMgYXJlIGludGVnZXJzIGZyb20gMC05OQoJLy8gOTkgaXMgbWF4aW11bSBsb2dnaW5nCglsZXZlbDogOTksCgkvLyBzZXQgbGV2ZWwgdG8gLTEgdG8gZGlzYWJsZSBhbGwgbG9nZ2luZwoJbGV2ZWxzOiB7bG9nOiAyMCwgd2FybjogMTAsIGVycm9yOiAwfSwKCS8vIHJldHVybiB0cnVlIGlmIGxvZ2dpbmcgbGV2ZWwgaXMgbG93ZXIgdGhhbiB0aGUgY3VycmVudCBsb2cgbGV2ZWwKCXNob3VsZExvZzogZnVuY3Rpb24oaW5NZXRob2QpIHsKCQl2YXIgbGwgPSBwYXJzZUludCh0aGlzLmxldmVsc1tpbk1ldGhvZF0sIDApOwoJCXJldHVybiAobGwgPD0gdGhpcy5sZXZlbCk7Cgl9LAoJLyoKCWZvcm1hdEFyZ3M6IGZ1bmN0aW9uKGluTWV0aG9kLCBpbkFyZ3MpIHsKCQl2YXIgYSQgPSBbXTsKCQlmb3IgKHZhciBpPTAsIGw9aW5BcmdzLmxlbmd0aCwgYTsgKGE9aW5BcmdzW2ldKSB8fCBpPGw7IGkrKykgewoJCQlpZiAoU3RyaW5nKGEpID09ICJbb2JqZWN0IE9iamVjdF0iKSB7CgkJCQlhID0gZW55by5qc29uLnN0cmluZ2lmeShhKTsKCQkJfQoJCQlhJC5wdXNoKGEpOwoJCX0KCQlyZXR1cm4gYSQ7Cgl9LAoJKi8KCV9sb2c6IGZ1bmN0aW9uKGluTWV0aG9kLCBpbkFyZ3MpIHsKCQkvLyBhdm9pZCB0cnlpbmcgdG8gdXNlIGNvbnNvbGUgb24gSUUgaW5zdGFuY2VzIHdoZXJlIHRoZSBvYmplY3QgaGFzbid0IGJlZW4KCQkvLyBjcmVhdGVkIGR1ZSB0byB0aGUgZGV2ZWxvcGVyIHRvb2xzIGJlaW5nIHVub3BlbmVkCgkJdmFyIGNvbnNvbGUgPSB3aW5kb3cuY29uc29sZTsKCQlpZiAodHlwZW9mIGNvbnNvbGUgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgkJLy92YXIgYSQgPSBlbnlvLmxvZ2dpbmcuZm9ybWF0QXJncyhpbk1ldGhvZCwgaW5BcmdzKTsKCQl2YXIgYSQgPSBlbnlvLmlzQXJyYXkoaW5BcmdzKSA/IGluQXJncyA6IGVueW8uY2xvbmVBcnJheShpbkFyZ3MpOwoJCWlmIChlbnlvLmR1bWJDb25zb2xlKSB7CgkJCS8vIGF0IGxlYXN0IGluIGVhcmx5IHZlcnNpb25zIG9mIHdlYm9zLCBjb25zb2xlLiogb25seSBhY2NlcHQgYSBzaW5nbGUgYXJndW1lbnQKCQkJYSQgPSBbYSQuam9pbigiICIpXTsKCQl9CgkJdmFyIGZuID0gY29uc29sZVtpbk1ldGhvZF07CgkJaWYgKGZuICYmIGZuLmFwcGx5KSB7CgkJCS8vIHNvbWUgY29uc29sZXMgc3VwcG9ydCAnd2FybicsICdpbmZvJywgYW5kIHNvIG9uCgkJCWZuLmFwcGx5KGNvbnNvbGUsIGEkKTsKCQl9IGVsc2UgaWYgKGNvbnNvbGUubG9nLmFwcGx5KSB7CgkJCS8vIHNvbWUgY29uc29sZXMgc3VwcG9ydCBjb25zb2xlLmxvZy5hcHBseQoJCQljb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhJCk7CgkJfSBlbHNlIHsKCQkJLy8gb3RoZXJ3aXNlLCBkbyBvdXIgb3duIGZvcm1hdHRpbmcKCQkJY29uc29sZS5sb2coYSQuam9pbigiICIpKTsKCQl9Cgl9LAoJbG9nOiBmdW5jdGlvbihpbk1ldGhvZCwgaW5BcmdzKSB7CgkJdmFyIGNvbnNvbGUgPSB3aW5kb3cuY29uc29sZTsKCQlpZiAodHlwZW9mIGNvbnNvbGUgIT09ICJ1bmRlZmluZWQiKSB7CgkJCWlmICh0aGlzLnNob3VsZExvZyhpbk1ldGhvZCkpIHsKCQkJCXRoaXMuX2xvZyhpbk1ldGhvZCwgaW5BcmdzKTsKCQkJfQoJCX0KCX0KfTsKCi8vKiBAcHVibGljCgovKioKCVNldHMgdGhlIGxvZyBsZXZlbCBmb3IgdGhpcyB3aW5kb3cgaWYgdGhlIGlucHV0IGlzIGEgcmVhbCBudW1iZXIuCgoJVGhlIGxvZyBsZXZlbCBpcyB1c2VkIGFzIGEgd2F0ZXJtYXJrIHRvIGNvbnRyb2wgdGhlIGFtb3VudCBvZiBsb2dnaW5nLgoJU2V0dGluZyB0aGUgbG9nIGxldmVsIGxvd2VyIHdpbGwgcHJldmVudCBsb2dnaW5nIGZ1bmN0aW9ucyB3aXRoIGEgaGlnaGVyCglsZXZlbCBmcm9tIGJlaW5nIGV4ZWN1dGVkLgoKCVRoZSBkZWZhdWx0IGxvZyBsZXZlbCBpcyA5OS4gIDxhIGhyZWY9IiNlbnlvLmxvZyI+ZW55by5sb2c8L2E+IHdpbGwgb3V0cHV0CglpZiB0aGUgbGV2ZWwgaXMgMjAgb3IgYWJvdmUsIDxhIGhyZWY9IiNlbnlvLndhcm4iPmVueW8ud2FybjwvYT4gYXQgMTAsIGFuZAoJPGEgaHJlZj0iI2VueW8uZXJyb3IiPmVueW8uZXJyb3I8L2E+IGF0IDAuCiovCmVueW8uc2V0TG9nTGV2ZWwgPSBmdW5jdGlvbihpbkxldmVsKSB7Cgl2YXIgbGwgPSBwYXJzZUludChpbkxldmVsLCAwKTsKCWlmIChpc0Zpbml0ZShsbCkpIHsKCQllbnlvLmxvZ2dpbmcubGV2ZWwgPSBsbDsKCX0KfTsKCi8qKgoJU2VuZHMgYSBsb2cgbWVzc2FnZSB0byB0aGUgY29uc29sZSwgaWYgdGhlIGN1cnJlbnQgbG9nIGxldmVsIGFsbG93cyBmb3IgaXQuCgoJT2JqZWN0cyBhcmUgY29udmVydGVkIHRvIEpTT04gYXV0b21hdGljYWxseS4KCglNdWx0aXBsZSBhcmd1bWVudHMgYXJlIGNvZXJjZWQgdG8gU3RyaW5nIGFuZCBqb2luZWQgd2l0aCBzcGFjZXMuCiovCmVueW8ubG9nID0gZnVuY3Rpb24oKSB7CgllbnlvLmxvZ2dpbmcubG9nKCJsb2ciLCBhcmd1bWVudHMpOwp9OwoKLy8qIFNhbWUgYXMgX2xvZ18sIGV4Y2VwdCB1c2VzIHRoZSBjb25zb2xlJ3Mgd2FybiBtZXRob2QgKGlmIGl0IGV4aXN0cykuCmVueW8ud2FybiA9IGZ1bmN0aW9uKCkgewoJZW55by5sb2dnaW5nLmxvZygid2FybiIsIGFyZ3VtZW50cyk7Cn07CgovLyogU2FtZSBhcyBfbG9nXywgZXhjZXB0IHVzZXMgdGhlIGNvbnNvbGUncyBlcnJvciBtZXRob2QgKGlmIGl0IGV4aXN0cykuCmVueW8uZXJyb3IgPSBmdW5jdGlvbigpIHsKCWVueW8ubG9nZ2luZy5sb2coImVycm9yIiwgYXJndW1lbnRzKTsKfTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/mixins/ApplicationSupport.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qQHB1YmxpYwovKioKCVRoZSBfZW55by5BcHBsaWNhdGlvblN1cHBvcnRfIG1peGluIGFkZHMgZ2VuZXJpYyBzdXBwb3J0IHRvIGFueQoJX2VueW8uQ29tcG9uZW50XyBzdWNoIHRoYXQgYW55dGltZSB0aGUgX2NyZWF0ZUNvbXBvbmVudF8gKG9yCglfY3JlYXRlQ29tcG9uZW50c18pIG1ldGhvZCBpcyBjYWxsZWQsIGl0IHdpbGwgc3VwcGx5IGEgcmVmZXJlbmNlCgl0byB0aGUgYXBwbGljYXRpb24gaW5zdGFuY2UgaXQgYmVsb25ncyB0byBhcyB0aGUgX2FwcF8gcHJvcGVydHksIGZvcgoJdXNlIGluIGRldGVybWluaW5nIHJlbGF0aXZlIHBhdGhzIHRvIGFwcGxpY2F0aW9uLXNjb3BlZCBjb250cm9sbGVycwoJb3Igc3RhdGUuCiovCmVueW8uY3JlYXRlTWl4aW4oewoKCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJLy8gUFVCTElDIFBST1BFUlRJRVMKCgkvLypAcHVibGljCgluYW1lOiAiZW55by5BcHBsaWNhdGlvblN1cHBvcnQiLAoKCS8vKkBwdWJsaWMKCWFwcDogbnVsbCwKCgkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCS8vIFBST1RFQ1RFRCBQUk9QRVJUSUVTCgoJLy8qQHByb3RlY3RlZAoJX3N1cHBvcnRzQXBwbGljYXRpb25zOiB0cnVlLAoKCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJLy8gUFJPVEVDVEVEIE1FVEhPRFMKCgkvLypAcHJvdGVjdGVkCgkvKioKCQlPdmVybG9hZCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIF9hcHBfIHByb3BlcnR5IHRvCgkJYWxsIGNoaWxkIGNvbXBvbmVudHMuCgkqLwoJYWRqdXN0Q29tcG9uZW50UHJvcHM6IGZ1bmN0aW9uIChwcm9wcykgewoJCS8vIGNvcHkgdGhlIHJlZmVyZW5jZSBvZiB0aGlzIGNvbXBvbmVudCB0byB0aGUgY2hpbGQgY29tcG9uZW50CgkJLy8gcHJvcGVydGllcyBoYXNoCgkJcHJvcHMuYXBwID0gdGhpcy5hcHA7CgkJcmV0dXJuIHRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cywgcHJvcHMpOwoJfSwKCgkvLypAcHJvdGVjdGVkCglkZXN0cm95OiBmdW5jdGlvbiAoKSB7CgkJdGhpcy5hcHAgPSB1bmRlZmluZWQ7Cgl9Cgp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/mixins/AutoBindingSupport.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGhpcyBoYXNoIGNvbnRhaW5zIGEgbWFwcGluZyBvZiB0aGUgYXV0byBiaW5kaW5nIEFQSSBwcm9wZXJ0aWVzCgkJdG8gdGhlaXIgZXF1aXZhbGVudHMgaW4gdGhlIGFjdHVhbCBiaW5kaW5ncyBBUEkuCgkqLwoJdmFyIHJlbWFwcGVkID0gewoJCWJpbmRGcm9tOiAiZnJvbSIsCgkJYmluZFRvOiAidG8iLAoJCWJpbmRUcmFuc2Zvcm06ICJ0cmFuc2Zvcm0iLAoJCWJpbmRPbmVXYXk6ICJvbmVXYXkiLAoJCWJpbmRUd29XYXk6ICJ0d29XYXkiLAoJCWJpbmRBdXRvU3luYzogImF1dG9TeW5jIiwKCQliaW5kRGVidWc6ICJkZWJ1ZyIsCgkJYmluZFNvdXJjZTogInNvdXJjZSIKCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGhpcyBoYXNoIGNvbnRhaW5zIHRoZSBkZWZhdWx0IHByb3BlcnRpZXMgYXBwbGllZCB0byBuZXcgYmluZGluZ3MKCQlnZW5lcmF0ZWQgYnkgdGhlIGF1dG8gYmluZGluZ3Mgc2V0dXAuIFRoZXNlIHByb3BlcnRpZXMgZmlsbCBpbiBnYXBzCgkJd2hlcmUgbmV3IHZhbHVlcyBhcmUgbm90IHN1cHBsaWVkLCBidXQgZG8gbm90IG92ZXJyaWRlIHNwZWNpZmllZAoJCXZhbHVlcy4KCSovCgl2YXIgZGVmYXVsdHMgPSB7CgkJdG86ICIuY29udGVudCIsCgkJdHJhbnNmb3JtOiBudWxsLAoJCW9uZVdheTogdHJ1ZSwKCQl0d29XYXk6IGZhbHNlLAoJCWF1dG9TeW5jOiB0cnVlLAoJCWRlYnVnOiBmYWxzZQoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX3NldHVwQXV0b0JpbmRpbmdzID0gZnVuY3Rpb24gKCkgewoJCWlmICghdGhpcy5fc3VwcG9ydHNBdXRvQmluZGluZ3MpIHsKCQkJcmV0dXJuOwoJCX0KCQl2YXIgY29udHJvbHMgPSB0aGlzLmdldCgiX2JpbmRhYmxlQ29udHJvbHMiKTsKCQl2YXIgaWR4ID0gMDsKCQl2YXIgbGVuID0gY29udHJvbHMubGVuZ3RoOwoJCXZhciBiaW5kU291cmNlID0gdGhpcy5iaW5kU291cmNlIHx8IHRoaXMubW9kZWw7CgkJdmFyIGNvbnRyb2w7CgkJdmFyIHByb3BzOwoJCXZhciBiOwoJCXZhciB4dHJhOwoJCWZvciAoOyBpZHggPCBsZW47ICsraWR4KSB7CgkJCXh0cmEgPSBlbnlvLnBvb2wuY2xhaW1PYmplY3QoKTsKCQkJY29udHJvbCA9IGNvbnRyb2xzW2lkeF07CgkJCXByb3BzID0gdGhpcy5fYmluZFByb3BlcnRpZXMoY29udHJvbCk7CgkJCWlmIChwcm9wcy5zb3VyY2UgJiYgZW55by5pc1N0cmluZyhwcm9wcy5zb3VyY2UpKSB7CgkJCQlwcm9wcy5zb3VyY2UgPSBlbnlvLmdldFBhdGguY2FsbChjb250cm9sLCBwcm9wcy5zb3VyY2UpOwoJCQl9CgkJCXh0cmEuc291cmNlID0gcHJvcHMuc291cmNlIHx8IGJpbmRTb3VyY2U7CgkJCXh0cmEudGFyZ2V0ID0gY29udHJvbDsKCQkJZW55by5taXhpbihwcm9wcywgeHRyYSk7CgkJCWlmICgoYj1jb250cm9sLl9hdXRvQmluZGluZykpIHsKCQkJCWIuZGlzY29ubmVjdCgpOwoJCQkJZW55by5taXhpbihiLCBwcm9wcywge2V4aXN0czogdHJ1ZX0pOwoJCQkJYi5yZWZyZXNoKCk7CgkJCX0gZWxzZSB7CgkJCQliID0gdGhpcy5fYXV0b0JpbmRpbmcocHJvcHMpOwoJCQkJY29udHJvbC5fYXV0b0JpbmRpbmcgPSBiOwoJCQl9CgkJCWVueW8ucG9vbC5yZWxlYXNlT2JqZWN0KHh0cmEpOwoJCX0KCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGhlIF9lbnlvLkF1dG9CaW5kaW5nU3VwcG9ydF8gbWl4aW4gcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8KCQlkZWZpbmUgYmluZGluZ3MgZnJvbSBjaGlsZCBjb21wb25lbnRzIHJlbGF0aXZlIHRvIHRoZWlyIF9vd25lcl8uCgkJSW4gYSBjb21wb25lbnQgZGVjbGFyYXRpb24gKG9iamVjdCBsaXRlcmFsIGhhc2ggZm9yIGNvbXBvbmVudHMpLAoJCXNpbXBseSB1c2UgdGhlIGF2YWlsYWJsZSBhdXRvIGJpbmRpbmdzIEFQSSBhbmQgYSBiaW5kaW5nIHdpbGwKCQliZSBjcmVhdGVkIGFjY29yZGluZ2x5LgoJKi8KCWVueW8uY3JlYXRlTWl4aW4oewoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgUFJPUEVSVElFUwoKCQkvLypAcHVibGljCgkJbmFtZTogImVueW8uQXV0b0JpbmRpbmdTdXBwb3J0IiwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIFBST1BFUlRJRVMKCgkJLy8qQHByb3RlY3RlZAoJCV9zdXBwb3J0c0F1dG9CaW5kaW5nczogdHJ1ZSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gQ09NUFVURUQgUFJPUEVSVElFUwoKCQkvLypAcHJvdGVjdGVkCgkJX2JpbmRhYmxlQ29udHJvbHM6IGVueW8uY29tcHV0ZWQoZnVuY3Rpb24gKGNvbnRyb2wpIHsKCQkJY29udHJvbCA9IGNvbnRyb2wgfHwgdGhpczsKCQkJdmFyIGJpbmRhYmxlID0gW107CgkJCXZhciBjb250cm9scyA9IGNvbnRyb2wuY29udHJvbHMgfHwgW107CgkJCXZhciBpZHggPSAwOwoJCQl2YXIgbGVuID0gY29udHJvbHMubGVuZ3RoOwoJCQlmb3IgKDsgaWR4IDwgbGVuOyArK2lkeCkgewoJCQkJYmluZGFibGUgPSBiaW5kYWJsZS5jb25jYXQodGhpcy5fYmluZGFibGVDb250cm9scyhjb250cm9sc1tpZHhdKSk7CgkJCX0KCQkJaWYgKCJiaW5kRnJvbSIgaW4gY29udHJvbCkgewoJCQkJYmluZGFibGUucHVzaChjb250cm9sKTsKCQkJfQoJCQlyZXR1cm4gYmluZGFibGU7CgkJfSwge2NhY2hlZDogdHJ1ZX0pLAoKCQkvLypAcHJvdGVjdGVkCgkJX2JpbmRpbmdEZWZhdWx0czogZW55by5jb21wdXRlZChmdW5jdGlvbiAoKSB7CgkJCXZhciBjdG9yID0gdGhpcy5nZXQoIl9iaW5kaW5nQ29uc3RydWN0b3IiKTsKCQkJdmFyIGtleXMgPSBlbnlvLmtleXMoZGVmYXVsdHMpOwoJCQlpZiAoZW55by5CaW5kaW5nICE9PSBjdG9yKSB7CgkJCQlyZXR1cm4gZW55by5taXhpbihlbnlvLmNsb25lKGRlZmF1bHRzKSwKCQkJCQllbnlvLm9ubHkoa2V5cywgY3Rvci5wcm90b3R5cGUsIHRydWUpKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBlbnlvLmNsb25lKGRlZmF1bHRzKTsKCQkJfQoJCX0sIHtjYWNoZWQ6IHRydWV9KSwKCgkJLy8qQHByb3RlY3RlZAoJCV9hdXRvQmluZGluZ3M6IGVueW8uY29tcHV0ZWQoZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gZW55by5maWx0ZXIodGhpcy5iaW5kaW5ncyB8fCBbXSwgZnVuY3Rpb24gKGJpbmQpIHsKCQkJCXJldHVybiBiaW5kICYmIGJpbmQuX2F1dG9CaW5kaW5nSWQ7CgkJCX0pOwoJCX0pLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgTUVUSE9EUwoKCQkvLypAcHJvdGVjdGVkCgkJX2F1dG9CaW5kaW5nOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBiaW5kID0gdGhpcy5iaW5kaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgkJCWJpbmQuX2F1dG9CaW5kaW5nSWQgPSBlbnlvLnVpZCgiX2F1dG9CaW5kaW5nIik7CgkJCXJldHVybiBiaW5kOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlfYmluZFByb3BlcnRpZXM6IGZ1bmN0aW9uIChjb250cm9sKSB7CgkJCXZhciBwcm9wcyA9IHRoaXMuZ2V0KCJfYmluZGluZ0RlZmF1bHRzIik7CgkJCXJldHVybiBlbnlvLm1peGluKGVueW8ucmVtYXAocmVtYXBwZWQsIGNvbnRyb2wpLCBwcm9wcywgdHJ1ZSk7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlUaGlzIGlzIG92ZXJsb2FkZWQgc28gdGhhdCB3ZSBhbGxvdyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IKCQkJYW55IGJpbmRpbmdzIHRoYXQgYXJlIG5vdCBhdXRvLWJpbmRpbmdzIGFzIGEgbm9ybWFsIHJlYnVpbGQgd2lsbAoJCQlub3Qgd29yay4KCQkqLwoJCXJlYnVpbGRCaW5kaW5nczogZnVuY3Rpb24gKCkgewoJCQl2YXIgJGIgPSBlbnlvLmZpbHRlcih0aGlzLmJpbmRpbmdzIHx8IFtdLCBmdW5jdGlvbiAoYikgewoJCQkJcmV0dXJuIGIgJiYgIWIuX2F1dG9CaW5kaW5nOwoJCQl9KTsKCQkJdmFyICR0ID0gZW55by5wb29sLmNsYWltT2JqZWN0KCk7CgkJCSR0WzBdID0gJGI7CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cywgJHQpOwoJCQlfc2V0dXBBdXRvQmluZGluZ3MuY2FsbCh0aGlzKTsKCQkJZW55by5wb29sLnJlbGVhc2VPYmplY3QoJHQpOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQljcmVhdGU6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIHByb3AgPSB0aGlzLmJpbmRTb3VyY2UgfHwgIm1vZGVsIjsKCQkJLy8gTk9URTogV2UgZG9uJ3QgbmVlZCB0byByZWdpc3RlciBmb3IgdGhlIG1vZGVsIHByb3BlcnR5IGFzIGVueW8uQ29udHJvbAoJCQkvLyB3aWxsIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcmVidWlsZEJpbmRpbmdzIGNhbGwgd2hpY2ggd2UgaGF2ZSBtb2RpZmllZAoJCQkvLyB0byBoYW5kbGUgdGhpcyBwcm9wZXJseQoJCQlpZiAocHJvcCAhPSAibW9kZWwiKSB7CgkJCQl0aGlzLmFkZE9ic2VydmVyKHByb3AsIF9zZXR1cEF1dG9CaW5kaW5ncywgdGhpcyk7CgkJCX0KCQkJaWYgKHByb3AgPT0gIm1vZGVsIiAmJiB0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwuX2lzTW9kZWwpIHsKCQkJCV9zZXR1cEF1dG9CaW5kaW5ncy5jYWxsKHRoaXMpOwoJCQl9CgkJfQoKCX0pOwoKfShlbnlvKSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/mixins/BindingSupport.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGhpcyBtaXhpbiBwcm92aWRlcyBjb3JlIHN1cHBvcnQgZm9yIGJpbmRpbmdzLCBiaW5kaW5ncy1hcnJheXMgYW5kIGEKCQliaW5kaW5nIEFQSSB0byBvYmplY3RzIHRoYXQgaW1wbGVtZW50IGl0LiBJdCByZXF1aXJlcyB0aGUgY29tcHV0ZWQKCQlwcm9wZXJ0eSBzdXBwb3J0IGFuZCBvYnNlcnZlciBtZXRob2Qgc3VwcG9ydCBtaXhpbnMuCgkqLwoJZW55by5jcmVhdGVNaXhpbih7CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQluYW1lOiAiZW55by5CaW5kaW5nU3VwcG9ydCIsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJV2hpbGUgYmluZGluZyBraW5kIG1heSBiZSBvdmVybG9hZGVkIG9uIGEgcGVyLWJpbmRpbmcgYmFzaXMKCQkJZm9yIG9iamVjdHMgdGhhdCBpbnRlbmQgdG8gdXNlIGEgY3VzdG9tIGtpbmQgZm9yIGFsbCBvZiB0aGVpcgoJCQliaW5kaW5ncywgaXQgbWF5IGFsc28gYmUgc2V0IGhlcmUuCgkJKi8KCQlkZWZhdWx0QmluZGluZ0tpbmQ6ICJlbnlvLkJpbmRpbmciLAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUFuIGFycmF5IG9mIGRlY2xhcmVkIGNvbmZpZ3VyYXRpb25zIGZvciBiaW5kaW5ncyB0aGF0CgkJCXdpbGwgYmUgY3JlYXRlZCBvbiBvYmplY3QgaW5zdGFudGlhdGlvbi4KCQkqLwoJCWJpbmRpbmdzOiBudWxsLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgUFJPUEVSVElFUwoKCQkvLypAcHJvdGVjdGVkCgkJX3N1cHBvcnRzQmluZGluZ3M6IHRydWUsCgoJCS8vKkBwcm90ZWN0ZWQKCQlfYmluZGluZ3NGcm9tT2JzZXJ2ZXJzOiBudWxsLAoKCQkvLypAcHJvdGVjdGVkCgkJX2RpZFNldHVwQmluZGluZ3M6IGZhbHNlLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBDT01QVVRFRCBQUk9QRVJUSUVTCgoJCS8vKkBwcm90ZWN0ZWQKCQlfYmluZGluZ0NvbnN0cnVjdG9yOiBlbnlvLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIGVueW8uZ2V0UGF0aCh0aGlzLmRlZmF1bHRCaW5kaW5nS2luZCk7CgkJfSwge2NhY2hlZDogdHJ1ZX0pLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgTUVUSE9EUwoKCQkvLypAcHVibGljCgkJLyoqCgkJCUFjY2VwdHMgYW55IG51bWJlciBvZiBoYXNoZXMgdG8gYmUgdXNlZCB0byBjcmVhdGUgYSBiaW5kaW5nIHdob3NlCgkJCW93bmVyIGlzIHRoaXMgb2JqZWN0IGJ5IGRlZmF1bHQuCgoJCQlSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBuZXdseSBjcmVhdGVkIGJpbmRpbmcgYW5kIGFsc28gYWRkcyB0aGUKCQkJYmluZGluZyB0byB0aGlzIG9iamVjdCdzIF9iaW5kaW5nc18gYXJyYXkuCgoJCQlOb3RlIHRoYXQgY2FsbGluZyB0aGUgYGRlc3Ryb3lgIG1ldGhvZCBvbiBhIGJpbmRpbmcncyBvd25lciB3aWxsCgkJCWFsc28gY2xlYW4gdXAgdGhlIGJpbmRpbmcgaXRzZWxmLgoJCSovCgkJYmluZGluZzogZnVuY3Rpb24gKC8qIF9iaW5kaW5nIGRlZmluaXRpb25zXyAqLykgewoJCQl2YXIgZGVmaW5pdGlvbnMgPSBhcmd1bWVudHM7CgkJCXZhciBpZHggPSAwOwoJCQl2YXIgbGVuID0gZGVmaW5pdGlvbnMubGVuZ3RoOwoJCQl2YXIgYmluZGluZzsKCQkJdmFyIHByb3BlcnRpZXMgPSB7fTsKCQkJdmFyIGJpbmRpbmdzID0gdGhpcy5iaW5kaW5nczsKCQkJdmFyIGRlZiA9IHRoaXMuZ2V0KCJfYmluZGluZ0NvbnN0cnVjdG9yIik7CgkJCXZhciBDdG9yOwoJCQl2YXIga2luZDsKCQkJZm9yICg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJCWVueW8ubWl4aW4ocHJvcGVydGllcywgZGVmaW5pdGlvbnNbaWR4XSk7CgkJCX0KCQkJaWYgKChraW5kID0gcHJvcGVydGllcy5raW5kKSkgewoJCQkJaWYgKCJzdHJpbmciID09PSB0eXBlb2Yga2luZCkgewoJCQkJCUN0b3IgPSBlbnlvLmdldFBhdGgocHJvcGVydGllcy5raW5kKTsKCQkJCX0KCQkJCWVsc2UgaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBraW5kKSB7CgkJCQkJQ3RvciA9IGtpbmQ7CgkJCQl9CgkJCX0KCQkJaWYgKCFDdG9yIHx8ICJmdW5jdGlvbiIgIT09IHR5cGVvZiBDdG9yKSB7CgkJCQlDdG9yID0gZGVmOwoJCQl9CgkJCWJpbmRpbmcgPSBuZXcgQ3Rvcih7b3duZXI6IHRoaXMsIGF1dG9Db25uZWN0OiB0cnVlfSwgcHJvcGVydGllcyk7CgkJCWJpbmRpbmdzLnB1c2goYmluZGluZyk7CgkJCXJldHVybiBiaW5kaW5nOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJVXN1YWxseSBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0J3MgYGRlc3Ryb3lgIG1ldGhvZCBpcyBleGVjdXRlZCwgYnV0IG1heQoJCQliZSBjYWxsZWQgYXQgYW55IHRpbWUgdG8gcHJvcGVybHkgY2xlYW4gdXAgYW55IGJpbmRpbmdzIGFzc29jaWF0ZWQgd2l0aAoJCQl0aGlzIG9iamVjdCAoaS5lLiwgYW55IGJpbmRpbmdzIHRoYXQgaGF2ZSB0aGVpciBfb3duZXJfIHByb3BlcnR5IHNldAoJCQl0byB0aGlzIG9iamVjdCkuCgoJCQlUaGlzIG1ldGhvZCBkb2VzIG5vdCByZW1vdmUgYmluZGluZ3MgdGhhdCBvcmlnaW5hdGVkIGZyb20gYW5vdGhlciBvYmplY3QKCQkJYnV0IGFyZQljdXJyZW50bHkgYm91bmQgdG8gYSBwcm9wZXJ0eSBvbiB0aGlzIG9iamVjdC4KCgkJCUlmIHNvIGRlc2lyZWQsIG9uZSBtYXkgcGFzcyBpbiBhbiBhcnJheSBvZiBiaW5kaW5ncywgaW4gd2hpY2ggY2FzZSBvbmx5CgkJCXRob3NlIGJpbmRpbmdzIHNwZWNpZmllZCBpbiB0aGUgYXJyYXkgd2lsbCBiZSBkZXN0cm95ZWQuCgkJKi8KCQljbGVhckJpbmRpbmdzOiBmdW5jdGlvbiAoc3Vic2V0KSB7CgkJCXZhciAkYmluZGluZ3MgPSBzdWJzZXQgfHwgdGhpcy5iaW5kaW5nczsKCQkJaWYgKCEkYmluZGluZ3MubGVuZ3RoKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJZG8gewoJCQkJJGJpbmRpbmdzLnNoaWZ0KCkuZGVzdHJveSgpOwoJCQl9IHdoaWxlICgkYmluZGluZ3MubGVuZ3RoKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUNhbGxzIHRoZSBgcmVmcmVzaGAgbWV0aG9kIG9uIHRoZSBiaW5kaW5ncyBhc3NvY2lhdGVkIHdpdGggdGhpcwoJCQlvYmplY3QsIG9yIG9uIGEgcGFzc2VkLWluIGFycmF5IG9mIGJpbmRpbmdzLgoKCQkJRGlmZmVycyBmcm9tIF9yZWJ1aWxkQmluZGluZ3NfIGluIHRoYXQsIGluc3RlYWQgb2YKCQkJcmVkaXNjb3ZlcmluZyB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2YgZWFjaCBiaW5kaW5nLCBpdAoJCQlyZW1lbWJlcnMgdGhlbSBmcm9tIHRoZSBtb3N0IHJlY2VudCBzZXR1cC4KCgkJCUluIG1vc3Qgc2NlbmFyaW9zLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5LAoJCQl3aXRoIG5vIG5lZWQgZm9yIGV4cGxpY2l0IGNhbGxzIGZyb20gdGhlIGRldmVsb3Blci4KCQkqLwoJCXJlZnJlc2hCaW5kaW5nczogZnVuY3Rpb24gKHN1YnNldCkgewoJCQl2YXIgJGJpbmRpbmdzID0gc3Vic2V0IHx8IHRoaXMuYmluZGluZ3M7CgkJCXZhciBsZW4gPSAkYmluZGluZ3MubGVuZ3RoOwoJCQl2YXIgaWR4ID0gMDsKCQkJZm9yICg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJCSRiaW5kaW5nc1tpZHhdLnJlZnJlc2goKTsKCQkJfQoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQ2FsbHMgdGhlIGByZWJ1aWxkYCBtZXRob2Qgb24gdGhlIGJpbmRpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCgkJCW9iamVjdCwgb3Igb24gYSBwYXNzZWQtaW4gYXJyYXkgb2YgYmluZGluZ3MuCgoJCQlEaWZmZXJzIGZyb20gX3JlZnJlc2hCaW5kaW5nc18gaW4gdGhhdCBpdCBmb3JjZXMgdGhlIHNvdXJjZSBhbmQKCQkJdGFyZ2V0IG9mIGVhY2ggYmluZGluZyB0byBiZSByZWRpc2NvdmVyZWQgdXNpbmcgdGhlIHNwZWNpZmllZAoJCQlwYXRocywgcmF0aGVyIHRoYW4gcmVtZW1iZXJlZCBmcm9tIGEgcHJldmlvdXMgc2V0dXAuCgoJCQlJbiBtb3N0IHNjZW5hcmlvcywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseSwKCQkJd2l0aCBubyBuZWVkIGZvciBleHBsaWNpdCBjYWxscyBmcm9tIHRoZSBkZXZlbG9wZXIuCgkJKi8KCQlyZWJ1aWxkQmluZGluZ3M6IGZ1bmN0aW9uIChzdWJzZXQpIHsKCQkJdmFyICRiaW5kaW5ncyA9IHN1YnNldCB8fCB0aGlzLmJpbmRpbmdzOwoJCQl2YXIgbGVuID0gJGJpbmRpbmdzLmxlbmd0aDsKCQkJdmFyIGlkeCA9IDA7CgkJCWZvciAoOyBpZHggPCBsZW47ICsraWR4KSB7CgkJCQkkYmluZGluZ3NbaWR4XS5yZWJ1aWxkKCk7CgkJCX0KCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBub3QgY2FsbGVkIGRpcmVjdGx5LCBidXQgaXMgY2FsbGVkIGJ5IHRoZQoJCQliaW5kaW5nIHdoZW4gaXQgaXMgZGVzdHJveWVkLiBJdCBhY2NlcHRzIGEgc2luZ2xlIGJpbmRpbmcgYXMgaXRzCgkJCXBhcmFtZXRlcjsgdGhlIGJpbmRpbmcgaXMgcmVtb3ZlZCBmcm9tIHRoZSBfYmluZGluZ3NfIGFycmF5IGlmIGl0CgkJCWV4aXN0cyB0aGVyZS4gVGhpcyBtZXRob2QgZG9lcyBub3QgZGVzdHJveSB0aGUgYmluZGluZyBvciBkZXJlZmVyZW5jZQoJCQlpdHMgX293bmVyXyBwcm9wZXJ0eS4KCQkqLwoJCXJlbW92ZUJpbmRpbmc6IGZ1bmN0aW9uIChiaW5kaW5nKSB7CgkJCS8vIHNhbml0eSBjaGVjayBvbiBiaW5kaW5nCgkJCWlmICghZW55by5leGlzdHMoYmluZGluZykgfHwgIShiaW5kaW5nIGluc3RhbmNlb2YgZW55by5CaW5kaW5nKSkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCXZhciBiaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MgfHwgW107CgkJCXZhciBpZHggPSBlbnlvLmluZGV4T2YoYmluZGluZywgYmluZGluZ3MpOwoJCQlpZiAoISF+aWR4KSB7CgkJCQliaW5kaW5ncy5zcGxpY2UoaWR4LCAxKTsKCQkJfQoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJV2Ugb3ZlcmxvYWQgdGhlIF9hZGRPYnNlcnZlcl8gbWV0aG9kIGZyb20gX09ic2VydmVyTWV0aG9kU3VwcG9ydF8KCQkJc28gdGhhdCB3ZSBjYW4gdHJhY2sgd2hpY2ggb2JzZXJ2ZXJzIGJlbG9uZyB0byBiaW5kaW5ncyBhbmQsIGxhdGVyLAoJCQljbGVhbiB0aGVtIHVwIGFwcHJvcHJpYXRlbHkuCgkJKi8KCQlhZGRPYnNlcnZlcjogZnVuY3Rpb24gKHByb3BlcnR5LCBmbiwgY29udGV4dCkgewoJCQlpZiAoZm4gJiYgZm4uYmluZGluZ0lkKSB7CgkJCQl0aGlzLl9iaW5kaW5nc0Zyb21PYnNlcnZlcnMucHVzaChmbi5iaW5kaW5nSWQpOwoJCQl9CgkJCXJldHVybiB0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCX0sCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBNRVRIT0RTCgoJCS8vKkBwcm90ZWN0ZWQKCQlfY29uc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsKCQkJLy8gaW5pdGlhbGl6ZSBvdXIgYmluZGluZ3MgZnJvbSBvYnNlcnZlcnMgYXJyYXkKCQkJdGhpcy5fYmluZGluZ3NGcm9tT2JzZXJ2ZXJzID0gW107CgkJCXRoaXMuYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzIHx8IFtdOwoJCQlyZXR1cm4gdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJY3JlYXRlOiBmdW5jdGlvbiAoKSB7CgkJCS8vIHdlIGRvIGEgc2luZ2xlIHBhc3MgYXQgZWFjaCBvZiB0aGUgYmluZGluZyBkZWNsYXJhdGlvbnMKCQkJLy8gYW5kIHBhc3MgdGhlbSB0byBvdXIgYmluZGluZyBjcmVhdGlvbiBtZXRob2QKCQkJdmFyICRiaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MgfHwgKHRoaXMuYmluZGluZ3MgPSBbXSk7CgkJCXZhciBsZW4gPSAkYmluZGluZ3MubGVuZ3RoOwoJCQl2YXIgaWR4ID0gMDsKCQkJLy8gd2UgcmVzZXQgb3VyIGJpbmRpbmdzIGFycmF5IGJlY2F1c2UgaXQgd2lsbCBiZSB1c2VkIGJ5IG91cgoJCQkvLyBiaW5kaW5nIG1ldGhvZCB0byBzdG9yZSByZWZlcmVuY2VzIHRvIGJpbmRpbmdzIG93bmVkIGJ5CgkJCS8vIHRoaXMgb2JqZWN0CgkJCXRoaXMuYmluZGluZ3MgPSBbXTsKCQkJZm9yICg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJCXRoaXMuYmluZGluZygkYmluZGluZ3NbaWR4XSk7CgkJCX0KCQkJLy8gaW4gY2FzZSBzb21ldGhpbmcgbmVlZHMgdG8gY2hlY2sgdG8gc2VlIGlmIGJpbmRpbmdzIGhhdmUKCQkJLy8gYWxyZWFkeSBpbml0aWFsaXplZAoJCQl0aGlzLl9kaWRTZXR1cEJpbmRpbmdzID0gdHJ1ZTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJZGVzdHJveTogZnVuY3Rpb24gKCkgewoJCQkvLyB3ZSBzaW1wbHkgaXRlcmF0ZSBvdmVyIGFuZCBkZXN0cm95IGVhY2ggb2YgdGhlIGJpbmRpbmdzCgkJCS8vIGluIG91ciBiaW5kaW5ncyBhcnJheQoJCQl2YXIgJGJpbmRpbmdzID0gdGhpcy5iaW5kaW5nczsKCQkJdmFyICRpZHMgPSB0aGlzLl9iaW5kaW5nc0Zyb21PYnNlcnZlcnM7CgkJCXZhciAkaWQ7CgkJCXZhciAkYmluZDsKCQkJaWYgKCRiaW5kaW5ncy5sZW5ndGgpIHsKCQkJCWRvIHsKCQkJCQkkYmluZGluZ3MucG9wKCkuZGVzdHJveSgpOwoJCQkJfSB3aGlsZSAoJGJpbmRpbmdzLmxlbmd0aCk7CgkJCX0KCQkJLy8gY2hlY2sgZm9yIGFueSBiaW5kaW5ncyBhc3NvY2lhdGVkIHdpdGggdXMgdGhhdCBhcmVuJ3QKCQkJLy8gZGVzdHJveWVkIHlldAoJCQlpZiAoJGlkcy5sZW5ndGgpIHsKCQkJCXdoaWxlICgkaWRzLmxlbmd0aCkgewoJCQkJCSRpZCA9ICRpZHMucG9wKCk7CgkJCQkJJGJpbmQgPSBlbnlvLkJpbmRpbmcuZmluZCgkaWQpOwoJCQkJCWlmICgkYmluZCAmJiAhJGJpbmQuZGVzdHJveWVkKSB7CgkJCQkJCSRiaW5kLmRlc3Ryb3koKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIE9CU0VSVkVSUwoKCX0pOwoKfShlbnlvKSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/mixins/ComputedPropertySupport.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkJVGhlIHBvc3NpYmxlL2NvbmZpZ3VyYWJsZSBvcHRpb25zIHRoYXQgbWF5IGJlIHBhc3NlZCBpbgoJCW9uZSBvciBtb3JlIGhhc2hlcyB0byB0aGUgY29tcHV0ZWQgbWV0aG9kIHdoZW4gd3JhcHBpbmcgYQoJCWZ1bmN0aW9uIGFzIGEgY29tcHV0ZWQgcHJvcGVydHkgb2YgYW4gb2JqZWN0LgoJKi8KCXZhciBkZWZhdWx0cyA9IHsKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlJZiBhIGNvbXB1dGVkIHByb3BlcnR5IGlzIG1hcmtlZCBhcyB2b2xhdGlsZSwgaXQgd2lsbAoJCQliZSBleGVjdXRlZCBvbiBldmVyeSByZXF1ZXN0IHJlZ2FyZGxlc3Mgb2YgaXRzIGRlcGVuZGVuY2llcy4KCQkJSWYgYm90aCBfdm9sYXRpbGVfIGFuZCBfY2FjaGVkXyBhcmUgc2V0IHRvIHRydWUsIHRoZSBwcm9wZXJ0eQoJCQlpcyB0cmVhdGVkIGFzIF9jYWNoZWRfLCBhbmQgX3ZvbGF0aWxlXyBpcyBpZ25vcmVkLgoJCSovCgkJdm9sYXRpbGU6IHRydWUsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJSWYgYSBjb21wdXRlZCBwcm9wZXJ0eSBpcyBtYXJrZWQgYXMgY2FjaGVkLCBpdHMgdmFsdWUgd2lsbCBiZQoJCQljb21wdXRlZCBvbmNlIGFuZCB0aGVuIHJldXNlZCwgdW5sZXNzIG9uZSBvZiBpdHMgZGVwZW5kZW5jaWVzCgkJCWhhcyBiZWVuIGZsYWdnZWQgYXMgYmVpbmcgY2hhbmdlZCBwcmlvciB0byB0aGUgcmVxdWVzdC4gSWYKCQkJdGhlcmUgYXJlIG5vIGRlcGVuZGVuY2llcywgdGhlIHZhbHVlIHdpbGwgb25seSBldmVyIGJlIGNvbXB1dGVkCgkJCW9uY2UuCgoJCQlJZiB0aGlzIHNldHRpbmcgaXMgdHJ1ZSwgaXQgb3ZlcnJpZGVzCXRoZSB2YWx1ZSBvZiB0aGUgX3ZvbGF0aWxlXwoJCQlwcm9wZXJ0eS4KCQkqLwoJCWNhY2hlZDogZmFsc2UsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJTW9zdCBjYWNoZWFibGUgY29tcHV0ZWQgcHJvcGVydGllcyB3aWxsIG5vdCBuZWVkIHRvIGJlIGV2YWx1YXRlZAoJCQl1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGVpciB2YWx1ZXMgYXJlIHJlcXVlc3RlZDsgaG93ZXZlciwgeW91IGNhbgoJCQlmb3JjZSBldmFsdWF0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBhc3NvY2lhdGVkIG9iamVjdCBpcwoJCQlpbnN0YW50aWF0ZWQgYnkgc2V0dGluZyB0aGlzIGZsYWcgdG8gZmFsc2UuCgkJKi8KCQlkZWZlcjogdHJ1ZSwKCgkJLy8qQHByb3RlY3RlZAoJCXZhbHVlOiBudWxsLAoKCQkvLypAcHJvdGVjdGVkCgkJZGlydHk6IDAKCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJV3JhcHBpbmcgYSBjbGFzcyBtZXRob2QgaW4gX2VueW8uY29tcHV0ZWRfIGFsbG93cyB0aGUgbWV0aG9kIHRvIGJlCgkJaW50ZXJwcmV0ZWQgYXMgYSBzdGF0aWMgcHJvcGVydHksIGJpbmRhYmxlIGJ5IGFuIGluc3RhbmNlIG9mCgkJX2VueW8uQmluZGluZ18uIFRoZSBjYWxsIHRvIF9lbnlvLmNvbXB1dGVkXyBhY2NlcHRzIGEgY29uZmlndXJhdGlvbgoJCWhhc2ggYXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLCBhcyB3ZWxsIGFzIGFueSBudW1iZXIgb2Ygc3RyaW5nCgkJcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGFzIGRlcGVuZGVuY2llcyBvZiB0aGUgcHJvcGVydHkuCgoJCU5vdGlmaWNhdGlvbnMgb2YgY2hhbmdlcyB0byBhbnkgb2YgdGhlIGRlcGVuZGVuY2llcyB3aWxsIGNhdXNlIHRoZQoJCWNvbXB1dGVkIHByb3BlcnR5IHRvIGJlIGZsYWdnZWQgYXMgbmVlZGluZyByZWV2YWx1YXRpb24gdGhlIG5leHQKCQl0aW1lIGl0IGlzIHJlcXVlc3RlZCAoaWYgaXQgaXMgY2FjaGVkKS4KCgkJQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgX3ZvbGF0aWxlXyBieSBkZWZhdWx0IGFuZCB3aWxsIGJlIGV2YWx1YXRlZAoJCW9uIGVhY2ggcmVxdWVzdCB1bmxlc3MgbWFya2VkIG90aGVyd2lzZS4KCSovCgllbnlvLmNvbXB1dGVkID0gZnVuY3Rpb24gKGZuIC8qLCBhcmd1bWVudHMgKi8pIHsKCQl2YXIgZGVwcyA9IGVueW8udG9BcnJheShhcmd1bWVudHMpLnNsaWNlKDEpOwoJCXZhciBjb25maWc7CgkJdmFyIHByb3BlcnRpZXM7CgkJaWYgKCFlbnlvLmV4aXN0cyhmbikgfHwgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGZuKSB7CgkJCXRocm93ICJlbnlvLmNvbXB1dGVkOiBhIGNvbXB1dGVkIHByb3BlcnR5IG11c3QgYmUgYSBmdW5jdGlvbiI7CgkJfQoJCXByb3BlcnRpZXMgPSBmbi5wcm9wZXJ0aWVzIHx8IChmbi5wcm9wZXJ0aWVzID0gW10pOwoJCWNvbmZpZyA9IGZuLmNvbmZpZyB8fCBlbnlvLmNsb25lKGRlZmF1bHRzKTsKCQllbnlvLmZvckVhY2goZGVwcywgZnVuY3Rpb24gKGRlcCkgewoJCQlpZiAoInN0cmluZyIgPT09IHR5cGVvZiBkZXApIHsKCQkJCXByb3BlcnRpZXMucHVzaChkZXApOwoJCQl9CgkJCWVsc2UgaWYgKCJvYmplY3QiID09PSB0eXBlb2YgZGVwKSB7CgkJCQkvLyB0aGUgYXNzdW1wdGlvbiBoZXJlIGlzIGl0IG11c3QgYmUgYSBjb25maWd1cmF0aW9uCgkJCQkvLyBoYXNoCgkJCQllbnlvLm1peGluKGNvbmZpZywgZGVwKTsKCQkJfQoJCX0pOwoJCWlmIChmYWxzZSA9PT0gY29uZmlnLnZvbGF0aWxlKSB7CgkJCWNvbmZpZy5jYWNoZWQgPSB0cnVlOwoJCX0KCQllbHNlIGlmICh0cnVlID09PSBjb25maWcuY2FjaGVkKSB7CgkJCWNvbmZpZy52b2xhdGlsZSA9IGZhbHNlOwoJCX0KCQlmbi5jb25maWcgPSBjb25maWc7CgkJZm4uX2lzUHJvcGVydHkgPSB0cnVlOwoJCWNvbmZpZy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKCQlyZXR1cm4gZm47Cgl9OwoKCS8vKkBwcm90ZWN0ZWQKCXZhciBfaXNDb21wdXRlZCA9IGZ1bmN0aW9uIChmbikgewoJCXJldHVybiBmbiAmJiAiZnVuY3Rpb24iID09PSB0eXBlb2YgZm4gJiYgdHJ1ZSA9PT0gZm4uX2lzUHJvcGVydHk7Cgl9OwoKCS8vKkBwcm90ZWN0ZWQKCXZhciBfYWRkRGVwZW5kZW50ID0gZnVuY3Rpb24gKHByb3RvLCBwcm9wZXJ0eSwgZGVwZW5kZW50KSB7CgkJdmFyICRtYXAgPSBwcm90by5fY29tcHV0ZWRNYXA7CgkJaWYgKCEkbWFwW2RlcGVuZGVudF0pIHsKCQkJJG1hcFtkZXBlbmRlbnRdID0gW107CgkJfQoJCSRtYXBbZGVwZW5kZW50XS5wdXNoKHByb3BlcnR5KTsKCX07CgoJLy8qQHByb3RlY3RlZAoJdmFyIF9hZGRDYWNoZWFibGUgPSBmdW5jdGlvbiAocHJvdG8sIHByb3BlcnR5KSB7CgkJdmFyICRjYWNoZWFibGUgPSBwcm90by5fY29tcHV0ZWRDYWNoZWFibGU7CgkJJGNhY2hlYWJsZS5wdXNoKHByb3BlcnR5KTsKCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJQWRkcyBhbiBlbnRyeSBpbiB0aGUgY29tcHV0ZWQgcHJvcGVydGllcyBoYXNoIG9mIHRoZSBvYmplY3Qgc28gdGhhdAoJCWl0IGNhbiBiZSByZWZlcmVuY2VkIGVhc2lseSBsYXRlciBvbi4gQWxzbyBhZGRzIGFuIGVudHJ5IGZvciB0aGUKCQlwcm9wZXJ0eSBuYW1lIG9mIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBmb3IgZWFjaCBvZiBpdHMgZGVwZW5kZW50CgkJcHJvcGVydGllcywgc28gdGhhdCB3aGVuIHRoZXkgYXJlIG1hcHBlZCwgdGhlIGFwcHJvcHJpYXRlIHVwZGF0ZQoJCWNhbiBiZSB0cmlnZ2VyZWQuCgkqLwoJdmFyIF9hZGRDb21wdXRlZCA9IGZ1bmN0aW9uIChwcm90bywgcHJvcGVydHksIGZuKSB7CgkJdmFyICRjb21wdXRlZCA9IHByb3RvLl9jb21wdXRlZDsKCQkvLyBUT0RPOiB0aGlzIGlzIGFzc3VtaW5nIHRoZSBkZXNpcmFibGUgZW5kIGlzIHRvIG92ZXJyaWRlCgkJLy8gYW55IHByZXZpb3VzIGVudHJ5IGZvciBhIG5ld2VyIGVudHJ5IG9mIHRoZSBzYW1lIHByb3BlcnR5CgkJLy8gbmFtZQoJCXZhciAkY29uZmlnID0gJGNvbXB1dGVkW3Byb3BlcnR5XSA9IGZuLmNvbmZpZzsKCQkvLyBpZiB0aGUgcHJvcGVydHkgaXMgY29uZmlndXJlZCBhcyBjYWNoZWFibGUgYW5kIG5vdCBkZWZlcnJlZAoJCS8vIHdlIGFkZCBpdCB0byBhIHNwZWNpYWwgb2JqZWN0IHRvIHNwZWVkIHVwIGluaXRpYWxpemF0aW9uCgkJaWYgKCRjb25maWcuY2FjaGVkICYmICEkY29uZmlnLmRlZmVyKSB7CgkJCV9hZGRDYWNoZWFibGUocHJvdG8sIHByb3BlcnR5KTsKCQl9CgkJLy8gZm9yIGV2ZXJ5IGRlcGVuZGVuY3kgd2UgbmVlZCB0byBhZGQgaXQgdG8gdGhlIG9iamVjdAoJCWVueW8uZm9yRWFjaChmbi5wcm9wZXJ0aWVzLCBmdW5jdGlvbiAoZGVwKSB7CgkJCV9hZGREZXBlbmRlbnQocHJvdG8sIHByb3BlcnR5LCBkZXApOwoJCX0pOwoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX2ZpbmRDb21wdXRlZCA9IGZ1bmN0aW9uIChwcm90bywgcHJvcHMsIGtpbmQpIHsKCQkvLyBubyBuZWVkIHRvIGJvdGhlciBpZiB0aGlzIGRvZXMgbm90IHN1cHBvcnQgY29tcHV0ZWQgcHJvcGVydGllcwoJCWlmICghcHJvdG8uX3N1cHBvcnRzQ29tcHV0ZWQpIHsKCQkJcmV0dXJuOwoJCX0KCQkvLyBvdGhlcndpc2Ugd2Uga25vdyBpdCBkb2VzIGFuZCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBoYXMgc29tZQoJCS8vIGludGlhbCBzdG9yYWdlIHByb3BlcnRpZXMKCQlwcm90by5fY29tcHV0ZWQgPSBraW5kPyBlbnlvLmNsb25lKHByb3RvLl9jb21wdXRlZCB8fCB7fSk6IHByb3RvLl9jb21wdXRlZCB8fCB7fTsKCQlwcm90by5fY29tcHV0ZWRNYXAgPSBraW5kPyBlbnlvLmNsb25lKHByb3RvLl9jb21wdXRlZE1hcCB8fCB7fSkgOiBwcm90by5fY29tcHV0ZWRNYXAgfHwge307CgkJcHJvdG8uX2NvbXB1dGVkQ2FjaGVhYmxlID0ga2luZD8gZW55by5jbG9uZShwcm90by5fY29tcHV0ZWRDYWNoZWFibGUgfHwgW10pOiBwcm90by5fY29tcHV0ZWRDYWNoZWFibGUgfHwgW107CgkJLy8gbm93IHdlIGl0ZXJhdGUgb3ZlciBvbmx5IHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgb24gdGhpcyBuZXcKCQkvLyBraW5kIGRlZmluaXRpb24gKG9yIG9uZXMgYmVpbmcgYWRkZWQgYnkgYSBtaXhpbikgYW5kIGNoZWNrIHRvCgkJLy8gc2VlIGlmIHRoZXkgYXJlIGNvbXB1dGVkIHByb3BlcnRpZXMgc28gd2Ugb25seSBoYXZlIHRvIGRvIHRoaXMKCQkvLyBvbmNlIGFuZCBub3QgYXQgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24gdGltZQoJCWZvciAodmFyIHByb3AgaW4gcHJvcHMpIHsKCQkJaWYgKHByb3BzW3Byb3BdICYmIF9pc0NvbXB1dGVkKHByb3BzW3Byb3BdKSkgewoJCQkJX2FkZENvbXB1dGVkKHByb3RvLCBwcm9wLCBwcm9wc1twcm9wXSk7CgkJCX0KCQl9Cgl9OwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCUNhbGxlZCBieSB0aGUgb3ZlcmxvYWRlZCBnZXR0ZXIgZm9yIG9iamVjdHMgdXNpbmcgdGhlIG1peGluIHN1cHBvcnQKCQlmZWF0dXJlOyB0aGUgb2JqZWN0IHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY2FsbC4KCSovCgl2YXIgX2dldENvbXB1dGVkID0gZnVuY3Rpb24gKHBhdGgpIHsKCQkvLyB3ZSBncmFiIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eQoJCXZhciAkY29uZmlnID0gdGhpcy5fY29tcHV0ZWRbcGF0aF07CgkJLy8gYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBtZXRob2QgaW4gY2FzZSB3ZSBuZWVkIGl0CgkJdmFyIGZuID0gdGhpc1twYXRoXTsKCQkvLyB0aGUgZmFzdCB0cmFjayBpcyBmb3IgY29tcHV0ZWQgcHJvcGVydGllcyB0aGF0IGFyZSB2b2xhdGlsZQoJCS8vIGFuZCBkbyBub3QgY2FjaGUgd2Ugc2ltcGx5IGV4ZWN1dGUgdGhlbSBhbmQgcmV0dXJuIHRoZSB2YWx1ZQoJCWlmICh0cnVlID09PSAkY29uZmlnLnZvbGF0aWxlKSB7CgkJCXJldHVybiBmbi5jYWxsKHRoaXMpOwoJCX0gZWxzZSBpZiAodHJ1ZSA9PT0gJGNvbmZpZy5jYWNoZWQpIHsKCQkJaWYgKCRjb25maWcuZGlydHkgfHwgJGNvbmZpZy5kZWZlcikgewoJCQkJJGNvbmZpZy5kaXJ0eSA9IDA7CgkJCQkkY29uZmlnLnZhbHVlID0gZm4uY2FsbCh0aGlzKTsKCQkJCSRjb25maWcuZGVmZXIgPSBudWxsOwoJCQkJcmV0dXJuICRjb25maWcudmFsdWU7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gJGNvbmZpZy52YWx1ZTsKCQkJfQoJCX0KCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJV2UgcGFzcyB0aGUgcmVxdWVzdGVkIHZhbHVlIGludG8gdGhlIGNvbXB1dGVkIHByb3BlcnR5LCB3aGljaAoJCW1heSBvciBtYXkgbm90IGhhbmRsZSB0aGUgdmFsdWUuCgkqLwoJdmFyIF9zZXRDb21wdXRlZCA9IGZ1bmN0aW9uIChwYXRoLCB2YWx1ZSkgewoJCS8vIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUgbWV0aG9kIGJlY2F1c2Ugd2Ugd2lsbCBuZWVkIGl0CgkJdmFyIGZuID0gdGhpc1twYXRoXTsKCQl2YXIgcHJldiA9IHRoaXMuZ2V0KHBhdGgpOwoJCS8vIHdlIG1lcmVseSBleGVjdXRlIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBhbmQgcGFzcyBpdCB0aGUKCQkvLyB2YWx1ZSwgaWYgaXQgd2FzIGNhcGFibGUgb2Ygc2V0dGluZyB0aGUgdmFsdWUgaXQgd2lsbAoJCS8vIGhhbmRsZSBpdCBvdGhlcndpc2UgaXQgd2lsbCByZWNvbXB1dGUKCQlmbi5jYWxsKHRoaXMsIHZhbHVlKTsKCQkvLyBtYXJrIGl0IGFzIGRpcnR5IGFuZCBwdXNoIGl0IHRvIHRoZSBxdWV1ZQoJCV91cGRhdGVDb21wdXRlZC5jYWxsKHRoaXMsIHBhdGgsIHByZXYsIHZhbHVlKTsKCQkvLyBmbHVzaCB0aGUgcXVldWUgaW1tZWRpYXRlbHkKCQlfZmx1c2hRdWV1ZS5jYWxsKHRoaXMpOwoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX3VwZGF0ZUNvbXB1dGVkID0gZnVuY3Rpb24gKHByb3AsIHByZXYsIHZhbHVlKSB7CgkJdmFyICRjb21wdXRlZCA9IHRoaXMuX2NvbXB1dGVkOwoJCXZhciAkY29uZmlnID0gJGNvbXB1dGVkW3Byb3BdOwoJCWlmICgkY29uZmlnKSB7CgkJCS8vIFRPRE86IHdoaWxlIG5vdCBldmVyeSBjb21wdXRlZCBwcm9wZXJ0eSBpcyBjYWNoZWQKCQkJLy8gd2UgaGF2ZSB0byBjaGVjayBmb3IgaXQgYW55d2F5cyBhbmQgcmF0aGVyIHRoYW4KCQkJLy8gY2F1c2UgZ3JlYXRlciBvdmVyaGVhZCB0byB0ZXN0IHdoZXRoZXIgb3Igbm90IGl0CgkJCS8vIGlzIGNhY2hhYmxlIGFuZCBuZWVkcyB1cGRhdGluZyBqdXN0IGRvIHRoaXMgYXMgaXQKCQkJLy8gc2hvdWxkIGJlIGhhcm1sZXNzIG90aGVyd2lzZQoJCQkrKyRjb25maWcuZGlydHk7CgkJCXRoaXMuX2NvbXB1dGVkUXVldWUucHVzaChbcHJvcCwgcHJldiB8fCAkY29uZmlnLnZhbHVlLCB2YWx1ZV0pOwoJCX0KCX07CgoJLy8qQHByb3RlY3RlZAoJdmFyIF9mbHVzaFF1ZXVlID0gZnVuY3Rpb24gKCkgewoJCXZhciAkcXVldWUgPSB0aGlzLl9jb21wdXRlZFF1ZXVlOwoJCXZhciB2YWx1ZXM7CgkJaWYgKCEkcXVldWUubGVuZ3RoKSB7CgkJCXJldHVybjsKCQl9CgkJZG8gewoJCQl2YWx1ZXMgPSAkcXVldWUuc2hpZnQoKTsKCQkJaWYgKCF2YWx1ZXNbMl0pIHsKCQkJCXZhbHVlc1syXSA9IF9nZXRDb21wdXRlZC5jYWxsKHRoaXMsIHZhbHVlc1swXSk7CgkJCX0KCQkJdGhpcy5ub3RpZnlPYnNlcnZlcnMuYXBwbHkodGhpcywgdmFsdWVzKTsKCQl9IHdoaWxlICgkcXVldWUubGVuZ3RoKTsKCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJQ2FsbGVkIG9uIGV2ZXJ5IG9iamVjdCwgdGhpcyBtZXRob2Qgc2ltcGx5IGRldGVjdHMgd2hldGhlciB0aGUKCQlvYmplY3Qgc3VwcG9ydHMgY29tcHV0ZWQgcHJvcGVydGllczsgaWYgaXQgZG9lcywgd2UgZXhlY3V0ZSBhbnkKCQljYWNoZWFibGVzIHRoYXQgZG9uJ3QgaGF2ZSBfZGVmZXJfIHNldCB0byB0cnVlLgoJKi8KCXZhciBfcG9zdENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkgewoJCWlmICghdGhpcy5fc3VwcG9ydHNDb21wdXRlZCkgewoJCQlyZXR1cm47CgkJfQoJCS8vIGxvb2sgZm9yIHRoZSBzcGVjaWFsIHByb3BlcnR5IGNyZWF0ZWQgYnkgdGhlIGZlYXR1cmUgaG9vawoJCS8vIGZvciBhbnkgY2FjaGVhYmxlIG5vbi1kZWZlcnJlZCBjb21wdXRlZCBwcm9wZXJ0aWVzIGlmCgkJLy8gdGhlIGtpbmQgZXZlbiBzdXBwb3J0cyBjb21wdXRlZCBwcm9wZXJ0aWVzCgkJdmFyICRjb21wdXRlZCA9IHRoaXMuX2NvbXB1dGVkQ2FjaGVhYmxlOwoJCXZhciBwcm9wOwoJCXZhciBpZHg7CgkJdmFyIGxlbjsKCQkvLyBmb3IgZWFjaCBwcm9wZXJ0eSB0aGF0IG5lZWRzIHVwZGF0aW5nIHdlIGFyYml0cmFyaWx5IGZsYWcKCQkvLyBpdCBhcyBkaXJ0eSBhbmQgZm9yY2UgaXQgdG8gYmUgZXZhbHVhdGVkIGFuZCBjYWNoZWQKCQlmb3IgKGlkeCA9IDAsIGxlbiA9ICRjb21wdXRlZC5sZW5ndGg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJcHJvcCA9ICRjb21wdXRlZFtpZHhdOwoJCQkvLyBtYXJrIGl0IGFzIGRpcnR5IHNvIGl0IHdpbGwgYWN0dWFsbHkgYmUgZXhlY3V0ZWQKCQkJX3VwZGF0ZUNvbXB1dGVkLmNhbGwodGhpcywgcHJvcCk7CgkJCS8vIGV2YWx1YXRlIHRoZSBjYWNoZWFibGUgbWV0aG9kCgkJCV9nZXRDb21wdXRlZC5jYWxsKHRoaXMsIHByb3ApOwoJCX0KCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJU3RyaWN0bHkgZm9yIGludGVybmFsIHVzZSwgYXMgdGhlIGFzc3VtcHRpb24gaXMgdGhlIHN0cnVjdHVyZSBvZgoJCXRoZXNlIHByb3RlY3RlZCBwcm9wZXJ0aWVzIHdpbGwgYmUgc2FmZSBhbmQgdGhpcyBtZXRob2QgaXMgbm90CgkJZXhwb3NlZC4gSXQgc2hvdWxkIG9ubHkgZXZlciBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIGNvbXB1dGF0aW9uCgkJb2YgYW55IGNhY2hlYWJsZSB2YWx1ZXMuCgkqLwoJdmFyIF9jb21wdXRlZENsb25lID0gZnVuY3Rpb24gKCRjb21wdXRlZCwgcmVjdXJzaW5nKSB7CgkJdmFyIGNvcHkgPSB7fTsKCQl2YXIgcHJvcDsKCQlmb3IgKHByb3AgaW4gJGNvbXB1dGVkKSB7CgkJCWlmICghJGNvbXB1dGVkLmhhc093blByb3BlcnR5KHByb3ApKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAoIm9iamVjdCIgPT09IHR5cGVvZiAkY29tcHV0ZWRbcHJvcF0JJiYgbnVsbCAhPT0gJGNvbXB1dGVkW3Byb3BdCSYmICFyZWN1cnNpbmcpIHsKCQkJCWNvcHlbcHJvcF0gPSBfY29tcHV0ZWRDbG9uZSgkY29tcHV0ZWRbcHJvcF0sIHRydWUpOwoJCQl9CgkJCWVsc2UgewoJCQkJY29weVtwcm9wXSA9ICRjb21wdXRlZFtwcm9wXTsKCQkJfQoJCX0KCQlyZXR1cm4gY29weTsKCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJSG9va3MgdGhlIGtpbmQgZmVhdHVyZXMgdG8gYXV0b21hdGUgaGFuZGxpbmcgb2YgY29tcHV0YXRpb25zIHdoZW4KCQl0aGUga2luZCBpcyBjcmVhdGVkLgoJKi8KCWVueW8ua2luZC5mZWF0dXJlcy5wdXNoKGZ1bmN0aW9uIChjdG9yLCBwcm9wcykgewoJCV9maW5kQ29tcHV0ZWQoY3Rvci5wcm90b3R5cGUsIHByb3BzLCB0cnVlKTsKCX0pOwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCUhvb2tzIHRoZSBraW5kIHBvc3QtaW5pdGlhbGl6YXRpb24gcm91dGluZXMgdG8gbWFrZSBzdXJlIHdlIGNhbgoJCWRvIHNldHVwIGZvciBvdXIgY2FjaGVkIGNvbXB1dGVkIHByb3BlcnRpZXMgdGhhdCBuZWVkIGl0LgoJKi8KCWVueW8ua2luZC5wb3N0Q29uc3RydWN0b3JzLnB1c2goX3Bvc3RDb25zdHJ1Y3Rvcik7CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJQWRkcyBhIHNwZWNpYWwgaGFuZGxlciBmb3IgbWl4aW5zIHRvIGJlIGF3YXJlIG9mIGNvbXB1dGVkIHByb3BlcnRpZXMuCgkqLwoJZW55by5taXhpbnMuZmVhdHVyZXMucHVzaChfZmluZENvbXB1dGVkKTsKCgkvLypAcHJvdGVjdGVkCgllbnlvLmNyZWF0ZU1peGluKHsKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFVCTElDIFBST1BFUlRJRVMKCgkJLy8qQHB1YmxpYwoJCW5hbWU6ICJlbnlvLkNvbXB1dGVkU3VwcG9ydCIsCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBQUk9QRVJUSUVTCgoJCS8vKkBwcm90ZWN0ZWQKCQlfc3VwcG9ydHNDb21wdXRlZDogdHJ1ZSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gQ09NUFVURUQgUFJPUEVSVElFUwoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgTUVUSE9EUwoKCQkvLypAcHVibGljCgkJLyoqCgkJCU92ZXJsb2FkcyB0aGUgZ2V0dGVyIHNvIHRoYXQgaXQgY2FuIHJldHJpZXZlIGNvbXB1dGVkCgkJCXByb3BlcnR5IHZhbHVlcyBwcm9wZXJseS4KCQkqLwoJCWdldDogZnVuY3Rpb24gKHBhdGgpIHsKCQkJaWYgKF9pc0NvbXB1dGVkKHRoaXNbcGF0aF0pKSB7CgkJCQlyZXR1cm4gX2dldENvbXB1dGVkLmNhbGwodGhpcywgcGF0aCk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQkJfQoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJT3ZlcmxvYWRzIHRoZSBzZXR0ZXIgc28gdGhhdCBpdCBjYW4gYXR0ZW1wdCB0byBjYWxsIHRoZQoJCQljb21wdXRlZCBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gSWYgaXQgZG9lc24ndAoJCQlhY2NlcHQgcGFzc2VkLWluIHBhcmFtZXRlcnMsIGl0IG1heSBkbyBub3RoaW5nLgoJCSovCgkJc2V0OiBmdW5jdGlvbiAocGF0aCwgdmFsdWUpIHsKCQkJaWYgKF9pc0NvbXB1dGVkKHRoaXNbcGF0aF0pKSB7CgkJCQlyZXR1cm4gX3NldENvbXB1dGVkLmNhbGwodGhpcywgcGF0aCwgdmFsdWUpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCX0KCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCU92ZXJsb2FkcyB0aGUgb2JzZXJ2ZXIgc3VwcG9ydCBtZXRob2QgdG8gaG9vayB3aGVuIG5vdGlmaWNhdGlvbnMKCQkJYXJlIHNlbnQsIHNvIHdlIGNhbiBoYW5kbGUgdGhlbSB0aGUgd2F5IHdlIG5lZWQgdG8gZm9yIGNvbXB1dGVkCgkJCXByb3BlcnRpZXMuCgkJKi8KCQlub3RpZnlPYnNlcnZlcnM6IGZ1bmN0aW9uIChwcm9wLCBwcmV2LCB2YWx1ZSkgewoJCQkvLyBhbnkgb2YgdGhlIHBvc3NpYmxlIG5vdGlmaWNhdGlvbnMgd2Ugd2FudCB0byBtYXAKCQkJLy8gdG8gY29tcHV0ZWQgcHJvcGVydHkgKGJ5IG5hbWUpCgkJCXZhciAkbWFwID0gdGhpcy5fY29tcHV0ZWRNYXA7CgkJCXZhciBsZW47CgkJCXZhciBpZHg7CgkJCWlmICgkbWFwW3Byb3BdKSB7CgkJCQlsZW4gPSAkbWFwW3Byb3BdLmxlbmd0aDsKCQkJCWlkeCA9IDA7CgkJCQkvLyBpdGVyYXRlIG92ZXIgZWFjaCBvZiB0aGUgZGVwZW5kZW50IHByb3BlcnRpZXMKCQkJCS8vIGFuZCBtYXJrIHRoZW0gYXMgZGlydHkgbm90ZSB0aGF0IHRoZSB1cGRhdGUgbWV0aG9kCgkJCQkvLyB3aWxsIHF1ZXVlIHRoZSBwcm9wZXJ0eSB0byBub3RpZnkgaXRzIG93biBsaXN0ZW5lcnMKCQkJCS8vIG9mIGl0cyBzdGF0ZSBjaGFuZ2UKCQkJCWZvciAoOyBpZHggPCBsZW47ICsraWR4KSB7CgkJCQkJX3VwZGF0ZUNvbXB1dGVkLmNhbGwodGhpcywgJG1hcFtwcm9wXVtpZHhdKTsKCQkJCX0KCQkJfQoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCQkvLyBpZiB0aGVyZSB3YXMgYW55dGhpbmcgcXVldWVkIGxldHMgZmx1c2ggaXQgbm93CgkJCV9mbHVzaFF1ZXVlLmNhbGwodGhpcyk7CgkJfSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIE1FVEhPRFMKCgkJLy8qQHByb3RlY3RlZAoJCV9jb25zdHJ1Y3RvcjogZnVuY3Rpb24gKCkgewoJCQkvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgdW5pcXVlIHByb3BlcnR5IGhhc2hlcwoJCQkvLyBmb3IgZWFjaCBjb21wdXRlZCBwcm9wZXJ0eSAoc29tZXRoaW5nIHdlIGNhbm5vdCBkbyB3aGVuCgkJCS8vIGFwcGx5aW5nIHRoZW0gdG8gcHJvdG90eXBlcykKCQkJdGhpcy5fY29tcHV0ZWQgPSBfY29tcHV0ZWRDbG9uZSh0aGlzLl9jb21wdXRlZCk7CgkJCXRoaXMuX2NvbXB1dGVkUXVldWUgPSBbXTsKCQkJcmV0dXJuIHRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCWRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKCQkJdmFyICRjb21wdXRlZCA9IHRoaXMuX2NvbXB1dGVkOwoJCQl2YXIgJGNvbmZpZzsKCQkJdmFyIHByb3A7CgkJCWZvciAocHJvcCBpbiAkY29tcHV0ZWQpIHsKCQkJCSRjb25maWcgPSAkY29tcHV0ZWRbcHJvcF07CgkJCQkvLyBtYWtlIHN1cmUgdG8gZnVsbHkgcmVsZWFzZSBhbnkgcmVmZXJlbmNlIHRoaXMKCQkJCS8vIG1pZ2h0IGJlIGhvbGRpbmcgb250bwoJCQkJZGVsZXRlICRjb25maWcudmFsdWU7CgkJCQkvLyByZWxlYXNlIHRoZSBlbnRpcmUgb2JqZWN0IHdoZW4gd2UncmUgZG9uZQoJCQkJZGVsZXRlICRjb21wdXRlZFtwcm9wXTsKCQkJfQoJCX0KCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gT0JTRVJWRVJTCgoJfSk7Cgp9KShlbnlvKTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/mixins/ControllerSupport.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qQHB1YmxpYwovKioKKi8KZW55by5jcmVhdGVNaXhpbih7CgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBQVUJMSUMgUFJPUEVSVElFUwoKCS8vKkBwdWJsaWMKCW5hbWU6ICJlbnlvLkNvbnRyb2xsZXJTdXBwb3J0IiwKCgkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCS8vIFBST1RFQ1RFRCBQUk9QRVJUSUVTCgoJLy8qQHByb3RlY3RlZAoJX3N1cHBvcnRzQ29udHJvbGxlcnM6IHRydWUsCgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBDT01QVVRFRCBQUk9QRVJUSUVTCgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBQVUJMSUMgTUVUSE9EUwoKCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJLy8gUFJPVEVDVEVEIE1FVEhPRFMKCgkvLypAcHJvdGVjdGVkCgljcmVhdGU6IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5jb250cm9sbGVyKSB7CgkJCXRoaXMubm90aWZ5T2JzZXJ2ZXJzKCJjb250cm9sbGVyIik7CgkJfQoJfSwKCgkvLypwcm90ZWN0ZWQKCWRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5jb250cm9sbGVyKSB7CgkJCWlmICh0aGlzLmNvbnRyb2xsZXIub3duZXIgJiYgdGhpcyA9PT0gdGhpcy5jb250cm9sbGVyLm93bmVyKSB7CgkJCQl0aGlzLmNvbnRyb2xsZXIuZGVzdHJveSgpOwoJCQl9CgkJCXRoaXMuY29udHJvbGxlciA9IG51bGw7CgkJfQoJfSwKCgkvLypAcHJvdGVjdGVkCglfY29udHJvbGxlckNoYW5nZWQ6IGVueW8ub2JzZXJ2ZXIoZnVuY3Rpb24gKHByb3BlcnR5LCBwcmV2aW91cywgdmFsdWUpIHsKCQlpZiAocHJldmlvdXMgJiYgdmFsdWUgJiYgcHJldmlvdXMgPT09IHZhbHVlKSB7CgkJCS8vIHNlZW1zIHRvIGJlIHRoZSBzYW1lIGNvbnRyb2xsZXIgd2UgYWxyZWFkeSBoYWQKCQkJcmV0dXJuOwoJCX0KCQkvLyBmaXJzdCBhdHRlbXB0IHRvIGZpbmQgdGhlIGNvbnRyb2xsZXIgZnJvbSB0aGUKCQkvLyBpbmZvcm1hdGlvbiB3ZSd2ZSBiZWVuIGhhbmRlZAoJCWlmICh0aGlzLmNvbnRyb2xsZXIpIHsKCQkJdGhpcy5maW5kQW5kSW5zdGFuY2UoImNvbnRyb2xsZXIiKTsKCQl9Cgl9LCAiY29udHJvbGxlciIpLAoKCS8vKkBwcm90ZWN0ZWQKCWNvbnRyb2xsZXJGaW5kQW5kSW5zdGFuY2U6IGZ1bmN0aW9uIChjdG9yLCBpbnN0KSB7CgkJLy8gaWYgdGhlcmUgaXMgbm8gY29uc3RydWN0b3Igb3IgaW5zdGFuY2UgaXQgd2FzIG5vdCBmb3VuZAoJCWlmICghKGN0b3IgfHwgaW5zdCkpIHsKCQkJZW55by5lcnJvcigiY2Fubm90IGZpbmQgY29udHJvbGxlcjogIiArIHRoaXMuY29udHJvbGxlcik7CgkJCXJldHVybjsKCQl9CgkJLy8gaWYgYSBjb25zdHJ1Y3RvciBleGlzdHMgd2UgaW5zdGFuY2VkIHRoZSBjbGFzcyBhbmQgY2FuCgkJLy8gY2xhaW0gaXQgYXMgb3VyIG93bgoJCWlmIChjdG9yKSB7CgkJCWluc3Quc2V0KCJvd25lciIsIHRoaXMpOwoJCX0KCQkvLyBsZXRzIGFkZCBvdXJzZWx2ZXMgYXMgYSBkaXNwYXRjaCBsaXN0ZW5lcgoJCWVsc2UgewoJCQlpbnN0LmFkZERpc3BhdGNoVGFyZ2V0KHRoaXMpOwoJCX0KCQkvLyB3ZSByZWJ1aWxkIChyYXRoZXIgdGhhbiByZWZyZXNoKSBvdXIgYmluZGluZ3MgYmVjYXVzZQoJCS8vIHRoZXkgYXJlIG5vdyBtb3N0IGxpa2VseSBjb25uZWN0ZWQgdG8gdGhlIHByZXZpb3VzIGNvbnRyb2xsZXIuCgkJLy8gVE9ETzogQXZvaWQgcmVidWlsZGluZyBiaW5kaW5ncyB0byBvYmplY3RzIG90aGVyIHRoYW4gdGhlIGNvbnRyb2xsZXI/CgkJdGhpcy5yZWJ1aWxkQmluZGluZ3MoKTsKCX0sCgoJLy8qQHByb3RlY3RlZAoJZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2ZW50LCBzZW5kZXIpIHsKCQkvLyBpZiB3ZSBoYXZlIGEgY29udHJvbGxlciBhdHRlbXB0IHRvIGRpc3BhdGNoIHRoZSBldmVudCB0aGVyZQoJCS8vIGFuZCBpZiBpdCByZXR1cm5zIHRydWUsIHN0b3AgdGhlIGRpc3BhdGNoCgkJaWYgKHRoaXMuY29udHJvbGxlciAmJiB0aGlzLmNvbnRyb2xsZXIuX2lzQ29udHJvbGxlcikgewoJCQlpZiAodGhpcy5jb250cm9sbGVyLmRpc3BhdGNoRXZlbnQobmFtZSwgZXZlbnQsIHNlbmRlcikpIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCS8vIHRoaXMgc2NlbmFyaW8gaXMgaGFuZGxlZCBjb21wbGV0ZWx5IGluIHRoZSBpbmhlcml0ZWQgbWV0aG9kCgkJCS8vIGhlcmUgd2Ugc2ltcGx5IHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIGFuCgkJCS8vIG9wcG9ydHVuaXR5IHRvIGRlYWwgd2l0aCB0aGUgcmVtYXBwZWQgZXZlbnQKCQkJaWYgKHRoaXNbbmFtZV0gJiYgInN0cmluZyIgPT09IHR5cGVvZiB0aGlzW25hbWVdKSB7CgkJCQlpZiAodGhpcy5jb250cm9sbGVyLmRpc3BhdGNoRXZlbnQodGhpc1tuYW1lXSwgZXZlbnQsIHNlbmRlcikpIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCgoJLy8qQHByb3RlY3RlZAoJZGlzcGF0Y2g6IGZ1bmN0aW9uIChpbk1ldGhvZE5hbWUsIGluRXZlbnQsIGluU2VuZGVyKSB7CgkJLy8gYWxsb3cgYSBjb250cm9sbGVyIHRvIGhhbmRsZSB0aGUgZGVsZWdhdGVkIG5hbWVkIGV2ZW50IGZyb20KCQkvLyBhIGNoaWxkCgkJdmFyIGMgPSB0aGlzLmNvbnRyb2xsZXI7CgkJaWYgKGMpIHsKCQkJaWYgKGNbaW5NZXRob2ROYW1lXSAmJiBlbnlvLmlzRnVuY3Rpb24oY1tpbk1ldGhvZE5hbWVdKSkgewoJCQkJcmV0dXJuIGNbaW5NZXRob2ROYW1lXS5jYWxsKGMsIGluU2VuZGVyIHx8IHRoaXMsIGluRXZlbnQpOwoJCQl9CgkJfQoJCXJldHVybiB0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfQoKCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJLy8gT0JTRVJWRVJTCgp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/mixins/MixinSupport.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJV2hlbiBhIGtpbmQgaXMgZGVmaW5lZCBhcyBhbiBfZW55by5NaXhpbl8sIGl0IGlzIGFjdHVhbGx5CgkJaW5zdGFudGlhdGVkIGltbWVkaWF0ZWx5IGFzIGEgc2luZ2xldG9uIHRvIGJlIHJldXNlZCBieSBhbnkKCQlvdGhlciBraW5kcyB0aGF0IGNhcmUgdG8gYXBwbHkgaXQuCgkqLwoJdmFyIHN0b3JlID0gZW55by5taXhpbnMgPSB7fTsKCgkvLypAcHJvdGVjdGVkCgkvKioKCQlVc2VkIGludGVybmFsbHkgdG8ga2VlcCBhIGNsZWFyZXIgYWJzdHJhY3Rpb24gYmV0d2VlbiBtaXhpbnMnCgkJa25vd2xlZGdlIG9mIGF2YWlsYWJsZSBmZWF0dXJlcyBvZiB0aGUgZnJhbWV3b3JrLgoJKi8KCXZhciBmZWF0dXJlcyA9IGVueW8ubWl4aW5zLmZlYXR1cmVzID0gW107CgoJLy8qQHByb3RlY3RlZAoJdmFyIHJlZ2lzdGVyID0gZnVuY3Rpb24gKG5hbWUsIG1peGluKSB7CgkJaWYgKHN0b3JlW25hbWVdKSB7CgkJCWVueW8uZXJyb3IoImVueW8uY3JlYXRlTWl4aW46IGNhbm5vdCBjcmVhdGUgIiArIG5hbWUgKyAiIGJlY2F1c2UgIiArCgkJCQkiaXQgYWxyZWFkeSBleGlzdHMiKTsKCQl9CgkJc3RvcmVbbmFtZV0gPSBtaXhpbjsKCX07CgoJdmFyIHByb3h5SW5oZXJpdGVkTWV0aG9kID0gZnVuY3Rpb24gKGZuLCBpbmhlcml0ZWQsIG5vbSkgewoJCXJldHVybiBmdW5jdGlvbiAoKSB7CgkJCXZhciBvbGRJbmhlcml0ZWQgPSBmbi5faW5oZXJpdGVkOwoJCQl2YXIgb2xkTm9tID0gZm4ubm9tOwoJCQlmbi5faW5oZXJpdGVkID0gaW5oZXJpdGVkOwoJCQlmbi5ub20gPSBub207CgkJCXZhciByZXQgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoJCQlmbi5faW5oZXJpdGVkID0gIG9sZEluaGVyaXRlZDsKCQkJZm4ubm9tID0gb2xkTm9tOwoJCQlyZXR1cm4gcmV0OwoJCX07Cgl9OwoKCS8vKkBwdWJsaWMKCS8qKgoJCUNyZWF0ZXMgYSByZXVzYWJsZSBoYXNoIG9mIHRoZSBwcm9wZXJ0aWVzIHRvIGJlIGFwcGxpZWQgZm9yIHRoZQoJCXRoZSBuYW1lZCBtaXhpbiB3aGVyZXZlciBpdCBpcyByZXF1ZXN0ZWQuIFJldHVybnMgYSByZWZlcmVuY2UgdG8KCQl0aGUgbmV3IG1peGluIHByb3BlcnRpZXMuCgkqLwoJdmFyIGNyZWF0ZU1peGluID0gZW55by5jcmVhdGVNaXhpbiA9IGZ1bmN0aW9uIChwcm9wcykgewoJCWlmICghcHJvcHMpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkvLyB3ZSBuZWVkIHRvIGdyYWIgdGhlIG5hbWUgYnV0IG1ha2Ugc3VyZSBpdCBpc24ndCBzdG9yZWQgYXMKCQkvLyBhIHByb3BlcnR5IG9uIG1peGluIGhhc2gKCQl2YXIgbmFtZSA9IHByb3BzLm5hbWU7CgkJLy8gaWYgdGhlcmUgaXNuJ3QgYSBuYW1lIGZhaWwgZWFybHkKCQkvLyByZW1vdmUgdGhlIG5hbWUKCQlkZWxldGUgcHJvcHMubmFtZTsKCQlpZiAoIW5hbWUpIHsKCQkJZW55by5lcnJvcigiZW55by5jcmVhdGVNaXhpbjogY2Fubm90IGNyZWF0ZSBtaXhpbiB3aXRob3V0IG5hbWUiKTsKCQl9CgkJcmVnaXN0ZXIobmFtZSwgcHJvcHMpOwoJCS8vIG1vdmUgYW55IG1peGluLWNvbnN0cnVjdG9yIHRvIGEgc3BlY2lhbCBuYW1lCgkJaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBwcm9wcy5jcmVhdGUpIHsKCQkJcHJvcHMuX2NyZWF0ZSA9IHByb3BzLmNyZWF0ZTsKCQkJZGVsZXRlIHByb3BzLmNyZWF0ZTsKCQkJcHJvcHMuX2NyZWF0ZS5ub20gPSBuYW1lICsgIi5jcmVhdGUoKSI7CgkJfQoJCWlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgcHJvcHMuZGVzdHJveSkgewoJCQlwcm9wcy5fZGVzdHJveSA9IHByb3BzLmRlc3Ryb3k7CgkJCWRlbGV0ZSBwcm9wcy5kZXN0cm95OwoJCQlwcm9wcy5fZGVzdHJveS5ub20gPSBuYW1lICsgIi5kZXN0cm95KCkiOwoJCX0KCQlpZiAoIm9iamVjdCIgPT09IHR5cGVvZiBwcm9wcy5oYW5kbGVycykgewoJCQlwcm9wcy5fbWl4aW5IYW5kbGVycyA9IHByb3BzLmhhbmRsZXJzOwoJCQlkZWxldGUgcHJvcHMuaGFuZGxlcnM7CgkJfQoJCWlmIChlbnlvLmV4aXN0cyhwcm9wc1sib3ZlcnJpZGUiXSkpIHsKCQkJcHJvcHMuX21peGluT3ZlcnJpZGUgPSBwcm9wcy5vdmVycmlkZTsKCQkJZGVsZXRlIHByb3BzLm92ZXJyaWRlOwoJCX0gZWxzZSB7CgkJCXByb3BzLl9taXhpbk92ZXJyaWRlID0gdHJ1ZTsKCQl9CgkJcmV0dXJuIHByb3BzOwoJfTsKCgkvLypAcHVibGljCgkvKioKCQlEZXRlcm1pbmUgaWYgdGhlIGtpbmQgb3IgaW5zdGFuY2UgaGFzIHRoZSByZXF1ZXN0ZWQgX21peGluXy4KCQlUaGUgcGFyYW1ldGVyIG11c3QgYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoZSBtaXhpbgoJCWluIHF1ZXN0aW9uLgoJKi8KCWVueW8uaGFzTWl4aW4gPSBmdW5jdGlvbiAodGFyZ2V0LCBtaXhpbikgewoJCWlmICh0YXJnZXQgJiYgdGFyZ2V0Lmhhc01peGluKSB7CgkJCXJldHVybiB0YXJnZXQuaGFzTWl4aW4obWl4aW4pOwoJCX0gZWxzZSB7CgkJCXJldHVybiAhIX5lbnlvLmluZGV4T2YobWl4aW4sIHRhcmdldC5fYXBwbGllZE1peGlucyB8fCBbXSk7CgkJfQoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX2FwcGx5RmVhdHVyZXMgPSBmdW5jdGlvbiAoYmFzZSwgbWl4aW4pIHsKCQlmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBmZWF0dXJlcy5sZW5ndGg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJZmVhdHVyZXNbaWR4XShiYXNlLCBtaXhpbik7CgkJfQoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX2FkZE1peGluID0gZnVuY3Rpb24gKHByb3RvLCBtaXhpbiwgbmFtZSkgewoKCQkvLyBmb3IgdGhlIGtpbmQgd2UgY2xvbmUgdGhlIGtub3duIG1peGluIGNvbnN0cnVjdG9ycwoJCXZhciBjdG9ycyA9IHByb3RvLl9taXhpbkNyZWF0ZSA9IGVueW8uY2xvbmUocHJvdG8uX21peGluQ3JlYXRlIHx8IFtdKTsKCQkvLyBmb3IgdGhlIGtpbmQgd2UgY2xvbmUgdGhlIGtub3duIG1peGluIGRlc3RydWN0b3JzCgkJdmFyIGR0b3JzID0gcHJvdG8uX21peGluX2Rlc3Ryb3kgPSBlbnlvLmNsb25lKHByb3RvLl9taXhpbl9kZXN0cm95IHx8IFtdKTsKCQkvLyBmb3IgdGhlIGtpbmQgd2UgY2xvbmUgdGhlIGtub3duIGFwcGxpZWQgbWl4aW5zCgkJdmFyIGFwcGxpZWQgPSBwcm90by5fYXBwbGllZE1peGlucyA9IGVueW8uY2xvbmUocHJvdG8uX2FwcGxpZWRNaXhpbnMgfHwgW10pOwoKCQkvLyBpZiB0aGlzIG1peGluIGlzIGFscmVhZHkgYXBwbGllZCwgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8KCQlpZiAoISF+ZW55by5pbmRleE9mKG5hbWUsIGFwcGxpZWQpKSB7CgkJCXJldHVybiBlbnlvLndhcm4oImVueW8uYXBwbHlNaXhpbjogIiArCgkJCSJhdHRlbXB0IHRvIGFwcGx5IG1peGluICIgKyBuYW1lICsgIiB0byAiICsgcHJvdG8ua2luZE5hbWUgKwoJCQkiIG11bHRpcGxlIHRpbWVzIik7CgkJfQoJCS8vIGFkZCB0aGUgbWl4aW4gY29uc3RydWN0b3IgdG8gdGhlIHF1ZXVlCgkJaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBtaXhpbi5fY3JlYXRlKSB7CgkJCWN0b3JzLnB1c2gobWl4aW4uX2NyZWF0ZSk7CgkJfQoJCS8vIGFkZCB0aGUgbWl4aW4gZGVzdHJ1Y3RvciB0byB0aGUgcXVldWUKCQlpZiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIG1peGluLl9kZXN0cm95KSB7CgkJCWR0b3JzLnB1c2gobWl4aW4uX2Rlc3Ryb3kpOwoJCX0KCQkvLyBhcHBseSBhbGwgb2YgdGhlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgdG8gdGhlIGJhc2Uga2luZCBwcm90b3R5cGUKCQlfYXBwbHlQcm9wZXJ0aWVzKHByb3RvLCBtaXhpbiwgbmFtZSk7CgkJLy8gYWRkIHRoZSBuYW1lIG9mIHRoaXMgbWl4aW4gdG8gdGhlIGFwcGxpZWQgbWl4aW5zIGFycmF5IGZvciB0aGUga2luZAoJCWFwcGxpZWQucHVzaChuYW1lKTsKCQkvLyBnaXZlIGVhY2ggYXZhaWxhYmxlIG1peGluIGZlYXR1cmUgdGhlIG9wcG9ydHVuaXR5IHRvIGhhbmRsZSBwcm9wZXJ0aWVzCgkJX2FwcGx5RmVhdHVyZXMocHJvdG8sIG1peGluKTsKCX07CgoJLy8qQHByb3RlY3RlZAoJdmFyIF9hcHBseVByb3BlcnRpZXMgPSBmdW5jdGlvbiAoYmFzZSwgcHJvcHMsIG5hbWUpIHsKCQkvLyB0aGUgbmFtZSBvZiBhbnkgY29uY2F0ZW5hdGFibGUgcHJvcGVydGllcwoJCXZhciBjb25jYXQgPSBiYXNlLmNvbmNhdCB8fCBbXTsKCQkvLyB3aGV0aGVyIG9yIG5vdCB0aGUgbWl4aW4gd2lzaGVzIHRvIG92ZXJyaWRlIGRlZmluZWQKCQkvLyBwcm9wZXJ0aWVzIChub3QgZnVuY3Rpb25zKSBvZiB0aGUgYmFzZSBpZiB0aGV5IGV4aXN0CgkJdmFyIG92ZXJyaWRlID0gIWVueW8uZXhpc3RzKHByb3BzLl9taXhpbk92ZXJyaWRlKT8gdHJ1ZTogcHJvcHMuX21peGluT3ZlcnJpZGU7CgkJLy8gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIGFwcGxpZWQKCQl2YXIga2V5OwoJCS8vIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhcHBsaWVkCgkJdmFyIHByb3A7CgkJLy8gcGxhY2Vob2xkZXIgZm9yIGZ1bmN0aW9ucyBpZiB0aGV5IGFscmVhZHkgZXhpc3QKCQkvLyBvbiB0aGUgdGFyZ2V0IGJhc2UKCQl2YXIgZm47CgkJdmFyIHByZXY7CgkJLy8gdGhlIG5hbWUgb2YgdGhlIG1peGluIG9yIG5vdGhpbmcKCQluYW1lID0gbmFtZSB8fCAidW5uYW1lZCI7CgkJZm9yIChrZXkgaW4gcHJvcHMpIHsKCQkJaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAoIl9jcmVhdGUiID09PSBrZXkgfHwgIl9kZXN0cm95IiA9PT0ga2V5KSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJcHJvcCA9IHByb3BzW2tleV07CgoJCQlpZiAoIl9taXhpbkhhbmRsZXJzIiA9PT0ga2V5KSB7CgkJCQlpZiAoYmFzZS5fbWl4aW5IYW5kbGVycykgewoJCQkJCS8vIGRlbGliZXJhdGUgcmV1c2Ugb2YgdGhlIGtleSB2YXJpYWJsZSBmcm9tIHRoZSBvdXRlcgoJCQkJCS8vIGZvciBsb29wIHNpbmNlIHdlIHdpbGwgYmUgZXhpdGluZyB0aGlzIHBhc3Mgd2hlbiB3ZSdyZQoJCQkJCS8vIGRvbmUgaGVyZQoJCQkJCWZvciAoa2V5IGluIHByb3ApIHsKCQkJCQkJaWYgKGJhc2UuX21peGluSGFuZGxlcnNba2V5XSBpbnN0YW5jZW9mIEFycmF5KSB7CgkJCQkJCQliYXNlLl9taXhpbkhhbmRsZXJzLnB1c2gocHJvcFtrZXldKTsKCQkJCQkJfSBlbHNlIGlmIChlbnlvLmV4aXN0cyhiYXNlLl9taXhpbkhhbmRsZXJzW2tleV0pKSB7CgkJCQkJCQlwcmV2ID0gYmFzZS5fbWl4aW5IYW5kbGVyc1trZXldOwoJCQkJCQkJYmFzZS5fbWl4aW5IYW5kbGVyc1trZXldID0gW3ByZXYsIHByb3Bba2V5XV07CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQliYXNlLl9taXhpbkhhbmRsZXJzW2tleV0gPSBwcm9wW2tleV07CgkJCQkJCX0KCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCWJhc2UuX21peGluSGFuZGxlcnMgPSBlbnlvLmNsb25lKHByb3ApOwoJCQkJfQoJCQkJY29udGludWU7CgkJCX0KCQkJaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBwcm9wICYmICFwcm9wLm5vbSkgewoJCQkJcHJvcC5ub20gPSBuYW1lICsgIi4iICsga2V5ICsgIigpIjsKCQkJfQoKCQkJLy8gaWYgdGhlIGJhc2V0eXBlIGhhcyB0aGUgcHJvcGVydHkgYW5kIGl0IGlzIGEgZnVuY3Rpb24sIHdlCgkJCS8vIGluc2VydCB0aGUgcHJvcHMgZnVuY3Rpb24gYnV0IGFsbG93IGl0IHRvIGNoYWluIHRoZSBvcmlnaW5hbAoJCQkvLyBpZiBpdCB3YW50cwoJCQlpZiAoYmFzZVtrZXldICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBiYXNlW2tleV0gJiYgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHByb3AgJiYgb3ZlcnJpZGUpIHsKCQkJCWZuID0gYmFzZVtrZXldOwoJCQkJcHJvcCA9IGJhc2Vba2V5XSA9IHByb3h5SW5oZXJpdGVkTWV0aG9kKHByb3AsIGZuLCBuYW1lICsgIi4iICsga2V5ICsgIigpIik7CgkJCX0gZWxzZSBpZiAoISF+ZW55by5pbmRleE9mKGtleSwgY29uY2F0KSkgewoJCQkJLy8gd2UgbmVlZCB0byBjb25jYXRlbmF0ZSBpbnN0ZWFkIG9mIGJsb3dpbmcgYXdheSB0aGUgcHJvcGVydHkKCQkJCS8vIGlmIHRoZXkgYXJlIGJvdGggYXJyYXlzCgkJCQlpZiAoYmFzZVtrZXldIGluc3RhbmNlb2YgQXJyYXkgJiYgcHJvcHNba2V5XSBpbnN0YW5jZW9mIEFycmF5KSB7CgkJCQkJYmFzZVtrZXldID0gZW55by5tZXJnZShiYXNlW2tleV0sIHByb3BzW2tleV0pOwoJCQkJfSBlbHNlIGlmIChwcm9wc1trZXldIGluc3RhbmNlb2YgQXJyYXkpIHsKCQkJCQliYXNlW2tleV0gPSBlbnlvLmNsb25lKHByb3ApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJaWYgKG92ZXJyaWRlIHx8ICFlbnlvLmV4aXN0cyhiYXNlW2tleV0pKSB7CgkJCQkJYmFzZVtrZXldID0gcHJvcDsKCQkJCX0KCQkJfQoJCX0KCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJVXNlZCBpbnRlcm5hbGx5IGJ1dCBtYWRlIGFjY2Vzc2libGUgdG8gYXJiaXRyYXJpbHkgYXBwbHkgYSBtaXhpbgoJCXRvIGEgY2xhc3MgcHJvdG90eXBlLgoJKi8KCXZhciBhcHBseU1peGluID0gZW55by5hcHBseU1peGluID0gZnVuY3Rpb24gKG1peGluLCBiYXNlKSB7CgkJLy8gYXR0ZW1wdCB0byBkZXRlcm1pbmUgYSBuYW1lCgkJdmFyIG5hbWUgPSAic3RyaW5nIiA9PT0gdHlwZW9mIG1peGluPyBtaXhpbjogbWl4aW4ubmFtZSB8fCAidW5uYW1lZCI7CgoJCS8vIGRldGVybWluZSB0aGUgbWl4aW4gZnJvbSB3aGV0aGVyIGl0IGlzIGEgc3RyaW5nIG9yIGEgaGFzaAoJCS8vIG9mIHByb3BlcnRpZXMga25vd24gYXMgYSBtaXhpbgoJCW1peGluID0gbmFtZSAhPT0gInVubmFtZWQiPyBzdG9yZVtuYW1lXTogbWl4aW47CgoJCS8vIGlmIHRoZXJlIGlzbid0IGEgbWl4aW4gd2UgY2FuJ3QgZG8gYW55dGhpbmcKCQlpZiAoIW1peGluIHx8ICJvYmplY3QiICE9PSB0eXBlb2YgbWl4aW4pIHsKCQkJcmV0dXJuIGVueW8ud2FybigiZW55by5hcHBseU1peGluOiBjb3VsZCBub3QgZmluZCB0aGUgcmVxdWVzdGVkIG1peGluLCAnIiArCgkJCQluYW1lICsgIiciKTsKCQl9CgoJCWlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgYmFzZSkgewoJCQlfYWRkTWl4aW4oYmFzZS5wcm90b3R5cGUsIG1peGluLCBuYW1lKTsKCQl9IGVsc2UgewoJCQlfYWRkTWl4aW4oYmFzZSwgbWl4aW4sIG5hbWUpOwoJCQlfcG9zdENvbnN0cnVjdG9yLmNhbGwoYmFzZSk7CgkJfQoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX2NyZWF0ZU1peGlucyA9IGZ1bmN0aW9uICgpIHsKCQl2YXIgJG1peGlucyA9IHRoaXMuX21peGluQ3JlYXRlOwoJCXZhciBsZW4gPSAkbWl4aW5zLmxlbmd0aDsKCQl2YXIgaWR4ID0gMDsKCQl2YXIgZm47CgkJZm9yICg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJZm4gPSAkbWl4aW5zW2lkeF07CgkJCWZuLmNhbGwodGhpcyk7CgkJfQoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX2Rlc3Ryb3lNaXhpbnMgPSBmdW5jdGlvbiAoKSB7CgkJaWYgKCF0aGlzLl9taXhpbnNEZXN0cm95ZWQpIHsKCQkJdmFyICRtaXhpbnMgPSB0aGlzLl9taXhpbl9kZXN0cm95OwoJCQl2YXIgbGVuID0gJG1peGlucy5sZW5ndGg7CgkJCXZhciBpZHggPSAwOwoJCQl2YXIgZm47CgkJCWZvciAoOyBpZHggPCBsZW47ICsraWR4KSB7CgkJCQlmbiA9ICRtaXhpbnNbaWR4XTsKCQkJCWZuLmNhbGwodGhpcyk7CgkJCX0KCQl9CgkJdGhpcy5fbWl4aW5zRGVzdHJveWVkID0gdHJ1ZTsKCX07CgoJLy8qQHByb3RlY3RlZAoJdmFyIF9wb3N0Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7CgkJaWYgKCF0aGlzLl9zdXBwb3J0c01peGlucykgewoJCQlyZXR1cm47CgkJfQoJCS8vIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBhbGwgb2YgdGhlIG1peGlucyByZWdpc3RlcmVkIHRvIHRoaXMKCQkvLyBraW5kCgkJX2NyZWF0ZU1peGlucy5jYWxsKHRoaXMpOwoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX2Rpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgZXZlbnQsIHNlbmRlcikgewoJCXZhciAkaGFuZGxlcnMgPSB0aGlzLl9taXhpbkhhbmRsZXJzIHx8IHt9OwoJCXZhciBpZHg7CgkJdmFyIGxlbjsKCQl2YXIgcmV0ID0gZmFsc2U7CgkJaWYgKCRoYW5kbGVyc1tuYW1lXSkgewoJCQlpZiAoJGhhbmRsZXJzW25hbWVdIGluc3RhbmNlb2YgQXJyYXkpIHsKCQkJCWZvciAoaWR4ID0gMCwgbGVuID0gJGhhbmRsZXJzW25hbWVdLmxlbmd0aDsgaWR4IDwgbGVuOyArK2lkeCkgewoJCQkJCXJldCA9IHJldCB8fCB0aGlzLmRpc3BhdGNoKCRoYW5kbGVyc1tuYW1lXVtpZHhdLCBldmVudCwgc2VuZGVyKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXJldCA9IHRoaXMuZGlzcGF0Y2goJGhhbmRsZXJzW25hbWVdLCBldmVudCwgc2VuZGVyKTsKCQkJfQoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKCgkvLypAcHJvdGVjdGVkCgkvKioKCQlXZSBhZGQgYSBraW5kIGZlYXR1cmUgdG8gc25hZyBhbmQgaGFuZGxlIGFsbCBtaXhpbnMgZm9yIGEgZ2l2ZW4KCQlraW5kLgoJKi8KCWVueW8ua2luZC5mZWF0dXJlcy5wdXNoKGZ1bmN0aW9uIChjdG9yLCBwcm9wcykgewoJCS8vIHNlZSBpZiB0aGVyZSBpcyBhIG1peGlucyBhcnJheSBiZWluZyBhcHBsaWVkIHRvIHRoZSBraW5kCgkJdmFyIHByb3RvID0gY3Rvci5wcm90b3R5cGU7CgkJdmFyICRtaXhpbnMgPSBwcm90by5taXhpbnMgfHwgW107CgkJdmFyIGxlbiA9ICRtaXhpbnMubGVuZ3RoOwoJCXZhciBpZHggPSAwOwoJCS8vIHJlbW92ZSB0aGUgYXJyYXkgaWYgaXQgZXhpc3RlZAoJCWRlbGV0ZSBwcm90by5taXhpbnM7CgkJZm9yICg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJYXBwbHlNaXhpbigkbWl4aW5zW2lkeF0sIGN0b3IpOwoJCX0KCQkvLyBpbmplY3Qgb3VyIHNwZWNpYWwgZGVzdHJ1Y3RvciB0aGF0IHdpbGwgZW5hYmxlIHRoZQoJCS8vIG90aGVyIG1peGlucyB0byBleGVjdXRlIHRoZWlyIG93biB3aGVuIHRoZSB0aW1lIGlzIHJpZ2h0CgkJaWYgKCFwcm90by5fbm9BcHBseU1peGluRGVzdHJveSkgewoJCQlfYXBwbHlQcm9wZXJ0aWVzKHByb3RvLCB7ZGVzdHJveTogZnVuY3Rpb24gKCkgewoJCQkJaWYgKHRoaXMuX3N1cHBvcnRzTWl4aW5zKSB7CgkJCQkJX2Rlc3Ryb3lNaXhpbnMuY2FsbCh0aGlzKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCQl9fSwgImVueW8uTWl4aW5TdXBwb3J0Iik7CgkJfQoJfSk7CgoJLy8qQHByb3RlY3RlZAoJZW55by5raW5kLnBvc3RDb25zdHJ1Y3RvcnMucHVzaChfcG9zdENvbnN0cnVjdG9yKTsKCgkvLypAcHVibGljCgkvKioKCQlUaGUgX2VueW8uTWl4aW5TdXBwb3J0XyBtaXhpbiBhbGxvd3MgaW5zdGFuY2VzIG9mIF9lbnlvLk9iamVjdF8KCQlhbmQgaXRzIHN1YmtpbmRzIHRvIGhhdmUgcHJvcGVyIG1peGluIHN1cHBvcnQgYXBwbGllZCBhdCBraW5kCgkJaW5pdGlhbGl6YXRpb24gdGltZSwgYXMgd2VsbCBhcyBhcHByb3ByaWF0ZSBjbGVhbnVwIHdoZW4gdGhlCgkJb2JqZWN0IGlzIGRlc3Ryb3llZC4KCSovCgljcmVhdGVNaXhpbih7CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQluYW1lOiAiZW55by5NaXhpblN1cHBvcnQiLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgUFJPUEVSVElFUwoKCQkvLypAcHJvdGVjdGVkCgkJX3N1cHBvcnRzTWl4aW5zOiB0cnVlLAoJCQoJCS8vKkBwcm90ZWN0ZWQKCQlfbWl4aW5zRGVzdHJveWVkOiBmYWxzZSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFVCTElDIE1FVEhPRFMKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlBcHBseSBhIG1peGluIHRvIGFuIGluc3RhbmNlIG9mIGFuIGVueW8ua2luZCB0aGF0IHN1cHBvcnRzCgkJCW1peGlucy4gVGhpcyBhcHBsaWVkIG1peGluIHdpbGwgT05MWSBiZSBhcHBsaWVkIHRvIHRoaXMgaW5zdGFuY2UKCQkJYW5kIG5vdCB0byBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIGtpbmQuIFRoZSBsb25lIHBhcmFtZXRlciBpcwoJCQl0aGUgbmFtZSBvZiBhbiBhdmFpbGFibGUgbWl4aW4gb3IgYSByZWZlcmVuY2UgdG8gYSBtaXhpbiB0eXBlLgoJCQlSZXR1cm5zIHRoZSBjYWxsZWUuCgkJKi8KCQlhcHBseU1peGluOiBmdW5jdGlvbiAobWl4aW4pIHsKCQkJZW55by5hcHBseU1peGluKG1peGluLCB0aGlzLCB0cnVlKTsKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlSZXR1cm5zIGEgYm9vbGVhbiB0cnVlIHwgZmFsc2Ugd2hldGhlciBvciBub3QgdGhpcyBpbnN0YW5jZQoJCQlhbHJlYWR5IGhhcyB0aGUgcmVxdWVzdGVkIF9taXhpbl8gYXBwbGllZCB0byBpdC4gVGhlIHBhcmFtZXRlcgoJCQltdXN0IGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGUgbWl4aW4gaW4gcXVlc3Rpb24uCgkJKi8KCQloYXNNaXhpbjogZnVuY3Rpb24gKG1peGluKSB7CgkJCXJldHVybiAhIX5lbnlvLmluZGV4T2YobWl4aW4sIHRoaXMuX2FwcGxpZWRNaXhpbnMpOwoJCX0KCgl9KTsKCgkvLypAcHVibGljCgkvKioKCQlBIHNwZWNpYWwgbWl4aW4gZm9yIHN1cHBvcnRpbmcgX2VueW8uQ29tcG9uZW50XyBldmVudHMuCgkqLwoJZW55by5jcmVhdGVNaXhpbih7CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBNRVRIT0RTCgoJCS8vKkBwdWJsaWMKCQluYW1lOiAiZW55by5NaXhpbkNvbXBvbmVudFN1cHBvcnQiLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUklWQVRFIE1FVEhPRFMKCgkJLy8qQHByb3RlY3RlZAoJCWRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICgpIHsKCQkJaWYgKF9kaXNwYXRjaEV2ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCXJldHVybiB0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCX0KCgl9KTsKCn0oZW55bykpOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/mixins/MultipleDispatchSupport.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qQHB1YmxpYwovKioKCUFsbG93cyBhIHNpbmdsZSBvYmplY3QgdG8gZGlzcGF0Y2ggaXRzIGV2ZW50cyB0byBtdWx0aXBsZSByZWdpc3RlcmVkCglsaXN0ZW5lcnMuIE5vdGUgdGhhdCBldmVudHMgZ2VuZXJhdGVkIGJ5IHRoZSBvYmplY3Qgd2lsbCBiZSBkaXNwYXRjaGVkCgl0byBhbGwgbGlzdGVuZXJzLCBidXQgZXZlbnRzIGJ1YmJsZWQgb3IgZGlzcGF0Y2hlZCB0byB0aGUgb2JqZWN0IHdpbGwKCW9ubHkgYmUgcHJvcGFnYXRlZCBpZiB0aGUgb2JqZWN0IGhhcyBhbiBfb3duZXJfLiBXaGlsZSB0aGUgX293bmVyXwoJcHJvcGVydHkgbWF5IGJlIHNldCBhdCBhbnkgdGltZSwgaWYgYSB2aWV3IGluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlCglvZiB0aGUga2luZCwgaXRzIF9vd25lcl8gd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHNldC4KKi8KZW55by5jcmVhdGVNaXhpbih7CgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBQVUJMSUMgUFJPUEVSVElFUwoKCS8vKkBwdWJsaWMKCW5hbWU6ICJlbnlvLk11bHRpcGxlRGlzcGF0Y2hTdXBwb3J0IiwKCgkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCS8vIFBST1RFQ1RFRCBQUk9QRVJUSUVTCgoJLy8qQHByb3RlY3RlZAoJX3N1cHBvcnRzTXVsdGlwbGVEaXNwYXRjaDogdHJ1ZSwKCgkvLypAcHJvdGVjdGVkCglfZGlzcGF0Y2hUYXJnZXRzOiBudWxsLAoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCUEgYm9vbGVhbiBmbGFnIHVzZWQgaW50ZXJuYWxseSB0byBjb21tdW5pY2F0ZSBob3cgdG8KCQloYW5kbGUgcmVxdWVzdHMgdG8gYnViYmxlIGV2ZW50cwoJKi8KCV9kZWZhdWx0RGlzcGF0Y2g6IGZhbHNlLAoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCUNvbnRyb2xsZXJzIG92ZXJsb2FkIHRoZSBldmVudCBBUEkgYW5kIGhhbmRsZSBidWJibGluZyBkaWZmZXJlbnRseS4KCQlBbGwgY29udHJvbGxlcnMgc3VwcG9ydCBtdWx0aXBsZSBkaXNwYXRjaCBhbmQgYWxzbyBidWJibGluZyB0byBhIHNpbmdsZQoJCV9vd25lcl8gdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLgoJKi8KCV9kZWZhdWx0VGFyZ2V0OiBudWxsLAoKCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJLy8gQ09NUFVURUQgUFJPUEVSVElFUwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCU92ZXJsb2FkcyB0aGUgYnViYmxlIHRhcmdldC4KCSovCglidWJibGVUYXJnZXQ6IGVueW8uY29tcHV0ZWQoZnVuY3Rpb24gKCkgewoJCS8vIGlmIHdlIGhhdmUgYSB2YWxpZCBkaXNwYXRjaCB0YXJnZXQgYW5kIGRlZmF1bHQgZGlzcGF0Y2hpbmcgZW5hYmxlZCwKCQkvLyB3ZSBnbyBoZWFkIGFuZCByZXR1cm4gdGhhdCBvYmplY3Q7IG90aGVyd2lzZSwgbm90aGluZywgc28gaXQgd2lsbAoJCS8vIG5vdCBwcm9wYWdhdGUgYW4gZXZlbnQKCQlpZiAodGhpcy5fZGVmYXVsdFRhcmdldCAmJiB0aGlzLl9kZWZhdWx0RGlzcGF0Y2gpIHsKCQkJcmV0dXJuIHRoaXMuX2RlZmF1bHRUYXJnZXQ7CgkJfQoJfSwgIl9kZWZhdWx0VGFyZ2V0IiwgIl9kZWZhdWx0RGlzcGF0Y2giLCB7Y2FjaGVkOiB0cnVlfSksCgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBQVUJMSUMgTUVUSE9EUwoKCS8vKkBwdWJsaWMKCS8qKgoJCVNldHMgYXMgZGlzcGF0Y2ggdGFyZ2V0IGFuIGluc3RhbmNlIG9mIF9lbnlvLkNvbXBvbmVudF8gb3IgYSBzdWJraW5kCgkJdGhhdCBzdXBwb3J0cyB0aGUgZXZlbnQgQVBJLgoJKi8KCWFkZERpc3BhdGNoVGFyZ2V0OiBmdW5jdGlvbiAodGFyZ2V0KSB7CgkJdmFyICRkaXN0ID0gdGhpcy5fZGlzcGF0Y2hUYXJnZXRzOwoJCS8vIGVuc3VyZSB0aGF0IHdlIGhhdmUgbm90IGFscmVhZHkgcmVnaXN0ZXJlZCB0aGUgdGFyZ2V0CgkJLy8gYW5kIHRoYXQgaXQgaXMgbm90IG91cnNlbHZlcyBvciBvdXIgb3duZXIgaWYgd2UgaGF2ZSBvbmUKCQlpZiAodGFyZ2V0ICYmIHRoaXMgIT09IHRhcmdldCAmJiAhfmVueW8uaW5kZXhPZih0YXJnZXQsICRkaXN0KQoJCQkmJiB0aGlzLm93bmVyICE9PSB0YXJnZXQpIHsKCQkJLy8gc2hvdWxkIGJlIHNhZmUgdG8gYWRkIHRoZSBsaXN0ZW5lcgoJCQkkZGlzdC5wdXNoKHRhcmdldCk7CgkJfQoJfSwKCgkvLypAcHVibGljCgkvKioKCQlBY2NlcHRzIGFuIGluc3RhbmNlIG9mIGEgcmVnaXN0ZXJlZCBsaXN0ZW5lciBvbiB0aGlzIG9iamVjdCBhcyBhCgkJcGFyYW1ldGVyOyBpZiB0aGUgcGFzc2VkLWluIGxpc3RlbmVyIGlzIHByZXNlbnQgdGhlIGFjdGl2ZSBkaXNwYXRjaAoJCXRhcmdldHMsIGl0IGlzIHRoZW4gcmVtb3ZlZC4KCSovCglyZW1vdmVEaXNwYXRjaFRhcmdldDogZnVuY3Rpb24gKHRhcmdldCkgewoJCXZhciAkZGlzdCA9IHRoaXMuX2Rpc3BhdGNoVGFyZ2V0czsKCQl2YXIgaWR4ID0gZW55by5pbmRleE9mKHRhcmdldCwgJGRpc3QpOwoJCWlmICgtMSAhPT0gaWR4KSB7CgkJCSRkaXN0LnNwbGljZShpZHgsIDEpOwoJCX0KCX0sCgoJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkvLyBQUk9URUNURUQgTUVUSE9EUwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCVdoZW4gdGhlIF9vd25lcl8gY2hhbmdlcywgd2UgaGF2ZSB0byBjaGVjayBvdXIgc3RhdGUgdG8gbWFrZQoJCXN1cmUgd2UgYXJlIHN0aWxsIGFwcHJvcHJpYXRlbHkgc2V0LgoJKi8KCW93bmVyQ2hhbmdlZDogZnVuY3Rpb24gKCkgewoJCS8vIGxldCB0aGUgbm9ybWFsIGNoYWluIG9mIG93bmVyIGNoYW5nZXMgb2NjdXIKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCS8vIGlmIHdlIGhhdmUgYW4gb3duZXIgYW5kIGl0IGlzIGEgY29tcG9uZW50IHdlIHNldCBvdXIgZGVmYXVsdAoJCS8vIGRpc3BhdGNoIHByb3BlcnR5IHRvIHRydWUgdG8gYWxsb3cgZXZlbnRzIHRvIHByb3BhZ2F0ZSB0byB0aGlzCgkJLy8gb2JqZWN0CgkJaWYgKHRoaXMub3duZXIgJiYgdHJ1ZSA9PT0gKHRoaXMub3duZXIgaW5zdGFuY2VvZiBlbnlvLkNvbXBvbmVudCkpIHsKCQkJdGhpcy5zZXQoIl9kZWZhdWx0VGFyZ2V0IiwgdGhpcy5vd25lcik7CgkJCXRoaXMuc2V0KCJfZGVmYXVsdERpc3BhdGNoIiwgdHJ1ZSk7CgkJfSBlbHNlIHsKCQkJLy8gb3RoZXJ3aXNlIHdlIGVpdGhlciBkb24ndCBoYXZlIGFuIG93bmVyIG9yIHRoZXkgY2Fubm90CgkJCS8vIGFjY2VwdCBldmVudHMgc28gd2UgcmVtb3ZlIG91ciBidWJibGUgdGFyZ2V0CgkJCXRoaXMuc2V0KCJfZGVmYXVsdFRhcmdldCIsIG51bGwpOwoJCX0KCX0sCgoJLy8qQHByb3RlY3RlZAoJZGlzcGF0Y2hGcm9tOiBmdW5jdGlvbiAoc2VuZGVyLCBldmVudCkgewoJCWlmIChldmVudC5kaXNwYXRjaGVkQnlDb250cm9sbGVyKSB7CgkJCWlmIChldmVudC5kaXNwYXRjaENvbnRyb2xsZXIgPT09IHRoaXMpIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfSBlbHNlIGlmIChzZW5kZXIgPT09IHRoaXMpIHsKCQkJZXZlbnQuZGlzcGF0Y2hlZEJ5Q29udHJvbGxlciA9IHRydWU7CgkJCWV2ZW50LmRpc3BhdGNoQ29udHJvbGxlciA9IHRoaXM7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0sCgoJLy8qQHByb3RlY3RlZAoJYnViYmxlVXA6IGZ1bmN0aW9uIChuYW1lLCBldmVudCwgc2VuZGVyKSB7CgkJdmFyIHRhcmdldHM7CgoJCS8vIFRPRE86IGZvciBub3csIHRoaXMgaXMgc29sdmluZyBhIHByb2JsZW0gdGhhdCBpcyBub3Qgb2J2aW91cwoJCS8vIHdoZXRoZXIgb3Igbm90IHRoaXMgY2hhbmdlIHdpbGwgbWFrZSBhIGRpZmZlcmVuY2UgZm9yCgkJLy8gc29sZWx5IG93bmVkIGNvbnRyb2xsZXJzIHRoaXMgY2FuIHBvdGVudGlhbGx5IGNhdXNlIHRvcAoJCS8vIGxldmVsIGFwcGxpY2F0aW9uLWluc3RhbmNlcyB0byByZWNlaXZlIHRoZSBzYW1lIGJ1YmJsZWQgZXZlbnQKCQkvLyB0d2ljZSBpZiBpdCBpcyBub3QgZXhwbGljaXRseSBoYW5kbGVkIGFuZCBoYXMgYSB0cnV0aHkgdmFsdWUKCQkvLyByZXR1cm5lZCBzb21ld2hlcmUgdG8gc3RvcCBwcm9wYWdhdGlvbgoKCQlpZiAodGhpcy5fZGVmYXVsdERpc3BhdGNoKSB7CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJfQoKCQl0YXJnZXRzID0gdGhpcy5fZGlzcGF0Y2hUYXJnZXRzOwoJCWVueW8uZm9yRWFjaChlbnlvLmNsb25lKHRhcmdldHMpLCBmdW5jdGlvbiAodGFyZ2V0KSB7CgkJCWlmICh0YXJnZXQpIHsKCQkJCWlmICh0YXJnZXQuZGVzdHJveWVkKSB7CgkJCQkJdGhpcy5yZW1vdmVEaXNwYXRjaFRhcmdldCh0YXJnZXQpOwoJCQkJfSBlbHNlIHsKCQkJCQl0YXJnZXQuZGlzcGF0Y2hCdWJibGUobmFtZSwgZXZlbnQsIHNlbmRlcik7CgkJCQl9CgkJCX0KCQl9LCB0aGlzKTsKCX0sCgoJLy8qQHByb3RlY3RlZAoJZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2ZW50LCBzZW5kZXIpIHsKCQlpZiAodGhpcy5kaXNwYXRjaEZyb20oc2VuZGVyLCBldmVudCkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCgoJLy8qQHByb3RlY3RlZAoJYnViYmxlRGVsZWdhdGlvbjogZnVuY3Rpb24gKGRlbGVnYXRlLCBwcm9wLCBuYW1lLCBldmVudCwgc2VuZGVyKSB7CgkJaWYgKHRoaXMuX2RlZmF1bHREaXNwYXRjaCkgewoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCX0KCQl2YXIgdGFyZ2V0cyA9IHRoaXMuZ2V0KCJfZGlzcGF0Y2hUYXJnZXRzIik7CgkJZW55by5mb3JFYWNoKGVueW8uY2xvbmUodGFyZ2V0cyksIGZ1bmN0aW9uICh0YXJnZXQpIHsKCQkJaWYgKHRhcmdldCkgewoJCQkJaWYgKHRhcmdldC5kZXN0cm95ZWQpIHsKCQkJCQl0aGlzLnJlbW92ZURpc3BhdGNoVGFyZ2V0KHRhcmdldCk7CgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldC5kZWxlZ2F0ZUV2ZW50KGRlbGVnYXRlLCBwcm9wLCBuYW1lLCBldmVudCwgc2VuZGVyKTsKCQkJCX0KCQkJfQoJCX0pOwoJfSwKCgkvLypAcHJvdGVjdGVkCglfY29uc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsKCQl0aGlzLl9kaXNwYXRjaFRhcmdldHMgPSBbXTsKCQlyZXR1cm4gdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCgkKCS8vKkBwcm90ZWN0ZWQKCWRlc3Ryb3k6IGZ1bmN0aW9uICgpIHsKCQl0aGlzLl9kaXNwYXRjaFRhcmdldHMgPSBbXTsKCX0KCgkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCS8vIE9CU0VSVkVSUwoKfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/mixins/ObserverMethodSupport.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uICgpIHsKCgkvLypAcHVibGljCgkvKioKCQlBY2NlcHRzIGEgZnVuY3Rpb24gZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgc3RyaW5nIHBhcmFtZXRlcnMgdGhhdCBhcmUKCQl0YXJnZXRzIGZvciB0aGUgb2JzZXJ2ZXI7IHJldHVybnMgYSBtZXRob2Qgd2l0aCB0aGUgYXBwcm9wcmlhdGUKCQlwcm9wZXJ0aWVzIHRvIGFsbG93IHRoZSBzeXN0ZW0gdG8gbm90aWZ5IGl0IHdoZW4gdGhlIG5hbWVkIHByb3Blcml0ZXMKCQloYXZlIGJlZW4gbW9kaWZpZWQuCgkqLwoJZW55by5vYnNlcnZlciA9IGZ1bmN0aW9uIChmbiAvKiBhcmd1bWVudHMgKi8pIHsKCQl2YXIgZXZlbnRzID0gZW55by50b0FycmF5KGFyZ3VtZW50cykuc2xpY2UoMSk7CgkJaWYgKCFlbnlvLmV4aXN0cyhmbikgfHwgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGZuKSB7CgkJCS8vIHRoaXMgaXMgYSBuZWNlc3NhcnkgYXNzZXJ0CgkJCXRocm93ICJlbnlvLm9ic2VydmVyOiBpbnZhbGlkIG9ic2VydmVyLCBtdXN0IGhhdmUgYSBmdW5jdGlvbiI7CgkJfQoJCWZuLl9pc09ic2VydmVyID0gdHJ1ZTsKCQlmbi5ldmVudHMgPSAoZm4uZXZlbnRzPyBmbi5ldmVudHM6IFtdKS5jb25jYXQoZXZlbnRzKTsKCQlyZXR1cm4gZm47Cgl9OwoKCS8vKkBwdWJsaWMKCS8qKgoJCVJlZ2lzdGVycyBhbiBvYnNlcnZlciBmb3IgdGhlIHBhc3NlZC1pbiBwcm9wZXJ0eSwgcmV0dXJuaW5nIGEgcmVmZXJlbmNlCgkJdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gYmVpbmcgcmVnaXN0ZXJlZCwgc28gdGhhdCBpdCBjYW4gYmUgc3RvcmVkIChhbmQsCgkJbGF0ZXIsIHJlbW92ZWQpLiBJbiBhZGRpdGlvbiB0byB0aGUgcHJvcGVydHkgdGhhdCBzaG91bGQgdHJpZ2dlciB0aGUKCQlvYnNlcnZlci9oYW5kbGVyIHdoZW4gY2hhbmdlZCwgdGhpcyBtZXRob2QgYWNjZXB0cyBhbiBvcHRpb25hbCBjb250ZXh0LAoJCXVuZGVyIHdoaWNoIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0cmlnZ2VyZWQuCgoJCUFuIG9ic2VydmVyIG1heSBiZSBhZGRlZCBmb3IgYW55IHByb3BlcnR5IG9uIHRoZSBwYXNzZWQtaW4gb2JqZWN0CgkJXyhiYXNlKV8sIGJ1dCBhbiBvYnNlcnZlciBtYXkgbm90IGJlIGFkZGVkIGZvciB0aGUgc2FtZSBldmVudCBtb3JlCgkJdGhhbiBvbmNlLgoJKi8KCXZhciBhZGRPYnNlcnZlciA9IGZ1bmN0aW9uIChiYXNlLCBwcm9wZXJ0eSwgZm4sIGNvbnRleHQpIHsKCQl2YXIgb2JzZXJ2ZXJzID0gYmFzZS5fb2JzZXJ2ZXJzIHx8IChiYXNlLl9vYnNlcnZlcnMgPSB7fSk7CgkJdmFyIGhhbmRsZXJzOwoJCS8vIHdoZW4gdGhlcmUgaXMgbmFtZSBjb2xsaXNpb24gaW4gYW4gb2JzZXJ2ZXIgd2hlcmUgb25lIGNsYXNzCgkJLy8gc3ViY2xhc3NlcyBhbm90aGVyIHdoaWxlIG92ZXJsb2FkZWQgYW4gb2JzZXJ2ZXIgbWV0aG9kCgkJLy8gaXQgY2FuIGNhbGwgdGhpcy5pbmhlcml0ZWQgYXMgdXN1YWwgYnV0IHdlIG5lZWQgdG8gcmVtb3ZlIHRoZQoJCS8vIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBmcm9tIG9ic2VydmluZyB0aGUgbm90aWZpY2F0aW9ucwoJCS8vIHNvIGl0IHdvbid0IGJlIGhhbmRsZWQgdHdpY2UKCQlpZiAoZm4uX2luaGVyaXRlZCAmJiBmbi5faW5oZXJpdGVkLl9pc09ic2VydmVyKSB7CgkJCXJlbW92ZU9ic2VydmVyKGJhc2UsIHByb3BlcnR5LCBmbi5faW5oZXJpdGVkKTsKCQl9CgkJLy8gaWYgYSBjb250ZXh0IGlzIHByb3ZpZGVkIGZvciB0aGUgbGlzdGVuZXIsIHdlIGJpbmQgaXQKCQkvLyB0byB0aGF0IGNvbnRleHQgbm93CgkJZm4gPSBjb250ZXh0PyBlbnlvLmJpbmQoY29udGV4dCwgZm4pOiBmbjsKCQkvLyBpZiB0aGVyZSBhcmUgbm8gcmVnaXN0ZXJlZCBoYW5kbGVycyBmb3IgdGhpcyBldmVudAoJCS8vIGdvIGFoZWFkIGFuZCBjcmVhdGUgYW4gYXJyYXkgZm9yIHRoZW0KCQlpZiAoIWVueW8uZXhpc3RzKG9ic2VydmVyc1twcm9wZXJ0eV0pKSB7CgkJCWhhbmRsZXJzID0gb2JzZXJ2ZXJzW3Byb3BlcnR5XSA9IFtdOwoJCX0KCQllbHNlIHsKCQkJaGFuZGxlcnMgPSBvYnNlcnZlcnNbcHJvcGVydHldOwoJCX0KCQkvLyBvbmx5IGFkZCBpdCBpZiBpdCBpc24ndCBhbHJlYWR5IGluIHRoZSBhcnJheQoJCWlmICghfmVueW8uaW5kZXhPZihmbiwgaGFuZGxlcnMpKSB7CgkJCWhhbmRsZXJzLnB1c2goZm4pOwoJCX0KCQkvLyBhbGxvdyBjaGFpbmluZwoJCXJldHVybiBmbjsKCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJQXR0ZW1wdHMgdG8gcmVtb3ZlIHRoZSBnaXZlbiBsaXN0ZW5lci9vYnNlcnZlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LAoJCWlmIGl0IGV4aXN0cy4gSWYgbm8gZnVuY3Rpb24gaXMgc3VwcGxpZWQsIGFsbCBsaXN0ZW5lcnMgZm9yIHRoZSBnaXZlbgoJCXByb3BlcnR5IHdpbGwgYmUgcmVtb3ZlZC4KCgkJVHlwaWNhbGx5LCB0aGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCgkqLwoJdmFyIHJlbW92ZU9ic2VydmVyID0gZnVuY3Rpb24gKGJhc2UsIHByb3BlcnR5LCBmbikgewoJCXZhciBvYnNlcnZlcnMgPSBiYXNlLl9vYnNlcnZlcnM7CgkJdmFyIGlkeDsKCQl2YXIgaGFuZGxlcnM7CgkJaWYgKCEoaGFuZGxlcnMgPSBvYnNlcnZlcnNbcHJvcGVydHldKSkgewoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKGVueW8uZXhpc3RzKGZuKSAmJiAiZnVuY3Rpb24iID09PSB0eXBlb2YgZm4pIHsKCQkJaWR4ID0gZW55by5pbmRleE9mKGZuLCBoYW5kbGVycyk7CgkJCWlmICghIX5pZHgpIHsKCQkJCS8vIHJlbW92ZSBpdCBmcm9tIHRoZSBhcnJheQoJCQkJaGFuZGxlcnMuc3BsaWNlKGlkeCwgMSk7CgkJCX0KCQl9IGVsc2UgewoJCQkvLyB3ZSBuZWVkIHRvIHJlbW92ZSBBTEwgdGhlIG9ic2VydmVycyBvZiB0aGlzIHByb3BlcnR5CgkJCWRlbGV0ZSBvYnNlcnZlcnNbcHJvcGVydHldOwoJCX0KCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJlbW92ZSBhbGwgb2JzZXJ2ZXJzIG9uIGFsbCBwcm9wZXJ0aWVzLgoJCVJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QgZm9yIGNoYWluaW5nLgoKCQlUaGlzIHdpbGwgYWxtb3N0IG5ldmVyIG5lZWQgdG8gYmUgY2FsbGVkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4KCQl0aGUgX2Rlc3Ryb3lfIG1ldGhvZC4KCSovCgl2YXIgcmVtb3ZlQWxsT2JzZXJ2ZXJzID0gZnVuY3Rpb24gKGJhc2UpIHsKCQl2YXIgb2JzZXJ2ZXJzID0gYmFzZS5fb2JzZXJ2ZXJzOwoJCXZhciBoYW5kbGVyczsKCQl2YXIgb2JzZXJ2ZXI7CgkJdmFyIHByb3A7CgkJdmFyIGlkeDsKCQl2YXIgbGVuOwoJCWZvciAocHJvcCBpbiBvYnNlcnZlcnMpIHsKCQkJaWYgKCFvYnNlcnZlcnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWhhbmRsZXJzID0gb2JzZXJ2ZXJzW3Byb3BdOwoJCQkvLyBvcnBoYW4gdGhlIGFycmF5IHNvIGl0IHdpbGwgYmUgY2xlYW5lZCB1cCBieSB0aGUgR0MKCQkJb2JzZXJ2ZXJzW3Byb3BdID0gbnVsbDsKCQkJZm9yIChpZHggPSAwLCBsZW4gPSBoYW5kbGVycy5sZW5ndGg7IGlkeCA8IGxlbjsgKytpZHgpIHsKCQkJCW9ic2VydmVyID0gaGFuZGxlcnNbaWR4XTsKCQkJfQoJCX0KCQkvLyByZXNldCBvdXIgb2JzZXJ2ZXJzIGhhc2gKCQliYXNlLl9vYnNlcnZlcnMgPSB7fTsKCQliYXNlLl9ub3RpZmljYXRpb25RdWV1ZSA9IHt9OwoJCXJldHVybiBiYXNlOwoJfTsKCgkvLypAcHVibGljCgkvKioKCQlOb3RpZmllcyBhbnkgb2JzZXJ2ZXJzIGZvciBhIGdpdmVuIHByb3BlcnR5LiBBY2NlcHRzIHRoZSBwcmV2aW91cwoJCXZhbHVlIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBhcyBwYXJhbWV0ZXJzLiBMb29rcyBmb3IgYQoJCWJhY2t3YXJkcy1jb21wYXRpYmxlIGZ1bmN0aW9uIG9mIHRoZSBfcHJvcGVydHlDaGFuZ2VkXyBmb3JtIGFuZAoJCXdpbGwgY2FsbCB0aGF0IGZ1bmN0aW9uLCBpZiBpdCBleGlzdHMsIHdoaWxlIGFsc28gbm90aWZ5aW5nIG90aGVyCgkJb2JzZXJ2ZXJzLgoJKi8KCXZhciBub3RpZnlPYnNlcnZlcnMgPSBmdW5jdGlvbiAoYmFzZSwgcHJvcGVydHksIHByZXYsIHZhbHVlKSB7CgkJdmFyIG9ic2VydmVycyA9IGJhc2UuX29ic2VydmVycyB8fCB7fTsKCQl2YXIgaGFuZGxlcnMgPSAob2JzZXJ2ZXJzW3Byb3BlcnR5XSB8fCBbXSk7CgkJdmFyIGlkeCA9IDA7CgkJdmFyIGZuOwoJCXZhciBjaCA9IGVueW8udW5jYXAocHJvcGVydHkpICsgIkNoYW5nZWQiOwoJCWlmICgiKiIgIT09IHByb3BlcnR5KSB7CgkJCWhhbmRsZXJzID0gZW55by5tZXJnZShoYW5kbGVycywgb2JzZXJ2ZXJzWyIqIl0gfHwgW10pOwoJCX0KCQlpZiAoaGFuZGxlcnMpIHsKCQkJZm9yICg7IGlkeCA8IGhhbmRsZXJzLmxlbmd0aDsgKytpZHgpIHsKCQkJCWZuID0gaGFuZGxlcnNbaWR4XTsKCQkJCWlmICghZW55by5leGlzdHMoZm4pIHx8ICJmdW5jdGlvbiIgIT09IHR5cGVvZiBmbikgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJaWYgKGZhbHNlID09PSBiYXNlLl9hbGxvd05vdGlmaWNhdGlvbnMpIHsKCQkJCQliYXNlLmFkZE5vdGlmaWNhdGlvblRvUXVldWUocHJvcGVydHksIGZuLCBbcHJvcGVydHksIHByZXYsIHZhbHVlXSk7CgkJCQl9IGVsc2UgewoJCQkJCWZuLmNhbGwoYmFzZSwgcHJvcGVydHksIHByZXYsIHZhbHVlKTsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKGVueW8uZXhpc3RzKGJhc2VbY2hdKSAmJiAiZnVuY3Rpb24iID09PSB0eXBlb2YgYmFzZVtjaF0pIHsKCQkJaWYgKGZhbHNlID09PSBiYXNlLl9hbGxvd05vdGlmaWNhdGlvbnMpIHsKCQkJCWJhc2UuYWRkTm90aWZpY2F0aW9uVG9RdWV1ZShwcm9wZXJ0eSwgYmFzZVtjaF0sIFtwcmV2LCB2YWx1ZV0pOwoJCQl9IGVsc2UgewoJCQkJYmFzZVtjaF0uY2FsbChiYXNlLCBwcmV2LCB2YWx1ZSk7CgkJCX0KCQl9CgkJcmV0dXJuIGJhc2U7Cgl9OwoKCS8vKkBwcm90ZWN0ZWQKCS8qKgoJCVVzZWQgaW50ZXJuYWxseSB3aGVuIGEgbm90aWZpY2F0aW9uIGlzIHF1ZXVlZC4KCSovCgl2YXIgYWRkTm90aWZpY2F0aW9uVG9RdWV1ZSA9IGZ1bmN0aW9uIChiYXNlLCBwcm9wZXJ0eSwgZm4sIHBhcmFtcykgewoJCXZhciBxdWV1ZSA9IGJhc2UuX25vdGlmaWNhdGlvblF1ZXVlIHx8IChiYXNlLl9ub3RpZmljYXRpb25RdWV1ZSA9IHt9KTsKCQl2YXIgaGFuZGxlcnMgPSBxdWV1ZVtwcm9wZXJ0eV07CgkJcGFyYW1zID0gcGFyYW1zIHx8IFtdOwoJCWlmIChmYWxzZSA9PT0gYmFzZS5fYWxsb3dOb3RpZmljYXRpb25RdWV1ZSkgewoJCQlyZXR1cm47CgkJfQoJCWlmICghZW55by5leGlzdHMoaGFuZGxlcnMpKSB7CgkJCS8vIGNyZWF0ZSBhbiBlbnRyeSBmb3IgYmFzZSBwcm9wZXJ0eSBub3RlIHRoYXQgdGhlIHF1ZXVlIGZvcgoJCQkvLyBldmVyeSBwcm9wZXJ0eSB1c2VzIHRoZSBmaXJzdCBhcnJheSBpbmRleCBhcyB0aGUgcGFyYW1ldGVycwoJCQlxdWV1ZVtwcm9wZXJ0eV0gPSBbcGFyYW1zLCBmbl07CgkJfSBlbHNlIHsKCQkJLy8gdXBkYXRlIHRoZSBwcm9wZXJ0aWVzIGZvciBiYXNlIGVudHJ5IHNvIGlmIHRoZSB2YWx1ZSBoYXMKCQkJLy8gYmVlbiB1cGRhdGVkIGJlZm9yZSB0aGUgcXVldWUgaXMgZmx1c2hlZCBpdCB1c2VzIHRoZSBtb3N0CgkJCS8vIHJlY2VudCB2YWx1ZXMKCQkJLy8gVE9ETzogcmVwbGFjZSBtZSB3aXRoIHNvbWV0aGluZyB0aGF0IHdpbGwgYWN0dWFsbHkgd29yayEKCQkJaWYgKGhhbmRsZXJzWzBdICE9PSBwYXJhbXMpIHsKCQkJCWhhbmRsZXJzLnNwbGljZSgwLCAxLCBwYXJhbXMpOwoJCQl9CgkJCWlmICghfmVueW8uaW5kZXhPZihmbiwgaGFuZGxlcnMpKSB7CgkJCQloYW5kbGVycy5wdXNoKGZuKTsKCQkJfQoJCX0KCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJUHJldmVudHMgYWxsIG5vdGlmaWNhdGlvbnMgb24gdGhpcyBvYmplY3QgZnJvbSBmaXJpbmcuIERvZXMgbm90CgkJY2xlYXIgb3IgZmx1c2ggdGhlIHF1ZXVlLiBBbnkgbmV3IG5vdGlmaWNhdGlvbnMgZmlyZWQgd2hpbGUKCQlub3RpZmljYXRpb25zIGFyZSBkaXNhYmxlZCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZSwgd2hpY2ggbWF5IGJlCgkJYXJiaXRyYXJpbHkgZmx1c2hlZCBvciBjbGVhcmVkIHdoZW4gcmVhZHkuIFRvIGRpc2FibGUgdGhlIHF1ZXVlLCBwYXNzCgkJYSBib29sZWFuIHRydWUgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gTm90ZSB0aGF0IGRpc2FibGluZyB0aGUgcXVldWUKCQl3aWxsIGltbWVkaWF0ZWx5IGNsZWFyIChidXQgbm90IGZsdXNoKSB0aGUgcXVldWUuCgoJCUFsc28gaW5jcmVtZW50cyBhbiBpbnRlcm5hbCBjb3VudGVyIHRoYXQgcmVxdWlyZXMgdGhlCgkJX3N0YXJ0Tm90aWZpY2F0aW9uc18gbWV0aG9kIHRvIGJlIGNhbGxlZCBhbiBlcXVhbCBudW1iZXIgb2YgdGltZXMKCQliZWZvcmUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGVuYWJsZWQgYWdhaW4uIFRoZSBxdWV1ZSBjYW5ub3QgYmUgZmx1c2hlZAoJCXVudGlsIHRoZSBjb3VudGVyIHJlYWNoZXMgMC4KCSovCgl2YXIgc3RvcE5vdGlmaWNhdGlvbnMgPSBmdW5jdGlvbiAoYmFzZSwgZGlzYWJsZVF1ZXVlKSB7CgkJYmFzZS5fYWxsb3dOb3RpZmljYXRpb25zID0gZmFsc2U7CgkJYmFzZS5fc3RvcENvdW50ICs9IDE7CgkJaWYgKHRydWUgPT09IGRpc2FibGVRdWV1ZSkgewoJCQliYXNlLmRpc2FibGVOb3RpZmljYXRpb25RdWV1ZSgpOwoJCX0KCX07CgoJLy8qQHB1YmxpYwoJLyoqCgkJRW5hYmxlcyBub3RpZmljYXRpb25zIGZvciB0aGlzIG9iamVjdCBhbmQgaW1tZWRpYXRlbHkgZmx1c2hlcyB0aGUKCQlub3RpZmljYXRpb24gcXVldWUgaWYgdGhlIGludGVybmFsIGNvdW50ZXIgaXMgMC4gSGFzIG5vIGVmZmVjdCBpZgoJCW5vdGlmaWNhdGlvbnMgYXJlIGFscmVhZHkgZW5hYmxlZDsgb3RoZXJ3aXNlLCBkZWNyZW1lbnRzIHRoZQoJCWludGVybmFsIGNvdW50ZXIuIElmIHRoZSBjb3VudGVyIHJlYWNoZXMgMCwgd2lsbCBhbGxvdyBub3RpZmljYXRpb25zCgkJYW5kIGF0dGVtcHQgdG8gZmx1c2ggdGhlIHF1ZXVlIChpZiB0aGVyZSBpcyBvbmUgYW5kIGl0IGlzIGVuYWJsZWQpLgoKCQlUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIHRpbWUgdGhlIF9zdG9wTm90aWZpY2F0aW9uc18KCQltZXRob2Qgd2FzIGNhbGxlZC4gUGFzc2luZyBhIGJvb2xlYW4gdHJ1ZSBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlcgoJCXdpbGwgcmVlbmFibGUgdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZSBpZiBpdCB3YXMgZGlzYWJsZWQuCgkqLwoJdmFyIHN0YXJ0Tm90aWZpY2F0aW9ucyA9IGZ1bmN0aW9uIChiYXNlLCBlbmFibGVRdWV1ZSkgewoJCWlmICgwICE9PSBiYXNlLl9zdG9wQ291bnQpIHsKCQkJLS1iYXNlLl9zdG9wQ291bnQ7CgkJfQoJCWlmICgwID09PSBiYXNlLl9zdG9wQ291bnQpIHsKCQkJYmFzZS5fYWxsb3dOb3RpZmljYXRpb25zID0gdHJ1ZTsKCQkJYmFzZS5mbHVzaE5vdGlmaWNhdGlvbnMoKTsKCQl9CgkJaWYgKHRydWUgPT09IGVuYWJsZVF1ZXVlKSB7CgkJCWJhc2UuZW5hYmxlTm90aWZpY2F0aW9uUXVldWUoKTsKCQl9Cgl9OwoKCS8vKkBwdWJsaWMKCS8qKgoJCUVuYWJsZXMgdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZS4gSGFzIG5vIGVmZmVjdCBpZiB0aGUgcXVldWUgaXMgYWxyZWFkeQoJCWVuYWJsZWQuIElmIG5vdGlmaWNhdGlvbnMgYXJlIGN1cnJlbnRseSBlbmFibGVkLCB0aGlzIG1ldGhvZCB3aWxsIGhhdmUKCQlubyBlZmZlY3QgdW50aWwgdGhleSBhcmUgZGlzYWJsZWQuCgkqLwoJdmFyIGVuYWJsZU5vdGlmaWNhdGlvblF1ZXVlID0gZnVuY3Rpb24gKGJhc2UpIHsKCQliYXNlLl9hbGxvd05vdGlmaWNhdGlvblF1ZXVlID0gdHJ1ZTsKCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJVXNlZCBpbnRlcm5hbGx5OyBmbHVzaGVzIGFueSBub3RpZmljYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHF1ZXVlZC4KCSovCgl2YXIgZmx1c2hOb3RpZmljYXRpb25zID0gZnVuY3Rpb24gKGJhc2UpIHsKCQlpZiAoMCAhPT0gYmFzZS5fc3RvcENvdW50KSB7CgkJCXJldHVybjsKCQl9CgkJdmFyIHF1ZXVlID0gYmFzZS5fbm90aWZpY2F0aW9uUXVldWU7CgkJdmFyIGZuOwoJCXZhciBwcm9wZXJ0eTsKCQl2YXIgaGFuZGxlcnM7CgkJdmFyIHBhcmFtczsKCQlpZiAoIWVueW8uZXhpc3RzKHF1ZXVlKSB8fCBmYWxzZSA9PT0gYmFzZS5fYWxsb3dOb3RpZmljYXRpb25RdWV1ZSkgewoJCQlyZXR1cm47CgkJfQoJCWZvciAocHJvcGVydHkgaW4gcXVldWUpIHsKCQkJaWYgKCFxdWV1ZS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWhhbmRsZXJzID0gcXVldWVbcHJvcGVydHldOwoJCQlwYXJhbXMgPSBoYW5kbGVycy5zaGlmdCgpOwoJCQkvLyBpZiBhbiBlbnRyeSBqdXN0IHNvIGhhcHBlbnMgdG8gYmUgYWRkZWQgaW1wcm9wZXJseSBieSBzb21lb25lCgkJCS8vIHRyeWluZyB0byBieXBhc3MgdGhlIGRlZmF1bHQgbWVhbnMgYnkgd2hpY2ggdG8gYWRkIHNvbWV0aGluZyB0bwoJCQkvLyB0aGUgcXVldWUuLi4KCQkJaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBwYXJhbXMpIHsKCQkJCWhhbmRsZXJzLnVuc2hpZnQocGFyYW1zKTsKCQkJCXBhcmFtcyA9IFtdOwoJCQl9CgkJCXdoaWxlIChoYW5kbGVycy5sZW5ndGgpIHsKCQkJCWZuID0gaGFuZGxlcnMuc2hpZnQoKTsKCQkJCWZuLmFwcGx5KGJhc2UsIHBhcmFtcyk7CgkJCX0KCQl9Cgl9OwoKCS8vKkBwdWJsaWMKCS8qKgoJCURpc2FibGVzIHRoZSBub3RpZmljYXRpb24gcXVldWUuIEhhcyBubyBlZmZlY3QgaWYgdGhlIHF1ZXVlIGlzIGFscmVhZHkKCQlkaXNhYmxlZCwgb3IgaWYgbm90aWZpY2F0aW9ucyBhcmUgY3VycmVudGx5IGVuYWJsZWQuIElmIG5vdGlmaWNhdGlvbnMKCQlhcmUgZGlzYWJsZWQsIGZ1dHVyZSBub3RpZmljYXRpb25zIHdpbGwgbm90IGJlIHF1ZXVlZCBhbmQgYW55IGl0ZW1zIGluCgkJdGhlIHF1ZXVlIHdpbGwgYmUgY2xlYXJlZCAobm90IGZsdXNoZWQpLgoJKi8KCXZhciBkaXNhYmxlTm90aWZpY2F0aW9uUXVldWUgPSBmdW5jdGlvbiAoYmFzZSkgewoJCWJhc2UuX2FsbG93Tm90aWZpY2F0aW9uUXVldWUgPSBmYWxzZTsKCQliYXNlLl9ub3RpZmljYXRpb25RdWV1ZSA9IHt9OwoJfTsKCgkvLypAcHJvdGVjdGVkCgl2YXIgX2ZpbmRPYnNlcnZlcnMgPSBmdW5jdGlvbiAocHJvdG8sIHByb3BzLCBraW5kKSB7CgkJcHJvdG8uX29ic2VydmVycyA9IGtpbmQ/IF9vYnNlcnZlckNsb25lKHByb3RvLl9vYnNlcnZlcnMgfHwge30pOiBwcm90by5fb2JzZXJ2ZXJzIHx8IHt9OwoJCXZhciBhZGRQcm9wT2JzZXJ2ZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CgkJCWFkZE9ic2VydmVyKHByb3RvLCBldmVudCwgZm4pOwoJCX07CgkJdmFyIHByb3A7CgkJdmFyIGlkeDsKCQlmb3IgKHByb3AgaW4gcHJvcHMpIHsKCQkJaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBwcm9wc1twcm9wXSAmJiB0cnVlID09PSBwcm9wc1twcm9wXS5faXNPYnNlcnZlcikgewoJCQkJZm9yIChpZHggPSAwOyBpZHggPCBwcm9wc1twcm9wXS5ldmVudHMubGVuZ3RoOyArK2lkeCkgewoJCQkJCS8vIGtleSBub3RlIGhlcmUsIHdlIHVzZSB0aGUgZnVuY3Rpb24gb24gdGhlIHByb3RvIGhlcmUKCQkJCQkvLyBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgYmVlbiBwcm94aWVkIGFscmVhZHkKCQkJCQlhZGRQcm9wT2JzZXJ2ZXIocHJvcHNbcHJvcF0uZXZlbnRzW2lkeF0sIHByb3RvW3Byb3BdKTsKCQkJCX0KCQkJfQoJCX0KCX07CgoJLy8qQHByb3RlY3RlZAoJLyoqCgkJU3RyaWN0bHkgZm9yIGludGVybmFsIHVzZTsgY29waWVzIG9ic2VydmVyIGhhc2hlcyBmb3Iga2luZHMuCgkqLwoJdmFyIF9vYnNlcnZlckNsb25lID0gZnVuY3Rpb24gKCRvYnNlcnZlZCwgcmVjdXJzaW5nKSB7CgkJdmFyIGFycmF5Q29weSA9IGZ1bmN0aW9uIChvcmlnKSB7CgkJCXJldHVybiBbXS5jb25jYXQob3JpZyk7CgkJfTsKCQl2YXIgY29weSA9IHt9OwoJCWZvciAodmFyIHByb3AgaW4gJG9ic2VydmVkKSB7CgkJCWNvcHlbcHJvcF0gPSBhcnJheUNvcHkoJG9ic2VydmVkW3Byb3BdKTsKCQl9CgkJcmV0dXJuIGNvcHk7Cgl9OwoKCWVueW8ua2luZC5mZWF0dXJlcy5wdXNoKGZ1bmN0aW9uIChjdG9yLCBwcm9wcykgewoJCV9maW5kT2JzZXJ2ZXJzKGN0b3IucHJvdG90eXBlLCBwcm9wcywgdHJ1ZSk7Cgl9KTsKCgkvLypAcHJvdGVjdGVkCgkvKioKCQlBZGRzIGEgc3BlY2lhbCBoYW5kbGVyIGZvciBtaXhpbnMgdG8gYmUgYXdhcmUgb2YgaG93IHRvIGhhbmRsZQoJCW9ic2VydmVyIHByb3BlcnRpZXMgb2YgYSBraW5kLgoJKi8KCWVueW8ubWl4aW5zLmZlYXR1cmVzLnB1c2goX2ZpbmRPYnNlcnZlcnMpOwoKCS8vKkBwcm90ZWN0ZWQKCWVueW8uY3JlYXRlTWl4aW4oewoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQluYW1lOiAiZW55by5PYnNlcnZlclN1cHBvcnQiLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgUFJPUEVSVElFUwoKCQkvLypAcHJvdGVjdGVkCgkJX3N1cHBvcnRzT2JzZXJ2ZXJzOiB0cnVlLAoKCQkvLypAcHJvdGVjdGVkCgkJX3N0b3BDb3VudDogMCwKCgkJLy8qQHByb3RlY3RlZAoJCV9ub3RpZmljYXRpb25RdWV1ZTogbnVsbCwKCgkJLy8qQHByb3RlY3RlZAoJCV9hbGxvd05vdGlmaWNhdGlvbnM6IHRydWUsCgoJCS8vKkBwcm90ZWN0ZWQKCQlfYWxsb3dOb3RpZmljYXRpb25RdWV1ZTogdHJ1ZSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFVCTElDIE1FVEhPRFMKCgkJLy8qQHB1YmxpYwoJCS8qKgoJCQlSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZm9yIHRoZSBwYXNzZWQtaW4gcHJvcGVydHksIHJldHVybmluZyBhCgkJCXJlZmVyZW5jZSB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBiZWluZyByZWdpc3RlcmVkLCBzbyB0aGF0IGl0CgkJCWNhbiBiZSBzdG9yZWQgKGFuZCwgbGF0ZXIsIHJlbW92ZWQpLiBJbiBhZGRpdGlvbiB0byB0aGUgcHJvcGVydHkKCQkJdGhhdCBzaG91bGQgdHJpZ2dlciB0aGUgb2JzZXJ2ZXIvaGFuZGxlciB3aGVuIGNoYW5nZWQsIHRoaXMKCQkJbWV0aG9kIGFjY2VwdHMgYW4gb3B0aW9uYWwgY29udGV4dCwgdW5kZXIgd2hpY2ggdGhlIGhhbmRsZXIKCQkJZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRyaWdnZXJlZC4KCgkJCUFuIG9ic2VydmVyIG1heSBiZSBhZGRlZCBmb3IgYW55IHByb3BlcnR5IG9mIHRoZSBvYmplY3QsIGJ1dCBhbgoJCQlvYnNlcnZlciBtYXkgbm90IGJlIGFkZGVkIGZvciB0aGUgc2FtZSBldmVudCBtb3JlIHRoYW4gb25jZS4KCQkqLwoJCWFkZE9ic2VydmVyOiBmdW5jdGlvbiAocHJvcGVydHksIGZuLCBjb250ZXh0KSB7CgkJCXJldHVybiBhZGRPYnNlcnZlcih0aGlzLCBwcm9wZXJ0eSwgZm4sIGNvbnRleHQpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJQXR0ZW1wdHMgdG8gcmVtb3ZlIHRoZSBnaXZlbiBsaXN0ZW5lci9vYnNlcnZlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LAoJCQlpZiBpdCBleGlzdHMuIElmIG5vIGZ1bmN0aW9uIGlzIHN1cHBsaWVkLCBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZ2l2ZW4KCQkJcHJvcGVydHkgd2lsbCBiZSByZW1vdmVkLgoKCQkJVHlwaWNhbGx5LCB0aGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCgkJKi8KCQlyZW1vdmVPYnNlcnZlcjogZnVuY3Rpb24gKHByb3BlcnR5LCBmbikgewoJCQlyZXR1cm4gcmVtb3ZlT2JzZXJ2ZXIodGhpcywgcHJvcGVydHksIGZuKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUNvbnZlbmllbmNlIG1ldGhvZCB0byByZW1vdmUgYWxsIG9ic2VydmVycyBvbiBhbGwgcHJvcGVydGllcy4KCQkJUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCBmb3IgY2hhaW5pbmcuCgoJCQlUaGlzIHdpbGwgYWxtb3N0IG5ldmVyIG5lZWQgdG8gYmUgY2FsbGVkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4KCQkJdGhlIF9kZXN0cm95XyBtZXRob2QuCgkJKi8KCQlyZW1vdmVBbGxPYnNlcnZlcnM6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIHJlbW92ZUFsbE9ic2VydmVycyh0aGlzKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCU5vdGlmaWVzIGFueSBvYnNlcnZlcnMgZm9yIGEgZ2l2ZW4gcHJvcGVydHkuIEFjY2VwdHMgdGhlIHByZXZpb3VzCgkJCXZhbHVlIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBhcyBwYXJhbWV0ZXJzLiBMb29rcyBmb3IgYQoJCQliYWNrd2FyZHMtY29tcGF0aWJsZSBmdW5jdGlvbiBvZiB0aGUgX3Byb3BlcnR5Q2hhbmdlZF8gZm9ybSBhbmQgd2lsbAoJCQljYWxsIHRoYXQsIGlmIGl0IGV4aXN0cywgd2hpbGUgYWxzbyBub3RpZnlpbmcgb3RoZXIgb2JzZXJ2ZXJzLgoJCSovCgkJbm90aWZ5T2JzZXJ2ZXJzOiBmdW5jdGlvbiAocHJvcGVydHksIHByZXYsIHZhbHVlKSB7CgkJCXJldHVybiBub3RpZnlPYnNlcnZlcnModGhpcywgcHJvcGVydHksIHByZXYsIHZhbHVlKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCVByZXZlbnRzIGFsbCBub3RpZmljYXRpb25zIG9uIHRoaXMgb2JqZWN0IGZyb20gZmlyaW5nLiBEb2VzIG5vdAoJCQljbGVhciBvciBmbHVzaCB0aGUgcXVldWUuIEFueSBuZXcgbm90aWZpY2F0aW9ucyBmaXJlZCB3aGlsZQoJCQlub3RpZmljYXRpb25zIGFyZSBkaXNhYmxlZCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZSwgd2hpY2ggbWF5IGJlCgkJCWFyYml0cmFyaWx5IGZsdXNoZWQgb3IgY2xlYXJlZCB3aGVuIHJlYWR5LiBUbyBkaXNhYmxlIHRoZSBxdWV1ZSwgcGFzcwoJCQlhIGJvb2xlYW4gdHJ1ZSBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiBOb3RlIHRoYXQgZGlzYWJsaW5nIHRoZSBxdWV1ZQoJCQl3aWxsIGltbWVkaWF0ZWx5IGNsZWFyIChidXQgbm90IGZsdXNoKSB0aGUgcXVldWUuCgoJCQlBbHNvIGluY3JlbWVudHMgYW4gaW50ZXJuYWwgY291bnRlciB0aGF0IHJlcXVpcmVzIHRoZQoJCQlfc3RhcnROb3RpZmljYXRpb25zXyBtZXRob2QgdG8gYmUgY2FsbGVkIGFuIGVxdWFsIG51bWJlciBvZiB0aW1lcwoJCQliZWZvcmUgbm90aWZpY2F0aW9ucyB3aWxsIGJlIGVuYWJsZWQgYWdhaW4uIFRoZSBxdWV1ZSBjYW5ub3QgYmUKCQkJZmx1c2hlZCB1bnRpbCB0aGUgY291bnRlciByZWFjaGVzIDAuCgkJKi8KCQlzdG9wTm90aWZpY2F0aW9uczogZnVuY3Rpb24gKGRpc2FibGVRdWV1ZSkgewoJCQlyZXR1cm4gc3RvcE5vdGlmaWNhdGlvbnModGhpcywgZGlzYWJsZVF1ZXVlKTsKCQl9LAoKCQkvLypAcHVibGljCgkJLyoqCgkJCUVuYWJsZXMgbm90aWZpY2F0aW9ucyBmb3IgdGhpcyBvYmplY3QgYW5kIGltbWVkaWF0ZWx5IGZsdXNoZXMgdGhlCgkJCW5vdGlmaWNhdGlvbiBxdWV1ZSBpZiB0aGUgaW50ZXJuYWwgY291bnRlciBpcyAwLiBIYXMgbm8gZWZmZWN0IGlmCgkJCW5vdGlmaWNhdGlvbnMgYXJlIGFscmVhZHkgZW5hYmxlZDsgb3RoZXJ3aXNlLCBkZWNyZW1lbnRzIHRoZQoJCQlpbnRlcm5hbCBjb3VudGVyLiBJZiB0aGUgY291bnRlciByZWFjaGVzIDAsIHdpbGwgYWxsb3cKCQkJbm90aWZpY2F0aW9ucyBhbmQgYXR0ZW1wdCB0byBmbHVzaCB0aGUgcXVldWUgKGlmIHRoZXJlIGlzIG9uZSBhbmQKCQkJaXQgaXMgZW5hYmxlZCkuCgoJCQlUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIHRpbWUgdGhlIF9zdG9wTm90aWZpY2F0aW9uc18KCQkJbWV0aG9kIHdhcyBjYWxsZWQuIFBhc3NpbmcgYSBib29sZWFuIHRydWUgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIKCQkJd2lsbCByZWVuYWJsZSB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlIGlmIGl0IHdhcyBkaXNhYmxlZC4KCQkqLwoJCXN0YXJ0Tm90aWZpY2F0aW9uczogZnVuY3Rpb24gKGVuYWJsZVF1ZXVlKSB7CgkJCXJldHVybiBzdGFydE5vdGlmaWNhdGlvbnModGhpcywgZW5hYmxlUXVldWUpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJRW5hYmxlcyB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlLiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5CgkJCWVuYWJsZWQuIElmIG5vdGlmaWNhdGlvbnMgYXJlIGN1cnJlbnRseSBlbmFibGVkLCB0aGlzIG1ldGhvZCB3aWxsIGhhdmUKCQkJbm8gZWZmZWN0IHVudGlsIHRoZXkgYXJlIGRpc2FibGVkLgoJCSovCgkJZW5hYmxlTm90aWZpY2F0aW9uUXVldWU6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIGVuYWJsZU5vdGlmaWNhdGlvblF1ZXVlKHRoaXMpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJRGlzYWJsZXMgdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZS4gSGFzIG5vIGVmZmVjdCBpZiB0aGUgcXVldWUgaXMKCQkJYWxyZWFkeSBkaXNhYmxlZCwgb3IgaWYgbm90aWZpY2F0aW9ucyBhcmUgY3VycmVudGx5IGVuYWJsZWQuIElmCgkJCW5vdGlmaWNhdGlvbnMgYXJlIGRpc2FibGVkLCBmdXR1cmUgbm90aWZpY2F0aW9ucyB3aWxsIG5vdCBiZSBxdWV1ZWQKCQkJYW5kIGFueSBpdGVtcyBpbiB0aGUgcXVldWUgd2lsbCBiZSBjbGVhcmVkIChub3QgZmx1c2hlZCkuCgkJKi8KCQlkaXNhYmxlTm90aWZpY2F0aW9uUXVldWU6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIGRpc2FibGVOb3RpZmljYXRpb25RdWV1ZSh0aGlzKTsKCQl9LAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgTUVUSE9EUwoKCQkvLypAcHJvdGVjdGVkCgkJLyoqCgkJCVVzZWQgaW50ZXJuYWxseSB3aGVuIGEgbm90aWZpY2F0aW9uIGlzIHF1ZXVlZAoJCSovCgkJYWRkTm90aWZpY2F0aW9uVG9RdWV1ZTogZnVuY3Rpb24gKHByb3BlcnR5LCBmbiwgcGFyYW1zKSB7CgkJCXJldHVybiBhZGROb3RpZmljYXRpb25Ub1F1ZXVlKHRoaXMsIHByb3BlcnR5LCBmbiwgcGFyYW1zKTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJLyoqCgkJCVVzZWQgaW50ZXJuYWxseTsgZmx1c2hlcyBhbnkgbm90aWZpY2F0aW9ucyB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQuCgkJKi8KCQlmbHVzaE5vdGlmaWNhdGlvbnM6IGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIGZsdXNoTm90aWZpY2F0aW9ucyh0aGlzKTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJX2NvbnN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7CgkJCS8vIGl0IGlzIHVuZm9ydHVuYXRlLCBidXQgd2UgY2Fubm90IHNoYXJlIHRoZSBvYnNlcnZlcnMgYmxvY2sgd2UgaW5oZXJpdGVkCgkJCS8vIGZyb20gdGhlIGtpbmQgc2luY2UgYXMgYW4gaW5zdGFuY2Ugd2UgY2FuIG1vZGlmeSBpdCBhdCBydW50aW1lIHNvIHdlJ3JlCgkJCS8vIGZvcmNlZCB0byBkZWVwIGNvcHkgaXQKCQkJdGhpcy5fb2JzZXJ2ZXJzID0gX29ic2VydmVyQ2xvbmUodGhpcy5fb2JzZXJ2ZXJzKTsKCQkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl9LAoKCQkvLypwcm90ZWN0ZWQKCQlkZXN0cm95OiBmdW5jdGlvbiAoKSB7CgkJCXRoaXMucmVtb3ZlQWxsT2JzZXJ2ZXJzKCk7CgkJfQoKCX0pOwoKfSgpKTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/mixins/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJIk1peGluU3VwcG9ydC5qcyIsCgkiQ29tcHV0ZWRQcm9wZXJ0eVN1cHBvcnQuanMiLAoJIk9ic2VydmVyTWV0aG9kU3VwcG9ydC5qcyIsCgkiQmluZGluZ1N1cHBvcnQuanMiLAoJIkFwcGxpY2F0aW9uU3VwcG9ydC5qcyIsCgkiQXV0b0JpbmRpbmdTdXBwb3J0LmpzIiwKCSJDb250cm9sbGVyU3VwcG9ydC5qcyIsCgkiTXVsdGlwbGVEaXNwYXRjaFN1cHBvcnQuanMiCik7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJImxvZy5qcyIsCgkibGFuZy5qcyIsCgkicG9vbC5qcyIsCgkiZGV2LmpzIiwKCSJqb2IuanMiLAoJIk9vcC5qcyIsCgkibWl4aW5zIiwKCSJCaW5kaW5nLmpzIiwKCSJPYmplY3QuanMiLAoJIkNvbXBvbmVudC5qcyIsCgkiVWlDb21wb25lbnQuanMiLAoJIkxheW91dC5qcyIsCgkiU2lnbmFscy5qcyIsCgkiTXVsdGlwbGVEaXNwYXRjaENvbXBvbmVudC5qcyIsCgkiQ29udHJvbGxlci5qcyIsCgkiUm91dGVyLmpzIiwKCSJWaWV3Q29udHJvbGxlci5qcyIsCgkiQXBwbGljYXRpb24uanMiLAoJImRhdGEiCik7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/kernel/pool.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8gaW50ZXJuYWxseSBtYWludGFpbiBhIHBvb2wgb2Ygb2JqZWN0cyB0byByZXVzZSB3aGVuZXZlciBwb3NzaWJsZQoJLy8gdG8gcHJldmVudCB0aGUgbWVtb3J5IGZvb3RwcmludCBleHBhbnNpb24gZm9yY2luZyB0aGUgR0MgdG8gZXhlY3V0ZSBtb3JlCgkvLyBvZnRlbgoJdmFyIHBvb2wgPSBbXSwgY2xhaW1lZCA9IFtdOwoJLy8gZm9yIGRlYnVnZ2luZyB0aGVzZSBhcmUgZXhwb3NlZAoJZW55by5wb29sID0ge307CgllbnlvLnBvb2wuYXZhaWxhYmxlID0gcG9vbDsKCWVueW8ucG9vbC5jbGFpbWVkID0gY2xhaW1lZDsKCS8vIHdlIHN0YXJ0IHdpdGggbm9uZSBzbyBpdCB3aWxsIGFsd2F5cyBjcmVhdGUgdGhlIGZld2VzdCBwb3NzaWJsZSBnaXZlbgoJLy8gYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9ucyBuZWVkcwoJdmFyIHNjcnViID0gZnVuY3Rpb24gKG8pIHsKCQl2YXIgJG8gPSBvOwoJCWlmICgkbyAmJiAkby5fcG9vbGVkICYmICRvLl9yZWxlYXNlZCkgewoJCQlmb3IgKHZhciBrIGluICRvKSB7CgkJCQlpZiAoJG8uaGFzT3duUHJvcGVydHkoaykgJiYgIX5lbnlvLmluZGV4T2YoaywgWyJfY2xhaW1lZCIsIl9wb29sZWQiLCJfcmVsZWFzZWQiXSkpIHsKCQkJCQkkb1trXSA9IHVuZGVmaW5lZDsKCQkJCX0KCQkJfQoJCX0KCX07CgoJLy8gRk9SIERFQlVHR0lORyBVTkNPTU1FTlQgVEhJUwoJLyogdmFyIGl0ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewoJCWVueW8ubG9nKAoJCQkiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICsKCQkJIlBPT0wgU0laRTogIiArIHBvb2wubGVuZ3RoICsgIlxuIiArCgkJCSJDTEFJTUVEIFNJWkU6ICIgKyBjbGFpbWVkLmxlbmd0aCArICJcbiIgKwoJCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgoJCSk7Cgl9LCA1MDAwKTsgKi8KCgkvLyBhZGQgYW4gb2JqZWN0IHRvIHRoZSBwb29sIGlmIGl0IHdhcyBlbmNvdW50ZXJlZCBpbiBhIHJldXNhYmxlCgkvLyB3YXkgYW5kIHJldHVybiBpdCBvciByZXR1cm4gYW4gb2JqZWN0IGZyb20gdGhlIHBvb2wsIGlmIG5vbmUKCS8vIGFyZSBhdmFpbGFibGUgaXQgd2lsbCBjcmVhdGUgYSBuZXcgb25lIGFuZCByZXR1cm4gaXQKCWVueW8ucG9vbC5jbGFpbU9iamVjdCA9IGZ1bmN0aW9uIChvKSB7CgkJdmFyICRvID0gbzsKCQlpZiAoJG8pIHsKCQkJY2xhaW1lZC5wdXNoKCRvKTsKCQl9IGVsc2UgaWYgKHBvb2wubGVuZ3RoKSB7CgkJCWNsYWltZWQucHVzaCgoJG8gPSBwb29sLnBvcCgpKSk7CgkJfSBlbHNlIHsKCQkJY2xhaW1lZC5wdXNoKCgkbyA9IHt9KSk7CgkJfQoJCSRvLl9wb29sZWQgPSB0cnVlOwoJCSRvLl9jbGFpbWVkID0gZW55by5iZW5jaCgpOwoJCSRvLl9yZWxlYXNlZCA9IG51bGw7CgkJcmV0dXJuICRvOwoJfTsKCS8vIHdoZW4gYW4gb2JqZWN0IGlzIGRvbmUgYmVpbmcgdXNlZCByZWxlYXNlIGl0IGJhY2sgdG8gdGhlIHBvb2wKCWVueW8ucG9vbC5yZWxlYXNlT2JqZWN0ID0gZnVuY3Rpb24gKG8pIHsKCQl2YXIgJG8gPSBvLCAkaTsKCQlpZiAoJG8pIHsKCQkJaWYgKCEhfigkaSA9IGVueW8uaW5kZXhPZigkbywgY2xhaW1lZCkpKSB7CgkJCQljbGFpbWVkLnNwbGljZSgkaSwgMSk7CgkJCQlwb29sLnB1c2goJG8pOwoJCQkJJG8uX3JlbGVhc2VkID0gZW55by5iZW5jaCgpOwoJCQkJc2NydWIoJG8pOwoJCQl9CgkJfQoJfTsKCgp9KShlbnlvKTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJImtlcm5lbCIsCgkiZXh0IiwKCSJhamF4IiwKCSJkb20iLAoJInRvdWNoIiwKCSJ1aSIsCgkiZW55by5kZXNpZ24iCik7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/ScrollMath.js"
Content-Type: application/octet-stream; x-encoding=base64
77u/LyoqCl9lbnlvLlNjcm9sbE1hdGhfIGltcGxlbWVudHMgYSBzY3JvbGxpbmcgZHluYW1pY3Mgc2ltdWxhdGlvbi4gIEl0IGlzIGEgaGVscGVyCmtpbmQgdXNlZCBieSBvdGhlciBzY3JvbGxlciBraW5kcywgc3VjaCBhcwo8YSBocmVmPSIjZW55by5Ub3VjaFNjcm9sbFN0cmF0ZWd5Ij5lbnlvLlRvdWNoU2Nyb2xsU3RyYXRlZ3k8L2E+LgoKX2VueW8uU2Nyb2xsTWF0aF8gaXMgbm90IHR5cGljYWxseSBjcmVhdGVkIGluIGFwcGxpY2F0aW9uIGNvZGUuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5TY3JvbGxNYXRoIiwKCWtpbmQ6ICJlbnlvLkNvbXBvbmVudCIsCglwdWJsaXNoZWQ6IHsKCQkvLyogVHJ1ZSBpZiB2ZXJ0aWNhbCBzY3JvbGxpbmcgaXMgZW5hYmxlZAoJCXZlcnRpY2FsOiB0cnVlLAoJCS8vKiBUcnVlIGlmIGhvcml6b250YWwgc2Nyb2xsaW5nIGlzIGVuYWJsZWQKCQlob3Jpem9udGFsOiB0cnVlCgl9LAoJZXZlbnRzOiB7CgkJLy8qIEZpcmVzIHdoZW4gc2Nyb2xsIGFjdGlvbiBzdGFydHMuCgkJb25TY3JvbGxTdGFydDogIiIsCgkJLy8qIEZpcmVzIHdoaWxlIHNjcm9sbCBhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MuCgkJb25TY3JvbGw6ICIiLAoJCS8vKiBGaXJlcyB3aGVuIHNjcm9sbCBhY3Rpb24gc3RvcHMuCgkJb25TY3JvbGxTdG9wOiAiIgoJfSwKCS8vKiAnU3ByaW5nJyBkYW1waW5nIHJldHVybnMgdGhlIHNjcm9sbCBwb3NpdGlvbiB0byBhIHZhbHVlIGluc2lkZSB0aGUKCS8vKiBib3VuZGFyaWVzLiAgTG93ZXIgdmFsdWVzIHByb3ZpZGUgX2Zhc3Rlcl8gc25hcGJhY2suCglrU3ByaW5nRGFtcGluZzogMC45MywKCS8vKiAnRHJhZycgZGFtcGluZyByZXNpc3RzIGRyYWdnaW5nIHRoZSBzY3JvbGwgcG9zaXRpb24gYmV5b25kIHRoZQoJLy8qIGJvdW5kYXJpZXMuICBMb3dlciB2YWx1ZXMgcHJvdmlkZSBfbW9yZV8gcmVzaXN0YW5jZS4KCWtEcmFnRGFtcGluZzogMC41LAoJLy8qICdGcmljdGlvbicgZGFtcGluZyByZWR1Y2VzIG1vbWVudHVtIG92ZXIgdGltZS4gIExvd2VyIHZhbHVlcyBwcm92aWRlCgkvLyogX21vcmVfIGZyaWN0aW9uLgoJa0ZyaWN0aW9uRGFtcGluZzogMC45NywKCS8vKiBBZGRpdGlvbmFsICdmcmljdGlvbicgZGFtcGluZyBhcHBsaWVkIHdoZW4gbW9tZW50dW0gY2FycmllcyB0aGUgdmlld3BvcnQKCS8vKiBpbnRvIG92ZXJzY3JvbGwuICBMb3dlciB2YWx1ZXMgcHJvdmlkZSBfbW9yZV8gZnJpY3Rpb24uCglrU25hcEZyaWN0aW9uOiAwLjksCgkvLyogU2NhbGFyIGFwcGxpZWQgdG8gJ2ZsaWNrJyBldmVudCB2ZWxvY2l0eQoJa0ZsaWNrU2NhbGFyOiAxNSwKCS8vKiBMaW1pdHMgdGhlIG1heGltdW0gYWxsb3dhYmxlIGZsaWNrLiAgT24gQW5kcm9pZCA+IDIsIHdlIGxpbWl0IHRoaXMgdG8KCS8vKiBwcmV2ZW50IGNvbXBvc2l0aW5nIGFydGlmYWN0cy4KCWtNYXhGbGljazogZW55by5wbGF0Zm9ybS5hbmRyb2lkID4gMiA/IDIgOiAxZTksCgkvLyogVGhlIHZhbHVlIHVzZWQgaW4gZnJpY3Rpb24oKSB0byBkZXRlcm1pbmUgaWYgdGhlIGRlbHRhIChlLmcuLCB5IC0geTApIGlzCgkvLyogY2xvc2UgZW5vdWdoIHRvIHplcm8gdG8gY29uc2lkZXIgYXMgemVybwoJa0ZyaWN0aW9uRXBzaWxvbjogMWUtMiwKCS8vKiBUb3Agc25hcCBib3VuZGFyeSwgZ2VuZXJhbGx5IDAKCXRvcEJvdW5kYXJ5OiAwLAoJLy8qIFJpZ2h0IHNuYXAgYm91bmRhcnksIGdlbmVyYWxseSAodmlld3BvcnQgd2lkdGggLSBjb250ZW50IHdpZHRoKQoJcmlnaHRCb3VuZGFyeTogMCwKCS8vKiBCb3R0b20gc25hcCBib3VuZGFyeSwgZ2VuZXJhbGx5ICh2aWV3cG9ydCBoZWlnaHQgLSBjb250ZW50IGhlaWdodCkKCWJvdHRvbUJvdW5kYXJ5OiAwLAoJLy8qIExlZnQgc25hcCBib3VuZGFyeSwgZ2VuZXJhbGx5IDAKCWxlZnRCb3VuZGFyeTogMCwKCS8vKiBBbmltYXRpb24gdGltZSBzdGVwCglpbnRlcnZhbDogMjAsCgkvLyogRmxhZyB0byBlbmFibGUgZnJhbWUtYmFzZWQgYW5pbWF0aW9uOyBpZiBmYWxzZSwgdGltZS1iYXNlZCBhbmltYXRpb24gaXMgdXNlZAoJZml4ZWRUaW1lOiB0cnVlLAoJLy8qIEBwcm90ZWN0ZWQKCS8vIHNpbXVsYXRpb24gc3RhdGUKCXgwOiAwLAoJeDogMCwKCXkwOiAwLAoJeTogMCwKCWRlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3RvcCgpOwoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJLyoqCgkJU2ltcGxlIFZlcmxldCBpbnRlZ3JhdG9yIGZvciBzaW11bGF0aW5nIE5ld3RvbmlhbiBtb3Rpb24uCgkqLwoJdmVybGV0OiBmdW5jdGlvbihwKSB7CgkJdmFyIHggPSB0aGlzLng7CgkJdGhpcy54ICs9IHggLSB0aGlzLngwOwoJCXRoaXMueDAgPSB4OwoJCS8vCgkJdmFyIHkgPSB0aGlzLnk7CgkJdGhpcy55ICs9IHkgLSB0aGlzLnkwOwoJCXRoaXMueTAgPSB5OwoJfSwKCS8qKgoJCUJvdW5kYXJ5IGRhbXBpbmcgZnVuY3Rpb24uCgkJUmV0dXJucyBkYW1wZWQgJ3ZhbHVlJyBiYXNlZCBvbiAnY29lZmYnIG9uIG9uZSBzaWRlIG9mICdvcmlnaW4nLgoJKi8KCWRhbXBpbmc6IGZ1bmN0aW9uKHZhbHVlLCBvcmlnaW4sIGNvZWZmLCBzaWduKSB7CgkJdmFyIGtFcHNpbG9uID0gMC41OwoJCS8vCgkJLy8gdGhpcyBpcyBiYXNpY2FsbHkganVzdCB2YWx1ZSAqPSBjb2VmZiAoZ2VuZXJhbGx5LCBjb2VmZiA8IDEpCgkJLy8KCQkvLyAnc2lnbicgYW5kIHRoZSBjb25kaXRpb25hbCBpcyB0byBmb3JjZSB0aGUgZGFtcGluZyB0byBvbmx5IG9jY3VyCgkJLy8gb24gb25lIHNpZGUgb2YgdGhlIG9yaWdpbi4KCQkvLwoJCXZhciBkdiA9IHZhbHVlIC0gb3JpZ2luOwoJCS8vIEZvcmNlIGNsb3NlLXRvLXplcm8gdG8gemVybwoJCWlmIChNYXRoLmFicyhkdikgPCBrRXBzaWxvbikgewoJCQlyZXR1cm4gb3JpZ2luOwoJCX0KCQlyZXR1cm4gdmFsdWUqc2lnbiA+IG9yaWdpbipzaWduID8gY29lZmYgKiBkdiArIG9yaWdpbiA6IHZhbHVlOwoJfSwKCS8qKgoJCUR1YWwtYm91bmRhcnkgZGFtcGluZyBmdW5jdGlvbi4KCQlSZXR1cm5zIGRhbXBlZCAndmFsdWUnIGJhc2VkIG9uICdjb2VmZicgd2hlbiBleGNlZWRpbmcgZWl0aGVyIGJvdW5kYXJ5LgoJKi8KCWJvdW5kYXJ5RGFtcGluZzogZnVuY3Rpb24odmFsdWUsIGFCb3VuZGFyeSwgYkJvdW5kYXJ5LCBjb2VmZikgewoJCXJldHVybiB0aGlzLmRhbXBpbmcodGhpcy5kYW1waW5nKHZhbHVlLCBhQm91bmRhcnksIGNvZWZmLCAxKSwgYkJvdW5kYXJ5LCBjb2VmZiwgLTEpOwoJfSwKCS8qKgoJCVNpbXVsYXRpb24gY29uc3RyYWludHMgKHNwcmluZyBkYW1waW5nIG9jY3VycyBoZXJlKQoJKi8KCWNvbnN0cmFpbjogZnVuY3Rpb24oKSB7CgkJdmFyIHkgPSB0aGlzLmJvdW5kYXJ5RGFtcGluZyh0aGlzLnksIHRoaXMudG9wQm91bmRhcnksIHRoaXMuYm90dG9tQm91bmRhcnksIHRoaXMua1NwcmluZ0RhbXBpbmcpOwoJCWlmICh5ICE9IHRoaXMueSkgewoJCQkvLyBlbnN1cmUgc25hcHBpbmcgaW50cm9kdWNlcyBubyB2ZWxvY2l0eSwgYWRkIGFkZGl0aW9uYWwgZnJpY3Rpb24KCQkJdGhpcy55MCA9IHkgLSAodGhpcy55IC0gdGhpcy55MCkgKiB0aGlzLmtTbmFwRnJpY3Rpb247CgkJCXRoaXMueSA9IHk7CgkJfQoJCXZhciB4ID0gdGhpcy5ib3VuZGFyeURhbXBpbmcodGhpcy54LCB0aGlzLmxlZnRCb3VuZGFyeSwgdGhpcy5yaWdodEJvdW5kYXJ5LCB0aGlzLmtTcHJpbmdEYW1waW5nKTsKCQlpZiAoeCAhPSB0aGlzLngpIHsKCQkJdGhpcy54MCA9IHggLSAodGhpcy54IC0gdGhpcy54MCkgKiB0aGlzLmtTbmFwRnJpY3Rpb247CgkJCXRoaXMueCA9IHg7CgkJfQoJfSwKCS8qKgoJCVRoZSBmcmljdGlvbiBmdW5jdGlvbgoJKi8KCWZyaWN0aW9uOiBmdW5jdGlvbihpbkV4LCBpbkV4MCwgaW5Db2VmZikgewoJCS8vIGltcGxpY2l0IHZlbG9jaXR5CgkJdmFyIGRwID0gdGhpc1tpbkV4XSAtIHRoaXNbaW5FeDBdOwoJCS8vIGxldCBjbG9zZS10by16ZXJvIGNvbGxhcHNlIHRvIHplcm8gKGkuZS4gc21hbGxlciB0aGFuIGVwc2lsb24gaXMgY29uc2lkZXJlZCB6ZXJvKQoJCXZhciBjID0gTWF0aC5hYnMoZHApID4gdGhpcy5rRnJpY3Rpb25FcHNpbG9uID8gaW5Db2VmZiA6IDA7CgkJLy8gcmVwb3NpdGlvbiB1c2luZyBkYW1wZWQgdmVsb2NpdHkKCQl0aGlzW2luRXhdID0gdGhpc1tpbkV4MF0gKyBjICogZHA7Cgl9LAoJLy8gb25lIHVuaXQgb2YgdGltZSBmb3Igc2ltdWxhdGlvbgoJZnJhbWU6IDEwLAoJLy8gcGllY2Utd2lzZSBjb25zdHJhaW50IHNpbXVsYXRpb24KCXNpbXVsYXRlOiBmdW5jdGlvbih0KSB7CgkJd2hpbGUgKHQgPj0gdGhpcy5mcmFtZSkgewoJCQl0IC09IHRoaXMuZnJhbWU7CgkJCWlmICghdGhpcy5kcmFnZ2luZykgewoJCQkJdGhpcy5jb25zdHJhaW4oKTsKCQkJfQoJCQl0aGlzLnZlcmxldCgpOwoJCQl0aGlzLmZyaWN0aW9uKCd5JywgJ3kwJywgdGhpcy5rRnJpY3Rpb25EYW1waW5nKTsKCQkJdGhpcy5mcmljdGlvbigneCcsICd4MCcsIHRoaXMua0ZyaWN0aW9uRGFtcGluZyk7CgkJfQoJCXJldHVybiB0OwoJfSwKCWFuaW1hdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3RvcCgpOwoJCS8vIHRpbWUgdHJhY2tpbmcKCQl2YXIgdDAgPSBlbnlvLm5vdygpLCB0ID0gMDsKCQkvLyBkZWx0YSB0cmFja2luZwoJCXZhciB4MCwgeTA7CgkJLy8gYW5pbWF0aW9uIGhhbmRsZXIKCQl2YXIgZm4gPSB0aGlzLmJpbmRTYWZlbHkoZnVuY3Rpb24oKSB7CgkJCS8vIHdhbGwtY2xvY2sgdGltZQoJCQl2YXIgdDEgPSBlbnlvLm5vdygpOwoJCQkvLyBzY2hlZHVsZSBuZXh0IGZyYW1lCgkJCXRoaXMuam9iID0gZW55by5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwoJCQkvLyBkZWx0YSBmcm9tIGxhc3Qgd2FsbCBjbG9jayB0aW1lCgkJCXZhciBkdCA9IHQxIC0gdDA7CgkJCS8vIHJlY29yZCB0aGUgdGltZSBmb3IgbmV4dCBkZWx0YQoJCQl0MCA9IHQxOwoJCQkvLyB1c2VyIGRyYWdzIG92ZXJyaWRlIGFuaW1hdGlvbgoJCQlpZiAodGhpcy5kcmFnZ2luZykgewoJCQkJdGhpcy55MCA9IHRoaXMueSA9IHRoaXMudXk7CgkJCQl0aGlzLngwID0gdGhpcy54ID0gdGhpcy51eDsKCQkJfQoJCQkvLyBmcmFtZS10aW1lIGFjY3VtdWxhdG9yCgkJCS8vIG1pbiBhY2NlcHRhYmxlIHRpbWUgaXMgMTZtcyAoNjBmcHMpCgkJCXQgKz0gTWF0aC5tYXgoMTYsIGR0KTsKCQkJLy8gYWx0ZXJuYXRlIGZpeGVkLXRpbWUgc3RlcCBzdHJhdGVneToKCQkJaWYgKHRoaXMuZml4ZWRUaW1lICYmICF0aGlzLmlzSW5PdmVyU2Nyb2xsKCkpIHsKCQkJCXQgPSB0aGlzLmludGVydmFsOwoJCQl9CgkJCS8vIGNvbnN1bWUgc29tZSB0IGluIHNpbXVsYXRpb24KCQkJdCA9IHRoaXMuc2ltdWxhdGUodCk7CgkJCS8vIHNjcm9sbCBpZiB3ZSBoYXZlIG1vdmVkLCBvdGhlcndpc2UgdGhlIGFuaW1hdGlvbiBpcyBzdGFsbGVkIGFuZCB3ZSBjYW4gc3RvcAoJCQlpZiAoeTAgIT0gdGhpcy55IHx8IHgwICE9IHRoaXMueCkgewoJCQkJLy90aGlzLmxvZyh0aGlzLnksIHkwKTsKCQkJCXRoaXMuc2Nyb2xsKCk7CgkJCX0gZWxzZSBpZiAoIXRoaXMuZHJhZ2dpbmcpIHsKCQkJCXRoaXMuc3RvcCh0cnVlKTsKCQkJCXRoaXMuc2Nyb2xsKCk7CgkJCX0KCQkJeTAgPSB0aGlzLnk7CgkJCXgwID0gdGhpcy54OwoJCX0pOwoJCXRoaXMuam9iID0gZW55by5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwoJfSwKCS8vKiBAcHJvdGVjdGVkCglzdGFydDogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLmpvYikgewoJCQl0aGlzLmFuaW1hdGUoKTsKCQkJdGhpcy5kb1Njcm9sbFN0YXJ0KCk7CgkJfQoJfSwKCXN0b3A6IGZ1bmN0aW9uKGluRmlyZUV2ZW50KSB7CgkJdGhpcy5qb2IgPSBlbnlvLmNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmpvYik7CgkJaWYgKGluRmlyZUV2ZW50KSB7CgkJCXRoaXMuZG9TY3JvbGxTdG9wKCk7CgkJfQoJfSwKCXN0YWJpbGl6ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5zdGFydCgpOwoJCXZhciB5ID0gTWF0aC5taW4odGhpcy50b3BCb3VuZGFyeSwgTWF0aC5tYXgodGhpcy5ib3R0b21Cb3VuZGFyeSwgdGhpcy55KSk7CgkJdmFyIHggPSBNYXRoLm1pbih0aGlzLmxlZnRCb3VuZGFyeSwgTWF0aC5tYXgodGhpcy5yaWdodEJvdW5kYXJ5LCB0aGlzLngpKTsKCQl0aGlzLnkgPSB0aGlzLnkwID0geTsKCQl0aGlzLnggPSB0aGlzLngwID0geDsKCQl0aGlzLnNjcm9sbCgpOwoJCXRoaXMuc3RvcCh0cnVlKTsKCX0sCglzdGFydERyYWc6IGZ1bmN0aW9uKGUpIHsKCQl0aGlzLmRyYWdnaW5nID0gdHJ1ZTsKCQkvLwoJCXRoaXMubXkgPSBlLnBhZ2VZOwoJCXRoaXMucHkgPSB0aGlzLnV5ID0gdGhpcy55OwoJCS8vCgkJdGhpcy5teCA9IGUucGFnZVg7CgkJdGhpcy5weCA9IHRoaXMudXggPSB0aGlzLng7Cgl9LAoJZHJhZzogZnVuY3Rpb24oZSkgewoJCWlmICh0aGlzLmRyYWdnaW5nKSB7CgkJCXZhciBkeSA9IHRoaXMudmVydGljYWwgPyBlLnBhZ2VZIC0gdGhpcy5teSA6IDA7CgkJCXRoaXMudXkgPSBkeSArIHRoaXMucHk7CgkJCS8vIHByb3ZpZGVzIHJlc2lzdGFuY2UgYWdhaW5zdCBkcmFnZ2luZyBpbnRvIG92ZXJzY3JvbGwKCQkJdGhpcy51eSA9IHRoaXMuYm91bmRhcnlEYW1waW5nKHRoaXMudXksIHRoaXMudG9wQm91bmRhcnksIHRoaXMuYm90dG9tQm91bmRhcnksIHRoaXMua0RyYWdEYW1waW5nKTsKCQkJLy8KCQkJdmFyIGR4ID0gdGhpcy5ob3Jpem9udGFsID8gZS5wYWdlWCAtIHRoaXMubXggOiAwOwoJCQl0aGlzLnV4ID0gZHggKyB0aGlzLnB4OwoJCQkvLyBwcm92aWRlcyByZXNpc3RhbmNlIGFnYWluc3QgZHJhZ2dpbmcgaW50byBvdmVyc2Nyb2xsCgkJCXRoaXMudXggPSB0aGlzLmJvdW5kYXJ5RGFtcGluZyh0aGlzLnV4LCB0aGlzLmxlZnRCb3VuZGFyeSwgdGhpcy5yaWdodEJvdW5kYXJ5LCB0aGlzLmtEcmFnRGFtcGluZyk7CgkJCS8vCgkJCXRoaXMuc3RhcnQoKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfSwKCWRyYWdEcm9wOiBmdW5jdGlvbihlKSB7CgkJaWYgKHRoaXMuZHJhZ2dpbmcgJiYgIXdpbmRvdy5QYWxtU3lzdGVtKSB7CgkJCXZhciBrU2ltdWxhdGVkRmxpY2tTY2FsYXIgPSAwLjU7CgkJCXRoaXMueSA9IHRoaXMudXk7CgkJCXRoaXMueTAgPSB0aGlzLnkgLSAodGhpcy55IC0gdGhpcy55MCkgKiBrU2ltdWxhdGVkRmxpY2tTY2FsYXI7CgkJCXRoaXMueCA9IHRoaXMudXg7CgkJCXRoaXMueDAgPSB0aGlzLnggLSAodGhpcy54IC0gdGhpcy54MCkgKiBrU2ltdWxhdGVkRmxpY2tTY2FsYXI7CgkJfQoJCXRoaXMuZHJhZ0ZpbmlzaCgpOwoJfSwKCWRyYWdGaW5pc2g6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsKCX0sCglmbGljazogZnVuY3Rpb24oZSkgewoJCXZhciB2OwoJCWlmICh0aGlzLnZlcnRpY2FsKSB7CgkJCXYgPSBlLnlWZWxvY2l0eSA+IDAgPyBNYXRoLm1pbih0aGlzLmtNYXhGbGljaywgZS55VmVsb2NpdHkpIDogTWF0aC5tYXgoLXRoaXMua01heEZsaWNrLCBlLnlWZWxvY2l0eSk7CgkJCXRoaXMueSA9IHRoaXMueTAgKyB2ICogdGhpcy5rRmxpY2tTY2FsYXI7CgkJfQoJCWlmICh0aGlzLmhvcml6b250YWwpIHsKCQkJdiA9IGUueFZlbG9jaXR5ID4gMCA/IE1hdGgubWluKHRoaXMua01heEZsaWNrLCBlLnhWZWxvY2l0eSkgOiBNYXRoLm1heCgtdGhpcy5rTWF4RmxpY2ssIGUueFZlbG9jaXR5KTsKCQkJdGhpcy54ID0gdGhpcy54MCArIHYgKiB0aGlzLmtGbGlja1NjYWxhcjsKCQl9CgkJdGhpcy5zdGFydCgpOwoJfSwKCW1vdXNld2hlZWw6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgZHkgPSB0aGlzLnZlcnRpY2FsID8gZS53aGVlbERlbHRhWSB8fCBlLndoZWVsRGVsdGE6IDA7CgkJaWYgKChkeSA+IDAgJiYgdGhpcy55IDwgdGhpcy50b3BCb3VuZGFyeSkgfHwgKGR5IDwgMCAmJiB0aGlzLnkgPiB0aGlzLmJvdHRvbUJvdW5kYXJ5KSkgewoJCQl0aGlzLnN0b3AodHJ1ZSk7CgkJCXRoaXMueSA9IHRoaXMueTAgPSB0aGlzLnkwICsgZHk7CgkJCXRoaXMuc3RhcnQoKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfSwKCXNjcm9sbDogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb1Njcm9sbCgpOwoJfSwKCS8vIE5PVEU6IFlpcC9PcnZlbGwgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBzY3JvbGxlciBpbnN0YW50YW5lb3VzIHZlbG9jaXR5CgkvLyBGSVhNRTogaW5jb3JyZWN0IGlmIGNhbGxlZCB3aGVuIHNjcm9sbGVyIGlzIGluIG92ZXJzY3JvbGwgcmVnaW9uCgkvLyBiZWNhdXNlIGRvZXMgbm90IGFjY291bnQgZm9yIGFkZGl0aW9uYWwgb3ZlcnNjcm9sbCBkYW1waW5nLgoJLyoqCgkJQW5pbWF0ZXMgYSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KCSovCglzY3JvbGxUbzogZnVuY3Rpb24oaW5YLCBpblkpIHsKCQlpZiAoaW5ZICE9PSBudWxsKSB7CgkJCXRoaXMueSA9IHRoaXMueTAgLSAoaW5ZICsgdGhpcy55MCkgKiAoMSAtIHRoaXMua0ZyaWN0aW9uRGFtcGluZyk7CgkJfQoJCWlmIChpblggIT09IG51bGwpIHsKCQkJdGhpcy54ID0gdGhpcy54MCAtIChpblggKyB0aGlzLngwKSAqICgxIC0gdGhpcy5rRnJpY3Rpb25EYW1waW5nKTsKCQl9CgkJdGhpcy5zdGFydCgpOwoJfSwKCXNldFNjcm9sbFg6IGZ1bmN0aW9uKGluWCkgewoJCXRoaXMueCA9IHRoaXMueDAgPSBpblg7Cgl9LAoJc2V0U2Nyb2xsWTogZnVuY3Rpb24oaW5ZKSB7CgkJdGhpcy55ID0gdGhpcy55MCA9IGluWTsKCX0sCglzZXRTY3JvbGxQb3NpdGlvbjogZnVuY3Rpb24oaW5Qb3NpdGlvbikgewoJCXRoaXMuc2V0U2Nyb2xsWShpblBvc2l0aW9uKTsKCX0sCglpc1Njcm9sbGluZzogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIEJvb2xlYW4odGhpcy5qb2IpOwoJfSwKCWlzSW5PdmVyU2Nyb2xsOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5qb2IgJiYgKHRoaXMueCA+IHRoaXMubGVmdEJvdW5kYXJ5IHx8IHRoaXMueCA8IHRoaXMucmlnaHRCb3VuZGFyeSB8fAoJCQl0aGlzLnkgPiB0aGlzLnRvcEJvdW5kYXJ5IHx8IHRoaXMueSA8IHRoaXMuYm90dG9tQm91bmRhcnkpOwoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/ScrollStrategy.js"
Content-Type: application/octet-stream; x-encoding=base64
77u/LyoqCglfZW55by5TY3JvbGxTdHJhdGVneV8gaXMgYSBoZWxwZXIga2luZCB0aGF0IGltcGxlbWVudHMgYSBkZWZhdWx0IHNjcm9sbGluZwoJc3RyYXRlZ3kgZm9yIGFuIDxhIGhyZWY9IiNlbnlvLlNjcm9sbGVyIj5lbnlvLlNjcm9sbGVyPC9hPi4KCglfZW55by5TY3JvbGxTdHJhdGVneV8gaXMgbm90IHR5cGljYWxseSBjcmVhdGVkIGluIGFwcGxpY2F0aW9uIGNvZGUuCglJbnN0ZWFkLCBpdCBpcyBzcGVjaWZpZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBgc3RyYXRlZ3lLaW5kYCBwcm9wZXJ0eSBvZiBhbgoJYGVueW8uU2Nyb2xsZXJgIG9yIDxhIGhyZWY9IiNlbnlvLkxpc3QiPmVueW8uTGlzdDwvYT4sIG9yIGlzIHVzZWQgYnkgdGhlCglmcmFtZXdvcmsgaW1wbGljaXRseS4KKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLlNjcm9sbFN0cmF0ZWd5IiwKCXRhZzogbnVsbCwKCXB1Ymxpc2hlZDogewoJCS8qKgoJCQlTcGVjaWZpZXMgaG93IHRvIHZlcnRpY2FsbHkgc2Nyb2xsLiAgQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOgoKCQkJKiAic2Nyb2xsIjogQWx3YXlzIHNob3dzIGEgc2Nyb2xsYmFyOyBzZXRzIF9vdmVyZmxvdzogc2Nyb2xsXy4KCQkJKiAiYXV0byI6IFNjcm9sbHMgb25seSBpZiBuZWVkZWQ7IHNldHMgX292ZXJmbG93OiBhdXRvXy4KCQkJKiAiaGlkZGVuIjogTmV2ZXIgc2Nyb2xsczsgc2V0cyBfb3ZlcmZsb3c6IGhpZGRlbl8uCgkJCSogImRlZmF1bHQiOiBTYW1lIGFzICJhdXRvIi4KCQkqLwoJCXZlcnRpY2FsOiAiZGVmYXVsdCIsCgkJLyoqCgkJCVNwZWNpZmllcyBob3cgdG8gaG9yaXpvbnRhbGx5IHNjcm9sbC4gIEFjY2VwdGFibGUgdmFsdWVzIGFyZToKCgkJCSogInNjcm9sbCI6IEFsd2F5cyBzaG93cyBhIHNjcm9sbGJhcjsgc2V0cyBfb3ZlcmZsb3c6IHNjcm9sbF8uCgkJCSogImF1dG8iOiBTY3JvbGxzIG9ubHkgaWYgbmVlZGVkOyBzZXRzIF9vdmVyZmxvdzogYXV0b18uCgkJCSogImhpZGRlbiI6IE5ldmVyIHNjcm9sbHM7IHNldHMgX292ZXJmbG93OiBoaWRkZW5fLgoJCQkqICJkZWZhdWx0IjogU2FtZSBhcyAiYXV0byIuCgkJKi8KCQlob3Jpem9udGFsOiAiZGVmYXVsdCIsCgkJLy8qIFNjcm9sbCBwb3NpdGlvbiBhbG9uZyBob3Jpem9udGFsIGF4aXMKCQlzY3JvbGxMZWZ0OiAwLAoJCS8vKiBTY3JvbGwgcG9zaXRpb24gYWxvbmcgdmVydGljYWwgYXhpcwoJCXNjcm9sbFRvcDogMCwKCQkvLyogTWF4aW11bSBoZWlnaHQgb2Ygc2Nyb2xsIGNvbnRlbnQKCQltYXhIZWlnaHQ6IG51bGwsCgkJLy8qIFVzZSBtb3VzZSB3aGVlbCB0byBtb3ZlIHNjcm9sbGVyCgkJdXNlTW91c2VXaGVlbDogdHJ1ZQoJfSwKCS8vKiBAcHJvdGVjdGVkCgloYW5kbGVyczogewoJCW9uZHJhZ3N0YXJ0OiAiZHJhZ3N0YXJ0IiwKCQlvbmRyYWdmaW5pc2g6ICJkcmFnZmluaXNoIiwKCQlvbmRvd246ICJkb3duIiwKCQlvbm1vdmU6ICJtb3ZlIiwKCQlvbm1vdXNld2hlZWw6ICJtb3VzZXdoZWVsIgoJfSwKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl0aGlzLmhvcml6b250YWxDaGFuZ2VkKCk7CgkJdGhpcy52ZXJ0aWNhbENoYW5nZWQoKTsKCQl0aGlzLm1heEhlaWdodENoYW5nZWQoKTsKCX0sCglyZW5kZXJlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcy5jb250YWluZXIsICJzY3JvbGwiKTsKCQl0aGlzLnNjcm9sbE5vZGUgPSB0aGlzLmNhbGNTY3JvbGxOb2RlKCk7Cgl9LAoJdGVhcmRvd25SZW5kZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJdGhpcy5zY3JvbGxOb2RlID0gbnVsbDsKCX0sCgljYWxjU2Nyb2xsTm9kZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuY29udGFpbmVyLmhhc05vZGUoKTsKCX0sCglob3Jpem9udGFsQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb250YWluZXIuYXBwbHlTdHlsZSgib3ZlcmZsb3cteCIsIHRoaXMuaG9yaXpvbnRhbCA9PSAiZGVmYXVsdCIgPyAiYXV0byIgOiB0aGlzLmhvcml6b250YWwpOwoJfSwKCXZlcnRpY2FsQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb250YWluZXIuYXBwbHlTdHlsZSgib3ZlcmZsb3cteSIsIHRoaXMudmVydGljYWwgPT0gImRlZmF1bHQiID8gImF1dG8iIDogdGhpcy52ZXJ0aWNhbCk7Cgl9LAoJbWF4SGVpZ2h0Q2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb250YWluZXIuYXBwbHlTdHlsZSgibWF4LWhlaWdodCIsIHRoaXMubWF4SGVpZ2h0KTsKCX0sCglzY3JvbGxUbzogZnVuY3Rpb24oaW5YLCBpblkpIHsKCQlpZiAodGhpcy5zY3JvbGxOb2RlKSB7CgkJCXRoaXMuc2V0U2Nyb2xsTGVmdChpblgpOwoJCQl0aGlzLnNldFNjcm9sbFRvcChpblkpOwoJCX0KCX0sCglzY3JvbGxUb05vZGU6IGZ1bmN0aW9uKGluTm9kZSwgaW5BbGlnbldpdGhUb3ApIHsKCQlpZiAodGhpcy5zY3JvbGxOb2RlKSB7CgkJCXZhciBzYiA9IHRoaXMuZ2V0U2Nyb2xsQm91bmRzKCk7CgkJCXZhciBuID0gaW5Ob2RlOwoJCQl2YXIgYiA9IHtoZWlnaHQ6IG4ub2Zmc2V0SGVpZ2h0LCB3aWR0aDogbi5vZmZzZXRXaWR0aCwgdG9wOiAwLCBsZWZ0OiAwfTsKCQkJd2hpbGUgKG4gJiYgbi5wYXJlbnROb2RlICYmIG4uaWQgIT0gdGhpcy5zY3JvbGxOb2RlLmlkKSB7CgkJCQliLnRvcCArPSBuLm9mZnNldFRvcDsKCQkJCWIubGVmdCArPSBuLm9mZnNldExlZnQ7CgkJCQluID0gbi5wYXJlbnROb2RlOwoJCQl9CgkJCS8vIEJ5IGRlZmF1bHQsIHRoZSBlbGVtZW50IGlzIHNjcm9sbGVkIHRvIGFsaWduIHdpdGggdGhlIHRvcCBvZiB0aGUgc2Nyb2xsIGFyZWEuCgkJCXRoaXMuc2V0U2Nyb2xsVG9wKE1hdGgubWluKHNiLm1heFRvcCwgaW5BbGlnbldpdGhUb3AgPT09IGZhbHNlID8gYi50b3AgLSBzYi5jbGllbnRIZWlnaHQgKyBiLmhlaWdodCA6IGIudG9wKSk7CgkJCXRoaXMuc2V0U2Nyb2xsTGVmdChNYXRoLm1pbihzYi5tYXhMZWZ0LCBpbkFsaWduV2l0aFRvcCA9PT0gZmFsc2UgPyBiLmxlZnQgLSBzYi5jbGllbnRXaWR0aCArIGIud2lkdGggOiBiLmxlZnQpKTsKCQl9Cgl9LAoJc2Nyb2xsSW50b1ZpZXc6IGZ1bmN0aW9uKGluQ29udHJvbCwgaW5BbGlnbldpdGhUb3ApIHsKCQlpZiAoaW5Db250cm9sLmhhc05vZGUoKSkgewoJCQlpbkNvbnRyb2wubm9kZS5zY3JvbGxJbnRvVmlldyhpbkFsaWduV2l0aFRvcCk7CgkJfQoJfSwKCWlzSW5WaWV3OiBmdW5jdGlvbihpbk5vZGUpIHsKCQl2YXIgc2IgPSB0aGlzLmdldFNjcm9sbEJvdW5kcygpOwoJCXZhciBvdCA9IGluTm9kZS5vZmZzZXRUb3A7CgkJdmFyIG9oID0gaW5Ob2RlLm9mZnNldEhlaWdodDsKCQl2YXIgb2wgPSBpbk5vZGUub2Zmc2V0TGVmdDsKCQl2YXIgb3cgPSBpbk5vZGUub2Zmc2V0V2lkdGg7CgkJcmV0dXJuIChvdCA+PSBzYi50b3AgJiYgb3QgKyBvaCA8PSBzYi50b3AgKyBzYi5jbGllbnRIZWlnaHQpICYmIChvbCA+PSBzYi5sZWZ0ICYmIG9sICsgb3cgPD0gc2IubGVmdCArIHNiLmNsaWVudFdpZHRoKTsKCX0sCglzZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKGluVG9wKSB7CgkJdGhpcy5zY3JvbGxUb3AgPSBpblRvcDsKCQlpZiAodGhpcy5zY3JvbGxOb2RlKSB7CgkJCXRoaXMuc2Nyb2xsTm9kZS5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcDsKCQl9Cgl9LAoJc2V0U2Nyb2xsTGVmdDogZnVuY3Rpb24oaW5MZWZ0KSB7CgkJdGhpcy5zY3JvbGxMZWZ0ID0gaW5MZWZ0OwoJCWlmICh0aGlzLnNjcm9sbE5vZGUpIHsKCQkJdGhpcy5zY3JvbGxOb2RlLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQ7CgkJfQoJfSwKCWdldFNjcm9sbExlZnQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnNjcm9sbE5vZGUgPyB0aGlzLnNjcm9sbE5vZGUuc2Nyb2xsTGVmdCA6IHRoaXMuc2Nyb2xsTGVmdDsKCX0sCglnZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnNjcm9sbE5vZGUgPyB0aGlzLnNjcm9sbE5vZGUuc2Nyb2xsVG9wIDogdGhpcy5zY3JvbGxUb3A7Cgl9LAoJX2dldFNjcm9sbEJvdW5kczogZnVuY3Rpb24oKSB7CgkJdmFyIHMgPSB0aGlzLmdldFNjcm9sbFNpemUoKSwgY24gPSB0aGlzLmNvbnRhaW5lci5oYXNOb2RlKCk7CgkJdmFyIGIgPSB7CgkJCWxlZnQ6IHRoaXMuZ2V0U2Nyb2xsTGVmdCgpLAoJCQl0b3A6IHRoaXMuZ2V0U2Nyb2xsVG9wKCksCgkJCWNsaWVudEhlaWdodDogY24gPyBjbi5jbGllbnRIZWlnaHQgOiAwLAoJCQljbGllbnRXaWR0aDogY24gPyBjbi5jbGllbnRXaWR0aCA6IDAsCgkJCWhlaWdodDogcy5oZWlnaHQsCgkJCXdpZHRoOiBzLndpZHRoCgkJfTsKCQliLm1heExlZnQgPSBNYXRoLm1heCgwLCBiLndpZHRoIC0gYi5jbGllbnRXaWR0aCk7CgkJYi5tYXhUb3AgPSBNYXRoLm1heCgwLCBiLmhlaWdodCAtIGIuY2xpZW50SGVpZ2h0KTsKCQlyZXR1cm4gYjsKCX0sCglnZXRTY3JvbGxTaXplOiBmdW5jdGlvbigpIHsKCQl2YXIgbiA9IHRoaXMuc2Nyb2xsTm9kZTsKCQlyZXR1cm4ge3dpZHRoOiBuID8gbi5zY3JvbGxXaWR0aCA6IDAsIGhlaWdodDogbiA/IG4uc2Nyb2xsSGVpZ2h0IDogMH07Cgl9LAoJZ2V0U2Nyb2xsQm91bmRzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsQm91bmRzKCk7Cgl9LAoJY2FsY1N0YXJ0SW5mbzogZnVuY3Rpb24oKSB7CgkJdmFyIHNiID0gdGhpcy5nZXRTY3JvbGxCb3VuZHMoKTsKCQl2YXIgeSA9IHRoaXMuZ2V0U2Nyb2xsVG9wKCksIHggPSB0aGlzLmdldFNjcm9sbExlZnQoKTsKCQl0aGlzLmNhblZlcnRpY2FsID0gc2IubWF4VG9wID4gMCAmJiB0aGlzLnZlcnRpY2FsICE9ICJoaWRkZW4iOwoJCXRoaXMuY2FuSG9yaXpvbnRhbCA9IHNiLm1heExlZnQgPiAwICYmIHRoaXMuaG9yaXpvbnRhbCAhPSAiaGlkZGVuIjsKCQl0aGlzLnN0YXJ0RWRnZXMgPSB7CgkJCXRvcDogeSA9PT0gMCwKCQkJYm90dG9tOiB5ID09PSBzYi5tYXhUb3AsCgkJCWxlZnQ6IHggPT09IDAsCgkJCXJpZ2h0OiB4ID09PSBzYi5tYXhMZWZ0CgkJfTsKCX0sCgkvLyBOT1RFOiBkb3duLCBtb3ZlLCBhbmQgZHJhZyBoYW5kbGVycyBhcmUgbmVlZGVkIG9ubHkgZm9yIG5hdGl2ZSB0b3VjaCBzY3JvbGxlcnMKCXNob3VsZERyYWc6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQl2YXIgcmVxdWVzdFYgPSBpbkV2ZW50LnZlcnRpY2FsOwoJCXJldHVybiAocmVxdWVzdFYgJiYgdGhpcy5jYW5WZXJ0aWNhbCAgfHwgIXJlcXVlc3RWICYmIHRoaXMuY2FuSG9yaXpvbnRhbCkgLyomJiAhdGhpcy5pc09vYlZlcnRpY2FsU2Nyb2xsKGluRXZlbnQpKi87Cgl9LAoJZHJhZ3N0YXJ0OiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCXRoaXMuZHJhZ2dpbmcgPSB0aGlzLnNob3VsZERyYWcoaW5FdmVudCk7CgkJaWYgKHRoaXMuZHJhZ2dpbmcpIHsKCQkJcmV0dXJuIHRoaXMucHJldmVudERyYWdQcm9wYWdhdGlvbjsKCQl9Cgl9LAoJZHJhZ2ZpbmlzaDogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQlpZiAodGhpcy5kcmFnZ2luZykgewoJCQl0aGlzLmRyYWdnaW5nID0gZmFsc2U7CgkJCWluRXZlbnQucHJldmVudFRhcCgpOwoJCX0KCX0sCgkvLyBhdm9pZCBhbGxvd2luZyBzY3JvbGwgd2hlbiBzdGFydGluZyBhdCBhIHZlcnRpY2FsIGJvdW5kYXJ5IHRvIHByZXZlbnQgaW9zIGZyb20gd2luZG93IHNjcm9sbGluZy4KCWRvd246IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdGhpcy5jYWxjU3RhcnRJbmZvKCk7Cgl9LAoJLy8gTk9URTogbW9iaWxlIG5hdGl2ZSBzY3JvbGxlcnMgbmVlZCB0b3VjaG1vdmUuIEluZGljYXRlIHRoaXMgYnkKCS8vIHNldHRpbmcgdGhlIHJlcXVpcmVUb3VjaG1vdmUgcHJvcGVydHkgdG8gdHJ1ZS4KCW1vdmU6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJaWYgKGluRXZlbnQud2hpY2ggJiYgKHRoaXMuY2FuVmVydGljYWwgJiYgaW5FdmVudC52ZXJ0aWNhbCB8fCB0aGlzLmNhbkhvcml6b250YWwgJiYgaW5FdmVudC5ob3Jpem9udGFsKSkgewoJCQlpbkV2ZW50LmRpc2FibGVQcmV2ZW50aW9uKCk7CgkJfQoJfSwKCW1vdXNld2hlZWw6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJLy8qIFdlIGRpc2FibGUgbW91c2Ugd2hlZWwgc2Nyb2xsaW5nIGJ5IHByZXZlbnRpbmcgdGhlIGRlZmF1bHQKCQlpZiAoIXRoaXMudXNlTW91c2VXaGVlbCkgewoJCQlpbkV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/Scroller.css"
Content-Type: application/octet-stream; x-encoding=base64
LmVueW8tc2Nyb2xsZXIgewoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZW55by1maXQuZW55by1zY3JvbGxlciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cn0KCi5lbnlvLXRvdWNoLXNjcm9sbGVyIHsKCW92ZXJmbG93OiBoaWRkZW47Cn0KCi5lbnlvLXRvdWNoLXN0cmF0ZWd5LWNvbnRhaW5lciB7CglvdmVyZmxvdzogaGlkZGVuOwp9CgouZW55by1zY3JvbGxlZS1maXQgewoJaGVpZ2h0OiAxMDAlOwp9
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/Scroller.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCl9lbnlvLlNjcm9sbGVyXyBpcyBhIHNjcm9sbGVyIHN1aXRhYmxlIGZvciB1c2UgaW4gYm90aCBkZXNrdG9wIGFuZCBtb2JpbGUKYXBwbGljYXRpb25zLgoKSW4gc29tZSBtb2JpbGUgZW52aXJvbm1lbnRzLCBhIGRlZmF1bHQgc2Nyb2xsaW5nIHNvbHV0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IKRE9NIGVsZW1lbnRzLiAgSW4gc3VjaCBjYXNlcywgX2VueW8uU2Nyb2xsZXJfIGltcGxlbWVudHMgYSB0b3VjaC1iYXNlZCBzY3JvbGxpbmcKc29sdXRpb24sIHdoaWNoIG1heSBiZSBvcHRlZCBpbnRvIGVpdGhlciBnbG9iYWxseSAoYnkgc2V0dGluZyB0aGUgZmxhZwpfZW55by5TY3JvbGxlci50b3VjaFNjcm9sbGluZyA9IHRydWU7Xykgb3Igb24gYSBwZXItaW5zdGFuY2UgYmFzaXMgKGJ5CnNwZWNpZnlpbmcgYSBfc3RyYXRlZ3lLaW5kXyBvZiAiVG91Y2hTY3JvbGxTdHJhdGVneSIpLgoKRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbgpbU2Nyb2xsZXJzXShodHRwczovL2dpdGh1Yi5jb20vZW55b2pzL2VueW8vd2lraS9TY3JvbGxlcnMpIGluIHRoZSBFbnlvIERldmVsb3BlcgpHdWlkZS4KKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLlNjcm9sbGVyIiwKCXB1Ymxpc2hlZDogewoJCS8qKgoJCQlTcGVjaWZpZXMgaG93IHRvIGhvcml6b250YWxseSBzY3JvbGwuICBBY2NlcHRhYmxlIHZhbHVlcyBhcmUKCQkJInNjcm9sbCIsICJhdXRvLCIgImhpZGRlbiwiIGFuZCAiZGVmYXVsdCIuICBUaGUgcHJlY2lzZQoJCQllZmZlY3Qgb2YgdGhlIHNldHRpbmcgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2Nyb2xsIHN0cmF0ZWd5LgoJCSovCgkJaG9yaXpvbnRhbDogImRlZmF1bHQiLAoJCS8qKgoJCQlTcGVjaWZpZXMgaG93IHRvIHZlcnRpY2FsbHkgc2Nyb2xsLiAgQWNjZXB0YWJsZSB2YWx1ZXMgYXJlICJzY3JvbGwiLAoJCQkiYXV0bywiICJoaWRkZW4sIiBhbmQgImRlZmF1bHQiLiAgVGhlIHByZWNpc2UgZWZmZWN0IG9mIHRoZSBzZXR0aW5nCgkJCWlzIGRldGVybWluZWQgYnkgdGhlIHNjcm9sbCBzdHJhdGVneS4KCQkqLwoJCXZlcnRpY2FsOiAiZGVmYXVsdCIsCgkJLyoqCgkJCVRoZSB2ZXJ0aWNhbCBzY3JvbGwgcG9zaXRpb24KCQkqLwoJCXNjcm9sbFRvcDogMCwKCQkvKioKCQkJVGhlIGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uCgkJKi8KCQlzY3JvbGxMZWZ0OiAwLAoJCS8qKgoJCQlNYXhpbXVtIGhlaWdodCBvZiB0aGUgc2Nyb2xsIGNvbnRlbnQKCQkqLwoJCW1heEhlaWdodDogbnVsbCwKCQkvKioKCQkJU2V0IHRvIHRydWUgdG8gbWFrZSB0aGlzIHNjcm9sbGVyIHNlbGVjdCBhIHBsYXRmb3JtLWFwcHJvcHJpYXRlCgkJCXRvdWNoLWJhc2VkIHNjcm9sbGluZyBzdHJhdGVneS4gTm90ZSB0aGF0IGlmIHlvdSBzcGVjaWZ5IGEgdmFsdWUgZm9yCgkJCV9zdHJhdGVneUtpbmRfLCB0aGF0IHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhpcyBzZXR0aW5nLgoJCSovCgkJdG91Y2g6IGZhbHNlLAoJCS8qKgoJCQlTcGVjaWZpZXMgYSB0eXBlIG9mIHNjcm9sbGluZy4gVGhlIHNjcm9sbGVyIHdpbGwgYXR0ZW1wdCB0bwoJCQlhdXRvbWF0aWNhbGx5IHNlbGVjdCBhIHN0cmF0ZWd5IGNvbXBhdGlibGUgd2l0aCB0aGUgcnVudGltZQoJCQllbnZpcm9ubWVudC4gQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjaG9vc2UgdG8gdXNlIGEgc3BlY2lmaWMKCQkJc3RyYXRlZ3k6CgoJCQkqIDxhIGhyZWY9IiNlbnlvLlNjcm9sbFN0cmF0ZWd5Ij5TY3JvbGxTdHJhdGVneTwvYT4gaXMgdGhlIGRlZmF1bHQKCQkJCWFuZCBpbXBsZW1lbnRzIG5vIHNjcm9sbGluZywgcmVseWluZyBpbnN0ZWFkIG9uIHRoZSBlbnZpcm9ubWVudAoJCQkJdG8gc2Nyb2xsIHByb3Blcmx5LgoKCQkJKiA8YSBocmVmPSIjZW55by5Ub3VjaFNjcm9sbFN0cmF0ZWd5Ij5Ub3VjaFNjcm9sbFN0cmF0ZWd5PC9hPgoJCQkJaW1wbGVtZW50cyBhIHRvdWNoIHNjcm9sbGluZyBtZWNoYW5pc20uCgoJCQkqIDxhIGhyZWY9IiNlbnlvLlRyYW5zbGF0ZVNjcm9sbFN0cmF0ZWd5Ij5UcmFuc2xhdGVTY3JvbGxTdHJhdGVneTwvYT4KCQkJCWltcGxlbWVudHMgYSB0b3VjaCBzY3JvbGxpbmcgbWVjaGFuaXNtIHVzaW5nIHRyYW5zbGF0aW9uczsgaXQgaXMKCQkJCWN1cnJlbnRseSByZWNvbW1lbmRlZCBvbmx5IGZvciBBbmRyb2lkIDMgYW5kIDQgJiBXaW5kb3dzIFBob25lIDguCgoJCQkqIDxhIGhyZWY9IiNlbnlvLlRyYW5zaXRpb25TY3JvbGxTdHJhdGVneSI+VHJhbnNpdGlvblNjcm9sbFN0cmF0ZWd5PC9hPgoJCQkJaW1wbGVtZW50cyBhIHRvdWNoIHNjcm9sbGluZyBtZWNoYW5pc20gdXNpbmcgQ1NTIHRyYW5zaXRpb25zOyBpdCBpcwoJCQkJY3VycmVudGx5IHJlY29tbWVuZGVkIG9ubHkgZm9yIGlPUyA1IGFuZCBsYXRlci4KCQkqLwoJCXN0cmF0ZWd5S2luZDogIlNjcm9sbFN0cmF0ZWd5IiwKCQkvLyogU2V0IHRvIHRydWUgdG8gZGlzcGxheSBhIHNjcm9sbCB0aHVtYiBpbiB0b3VjaCBzY3JvbGxlcnMKCQl0aHVtYjogdHJ1ZSwKCQkvLyogVXNlIG1vdXNlIHdoZWVsIHRvIG1vdmUgc2Nyb2xsZXIKCQl1c2VNb3VzZVdoZWVsOiB0cnVlCgl9LAoJZXZlbnRzOiB7CgkJLy8qIEZpcmVzIHdoZW4gYSBzY3JvbGxpbmcgYWN0aW9uIHN0YXJ0cy4KCQlvblNjcm9sbFN0YXJ0OiAiIiwKCQkvLyogRmlyZXMgd2hpbGUgYSBzY3JvbGxpbmcgYWN0aW9uIGlzIGluIHByb2dyZXNzLgoJCW9uU2Nyb2xsOiAiIiwKCQkvLyogRmlyZXMgd2hlbiBhIHNjcm9sbGluZyBhY3Rpb24gc3RvcHMuCgkJb25TY3JvbGxTdG9wOiAiIgoJfSwKCS8qKgoJCUlmIHRydWUgKHRoZSBkZWZhdWx0KSBhbmQgYSB0b3VjaCBzY3JvbGxlciwgdGhlIHNjcm9sbGVyIHdpbGwgb3ZlcnNjcm9sbAoJCWFuZCBib3VuY2UgYmFjayBhdCB0aGUgZWRnZXMKCSovCgl0b3VjaE92ZXJzY3JvbGw6IHRydWUsCgkvKioKCQlJZiB0cnVlICh0aGUgZGVmYXVsdCksIHRoZSBzY3JvbGxlciB3aWxsIG5vdCBwcm9wYWdhdGUgX2RyYWdzdGFydF8KCQlldmVudHMgdGhhdCBjYXVzZSBpdCB0byBzdGFydCBzY3JvbGxpbmcKCSovCglwcmV2ZW50RHJhZ1Byb3BhZ2F0aW9uOiB0cnVlLAoJLyoqCgkJSWYgdHJ1ZSwgdGhlIHNjcm9sbGVyIHdpbGwgbm90IHByb3BhZ2F0ZSBzY3JvbGwgZXZlbnRzCgkqLwoJcHJldmVudFNjcm9sbFByb3BhZ2F0aW9uOiB0cnVlLAoJLy8qIEBwcm90ZWN0ZWQKCWhhbmRsZXJzOiB7CgkJb25zY3JvbGw6ICJkb21TY3JvbGwiLAoJCW9uU2Nyb2xsU3RhcnQ6ICJzY3JvbGxTdGFydCIsCgkJb25TY3JvbGw6ICJzY3JvbGwiLAoJCW9uU2Nyb2xsU3RvcDogInNjcm9sbFN0b3AiCgl9LAoJY2xhc3NlczogImVueW8tc2Nyb2xsZXIiLAoJc3RhdGljczogewoJCW9zSW5mbzogWwoJCQl7b3M6ICJhbmRyb2lkIiwgdmVyc2lvbjogM30sCgkJCXtvczogImFuZHJvaWRDaHJvbWUiLCB2ZXJzaW9uOiAxOH0sCgkJCXtvczogImFuZHJvaWRGaXJlZm94IiwgdmVyc2lvbjogMTZ9LAoJCQl7b3M6ICJmaXJlZm94T1MiLCB2ZXJzaW9uOiAxNn0sCgkJCXtvczogImlvcyIsIHZlcnNpb246IDV9LAoJCQl7b3M6ICJ3ZWJvcyIsIHZlcnNpb246IDFlOX0sCgkJCXtvczogImJsYWNrYmVycnkiLCB2ZXJzaW9uOjFlOX0sCgkJCXtvczogInRpemVuIiwgdmVyc2lvbjogMn0KCQldLAoJCS8vKiBSZXR1cm5zIHRydWUgaWYgcGxhdGZvcm0gc2hvdWxkIGhhdmUgdG91Y2ggZXZlbnRzLgoJCWhhc1RvdWNoU2Nyb2xsaW5nOiBmdW5jdGlvbigpIHsKCQkJZm9yICh2YXIgaT0wLCB0OyAodD10aGlzLm9zSW5mb1tpXSk7IGkrKykgewoJCQkJaWYgKGVueW8ucGxhdGZvcm1bdC5vc10pIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfQoJCQkvLyBzcGVjaWFsIGRldGVjdGlvbiBmb3IgSUUxMCsgb24gdG91Y2ggZGV2aWNlcwoJCQlpZiAoKGVueW8ucGxhdGZvcm0uaWUgPj0gMTAgfHwgZW55by5wbGF0Zm9ybS53aW5kb3dzUGhvbmUgPj0gOCkgJiYgZW55by5wbGF0Zm9ybS50b3VjaCkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9LAoJCS8qKgoJCQlSZXR1cm5zIHRydWUgaWYgdGhlIHBsYXRmb3JtIGhhcyBuYXRpdmUgZGl2IHNjcm9sbGVycyAoZGVza3RvcAoJCQlicm93c2VycyBhbHdheXMgaGF2ZSB0aGVtKS4KCQkqLwoJCWhhc05hdGl2ZVNjcm9sbGluZzogZnVuY3Rpb24oKSB7CgkJCWZvciAodmFyIGk9MCwgdDsgKHQ9dGhpcy5vc0luZm9baV0pOyBpKyspIHsKCQkJCWlmIChlbnlvLnBsYXRmb3JtW3Qub3NdIDwgdC52ZXJzaW9uKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0cnVlOwoJCX0sCgkJZ2V0VG91Y2hTdHJhdGVneTogZnVuY3Rpb24oKSB7CgkJCXJldHVybiAoZW55by5wbGF0Zm9ybS5hbmRyb2lkID49IDMpIHx8IChlbnlvLnBsYXRmb3JtLndpbmRvd3NQaG9uZSA9PT0gOCkKCQkJCT8gIlRyYW5zbGF0ZVNjcm9sbFN0cmF0ZWd5IgoJCQkJOiAiVG91Y2hTY3JvbGxTdHJhdGVneSI7CgkJfQoJfSwKCWNvbnRyb2xQYXJlbnROYW1lOiAic3RyYXRlZ3kiLAoJY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXRoaXMuaG9yaXpvbnRhbENoYW5nZWQoKTsKCQl0aGlzLnZlcnRpY2FsQ2hhbmdlZCgpOwoJCXRoaXMudXNlTW91c2VXaGVlbENoYW5nZWQoKTsKCX0sCglpbXBvcnRQcm9wczogZnVuY3Rpb24oaW5Qcm9wcykgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJLy8gYWxsb3cgZ2xvYmFsIG92ZXJyaWRpbmcgb2Ygc3RyYXRlZ3kga2luZAoJCWlmIChpblByb3BzICYmIGluUHJvcHMuc3RyYXRlZ3lLaW5kID09PSB1bmRlZmluZWQgJiYgKGVueW8uU2Nyb2xsZXIudG91Y2hTY3JvbGxpbmcgfHwgdGhpcy50b3VjaCkpIHsKCQkJdGhpcy5zdHJhdGVneUtpbmQgPSBlbnlvLlNjcm9sbGVyLmdldFRvdWNoU3RyYXRlZ3koKTsKCQl9Cgl9LAoJaW5pdENvbXBvbmVudHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3RyYXRlZ3lLaW5kQ2hhbmdlZCgpOwoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJdGVhcmRvd25DaGlsZHJlbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5jYWNoZVNjcm9sbFBvc2l0aW9uKCk7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCglyZW5kZXJlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl0aGlzLnJlc3RvcmVTY3JvbGxQb3NpdGlvbigpOwoJfSwKCXN0cmF0ZWd5S2luZENoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLiQuc3RyYXRlZ3kpIHsKCQkJdGhpcy4kLnN0cmF0ZWd5LmRlc3Ryb3koKTsKCQkJdGhpcy5jb250cm9sUGFyZW50ID0gbnVsbDsKCQl9CgkJLy8gbm90ZTogY3JlYXRlQ29tcG9uZW50cyBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgY29udHJvbFBhcmVudC4KCQl0aGlzLmNyZWF0ZVN0cmF0ZWd5KCk7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXRoaXMucmVuZGVyKCk7CgkJfQoJfSwKCWNyZWF0ZVN0cmF0ZWd5OiBmdW5jdGlvbigpIHsKCQl0aGlzLmNyZWF0ZUNvbXBvbmVudHMoW3tuYW1lOiAic3RyYXRlZ3kiLCBtYXhIZWlnaHQ6IHRoaXMubWF4SGVpZ2h0LAoJCQlraW5kOiB0aGlzLnN0cmF0ZWd5S2luZCwgdGh1bWI6IHRoaXMudGh1bWIsCgkJCXByZXZlbnREcmFnUHJvcGFnYXRpb246IHRoaXMucHJldmVudERyYWdQcm9wYWdhdGlvbiwKCQkJb3ZlcnNjcm9sbDp0aGlzLnRvdWNoT3ZlcnNjcm9sbCwgaXNDaHJvbWU6IHRydWV9XSk7Cgl9LAoJZ2V0U3RyYXRlZ3k6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLiQuc3RyYXRlZ3k7Cgl9LAoJbWF4SGVpZ2h0Q2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLnN0cmF0ZWd5LnNldE1heEhlaWdodCh0aGlzLm1heEhlaWdodCk7Cgl9LAoJc2hvd2luZ0NoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCWlmICghdGhpcy5zaG93aW5nKSB7CgkJCXRoaXMuY2FjaGVTY3JvbGxQb3NpdGlvbigpOwoJCQl0aGlzLnNldFNjcm9sbExlZnQoMCk7CgkJCXRoaXMuc2V0U2Nyb2xsVG9wKDApOwoJCX0KCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCWlmICh0aGlzLnNob3dpbmcpIHsKCQkJdGhpcy5yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTsKCQl9Cgl9LAoJdGh1bWJDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQl0aGlzLiQuc3RyYXRlZ3kuc2V0VGh1bWIodGhpcy50aHVtYik7Cgl9LAoJY2FjaGVTY3JvbGxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5jYWNoZWRQb3NpdGlvbiA9IHtsZWZ0OiB0aGlzLmdldFNjcm9sbExlZnQoKSwgdG9wOiB0aGlzLmdldFNjcm9sbFRvcCgpfTsKCX0sCglyZXN0b3JlU2Nyb2xsUG9zaXRpb246IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmNhY2hlZFBvc2l0aW9uKSB7CgkJCXRoaXMuc2V0U2Nyb2xsTGVmdCh0aGlzLmNhY2hlZFBvc2l0aW9uLmxlZnQpOwoJCQl0aGlzLnNldFNjcm9sbFRvcCh0aGlzLmNhY2hlZFBvc2l0aW9uLnRvcCk7CgkJCXRoaXMuY2FjaGVkUG9zaXRpb24gPSBudWxsOwoJCX0KCX0sCglob3Jpem9udGFsQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLnN0cmF0ZWd5LnNldEhvcml6b250YWwodGhpcy5ob3Jpem9udGFsKTsKCX0sCgl2ZXJ0aWNhbENoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuJC5zdHJhdGVneS5zZXRWZXJ0aWNhbCh0aGlzLnZlcnRpY2FsKTsKCX0sCgkvLyBGSVhNRTogdGhlc2UgcHJvcGVydGllcyBhcmUgdmlydHVhbDsgcHJvcGVydHkgY2hhbmdlZCBtZXRob2RzIGFyZSBmaXJlZCBvbmx5IGlmCgkvLyBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VzLCBub3QgaWYgZ2V0dGVyIGNoYW5nZXMuCgkvLyogU2V0cyBzY3JvbGwgcG9zaXRpb24gYWxvbmcgaG9yaXpvbnRhbCBheGlzLgoJc2V0U2Nyb2xsTGVmdDogZnVuY3Rpb24oaW5MZWZ0KSB7CgkJdGhpcy5zY3JvbGxMZWZ0ID0gaW5MZWZ0OwoJCXRoaXMuJC5zdHJhdGVneS5zZXRTY3JvbGxMZWZ0KHRoaXMuc2Nyb2xsTGVmdCk7Cgl9LAoJLy8qIFNldHMgc2Nyb2xsIHBvc2l0aW9uIGFsb25nIHZlcnRpY2FsIGF4aXMuCglzZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKGluVG9wKSB7CgkJdGhpcy5zY3JvbGxUb3AgPSBpblRvcDsKCQl0aGlzLiQuc3RyYXRlZ3kuc2V0U2Nyb2xsVG9wKGluVG9wKTsKCX0sCgkvLyogR2V0cyBzY3JvbGwgcG9zaXRpb24gYWxvbmcgaG9yaXpvbnRhbCBheGlzLgoJZ2V0U2Nyb2xsTGVmdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuJC5zdHJhdGVneS5nZXRTY3JvbGxMZWZ0KCk7Cgl9LAoJLy8qIEdldHMgc2Nyb2xsIHBvc2l0aW9uIGFsb25nIHZlcnRpY2FsIGF4aXMuCglnZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLiQuc3RyYXRlZ3kuZ2V0U2Nyb2xsVG9wKCk7Cgl9LAoJLy8qIEBwdWJsaWMKCS8qKgoJCVJldHVybnMgYW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHNjcm9sbCBib3VuZGFyaWVzIHdpdGggX2hlaWdodF8gYW5kCgkJX3dpZHRoXyBwcm9wZXJ0aWVzLgoJKi8KCWdldFNjcm9sbEJvdW5kczogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuJC5zdHJhdGVneS5nZXRTY3JvbGxCb3VuZHMoKTsKCX0sCgkvKioKCQlTY3JvbGxzIHRoZSBnaXZlbiBjb250cm9sIChfaW5Db250cm9sXykgaW50byB2aWV3LiBJZiBfaW5BbGlnbldpdGhUb3BfCgkJaXMgdHJ1ZSwgX2luQ29udHJvbF8gaXMgYWxpZ25lZCB3aXRoIHRoZSB0b3Agb2YgdGhlIHNjcm9sbGVyLgoJKi8KCXNjcm9sbEludG9WaWV3OiBmdW5jdGlvbihpbkNvbnRyb2wsIGluQWxpZ25XaXRoVG9wKSB7CgkJdGhpcy4kLnN0cmF0ZWd5LnNjcm9sbEludG9WaWV3KGluQ29udHJvbCwgaW5BbGlnbldpdGhUb3ApOwoJfSwKCS8vKiBTY3JvbGxzIHRvIHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgYnkgX2luWF8gYW5kIF9pbllfIGluIHBpeGVsIHVuaXRzLgoJc2Nyb2xsVG86IGZ1bmN0aW9uKGluWCwgaW5ZKSB7CgkJdGhpcy4kLnN0cmF0ZWd5LnNjcm9sbFRvKGluWCwgaW5ZKTsKCX0sCgkvKioKCQlFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIGNvbnRyb2wgaXMgdmlzaWJsZSBpbiB0aGUgc2Nyb2xsZXIncyB2aWV3cG9ydC4KCQlVbmxpa2UgX3Njcm9sbEludG9WaWV3Xywgd2hpY2ggdXNlcyBET00ncyBfc2Nyb2xsSW50b1ZpZXdfLCB0aGlzIG9ubHkKCQlhZmZlY3RzIHRoZSBjdXJyZW50IHNjcm9sbGVyLgoJKi8KCXNjcm9sbFRvQ29udHJvbDogZnVuY3Rpb24oaW5Db250cm9sLCBpbkFsaWduV2l0aFRvcCkgewoJCXRoaXMuc2Nyb2xsVG9Ob2RlKGluQ29udHJvbC5oYXNOb2RlKCksIGluQWxpZ25XaXRoVG9wKTsKCX0sCgkvLyogRW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBub2RlIGlzIHZpc2libGUgaW4gdGhlIHNjcm9sbGVyJ3Mgdmlld3BvcnQuCglzY3JvbGxUb05vZGU6IGZ1bmN0aW9uKGluTm9kZSwgaW5BbGlnbldpdGhUb3ApIHsKCQl0aGlzLiQuc3RyYXRlZ3kuc2Nyb2xsVG9Ob2RlKGluTm9kZSwgaW5BbGlnbldpdGhUb3ApOwoJfSwKCS8vKiBAcHJvdGVjdGVkCgkvLyogTm9ybWFsaXplcyBzY3JvbGwgZXZlbnQgdG8gX29uU2Nyb2xsXy4KCWRvbVNjcm9sbDogZnVuY3Rpb24oaW5TZW5kZXIsIGUpIHsKCQkvLyBpZiBhIHNjcm9sbCBldmVudCBvcmlnaW5hdGVkIGhlcmUsIHBhc3MgaXQgdG8gb3VyIHN0cmF0ZWd5IHRvIGhhbmRsZQoJCWlmICh0aGlzLiQuc3RyYXRlZ3kuZG9tU2Nyb2xsICYmIGUub3JpZ2luYXRvciA9PSB0aGlzKSB7CgkJCXRoaXMuJC5zdHJhdGVneS5zY3JvbGwoaW5TZW5kZXIsIGUpOwoJCX0KCQl0aGlzLmRvU2Nyb2xsKGUpOwoJCXJldHVybiB0cnVlOwoJfSwKCS8qKgoJCVJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBzY3JvbGwgZXZlbnQgc2hvdWxkIGJlIHN0b3BwZWQ7IGZhbHNlIGlmIGl0CgkJc2hvdWxkIGJlIGFsbG93ZWQgdG8gcHJvcGFnYXRlLgoJKi8KCXNob3VsZFN0b3BTY3JvbGxFdmVudDogZnVuY3Rpb24oaW5FdmVudCkgewoJCXJldHVybiAodGhpcy5wcmV2ZW50U2Nyb2xsUHJvcGFnYXRpb24gJiYKCQkJaW5FdmVudC5vcmlnaW5hdG9yLm93bmVyICE9IHRoaXMuJC5zdHJhdGVneSk7Cgl9LAoJLyoqCgkJQ2FsbHMgX3Nob3VsZFN0b3BTY3JvbGxFdmVudF8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgY3VycmVudCBzY3JvbGwgZXZlbnQKCQlzaG91bGQgYmUgc3RvcHBlZC4KCSovCglzY3JvbGxTdGFydDogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQlyZXR1cm4gdGhpcy5zaG91bGRTdG9wU2Nyb2xsRXZlbnQoaW5FdmVudCk7Cgl9LAoJLy8qIEVpdGhlciBwcm9wYWdhdGVzIG9yIHN0b3BzIHRoZSBjdXJyZW50IHNjcm9sbCBldmVudC4KCXNjcm9sbDogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQkvLyBub3RlOiBzY3JvbGwgZXZlbnQgY2FuIGJlIG5hdGl2ZSBkb20gb3IgZ2VuZXJhdGVkLgoJCWlmIChpbkV2ZW50LmRpc3BhdGNoVGFyZ2V0KSB7CgkJCS8vIGFsbG93IGEgZG9tIGV2ZW50IGlmIGl0IG9yaWduYXRlZCB3aXRoIHRoaXMgc2Nyb2xsZXIgb3IgaXRzIHN0cmF0ZWd5CgkJCXJldHVybiB0aGlzLnByZXZlbnRTY3JvbGxQcm9wYWdhdGlvbiAmJiAhKGluRXZlbnQub3JpZ2luYXRvciA9PSB0aGlzIHx8CgkJCQlpbkV2ZW50Lm9yaWdpbmF0b3Iub3duZXIgPT0gdGhpcy4kLnN0cmF0ZWd5KTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5zaG91bGRTdG9wU2Nyb2xsRXZlbnQoaW5FdmVudCk7CgkJfQoJfSwKCS8qKgoJCUNhbGxzIF9zaG91bGRTdG9wU2Nyb2xsRXZlbnRfIHRvIGRldGVybWluZSB3aGV0aGVyIGN1cnJlbnQgc2Nyb2xsIGV2ZW50CgkJc2hvdWxkIGJlIHN0b3BwZWQuCgkqLwoJc2Nyb2xsU3RvcDogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQlyZXR1cm4gdGhpcy5zaG91bGRTdG9wU2Nyb2xsRXZlbnQoaW5FdmVudCk7Cgl9LAoJLy8qIEBwdWJsaWMKCS8vKiBTY3JvbGwgdG8gdGhlIHRvcCBvZiB0aGUgc2Nyb2xsaW5nIHJlZ2lvbi4KCXNjcm9sbFRvVG9wOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldFNjcm9sbFRvcCgwKTsKCX0sCgkvLyogU2Nyb2xsIHRvIHRoZSBib3R0b20gb2YgdGhlIHNjcm9sbGluZyByZWdpb24uCglzY3JvbGxUb0JvdHRvbTogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZXRTY3JvbGxUb3AodGhpcy5nZXRTY3JvbGxCb3VuZHMoKS5tYXhUb3ApOwoJfSwKCS8vKiBTY3JvbGwgdG8gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHNjcm9sbGluZyByZWdpb24uCglzY3JvbGxUb1JpZ2h0OiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldFNjcm9sbExlZnQodGhpcy5nZXRTY3JvbGxCb3VuZHMoKS5tYXhMZWZ0KTsKCX0sCgkvLyogU2Nyb2xsIHRvIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHNjcm9sbGluZyByZWdpb24uCglzY3JvbGxUb0xlZnQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0U2Nyb2xsTGVmdCgwKTsKCX0sCgkvLyogRW5zdXJlcyBzY3JvbGwgcG9zaXRpb24gaXMgaW4gYm91bmRzLgoJc3RhYmlsaXplOiBmdW5jdGlvbigpIHsKCQl2YXIgcyA9IHRoaXMuZ2V0U3RyYXRlZ3koKTsKCQlpZiAocy5zdGFiaWxpemUpIHsKCQkJcy5zdGFiaWxpemUoKTsKCQl9Cgl9LAoJLy8qIFNlbmQgdGhlIHVzZU1vdXNlV2hlZWwgcHJvcGVydCB0byB0aGUgc2Nyb2xsIHN0cmF0ZWd5Cgl1c2VNb3VzZVdoZWVsQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLnN0cmF0ZWd5LnNldFVzZU1vdXNlV2hlZWwodGhpcy51c2VNb3VzZVdoZWVsKTsKCX0KfSk7CgovLyBwcm92aWRlIGEgdG91Y2ggc2Nyb2xsaW5nIHNvbHV0aW9uIGJ5IGRlZmF1bHQgd2hlbiB0aGUgZW52aXJvbm1lbnQgaXMgbW9iaWxlCmlmIChlbnlvLlNjcm9sbGVyLmhhc1RvdWNoU2Nyb2xsaW5nKCkpIHsKCWVueW8uU2Nyb2xsZXIucHJvdG90eXBlLnN0cmF0ZWd5S2luZCA9IGVueW8uU2Nyb2xsZXIuZ2V0VG91Y2hTdHJhdGVneSgpOwp9Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/Thumb.css"
Content-Type: application/octet-stream; x-encoding=base64
LmVueW8tdGh1bWIgewoJcG9zaXRpb246IGFic29sdXRlOwoJLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwoJYm94LXNpemluZzogYm9yZGVyLWJveDsKCWJvcmRlci1yYWRpdXM6IDRweDsKCWJhY2tncm91bmQ6ICMzMzM7Cglib3JkZXI6IDFweCBzb2xpZCAjNjY2OwoJb3BhY2l0eTogMC43NTsKCXotaW5kZXg6IDE7Cn0KCi5lbnlvLXZ0aHVtYiB7Cgl0b3A6IDA7CglyaWdodDogMnB4OwoJd2lkdGg6IDRweDsKfQoKLmVueW8taHRodW1iIHsKCWxlZnQ6IDA7Cglib3R0b206IDJweDsKCWhlaWdodDogNHB4Owp9Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/Thumb.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCl9lbnlvLlNjcm9sbFRodW1iXyBpcyBhIGhlbHBlciBraW5kIHVzZWQgYnkKPGEgaHJlZj0iI2VueW8uVG91Y2hTY3JvbGxTdHJhdGVneSI+ZW55by5Ub3VjaFNjcm9sbFN0cmF0ZWd5PC9hPiBhbmQKPGEgaHJlZj0iI2VueW8uVHJhbnNsYXRlU2Nyb2xsU3RyYXRlZ3kiPmVueW8uVHJhbnNsYXRlU2Nyb2xsU3RyYXRlZ3k8L2E+IHRvCmRpc3BsYXkgYSBzbWFsbCB2aXN1YWwgc2Nyb2xsIGluZGljYXRvci4KCl9lbnlvLlNjcm9sbFRodW1iXyBpcyBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgaW4gYXBwbGljYXRpb24gY29kZS4KKi8KCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5TY3JvbGxUaHVtYiIsCgkvLyogVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBzY3JvbGwgaW5kaWNhdG9yIGJhcjsgInYiIGZvciB2ZXJ0aWNhbCBvciAiaCIgZm9yIGhvcml6b250YWwKCWF4aXM6ICJ2IiwKCS8vKiBAcHJvdGVjdGVkCgkvLyogTWluaW11bSBzaXplIG9mIHRoZSBpbmRpY2F0b3IKCW1pblNpemU6IDQsCgkvLyogU2l6ZSBvZiB0aGUgY29ybmVycyBvZiB0aGUgaW5kaWNhdG9yCgljb3JuZXJTaXplOiA2LAoJY2xhc3NlczogImVueW8tdGh1bWIiLAoJY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXZhciB2ID0gdGhpcy5heGlzID09ICJ2IjsKCQl0aGlzLmRpbWVuc2lvbiA9IHYgPyAiaGVpZ2h0IiA6ICJ3aWR0aCI7CgkJdGhpcy5vZmZzZXQgPSB2ID8gInRvcCIgOiAibGVmdCI7CgkJdGhpcy50cmFuc2xhdGlvbiA9IHYgPyAidHJhbnNsYXRlWSIgOiAidHJhbnNsYXRlWCI7CgkJdGhpcy5wb3NpdGlvbk1ldGhvZCA9IHYgPyAiZ2V0U2Nyb2xsVG9wIiA6ICJnZXRTY3JvbGxMZWZ0IjsKCQl0aGlzLnNpemVEaW1lbnNpb24gPSB2ID8gImNsaWVudEhlaWdodCIgOiAiY2xpZW50V2lkdGgiOwoJCXRoaXMuYWRkQ2xhc3MoImVueW8tIiArIHRoaXMuYXhpcyArICJ0aHVtYiIpOwoJCXRoaXMudHJhbnNmb3JtID0gZW55by5kb20uY2FuVHJhbnNmb3JtKCk7CgkJaWYgKGVueW8uZG9tLmNhbkFjY2VsZXJhdGUoKSkgewoJCQllbnlvLmRvbS50cmFuc2Zvcm1WYWx1ZSh0aGlzLCAidHJhbnNsYXRlWiIsIDApOwoJCX0KCX0sCgkvLyogU3luY3MgdGhlIHNjcm9sbCBpbmRpY2F0b3IgYmFyIHRvIHRoZSBzY3JvbGxlciBzaXplIGFuZCBwb3NpdGlvbiwKCS8vKiBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBwYXNzZWQtaW4gc2Nyb2xsIHN0cmF0ZWd5LgoJc3luYzogZnVuY3Rpb24oaW5TdHJhdGVneSkgewoJCXRoaXMuc2Nyb2xsQm91bmRzID0gaW5TdHJhdGVneS5fZ2V0U2Nyb2xsQm91bmRzKCk7CgkJdGhpcy51cGRhdGUoaW5TdHJhdGVneSk7Cgl9LAoJdXBkYXRlOiBmdW5jdGlvbihpblN0cmF0ZWd5KSB7CgkJaWYgKHRoaXMuc2hvd2luZykgewoJCQl2YXIgZCA9IHRoaXMuZGltZW5zaW9uLCBvID0gdGhpcy5vZmZzZXQ7CgkJCXZhciBiZCA9IHRoaXMuc2Nyb2xsQm91bmRzW3RoaXMuc2l6ZURpbWVuc2lvbl0sIHNiZCA9IHRoaXMuc2Nyb2xsQm91bmRzW2RdOwoJCQl2YXIgb3ZlcnMgPSAwLCBvdmVycCA9IDAsIG92ZXIgPSAwOwoJCQlpZiAoYmQgPj0gc2JkKSB7CgkJCQl0aGlzLmhpZGUoKTsKCQkJCXJldHVybjsKCQkJfQoJCQlpZiAoaW5TdHJhdGVneS5pc092ZXJzY3JvbGxpbmcoKSkgewoJCQkJb3ZlciA9IGluU3RyYXRlZ3kuZ2V0T3ZlclNjcm9sbEJvdW5kcygpWyJvdmVyIiArIG9dOwoJCQkJb3ZlcnMgPSBNYXRoLmFicyhvdmVyKTsKCQkJCW92ZXJwID0gTWF0aC5tYXgob3ZlciwgMCk7CgkJCX0KCQkJdmFyIHNibyA9IGluU3RyYXRlZ3lbdGhpcy5wb3NpdGlvbk1ldGhvZF0oKSAtIG92ZXI7CgkJCS8vIGNhbGMgc2l6ZSAmIHBvc2l0aW9uCgkJCXZhciBiZGMgPSBiZCAtIHRoaXMuY29ybmVyU2l6ZTsKCQkJdmFyIHMgPSBNYXRoLmZsb29yKChiZCAqIGJkIC8gc2JkKSAtIG92ZXJzKTsKCQkJcyA9IE1hdGgubWF4KHRoaXMubWluU2l6ZSwgcyk7CgkJCXZhciBwID0gTWF0aC5mbG9vcigoYmRjICogc2JvIC8gc2JkKSArIG92ZXJwKTsKCQkJcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGJkYyAtIHRoaXMubWluU2l6ZSwgcCkpOwoJCQkvLyBhcHBseSB0aHVtYiBzdHlsaW5nCgkJCXRoaXMubmVlZGVkID0gcyA8IGJkOwoJCQlpZiAodGhpcy5uZWVkZWQgJiYgdGhpcy5oYXNOb2RlKCkpIHsKCQkJCWlmICh0aGlzLl9wb3MgIT09IHApIHsKCQkJCQl0aGlzLl9wb3MgPSBwOwoJCQkJCWlmKCF0aGlzLnRyYW5zZm9ybSkgewoJCQkJCQkvL2FkanVzdCB0b3AvbGVmdCBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRyYW5zbGF0aW9ucwoJCQkJCQlpZih0aGlzLmF4aXM9PSJ2IikgewoJCQkJCQkJdGhpcy5zZXRCb3VuZHMoe3RvcDpwICsgInB4In0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdGhpcy5zZXRCb3VuZHMoe2xlZnQ6cCArICJweCJ9KTsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCWVueW8uZG9tLnRyYW5zZm9ybVZhbHVlKHRoaXMsIHRoaXMudHJhbnNsYXRpb24sIHAgKyAicHgiKTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAodGhpcy5fc2l6ZSAhPT0gcykgewoJCQkJCXRoaXMuX3NpemUgPSBzOwoJCQkJCXRoaXMubm9kZS5zdHlsZVtkXSA9IHRoaXMuZG9tU3R5bGVzW2RdID0gcyArICJweCI7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmhpZGUoKTsKCQkJfQoJCX0KCX0sCgkvLyBpbXBsZW1lbnQgc2V0IGJlY2F1c2Ugc2hvd2luZyBpcyBub3QgY2hhbmdlZCB3aGlsZQoJLy8gd2UgZGVsYXlIaWRlIGJ1dCB3ZSB3YW50IHRvIGNhbmNlbCB0aGUgaGlkZS4KCXNldFNob3dpbmc6IGZ1bmN0aW9uKGluU2hvd2luZykgewoJCWlmIChpblNob3dpbmcgJiYgaW5TaG93aW5nICE9IHRoaXMuc2hvd2luZykgewoJCQlpZiAodGhpcy5zY3JvbGxCb3VuZHNbdGhpcy5zaXplRGltZW5zaW9uXSA+PSB0aGlzLnNjcm9sbEJvdW5kc1t0aGlzLmRpbWVuc2lvbl0pIHsKCQkJCXJldHVybjsKCQkJfQoJCX0KCQlpZiAodGhpcy5oYXNOb2RlKCkpIHsKCQkJdGhpcy5jYW5jZWxEZWxheUhpZGUoKTsKCQl9CgkJaWYgKGluU2hvd2luZyAhPSB0aGlzLnNob3dpbmcpIHsKCQkJdmFyIGxhc3QgPSB0aGlzLnNob3dpbmc7CgkJCXRoaXMuc2hvd2luZyA9IGluU2hvd2luZzsKCQkJdGhpcy5zaG93aW5nQ2hhbmdlZChsYXN0KTsKCQl9Cgl9LAoJZGVsYXlIaWRlOiBmdW5jdGlvbihpbkRlbGF5KSB7CgkJaWYgKHRoaXMuc2hvd2luZykgewoJCQllbnlvLmpvYih0aGlzLmlkICsgImhpZGUiLCB0aGlzLmJpbmRTYWZlbHkoImhpZGUiKSwgaW5EZWxheSB8fCAwKTsKCQl9Cgl9LAoJY2FuY2VsRGVsYXlIaWRlOiBmdW5jdGlvbigpIHsKCQllbnlvLmpvYi5zdG9wKHRoaXMuaWQgKyAiaGlkZSIpOwoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/TouchScrollStrategy.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5Ub3VjaFNjcm9sbFN0cmF0ZWd5XyBpcyBhIGhlbHBlciBraW5kIGZvciBpbXBsZW1lbnRpbmcgYSB0b3VjaC1iYXNlZAoJc2Nyb2xsZXIuIEl0IGludGVncmF0ZXMgdGhlIHNjcm9sbGluZyBzaW11bGF0aW9uIHByb3ZpZGVkIGJ5Cgk8YSBocmVmPSIjZW55by5TY3JvbGxNYXRoIj5lbnlvLlNjcm9sbE1hdGg8L2E+IGludG8gYW4KCTxhIGhyZWY9IiNlbnlvLlNjcm9sbGVyIj5lbnlvLlNjcm9sbGVyPC9hPi4KCglfZW55by5Ub3VjaFNjcm9sbFN0cmF0ZWd5XyBpcyBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgaW4gYXBwbGljYXRpb24gY29kZS4KCUluc3RlYWQsIGl0IGlzIHNwZWNpZmllZCBhcyB0aGUgdmFsdWUgb2YgdGhlIGBzdHJhdGVneUtpbmRgIHByb3BlcnR5IG9mIGFuCglgZW55by5TY3JvbGxlcmAgb3IgPGEgaHJlZj0iI2VueW8uTGlzdCI+ZW55by5MaXN0PC9hPiwgb3IgaXMgdXNlZCBieSB0aGUKCWZyYW1ld29yayBpbXBsaWNpdGx5LgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uVG91Y2hTY3JvbGxTdHJhdGVneSIsCglraW5kOiAiU2Nyb2xsU3RyYXRlZ3kiLAoJLyoqCgkJSWYgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGUgc2Nyb2xsZXIgd2lsbCBvdmVyc2Nyb2xsIGFuZCBib3VuY2UgYmFjayBhdCB0aGUgZWRnZXMKCSovCglvdmVyc2Nyb2xsOiB0cnVlLAoJLyoqCgkJSWYgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGUgc2Nyb2xsZXIgd2lsbCBub3QgcHJvcGFnYXRlIF9kcmFnc3RhcnRfCgkJZXZlbnRzIHRoYXQgY2F1c2UgaXQgdG8gc3RhcnQgc2Nyb2xsaW5nCgkqLwoJcHJldmVudERyYWdQcm9wYWdhdGlvbjogdHJ1ZSwKCXB1Ymxpc2hlZDogewoJCS8qKgoJCQlTcGVjaWZpZXMgaG93IHRvIHZlcnRpY2FsbHkgc2Nyb2xsLiAgQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOgoKCQkJKiAic2Nyb2xsIjogQWx3YXlzIHNjcm9sbC4KCQkJKiAiYXV0byI6IFNjcm9sbCBvbmx5IGlmIHRoZSBjb250ZW50IG92ZXJmbG93cyB0aGUgc2Nyb2xsZXIuCgkJCSogImhpZGRlbiI6IE5ldmVyIHNjcm9sbC4KCQkJKiAiZGVmYXVsdCI6IEluIHRvdWNoIGVudmlyb25tZW50cywgdGhlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsaW5nCgkJCQliZWhhdmlvciBpcyB0byBhbHdheXMgc2Nyb2xsLiBJZiB0aGUgY29udGVudCBkb2VzIG5vdCBvdmVyZmxvdwoJCQkJdGhlIHNjcm9sbGVyLCB0aGUgc2Nyb2xsZXIgd2lsbCBvdmVyc2Nyb2xsIGFuZCBzbmFwIGJhY2suCgkJKi8KCQl2ZXJ0aWNhbDogImRlZmF1bHQiLAoJCS8qKgoJCQlTcGVjaWZpZXMgaG93IHRvIGhvcml6b250YWxseSBzY3JvbGwuICBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6CgoJCQkqICJzY3JvbGwiOiBBbHdheXMgc2Nyb2xsLgoJCQkqICJhdXRvIjogIFNjcm9sbCBvbmx5IGlmIHRoZSBjb250ZW50IG92ZXJmbG93cyB0aGUgc2Nyb2xsZXIuCgkJCSogImhpZGRlbiI6IE5ldmVyIHNjcm9sbC4KCQkJKiAiZGVmYXVsdCI6IFNhbWUgYXMgImF1dG8iLgoJCSovCgkJaG9yaXpvbnRhbDogImRlZmF1bHQiLAoJCS8vKiBTZXQgdG8gdHJ1ZSB0byBkaXNwbGF5IGEgc2Nyb2xsIHRodW1iCgkJdGh1bWI6IHRydWUsCgkJLyoqCgkJCVNldCB0byB0cnVlIHRvIGRpc3BsYXkgYSB0cmFuc3BhcmVudCBvdmVybGF5IHdoaWxlIHNjcm9sbGluZy4gVGhpcwoJCQljYW4gaGVscCBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIGNvbXBsZXgsIGxhcmdlIHNjcm9sbCByZWdpb25zIG9uCgkJCXNvbWUgcGxhdGZvcm1zIChlLmcuLCBBbmRyb2lkKS4KCQkqLwoJCXNjcmltOiBmYWxzZSwKCQkvLyoJQWxsb3cgZHJhZyBldmVudHMgc2VudCB3aGVuIGdlc3R1cmUgZXZlbnRzIGFyZSBoYXBwZW5pbmcgc2ltdWx0YW5lb3VzbHkKCQlkcmFnRHVyaW5nR2VzdHVyZTogdHJ1ZQoJfSwKCWV2ZW50czogewoJCW9uU2hvdWxkRHJhZzogIiIKCX0sCgkvLyogQHByb3RlY3RlZAoJaGFuZGxlcnM6IHsKCQlvbnNjcm9sbDogImRvbVNjcm9sbCIsCgkJb25mbGljazogImZsaWNrIiwKCQlvbmhvbGQ6ICJob2xkIiwKCQlvbmRyYWdzdGFydDogImRyYWdzdGFydCIsCgkJb25TaG91bGREcmFnOiAic2hvdWxkRHJhZyIsCgkJb25kcmFnOiAiZHJhZyIsCgkJb25kcmFnZmluaXNoOiAiZHJhZ2ZpbmlzaCIsCgkJb25tb3VzZXdoZWVsOiAibW91c2V3aGVlbCIKCX0sCgl0b29sczogWwoJCXtraW5kOiAiU2Nyb2xsTWF0aCIsIG9uU2Nyb2xsU3RhcnQ6ICJzY3JvbGxNYXRoU3RhcnQiLCBvblNjcm9sbDogInNjcm9sbE1hdGhTY3JvbGwiLCBvblNjcm9sbFN0b3A6ICJzY3JvbGxNYXRoU3RvcCJ9LAoJCXtuYW1lOiAidnRodW1iIiwga2luZDogIlNjcm9sbFRodW1iIiwgYXhpczogInYiLCBzaG93aW5nOiBmYWxzZX0sCgkJe25hbWU6ICJodGh1bWIiLCBraW5kOiAiU2Nyb2xsVGh1bWIiLCBheGlzOiAiaCIsIHNob3dpbmc6IGZhbHNlfQoJXSwKCXNjcmltVG9vbHM6IFt7bmFtZTogInNjcmltIiwgY2xhc3NlczogImVueW8tZml0Iiwgc3R5bGU6ICJ6LWluZGV4OiAxOyIsIHNob3dpbmc6IGZhbHNlfV0sCgljb21wb25lbnRzOiBbCgkJe25hbWU6ICJjbGllbnQiLCBjbGFzc2VzOiAiZW55by10b3VjaC1zY3JvbGxlciJ9CgldLAoJLy8gZmxhZyB0ZWxsaW5nIHVzIHdoZXRoZXIgdGhlIGxpc3QgaXMgY3VycmVudGx5IHJlb3JkZXJpbmcKCWxpc3RSZW9yZGVyaW5nOiBmYWxzZSwKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl0aGlzLnRyYW5zZm9ybSA9IGVueW8uZG9tLmNhblRyYW5zZm9ybSgpOwoJCWlmKCF0aGlzLnRyYW5zZm9ybSkgewoJCQlpZih0aGlzLm92ZXJzY3JvbGwpIHsKCQkJCS8vc28gd2UgY2FuIGFkanVzdCB0b3AvbGVmdCBpZiBicm93c2VyIGNhbid0IGhhbmRsZSB0cmFuc2xhdGlvbnMKCQkJCXRoaXMuJC5jbGllbnQuYXBwbHlTdHlsZSgicG9zaXRpb24iLCAicmVsYXRpdmUiKTsKCQkJfQoJCX0KCQl0aGlzLmFjY2VsID0gZW55by5kb20uY2FuQWNjZWxlcmF0ZSgpOwoJCXZhciBjb250YWluZXJDbGFzc2VzID0gImVueW8tdG91Y2gtc3RyYXRlZ3ktY29udGFpbmVyIjsKCQkvLyBub3RlOiBuZWVkZWQgZm9yIGlvcyB0byBhdm9pZCBpbmNvcnJlY3QgY2xpcHBpbmcgb2YgdGh1bWIKCQkvLyBhbmQgbmVlZCB0byBhdm9pZCBvbiBBbmRyb2lkIGFzIGl0IGNhdXNlcyBwcm9ibGVtcyBoaWRpbmcgdGhlIHRodW1iCgkJaWYgKGVueW8ucGxhdGZvcm0uaW9zICYmIHRoaXMuYWNjZWwpIHsKCQkJY29udGFpbmVyQ2xhc3NlcyArPSAiIGVueW8tY29tcG9zaXRlIjsKCQl9CgkJdGhpcy5zY3JpbUNoYW5nZWQoKTsKCQl0aGlzLmNvbnRhaW5lci5hZGRDbGFzcyhjb250YWluZXJDbGFzc2VzKTsKCQl0aGlzLnRyYW5zbGF0aW9uID0gdGhpcy5hY2NlbCA/ICJ0cmFuc2xhdGUzZCIgOiAidHJhbnNsYXRlIjsKCX0sCglpbml0Q29tcG9uZW50czogZnVuY3Rpb24oKSB7CgkJdGhpcy5jcmVhdGVDaHJvbWUodGhpcy50b29scyk7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygiZW55by10b3VjaC1zdHJhdGVneS1jb250YWluZXIiKTsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCXJlbmRlcmVkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCWVueW8ubWFrZUJ1YmJsZSh0aGlzLiQuY2xpZW50LCAic2Nyb2xsIik7CgkJdGhpcy5jYWxjQm91bmRhcmllcygpOwoJCXRoaXMuc3luY1Njcm9sbE1hdGgoKTsKCQlpZiAodGhpcy50aHVtYikgewoJCQl0aGlzLmFsZXJ0VGh1bWJzKCk7CgkJfQoJfSwKCXNjcmltQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuc2NyaW0gJiYgIXRoaXMuJC5zY3JpbSkgewoJCQl0aGlzLm1ha2VTY3JpbSgpOwoJCX0KCQlpZiAoIXRoaXMuc2NyaW0gJiYgdGhpcy4kLnNjcmltKSB7CgkJCXRoaXMuJC5zY3JpbS5kZXN0cm95KCk7CgkJfQoJfSwKCW1ha2VTY3JpbTogZnVuY3Rpb24oKSB7CgkJLy8gcmVzZXQgY29udHJvbCBwYXJlbnQgc28gc2NyaW0gZG9lc24ndCBnbyBpbnRvIGNsaWVudC4KCQl2YXIgY3AgPSB0aGlzLmNvbnRyb2xQYXJlbnQ7CgkJdGhpcy5jb250cm9sUGFyZW50ID0gbnVsbDsKCQl0aGlzLmNyZWF0ZUNocm9tZSh0aGlzLnNjcmltVG9vbHMpOwoJCXRoaXMuY29udHJvbFBhcmVudCA9IGNwOwoJCXZhciBjbiA9IHRoaXMuY29udGFpbmVyLmhhc05vZGUoKTsKCQkvLyByZW5kZXIgc2NyaW0gaW4gY29udGFpbmVyLCBzdHJhdGVneSBoYXMgbm8gZG9tLgoJCWlmIChjbikgewoJCQl0aGlzLiQuc2NyaW0ucGFyZW50Tm9kZSA9IGNuOwoJCQl0aGlzLiQuc2NyaW0ucmVuZGVyKCk7CgkJfQoJfSwKCS8vKiBXaGV0aGVyIG9yIG5vdCB0aGUgc2Nyb2xsZXIgaXMgYWN0aXZlbHkgbW92aW5nCglpc1Njcm9sbGluZzogZnVuY3Rpb24oKSB7CgkJdmFyIG0gPSB0aGlzLiQuc2Nyb2xsTWF0aDsKCQlyZXR1cm4gbSA/IG0uaXNTY3JvbGxpbmcoKSA6IHRoaXMuc2Nyb2xsaW5nOwoJfSwKCS8vKiBXaGV0aGVyIG9yIG5vdCB0aGUgc2Nyb2xsZXIgaXMgaW4gb3ZlcnNjcm9sbGluZwoJaXNPdmVyc2Nyb2xsaW5nOiBmdW5jdGlvbigpIHsKCQl2YXIgbSA9IHRoaXMuJC5zY3JvbGxNYXRoIHx8IHRoaXM7CgkJcmV0dXJuICh0aGlzLm92ZXJzY3JvbGwpID8gbS5pc0luT3ZlclNjcm9sbCgpIDogZmFsc2U7Cgl9LAoJZG9tU2Nyb2xsOiBmdW5jdGlvbigpIHsKCQlpZiAoIXRoaXMuaXNTY3JvbGxpbmcoKSkgewoJCQl0aGlzLmNhbGNCb3VuZGFyaWVzKCk7CgkJCXRoaXMuc3luY1Njcm9sbE1hdGgoKTsKCQkJaWYgKHRoaXMudGh1bWIpIHsKCQkJCXRoaXMuYWxlcnRUaHVtYnMoKTsKCQkJfQoJCX0KCX0sCglob3Jpem9udGFsQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLnNjcm9sbE1hdGguaG9yaXpvbnRhbCA9ICh0aGlzLmhvcml6b250YWwgIT0gImhpZGRlbiIpOwoJfSwKCXZlcnRpY2FsQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLnNjcm9sbE1hdGgudmVydGljYWwgPSAodGhpcy52ZXJ0aWNhbCAhPSAiaGlkZGVuIik7Cgl9LAoJbWF4SGVpZ2h0Q2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy4kLmNsaWVudC5hcHBseVN0eWxlKCJtYXgtaGVpZ2h0IiwgdGhpcy5tYXhIZWlnaHQpOwoJCS8vIG5vdGU6IHByZXZpb3VzbHkgdXNlZCBlbnlvLWZpdCBoZXJlIGJ1dCBJRSB3b3VsZCByZXNldCBzY3JvbGwgcG9zaXRpb24gd2hlbiB0aGUgc2Nyb2xsIHRodW1iCgkJLy8gd2FzIGhpZGRlbjsgaW4gZ2VuZXJhbCBJRSByZXNldHMgc2Nyb2xsVG9wIHdoZW4gdGhlcmUgYXJlIDIgYWJzIHBvc2l0aW9uIHNpYmxpbmdzLCBvbmUgaGFzCgkJLy8gc2Nyb2xsVG9wIGFuZCB0aGUgb3RoZXIgaXMgaGlkZGVuLgoJCXRoaXMuJC5jbGllbnQuYWRkUmVtb3ZlQ2xhc3MoImVueW8tc2Nyb2xsZWUtZml0IiwgIXRoaXMubWF4SGVpZ2h0KTsKCX0sCgl0aHVtYkNoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGlkZVRodW1icygpOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmlzU2Nyb2xsaW5nKCkpIHsKCQkJdGhpcy4kLnNjcm9sbE1hdGguc3RvcCh0cnVlKTsKCQl9Cgl9LAoJc3RhYmlsaXplOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLiQuc2Nyb2xsTWF0aCkgewoJCQl0aGlzLiQuc2Nyb2xsTWF0aC5zdGFiaWxpemUoKTsKCQl9Cgl9LAoJLy8qIFNjcm9sbHMgdG8gc3BlY2lmaWMgeC95IHBvc2l0aW9ucyB3aXRoaW4gdGhlIHNjcm9sbCBhcmVhLgoJc2Nyb2xsVG86IGZ1bmN0aW9uKGluWCwgaW5ZKSB7CgkJdGhpcy5zdG9wKCk7CgkJdGhpcy4kLnNjcm9sbE1hdGguc2Nyb2xsVG8oaW5YLCBpblkgfHwgaW5ZID09PSAwID8gaW5ZIDogbnVsbCk7Cgl9LAoJc2Nyb2xsSW50b1ZpZXc6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3RvcCgpOwoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJLy8qIFNldHMgdGhlIGxlZnQgc2Nyb2xsIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2Nyb2xsZXIuCglzZXRTY3JvbGxMZWZ0OiBmdW5jdGlvbigpIHsKCQl0aGlzLnN0b3AoKTsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCS8vKiBTZXRzIHRoZSB0b3Agc2Nyb2xsIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2Nyb2xsZXIuCglzZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3RvcCgpOwoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJLy8qIEdldHMgdGhlIGxlZnQgc2Nyb2xsIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2Nyb2xsZXIuCglnZXRTY3JvbGxMZWZ0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5pc1Njcm9sbGluZygpID8gdGhpcy5zY3JvbGxMZWZ0IDogdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCgkvLyogR2V0cyB0aGUgdG9wIHNjcm9sbCBwb3NpdGlvbiB3aXRoaW4gdGhlIHNjcm9sbGVyLgoJZ2V0U2Nyb2xsVG9wOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5pc1Njcm9sbGluZygpID8gdGhpcy5zY3JvbGxUb3AgOiB0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCWNhbGNTY3JvbGxOb2RlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy4kLmNsaWVudC5oYXNOb2RlKCk7Cgl9LAoJY2FsY0F1dG9TY3JvbGxpbmc6IGZ1bmN0aW9uKCkgewoJCXZhciB2ID0gKHRoaXMudmVydGljYWwgPT0gImF1dG8iKTsKCQl2YXIgaCA9ICh0aGlzLmhvcml6b250YWwgPT0gImF1dG8iKSB8fCAodGhpcy5ob3Jpem9udGFsID09ICJkZWZhdWx0Iik7CgkJaWYgKCh2IHx8IGgpICYmIHRoaXMuc2Nyb2xsTm9kZSkgewoJCQl2YXIgYiA9IHRoaXMuZ2V0U2Nyb2xsQm91bmRzKCk7CgkJCWlmICh2KSB7CgkJCQl0aGlzLiQuc2Nyb2xsTWF0aC52ZXJ0aWNhbCA9IGIuaGVpZ2h0ID4gYi5jbGllbnRIZWlnaHQ7CgkJCX0KCQkJaWYgKGgpIHsKCQkJCXRoaXMuJC5zY3JvbGxNYXRoLmhvcml6b250YWwgPSBiLndpZHRoID4gYi5jbGllbnRXaWR0aDsKCQkJfQoJCX0KCX0sCglzaG91bGREcmFnOiBmdW5jdGlvbihpblNlbmRlciwgZSkgewoJCXRoaXMuY2FsY0F1dG9TY3JvbGxpbmcoKTsKCQl2YXIgcmVxdWVzdFYgPSBlLnZlcnRpY2FsOwoJCXZhciBjYW5IID0gdGhpcy4kLnNjcm9sbE1hdGguaG9yaXpvbnRhbCAmJiAhcmVxdWVzdFY7CgkJdmFyIGNhblYgPSB0aGlzLiQuc2Nyb2xsTWF0aC52ZXJ0aWNhbCAmJiByZXF1ZXN0VjsKCQl2YXIgZG93biA9IGUuZHkgPCAwLCByaWdodCA9IGUuZHggPCAwOwoJCXZhciBvb2JWID0gKCFkb3duICYmIHRoaXMuc3RhcnRFZGdlcy50b3AgfHwgZG93biAmJiB0aGlzLnN0YXJ0RWRnZXMuYm90dG9tKTsKCQl2YXIgb29iSCA9ICghcmlnaHQgJiYgdGhpcy5zdGFydEVkZ2VzLmxlZnQgfHwgcmlnaHQgJiYgdGhpcy5zdGFydEVkZ2VzLnJpZ2h0KTsKCQkvLyB3ZSB3b3VsZCBzY3JvbGwgaWYgbm90IGF0IGEgYm91bmRhcnkKCQlpZiAoIWUuYm91bmRhcnlEcmFnZ2VyICYmIChjYW5IIHx8IGNhblYpKSB7CgkJCWUuYm91bmRhcnlEcmFnZ2VyID0gdGhpczsKCQl9CgkJLy8gaW5jbHVkZSBib3VuZGFyeSBleGNsdXNpb24KCQlpZiAoKCFvb2JWICYmIGNhblYpIHx8ICghb29iSCAmJiBjYW5IKSkgewoJCQllLmRyYWdnZXIgPSB0aGlzOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9LAoJZmxpY2s6IGZ1bmN0aW9uKGluU2VuZGVyLCBlKSB7CgkJdmFyIG9uQXhpcyA9IE1hdGguYWJzKGUueFZlbG9jaXR5KSA+IE1hdGguYWJzKGUueVZlbG9jaXR5KSA/IHRoaXMuJC5zY3JvbGxNYXRoLmhvcml6b250YWwgOiB0aGlzLiQuc2Nyb2xsTWF0aC52ZXJ0aWNhbDsKCQlpZiAob25BeGlzICYmIHRoaXMuZHJhZ2dpbmcpIHsKCQkJdGhpcy4kLnNjcm9sbE1hdGguZmxpY2soZSk7CgkJCXJldHVybiB0aGlzLnByZXZlbnREcmFnUHJvcGFnYXRpb247CgkJfQoJfSwKCWhvbGQ6IGZ1bmN0aW9uKGluU2VuZGVyLCBlKSB7CgkJaWYgKHRoaXMuaXNTY3JvbGxpbmcoKSAmJiAhdGhpcy5pc092ZXJzY3JvbGxpbmcoKSkgewoJCQl2YXIgbSA9IHRoaXMuJC5zY3JvbGxNYXRoIHx8IHRoaXM7CgkJCW0uc3RvcChlKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfSwKCW1vdmU6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7Cgl9LAoJLy8gU3BlY2lhbCBzeW50aGV0aWMgRE9NIGV2ZW50cyBzZXJ2ZWQgdXAgYnkgdGhlIEdlc3R1cmUgc3lzdGVtCglkcmFnc3RhcnQ6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJLy8gSWdub3JlIGRyYWdzIHNlbnQgZnJvbSBtdWx0aS10b3VjaCBldmVudHMKCQlpZighdGhpcy5kcmFnRHVyaW5nR2VzdHVyZSAmJiBpbkV2ZW50LnNyY0V2ZW50LnRvdWNoZXMgJiYgaW5FdmVudC5zcmNFdmVudC50b3VjaGVzLmxlbmd0aCA+IDEpIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCS8vIG5vdGU6IGFsbG93IGRyYWdzIHRvIHByb3BhZ2F0ZSB0byBwYXJlbnQgc2Nyb2xsZXJzIHZpYSBkYXRhIHJldHVybmVkIGluIHRoZSBzaG91bGREcmFnIGV2ZW50LgoJCXRoaXMuZG9TaG91bGREcmFnKGluRXZlbnQpOwoJCXRoaXMuZHJhZ2dpbmcgPSAoaW5FdmVudC5kcmFnZ2VyID09IHRoaXMgfHwgKCFpbkV2ZW50LmRyYWdnZXIgJiYgaW5FdmVudC5ib3VuZGFyeURyYWdnZXIgPT0gdGhpcykpOwoJCWlmICh0aGlzLmRyYWdnaW5nKSB7CgkJCWluRXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJLy8gbm90ZTogbmVlZGVkIGJlY2F1c2Ugc2hvdy9oaWRlIGNoYW5nZXMKCQkJLy8gdGhlIHBvc2l0aW9uIHNvIHN5bmMnaW5nIGlzIHJlcXVpcmVkIHdoZW4KCQkJLy8gZHJhZ2dpbmcgYmVnaW5zIChuZWVkZWQgYmVjYXVzZSBzaG93L2hpZGUgZG9lcyBub3QgdHJpZ2dlciBvbnNjcm9sbCkKCQkJdGhpcy5zeW5jU2Nyb2xsTWF0aCgpOwoJCQl0aGlzLiQuc2Nyb2xsTWF0aC5zdGFydERyYWcoaW5FdmVudCk7CgkJCWlmICh0aGlzLnByZXZlbnREcmFnUHJvcGFnYXRpb24pIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJfSwKCWRyYWc6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJLy8gaWYgdGhlIGxpc3QgaXMgZG9pbmcgYSByZW9yZGVyLCBkb24ndCBzY3JvbGwKCQlpZih0aGlzLmxpc3RSZW9yZGVyaW5nKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaWYgKHRoaXMuZHJhZ2dpbmcpIHsKCQkJaW5FdmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQl0aGlzLiQuc2Nyb2xsTWF0aC5kcmFnKGluRXZlbnQpOwoJCQlpZiAodGhpcy5zY3JpbSkgewoJCQkJdGhpcy4kLnNjcmltLnNob3coKTsKCQkJfQoJCX0KCX0sCglkcmFnZmluaXNoOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCWlmICh0aGlzLmRyYWdnaW5nKSB7CgkJCWluRXZlbnQucHJldmVudFRhcCgpOwoJCQl0aGlzLiQuc2Nyb2xsTWF0aC5kcmFnRmluaXNoKCk7CgkJCXRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsKCQkJaWYgKHRoaXMuc2NyaW0pIHsKCQkJCXRoaXMuJC5zY3JpbS5oaWRlKCk7CgkJCX0KCQl9Cgl9LAoJbW91c2V3aGVlbDogZnVuY3Rpb24oaW5TZW5kZXIsIGUpIHsKCQlpZiAoIXRoaXMuZHJhZ2dpbmcgJiYgdGhpcy51c2VNb3VzZVdoZWVsKSB7CgkJCXRoaXMuY2FsY0JvdW5kYXJpZXMoKTsKCQkJdGhpcy5zeW5jU2Nyb2xsTWF0aCgpOwoJCQl0aGlzLnN0YWJpbGl6ZSgpOwoJCQlpZiAodGhpcy4kLnNjcm9sbE1hdGgubW91c2V3aGVlbChlKSkgewoJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9Cgl9LAoJc2Nyb2xsTWF0aFN0YXJ0OiBmdW5jdGlvbihpblNlbmRlcikgewoJCWlmICh0aGlzLnNjcm9sbE5vZGUpIHsKCQkJdGhpcy5jYWxjQm91bmRhcmllcygpOwoJCQlpZiAodGhpcy50aHVtYikgewoJCQkJdGhpcy5zaG93VGh1bWJzKCk7CgkJCX0KCQl9Cgl9LAoJc2Nyb2xsTWF0aFNjcm9sbDogZnVuY3Rpb24oaW5TZW5kZXIpIHsKCQlpZighdGhpcy5vdmVyc2Nyb2xsKSB7CgkJCS8vZG9uJ3Qgb3ZlcnNjcm9sbCBwYXN0IGVkZ2VzCgkJCXRoaXMuZWZmZWN0U2Nyb2xsKC1NYXRoLm1pbihpblNlbmRlci5sZWZ0Qm91bmRhcnksIE1hdGgubWF4KGluU2VuZGVyLnJpZ2h0Qm91bmRhcnksIGluU2VuZGVyLngpKSwKCQkJCQktTWF0aC5taW4oaW5TZW5kZXIudG9wQm91bmRhcnksIE1hdGgubWF4KGluU2VuZGVyLmJvdHRvbUJvdW5kYXJ5LCBpblNlbmRlci55KSkpOwoJCX0gZWxzZSB7CgkJCXRoaXMuZWZmZWN0U2Nyb2xsKC1pblNlbmRlci54LCAtaW5TZW5kZXIueSk7CgkJfQoJCWlmICh0aGlzLnRodW1iKSB7CgkJCXRoaXMudXBkYXRlVGh1bWJzKCk7CgkJfQoJfSwKCXNjcm9sbE1hdGhTdG9wOiBmdW5jdGlvbihpblNlbmRlcikgewoJCXRoaXMuZWZmZWN0U2Nyb2xsU3RvcCgpOwoJCWlmICh0aGlzLnRodW1iKSB7CgkJCXRoaXMuZGVsYXlIaWRlVGh1bWJzKDEwMCk7CgkJfQoJfSwKCWNhbGNCb3VuZGFyaWVzOiBmdW5jdGlvbigpIHsKCQl2YXIgcyA9IHRoaXMuJC5zY3JvbGxNYXRoIHx8IHRoaXMsIGIgPSB0aGlzLl9nZXRTY3JvbGxCb3VuZHMoKTsKCQlzLmJvdHRvbUJvdW5kYXJ5ID0gYi5jbGllbnRIZWlnaHQgLSBiLmhlaWdodDsKCQlzLnJpZ2h0Qm91bmRhcnkgPSBiLmNsaWVudFdpZHRoIC0gYi53aWR0aDsKCX0sCglzeW5jU2Nyb2xsTWF0aDogZnVuY3Rpb24oKSB7CgkJdmFyIG0gPSB0aGlzLiQuc2Nyb2xsTWF0aDsKCQlpZihtKSB7CgkJCW0uc2V0U2Nyb2xsWCgtdGhpcy5nZXRTY3JvbGxMZWZ0KCkpOwoJCQltLnNldFNjcm9sbFkoLXRoaXMuZ2V0U2Nyb2xsVG9wKCkpOwoJCX0KCX0sCgllZmZlY3RTY3JvbGw6IGZ1bmN0aW9uKGluWCwgaW5ZKSB7CgkJaWYgKHRoaXMuc2Nyb2xsTm9kZSkgewoJCQl0aGlzLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbE5vZGUuc2Nyb2xsTGVmdCA9IGluWDsKCQkJdGhpcy5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbE5vZGUuc2Nyb2xsVG9wID0gaW5ZOwoJCQl0aGlzLmVmZmVjdE92ZXJzY3JvbGwoTWF0aC5yb3VuZChpblgpLCBNYXRoLnJvdW5kKGluWSkpOwoJCX0KCX0sCgllZmZlY3RTY3JvbGxTdG9wOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVmZmVjdE92ZXJzY3JvbGwobnVsbCwgbnVsbCk7Cgl9LAoJZWZmZWN0T3ZlcnNjcm9sbDogZnVuY3Rpb24oaW5YLCBpblkpIHsKCQl2YXIgbiA9IHRoaXMuc2Nyb2xsTm9kZTsKCQl2YXIgeCA9ICIwIiwgeSA9ICIwIiwgeiA9IHRoaXMuYWNjZWwgPyAiLDAiIDogIiI7CgkJaWYgKGluWSAhPT0gbnVsbCAmJiBNYXRoLmFicyhpblkgLSBuLnNjcm9sbFRvcCkgPiAxKSB7CgkJCXkgPSAobi5zY3JvbGxUb3AgLSBpblkpOwoJCX0KCQlpZiAoaW5YICE9PSBudWxsICYmIE1hdGguYWJzKGluWCAtIG4uc2Nyb2xsTGVmdCkgPiAxKSB7CgkJCXggPSAobi5zY3JvbGxMZWZ0IC0gaW5YKTsKCQl9CgkJaWYoIXRoaXMudHJhbnNmb3JtKSB7CgkJCS8vYWRqdXN0IHRvcC9sZWZ0IGlmIGJyb3dzZXIgY2FuJ3QgaGFuZGxlIHRyYW5zbGF0aW9ucwoJCQl0aGlzLiQuY2xpZW50LnNldEJvdW5kcyh7bGVmdDp4ICsgInB4IiwgdG9wOnkgKyAicHgifSk7CgkJfSBlbHNlIHsKCQkJZW55by5kb20udHJhbnNmb3JtVmFsdWUodGhpcy4kLmNsaWVudCwgdGhpcy50cmFuc2xhdGlvbiwgeCArICJweCwgIiArIHkgKyAicHgiICsgeik7CgkJfQoJfSwKCS8vKiBSZXR1cm5zIHRoZSB2YWx1ZXMgb2YgX292ZXJsZWZ0XyBhbmQgX292ZXJ0b3BfLCBpZiBhbnkuCglnZXRPdmVyU2Nyb2xsQm91bmRzOiBmdW5jdGlvbigpIHsKCQl2YXIgbSA9IHRoaXMuJC5zY3JvbGxNYXRoIHx8IHRoaXM7CgkJcmV0dXJuIHsKCQkJb3ZlcmxlZnQ6IE1hdGgubWluKG0ubGVmdEJvdW5kYXJ5IC0gbS54LCAwKSB8fCBNYXRoLm1heChtLnJpZ2h0Qm91bmRhcnkgLSBtLngsIDApLAoJCQlvdmVydG9wOiBNYXRoLm1pbihtLnRvcEJvdW5kYXJ5IC0gbS55LCAwKSB8fCBNYXRoLm1heChtLmJvdHRvbUJvdW5kYXJ5IC0gbS55LCAwKQoJCX07Cgl9LAoJX2dldFNjcm9sbEJvdW5kczogZnVuY3Rpb24oKSB7CgkJdmFyIHIgPSB0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCWVueW8ubWl4aW4ociwgdGhpcy5nZXRPdmVyU2Nyb2xsQm91bmRzKCkpOwoJCXJldHVybiByOwoJfSwKCWdldFNjcm9sbEJvdW5kczogZnVuY3Rpb24oKSB7CgkJdGhpcy5zdG9wKCk7CgkJcmV0dXJuIHRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJLy8gVGh1bWIgcHJvY2Vzc2luZwoJYWxlcnRUaHVtYnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2hvd1RodW1icygpOwoJCXRoaXMuZGVsYXlIaWRlVGh1bWJzKDUwMCk7Cgl9LAoJLy8qIFN5bmNzIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBzY3JvbGwgaW5kaWNhdG9ycy4KCXN5bmNUaHVtYnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuJC52dGh1bWIuc3luYyh0aGlzKTsKCQl0aGlzLiQuaHRodW1iLnN5bmModGhpcyk7Cgl9LAoJdXBkYXRlVGh1bWJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLiQudnRodW1iLnVwZGF0ZSh0aGlzKTsKCQl0aGlzLiQuaHRodW1iLnVwZGF0ZSh0aGlzKTsKCX0sCgkvLyogU3luY3MgYW5kIHNob3dzIGJvdGggdGhlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHNjcm9sbCBpbmRpY2F0b3JzLgoJc2hvd1RodW1iczogZnVuY3Rpb24oKSB7CgkJdGhpcy5zeW5jVGh1bWJzKCk7CgkJaWYgKHRoaXMuaG9yaXpvbnRhbCAhPSAiaGlkZGVuIikgewoJCQl0aGlzLiQuaHRodW1iLnNob3coKTsKCQl9CgkJaWYgKHRoaXMudmVydGljYWwgIT0gImhpZGRlbiIpIHsKCQkJdGhpcy4kLnZ0aHVtYi5zaG93KCk7CgkJfQoJfSwKCS8vKiBIaWRlcyB0aGUgdmVydGljYWwgYW5kIGhvcml6b250YWwgc2Nyb2xsIGluZGljYXRvcnMuCgloaWRlVGh1bWJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLiQudnRodW1iLmhpZGUoKTsKCQl0aGlzLiQuaHRodW1iLmhpZGUoKTsKCX0sCgkvLyogSGlkZXMgdGhlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHNjcm9sbCBpbmRpY2F0b3JzIGFzeW5jaHJvbm91c2x5LgoJZGVsYXlIaWRlVGh1bWJzOiBmdW5jdGlvbihpbkRlbGF5KSB7CgkJdGhpcy4kLnZ0aHVtYi5kZWxheUhpZGUoaW5EZWxheSk7CgkJdGhpcy4kLmh0aHVtYi5kZWxheUhpZGUoaW5EZWxheSk7Cgl9Cn0pOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/TransitionScrollStrategy.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5UcmFuc2l0aW9uU2Nyb2xsU3RyYXRlZ3lfIGlzIGEgaGVscGVyIGtpbmQgdGhhdCBleHRlbmRzCgk8YSBocmVmPSIjZW55by5Ub3VjaFNjcm9sbFN0cmF0ZWd5Ij5lbnlvLlRvdWNoU2Nyb2xsU3RyYXRlZ3k8L2E+LCBvcHRpbWl6aW5nCglpdCBmb3Igc2Nyb2xsaW5nIGVudmlyb25tZW50cyBpbiB3aGljaCBlZmZlY3Rpbmcgc2Nyb2xsIGNoYW5nZXMgd2l0aAoJdHJhbnNmb3JtcyB1c2luZyBDU1MgdHJhbnNpdGlvbnMgaXMgZmFzdGVzdC4KCglfZW55by5UcmFuc2l0aW9uU2Nyb2xsU3RyYXRlZ3lfIGlzIG5vdCB0eXBpY2FsbHkgY3JlYXRlZCBpbiBhcHBsaWNhdGlvbiBjb2RlLgoJSW5zdGVhZCwgaXQgaXMgc3BlY2lmaWVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgYHN0cmF0ZWd5S2luZGAgcHJvcGVydHkgb2YgYW4KCWBlbnlvLlNjcm9sbGVyYCBvciA8YSBocmVmPSIjZW55by5MaXN0Ij5lbnlvLkxpc3Q8L2E+LCBvciBpcyB1c2VkIGJ5IHRoZQoJZnJhbWV3b3JrIGltcGxpY2l0bHkuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5UcmFuc2l0aW9uU2Nyb2xsU3RyYXRlZ3kiLAoJa2luZDogImVueW8uVG91Y2hTY3JvbGxTdHJhdGVneSIsCgkvLyogQHByb3RlY3RlZAoJY29tcG9uZW50czogWwoJCXtuYW1lOiAiY2xpZW50Q29udGFpbmVyIiwgY2xhc3NlczogImVueW8tdG91Y2gtc2Nyb2xsZXIiLCBjb21wb25lbnRzOiBbCgkJCXtuYW1lOiAiY2xpZW50In0KCQldfQoJXSwKCWV2ZW50czogewoJCW9uU2Nyb2xsU3RhcnQ6ICIiLAoJCW9uU2Nyb2xsOiAiIiwKCQlvblNjcm9sbFN0b3A6ICIiCgl9LAoJaGFuZGxlcnM6IHsKCQlvbmRvd246ICJkb3duIiwKCQlvbmRyYWdmaW5pc2g6ICJkcmFnZmluaXNoIiwKCQlvbndlYmtpdFRyYW5zaXRpb25FbmQ6ICJ0cmFuc2l0aW9uQ29tcGxldGUiCgl9LAoJLy8qIE5vIHNjcm9sbE1hdGggdG9vbCBmb3IgdGhpcyBzdHJhdGVneQoJdG9vbHM6IFsKCQl7bmFtZTogInZ0aHVtYiIsIGtpbmQ6ICJTY3JvbGxUaHVtYiIsIGF4aXM6ICJ2Iiwgc2hvd2luZzogdHJ1ZX0sCgkJe25hbWU6ICJodGh1bWIiLCBraW5kOiAiU2Nyb2xsVGh1bWIiLCBheGlzOiAiaCIsIHNob3dpbmc6IGZhbHNlfQoJXSwKCS8vKiBTY2FsYXIgYXBwbGllZCB0byAnZmxpY2snIGV2ZW50IHZlbG9jaXR5CglrRmxpY2tTY2FsYXI6IDYwMCwKCS8vKiBUb3Agc25hcCBib3VuZGFyeSwgZ2VuZXJhbGx5IDAKCXRvcEJvdW5kYXJ5OiAwLAoJLy8qIFJpZ2h0IHNuYXAgYm91bmRhcnksIGdlbmVyYWxseSAodmlld3BvcnQgd2lkdGggLSBjb250ZW50IHdpZHRoKQoJcmlnaHRCb3VuZGFyeTogMCwKCS8vKiBCb3R0b20gc25hcCBib3VuZGFyeSwgZ2VuZXJhbGx5ICh2aWV3cG9ydCBoZWlnaHQgLSBjb250ZW50IGhlaWdodCkKCWJvdHRvbUJvdW5kYXJ5OiAwLAoJLy8qIExlZnQgc25hcCBib3VuZGFyeSwgZ2VuZXJhbGx5IDAKCWxlZnRCb3VuZGFyeTogMCwKCS8vKiBGbGFnIHRvIHNwZWNpZnkgd2hldGhlciBzY3JvbGxpbmcgaXMgaW4gcHJvZ3Jlc3MKCXNjcm9sbGluZzogZmFsc2UsCgkvLyogRXZlbnQgbGlzdGVuZXIgZm9yIHdlYmtpdCB0cmFuc2l0aW9uIGNvbXBsZXRpb24KCWxpc3RlbmVyOiBudWxsLAoJLy8qIFggRGlzdGFuY2UgdG8gc2Nyb2xsIGludG8gb3ZlcnNjcm9sbCBzcGFjZSBiZWZvcmUgYm91bmNpbmcgYmFjawoJYm91bmRhcnlYOjAsCgkvLyogWSBEaXN0YW5jZSB0byBzY3JvbGwgaW50byBvdmVyc2Nyb2xsIHNwYWNlIGJlZm9yZSBib3VuY2luZyBiYWNrCglib3VuZGFyeVk6MCwKCS8vKiBUaW1lb3V0IHVzZWQgdG8gc3RvcCBzY3JvbGxpbmcgb24gbW91c2Vkb3duCglzdG9wVGltZW91dDogbnVsbCwKCS8vKiBNUyBkZWxheSB1c2VkIHRvIHN0b3Agc2Nyb2xsaW5nIG9uIG1vdXNlZG93bgoJc3RvcFRpbWVvdXRNUzogODAsCgkvLyogSW50ZXJ2YWwgdXNlZCB0byB1cGRhdGUgc2Nyb2xsIHZhbHVlcyBhbmQgYnViYmxlIHNjcm9sbCBldmVudHMgZHVyaW5nIHNjcm9sbCBhbmltYXRpb24KCXNjcm9sbEludGVydmFsOiBudWxsLAoJLy8qIE1TIGRlbGF5IHVzZWQgdG8gdXBkYXRlIHNjcm9sbCB2YWx1ZXMgYW5kIGJ1YmJsZSBzY3JvbGwgZXZlbnRzIGR1cmluZyBzY3JvbGwgYW5pbWF0aW9uCglzY3JvbGxJbnRlcnZhbE1TOiA1MCwKCS8vKiBUcmFuc2l0aW9uIGFuaW1hdGlvbnMKCXRyYW5zaXRpb25zOiB7CgkJLy8qIE5vbmUgLSB1c2VkIGZvciBkcmFnZ2luZywgZXRjLgoJCW5vbmUgICA6ICIiLAoJCS8vKiBTY3JvbGwgLSBiYXNpYyBzY3JvbGxpbmcgYmVoYXZpb3IKCQlzY3JvbGwgOiAiMy44cyBjdWJpYy1iZXppZXIoLjE5LDEsLjI4LDEuMCkgMHMiLAoJCS8vKiBCb3VuY2UgLSBvdmVyc2Nyb2xsIGJvdW5jZWJhY2sgYmVoYXZpb3IKCQlib3VuY2UgOiAiMC41cyBjdWJpYy1iZXppZXIoMC4wNiwuNSwuNSwuOTQpIDBzIgoJfSwKCgkvLyogQHB1YmxpYwoKCS8vKiBTZXRzIHRoZSBsZWZ0IHNjcm9sbCBwb3NpdGlvbiB3aXRoaW4gdGhlIHNjcm9sbGVyLgoJc2V0U2Nyb2xsTGVmdDogZnVuY3Rpb24oaW5MZWZ0KSB7CgkJdmFyIHByZXZMZWZ0ID0gdGhpcy5zY3JvbGxMZWZ0OwoJCXRoaXMuc3RvcCgpOwoJCXRoaXMuc2Nyb2xsTGVmdCA9IGluTGVmdDsKCQlpZih0aGlzLmlzSW5MZWZ0T3ZlclNjcm9sbCgpIHx8IHRoaXMuaXNJblJpZ2h0T3ZlclNjcm9sbCgpKSB7CgkJCXRoaXMuc2Nyb2xsTGVmdCA9IHByZXZMZWZ0OwoJCX0KCQl0aGlzLmVmZmVjdFNjcm9sbCgpOwoJfSwKCS8vKiBTZXRzIHRoZSB0b3Agc2Nyb2xsIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2Nyb2xsZXIuCglzZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKGluVG9wKSB7CgkJdmFyIHByZXZUb3AgPSB0aGlzLnNjcm9sbFRvcDsKCQl0aGlzLnN0b3AoKTsKCQl0aGlzLnNjcm9sbFRvcCA9IGluVG9wOwoJCWlmKHRoaXMuaXNJblRvcE92ZXJTY3JvbGwoKSB8fCB0aGlzLmlzSW5Cb3R0b21PdmVyU2Nyb2xsKCkpIHsKCQkJdGhpcy5zY3JvbGxUb3AgPSBwcmV2VG9wOwoJCX0KCQl0aGlzLmVmZmVjdFNjcm9sbCgpOwoJfSwKCXNldFNjcm9sbFg6IGZ1bmN0aW9uKGluTGVmdCkgewoJCXRoaXMuc2Nyb2xsTGVmdCA9IC0xKmluTGVmdDsKCX0sCglzZXRTY3JvbGxZOiBmdW5jdGlvbihpblRvcCkgewoJCXRoaXMuc2Nyb2xsVG9wID0gLTEqaW5Ub3A7Cgl9LAoKCS8vKiBHZXRzIHRoZSBsZWZ0IHNjcm9sbCBwb3NpdGlvbiB3aXRoaW4gdGhlIHNjcm9sbGVyLgoJZ2V0U2Nyb2xsTGVmdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuc2Nyb2xsTGVmdDsKCX0sCgkvLyogR2V0cyB0aGUgdG9wIHNjcm9sbCBwb3NpdGlvbiB3aXRoaW4gdGhlIHNjcm9sbGVyLgoJZ2V0U2Nyb2xsVG9wOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5zY3JvbGxUb3A7Cgl9LAoKCS8vKiBAcHJvdGVjdGVkCgoJLy8gYXBwbHkgaW5pdGlhbCB0cmFuc2Zvcm0gc28gd2UncmUgYWx3YXlzIGNvbXBvc2l0ZWQKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQllbnlvLmRvbS50cmFuc2Zvcm1WYWx1ZSh0aGlzLiQuY2xpZW50LCB0aGlzLnRyYW5zbGF0aW9uLCAiMCwwLDAiKTsKCX0sCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLmNsZWFyQ1NTVHJhbnNpdGlvbkludGVydmFsKCk7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCglnZXRTY3JvbGxTaXplOiBmdW5jdGlvbigpIHsKCQl2YXIgbiA9IHRoaXMuJC5jbGllbnQuaGFzTm9kZSgpOwoJCXJldHVybiB7d2lkdGg6IG4gPyBuLnNjcm9sbFdpZHRoIDogMCwgaGVpZ2h0OiBuID8gbi5zY3JvbGxIZWlnaHQgOiAwfTsKCX0sCglob3Jpem9udGFsQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5ob3Jpem9udGFsID09ICJoaWRkZW4iKSB7CgkJCXRoaXMuc2Nyb2xsSG9yaXpvbnRhbCA9IGZhbHNlOwoJCX0KCX0sCgl2ZXJ0aWNhbENoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCWlmKHRoaXMudmVydGljYWwgPT0gImhpZGRlbiIpIHsKCQkJdGhpcy5zY3JvbGxWZXJ0aWNhbCA9IGZhbHNlOwoJCX0KCX0sCgljYWxjU2Nyb2xsTm9kZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuJC5jbGllbnRDb250YWluZXIuaGFzTm9kZSgpOwoJfSwKCWNhbGNCb3VuZGFyaWVzOiBmdW5jdGlvbigpIHsKCQl2YXIgYiA9IHRoaXMuX2dldFNjcm9sbEJvdW5kcygpOwoJCXRoaXMuYm90dG9tQm91bmRhcnkgPSBiLmNsaWVudEhlaWdodCAtIGIuaGVpZ2h0OwoJCXRoaXMucmlnaHRCb3VuZGFyeSA9IGIuY2xpZW50V2lkdGggLSBiLndpZHRoOwoJfSwKCW1heEhlaWdodENoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCS8vIGNvbnRlbnQgc2hvdWxkIGNvdmVyIHNjcm9sbGVyIGF0IGEgbWluaW11bSBpZiB0aGVyZSdzIG5vIG1heC1oZWlnaHQuCgkJdGhpcy4kLmNsaWVudC5hcHBseVN0eWxlKCJtaW4taGVpZ2h0IiwgdGhpcy5tYXhIZWlnaHQgPyBudWxsIDogIjEwMCUiKTsKCQl0aGlzLiQuY2xpZW50LmFwcGx5U3R5bGUoIm1heC1oZWlnaHQiLCB0aGlzLm1heEhlaWdodCk7CgkJdGhpcy4kLmNsaWVudENvbnRhaW5lci5hZGRSZW1vdmVDbGFzcygiZW55by1zY3JvbGxlZS1maXQiLCAhdGhpcy5tYXhIZWlnaHQpOwoJfSwKCWNhbGNBdXRvU2Nyb2xsaW5nOiBmdW5jdGlvbigpIHsKCQl2YXIgYiA9IHRoaXMuZ2V0U2Nyb2xsQm91bmRzKCk7CgkJaWYodGhpcy52ZXJ0aWNhbCkgewoJCQl0aGlzLnNjcm9sbFZlcnRpY2FsID0gYi5oZWlnaHQgPiBiLmNsaWVudEhlaWdodDsKCQl9CgkJaWYodGhpcy5ob3Jpem9udGFsKSB7CgkJCXRoaXMuc2Nyb2xsSG9yaXpvbnRhbCA9IGIud2lkdGggPiBiLmNsaWVudFdpZHRoOwoJCX0KCX0sCglpc0luT3ZlclNjcm9sbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICh0aGlzLmlzSW5Ub3BPdmVyU2Nyb2xsKCkgfHwgdGhpcy5pc0luQm90dG9tT3ZlclNjcm9sbCgpIHx8IHRoaXMuaXNJbkxlZnRPdmVyU2Nyb2xsKCkgfHwgdGhpcy5pc0luUmlnaHRPdmVyU2Nyb2xsKCkpOwoJfSwKCWlzSW5MZWZ0T3ZlclNjcm9sbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICh0aGlzLmdldFNjcm9sbExlZnQoKSA8IHRoaXMubGVmdEJvdW5kYXJ5KTsKCX0sCglpc0luUmlnaHRPdmVyU2Nyb2xsOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLmdldFNjcm9sbExlZnQgPD0gMCkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICh0aGlzLmdldFNjcm9sbExlZnQoKSotMSA8IHRoaXMucmlnaHRCb3VuZGFyeSk7CgkJfQoJfSwKCWlzSW5Ub3BPdmVyU2Nyb2xsOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKHRoaXMuZ2V0U2Nyb2xsVG9wKCkgPCB0aGlzLnRvcEJvdW5kYXJ5KTsKCX0sCglpc0luQm90dG9tT3ZlclNjcm9sbDogZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5nZXRTY3JvbGxUb3AoKSA8PSAwKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gKHRoaXMuZ2V0U2Nyb2xsVG9wKCkqLTEgPCB0aGlzLmJvdHRvbUJvdW5kYXJ5KTsKCQl9Cgl9LAoJY2FsY1N0YXJ0SW5mbzogZnVuY3Rpb24oKSB7CgkJdmFyIHNiID0gdGhpcy5nZXRTY3JvbGxCb3VuZHMoKSwgeSA9IHRoaXMuZ2V0U2Nyb2xsVG9wKCksIHggPSB0aGlzLmdldFNjcm9sbExlZnQoKTsKCQl0aGlzLnN0YXJ0RWRnZXMgPSB7CgkJCXRvcDogeSA9PT0gMCwKCQkJYm90dG9tOiB5ID09PSBzYi5tYXhUb3AsCgkJCWxlZnQ6IHggPT09IDAsCgkJCXJpZ2h0OiB4ID09PSBzYi5tYXhMZWZ0CgkJfTsKCX0sCgltb3VzZXdoZWVsOiBmdW5jdGlvbihpblNlbmRlciwgZSkgewoJCWlmICghdGhpcy5kcmFnZ2luZyAmJiB0aGlzLnVzZU1vdXNlV2hlZWwpIHsKCQkJdGhpcy5jYWxjQm91bmRhcmllcygpOwoJCQl0aGlzLnN5bmNTY3JvbGxNYXRoKCk7CgkJCXRoaXMuc3RhYmlsaXplKCk7CgkJCXZhciBkeSA9IHRoaXMudmVydGljYWwgPyBlLndoZWVsRGVsdGFZIHx8IGUud2hlZWxEZWx0YSA6IDA7CgkJCXZhciB5ID0gcGFyc2VGbG9hdCh0aGlzLmdldFNjcm9sbFRvcCgpKSArIC0xKnBhcnNlRmxvYXQoZHkpOwoJCQl5ID0gKHkqLTEgPCB0aGlzLmJvdHRvbUJvdW5kYXJ5KSA/IC0xKnRoaXMuYm90dG9tQm91bmRhcnkgOiAoeSA8IHRoaXMudG9wQm91bmRhcnkpID8gdGhpcy50b3BCb3VuZGFyeSA6IHk7CgkJCXRoaXMuc2V0U2Nyb2xsVG9wKHkpOwoJCQl0aGlzLmRvU2Nyb2xsKCk7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfSwKCS8vIFVwZGF0ZSB0aHVtYnMsIHJlY2FsY3VsYXRlIGJvdW5kYXJpZXMsIGFuZCBidWJibGUgc2Nyb2xsIGV2ZW50CglzY3JvbGw6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJaWYodGhpcy50aHVtYikgewoJCQl0aGlzLnVwZGF0ZVRodW1icygpOwoJCX0KCQl0aGlzLmNhbGNCb3VuZGFyaWVzKCk7CgkJdGhpcy5kb1Njcm9sbCgpOwoJfSwKCS8vIFNjcm9sbCB0byBjdXJyZW50IHgseSBjb29yZGluYXRlcyBhbmQgYnViYmxlIHNjcm9sbHN0YXJ0IGV2ZW50CglzdGFydDogZnVuY3Rpb24oKSB7CgkJdGhpcy5zdGFydFNjcm9sbGluZygpOwoJCXRoaXMuZG9TY3JvbGxTdGFydCgpOwoJfSwKCS8vIElmIHNjcm9sbGluZywgc3RvcC4gSGlkZSB0aHVtYnMgYW5kIGJ1YmJsZSBzY3JvbGxzdG9wIGV2ZW50LgoJc3RvcDogZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5pc1Njcm9sbGluZygpKSB7CgkJCXRoaXMuc3RvcFNjcm9sbGluZygpOwoJCX0KCQlpZiAodGhpcy50aHVtYikgewoJCQl0aGlzLmRlbGF5SGlkZVRodW1icygxMDApOwoJCX0KCQl0aGlzLmRvU2Nyb2xsU3RvcCgpOwoJfSwKCgkvLyBTZXQgc2Nyb2xsIHggdmFsdWUgdG8gdGhlIGN1cnJlbnQgY29tcHV0ZWQgc3R5bGUKCXVwZGF0ZVg6IGZ1bmN0aW9uKCkgewoJCXZhciB4ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy4kLmNsaWVudC5ub2RlLG51bGwpLmdldFByb3BlcnR5VmFsdWUoZW55by5kb20uZ2V0Q3NzVHJhbnNmb3JtUHJvcCgpKS5zcGxpdCgnKCcpWzFdOwoJCXggPSAoeCA9PT0gdW5kZWZpbmVkKSA/IDAgOiB4LnNwbGl0KCcpJylbMF0uc3BsaXQoJywnKVs0XTsKCQlpZigtMSpwYXJzZUZsb2F0KHgpID09PSB0aGlzLnNjcm9sbExlZnQpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQl0aGlzLnNjcm9sbExlZnQgPSAtMSpwYXJzZUZsb2F0KHgpOwoJCXJldHVybiB0cnVlOwoJfSwKCS8vIFNldCBzY3JvbGwgeSB2YWx1ZSB0byB0aGUgY3VycmVudCBjb21wdXRlZCBzdHlsZQoJdXBkYXRlWTogZnVuY3Rpb24oKSB7CgkJdmFyIHkgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLiQuY2xpZW50Lm5vZGUsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShlbnlvLmRvbS5nZXRDc3NUcmFuc2Zvcm1Qcm9wKCkpLnNwbGl0KCcoJylbMV07CgkJeSA9ICh5ID09PSB1bmRlZmluZWQpID8gMCA6IHkuc3BsaXQoJyknKVswXS5zcGxpdCgnLCcpWzVdOwoJCWlmKC0xKnBhcnNlRmxvYXQoeSkgPT09IHRoaXMuc2Nyb2xsVG9wKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJdGhpcy5zY3JvbGxUb3AgPSAtMSpwYXJzZUZsb2F0KHkpOwoJCXJldHVybiB0cnVlOwoJfSwKCS8vIEFwcGx5IHRyYW5zZm9ybSB0byBzY3JvbGwgdGhlIHNjcm9sbGVyCgllZmZlY3RTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCXZhciBvID0gKC0xKnRoaXMuc2Nyb2xsTGVmdCkgKyAicHgsICIgKyAoLTEqdGhpcy5zY3JvbGxUb3ApICsgInB4IiArICh0aGlzLmFjY2VsID8gIiwgMCIgOiAiIik7CgkJZW55by5kb20udHJhbnNmb3JtVmFsdWUodGhpcy4kLmNsaWVudCwgdGhpcy50cmFuc2xhdGlvbiwgbyk7Cgl9LAoJLy8gT24gdG91Y2gsIHN0b3AgdHJhbnNpdGlvbiBieSBzZXR0aW5nIHRyYW5zZm9ybSB2YWx1ZXMgdG8gY3VycmVudCBjb21wdXRlZCBzdHlsZSwgYW5kCgkvLyBjaGFuZ2luZyB0cmFuc2l0aW9uIHRpbWUgdG8gMHMuIFRPRE8KCWRvd246IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQlpZiAodGhpcy5pc1Njcm9sbGluZygpICYmICF0aGlzLmlzT3ZlcnNjcm9sbGluZygpKSB7CgkJCXRoaXMuc3RvcFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJX3RoaXMuc3RvcCgpOwoJCQl9LCB0aGlzLnN0b3BUaW1lb3V0TVMpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9LAoJLy8gU3BlY2lhbCBzeW50aGV0aWMgRE9NIGV2ZW50cyBzZXJ2ZWQgdXAgYnkgdGhlIEdlc3R1cmUgc3lzdGVtCglkcmFnc3RhcnQ6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJaWYodGhpcy5zdG9wVGltZW91dCkgewoJCQljbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZW91dCk7CgkJfQoJCS8vIElnbm9yZSBkcmFncyBzZW50IGZyb20gbXVsdGktdG91Y2ggZXZlbnRzCgkJaWYoIXRoaXMuZHJhZ0R1cmluZ0dlc3R1cmUgJiYgaW5FdmVudC5zcmNFdmVudC50b3VjaGVzICYmIGluRXZlbnQuc3JjRXZlbnQudG91Y2hlcy5sZW5ndGggPiAxKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCQl0aGlzLnNob3VsZERyYWcoaW5FdmVudCk7CgkJdGhpcy5kcmFnZ2luZyA9IChpbkV2ZW50LmRyYWdnZXIgPT0gdGhpcyB8fCAoIWluRXZlbnQuZHJhZ2dlciAmJiBpbkV2ZW50LmJvdW5kYXJ5RHJhZ2dlciA9PSB0aGlzKSk7CgkJaWYgKHRoaXMuZHJhZ2dpbmcpIHsKCQkJaWYodGhpcy5pc1Njcm9sbGluZygpKSB7CgkJCQl0aGlzLnN0b3BTY3JvbGxpbmcoKTsKCQkJfQoJCQlpZih0aGlzLnRodW1iKSB7CgkJCQl0aGlzLnNob3dUaHVtYnMoKTsKCQkJfQoJCQlpbkV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCXRoaXMucHJldlkgPSBpbkV2ZW50LnBhZ2VZOwoJCQl0aGlzLnByZXZYID0gaW5FdmVudC5wYWdlWDsKCQkJaWYgKHRoaXMucHJldmVudERyYWdQcm9wYWdhdGlvbikgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9Cgl9LAoJLy8gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBhbGxvdyBkcmFnZ2luZwoJc2hvdWxkRHJhZzogZnVuY3Rpb24oZSkgewoJCXRoaXMuY2FsY1N0YXJ0SW5mbygpOwoJCXRoaXMuY2FsY0JvdW5kYXJpZXMoKTsKCQl0aGlzLmNhbGNBdXRvU2Nyb2xsaW5nKCk7CgkJaWYoIXRoaXMuc2Nyb2xsSG9yaXpvbnRhbCkgewoJCQlyZXR1cm4gdGhpcy5zaG91bGREcmFnVmVydGljYWwoZSk7CgkJfSBlbHNlIHsKCQkJaWYoIXRoaXMuc2Nyb2xsVmVydGljYWwpIHsKCQkJCXJldHVybiB0aGlzLnNob3VsZERyYWdIb3Jpem9udGFsKGUpOwoJCQl9IGVsc2UgewoJCQkJcmV0dXJuICh0aGlzLnNob3VsZERyYWdWZXJ0aWNhbChlKSB8fCB0aGlzLnNob3VsZERyYWdIb3Jpem9udGFsKGUpKTsKCQkJfQoJCX0KCX0sCglzaG91bGREcmFnVmVydGljYWw6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgY2FuViA9IHRoaXMuY2FuRHJhZ1ZlcnRpY2FsKGUpOwoJCXZhciBvb2JWID0gdGhpcy5vb2JWZXJ0aWNhbChlKTsKCQkvLyBzY3JvbGwgaWYgbm90IGF0IGEgYm91bmRhcnkKCQlpZiAoIWUuYm91bmRhcnlEcmFnZ2VyICYmIGNhblYpIHsKCQkJZS5ib3VuZGFyeURyYWdnZXIgPSB0aGlzOwoJCX0KCQkvLyBpbmNsdWRlIGJvdW5kYXJ5IGV4Y2x1c2lvbgoJCWlmICghb29iViAmJiBjYW5WKSB7CgkJCWUuZHJhZ2dlciA9IHRoaXM7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0sCglzaG91bGREcmFnSG9yaXpvbnRhbDogZnVuY3Rpb24oZSkgewoJCXZhciBjYW5IID0gdGhpcy5jYW5EcmFnSG9yaXpvbnRhbChlKTsKCQl2YXIgb29iSCA9IHRoaXMub29iSG9yaXpvbnRhbChlKTsKCQkvLyBzY3JvbGwgaWYgbm90IGF0IGEgYm91bmRhcnkKCQlpZiAoIWUuYm91bmRhcnlEcmFnZ2VyICYmIGNhbkgpIHsKCQkJZS5ib3VuZGFyeURyYWdnZXIgPSB0aGlzOwoJCX0KCQkvLyBpbmNsdWRlIGJvdW5kYXJ5IGV4Y2x1c2lvbgoJCWlmICghb29iSCAmJiBjYW5IKSB7CgkJCWUuZHJhZ2dlciA9IHRoaXM7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0sCgljYW5EcmFnVmVydGljYWw6IGZ1bmN0aW9uKGUpIHsKCQlyZXR1cm4gKHRoaXMuc2Nyb2xsVmVydGljYWwgJiYgZS52ZXJ0aWNhbCk7Cgl9LAoJY2FuRHJhZ0hvcml6b250YWw6IGZ1bmN0aW9uKGUpIHsKCQlyZXR1cm4gKHRoaXMuc2Nyb2xsSG9yaXpvbnRhbCAmJiAhZS52ZXJ0aWNhbCk7Cgl9LAoJb29iVmVydGljYWw6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgZG93biA9IGUuZHkgPCAwOwoJCXJldHVybiAoIWRvd24gJiYgdGhpcy5zdGFydEVkZ2VzLnRvcCB8fCBkb3duICYmIHRoaXMuc3RhcnRFZGdlcy5ib3R0b20pOwoJfSwKCW9vYkhvcml6b250YWw6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgcmlnaHQgPSBlLmR4IDwgMDsKCQlyZXR1cm4gKCFyaWdodCAmJiB0aGlzLnN0YXJ0RWRnZXMubGVmdCB8fCByaWdodCAmJiB0aGlzLnN0YXJ0RWRnZXMucmlnaHQpOwoJfSwKCS8vIE1vdmUgc2Nyb2xsZXIgYmFzZWQgb24gdXNlcidzIGRyYWdnaW5nCglkcmFnOiBmdW5jdGlvbihpblNlbmRlciwgZSkgewoJCS8vIGlmIHRoZSBsaXN0IGlzIGRvaW5nIGEgcmVvcmRlciwgZG9uJ3Qgc2Nyb2xsCgkJaWYodGhpcy5saXN0UmVvcmRlcmluZykgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCS8vIGlmIHNob3VsZERyYWcoKSBzZXQgdGhpcy5kcmFnZ2luZyB0byB0cnVlCgkJaWYodGhpcy5kcmFnZ2luZykgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCS8vIGNhbGN1bGF0ZSBuZXcgc2Nyb2xsIHZhbHVlcwoJCQl0aGlzLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbEhvcml6b250YWwgPwoJCQkJdGhpcy5jYWxjdWxhdGVEcmFnRGlzdGFuY2UocGFyc2VJbnQodGhpcy5nZXRTY3JvbGxMZWZ0KCksIDEwKSwgKC0xKihlLnBhZ2VYLXRoaXMucHJldlgpKSwgdGhpcy5sZWZ0Qm91bmRhcnksIHRoaXMucmlnaHRCb3VuZGFyeSkgOgoJCQkJdGhpcy5nZXRTY3JvbGxMZWZ0KCk7CgkJCXRoaXMuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxWZXJ0aWNhbCA/CgkJCQl0aGlzLmNhbGN1bGF0ZURyYWdEaXN0YW5jZSh0aGlzLmdldFNjcm9sbFRvcCgpLCAoLTEqKGUucGFnZVktdGhpcy5wcmV2WSkpLCB0aGlzLnRvcEJvdW5kYXJ5LCB0aGlzLmJvdHRvbUJvdW5kYXJ5KSA6CgkJCQl0aGlzLmdldFNjcm9sbFRvcCgpOwoJCQkvLyBhcHBseSBuZXcgc2Nyb2xsIHZhbHVlcwoJCQl0aGlzLmVmZmVjdFNjcm9sbCgpOwoJCQl0aGlzLnNjcm9sbCgpOwoJCQkvLyBzYXZlIHZhbHVlcyBmb3IgbmV4dCBkcmFnCgkJCXRoaXMucHJldlkgPSBlLnBhZ2VZOwoJCQl0aGlzLnByZXZYID0gZS5wYWdlWDsKCQkJdGhpcy5yZXNldEJvdW5kYXJ5WCgpOwoJCQl0aGlzLnJlc2V0Qm91bmRhcnlZKCk7CgkJfQoJfSwKCS8vKiBGaWd1cmUgaG93IGZhciB0aGUgZHJhZyBzaG91bGQgZ28gYmFzZWQgb24gcG9pbnRlciBtb3ZlbWVudCAoZGVsdGEpCgljYWxjdWxhdGVEcmFnRGlzdGFuY2U6IGZ1bmN0aW9uKGN1cnJlbnRQb3NpdGlvbiwgZGVsdGEsIGFCb3VuZGFyeSwgYkJvdW5kYXJ5KSB7CgkJdmFyIG5ld1Bvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uICsgZGVsdGE7CgkJcmV0dXJuIHRoaXMub3ZlcnNjcm9sbERyYWdEYW1waW5nKGN1cnJlbnRQb3NpdGlvbiwgbmV3UG9zaXRpb24sZGVsdGEsYUJvdW5kYXJ5LGJCb3VuZGFyeSk7Cgl9LAoJLy8qIFByb3ZpZGVzIHJlc2lzdGFuY2UgYWdhaW5zdCBkcmFnZ2luZyBpbnRvIG92ZXJzY3JvbGwKCW92ZXJzY3JvbGxEcmFnRGFtcGluZzogZnVuY3Rpb24oY3VycmVudFBvc2l0aW9uLCBuZXdQb3NpdGlvbiwgZGVsdGEsIGFCb3VuZGFyeSwgYkJvdW5kYXJ5KSB7CgkJaWYobmV3UG9zaXRpb24gPCBhQm91bmRhcnkgfHwgbmV3UG9zaXRpb24qLTEgPCBiQm91bmRhcnkpIHsKCQkJZGVsdGEgLz0gMjsKCQkJbmV3UG9zaXRpb24gPSBjdXJyZW50UG9zaXRpb24gKyBkZWx0YTsKCQl9CgkJcmV0dXJuIG5ld1Bvc2l0aW9uOwoJfSwKCXJlc2V0Qm91bmRhcnlYOiBmdW5jdGlvbigpIHsKCQl0aGlzLmJvdW5kYXJ5WCA9IDA7Cgl9LAoJcmVzZXRCb3VuZGFyeVk6IGZ1bmN0aW9uKCkgewoJCXRoaXMuYm91bmRhcnlZID0gMDsKCX0sCgkvLyBXaGVuIHVzZXIgcmVsZWFzZXMgdGhlIGRyYWcsIHNldCB0aGlzLmRyYWdnaW5nIHRvIGZhbHNlLCBib3VuY2Ugb3ZlcmZsb3cgYmFjaywgYW5kIGhpZGUgc2NyaW0uCglkcmFnZmluaXNoOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCWlmICh0aGlzLmRyYWdnaW5nKSB7CgkJCWluRXZlbnQucHJldmVudFRhcCgpOwoJCQl0aGlzLmRyYWdnaW5nID0gZmFsc2U7CgkJCWlmKCF0aGlzLmlzU2Nyb2xsaW5nKCkpIHsKCQkJCXRoaXMuY29ycmVjdE92ZXJmbG93KCk7CgkJCX0KCQkJaWYgKHRoaXMuc2NyaW0pIHsKCQkJCXRoaXMuJC5zY3JpbS5oaWRlKCk7CgkJCX0KCQl9Cgl9LAoJLy8gQm91bmNlIGJhY2sgZnJvbSBvdmVyc2Nyb2xsIHJlZ2lvbgoJY29ycmVjdE92ZXJmbG93OiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLmlzSW5PdmVyU2Nyb2xsKCkpIHsKCQkJdmFyIHggPSAodGhpcy5zY3JvbGxIb3Jpem9udGFsKSA/IHRoaXMuY29ycmVjdE92ZXJmbG93WCgpIDogZmFsc2U7CgkJCXZhciB5ID0gKHRoaXMuc2Nyb2xsVmVydGljYWwpID8gdGhpcy5jb3JyZWN0T3ZlcmZsb3dZKCkgOiBmYWxzZTsKCQkJaWYoeCAhPT0gZmFsc2UgJiYgeSAhPT0gZmFsc2UpIHsKCQkJCXRoaXMuc2Nyb2xsTGVmdCA9ICh4ICE9PSBmYWxzZSkgPyB4IDogdGhpcy5nZXRTY3JvbGxMZWZ0KCk7CgkJCQl0aGlzLnNjcm9sbFRvcCA9ICh5ICE9PSBmYWxzZSkgPyB5IDogdGhpcy5nZXRTY3JvbGxUb3AoKTsKCQkJCXRoaXMuc3RhcnRPdmVyZmxvd1Njcm9sbGluZygpOwoJCQl9IGVsc2UgaWYoeCAhPT0gZmFsc2UpIHsKCQkJCXRoaXMuc2Nyb2xsTGVmdCA9IHg7CgkJCQl0aGlzLnNjcm9sbFRvcCA9IHRoaXMudGFyZ2V0U2Nyb2xsVG9wIHx8IHRoaXMuc2Nyb2xsVG9wOwoJCQkJdGhpcy50YXJnZXRTY3JvbGxMZWZ0ID0gdGhpcy5nZXRTY3JvbGxMZWZ0KCk7CgkJCQlpZighdGhpcy52ZXJ0aWNhbCkgewoJCQkJCXRoaXMuc3RhcnRPdmVyZmxvd1Njcm9sbGluZygpOwoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLnN0YXJ0U2Nyb2xsaW5nKCk7CgkJCQl9CgkJCX0gZWxzZSBpZih5ICE9PSBmYWxzZSkgewoJCQkJdGhpcy5zY3JvbGxUb3AgPSB5OwoJCQkJdGhpcy5zY3JvbGxMZWZ0ID0gdGhpcy50YXJnZXRTY3JvbGxMZWZ0IHx8IHRoaXMuc2Nyb2xsTGVmdDsKCQkJCXRoaXMudGFyZ2V0U2Nyb2xsVG9wID0gdGhpcy5nZXRTY3JvbGxUb3AoKTsKCQkJCWlmKCF0aGlzLnNjcm9sbEhvcml6b250YWwpIHsKCQkJCQl0aGlzLnN0YXJ0T3ZlcmZsb3dTY3JvbGxpbmcoKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGhpcy5zdGFydFNjcm9sbGluZygpOwoJCQkJfQoJCQl9CgkJfQoJfSwKCS8vIERldGVybWluZSBpZiB3ZSdyZSBvdmVyc2Nyb2xsZWQgb24gdGhlIHggYXhpcyBhbmQgaWYgc28gcmV0dXJuIHByb3BlciBlZGdlIHZhbHVlCgljb3JyZWN0T3ZlcmZsb3dYOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLmlzSW5MZWZ0T3ZlclNjcm9sbCgpKSB7CgkJCWlmKHRoaXMuYmV5b25kQm91bmRhcnkodGhpcy5nZXRTY3JvbGxMZWZ0KCksIHRoaXMubGVmdEJvdW5kYXJ5LCB0aGlzLmJvdW5kYXJ5WCkpIHsKCQkJCXJldHVybiB0aGlzLmxlZnRCb3VuZGFyeTsKCQkJfQoJCX0gZWxzZSBpZih0aGlzLmlzSW5SaWdodE92ZXJTY3JvbGwoKSkgewoJCQlpZih0aGlzLmJleW9uZEJvdW5kYXJ5KHRoaXMuZ2V0U2Nyb2xsTGVmdCgpLCB0aGlzLnJpZ2h0Qm91bmRhcnksIHRoaXMuYm91bmRhcnlYKSkgewoJCQkJcmV0dXJuIC0xKnRoaXMucmlnaHRCb3VuZGFyeTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9LAoJLy8gRGV0ZXJtaW5lIGlmIHdlJ3JlIG92ZXJzY3JvbGxlZCBvbiB0aGUgeSBheGlzIGFuZCBpZiBzbyByZXR1cm4gcHJvcGVyIGVkZ2UgdmFsdWUKCWNvcnJlY3RPdmVyZmxvd1k6IGZ1bmN0aW9uKCkgewoJCWlmKHRoaXMuaXNJblRvcE92ZXJTY3JvbGwoKSkgewoJCQlpZih0aGlzLmJleW9uZEJvdW5kYXJ5KHRoaXMuZ2V0U2Nyb2xsVG9wKCksIHRoaXMudG9wQm91bmRhcnksIHRoaXMuYm91bmRhcnlZKSkgewoJCQkJcmV0dXJuIHRoaXMudG9wQm91bmRhcnk7CgkJCX0KCQl9IGVsc2UgaWYodGhpcy5pc0luQm90dG9tT3ZlclNjcm9sbCgpKSB7CgkJCWlmKHRoaXMuYmV5b25kQm91bmRhcnkodGhpcy5nZXRTY3JvbGxUb3AoKSwgdGhpcy5ib3R0b21Cb3VuZGFyeSwgdGhpcy5ib3VuZGFyeVkpKSB7CgkJCQlyZXR1cm4gLTEqdGhpcy5ib3R0b21Cb3VuZGFyeTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9LAoJLy8gSWYgd2UndmUgY3Jvc3NlZCB0aGUgZGV0ZXJtaW5lZCBkZWx0YSwgYm91bmNlIGJhY2sKCWJleW9uZEJvdW5kYXJ5OiBmdW5jdGlvbihjdXJyZW50LGJvdW5kYXJ5LG1heCkgewoJCXJldHVybiAoTWF0aC5hYnMoTWF0aC5hYnMoYm91bmRhcnkpIC0gTWF0aC5hYnMoY3VycmVudCkpID4gTWF0aC5hYnMobWF4KSk7Cgl9LAoJLy8gV2hlbiB1c2VyIGZsaWNrcy90aHJvd3Mgc2Nyb2xsZXIsIGZpZ3VyZSB0aGUgZGlzdGFuY2UgdG8gYmUgdHJhdmVsbGVkIGFuZCB3aGV0aGVyIHdlIHdpbGwgZW5kIHVwCgkvLyBpbiB0aGUgb3ZlcnNjcm9sbCByZWdpb24uCglmbGljazogZnVuY3Rpb24oaW5TZW5kZXIsIGUpIHsKCQlpZih0aGlzLmRyYWdnaW5nICYmIHRoaXMuZmxpY2tPbkVuYWJsZWRBeGlzKGUpKSB7CgkJCXRoaXMuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsSG9yaXpvbnRhbCA/IHRoaXMuY2FsY3VsYXRlRmxpY2tEaXN0YW5jZSh0aGlzLnNjcm9sbExlZnQsIC0xKmUueFZlbG9jaXR5KSA6IHRoaXMuZ2V0U2Nyb2xsTGVmdCgpOwoJCQl0aGlzLnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsVmVydGljYWwgPyB0aGlzLmNhbGN1bGF0ZUZsaWNrRGlzdGFuY2UodGhpcy5zY3JvbGxUb3AsIC0xKmUueVZlbG9jaXR5KSA6IHRoaXMuZ2V0U2Nyb2xsVG9wKCk7CgkJCXRoaXMudGFyZ2V0U2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsTGVmdDsKCQkJdGhpcy50YXJnZXRTY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcDsKCQkJdGhpcy5ib3VuZGFyeVggPSBudWxsOwoJCQl0aGlzLmJvdW5kYXJ5WSA9IG51bGw7CgkJCS8vIGlmIGZsaWNrIHdpbGwgcHV0IHRoZSB4IGF4aXMgaW50byBvdmVyc2Nyb2xsLCBmaWd1cmUgd2hlcmUgd2Ugc2hvdWxkIGJvdW5jZSBiYWNrIChib3VuZGFyeSkKCQkJaWYodGhpcy5pc0luTGVmdE92ZXJTY3JvbGwoKSkgewoJCQkJdGhpcy5ib3VuZGFyeVggPSB0aGlzLmZpZ3VyZUJvdW5kYXJ5KHRoaXMuZ2V0U2Nyb2xsTGVmdCgpKTsKCQkJfSBlbHNlIGlmKHRoaXMuaXNJblJpZ2h0T3ZlclNjcm9sbCgpKSB7CgkJCQl0aGlzLmJvdW5kYXJ5WCA9IHRoaXMuZmlndXJlQm91bmRhcnkoLTEqdGhpcy5ib3R0b21Cb3VuZGFyeSAtIHRoaXMuZ2V0U2Nyb2xsTGVmdCgpKTsKCQkJfQoJCQkvLyBpZiBmbGljayB3aWxsIHB1dCB0aGUgeSBheGlzIGludG8gb3ZlcnNjcm9sbCwgZmlndXJlIHdoZXJlIHdlIHNob3VsZCBib3VuY2UgYmFjayAoYm91bmRhcnkpCgkJCWlmKHRoaXMuaXNJblRvcE92ZXJTY3JvbGwoKSkgewoJCQkJdGhpcy5ib3VuZGFyeVkgPSB0aGlzLmZpZ3VyZUJvdW5kYXJ5KHRoaXMuZ2V0U2Nyb2xsVG9wKCkpOwoJCQl9IGVsc2UgaWYodGhpcy5pc0luQm90dG9tT3ZlclNjcm9sbCgpKSB7CgkJCQl0aGlzLmJvdW5kYXJ5WSA9IHRoaXMuZmlndXJlQm91bmRhcnkoLTEqdGhpcy5ib3R0b21Cb3VuZGFyeSAtIHRoaXMuZ2V0U2Nyb2xsVG9wKCkpOwoJCQl9CgkJCS8vIGtpY2tvZmYgc2Nyb2xsaW5nIGFuaW1hdGlvbgoJCQl0aGlzLnN0YXJ0U2Nyb2xsaW5nKCk7CgkJCXJldHVybiB0aGlzLnByZXZlbnREcmFnUHJvcGFnYXRpb247CgkJfQoJfSwKCWZsaWNrT25FbmFibGVkQXhpczogZnVuY3Rpb24oZSkgewoJCXJldHVybiBNYXRoLmFicyhlLnhWZWxvY2l0eSkgPiBNYXRoLmFicyhlLnlWZWxvY2l0eSkgPyB0aGlzLnNjcm9sbEhvcml6b250YWwgOiB0aGlzLnNjcm9sbFZlcnRpY2FsOwoJfSwKCWNhbGN1bGF0ZUZsaWNrRGlzdGFuY2U6IGZ1bmN0aW9uKGN1cnJlbnRQb3NpdGlvbiwgZmxpY2tWZWxvY2l0eSkgewoJCXJldHVybiAoY3VycmVudFBvc2l0aW9uICsgKGZsaWNrVmVsb2NpdHkgKiB0aGlzLmtGbGlja1NjYWxhcikpOwoJfSwKCS8vIEFwcGx5IHRoZSAnc2Nyb2xsJyB0cmFuc2l0aW9uLCBhcHBseSBuZXcgdHJhbnNmb3JtIGJhc2VkIG9uIHggYW5kIHksIGFuZCBiZWdpbgoJLy8gdGhpcy5zY3JvbGxJbnRlcnZhbCB0byB1cGRhdGUgdGhlIHNjcm9sbFRvcC9MZWZ0IHZhbHVlcyB3aGlsZSBzY3JvbGxpbmcKCXN0YXJ0U2Nyb2xsaW5nOiBmdW5jdGlvbigpIHsKCQl0aGlzLmFwcGx5VHJhbnNpdGlvbigic2Nyb2xsIik7CgkJdGhpcy5lZmZlY3RTY3JvbGwoKTsKCQl0aGlzLnNldENTU1RyYW5zaXRpb25JbnRlcnZhbCgpOwoJCXRoaXMuc2Nyb2xsaW5nID0gdHJ1ZTsKCX0sCgkvLyBBcHBseSB0aGUgJ2JvdW5jZScgdHJhbnNpdGlvbiwgYXBwbHkgbmV3IHRyYW5zZm9ybSBiYXNlZCBvbiB4IGFuZCB5LCBhbmQgYmVnaW4KCS8vIHRoaXMuc2Nyb2xsSW50ZXJ2YWwgdG8gdXBkYXRlIHRoZSBzY3JvbGxUb3AvTGVmdCB2YWx1ZXMgd2hpbGUgc2Nyb2xsaW5nCglzdGFydE92ZXJmbG93U2Nyb2xsaW5nOiBmdW5jdGlvbigpIHsKCQl0aGlzLmFwcGx5VHJhbnNpdGlvbigiYm91bmNlIik7CgkJdGhpcy5lZmZlY3RTY3JvbGwoKTsKCQl0aGlzLnNldE92ZXJmbG93VHJhbnNpdGlvbkludGVydmFsKCk7CgkJdGhpcy5zY3JvbGxpbmcgPSB0cnVlOwoJfSwKCS8vIEFwcGx5IHRoZSBnaXZlbiB0cmFuc2l0aW9uIHRvIHRoaXMuJC5jbGllbnQKCWFwcGx5VHJhbnNpdGlvbjogZnVuY3Rpb24od2hpY2gpIHsKCQl0aGlzLiQuY2xpZW50LmFwcGx5U3R5bGUoIi13ZWJraXQtdHJhbnNpdGlvbiIsIHRoaXMudHJhbnNpdGlvbnNbd2hpY2hdKTsKCX0sCgkvLyBUdXJuIG9mZiBDU1MgdHJhbnNpdGlvbiBhbmQgY2xlYXIgdGhpcy5zY3JvbGxJbnRlcnZhbAoJc3RvcFNjcm9sbGluZzogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZXNldENTU1RyYW5zbGF0aW9uVmFscygpOwoJCXRoaXMuY2xlYXJDU1NUcmFuc2l0aW9uSW50ZXJ2YWwoKTsKCQl0aGlzLnNjcm9sbGluZyA9IGZhbHNlOwoJfSwKCS8vIENyZWF0ZSBhbiBpbnRlcnZhbCB0bzogdXBkYXRlIHRoZSB4L3kgdmFsdWVzIHdoaWxlIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcsIGNoZWNrIGZvcgoJLy8gY3Jvc3NpbmcgaW50byB0aGUgb3ZlcmZsb3cgcmVnaW9uLCBhbmQgYnViYmxlIGEgc2Nyb2xsIGV2ZW50CglzZXRDU1NUcmFuc2l0aW9uSW50ZXJ2YWw6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY2xlYXJDU1NUcmFuc2l0aW9uSW50ZXJ2YWwoKTsKCQl0aGlzLnNjcm9sbEludGVydmFsID0gc2V0SW50ZXJ2YWwodGhpcy5iaW5kU2FmZWx5KGZ1bmN0aW9uKCkgewoJCQl0aGlzLnVwZGF0ZVNjcm9sbFBvc2l0aW9uKCk7CgkJCXRoaXMuY29ycmVjdE92ZXJmbG93KCk7CgkJfSksIHRoaXMuc2Nyb2xsSW50ZXJ2YWxNUyk7Cgl9LAoJLy8gQ3JlYXRlIGFuIGludGVydmFsIHRvOiB1cGRhdGUgdGhlIHgveSB2YWx1ZXMgd2hpbGUgc2Nyb2xsaW5nIGlzIGhhcHBlbmluZywgYW5kIGJ1YmJsZQoJLy8gYSBzY3JvbGwgZXZlbnQgKGRvbid0IGNoZWNrIGZvciBjcm9zc2luZyBpbnRvIG92ZXJmbG93IHNpbmNlIHdlJ3JlIHRoZXJlIGFscmVhZHkpCglzZXRPdmVyZmxvd1RyYW5zaXRpb25JbnRlcnZhbDogZnVuY3Rpb24oKSB7CgkJdGhpcy5jbGVhckNTU1RyYW5zaXRpb25JbnRlcnZhbCgpOwoJCXRoaXMuc2Nyb2xsSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0aGlzLmJpbmRTYWZlbHkoZnVuY3Rpb24oKSB7CgkJCXRoaXMudXBkYXRlU2Nyb2xsUG9zaXRpb24oKTsKCQl9KSwgdGhpcy5zY3JvbGxJbnRlcnZhbE1TKTsKCX0sCgkvLyBTYXZlIGN1cnJlbnQgeC95IHBvc2l0aW9uIGFuZCBidWJibGUgc2Nyb2xsIGV2ZW50Cgl1cGRhdGVTY3JvbGxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIHlDaGFuZ2VkID0gdGhpcy51cGRhdGVZKCk7CgkJdmFyIHhDaGFuZ2VkID0gdGhpcy51cGRhdGVYKCk7CgkJdGhpcy5zY3JvbGwoKTsKCQlpZigheUNoYW5nZWQgJiYgIXhDaGFuZ2VkKSB7CgkJCXRoaXMuc3RvcCgpOwoJCX0KCX0sCgkvLyBDbGVhciB0aGlzLnNjcm9sbEludGVydmFsCgljbGVhckNTU1RyYW5zaXRpb25JbnRlcnZhbDogZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5zY3JvbGxJbnRlcnZhbCkgewoJCQljbGVhckludGVydmFsKHRoaXMuc2Nyb2xsSW50ZXJ2YWwpOwoJCQl0aGlzLnNjcm9sbEludGVydmFsID0gbnVsbDsKCQl9Cgl9LAoJLy8gU2V0IHNjcm9sbGVyIHRyYW5zbGF0aW9uIHRvIGN1cnJlbnQgcG9zaXRpb24gYW5kIHR1cm4gdHJhbnNpdGlvbiBvZmYuIFRoaXMgZWZmZWN0aXZlbHkKCS8vIHN0b3BzIHNjcm9sbGluZwoJcmVzZXRDU1NUcmFuc2xhdGlvblZhbHM6IGZ1bmN0aW9uKCkgewoJCXZhciBwcm9wID0gZW55by5kb20uZ2V0Q3NzVHJhbnNmb3JtUHJvcCgpOwoJCXZhciB0cmFuc2Zvcm1TdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuJC5jbGllbnQubm9kZSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHByb3ApLnNwbGl0KCcoJylbMV0uc3BsaXQoJyknKVswXS5zcGxpdCgnLCcpOwoJCXRoaXMuYXBwbHlUcmFuc2l0aW9uKCJub25lIik7CgkJdGhpcy5zY3JvbGxMZWZ0ID0gLTEqdHJhbnNmb3JtU3R5bGVbNF07CgkJdGhpcy5zY3JvbGxUb3AgPSAtMSp0cmFuc2Zvcm1TdHlsZVs1XTsKCQl0aGlzLmVmZmVjdFNjcm9sbCgpOwoJfSwKCS8vIEZpZ3VyZSBob3cgZmFyIGludG8gdGhlIG92ZXJzY3JvbGwgcmVnaW9uIHdlIHNob3VsZCBnbyBiZWZvcmUgYm91bmNpbmcgYmFjawoJZmlndXJlQm91bmRhcnk6IGZ1bmN0aW9uKHRhcmdldCkgewoJCXZhciBhYnNUYXJnZXQgPSBNYXRoLmFicyh0YXJnZXQpOwoJCXZhciByZXRWYWwgPSBhYnNUYXJnZXQgLSBhYnNUYXJnZXQvTWF0aC5wb3coYWJzVGFyZ2V0LDAuMDIpOwoJCXJldFZhbCA9IHRhcmdldCA8IDAgPyAtMSpyZXRWYWwgOiByZXRWYWw7CgkJcmV0dXJuIHJldFZhbDsKCX0sCgkvLyBXaGVuIHRyYW5zaXRpb24gYW5pbWF0aW9uIGlzIGNvbXBsZXRlLCBjaGVjayBpZiB3ZSBuZWVkIHRvIGJvdW5jZSBiYWNrIGZyb20gb3ZlcnNjcm9sbAoJLy8gcmVnaW9uLiBJZiBub3QsIHN0b3AuCgl0cmFuc2l0aW9uQ29tcGxldGU6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJLy8gT25seSBwcm9jZXNzIHRyYW5zaXRpb24gY29tcGxldGUgaWYgc2VudCBmcm9tIHRoaXMgY29udGFpbmVyCgkJaWYoaW5FdmVudC5vcmlnaW5hdG9yICE9PSB0aGlzLiQuY2xpZW50KSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBwb3NDaGFuZ2VkID0gZmFsc2U7CgoJCWlmKHRoaXMuaXNJblRvcE92ZXJTY3JvbGwoKSkgewoJCQlwb3NDaGFuZ2VkID0gdHJ1ZTsKCQkJdGhpcy5zY3JvbGxUb3AgPSB0aGlzLnRvcEJvdW5kYXJ5OwoJCX0gZWxzZSBpZiAodGhpcy5pc0luQm90dG9tT3ZlclNjcm9sbCgpKSB7CgkJCXBvc0NoYW5nZWQgPSB0cnVlOwoJCQl0aGlzLnNjcm9sbFRvcCA9IC0xKnRoaXMuYm90dG9tQm91bmRhcnk7CgkJfQoKCQlpZih0aGlzLmlzSW5MZWZ0T3ZlclNjcm9sbCgpKSB7CgkJCXBvc0NoYW5nZWQgPSB0cnVlOwoJCQl0aGlzLnNjcm9sbExlZnQgPSB0aGlzLmxlZnRCb3VuZGFyeTsKCQl9IGVsc2UgaWYgKHRoaXMuaXNJblJpZ2h0T3ZlclNjcm9sbCgpKSB7CgkJCXBvc0NoYW5nZWQgPSB0cnVlOwoJCQl0aGlzLnNjcm9sbExlZnQgPSAtMSp0aGlzLnJpZ2h0Qm91bmRhcnk7CgkJfQoKCQlpZihwb3NDaGFuZ2VkKSB7CgkJCXRoaXMuc3RhcnRPdmVyZmxvd1Njcm9sbGluZygpOwoJCX0gZWxzZSB7CgkJCXRoaXMuc3RvcCgpOwoJCX0KCX0sCgkvLyogU2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgeCBhbmQgeSBjb29yZGluYXRlcwoJc2Nyb2xsVG86IGZ1bmN0aW9uKGluWCwgaW5ZKSB7CgkJdGhpcy5zZXRTY3JvbGxUb3AoaW5ZKTsKCQl0aGlzLnNldFNjcm9sbExlZnQoaW5YKTsKCQl0aGlzLnN0YXJ0KCk7Cgl9LAoJLy8qIFJldHVybnMgdGhlIHZhbHVlcyBvZiBfb3ZlcmxlZnRfIGFuZCBfb3ZlcnRvcF8sIGlmIGFueS4KCWdldE92ZXJTY3JvbGxCb3VuZHM6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB7CgkJCW92ZXJsZWZ0OiBNYXRoLm1pbih0aGlzLmxlZnRCb3VuZGFyeSArIHRoaXMuc2Nyb2xsTGVmdCwgMCkgfHwgTWF0aC5tYXgodGhpcy5yaWdodEJvdW5kYXJ5ICsgdGhpcy5zY3JvbGxMZWZ0LCAwKSwKCQkJb3ZlcnRvcDogTWF0aC5taW4odGhpcy50b3BCb3VuZGFyeSArIHRoaXMuc2Nyb2xsVG9wLCAwKSB8fCBNYXRoLm1heCh0aGlzLmJvdHRvbUJvdW5kYXJ5ICsgdGhpcy5zY3JvbGxUb3AsIDApCgkJfTsKCX0KfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/TranslateScrollStrategy.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5UcmFuc2xhdGVTY3JvbGxTdHJhdGVneV8gaXMgYSBoZWxwZXIga2luZCB0aGF0IGV4dGVuZHMKCTxhIGhyZWY9IiNlbnlvLlRvdWNoU2Nyb2xsU3RyYXRlZ3kiPmVueW8uVG91Y2hTY3JvbGxTdHJhdGVneTwvYT4sIG9wdGltaXppbmcKCWl0IGZvciBzY3JvbGxpbmcgZW52aXJvbm1lbnRzIGluIHdoaWNoIGVmZmVjdGluZyBzY3JvbGwgY2hhbmdlcyB3aXRoCgl0cmFuc2Zvcm1zIGlzIGZhc3Rlc3QuCgoJX2VueW8uVHJhbnNsYXRlU2Nyb2xsU3RyYXRlZ3lfIGlzIG5vdCB0eXBpY2FsbHkgY3JlYXRlZCBpbiBhcHBsaWNhdGlvbiBjb2RlLgoJSW5zdGVhZCwgaXQgaXMgc3BlY2lmaWVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgYHN0cmF0ZWd5S2luZGAgcHJvcGVydHkgb2YgYW4KCWBlbnlvLlNjcm9sbGVyYCBvciA8YSBocmVmPSIjZW55by5MaXN0Ij5lbnlvLkxpc3Q8L2E+LCBvciBpcyB1c2VkIGJ5IHRoZQoJZnJhbWV3b3JrIGltcGxpY2l0bHkuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5UcmFuc2xhdGVTY3JvbGxTdHJhdGVneSIsCglraW5kOiAiVG91Y2hTY3JvbGxTdHJhdGVneSIsCgkvLyogU2V0IHRvIHRydWUgdG8gb3B0aW1pemUgdGhlIHN0cmF0ZWd5IHRvIG9ubHkgdXNlIHRyYW5zbGF0aW9uIHRvIHNjcm9sbDsgdGhpcyBpbmNyZWFzZXMgZmx1aWRpdHkgb2YKCS8vKiBzY3JvbGxpbmcgYW5pbWF0aW9uLiBJdCBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiB0aGUgc2Nyb2xsZXIgY29udGFpbnMgY29udHJvbHMgdGhhdCByZXF1aXJlIGtleWJvYXJkCgkvLyogaW5wdXQuIFRoaXMgaXMgYmVjYXVzZSB3aGVuIF90cmFuc2xhdGVPcHRpbWl6ZWRfIGlzIHRydWUsIGl0IGlzIHBvc3NpYmxlIHRvIHBvc2l0aW9uIGlucHV0cyBzdWNoIHRoYXQKCS8vKiB0aGV5IHdpbGwgbm90IGJlY29tZSB2aXNpYmlsZSB3aGVuIGZvY3VzZWQuCgl0cmFuc2xhdGVPcHRpbWl6ZWQ6IGZhbHNlLAoJLy8qIEBwcm90ZWN0ZWQKCWNvbXBvbmVudHM6IFsKCQl7bmFtZTogImNsaWVudENvbnRhaW5lciIsIGNsYXNzZXM6ICJlbnlvLXRvdWNoLXNjcm9sbGVyIiwgY29tcG9uZW50czogWwoJCQl7bmFtZTogImNsaWVudCJ9CgkJXX0KCV0sCglyZW5kZXJlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcy4kLmNsaWVudENvbnRhaW5lciwgInNjcm9sbCIpOwoJfSwKCWdldFNjcm9sbFNpemU6IGZ1bmN0aW9uKCkgewoJCXZhciBuID0gdGhpcy4kLmNsaWVudC5oYXNOb2RlKCk7CgkJcmV0dXJuIHt3aWR0aDogbiA/IG4uc2Nyb2xsV2lkdGggOiAwLCBoZWlnaHQ6IG4gPyBuLnNjcm9sbEhlaWdodCA6IDB9OwoJfSwKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQkvLyBhcHBseSBpbml0aWFsIHRyYW5zZm9ybSBzbyB3ZSdyZSBhbHdheXMgY29tcG9zaXRlZAoJCWVueW8uZG9tLnRyYW5zZm9ybVZhbHVlKHRoaXMuJC5jbGllbnQsIHRoaXMudHJhbnNsYXRpb24sICIwLDAsMCIpOwoJfSwKCWNhbGNTY3JvbGxOb2RlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy4kLmNsaWVudENvbnRhaW5lci5oYXNOb2RlKCk7Cgl9LAoJbWF4SGVpZ2h0Q2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJLy8gY29udGVudCBzaG91bGQgY292ZXIgc2Nyb2xsZXIgYXQgYSBtaW5pbXVtIGlmIHRoZXJlJ3Mgbm8gbWF4LWhlaWdodC4KCQl0aGlzLiQuY2xpZW50LmFwcGx5U3R5bGUoIm1pbi1oZWlnaHQiLCB0aGlzLm1heEhlaWdodCA/IG51bGwgOiAiMTAwJSIpOwoJCXRoaXMuJC5jbGllbnQuYXBwbHlTdHlsZSgibWF4LWhlaWdodCIsIHRoaXMubWF4SGVpZ2h0KTsKCQl0aGlzLiQuY2xpZW50Q29udGFpbmVyLmFkZFJlbW92ZUNsYXNzKCJlbnlvLXNjcm9sbGVlLWZpdCIsICF0aGlzLm1heEhlaWdodCk7Cgl9LAoJc2hvdWxkRHJhZzogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQkvLyBzdG9wIGFuZCB1cGRhdGUgZHJhZyBpbmZvIGJlZm9yZSBjaGVja2luZyBkcmFnIHN0YXR1cwoJCXRoaXMuc3RvcCgpOwoJCXRoaXMuY2FsY1N0YXJ0SW5mbygpOwoJCXJldHVybiB0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCXN5bmNTY3JvbGxNYXRoOiBmdW5jdGlvbigpIHsKCQlpZiAoIXRoaXMudHJhbnNsYXRlT3B0aW1pemVkKSB7CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJfQoJfSwKCS8vKiBAcHVibGljCgkvLyogU2V0cyB0aGUgbGVmdCBzY3JvbGwgcG9zaXRpb24gd2l0aGluIHRoZSBzY3JvbGxlci4KCXNldFNjcm9sbExlZnQ6IGZ1bmN0aW9uKGluTGVmdCkgewoJCXRoaXMuc3RvcCgpOwoJCWlmICh0aGlzLnRyYW5zbGF0ZU9wdGltaXplZCkgewoJCQl2YXIgbSA9IHRoaXMuJC5zY3JvbGxNYXRoOwoJCQltLnNldFNjcm9sbFgoLWluTGVmdCk7CgkJCW0uc3RhYmlsaXplKCk7CgkJfSBlbHNlIHsKCQkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl9Cgl9LAoJLy8qIFNldHMgdGhlIHRvcCBzY3JvbGwgcG9zaXRpb24gd2l0aGluIHRoZSBzY3JvbGxlci4KCXNldFNjcm9sbFRvcDogZnVuY3Rpb24oaW5Ub3ApIHsKCQl0aGlzLnN0b3AoKTsKCQlpZiAodGhpcy50cmFuc2xhdGVPcHRpbWl6ZWQpIHsKCQkJdmFyIG0gPSB0aGlzLiQuc2Nyb2xsTWF0aDsKCQkJbS5zZXRTY3JvbGxZKC1pblRvcCk7CgkJCW0uc3RhYmlsaXplKCk7CgkJfSBlbHNlIHsKCQkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl9Cgl9LAoJLy8qIEdldHMgdGhlIGxlZnQgc2Nyb2xsIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2Nyb2xsZXIuCglnZXRTY3JvbGxMZWZ0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy50cmFuc2xhdGVPcHRpbWl6ZWQgPyB0aGlzLnNjcm9sbExlZnQ6IHRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJLy8qIEdldHMgdGhlIHRvcCBzY3JvbGwgcG9zaXRpb24gd2l0aGluIHRoZSBzY3JvbGxlci4KCWdldFNjcm9sbFRvcDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudHJhbnNsYXRlT3B0aW1pemVkID8gdGhpcy5zY3JvbGxUb3AgOiB0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCS8vKiBAcHJvdGVjdGVkCglzY3JvbGxNYXRoU3RhcnQ6IGZ1bmN0aW9uKGluU2VuZGVyKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl0aGlzLnNjcm9sbFN0YXJ0aW5nID0gdHJ1ZTsKCQl0aGlzLnN0YXJ0WCA9IDA7CgkJdGhpcy5zdGFydFkgPSAwOwoJCWlmICghdGhpcy50cmFuc2xhdGVPcHRpbWl6ZWQgJiYgdGhpcy5zY3JvbGxOb2RlKSB7CgkJCXRoaXMuc3RhcnRYID0gdGhpcy5nZXRTY3JvbGxMZWZ0KCk7CgkJCXRoaXMuc3RhcnRZID0gdGhpcy5nZXRTY3JvbGxUb3AoKTsKCQl9Cgl9LAoJc2Nyb2xsTWF0aFNjcm9sbDogZnVuY3Rpb24oaW5TZW5kZXIpIHsKCQlpZighdGhpcy5vdmVyc2Nyb2xsKSB7IC8vZG9uJ3Qgb3ZlcnNjcm9sbCBwYXN0IGVkZ2VzCgkJCXRoaXMuc2Nyb2xsTGVmdCA9IC1NYXRoLm1pbihpblNlbmRlci5sZWZ0Qm91bmRhcnksIE1hdGgubWF4KGluU2VuZGVyLnJpZ2h0Qm91bmRhcnksIGluU2VuZGVyLngpKTsKCQkJdGhpcy5zY3JvbGxUb3AgPSAtTWF0aC5taW4oaW5TZW5kZXIudG9wQm91bmRhcnksIE1hdGgubWF4KGluU2VuZGVyLmJvdHRvbUJvdW5kYXJ5LCBpblNlbmRlci55KSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5zY3JvbGxMZWZ0ID0gLWluU2VuZGVyLng7CgkJCXRoaXMuc2Nyb2xsVG9wID0gLWluU2VuZGVyLnk7CgkJfQoJCWlmICh0aGlzLmlzU2Nyb2xsaW5nKCkpIHsKCQkJaWYgKHRoaXMuJC5zY3JvbGxNYXRoLmlzU2Nyb2xsaW5nKCkpIHsKCQkJCXRoaXMuZWZmZWN0U2Nyb2xsKHRoaXMuc3RhcnRYIC0gdGhpcy5zY3JvbGxMZWZ0LCB0aGlzLnN0YXJ0WSAtIHRoaXMuc2Nyb2xsVG9wKTsKCQkJfQoJCQlpZiAodGhpcy50aHVtYikgewoJCQkJdGhpcy51cGRhdGVUaHVtYnMoKTsKCQkJfQoJCX0KCX0sCgkvLyBXaGlsZSBtb3ZpbmcsIHNjcm9sbGVyIHVzZXMgdHJhbnNsYXRlLgoJZWZmZWN0U2Nyb2xsOiBmdW5jdGlvbihpblgsIGluWSkgewoJCXZhciBvID0gaW5YICsgInB4LCAiICsgaW5ZICsgInB4IiArICh0aGlzLmFjY2VsID8gIiwwIiA6ICIiKTsKCQllbnlvLmRvbS50cmFuc2Zvcm1WYWx1ZSh0aGlzLiQuY2xpZW50LCB0aGlzLnRyYW5zbGF0aW9uLCBvKTsKCX0sCgkvLyBXaGVuIHN0b3BwZWQsIHdlIHVzZSBzY3JvbGxMZWZ0L1RvcCAobWFrZXMgY3Vyc29yIHBvc2l0aW9uaW5nIGF1dG9tYWdpYykuCgllZmZlY3RTY3JvbGxTdG9wOiBmdW5jdGlvbigpIHsKCQlpZiAoIXRoaXMudHJhbnNsYXRlT3B0aW1pemVkKSB7CgkJCXZhciB0ID0gIjAsMCIgKyAodGhpcy5hY2NlbCA/ICIsMCIgOiAiIik7CgkJCS8vIEZJWE1FOiBub3JtYWxseSB0cmFuc2xhdGUzZCBjaGFuZ2VzIG5vdCBlZmZlY3Qgc2Nyb2xsSGVpZ2h0OyBob3dldmVyCgkJCS8vIHRoZXJlIGFwcGVhciB0byBiZSBzb21lIGRvbSBjaGFuZ2VzIChlLmcuIHNob3dpbmcgYSBub2RlIGluc2lkZSB0aGUgc2Nyb2xsZXIsCgkJCS8vIHdoaWNoIGRvIGNhdXNlIHRoZSBzY3JvbGxIZWlnaHQgdG8gYmUgY2hhbmdlZCBmcm9tIHRoZSB0cmFuc2xhdGUzZC4KCQkJLy8gSW4gdGhpcyBjYXNlIHNldHRpbmcgdGhlIHRyYW5zbGF0ZTNkIGJhY2sgdG8gMCBkb2VzIG5vdCByZXN0b3JlIHNjcm9sbEhlaWdodC4KCQkJLy8gVGhpcyBjYXVzZXMgYSBwcm9ibGVtIGJlY2F1c2Ugc2V0dGluZyBzY3JvbGxUb3AgY2FuIHByb2R1Y2VkIGFuIHVuZXhwZWN0ZWQgcmVzdWx0IGlmCgkJCS8vIHNjcm9sbEhlaWdodCBpcyBsZXNzIHRoYW4gZXhwZWN0ZWQuCgkJCS8vIFdlIGRldGVjdCB0aGlzIGZhdWx0IGJ5IHZhbGlkYXRpbmcgc2Nyb2xsIGJvdW5kcyBhbmQgKDEpIHVuLWFwcGx5IHRoZSB0cmFuc2xhdGUzZCwKCQkJLy8gKDIpIHVwZGF0ZSBzY3JvbGxUb3AvTGVmdCwgYW5kICgzKSByZS1hcHBseSBhIDAsMCwwIHRyYW5zbGF0ZTNkIHRvIGVuc3VyZSBjb21wb3NpdGluZy4KCQkJLy8gTHVja2lseSB0aGlzIGNvcnJlY3RzIHRoZSBwcm9ibGVtICh3aGljaCBhcHBlYXJzIHRvIGJlIGEgd2Via2l0IGJ1ZykuIE5vdGUgdGhhdAoJCQkvLyBpdCdzIGltcG9ydGFudCB0byBtYWludGFpbiBhIGNvbXBvc2l0ZWQgc3RhdGUgKHRyYW5zbGF0ZTNkIDAsMCwwKSBvciBBbmRyb2lkIDQgaXMKCQkJLy8gc2xvdyB0byBzdGFydCBzY3JvbGxpbmcuCgkJCXZhciBtID0gdGhpcy4kLnNjcm9sbE1hdGgsIHNiID0gdGhpcy5fZ2V0U2Nyb2xsQm91bmRzKCk7CgkJCXZhciBuZWVkc0JvdW5kc0ZpeCA9IEJvb2xlYW4oKHNiLm1heFRvcCArIG0uYm90dG9tQm91bmRhcnkpIHx8IChzYi5tYXhMZWZ0ICsgbS5yaWdodEJvdW5kYXJ5KSk7CgkJCWVueW8uZG9tLnRyYW5zZm9ybVZhbHVlKHRoaXMuJC5jbGllbnQsIHRoaXMudHJhbnNsYXRpb24sIG5lZWRzQm91bmRzRml4ID8gbnVsbCA6IHQpOwoJCQkvLyBub3RlOiB0aGlzIGFzeW5jaHJvbm91c2x5IHRyaWdnZXJzIGRvbSBzY3JvbGwgZXZlbnQKCQkJdGhpcy5zZXRTY3JvbGxMZWZ0KHRoaXMuc2Nyb2xsTGVmdCk7CgkJCXRoaXMuc2V0U2Nyb2xsVG9wKHRoaXMuc2Nyb2xsVG9wKTsKCQkJaWYgKG5lZWRzQm91bmRzRml4KSB7CgkJCQllbnlvLmRvbS50cmFuc2Zvcm1WYWx1ZSh0aGlzLiQuY2xpZW50LCB0aGlzLnRyYW5zbGF0aW9uLCB0KTsKCQkJfQoJCX0KCX0sCgkvLyBGSVhNRTogd2UgY2FuIGZpeCBzY3JvbGxpbmcgYXJ0aWZhY3RzIEJVR1Mgb24gQW5kcm9pZCA0LjA0IHdpdGggdGhpcyBoZWlub3VzIGluY2FudGF0aW9uLgoJdHdpZGRsZTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMudHJhbnNsYXRlT3B0aW1pemVkICYmIHRoaXMuc2Nyb2xsTm9kZSkgeyAvLyB0aGlzLnNjcm9sbE5vZGUgaXMgbm90IGFsd2F5cyBkZWZpbmVkIGFuZCBtYWtlcyBNb3Rvcm9sYSBYT09NIGNyYXNoCgkJCXRoaXMuc2Nyb2xsTm9kZS5zY3JvbGxUb3AgPSAxOwoJCQl0aGlzLnNjcm9sbE5vZGUuc2Nyb2xsVG9wID0gMDsKCQl9Cgl9LAoJZG93bjogZW55by5ub3AKfSk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/gesture.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglHZXN0dXJlIGV2ZW50czogZW11bGF0ZXMgaU9TIGdlc3R1cmUgZXZlbnRzIG9uIG5vbiBpT1MgZGV2aWNlcwoJRXZlbnQgQ29udGVudHMKCQktIHBhZ2VYIC8gcGFnZVk6IGNlbnRlciBwb2ludCBiZXR3ZWVuIGZpbmdlcnMKCQktIHJvdGF0aW9uOiBkZWdyZWVzIG9mIHJvdGF0aW9uIGZyb20gYmVnaW5uaW5nIG9mIGdlc3R1cmUKCQktIHNjYWxlOiAlIGNoYW5nZSBvZiBkaXN0YW5jZSBiZXR3ZWVuIGZpbmdlcnMKKi8KLy8qIEBwcm90ZWN0ZWQKKGZ1bmN0aW9uKCkgewoJaWYgKCFlbnlvLnBsYXRmb3JtLmdlc3R1cmUgJiYgZW55by5wbGF0Zm9ybS50b3VjaCkgewoJCWVueW8uZGlzcGF0Y2hlci5mZWF0dXJlcy5wdXNoKGZ1bmN0aW9uKGUpIHsKCQkJaWYgKGhhbmRsZXJzW2UudHlwZV0pIHsKCQkJCXRvdWNoR2VzdHVyZXNbZS50eXBlXShlKTsKCQkJfQoJCX0pOwoJfQoJdmFyIGhhbmRsZXJzID0gewoJCXRvdWNoc3RhcnQ6IHRydWUsCgkJdG91Y2htb3ZlOiB0cnVlLAoJCXRvdWNoZW5kOiB0cnVlCgl9OwoJdmFyIHRvdWNoR2VzdHVyZXMgPSB7CgkJb3JkZXJlZFRvdWNoZXM6IFtdLAoJCWdlc3R1cmU6IG51bGwsCgkJdG91Y2hzdGFydDogZnVuY3Rpb24oaW5FdmVudCkgewoJCQkvLyBzb21lIGRldmljZXMgY2FuIHNlbmQgbXVsdGlwbGUgY2hhbmdlZCB0b3VjaGVzIG9uIHN0YXJ0IGFuZCBlbmQKCQkJZW55by5mb3JFYWNoKGluRXZlbnQuY2hhbmdlZFRvdWNoZXMsIGZ1bmN0aW9uKHQpIHsKCQkJCXZhciBpZCA9IHQuaWRlbnRpZmllcjsKCQkJCS8vIHNvbWUgZGV2aWNlcyBjYW4gc2VuZCBtdWx0aXBsZSB0b3VjaHN0YXJ0cwoJCQkJaWYgKGVueW8uaW5kZXhPZihpZCwgdGhpcy5vcmRlcmVkVG91Y2hlcykgPCAwKSB7CgkJCQkJdGhpcy5vcmRlcmVkVG91Y2hlcy5wdXNoKGlkKTsKCQkJCX0KCQkJfSwgdGhpcyk7CgkJCWlmIChpbkV2ZW50LnRvdWNoZXMubGVuZ3RoID49IDIgJiYgIXRoaXMuZ2VzdHVyZSkgewoJCQkJdmFyIHAgPSB0aGlzLmdlc3R1cmVQb3NpdGlvbnMoaW5FdmVudCk7CgkJCQl0aGlzLmdlc3R1cmUgPSB0aGlzLmdlc3R1cmVWZWN0b3IocCk7CgkJCQl0aGlzLmdlc3R1cmUuYW5nbGUgPSB0aGlzLmdlc3R1cmVBbmdsZShwKTsKCQkJCXRoaXMuZ2VzdHVyZS5zY2FsZSA9IDE7CgkJCQl0aGlzLmdlc3R1cmUucm90YXRpb24gPSAwOwoJCQkJdmFyIGcgPSB0aGlzLm1ha2VHZXN0dXJlKCJnZXN0dXJlc3RhcnQiLCBpbkV2ZW50LCB7dmVjdG9yOiB0aGlzLmdlc3R1cmUsIHNjYWxlOiAxLCByb3RhdGlvbjogMH0pOwoJCQkJZW55by5kaXNwYXRjaChnKTsKCQkJfQoJCX0sCgkJdG91Y2hlbmQ6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQkJLy8gc29tZSBkZXZpY2VzIGNhbiBzZW5kIG11bHRpcGxlIGNoYW5nZWQgdG91Y2hlcyBvbiBzdGFydCBhbmQgZW5kCgkJCWVueW8uZm9yRWFjaChpbkV2ZW50LmNoYW5nZWRUb3VjaGVzLCBmdW5jdGlvbih0KSB7CgkJCQllbnlvLnJlbW92ZSh0LmlkZW50aWZpZXIsIHRoaXMub3JkZXJlZFRvdWNoZXMpOwoJCQl9LCB0aGlzKTsKCQkJaWYgKGluRXZlbnQudG91Y2hlcy5sZW5ndGggPD0gMSAmJiB0aGlzLmdlc3R1cmUpIHsKCQkJCXZhciB0ID0gaW5FdmVudC50b3VjaGVzWzBdIHx8IGluRXZlbnQuY2hhbmdlZFRvdWNoZXNbaW5FdmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggLSAxXTsKCQkJCS8vIGdlc3R1cmUgZW5kIHNlbmRzIGxhc3Qgcm90YXRpb24gYW5kIHNjYWxlLCB3aXRoIHRoZSB4L3kgb2YgdGhlIGxhc3QgZmluZ2VyCgkJCQllbnlvLmRpc3BhdGNoKHRoaXMubWFrZUdlc3R1cmUoImdlc3R1cmVlbmQiLCBpbkV2ZW50LCB7dmVjdG9yOiB7eGNlbnRlcjogdC5wYWdlWCwgeWNlbnRlcjogdC5wYWdlWX0sIHNjYWxlOiB0aGlzLmdlc3R1cmUuc2NhbGUsIHJvdGF0aW9uOiB0aGlzLmdlc3R1cmUucm90YXRpb259KSk7CgkJCQl0aGlzLmdlc3R1cmUgPSBudWxsOwoJCQl9CgkJfSwKCQl0b3VjaG1vdmU6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQkJaWYgKHRoaXMuZ2VzdHVyZSkgewoJCQkJdmFyIGcgPSB0aGlzLm1ha2VHZXN0dXJlKCJnZXN0dXJlY2hhbmdlIiwgaW5FdmVudCk7CgkJCQl0aGlzLmdlc3R1cmUuc2NhbGUgPSBnLnNjYWxlOwoJCQkJdGhpcy5nZXN0dXJlLnJvdGF0aW9uID0gZy5yb3RhdGlvbjsKCQkJCWVueW8uZGlzcGF0Y2goZyk7CgkJCX0KCQl9LAoJCWZpbmRJZGVudGlmaWVkVG91Y2g6IGZ1bmN0aW9uKGluVG91Y2hlcywgaW5JZCkgewoJCQlmb3IgKHZhciBpID0gMCwgdDsgKHQgPSBpblRvdWNoZXNbaV0pOyBpKyspIHsKCQkJCWlmICh0LmlkZW50aWZpZXIgPT09IGluSWQpIHsKCQkJCQlyZXR1cm4gdDsKCQkJCX0KCQkJfQoJCX0sCgkJZ2VzdHVyZVBvc2l0aW9uczogZnVuY3Rpb24oaW5FdmVudCkgewoJCQl2YXIgZmlyc3QgPSB0aGlzLmZpbmRJZGVudGlmaWVkVG91Y2goaW5FdmVudC50b3VjaGVzLCB0aGlzLm9yZGVyZWRUb3VjaGVzWzBdKTsKCQkJdmFyIGxhc3QgPSB0aGlzLmZpbmRJZGVudGlmaWVkVG91Y2goaW5FdmVudC50b3VjaGVzLCB0aGlzLm9yZGVyZWRUb3VjaGVzW3RoaXMub3JkZXJlZFRvdWNoZXMubGVuZ3RoIC0gMV0pOwoJCQl2YXIgZnggPSBmaXJzdC5wYWdlWCwgbHggPSBsYXN0LnBhZ2VYLCBmeSA9IGZpcnN0LnBhZ2VZLCBseSA9IGxhc3QucGFnZVk7CgkJCS8vIGNlbnRlciB0aGUgZmlyc3QgdG91Y2ggYXMgMCwwCgkJCXZhciB4ID0gbHggLSBmeCwgeSA9IGx5IC0gZnk7CgkJCXZhciBoID0gTWF0aC5zcXJ0KHgqeCArIHkqeSk7CgkJCXJldHVybiB7eDogeCwgeTogeSwgaDogaCwgZng6IGZ4LCBseDogbHgsIGZ5OiBmeSwgbHk6IGx5fTsKCQl9LAoJCS8vIGZpbmQgcm90YXRpb24gYW5nbGUKCQlnZXN0dXJlQW5nbGU6IGZ1bmN0aW9uKGluUG9zaXRpb25zKSB7CgkJCXZhciBwID0gaW5Qb3NpdGlvbnM7CgkJCS8vIHlheSBtYXRoISwgcmFkIC0+IGRlZwoJCQl2YXIgYSA9IE1hdGguYXNpbihwLnkgLyBwLmgpICogKDE4MCAvIE1hdGguUEkpOwoJCQkvLyBmaXggZm9yIHJhbmdlIGxpbWl0cyBvZiBhc2luICgtOTAgdG8gOTApCgkJCS8vIFF1YWRyYW50cyBJSSBhbmQgSUlJCgkJCWlmIChwLnggPCAwKSB7CgkJCQlhID0gMTgwIC0gYTsKCQkJfQoJCQkvLyBRdWFkcmFudCBJVgoJCQlpZiAocC54ID4gMCAmJiBwLnkgPCAwKSB7CgkJCQlhICs9IDM2MDsKCQkJfQoJCQlyZXR1cm4gYTsKCQl9LAoJCS8vIGZpbmQgYm91bmRpbmcgYm94CgkJZ2VzdHVyZVZlY3RvcjogZnVuY3Rpb24oaW5Qb3NpdGlvbnMpIHsKCQkJLy8gdGhlIGxlYXN0IHJlY2VudCB0b3VjaCBhbmQgdGhlIG1vc3QgcmVjZW50IHRvdWNoIGRldGVybWluZSB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBnZXN0dXJlIGV2ZW50CgkJCXZhciBwID0gaW5Qb3NpdGlvbnM7CgkJCS8vIGNlbnRlciB0aGUgZmlyc3QgdG91Y2ggYXMgMCwwCgkJCXJldHVybiB7CgkJCQltYWduaXR1ZGU6IHAuaCwKCQkJCXhjZW50ZXI6IE1hdGguYWJzKE1hdGgucm91bmQocC5meCArIChwLnggLyAyKSkpLAoJCQkJeWNlbnRlcjogTWF0aC5hYnMoTWF0aC5yb3VuZChwLmZ5ICsgKHAueSAvIDIpKSkKCQkJfTsKCQl9LAoJCW1ha2VHZXN0dXJlOiBmdW5jdGlvbihpblR5cGUsIGluRXZlbnQsIGluQ2FjaGUpIHsKCQkJdmFyIHZlY3Rvciwgc2NhbGUsIHJvdGF0aW9uOwoJCQlpZiAoaW5DYWNoZSkgewoJCQkJdmVjdG9yID0gaW5DYWNoZS52ZWN0b3I7CgkJCQlzY2FsZSA9IGluQ2FjaGUuc2NhbGU7CgkJCQlyb3RhdGlvbiA9IGluQ2FjaGUucm90YXRpb247CgkJCX0gZWxzZSB7CgkJCQl2YXIgcCA9IHRoaXMuZ2VzdHVyZVBvc2l0aW9ucyhpbkV2ZW50KTsKCQkJCXZlY3RvciA9IHRoaXMuZ2VzdHVyZVZlY3RvcihwKTsKCQkJCXNjYWxlID0gdmVjdG9yLm1hZ25pdHVkZSAvIHRoaXMuZ2VzdHVyZS5tYWduaXR1ZGU7CgkJCQkvLyBnZXN0dXJlRXZlbnQucm90YXRpb24gaXMgZGlmZmVyZW5jZSBmcm9tIHRoZSBzdGFydGluZyBhbmdsZSwgY2xvY2t3aXNlCgkJCQlyb3RhdGlvbiA9ICgzNjAgKyB0aGlzLmdlc3R1cmVBbmdsZShwKSAtIHRoaXMuZ2VzdHVyZS5hbmdsZSkgJSAzNjA7CgkJCX0KCQkJdmFyIGUgPSBlbnlvLmNsb25lKGluRXZlbnQpOwoJCQlyZXR1cm4gZW55by5taXhpbihlLCB7CgkJCQl0eXBlOiBpblR5cGUsCgkJCQlzY2FsZTogc2NhbGUsCgkJCQlwYWdlWDogdmVjdG9yLnhjZW50ZXIsCgkJCQlwYWdlWTogdmVjdG9yLnljZW50ZXIsCgkJCQlyb3RhdGlvbjogcm90YXRpb24KCQkJfSk7CgkJfQoJfTsKfSkoKTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/msevents.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwcm90ZWN0ZWQKKGZ1bmN0aW9uKCkgewoJLy8gYWRkIHRvdWNoLXNwZWNpZmljIGdlc3R1cmUgZmVhdHVyZQoJdmFyIGdlc3R1cmUgPSBlbnlvLmdlc3R1cmU7CglpZiAod2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkKSB7CgkJdmFyIG1zRXZlbnRzID0gWwoJCQkiTVNQb2ludGVyRG93biIsCgkJCSJNU1BvaW50ZXJVcCIsCgkJCSJNU1BvaW50ZXJNb3ZlIiwKCQkJIk1TUG9pbnRlck92ZXIiLAoJCQkiTVNQb2ludGVyT3V0IiwKCQkJIk1TUG9pbnRlckNhbmNlbCIsCgkJCSJNU0dlc3R1cmVUYXAiLAoJCQkiTVNHZXN0dXJlRG91YmxlVGFwIiwKCQkJIk1TR2VzdHVyZUhvbGQiLAoJCQkiTVNHZXN0dXJlU3RhcnQiLAoJCQkiTVNHZXN0dXJlQ2hhbmdlIiwKCQkJIk1TR2VzdHVyZUVuZCIKCQldOwoJCWVueW8uZm9yRWFjaChtc0V2ZW50cywgZnVuY3Rpb24oZSkgewoJCQllbnlvLmRpc3BhdGNoZXIubGlzdGVuKGRvY3VtZW50LCBlKTsKCQl9KTsKCQkvLyBhZGQgb3VyIG93biBNU1BvaW50ZXIgZXZlbnQgaGFuZGxlcgoJCWVueW8uZGlzcGF0Y2hlci5mZWF0dXJlcy5wdXNoKGZ1bmN0aW9uKGUpIHsKCQkJaWYgKGhhbmRsZXJzW2UudHlwZV0gJiYgZS5pc1ByaW1hcnkpIHsKCQkJCWhhbmRsZXJzW2UudHlwZV0oZSk7CgkJCX0KCQl9KTsKCQkvLyByZW1vdmUgdGhlIGRlZmF1bHQgbW91c2UgZXZlbnQgaGFuZGxlcnMKCQllbnlvLmdlc3R1cmUuZXZlbnRzID0ge307Cgl9CgoJdmFyIG1ha2VFdmVudCA9IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQl2YXIgZSA9IGVueW8uY2xvbmUoaW5FdmVudCk7CgkJZS5zcmNFdmVudCA9IGluRXZlbnQ7CgkJLy8gbm9ybWFsaXplICJtb3VzZSBidXR0b24iIGluZm8KCQllLndoaWNoID0gMTsKCQlyZXR1cm4gZTsKCX07CgoJdmFyIGhhbmRsZXJzID0gewoJCS8vIEZJWE1FOiBuZWVkIHRvIHJlZ2lzdGVyIGZvciBnZXN0dXJlcyBpbiBNU1BvaW50ZXJEb3duCgkJLy8gYWNjb3JkaW5nIHRvIE1pY3Jvc29mdCBkb2NzCgkJLypNU0dlc3R1cmVTdGFydDogZnVuY3Rpb24oaW5FdmVudCkgewoJCQllbnlvLmRpc3BhdGNoKGdlc3R1cmVOb3JtYWxpemUoImdlc3R1cmVzdGFydCIsIGluRXZlbnQpKTsKCQl9LAoJCU1TR2VzdHVyZUNoYW5nZTogZnVuY3Rpb24oaW5FdmVudCkgewoJCQllbnlvLmRpc3BhdGNoKGdlc3R1cmVOb3JtYWxpemUoImdlc3R1cmVjaGFuZ2UiLCBpbkV2ZW50KSk7CgkJfSwKCQlNU0dlc3R1cmVFbmQ6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQkJZW55by5kaXNwYXRjaChnZXN0dXJlTm9ybWFsaXplKCJnZXN0dXJlZW5kIiwgaW5FdmVudCkpOwoJCX0sKi8KCQlNU1BvaW50ZXJEb3duOiBmdW5jdGlvbihpbkV2ZW50KSB7CgkJCXZhciBlID0gbWFrZUV2ZW50KGluRXZlbnQpOwoJCQlnZXN0dXJlLmRvd24oZSk7CgkJfSwKCQlNU1BvaW50ZXJVcDogZnVuY3Rpb24oaW5FdmVudCkgewoJCQl2YXIgZSA9IG1ha2VFdmVudChpbkV2ZW50KTsKCQkJZ2VzdHVyZS51cChlKTsKCQl9LAoJCU1TUG9pbnRlck1vdmU6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQkJdmFyIGUgPSBtYWtlRXZlbnQoaW5FdmVudCk7CgkJCWdlc3R1cmUubW92ZShlKTsKCQl9LAoJCU1TUG9pbnRlckNhbmNlbDogZnVuY3Rpb24oaW5FdmVudCkgewoJCQkvLyBGSVhNRTogbm90IHJlYWxseSB0aGUgc2FtZSBhcyB0b3VjaGVuZCwgYXMgdG91Y2ggYWN0aW9uCgkJCS8vIHdhcyBjYW5jZWxsZWQsIGJ1dCBFbnlvIGRvZXNuJ3QgaGF2ZSB0aGF0IGNvbmNlcHQKCQkJdmFyIGUgPSBtYWtlRXZlbnQoaW5FdmVudCk7CgkJCWdlc3R1cmUudXAoZSk7CgkJfSwKCQlNU1BvaW50ZXJPdmVyOiBmdW5jdGlvbihpbkV2ZW50KSB7CgkJCXZhciBlID0gbWFrZUV2ZW50KGluRXZlbnQpOwoJCQlnZXN0dXJlLm92ZXIoZSk7CgkJfSwKCQlNU1BvaW50ZXJPdXQ6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQkJdmFyIGUgPSBtYWtlRXZlbnQoaW5FdmVudCk7CgkJCWdlc3R1cmUub3V0KGUpOwoJCX0KCX07Cn0pKCk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJInRvdWNoLmpzIiwKCSJtc2V2ZW50cy5qcyIsCgkiZ2VzdHVyZS5qcyIsCgkiU2Nyb2xsTWF0aC5qcyIsCgkiU2Nyb2xsU3RyYXRlZ3kuanMiLAoJIlRodW1iLmNzcyIsCgkiVGh1bWIuanMiLAoJIlRvdWNoU2Nyb2xsU3RyYXRlZ3kuanMiLAoJIlRyYW5zbGF0ZVNjcm9sbFN0cmF0ZWd5LmpzIiwKCSJUcmFuc2l0aW9uU2Nyb2xsU3RyYXRlZ3kuanMiLAoJIlNjcm9sbGVyLmpzIiwKCSJTY3JvbGxlci5jc3MiCik7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/touch/touch.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwcm90ZWN0ZWQKZW55by5yZXF1aXJlc1dpbmRvdyhmdW5jdGlvbigpIHsKCS8vIGFkZCB0b3VjaC1zcGVjaWZpYyBnZXN0dXJlIGZlYXR1cmUKCXZhciBnZXN0dXJlID0gZW55by5nZXN0dXJlOwoJdmFyIG9sZGV2ZW50cyA9IGdlc3R1cmUuZXZlbnRzOwoJLy8KCWdlc3R1cmUuZXZlbnRzLnRvdWNoc3RhcnQgPSBmdW5jdGlvbihlKSB7CgkJLy8gZm9yIGR1cmF0aW9uIG9mIHRoaXMgdG91Y2gsIG9ubHkgaGFuZGxlIHRvdWNoIGV2ZW50cy4gIE9sZCBldmVudAoJCS8vIHN0cnVjdHVyZSB3aWxsIGJlIHJlc3RvcmVkIGR1cmluZyB0b3VjaGVuZC4KCQlnZXN0dXJlLmV2ZW50cyA9IHRvdWNoR2VzdHVyZTsKCQlnZXN0dXJlLmV2ZW50cy50b3VjaHN0YXJ0KGUpOwoJfTsKCS8vCgl2YXIgdG91Y2hHZXN0dXJlID0gewoJCV90b3VjaENvdW50OiAwLAoJCXRvdWNoc3RhcnQ6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQkJdGhpcy5fdG91Y2hDb3VudCArPSBpbkV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsKCQkJdGhpcy5leGNsdWRlZFRhcmdldCA9IG51bGw7CgkJCXZhciBlID0gdGhpcy5tYWtlRXZlbnQoaW5FdmVudCk7CgkJCWdlc3R1cmUuZG93bihlKTsKCQkJLy8gZ2VuZXJhdGUgYSBuZXcgZXZlbnQgb2JqZWN0IHNpbmNlIG92ZXIgaXMgYSBkaWZmZXJlbnQgZXZlbnQKCQkJZSA9IHRoaXMubWFrZUV2ZW50KGluRXZlbnQpOwoJCQl0aGlzLm92ZXJFdmVudCA9IGU7CgkJCWdlc3R1cmUub3ZlcihlKTsKCQl9LAoJCXRvdWNobW92ZTogZnVuY3Rpb24oaW5FdmVudCkgewoJCQllbnlvLmpvYi5zdG9wKCJyZXNldEdlc3R1cmVFdmVudHMiKTsKCQkJLy8gTk9URTogYWxsb3cgdXNlciB0byBzdXBwbHkgYSBub2RlIHRvIGV4Y2x1ZGUgZnJvbSBldmVudAoJCQkvLyB0YXJnZXQgZmluZGluZyB2aWEgdGhlIGRyYWcgZXZlbnQuCgkJCXZhciBkZSA9IGdlc3R1cmUuZHJhZy5kcmFnRXZlbnQ7CgkJCXRoaXMuZXhjbHVkZWRUYXJnZXQgPSBkZSAmJiBkZS5kcmFnSW5mbyAmJiBkZS5kcmFnSW5mby5ub2RlOwoJCQl2YXIgZSA9IHRoaXMubWFrZUV2ZW50KGluRXZlbnQpOwoJCQlnZXN0dXJlLm1vdmUoZSk7CgkJCS8vIHByZXZlbnQgZGVmYXVsdCBkb2N1bWVudCBzY3JvbGxpbmcgaWYgZW55by5ib2R5SXNGaXR0aW5nID09IHRydWUKCQkJLy8gYXZvaWQgd2luZG93IHNjcm9sbGluZyBieSBwcmV2ZW50aW5nIGRlZmF1bHQgb24gdGhpcyBldmVudAoJCQkvLyBub3RlOiB0aGlzIGV2ZW50IGNhbiBiZSBtYWRlIHVucHJldmVudGFibGUgKG5hdGl2ZSBzY3JvbGxlcnMgZG8gdGhpcykKCQkJaWYgKGVueW8uYm9keUlzRml0dGluZykgewoJCQkJaW5FdmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQl9CgkJCS8vIHN5bnRoZXNpemUgb3ZlciBhbmQgb3V0IChub3JtYWxseSBnZW5lcmF0ZWQgdmlhIG1vdXNlb3V0KQoJCQlpZiAodGhpcy5vdmVyRXZlbnQgJiYgdGhpcy5vdmVyRXZlbnQudGFyZ2V0ICE9IGUudGFyZ2V0KSB7CgkJCQl0aGlzLm92ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZS50YXJnZXQ7CgkJCQllLnJlbGF0ZWRUYXJnZXQgPSB0aGlzLm92ZXJFdmVudC50YXJnZXQ7CgkJCQlnZXN0dXJlLm91dCh0aGlzLm92ZXJFdmVudCk7CgkJCQlnZXN0dXJlLm92ZXIoZSk7CgkJCX0KCQkJdGhpcy5vdmVyRXZlbnQgPSBlOwoJCX0sCgkJdG91Y2hlbmQ6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQkJZ2VzdHVyZS51cCh0aGlzLm1ha2VFdmVudChpbkV2ZW50KSk7CgkJCS8vIE5PVEU6IGluIHRvdWNoIGxhbmQsIHRoZXJlIGlzIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4KCQkJLy8gYSBwb2ludGVyIGVudGVyL2xlYXZlIGFuZCBhIGRyYWcgb3Zlci9vdXQuCgkJCS8vIFdoaWxlIGl0IG1heSBtYWtlIHNlbnNlIHRvIHNlbmQgYSBsZWF2ZSBldmVudCB3aGVuIGEgdG91Y2gKCQkJLy8gZW5kcywgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBzZW5kIGEgZHJhZ291dC4KCQkJLy8gV2UgYXZvaWQgdGhpcyBieSBwcm9jZXNzaW5nIG91dCBhZnRlciB1cCwgYnV0CgkJCS8vIHRoaXMgb3JkZXJpbmcgaXMgYWQgaG9jLgoJCQlnZXN0dXJlLm91dCh0aGlzLm92ZXJFdmVudCk7CgkJCS8vIHJlc2V0IHRoZSBldmVudCBoYW5kbGVycyBiYWNrIHRvIHRoZSBtb3VzZS1mcmllbmRseSBvbmVzIGFmdGVyCgkJCS8vIGEgc2hvcnQgdGltZW91dC4gV2UgY2FuJ3QgZG8gdGhpcyBkaXJlY3RseSBpbiB0aGlzIGhhbmRsZXIKCQkJLy8gYmVjYXVzZSBpdCBtZXNzZXMgdXAgQW5kcm9pZCB0byBoYW5kbGUgdGhlIG1vdXNldXAgZXZlbnQuCgkJCS8vIEZJWE1FOiBmb3IgMi4xIHJlbGVhc2UsIGNvbmRpdGlvbmFsIG9uIHBsYXRmb3JtIGJlaW5nCgkJCS8vIGRlc2t0b3AgQ2hyb21lLCBzaW5jZSB3ZSdyZSBzZWVpbmcgaXNzdWVzIGluIFBob25lR2FwIHdpdGggdGhpcwoJCQkvLyBjb2RlLgoJCQl0aGlzLl90b3VjaENvdW50IC09IGluRXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoOwoJCX0sCgkJLy8gdXNlIG1vdXNldXAgYWZ0ZXIgdG91Y2hlcyBhcmUgZG9uZSB0byByZXNldCBldmVudCBoYW5kbGluZyBiYWNrIHRvIGRlZmF1bHQKCQkvLyAtLXRoaXMgd29ya3MgYXMgbG9uZyBhcyBubyBvbmUgZGlkIGEgcHJldmVudERlZmF1bHQgb24gdGhlIHRvdWNoIGV2ZW50cwoJCW1vdXNldXA6IGZ1bmN0aW9uKGUpIHsKCQkJaWYgKHRoaXMuX3RvdWNoQ291bnQgPT09IDApIHsKCQkJCXRoaXMuc2F3TW91c2Vkb3duID0gZmFsc2U7CgkJCQlnZXN0dXJlLmV2ZW50cyA9IG9sZGV2ZW50czsKCQkJfQoJCX0sCgkJbWFrZUV2ZW50OiBmdW5jdGlvbihpbkV2ZW50KSB7CgkJCXZhciBlID0gZW55by5jbG9uZShpbkV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKTsKCQkJZS5zcmNFdmVudCA9IGluRXZlbnQ7CgkJCWUudGFyZ2V0ID0gdGhpcy5maW5kVGFyZ2V0KGUpOwoJCQkvLyBub3JtYWxpemUgIm1vdXNlIGJ1dHRvbiIgaW5mbwoJCQllLndoaWNoID0gMTsKCQkJLy9lbnlvLmxvZygidGFyZ2V0IGZvciAiICsgaW5FdmVudC50eXBlICsgIiBhdCAiICsgZS5wYWdlWCArICIsICIgKyBlLnBhZ2VZICsgIiBpcyAiICsgKGUudGFyZ2V0ID8gZS50YXJnZXQuaWQgOiAibm9uZSIpKTsKCQkJcmV0dXJuIGU7CgkJfSwKCQljYWxjTm9kZU9mZnNldDogZnVuY3Rpb24oaW5Ob2RlKSB7CgkJCWlmIChpbk5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7CgkJCQl2YXIgbyA9IGluTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCQkJCXJldHVybiB7CgkJCQkJbGVmdDogby5sZWZ0LAoJCQkJCXRvcDogby50b3AsCgkJCQkJd2lkdGg6IG8ud2lkdGgsCgkJCQkJaGVpZ2h0OiBvLmhlaWdodAoJCQkJfTsKCQkJfQoJCX0sCgkJZmluZFRhcmdldDogZnVuY3Rpb24oZSkgewoJCQlyZXR1cm4gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLmNsaWVudFgsIGUuY2xpZW50WSk7CgkJfSwKCQkvLyBOT1RFOiB3aWxsIGZpbmQgb25seSAxIGVsZW1lbnQgdW5kZXIgdGhlIHRvdWNoIGFuZAoJCS8vIHdpbGwgZmFpbCBpZiBhbiBlbGVtZW50IGlzIHBvc2l0aW9uZWQgb3V0c2lkZSB0aGUgYm91bmRpbmcgYm94IG9mIGl0cyBwYXJlbnQKCQlmaW5kVGFyZ2V0VHJhdmVyc2U6IGZ1bmN0aW9uKGluTm9kZSwgaW5YLCBpblkpIHsKCQkJdmFyIG4gPSBpbk5vZGUgfHwgZG9jdW1lbnQuYm9keTsKCQkJdmFyIG8gPSB0aGlzLmNhbGNOb2RlT2Zmc2V0KG4pOwoJCQlpZiAobyAmJiBuICE9IHRoaXMuZXhjbHVkZWRUYXJnZXQpIHsKCQkJCXZhciB4ID0gaW5YIC0gby5sZWZ0OwoJCQkJdmFyIHkgPSBpblkgLSBvLnRvcDsKCQkJCS8vZW55by5sb2coInRlc3Q6ICIgKyBuLmlkICsgIiAobGVmdDogIiArIG8ubGVmdCArICIsIHRvcDogIiArIG8udG9wICsgIiwgd2lkdGg6ICIgKyBvLndpZHRoICsgIiwgaGVpZ2h0OiAiICsgby5oZWlnaHQgKyAiKSIpOwoJCQkJaWYgKHg+MCAmJiB5PjAgJiYgeDw9by53aWR0aCAmJiB5PD1vLmhlaWdodCkgewoJCQkJCS8vZW55by5sb2coIklOOiAiICsgbi5pZCArICIgLT4gWyIgKyB4ICsgIiwiICsgeSArICIgaW4gIiArIG8ud2lkdGggKyAieCIgKyBvLmhlaWdodCArICJdIChjaGlsZHJlbjogIiArIG4uY2hpbGROb2Rlcy5sZW5ndGggKyAiKSIpOwoJCQkJCXZhciB0YXJnZXQ7CgkJCQkJZm9yICh2YXIgbiQ9bi5jaGlsZE5vZGVzLCBpPW4kLmxlbmd0aC0xLCBjOyAoYz1uJFtpXSk7IGktLSkgewoJCQkJCQl0YXJnZXQgPSB0aGlzLmZpbmRUYXJnZXRUcmF2ZXJzZShjLCBpblgsIGluWSk7CgkJCQkJCWlmICh0YXJnZXQpIHsKCQkJCQkJCXJldHVybiB0YXJnZXQ7CgkJCQkJCX0KCQkJCQl9CgkJCQkJcmV0dXJuIG47CgkJCQl9CgkJCX0KCQl9LAoJCWNvbm5lY3Q6IGZ1bmN0aW9uKCkgewoJCQllbnlvLmZvckVhY2goWydvbnRvdWNoc3RhcnQnLCAnb250b3VjaG1vdmUnLCAnb250b3VjaGVuZCcsICdvbmdlc3R1cmVzdGFydCcsICdvbmdlc3R1cmVjaGFuZ2UnLCAnb25nZXN0dXJlZW5kJ10sIGZ1bmN0aW9uKGUpIHsKCQkJCWRvY3VtZW50W2VdID0gZW55by5kaXNwYXRjaDsKCQkJfSk7CgkJCWlmIChlbnlvLnBsYXRmb3JtLmFuZHJvaWRDaHJvbWUgPD0gMTggfHwgZW55by5wbGF0Zm9ybS5zaWxrID09PSAyKSB7CgkJCQkvLyBIQUNLOiBvbiBDaHJvbWUgZm9yIEFuZHJvaWQgdjE4IG9uIGRldmljZXMgd2l0aCBoaWdoZXIgZGVuc2l0eSBkaXNwbGF5cywKCQkJCS8vIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQgZXhwZWN0cyBzY3JlZW4gY29vcmRpbmF0ZXMsIG5vdCBkb2N1bWVudCBvbmVzCgkJCQkvLyBidWcgYWxzbyBhcHBlYXJzIG9uIEtpbmRsZSBGaXJlIEhECgkJCQl0aGlzLmZpbmRUYXJnZXQgPSBmdW5jdGlvbihlKSB7CgkJCQkJcmV0dXJuIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5zY3JlZW5YLCBlLnNjcmVlblkpOwoJCQkJfTsKCQkJfSBlbHNlIGlmICghZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCkgewoJCQkJdGhpcy5maW5kVGFyZ2V0ID0gZnVuY3Rpb24oZSkgewoJCQkJCXJldHVybiB0aGlzLmZpbmRUYXJnZXRUcmF2ZXJzZShudWxsLCBlLmNsaWVudFgsIGUuY2xpZW50WSk7CgkJCQl9OwoJCQl9CgkJfQoJfTsKCS8vCgl0b3VjaEdlc3R1cmUuY29ubmVjdCgpOwp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Animator.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5BbmltYXRvcl8gaXMgYSBiYXNpYyBhbmltYXRpb24gY29tcG9uZW50LiAgQ2FsbCBfcGxheV8gdG8gc3RhcnQgdGhlCglhbmltYXRpb24uIFRoZSBhbmltYXRpb24gd2lsbCBydW4gZm9yIHRoZSBwZXJpb2QgKGluIG1pbGxpc2Vjb25kcykgc3BlY2lmaWVkCglieSBpdHMgX2R1cmF0aW9uXyBwcm9wZXJ0eS4gIFRoZSBfb25TdGVwXyBldmVudCB3aWxsIGZpcmUgaW4gcXVpY2sKCXN1Y2Nlc3Npb24gYW5kIHNob3VsZCBiZSBoYW5kbGVkIHRvIGRvIHNvbWV0aGluZyBiYXNlZCBvbiB0aGUgX3ZhbHVlXwoJcHJvcGVydHkuCgoJVGhlIF92YWx1ZV8gcHJvcGVydHkgd2lsbCBwcm9ncmVzcyBmcm9tIF9zdGFydFZhbHVlXyB0byBfZW5kVmFsdWVfIGR1cmluZwoJdGhlIGFuaW1hdGlvbiBiYXNlZCBvbiB0aGUgZnVuY3Rpb24gcmVmZXJlbmNlZCBieSB0aGUgX2Vhc2luZ0Z1bmN0aW9uXwoJcHJvcGVydHkuICBUaGUgX3N0b3BfIG1ldGhvZCBtYXkgYmUgY2FsbGVkIHRvIG1hbnVhbGx5IHN0b3AgYW4gaW4tcHJvZ3Jlc3MKCWFuaW1hdGlvbjsgY2FsbGluZyBpdCB3aWxsIGZpcmUgdGhlIF9vblN0b3BfIGV2ZW50LiAgV2hlbiBhbiBhbmltYXRpb24KCWNvbXBsZXRlcyBub3JtYWxseSwgdGhlIF9vbkVuZF8gZXZlbnQgaXMgZmlyZWQuCgoJRXZlbnQgaGFuZGxlcnMgbWF5IGJlIHNwZWNpZmllZCBhcyBmdW5jdGlvbnMuICBJZiBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyCglmdW5jdGlvbiB3aWxsIGJlIHVzZWQgdG8gaGFuZGxlIHRoZSBldmVudCBkaXJlY3RseSwgd2l0aG91dCBzZW5kaW5nIHRoZQoJZXZlbnQgdG8gaXRzIG93bmVyIG9yIGJ1YmJsaW5nIGl0LiAgVGhlIF9jb250ZXh0XyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0bwoJY2FsbCB0aGUgc3VwcGxpZWQgZXZlbnQgZnVuY3Rpb25zIGluIGEgcGFydGljdWxhciAidGhpcyIgY29udGV4dC4KKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLkFuaW1hdG9yIiwKCWtpbmQ6ICJDb21wb25lbnQiLAoJcHVibGlzaGVkOiB7CgkJLy8qIEFuaW1hdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMKCQlkdXJhdGlvbjogMzUwLAoJCS8vKiBWYWx1ZSBvZiBfdmFsdWVfIHByb3BlcnR5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYW4gYW5pbWF0aW9uCgkJc3RhcnRWYWx1ZTogMCwKCQkvLyogVmFsdWUgb2YgX3ZhbHVlXyBwcm9wZXJ0eSBhdCB0aGUgZW5kIG9mIGFuIGFuaW1hdGlvbgoJCWVuZFZhbHVlOiAxLAoJCS8vKiBOb2RlIHRoYXQgbXVzdCBiZSB2aXNpYmxlIGluIG9yZGVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIGNvbnRpbnVlLgoJCS8vKiBUaGlzIHJlZmVyZW5jZSBpcyBkZXN0cm95ZWQgd2hlbiB0aGUgYW5pbWF0aW9uIGNlYXNlcy4KCQlub2RlOiBudWxsLAoJCS8vKiBGdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaG93IHRoZSBhbmltYXRpb24gcHJvZ3Jlc3NlcyBmcm9tCgkJLy8qIF9zdGFydFZhbHVlXyB0byBfZW5kVmFsdWVfCgkJZWFzaW5nRnVuY3Rpb246IGVueW8uZWFzaW5nLmN1YmljT3V0Cgl9LAoJZXZlbnRzOiB7CgkJLy8qIEZpcmVzIHdoZW4gYW4gYW5pbWF0aW9uIHN0ZXAgb2NjdXJzLgoJCW9uU3RlcDogIiIsCgkJLy8qIEZpcmVzIHdoZW4gdGhlIGFuaW1hdGlvbiBmaW5pc2hlcyBub3JtYWxseS4KCQlvbkVuZDogIiIsCgkJLy8qIEZpcmVzIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBwcmVtYXR1cmVseSBzdG9wcGVkLgoJCW9uU3RvcDogIiIKCX0sCgkvLyogQHByb3RlY3RlZAoJY29uc3RydWN0ZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJdGhpcy5fbmV4dCA9IHRoaXMuYmluZFNhZmVseSgibmV4dCIpOwoJfSwKCWRlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3RvcCgpOwoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJLy8qIEBwdWJsaWMKCS8vKiBQbGF5cyB0aGUgYW5pbWF0aW9uLgoJLy8qIEZvciBjb252ZW5pZW5jZSwgX2luUHJvcHNfIHdpbGwgYmUgbWl4ZWQgZGlyZWN0bHkgaW50byB0aGlzIG9iamVjdC4KCXBsYXk6IGZ1bmN0aW9uKGluUHJvcHMpIHsKCQl0aGlzLnN0b3AoKTsKCQl0aGlzLnJldmVyc2VkID0gZmFsc2U7CgkJaWYgKGluUHJvcHMpIHsKCQkJZW55by5taXhpbih0aGlzLCBpblByb3BzKTsKCQl9CgkJdGhpcy50MCA9IHRoaXMudDEgPSBlbnlvLm5vdygpOwoJCXRoaXMudmFsdWUgPSB0aGlzLnN0YXJ0VmFsdWU7CgkJdGhpcy5qb2IgPSB0cnVlOwoJCXRoaXMubmV4dCgpOwoJCXJldHVybiB0aGlzOwoJfSwKCS8vKiBTdG9wcyB0aGUgYW5pbWF0aW9uIGFuZCBmaXJlcyB0aGUgX29uU3RvcF8gZXZlbnQuCglzdG9wOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5pc0FuaW1hdGluZygpKSB7CgkJCXRoaXMuY2FuY2VsKCk7CgkJCXRoaXMuZmlyZSgib25TdG9wIik7CgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgkvLyogUmV2ZXJzZXMgdGhlIGRpcmVjdGlvbiBvZiBhIHJ1bm5pbmcgYW5pbWF0aW9uOyByZXR1cm5zIHNlbGYgaWYgYW5pbWF0aW5nLgoJcmV2ZXJzZTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNBbmltYXRpbmcoKSkgewoJCQl0aGlzLnJldmVyc2VkID0gIXRoaXMucmV2ZXJzZWQ7CgkJCXZhciBub3cgPSB0aGlzLnQxID0gZW55by5ub3coKTsKCQkJLy8gYWRqdXN0IHN0YXJ0IHRpbWUgKHQwKSB0byBhbGxvdyBmb3IgYW5pbWF0aW9uIGRvbmUgc28gZmFyIHRvIHJlcGxheQoJCQl2YXIgZWxhcHNlZCA9IG5vdyAtIHRoaXMudDA7CgkJCXRoaXMudDAgPSBub3cgKyBlbGFwc2VkIC0gdGhpcy5kdXJhdGlvbjsKCQkJLy8gc3dhcCBzdGFydCBhbmQgZW5kIHZhbHVlcwoJCQl2YXIgc3RhcnRWYWx1ZSA9IHRoaXMuc3RhcnRWYWx1ZTsKCQkJdGhpcy5zdGFydFZhbHVlID0gdGhpcy5lbmRWYWx1ZTsKCQkJdGhpcy5lbmRWYWx1ZSA9IHN0YXJ0VmFsdWU7CgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgkvLyogUmV0dXJucyB0cnVlIGlmIGFuaW1hdGlvbiBpcyBpbiBwcm9ncmVzcy4KCWlzQW5pbWF0aW5nOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gQm9vbGVhbih0aGlzLmpvYik7Cgl9LAoJLy8qIEBwcm90ZWN0ZWQKCXJlcXVlc3ROZXh0OiBmdW5jdGlvbigpIHsKCQl0aGlzLmpvYiA9IGVueW8ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX25leHQsIHRoaXMubm9kZSk7Cgl9LAoJY2FuY2VsOiBmdW5jdGlvbigpIHsKCQllbnlvLmNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmpvYik7CgkJdGhpcy5ub2RlID0gbnVsbDsKCQl0aGlzLmpvYiA9IG51bGw7Cgl9LAoJc2hvdWxkRW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKHRoaXMuZHQgPj0gdGhpcy5kdXJhdGlvbik7Cgl9LAoJbmV4dDogZnVuY3Rpb24oKSB7CgkJdGhpcy50MSA9IGVueW8ubm93KCk7CgkJdGhpcy5kdCA9IHRoaXMudDEgLSB0aGlzLnQwOwoJCXZhciBhcmdzID0gdGhpcy5lYXNpbmdGdW5jdGlvbi5sZW5ndGg7CgkJdmFyIGY7CgoJCWlmIChhcmdzID09PSAxKSB7CgkJCS8vIHRpbWUgaW5kZXBlbmRlbnQKCQkJZiA9IHRoaXMuZnJhY3Rpb24gPSBlbnlvLmVhc2VkTGVycCh0aGlzLnQwLCB0aGlzLmR1cmF0aW9uLCB0aGlzLmVhc2luZ0Z1bmN0aW9uLCB0aGlzLnJldmVyc2VkKTsKCQkJdGhpcy52YWx1ZSA9IHRoaXMuc3RhcnRWYWx1ZSArIGYgKiAodGhpcy5lbmRWYWx1ZSAtIHRoaXMuc3RhcnRWYWx1ZSk7CgkJfSBlbHNlIHsKCQkJdGhpcy52YWx1ZSA9IGVueW8uZWFzZWRDb21wbGV4TGVycCh0aGlzLnQwLCB0aGlzLmR1cmF0aW9uLCB0aGlzLmVhc2luZ0Z1bmN0aW9uLCB0aGlzLnJldmVyc2VkLAoJCQkJdGhpcy5kdCwgdGhpcy5zdGFydFZhbHVlLCAodGhpcy5lbmRWYWx1ZSAtIHRoaXMuc3RhcnRWYWx1ZSkpOwoJCX0KCQlpZiAoKChmID49IDEpICYmIChhcmdzID09PSAxKSkgfHwgdGhpcy5zaG91bGRFbmQoKSkgewoJCQl0aGlzLnZhbHVlID0gdGhpcy5lbmRWYWx1ZTsKCQkJdGhpcy5mcmFjdGlvbiA9IDE7CgkJCXRoaXMuZmlyZSgib25TdGVwIik7CgkJCXRoaXMuZmlyZSgib25FbmQiKTsKCQkJdGhpcy5jYW5jZWwoKTsKCQl9IGVsc2UgewoJCQl0aGlzLmZpcmUoIm9uU3RlcCIpOwoJCQl0aGlzLnJlcXVlc3ROZXh0KCk7CgkJfQoJfSwKCWZpcmU6IGZ1bmN0aW9uKGluRXZlbnROYW1lKSB7CgkJdmFyIGZuID0gdGhpc1tpbkV2ZW50TmFtZV07CgkJaWYgKGVueW8uaXNTdHJpbmcoZm4pKSB7CgkJCXRoaXMuYnViYmxlKGluRXZlbnROYW1lKTsKCQl9IGVsc2UgaWYgKGZuKSB7CgkJCWZuLmNhbGwodGhpcy5jb250ZXh0IHx8IHdpbmRvdywgdGhpcyk7CgkJfQoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Audio.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5BdWRpb18gaW1wbGVtZW50cyBhbiBIVE1MIDUgTWVkaWEgZWxlbWVudCBieSBleHRlbmRpbmcgX2VueW8uTWVkaWFfLAoJYWxsb3dpbmcgeW91IHRvIHBsYXkgYXVkaW8uCgoJSW5pdGlhbGl6ZSBhbiBhdWRpbyBjb21wb25lbnQgYXMgZm9sbG93czoKCgkJe2tpbmQ6ICJlbnlvLkF1ZGlvIiwgc3JjOiAiaHR0cDovL3d3dy53M3NjaG9vbHMuY29tL3RhZ3MvaG9yc2UubXAzIn0KCQoJVG8gcGxheSB0aGUgYXVkaW8sIGNhbGwgJ3RoaXMuJC5hdWRpby5wbGF5KCknLgoKCVRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIEhUTUwgNSBNZWRpYSBlbGVtZW50LCBjYWxsCgkndGhpcy4kLmF1ZGlvLmhhc05vZGUoKScuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5BdWRpbyIsCglraW5kOiAiZW55by5NZWRpYSIsCgl0YWc6ICJhdWRpbyIsCglwdWJsaXNoZWQ6IHsKCQkvLyogSW5kaWNhdGVzIGhvdyBkYXRhIHNob3VsZCBiZSBwcmVsb2FkZWQsIHJlZmxlY3RpbmcgdGhlIHByZWxvYWQgSFRNTCBhdHRyaWJ1dGUgKG5vbmUsIG1ldGFkYXRhLCBhdXRvKQoJCXByZWxvYWQ6ICJhdXRvIgoJfQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/BaseLayout.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5CYXNlTGF5b3V0XyBwcm92aWRlcyBhIGJhc2ljIGxheW91dCBzdHJhdGVneSwgcG9zaXRpb25pbmcgY29udGFpbmVkCgljb21wb25lbnRzIHdpdGggdGhlIF9lbnlvLXBvc2l0aW9uZWRfIGxheW91dENsYXNzLiBJbiBhZGRpdGlvbiwgaXQgYWRqdXN0cwoJdGhlIGxheW91dCB3aGVuIF9yZWZsb3dfIGlzIGNhbGxlZCwgcmVtb3Zpbmcgb3IgYWRkaW5nIHRoZSBfZW55by1maXRfIGNsYXNzCglmb3IgY29tcG9uZW50cyB0aGF0IGhhdmUgc2V0IHRoZSBfZml0XyBwcm9wZXJ0eS4KKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLkJhc2VMYXlvdXQiLAoJa2luZDogImVueW8uTGF5b3V0IiwKCWxheW91dENsYXNzOiAiZW55by1wb3NpdGlvbmVkIiwKCS8vKiBBZGRzIG9yIHJlbW92ZXMgdGhlIF9lbnlvLWZpdF8gY2xhc3MgZm9yIGNvbXBvbmVudHMgd2hvc2UgX2ZpdF8gcHJvcGVydHkKCS8vKiBoYXMgYmVlbiBzZXQuCglyZWZsb3c6IGZ1bmN0aW9uKCkgewoJCWVueW8uZm9yRWFjaCh0aGlzLmNvbnRhaW5lci5jaGlsZHJlbiwgZnVuY3Rpb24oYykgewoJCQlpZiAoYy5maXQgIT09IG51bGwpIHsKCQkJCWMuYWRkUmVtb3ZlQ2xhc3MoImVueW8tZml0IiwgYy5maXQpOwoJCQl9CgkJfSwgdGhpcyk7Cgl9Cn0pOwoKLy9lbnlvLkNvbnRyb2wucHJvdG90eXBlLmxheW91dEtpbmQgPSAiZW55by5CYXNlTGF5b3V0Ijs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Button.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5CdXR0b25fIGltcGxlbWVudHMgYW4gSFRNTCBidXR0b24sIHdpdGggc3VwcG9ydCBmb3IgZ3JvdXBpbmcgdXNpbmcKCTxhIGhyZWY9IiNlbnlvLkdyb3VwIj5lbnlvLkdyb3VwPC9hPi4KCglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uCgk8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZW55b2pzL2VueW8vd2lraS9CdXR0b25zIj5CdXR0b25zPC9hPiBpbiB0aGUKCUVueW8gRGV2ZWxvcGVyIEd1aWRlLgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uQnV0dG9uIiwKCS8vKiBAcHJvdGVjdGVkCglraW5kOiAiZW55by5Ub29sRGVjb3JhdG9yIiwKCXRhZzogImJ1dHRvbiIsCglhdHRyaWJ1dGVzOiB7CgkJLy8gc2V0IHRvIGJ1dHRvbiwgYXMgZGVmYXVsdCBpcyAic3VibWl0IiB3aGljaCBjYW4gY2F1c2UgdW5leHBlY3RlZAoJCS8vIHByb2JsZW1zIHdoZW4gY29udHJvbHMgYXJlIHVzZWQgaW5zaWRlIGEgZm9ybQoJCXR5cGU6ICJidXR0b24iCgl9LAoJLy8qIEBwdWJsaWMKCXB1Ymxpc2hlZDogewoJCS8vKiBXaGVuIHRydWUsIGJ1dHRvbiBpcyBzaG93biBhcyBkaXNhYmxlZCBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgdGFwCgkJLy8qIGV2ZW50cwoJCWRpc2FibGVkOiBmYWxzZQoJfSwKCS8vKiBAcHJvdGVjdGVkCgljcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJdGhpcy5kaXNhYmxlZENoYW5nZWQoKTsKCX0sCglkaXNhYmxlZENoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsIHRoaXMuZGlzYWJsZWQpOwoJfSwKCXRhcDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuZGlzYWJsZWQpIHsKCQkJLy8gd29yayBhcm91bmQgZm9yIHBsYXRmb3JtcyBsaWtlIENocm9tZSBvbiBBbmRyb2lkIG9yIE9wZXJhIHRoYXQgc2VuZAoJCQkvLyBtb3VzZXVwIHRvIGRpc2FibGVkIGZvcm0gY29udHJvbHMKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsKCQkJdGhpcy5zZXRBY3RpdmUodHJ1ZSk7CgkJfQoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Checkbox.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5DaGVja2JveF8gaW1wbGVtZW50cyBhbiBIVE1MIGNoZWNrYm94IGlucHV0LCB3aXRoIHN1cHBvcnQgZm9yIGdyb3VwaW5nLgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uQ2hlY2tib3giLAoJa2luZDogImVueW8uSW5wdXQiLAoJY2xhc3NlczogImVueW8tY2hlY2tib3giLAoJZXZlbnRzOiB7CgkJLy8qIEZpcmVzIHdoZW4gY2hlY2tib3ggaXMgdGFwcGVkLgoJCW9uQWN0aXZhdGU6ICIiCgl9LAoJcHVibGlzaGVkOiB7CgkJLy8qIFZhbHVlIG9mIGNoZWNrYm94OyB0cnVlIGlmIGNoZWNrZWQKCQljaGVja2VkOiBmYWxzZSwKCQkvLyogR3JvdXAgQVBJIHJlcXVpcmVtZW50IGZvciBkZXRlcm1pbmluZyBzZWxlY3RlZCBpdGVtCgkJYWN0aXZlOiBmYWxzZSwKCQkvLyogQHByb3RlY3RlZAoJCXR5cGU6ICJjaGVja2JveCIKCX0sCgkvLyogQHByb3RlY3RlZAoJLy8gZGlzYWJsZSBjbGFzc2VzIGluaGVyaXRlZCBmcm9tIGVueW8uSW5wdXQKCWtpbmRDbGFzc2VzOiAiIiwKCWhhbmRsZXJzOiB7CgkJb25jaGFuZ2U6ICJjaGFuZ2UiLAoJCW9uY2xpY2s6ICJjbGljayIKCX0sCgljcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJcmVuZGVyZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJaWYgKHRoaXMuYWN0aXZlKSB7CgkJCXRoaXMuYWN0aXZlQ2hhbmdlZCgpOwoJCX0KCQl0aGlzLmNoZWNrZWRDaGFuZ2VkKCk7Cgl9LAoJY2hlY2tlZENoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0Tm9kZVByb3BlcnR5KCJjaGVja2VkIiwgdGhpcy5jaGVja2VkKTsKCQl0aGlzLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIHRoaXMuY2hlY2tlZCA/ICJjaGVja2VkIiA6ICIiKTsKCQl0aGlzLnNldEFjdGl2ZSh0aGlzLmNoZWNrZWQpOwoJfSwKCS8vIGFjdGl2ZSBwcm9wZXJ0eSwgYW5kIG9uQWN0aXZhdGUgZXZlbnQsIGFyZSBwYXJ0IG9mICJHcm91cEl0ZW0iIGludGVyZmFjZQoJLy8gdGhhdCB3ZSBzdXBwb3J0IGluIHRoaXMgb2JqZWN0CglhY3RpdmVDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmFjdGl2ZSA9IGVueW8uaXNUcnVlKHRoaXMuYWN0aXZlKTsKCQl0aGlzLnNldENoZWNrZWQodGhpcy5hY3RpdmUpOwoJCXRoaXMuYnViYmxlKCJvbkFjdGl2YXRlIik7Cgl9LAoJLy8gYWxsIGlucHV0IHR5cGUgY29udHJvbHMgc3VwcG9ydCAndmFsdWUnIHByb3BlcnR5CglzZXRWYWx1ZTogZnVuY3Rpb24oaW5WYWx1ZSkgewoJCXRoaXMuc2V0Q2hlY2tlZChlbnlvLmlzVHJ1ZShpblZhbHVlKSk7Cgl9LAoJZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmdldENoZWNrZWQoKTsKCX0sCgl2YWx1ZUNoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCS8vIGluaGVyaXRlZCBiZWhhdmlvciBpcyB0byBzZXQgInZhbHVlIiBhdHRyaWJ1dGUgYW5kIG5vZGUtcHJvcGVydHkKCQkvLyB3aGljaCBkb2VzIG5vdCBhcHBseSB0byBjaGVja2JveCAodXNlcyAiY2hlY2tlZCIpIHNvCgkJLy8gd2Ugc3F1ZWxjaCB0aGUgaW5oZXJpdGVkIG1ldGhvZAoJfSwKCWNoYW5nZTogZnVuY3Rpb24oKSB7CgkJdmFyIG5vZGVDaGVja2VkID0gZW55by5pc1RydWUodGhpcy5nZXROb2RlUHJvcGVydHkoImNoZWNrZWQiKSk7CgkJdGhpcy5zZXRBY3RpdmUobm9kZUNoZWNrZWQpOwoJfSwKCWNsaWNrOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCS8vIFZhcmlvdXMgdmVyc2lvbnMgb2YgSUUgKG5vdGFibHkgSUU4KSBkbyBub3QgZmlyZSAnb25jaGFuZ2UnIGZvcgoJCS8vIGNoZWNrYm94ZXMsIHNvIHdlIGRpc2Nlcm4gY2hhbmdlIHZpYSAnY2xpY2snLgoJCS8vIE5vdGU6IGtleWJvYXJkIGludGVyYWN0aW9uIChlLmcuIHByZXNzaW5nIHNwYWNlIHdoZW4gZm9jdXNlZCkgZmlyZXMKCQkvLyBhIGNsaWNrIGV2ZW50LgoJCWlmIChlbnlvLnBsYXRmb3JtLmllIDw9IDgpIHsKCQkJdGhpcy5idWJibGUoIm9uY2hhbmdlIiwgaW5FdmVudCk7CgkJfQoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/DragAvatar.js"
Content-Type: application/octet-stream; x-encoding=base64
Ly8qIEBwcm90ZWN0ZWQKZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLl9EcmFnQXZhdGFyIiwKCXN0eWxlOiAicG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IGN1cnNvcjogbW92ZTsiLAoJc2hvd2luZzogZmFsc2UsCglzaG93aW5nQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQlkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IHRoaXMuc2hvd2luZyA/ICJtb3ZlIiA6IG51bGw7Cgl9Cn0pOwoKLy8qIEBwdWJsaWMKLyoqCglfZW55by5EcmFnQXZhdGFyXyBjcmVhdGVzIGEgY29udHJvbCB0byBmb2xsb3cgdGhlIHBvaW50ZXIgd2hlbiBkcmFnZ2luZy4gSXQKCWF1dG9tYXRpY2FsbHkgZGlzcGxheXMgdGhlIGF2YXRhciBjb250cm9sIHdoZW4gdGhlIHVzZXIgZHJhZ3MsIGFuZCB1cGRhdGVzCglpdHMgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcG9pbnRlciBsb2NhdGlvbi4KCgkJZW55by5raW5kKHsKCQkJbmFtZTogIkFwcCIsCgkJCWhhbmRsZXJzOiB7CgkJCQlvbmRyYWc6ICJkcmFnIiwKCQkJCW9uZHJhZ2ZpbmlzaDogImRyYWdGaW5pc2giLAoJCQl9LAoJCQljb21wb25lbnRzOiBbCgkJCQl7bmFtZToiZHJhZ0F2YXRhciIsIGtpbmQ6IkRyYWdBdmF0YXIiLAoJCQkJCWNvbXBvbmVudHM6IFt7dGFnOiAiaW1nIiwgc3JjOiAiaW1hZ2VzL2ljb24ucG5nIn1dCgkJCQl9CgkJCV0sCgkJCWRyYWc6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJCQl0aGlzLiQuZHJhZ0F2YXRhci5kcmFnKGluRXZlbnQpOwoJCQl9LAoJCQlkcmFnRmluaXNoOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCQkJdGhpcy4kLmRyYWdBdmF0YXIuaGlkZSgpOwoJCQl9CgkJfSk7CiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5EcmFnQXZhdGFyIiwKCWtpbmQ6ICJlbnlvLkNvbXBvbmVudCIsCglwdWJsaXNoZWQ6IHsKCQkvLyogQ3VycmVudCB2aXNpYmlsaXR5IHN0YXRlIG9mIHRoZSBEcmFnQXZhdGFyCgkJc2hvd2luZzogZmFsc2UsCgkJLyoqCgkJCURpc3RhbmNlIChpbiBwaXhlbHMpIGFsb25nIHRoZSBob3Jpem9udGFsIGF4aXMgYmV0d2VlbiB0aGUgY3VycmVudAoJCQlkcmFnIHBvc2l0aW9uIGFuZCB3aGVyZSB0aGUgYXZhdGFyIGNvbnRyb2wgaXMgZGlzcGxheWVkLgoJCSovCgkJb2Zmc2V0WDogMjAsCgkJLyoqCgkJCURpc3RhbmNlIChpbiBwaXhlbHMpIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIGJldHdlZW4gdGhlIGN1cnJlbnQKCQkJZHJhZyBwb3NpdGlvbiBhbmQgd2hlcmUgdGhlIGF2YXRhciBjb250cm9sIGlzIGRpc3BsYXllZC4KCQkqLwoJCW9mZnNldFk6IDMwCgl9LAoJLy8qIEBwcm90ZWN0ZWQKCWluaXRDb21wb25lbnRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLmF2YXRhckNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHM7CgkJdGhpcy5jb21wb25lbnRzID0gbnVsbDsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCXJlcXVpcmVBdmF0YXI6IGZ1bmN0aW9uKCkgewoJCS8vIEZJWE1FOiB0aGVyZSBpcyBub2JvZHkgdG8gY2FsbCB0ZWFyZG93blJlbmRlciBvbiB0aGlzLmF2YXRhcgoJCS8vIGlmIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MIGhhcyBiZWVuIHdyaXR0ZW4gb3ZlciwgaGlzIG5vZGUgaXMgaW52YWxpZAoJCS8vIHdlIHNob3VsZCBoYXZlIGEgdHJhcCBmb3IgdGhpcyBjb25kaXRpb24gaGVyZQoJCWlmICghdGhpcy5hdmF0YXIpIHsKCQkJdGhpcy5hdmF0YXIgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudCh7a2luZDogZW55by5fRHJhZ0F2YXRhciwgcGFyZW50Tm9kZTogZG9jdW1lbnQuYm9keSwgc2hvd2luZzogZmFsc2UsIGNvbXBvbmVudHM6IHRoaXMuYXZhdGFyQ29tcG9uZW50c30pLnJlbmRlcigpOwoJCX0KCX0sCglzaG93aW5nQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5hdmF0YXIuc2V0U2hvd2luZyh0aGlzLnNob3dpbmcpOwoJCWRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gdGhpcy5zaG93aW5nID8gIm1vdmUiIDogbnVsbDsKCX0sCgkvLyogQHB1YmxpYwoJLyoqCgkJSW5zdGFudGlhdGVzIHRoZSBhdmF0YXIgY29udHJvbCAoaWYgbmVjZXNzYXJ5KSwgZGV0ZXJtaW5lcyBjb3JyZWN0CgkJcG9zaXRpb24sIGFuZCBjYWxscyBfc2hvd18gdG8gbWFrZSBpdCB2aXNpYmxlLgoJKi8KCWRyYWc6IGZ1bmN0aW9uKGluRXZlbnQpIHsKCQl0aGlzLnJlcXVpcmVBdmF0YXIoKTsKCQl0aGlzLmF2YXRhci5zZXRCb3VuZHMoe3RvcDogaW5FdmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0WSwgbGVmdDogaW5FdmVudC5wYWdlWCArIHRoaXMub2Zmc2V0WH0pOwoJCXRoaXMuc2hvdygpOwoJfSwKCS8vKiBTaG93cyB0aGUgRHJhZ0F2YXRhci4KCXNob3c6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0U2hvd2luZyh0cnVlKTsKCX0sCgkvLyogSGlkZXMgdGhlIERyYWdBdmF0YXIuCgloaWRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldFNob3dpbmcoZmFsc2UpOwoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Drawer.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqDQoJX2VueW8uRHJhd2VyXyBpcyBhIGNvbnRyb2wgdGhhdCBhcHBlYXJzIG9yIGRpc2FwcGVhcnMgYmFzZWQgb24gaXRzIF9vcGVuXw0KCXByb3BlcnR5LiBCeSBkZWZhdWx0LCB0aGUgZHJhd2VyIGFwcGVhcnMgb3IgZGlzYXBwZWFycyB3aXRoIGEgc2xpZGluZw0KCWFuaW1hdGlvbiB3aG9zZSBkaXJlY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgX29yaWVudF8gcHJvcGVydHkuDQoNCglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uDQoJPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2VueW9qcy9lbnlvL3dpa2kvRHJhd2VycyI+RHJhd2VyczwvYT4gaW4gdGhlDQoJRW55byBEZXZlbG9wZXIgR3VpZGUuDQoqLw0KDQplbnlvLmtpbmQoew0KCW5hbWU6ICJlbnlvLkRyYXdlciIsDQoJcHVibGlzaGVkOiB7DQoJCS8vKiBUaGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiB0aGUgZHJhd2VyJ3MgYXNzb2NpYXRlZCBjb250cm9sDQoJCW9wZW46IHRydWUsDQoJCS8qKg0KCQkJRGlyZWN0aW9uIG9mIHRoZSBvcGVuaW5nL2Nsb3NpbmcgYW5pbWF0aW9uLS1laXRoZXIgInYiIGZvciB2ZXJ0aWNhbA0KCQkJb3IgImgiIGZvciBob3Jpem9udGFsDQoJCSovDQoJCW9yaWVudDogInYiLA0KCQkvLyogSWYgdHJ1ZSwgdGhlIG9wZW5pbmcvY2xvc2luZyB0cmFuc2l0aW9uIHdpbGwgYmUgYW5pbWF0ZWQNCgkJYW5pbWF0ZWQ6IHRydWUNCgl9LA0KCS8vKiBAcHJvdGVjdGVkDQoJc3R5bGU6ICJvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7IiwNCgl0b29sczogWw0KCQl7a2luZDogIkFuaW1hdG9yIiwgb25TdGVwOiAiYW5pbWF0b3JTdGVwIiwgb25FbmQ6ICJhbmltYXRvckVuZCJ9LA0KCQl7bmFtZTogImNsaWVudCIsIHN0eWxlOiAicG9zaXRpb246IHJlbGF0aXZlOyIsIGNsYXNzZXM6ICJlbnlvLWJvcmRlci1ib3gifQ0KCV0sDQoJY3JlYXRlOiBmdW5jdGlvbigpIHsNCgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsNCgkJdGhpcy5hbmltYXRlZENoYW5nZWQoKTsNCgkJdGhpcy5vcGVuQ2hhbmdlZCgpOw0KCX0sDQoJaW5pdENvbXBvbmVudHM6IGZ1bmN0aW9uKCkgew0KCQl0aGlzLmNyZWF0ZUNocm9tZSh0aGlzLnRvb2xzKTsNCgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsNCgl9LA0KCWFuaW1hdGVkQ2hhbmdlZDogZnVuY3Rpb24oKSB7DQoJCWlmICghdGhpcy5hbmltYXRlZCAmJiB0aGlzLmhhc05vZGUoKSAmJiB0aGlzLiQuYW5pbWF0b3IuaXNBbmltYXRpbmcoKSkgew0KCQkJdGhpcy4kLmFuaW1hdG9yLnN0b3AoKTsNCgkJCXRoaXMuYW5pbWF0b3JFbmQoKTsNCgkJfQ0KCX0sDQoJb3BlbkNoYW5nZWQ6IGZ1bmN0aW9uKCkgew0KCQl0aGlzLiQuY2xpZW50LnNob3coKTsNCgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7DQoJCQlpZiAodGhpcy4kLmFuaW1hdG9yLmlzQW5pbWF0aW5nKCkpIHsNCgkJCQl0aGlzLiQuYW5pbWF0b3IucmV2ZXJzZSgpOw0KCQkJfSBlbHNlIHsNCgkJCQl2YXIgdiA9IHRoaXMub3JpZW50ID09ICJ2IjsNCgkJCQl2YXIgZCA9IHYgPyAiaGVpZ2h0IiA6ICJ3aWR0aCI7DQoJCQkJdmFyIHAgPSB2ID8gInRvcCIgOiAibGVmdCI7DQoJCQkJLy8gdW5maXhpbmcgdGhlIGhlaWdodC93aWR0aCBpcyBuZWVkZWQgdG8gcHJvcGVybHkNCgkJCQkvLyBtZWFzdXJlIHRoZSBzY3JvbGxIZWlnaHQvV2lkdGggRE9NIHByb3BlcnR5LCBidXQNCgkJCQkvLyBjYW4gY2F1c2UgYSBtb21lbnRhcnkgZmxhc2ggb2YgY29udGVudCBvbiBzb21lIGJyb3dzZXJzDQoJCQkJdGhpcy5hcHBseVN0eWxlKGQsIG51bGwpOw0KCQkJCXZhciBzID0gdGhpcy5oYXNOb2RlKClbdiA/ICJzY3JvbGxIZWlnaHQiIDogInNjcm9sbFdpZHRoIl07DQoJCQkJaWYgKHRoaXMuYW5pbWF0ZWQpIHsNCgkJCQkJdGhpcy4kLmFuaW1hdG9yLnBsYXkoew0KCQkJCQkJc3RhcnRWYWx1ZTogdGhpcy5vcGVuID8gMCA6IHMsDQoJCQkJCQllbmRWYWx1ZTogdGhpcy5vcGVuID8gcyA6IDAsDQoJCQkJCQlkaW1lbnNpb246IGQsDQoJCQkJCQlwb3NpdGlvbjogcA0KCQkJCQl9KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkvLyBkaXJlY3RseSBydW4gbGFzdCBmcmFtZSBpZiBub3QgYW5pbWF0aW5nDQoJCQkJCXRoaXMuYW5pbWF0b3JFbmQoKTsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQl0aGlzLiQuY2xpZW50LnNldFNob3dpbmcodGhpcy5vcGVuKTsNCgkJfQ0KCX0sDQoJYW5pbWF0b3JTdGVwOiBmdW5jdGlvbihpblNlbmRlcikgew0KCQkvLyB0aGUgYWN0dWFsIGRyYXdlciBET00gbm9kZSBhZGp1c3RzIGl0cyBoZWlnaHQNCgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7DQoJCQl2YXIgZCA9IGluU2VuZGVyLmRpbWVuc2lvbjsNCgkJCXRoaXMubm9kZS5zdHlsZVtkXSA9IHRoaXMuZG9tU3R5bGVzW2RdID0gaW5TZW5kZXIudmFsdWUgKyAicHgiOw0KCQl9DQoJCS8vIHdoaWxlIHRoZSBjbGllbnQgaW5zaWRlIHRoZSBkcmF3ZXIgYWRqdXN0cyBpdHMgcG9zaXRpb24gdG8gbW92ZSBvdXQgb2YgdGhlIHZpc2libGUgYXJlYQ0KCQl2YXIgY24gPSB0aGlzLiQuY2xpZW50Lmhhc05vZGUoKTsNCgkJaWYgKGNuKSB7DQoJCQl2YXIgcCA9IGluU2VuZGVyLnBvc2l0aW9uOw0KCQkJdmFyIG8gPSAodGhpcy5vcGVuID8gaW5TZW5kZXIuZW5kVmFsdWUgOiBpblNlbmRlci5zdGFydFZhbHVlKTsNCgkJCWNuLnN0eWxlW3BdID0gdGhpcy4kLmNsaWVudC5kb21TdHlsZXNbcF0gPSAoaW5TZW5kZXIudmFsdWUgLSBvKSArICJweCI7DQoJCX0NCgkJaWYgKHRoaXMuY29udGFpbmVyKSB7DQoJCQl0aGlzLmNvbnRhaW5lci5yZXNpemVkKCk7DQoJCX0NCgkJcmV0dXJuIHRydWU7DQoJfSwNCglhbmltYXRvckVuZDogZnVuY3Rpb24oKSB7DQoJCWlmICghdGhpcy5vcGVuKSB7DQoJCQl0aGlzLiQuY2xpZW50LmhpZGUoKTsNCgkJfQ0KCQllbHNlIHsNCgkJCS8vIHNhdmUgY2hhbmdlcyB0byB0aGlzLmRvbUNzc1RleHQgLS0+IHNlZSBFTllPLTE1NjENCgkJCXRoaXMuJC5jbGllbnQuZG9tQ3NzVGV4dCA9IGVueW8uQ29udHJvbC5kb21TdHlsZXNUb0Nzc1RleHQodGhpcy4kLmNsaWVudC5kb21TdHlsZXMpOw0KCQkJLy8gYXQgZW5kIG9mIG9wZW4gYW5pbWF0aW9uLCBjbGVhbiBsaW1pdCBvbiBoZWlnaHQvd2lkdGgNCgkJCXZhciB2ID0gKHRoaXMub3JpZW50ID09ICJ2Iik7DQoJCQl2YXIgZCA9IHYgPyAiaGVpZ2h0IiA6ICJ3aWR0aCI7DQoJCQl2YXIgcCA9IHYgPyAidG9wIiA6ICJsZWZ0IjsNCgkJCXZhciBjbiA9IHRoaXMuJC5jbGllbnQuaGFzTm9kZSgpOw0KCQkJLy8gY2xlYXIgb3V0IGNoYW5nZXMgdG8gY29udGFpbmVyIHBvc2l0aW9uICYgbm9kZSBkaW1lbnNpb24NCgkJCWlmIChjbikgew0KCQkJCWNuLnN0eWxlW3BdID0gdGhpcy4kLmNsaWVudC5kb21TdHlsZXNbcF0gPSBudWxsOw0KCQkJfQ0KCQkJaWYgKHRoaXMubm9kZSkgew0KCQkJCXRoaXMubm9kZS5zdHlsZVtkXSA9IHRoaXMuZG9tU3R5bGVzW2RdID0gbnVsbDsNCgkJCX0NCgkJfQ0KCQlpZiAodGhpcy5jb250YWluZXIpIHsNCgkJCXRoaXMuY29udGFpbmVyLnJlc2l6ZWQoKTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/FloatingLayer.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5GbG9hdGluZ0xheWVyXyBpcyBhIGNvbnRyb2wgdGhhdCBwcm92aWRlcyBhIGxheWVyIGZvciBjb250cm9scyB0aGF0CglzaG91bGQgYmUgZGlzcGxheWVkIGFib3ZlIGFuIGFwcGxpY2F0aW9uLgoJVGhlIEZsb2F0aW5nTGF5ZXIgc2luZ2xldG9uIGNhbiBiZSBzZXQgYXMgYSBjb250cm9sJ3MgcGFyZW50IHRvIGhhdmUgdGhlCgljb250cm9sIGZsb2F0IGFib3ZlIGFuIGFwcGxpY2F0aW9uLCBlLmcuOgoKCQljcmVhdGU6IGZ1bmN0aW9uKCkgewoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCQl0aGlzLnNldFBhcmVudChlbnlvLmZsb2F0aW5nTGF5ZXIpOwoJCX0KCglOb3RlOiBJdCdzIG5vdCBpbnRlbmRlZCB0aGF0IHVzZXJzIGNyZWF0ZSBpbnN0YW5jZXMgb2YgX2VueW8uRmxvYXRpbmdMYXllcl8uCiovCi8vKiBAcHJvdGVjdGVkCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5GbG9hdGluZ0xheWVyIiwKCS8vKiBAcHJvdGVjdGVkCgljcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJdGhpcy5zZXRQYXJlbnQobnVsbCk7Cgl9LAoJLy8gZGV0ZWN0IHdoZW4gbm9kZSBpcyBkZXRhdGNoZWQgZHVlIHRvIGRvY3VtZW50LmJvZHkgYmVpbmcgc3RvbXBlZAoJaGFzTm9kZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQlpZiAodGhpcy5ub2RlICYmICF0aGlzLm5vZGUucGFyZW50Tm9kZSkgewoJCQl0aGlzLnRlYXJkb3duUmVuZGVyKCk7CgkJfQoJCXJldHVybiB0aGlzLm5vZGU7Cgl9LAoJcmVuZGVyOiBmdW5jdGlvbigpIHsKCQl0aGlzLnBhcmVudE5vZGUgPSBkb2N1bWVudC5ib2R5OwoJCXJldHVybiB0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCWdlbmVyYXRlSW5uZXJIdG1sOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gIiI7Cgl9LAoJYmVmb3JlQ2hpbGRSZW5kZXI6IGZ1bmN0aW9uKCkgewoJCWlmICghdGhpcy5oYXNOb2RlKCkpIHsKCQkJdGhpcy5yZW5kZXIoKTsKCQl9Cgl9LAoJdGVhcmRvd25DaGlsZHJlbjogZnVuY3Rpb24oKSB7Cgl9Cn0pOwoKZW55by5mbG9hdGluZ0xheWVyID0gbmV3IGVueW8uRmxvYXRpbmdMYXllcigpOw==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Group.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5Hcm91cF8gcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCBtdWx0aXBsZSBlbGVtZW50cy4gIEl0IGVuYWJsZXMgdGhlCgljcmVhdGlvbiBvZiByYWRpbyBncm91cHMgZnJvbSBhcmJpdHJhcnkgY29tcG9uZW50cyBzdXBwb3J0aW5nIHRoZQoJW0dyb3VwSXRlbV0oI2VueW8uR3JvdXBJdGVtKSBBUEkuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5Hcm91cCIsCglwdWJsaXNoZWQ6IHsKCQkvKioKCQkJSWYgdHJ1ZSwgb25seSBvbmUgR3JvdXBJdGVtIGluIHRoZSBjb21wb25lbnQgbGlzdCBtYXkgYmUgYWN0aXZlIGF0CgkJCWEgZ2l2ZW4gdGltZS4KCQkqLwoJCWhpZ2hsYW5kZXI6IHRydWUsCgkJLy8qIFRoZSBjb250cm9sIHRoYXQgd2FzIGxhc3Qgc2VsZWN0ZWQKCQlhY3RpdmU6IG51bGwKCX0sCgkvLyogQHByb3RlY3RlZAoJaGFuZGxlcnM6IHsKCQlvbkFjdGl2YXRlOiAiYWN0aXZhdGUiCgl9LAoJYWN0aXZhdGU6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJaWYgKHRoaXMuaGlnaGxhbmRlcikgewoJCQkvLyBkZWFjdGl2YXRpb24gbWVzc2FnZXMgYXJlIGlnbm9yZWQgdW5sZXNzIGl0J3MgYW4gYXR0ZW1wdAoJCQkvLyB0byBkZWFjdGl2YXRlIHRoZSBoaWdobGFuZGVyCgkJCWlmICghaW5FdmVudC5vcmlnaW5hdG9yLmFjdGl2ZSkgewoJCQkJLy8gdGhpcyBjbGF1c2UgcHJldmVudHMgZGVhY3RpdmF0aW5nIGEgZ3JvdXBlZCBpdGVtIG9uY2UgaXQncyBiZWVuIGFjdGl2ZS4KCQkJCS8vIHRoZSBvbmx5IHByb3BlciB3YXkgdG8gZGVhY3RpdmF0ZSBhIGdyb3VwZWQgaXRlbSBpcyB0byBjaG9vc2UgYSBuZXcKCQkJCS8vIGhpZ2hsYW5kZXIuCgkJCQlpZiAoaW5FdmVudC5vcmlnaW5hdG9yID09IHRoaXMuYWN0aXZlKSB7CgkJCQkJdGhpcy5hY3RpdmUuc2V0QWN0aXZlKHRydWUpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJdGhpcy5zZXRBY3RpdmUoaW5FdmVudC5vcmlnaW5hdG9yKTsKCQkJfQoJCX0KCX0sCglhY3RpdmVDaGFuZ2VkOiBmdW5jdGlvbihpbk9sZCkgewoJCWlmIChpbk9sZCkgewoJCQlpbk9sZC5zZXRBY3RpdmUoZmFsc2UpOwoJCQlpbk9sZC5yZW1vdmVDbGFzcygiYWN0aXZlIik7CgkJfQoJCWlmICh0aGlzLmFjdGl2ZSkgewoJCQl0aGlzLmFjdGl2ZS5hZGRDbGFzcygiYWN0aXZlIik7CgkJfQoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/GroupItem.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5Hcm91cEl0ZW1fIGlzIHRoZSBiYXNlIGtpbmQgZm9yIHRoZSBHcm91cGluZyBBUEkuIEl0IG1hbmFnZXMgdGhlCglhY3RpdmUgc3RhdGUgb2YgdGhlIGNvbXBvbmVudCAob3IgdGhlIGluaGVyaXRpbmcgY29tcG9uZW50KS4gQSBzdWJraW5kIG1heQoJY2FsbCBfc2V0QWN0aXZlXyB0byBzZXQgdGhlIF9hY3RpdmVfIHByb3BlcnR5IHRvIHRoZSBkZXNpcmVkIHN0YXRlOyB0aGlzCgl3aWxsIGFkZGl0aW9uYWxseSBidWJibGUgYW4gX29uQWN0aXZhdGVfIGV2ZW50LCB3aGljaCBjYW4gYmUgaGFuZGxlZCBhcwoJbmVlZGVkIGJ5IHRoZSBjb250YWluaW5nIGNvbXBvbmVudHMuIFRoaXMgaXMgdXNlZnVsIGZvciBjcmVhdGluZyBncm91cHMgb2YKCWl0ZW1zIHdob3NlIHN0YXRlIHNob3VsZCBiZSBtYW5hZ2VkIGFzIGEgZ3JvdXAuCgoJRm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgd29ya3MsIHNlZSB0aGUKCTxhIGhyZWY9IiNlbnlvLkdyb3VwIj5lbnlvLkdyb3VwPC9hPiBraW5kLCB3aGljaCBlbmFibGVzIHRoZSBjcmVhdGlvbiBvZgoJcmFkaW8gZ3JvdXBzIGZyb20gYXJiaXRyYXJ5IGNvbXBvbmVudHMgdGhhdAlzdXBwb3J0IHRoZSBHcm91cGluZyBBUEkuCiovCgplbnlvLmtpbmQoewoJbmFtZTogImVueW8uR3JvdXBJdGVtIiwKCXB1Ymxpc2hlZDogewoJCS8vKiBUcnVlIGlmIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZAoJCWFjdGl2ZTogZmFsc2UKCX0sCgkvLyogQHByb3RlY3RlZAoJcmVuZGVyZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJdGhpcy5hY3RpdmVDaGFuZ2VkKCk7Cgl9LAoJYWN0aXZlQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5idWJibGUoIm9uQWN0aXZhdGUiKTsKCX0KfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Image.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5JbWFnZV8gaW1wbGVtZW50cyBhbiBIVE1MICZsdDtpbWcmZ3Q7IGVsZW1lbnQgYW5kLCBvcHRpb25hbGx5LCBidWJibGVzCgl0aGUgX29ubG9hZF8gYW5kIF9vbmVycm9yXyBldmVudHMuIEltYWdlIGRyYWdnaW5nIGlzIHN1cHByZXNzZWQgYnkgZGVmYXVsdCwKCXNvIGFzIG5vdCB0byBpbnRlcmZlcmUgd2l0aCB0b3VjaCBpbnRlcmZhY2VzLgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uSW1hZ2UiLAoJLy8qIFdoZW4gdHJ1ZSwgbm8gX29ubG9hZF8gb3IgX29uZXJyb3JfIGV2ZW50IGhhbmRsZXJzIHdpbGwgYmUgY3JlYXRlZAoJbm9FdmVudHM6IGZhbHNlLAoJLy8qIEBwcm90ZWN0ZWQKCXRhZzogImltZyIsCglhdHRyaWJ1dGVzOiB7CgkJLy8gbm90ZTogZHJhZ2dhYmxlIGF0dHJpYnV0ZSB0YWtlcyBvbmUgb2YgdGhlc2UgU3RyaW5nIHZhbHVlczogInRydWUiLCAiZmFsc2UiLCAiYXV0byIKCQkvLyAoQm9vbGVhbiBfZmFsc2VfIHdvdWxkIHJlbW92ZSB0aGUgYXR0cmlidXRlKQoJCWRyYWdnYWJsZTogImZhbHNlIgoJfSwKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMubm9FdmVudHMpIHsKCQkJZGVsZXRlIHRoaXMuYXR0cmlidXRlcy5vbmxvYWQ7CgkJCWRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXMub25lcnJvcjsKCQl9CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCglyZW5kZXJlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgImxvYWQiLCAiZXJyb3IiKTsKCX0KfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Input.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5JbnB1dF8gaW1wbGVtZW50cyBhbiBIVE1MICZsdDtpbnB1dCZndDsgZWxlbWVudCB3aXRoIGNyb3NzLXBsYXRmb3JtCglzdXBwb3J0IGZvciBjaGFuZ2UgZXZlbnRzLgoKCVlvdSBjYW4gbGlzdGVuIGZvciBfb25pbnB1dF8gYW5kIF9vbmNoYW5nZV8gRE9NIGV2ZW50cyBmcm9tIHRoaXMgY29udHJvbAoJdG8ga25vdyB3aGVuIHRoZSB0ZXh0IGluc2lkZSBoYXMgYmVlbiBtb2RpZmllZC4gX29uaW5wdXRfIGZpcmVzIGltbWVkaWF0ZWx5LAoJd2hpbGUgX29uY2hhbmdlXyBmaXJlcyB3aGVuIHRoZSB0ZXh0IGhhcyBjaGFuZ2VkIGFuZCB0aGUgaW5wdXQgc3Vic2VxdWVudGx5Cglsb3NlcyBmb2N1cy4KCglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uCglbVGV4dCBGaWVsZHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvanMvZW55by93aWtpL1RleHQtRmllbGRzKSBpbiB0aGUgRW55bwoJRGV2ZWxvcGVyIEd1aWRlLgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uSW5wdXQiLAoJcHVibGlzaGVkOiB7CgkJLyoqCgkJCVZhbHVlIG9mIHRoZSBpbnB1dC4gVXNlIHRoaXMgcHJvcGVydHkgb25seSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4KCQkJQ2FsbCBfZ2V0VmFsdWVfIGFuZCBfc2V0VmFsdWVfIHRvIG1hbmlwdWxhdGUgdGhlIHZhbHVlIGF0IHJ1bnRpbWUuCgkJKi8KCQl2YWx1ZTogIiIsCgkJLy8qIFRleHQgdG8gZGlzcGxheSB3aGVuIHRoZSBpbnB1dCBpcyBlbXB0eQoJCXBsYWNlaG9sZGVyOiAiIiwKCQkvKioKCQkJVHlwZSBvZiBpbnB1dDsgaWYgbm90IHNwZWNpZmllZCwgaXQncyB0cmVhdGVkIGFzICJ0ZXh0Ii4gSXQgY2FuCgkJCWJlIGFueXRoaW5nIHNwZWNpZmllZCBmb3IgdGhlIF90eXBlXyBhdHRyaWJ1dGUgaW4gdGhlIEhUTUwKCQkJc3BlY2lmaWNhdGlvbiwgaW5jbHVkaW5nICJ1cmwiLCAiZW1haWwiLCAic2VhcmNoIiwgb3IgIm51bWJlciIuCgkJKi8KCQl0eXBlOiAiIiwKCQkvKioKCQkJV2hlbiB0cnVlLCBwcmV2ZW50cyBpbnB1dCBpbnRvIHRoZSBjb250cm9sLiBUaGlzIG1hcHMgdG8gdGhlCgkJCV9kaXNhYmxlZF8gRE9NIGF0dHJpYnV0ZS4KCQkqLwoJCWRpc2FibGVkOiBmYWxzZSwKCQkvLyogV2hlbiB0cnVlLCBzZWxlY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCB3aGVuIGl0IGdhaW5zIGZvY3VzLgoJCXNlbGVjdE9uRm9jdXM6IGZhbHNlCgl9LAoJZXZlbnRzOiB7CgkJLy8qIEZpcmVzIHdoZW4gdGhlIGlucHV0IGlzIGRpc2FibGVkIG9yIGVuYWJsZWQuCgkJb25EaXNhYmxlZENoYW5nZTogIiIKCX0sCgkvLyogU2V0IHRvIHRydWUgdG8gZm9jdXMgdGhpcyBjb250cm9sIHdoZW4gaXQgaXMgcmVuZGVyZWQKCWRlZmF1bHRGb2N1czogZmFsc2UsCgkvLyogQHByb3RlY3RlZAoJdGFnOiAiaW5wdXQiLAoJY2xhc3NlczogImVueW8taW5wdXQiLAoJaGFuZGxlcnM6IHsKCQlvbmZvY3VzOiAiZm9jdXNlZCIsCgkJb25pbnB1dDogImlucHV0IiwKCQlvbmNsZWFyOiAiY2xlYXIiLAoJCW9uZHJhZ3N0YXJ0OiAiZHJhZ3N0YXJ0IgoJfSwKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJaWYgKGVueW8ucGxhdGZvcm0uaWUpIHsKCQkJdGhpcy5oYW5kbGVycy5vbmtleXVwID0gImlla2V5dXAiOwoJCX0KCQlpZiAoZW55by5wbGF0Zm9ybS53aW5kb3dzUGhvbmUpIHsKCQkJdGhpcy5oYW5kbGVycy5vbmtleWRvd24gPSAiaWVrZXlkb3duIjsKCQl9CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl0aGlzLnBsYWNlaG9sZGVyQ2hhbmdlZCgpOwoJCS8vIHByZXZlbnQgb3ZlcnJpZGluZyBhIGN1c3RvbSBhdHRyaWJ1dGUgd2l0aCBudWxsCgkJaWYgKHRoaXMudHlwZSkgewoJCQl0aGlzLnR5cGVDaGFuZ2VkKCk7CgkJfQoJCXRoaXMudmFsdWVDaGFuZ2VkKCk7Cgl9LAoJcmVuZGVyZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgoJCWVueW8ubWFrZUJ1YmJsZSh0aGlzLCAiZm9jdXMiLCAiYmx1ciIpOwoKCQkvL0ZvcmNlIG9uY2hhbmdlIGV2ZW50IHRvIGJlIGJ1YmJsZWQgaW5zaWRlIEVueW8gZm9yIElFOAoJCWlmKGVueW8ucGxhdGZvcm0uaWUgPT0gOCl7CgkJCXRoaXMuc2V0QXR0cmlidXRlKCJvbmNoYW5nZSIsIGVueW8uYnViYmxlcik7CgkJfQoKCQl0aGlzLmRpc2FibGVkQ2hhbmdlZCgpOwoJCWlmICh0aGlzLmRlZmF1bHRGb2N1cykgewoJCQl0aGlzLmZvY3VzKCk7CgkJfQoJfSwKCXR5cGVDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldEF0dHJpYnV0ZSgidHlwZSIsIHRoaXMudHlwZSk7Cgl9LAoJcGxhY2Vob2xkZXJDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldEF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiLCB0aGlzLnBsYWNlaG9sZGVyKTsKCX0sCglkaXNhYmxlZENoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsIHRoaXMuZGlzYWJsZWQpOwoJCXRoaXMuYnViYmxlKCJvbkRpc2FibGVkQ2hhbmdlIik7Cgl9LAoJdmFsdWVDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldEF0dHJpYnV0ZSgidmFsdWUiLCB0aGlzLnZhbHVlKTsKCQlpZiAodGhpcy5nZXROb2RlUHJvcGVydHkoInZhbHVlIiwgdGhpcy52YWx1ZSkgIT09IHRoaXMudmFsdWUpIHsKCQkJdGhpcy5zZXROb2RlUHJvcGVydHkoInZhbHVlIiwgdGhpcy52YWx1ZSk7CgkJfQoJfSwKCWlla2V5dXA6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdmFyIGllID0gZW55by5wbGF0Zm9ybS5pZSwga2MgPSBpbkV2ZW50LmtleUNvZGU7CgkJLy8gaW5wdXQgZXZlbnQgbWlzc2luZyBvbiBpZSA4LCBmYWlscyB0byBmaXJlIG9uIGJhY2tzcGFjZSBhbmQgZGVsZXRlIGtleXMgaW4gaWUgOQoJCWlmIChpZSA8PSA4IHx8IChpZSA9PSA5ICYmIChrYyA9PSA4IHx8IGtjID09IDQ2KSkpIHsKCQkJdGhpcy5idWJibGUoIm9uaW5wdXQiLCBpbkV2ZW50KTsKCQl9Cgl9LAoJaWVrZXlkb3duOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCXZhciB3cCA9IGVueW8ucGxhdGZvcm0ud2luZG93c1Bob25lLCBrYyA9IGluRXZlbnQua2V5Q29kZSwgZHQgPSBpbkV2ZW50LmRpc3BhdGNoVGFyZ2V0OwoJCS8vIG9uY2hhbmdlIGV2ZW50IGZhaWxzIHRvIGZpcmUgb24gZW50ZXIga2V5IGZvciBXaW5kb3dzIFBob25lIDgsIHNvIHdlIGZvcmNlIGJsdXIKCQlpZiAod3AgPD0gOCAmJiBrYyA9PSAxMyAmJiB0aGlzLnRhZyA9PSAiaW5wdXQiICYmIGR0Lmhhc05vZGUoKSkgewoJCQlkdC5ub2RlLmJsdXIoKTsKCQl9Cgl9LAoJY2xlYXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0VmFsdWUoIiIpOwoJfSwKCS8vIG5vdGU6IHdlIGRpc2FsbG93IGRyYWdnaW5nIG9mIGFuIGlucHV0IHRvIGFsbG93IHRleHQgc2VsZWN0aW9uIG9uIGFsbCBwbGF0Zm9ybXMKCWRyYWdzdGFydDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuaGFzRm9jdXMoKTsKCX0sCglmb2N1c2VkOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5zZWxlY3RPbkZvY3VzKSB7CgkJCWVueW8uYXN5bmNNZXRob2QodGhpcywgInNlbGVjdENvbnRlbnRzIik7CgkJfQoJfSwKCXNlbGVjdENvbnRlbnRzOiBmdW5jdGlvbigpIHsKCQl2YXIgbiA9IHRoaXMuaGFzTm9kZSgpOwoKCQlpZiAobiAmJiBuLnNldFNlbGVjdGlvblJhbmdlKSB7CgkJCW4uc2V0U2VsZWN0aW9uUmFuZ2UoMCwgbi52YWx1ZS5sZW5ndGgpOwoJCX0gZWxzZSBpZiAobiAmJiBuLmNyZWF0ZVRleHRSYW5nZSkgewoJCQl2YXIgciA9IG4uY3JlYXRlVGV4dFJhbmdlKCk7CgkJCXIuZXhwYW5kKCJ0ZXh0ZWRpdCIpOwoJCQlyLnNlbGVjdCgpOwoJCX0KCX0sCglpbnB1dDogZnVuY3Rpb24oKSB7CgkJdmFyIHZhbCA9IHRoaXMuZ2V0Tm9kZVByb3BlcnR5KCJ2YWx1ZSIpOwoJCXRoaXMuc2V0VmFsdWUodmFsKTsKCX0KfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Media.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5NZWRpYV8gaW1wbGVtZW50cyBhbiBIVE1MIDUgTWVkaWEgZWxlbWVudC4gSXQgaXMgbm90IGludGVuZGVkIHRvIAoJYmUgdXNlZCBleHBsaWNpdGx5LCBhcyBpdCBpcyBhIGJhc2UgY29udHJvbCBmb3IgX2VueW8uQXVkaW9fICYgX2VueW8uVmlkZW9fCgoJSW5pdGlhbGl6ZSBhbiBhdWRpbyBjb21wb25lbnQgYXMgZm9sbG93czoKCgkJe2tpbmQ6ICJlbnlvLkF1ZGlvIiwgc3JjOiAiaHR0cDovL3d3dy53M3NjaG9vbHMuY29tL3RhZ3MvaG9yc2UubXAzIn0KCQoJVG8gcGxheSB0aGUgYXVkaW8sIGNhbGwgJ3RoaXMuJC5hdWRpby5wbGF5KCknLgoKCVRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIEhUTUwgNSBNZWRpYSBlbGVtZW50LCBjYWxsCgkndGhpcy4kLmF1ZGlvLmhhc05vZGUoKScuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5NZWRpYSIsCgkvLyogQHB1YmxpYwoJcHVibGlzaGVkOiB7CgkJLy8qIFVSTCBvZiB0aGUgc291bmQgZmlsZSB0byBwbGF5LCBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uIEhUTUwgZmlsZQoJCXNyYzogIiIsCgkJLy8qIGlmIHRydWUsIG1lZGlhIHdpbGwgYXV0b21hdGljYWxseSBzdGFydCBwbGF5YmFjayB3aGVuIGxvYWRlZAoJCWF1dG9wbGF5OiBmYWxzZSwKCQkvLyogVGhlIGRlc2lyZWQgc3BlZWQgYXQgd2hpY2ggdGhlIG1lZGlhIHJlc291cmNlIGlzIHRvIHBsYXkKCQlkZWZhdWx0UGxheWJhY2tSYXRlOiAxLjAsCgkJLy8qIFRoZSBlZmZlY3RpdmUgcGxheWJhY2sgcmF0ZQoJCXBsYXliYWNrUmF0ZTogMS4wLAoJCS8vKiBJbmRpY2F0ZXMgaG93IGRhdGEgc2hvdWxkIGJlIHByZWxvYWRlZCwgcmVmbGVjdGluZyB0aGUgcHJlbG9hZCBIVE1MIGF0dHJpYnV0ZSAobm9uZSwgbWV0YWRhdGEsIGF1dG8pCgkJcHJlbG9hZDogIm5vbmUiLAoJCS8vKiBpZiB0cnVlLCByZXN0YXJ0IG1lZGlhIGZyb20gYmVnaW5uaW5nIHdoZW4gZmluaXNoZWQKCQlsb29wOiBmYWxzZSwKCQkvLyogSWYgdHJ1ZSwgbWVkaWEgdm9sdW1lIHdpbGwgYmUgbXV0ZWQKCQltdXRlZDogZmFsc2UsCgkJLy8qIGlmIHRydWUsIHNob3cgZGVmYXVsdCBtZWRpYSBjb250cm9scwoJCXNob3dDb250cm9sczogZmFsc2UsCgkJLy8qIEN1cnJlbnQgcGxheWJhY2sgdm9sdW1lLCBhcyBhIG51bWJlciBpbiB0aGUgcmFuZ2UgZnJvbSAwLjAgdG8gMS4wCgkJdm9sdW1lOiAxLjAKCX0sCglldmVudHM6IHsKCQkvLyogRmlyZXMgd2hlbiBlbGVtZW50IHN0b3BzIGZldGNoaW5nIG1lZGlhIGRhdGEgYmVmb3JlIGl0IGlzIGNvbXBsZXRlbHkgZG93bmxvYWRlZCwgYnV0IG5vdCBkdWUgdG8gYW4gZXJyb3IKCQlvbkFib3J0OiAiIiwKCQkvLyogRmlyZXMgd2hlbiBlbGVtZW50IGNhbiByZXN1bWUgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGRhdGEsIGJ1dCBtYXkgbmVlZCB0byBzdG9wIGZvciBmdXJ0aGVyIGJ1ZmZlcmluZyBvZiBjb250ZW50CgkJb25DYW5QbGF5OiAiIiwKCQkvLyogRmlyZXMgd2hlbiBlbGVtZW50IGNhbiByZXN1bWUgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGRhdGEgd2l0aG91dCBuZWVkaW5nIHRvIHN0b3AgZm9yIGZ1cnRoZXIgYnVmZmVyaW5nIG9mIGNvbnRlbnQKCQlvbkNhblBsYXlUaHJvdWdoOiAiIiwKCQkvLyogRmlyZXMgd2hlbiB0aGUgZHVyYXRpb24gYXR0cmlidXRlIGhhcyBiZWVuIGNoYW5nZWQKCQlvbkR1cmF0aW9uQ2hhbmdlOiAiIiwKCQkvLyogRmlyZXMgd2hlbiBuZXR3b3JrU3RhdGUgd2FzIHByZXZpb3VzbHkgbm90IGluIHRoZSBORVRXT1JLX0VNUFRZIHN0YXRlIGFuZCBoYXMganVzdCBzd2l0Y2hlZCB0byB0aGF0IHN0YXRlCgkJb25FbXB0aWVkOiAiIiwKCQkvLyogRmlyZXMgd2hlbiB0aGUgbWVkaWEgZmluaXNoZXMgbm9ybWFsbHkKCQlvbkVuZGVkOiAiIiwKCQkvLyogRmlyZXMgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZmV0Y2hpbmcgbWVkaWEgZGF0YQoJCW9uRXJyb3I6ICIiLAoJCS8vKiBGaXJlcyB3aGVuIHRoZSBtZWRpYSBkYXRhIGlzIHJlbmRlcmVkCgkJb25Mb2FkZWREYXRhOiAiIiwKCQkvLyogRmlyZXMgd2hlbiB0aGUgbWVkaWEgZHVyYXRpb24gJiBkaW1lbnNpb25zIG9mIHRoZSBtZWRpYSByZXNvdXJjZS90ZXh0IHRyYWNrcyBhcmUgcmVhZHkKCQlvbkxvYWRlZE1ldGFEYXRhOiAiIiwKCQkvLyogRmlyZXMgd2hlbiB0aGUgbWVkaWEgZWxlbWVudCBiZWdpbnMgbG9va2luZyBmb3IgbWVkaWEgZGF0YQoJCW9uTG9hZFN0YXJ0OiAiIiwKCQkvLyogRmlyZXMgd2hlbiBwbGF5YmFjayBpcyBwYXVzZWQKCQlvblBhdXNlOiAiIiwKCQkvLyogRmlyZXMgd2hlbiBwbGF5YmFjayBpcyBubyBsb25nZXIgcGF1c2VkCgkJb25QbGF5OiAiIiwKCQkvLyogRmlyZXMgd2hlbiBwbGF5YmFjayBpcyByZWFkeSB0byBzdGFydCBhZnRlciBoYXZpbmcgYmVlbiBwYXVzZWQgb3IgZGVsYXllZCBkdWUgdG8gbGFjayBvZiBtZWRpYSBkYXRhCgkJb25QbGF5aW5nOiAiIiwKCQkvLyogRmlyZXMgd2hlbiBmZXRjaGluZyBtZWRpYSBkYXRhCgkJb25Qcm9ncmVzczogIiIsCgkJLy8qIEZpcmVzIHdoZW4gdGhlIF90aGlzLmRlZmF1bHRQbGF5YmFja1JhdGVfIG9yIF90aGlzLnBsYXliYWNrUmF0ZV8gcHJvcGVydGllcyBoYXZlIGJlZW4gdXBkYXRlZAoJCW9uUmF0ZUNoYW5nZTogIiIsCgkJLy8qIEZpcmVzIHdoZW4gdGhlIHNlZWtpbmcgSURMIGF0dHJpYnV0ZSBjaGFuZ2VzIHRvIGZhbHNlCgkJb25TZWVrZWQ6ICIiLAoJCS8vKiBGaXJlcyB3aGVuIHRoZSBzZWVraW5nIElETCBhdHRyaWJ1dGUgY2hhbmdlcyB0byB0cnVlCgkJb25TZWVraW5nOiAiIiwKCQkvLyogRmlyZXMgd2hlbiBtZWRpYSBmZXRjaGluZyBpcyBpbnRlcnJ1cHRlZAoJCW9uU3RhbGxlZDogIiIsCgkJLy8qIEZpcmVzIHdoZW4gdGhlIG1lZGlhIGNvbnRyb2xsZXIgcG9zaXRpb24gY2hhbmdlcwoJCW9uVGltZVVwZGF0ZTogIiIsCgkJLy8qIEZpcmVzIHdoZW4gZWl0aGVyIHRoZSBfdGhpcy52b2x1bWVfIG9yIF90aGlzLm11dGVkXyBwcm9wZXJ0aWVzIGlzIHVwZGF0ZWQKCQlvblZvbHVtZUNoYW5nZTogIiIsCgkJLy8qIEZpcmVzIHdoZW4gcGxheWJhY2sgaGFzIHN0b3BwZWQgYmVjYXVzZSB0aGUgbmV4dCBmcmFtZSBpcyBub3QgYXZhaWxhYmxlLCBidXQgaXMgZXhwZWN0ZWQgdG8gYmUKCQlvbldhaXRpbmc6ICIiCgl9LAoJLy8qIEBwcm90ZWN0ZWQKCWhhbmRsZXJzOiB7CgkJb25hYm9ydDogIl9hYm9ydCIsCgkJb25jYW5wbGF5OiAiX2NhblBsYXkiLAoJCW9uY2FucGxheXRocm91Z2g6ICJfY2FuUGxheVRocm91Z2giLAoJCW9uZHVyYXRpb25jaGFuZ2U6ICJfZHVyYXRpb25DaGFuZ2UiLAoJCW9uZW1wdGllZDogIl9lbXB0aWVkIiwKCQlvbmVuZGVkOiAiX2VuZGVkIiwKCQlvbmVycm9yOiAiX2Vycm9yIiwKCQlvbmxvYWRlZGRhdGE6ICJfbG9hZGVkRGF0YSIsCgkJb25sb2FkZWRtZXRhZGF0YTogIl9sb2FkZWRNZXRhRGF0YSIsCgkJb25sb2Fkc3RhcnQ6ICJfbG9hZFN0YXJ0IiwKCQlvbnBhdXNlOiAiX3BhdXNlIiwKCQlvbnBsYXk6ICJfcGxheSIsCgkJb25wbGF5aW5nOiAiX3BsYXlpbmciLAoJCW9ucHJvZ3Jlc3M6ICJfcHJvZ3Jlc3MiLAoJCW9ucmF0ZWNoYW5nZTogIl9yYXRlQ2hhbmdlIiwKCQlvbnNlZWtlZDogIl9zZWVrZWQiLAoJCW9uc2Vla2luZzogIl9zZWVraW5nIiwKCQlvbnN0YWxsZWQ6ICJfc3RhbGxlZCIsCgkJb250aW1ldXBkYXRlOiAiX3RpbWVVcGRhdGUiLAoJCW9udm9sdW1lY2hhbmdlOiAiX3ZvbHVtZUNoYW5nZSIsCgkJb253YWl0aW5nOiAiX3dhaXRpbmciCgl9LAoJY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXRoaXMuYXV0b3BsYXlDaGFuZ2VkKCk7CgkJdGhpcy5sb29wQ2hhbmdlZCgpOwoJCXRoaXMucHJlbG9hZENoYW5nZWQoKTsKCQl0aGlzLnNob3dDb250cm9sc0NoYW5nZWQoKTsKCQl0aGlzLnNyY0NoYW5nZWQoKTsKCX0sCglyZW5kZXJlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgImFib3J0Iik7CgkJZW55by5tYWtlQnViYmxlKHRoaXMsICJjYW5wbGF5Iik7CgkJZW55by5tYWtlQnViYmxlKHRoaXMsICJjYW5wbGF5dGhyb3VnaCIpOwoJCWVueW8ubWFrZUJ1YmJsZSh0aGlzLCAiZHVyYXRpb25jaGFuZ2UiKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgImVtcHRpZWQiKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgImVuZGVkIik7CgkJZW55by5tYWtlQnViYmxlKHRoaXMsICJlcnJvciIpOwoJCWVueW8ubWFrZUJ1YmJsZSh0aGlzLCAibG9hZGVkZGF0YSIpOwoJCWVueW8ubWFrZUJ1YmJsZSh0aGlzLCAibG9hZGVkbWV0YWRhdGEiKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgImxvYWRzdGFydCIpOwoJCWVueW8ubWFrZUJ1YmJsZSh0aGlzLCAicGF1c2UiKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgInBsYXkiKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgInBsYXlpbmciKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgInByb2dyZXNzIik7CgkJZW55by5tYWtlQnViYmxlKHRoaXMsICJyYXRlY2hhbmdlIik7CgkJZW55by5tYWtlQnViYmxlKHRoaXMsICJzZWVrZWQiKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgInNlZWtpbmciKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgInN0YWxsZWQiKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgInRpbWV1cGRhdGUiKTsKCQllbnlvLm1ha2VCdWJibGUodGhpcywgInZvbHVtZWNoYW5nZSIpOwoJCWVueW8ubWFrZUJ1YmJsZSh0aGlzLCAid2FpdGluZyIpOwoJCXRoaXMuZGVmYXVsdFBsYXliYWNrUmF0ZUNoYW5nZWQoKTsKCQl0aGlzLm11dGVkQ2hhbmdlZCgpOwoJCXRoaXMucGxheWJhY2tSYXRlQ2hhbmdlZCgpOwoJCXRoaXMudm9sdW1lQ2hhbmdlZCgpOwoJfSwKCXNyY0NoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXZhciBwYXRoID0gZW55by5wYXRoLnJld3JpdGUodGhpcy5zcmMpOwoJCXRoaXMuc2V0QXR0cmlidXRlKCJzcmMiLCBwYXRoKTsKCQlpZiAodGhpcy5oYXNOb2RlKCkpIHsKCQkJdGhpcy5ub2RlLmxvYWQoKTsKCQl9Cgl9LAoJYXV0b3BsYXlDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldEF0dHJpYnV0ZSgiYXV0b3BsYXkiLCB0aGlzLmF1dG9wbGF5ID8gImF1dG9wbGF5IiA6IG51bGwpOwoJfSwKCWxvb3BDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldEF0dHJpYnV0ZSgibG9vcCIsIHRoaXMubG9vcCA/ICJsb29wIiA6IG51bGwpOwoJfSwKCW11dGVkQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZXRBdHRyaWJ1dGUoIm11dGVkIiwgdGhpcy5tdXRlZCA/ICJtdXRlZCIgOiBudWxsKTsKCX0sCglwcmVsb2FkQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZXRBdHRyaWJ1dGUoInByZWxvYWQiLCB0aGlzLnByZWxvYWQpOwoJfSwKCWRlZmF1bHRQbGF5YmFja1JhdGVDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5oYXNOb2RlKCkpIHsKCQkJdGhpcy5ub2RlLmRlZmF1bHRQbGF5YmFja1JhdGUgPSB0aGlzLmRlZmF1bHRQbGF5YmFja1JhdGU7CgkJfQoJfSwKCXBsYXliYWNrUmF0ZUNoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQl0aGlzLm5vZGUucGxheWJhY2tSYXRlID0gdGhpcy5wbGF5YmFja1JhdGU7CgkJfQoJfSwKCXNob3dDb250cm9sc0NoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0QXR0cmlidXRlKCJjb250cm9scyIsIHRoaXMuc2hvd0NvbnRyb2xzID8gImNvbnRyb2xzIiA6IG51bGwpOwoJfSwKCXZvbHVtZUNoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQl0aGlzLm5vZGUudm9sdW1lID0gdGhpcy52b2x1bWU7CgkJfQoJfSwKCS8vKiBXaGVuIGVsZW1lbnQgc3RvcHMgZmV0Y2hpbmcgbWVkaWEgZGF0YSBiZWZvcmUgaXQgaXMgY29tcGxldGVseSBkb3dubG9hZGVkLCBidXQgbm90IGR1ZSB0byBhbiBlcnJvcgoJX2Fib3J0OiBmdW5jdGlvbigpIHsKCQl0aGlzLmRvRW5kZWQoKTsKCX0sCgkvLyogV2hlbiBlbGVtZW50IGNhbiByZXN1bWUgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGRhdGEsIGJ1dCBtYXkgbmVlZCB0byBzdG9wIGZvciBmdXJ0aGVyIGJ1ZmZlcmluZyBvZiBjb250ZW50CglfY2FuUGxheTogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb0NhblBsYXkoKTsKCX0sCgkvLyogV2hlbiBlbGVtZW50IGNhbiByZXN1bWUgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGRhdGEgd2l0aG91dCBuZWVkaW5nIHRvIHN0b3AgZm9yIGZ1cnRoZXIgYnVmZmVyaW5nIG9mIGNvbnRlbnQKCV9jYW5QbGF5VGhyb3VnaDogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb0NhblBsYXlUaHJvdWdoKCk7Cgl9LAoJLy8qIFdoZW4gdGhlIGR1cmF0aW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBjaGFuZ2VkCglfZHVyYXRpb25DaGFuZ2U6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9EdXJhdGlvbkNoYW5nZSgpOwoJfSwKCS8vKiBXaGVuIG5ldHdvcmtTdGF0ZSB3YXMgcHJldmlvdXNseSBub3QgaW4gdGhlIE5FVFdPUktfRU1QVFkgc3RhdGUgYW5kIGhhcyBqdXN0IHN3aXRjaGVkIHRvIHRoYXQgc3RhdGUKCV9lbXB0aWVkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRvRW1wdGllZCgpOwoJfSwKCS8vKiBXaGVuIGF1ZGlvIHBsYXliYWNrIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgbWVkaWEKCV9lbmRlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb0VuZGVkKCk7Cgl9LAoJLy8qIFdoZW4gZXJyb3Igb2NjdXJzIHdoaWxlIGZldGNoaW5nIG1lZGlhIGRhdGEKCV9lcnJvcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb0Vycm9yKCk7Cgl9LAoJLy8qIFdoZW4gd2UgY2FuIHJlbmRlciB0aGUgbWVkaWEgZGF0YSBhdCB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBmb3IgdGhlIGZpcnN0IHRpbWUKCV9sb2FkZWREYXRhOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRvTG9hZGVkRGF0YSgpOwoJfSwKCS8vKiBXaGVuIHRoZSBtZWRpYSBkdXJhdGlvbiAmIGRpbWVuc2lvbnMgb2YgdGhlIG1lZGlhIHJlc291cmNlL3RleHQgdHJhY2tzIGFyZSByZWFkeQoJX2xvYWRlZE1ldGFEYXRhOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRvTG9hZGVkTWV0YURhdGEoKTsKCX0sCgkvLyogV2hlbiB0aGUgbWVkaWEgZWxlbWVudCBiZWdpbnMgbG9va2luZyBmb3IgbWVkaWEgZGF0YQoJX2xvYWRTdGFydDogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb0xvYWRTdGFydCgpOwoJfSwKCS8vKiBXaGVuIHBsYXliYWNrIGlzIHBhdXNlZAoJX3BhdXNlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRvUGF1c2UoKTsKCX0sCgkvLyogV2hlbiBwbGF5YmFjayBpcyBubyBsb25nZXIgcGF1c2VkCglfcGxheTogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb1BsYXkoKTsKCX0sCgkvLyogV2hlbiBwbGF5YmFjayBpcyByZWFkeSB0byBzdGFydCBhZnRlciBoYXZpbmcgYmVlbiBwYXVzZWQgb3IgZGVsYXllZCBkdWUgdG8gbGFjayBvZiBtZWRpYSBkYXRhCglfcGxheWluZzogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb1BsYXlpbmcoKTsKCX0sCgkvLyogV2hlbiB0aGUgbWVkaWEgZWxlbWVudCBpcyBmZXRjaGluZyBtZWRpYSBkYXRhCglfcHJvZ3Jlc3M6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9Qcm9ncmVzcygpOwoJfSwKCS8vKiBXaGVuIHRoZSBfdGhpcy5kZWZhdWx0UGxheWJhY2tSYXRlXyBvciBfdGhpcy5wbGF5YmFja1JhdGVfIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHVwZGF0ZWQKCV9yYXRlQ2hhbmdlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRvUmF0ZUNoYW5nZSgpOwoJfSwKCS8vKiBXaGVuIGZldGNoaW5nIG1lZGlhIGRhdGEgaXMgaW50ZXJydXB0ZWQKCV9zdGFsbGVkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRvU3RhbGxlZCgpOwoJfSwKCS8vKiBXaGVuIHRoZSBzZWVraW5nIElETCBhdHRyaWJ1dGUgY2hhbmdlcyB0byBmYWxzZQoJX3NlZWtlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb1NlZWtlZCgpOwoJfSwKCS8vKiBXaGVuIHRoZSBzZWVraW5nIElETCBhdHRyaWJ1dGUgY2hhbmdlcyB0byB0cnVlCglfc2Vla2luZzogZnVuY3Rpb24oKSB7CgkJdGhpcy5kb1NlZWtpbmcoKTsKCX0sCgkvLyogV2hlbiB0aGUgbWVkaWEgY29udHJvbGxlciBwb3NpdGlvbiBoYXMgY2hhbmdlZAoJX3RpbWVVcGRhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9UaW1lVXBkYXRlKCk7Cgl9LAoJLy8qIFdoZW4gZWl0aGVyIHRoZSBfdGhpcy52b2x1bWVfIG9yIF90aGlzLm11dGVkXyBwcm9wZXJ0aWVzIGlzIHVwZGF0ZWQKCV92b2x1bWVDaGFuZ2U6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9Wb2x1bWVDaGFuZ2UoKTsKCX0sCgkvLyogV2hlbiBwbGF5YmFjayBoYXMgc3RvcHBlZCBiZWNhdXNlIHRoZSBuZXh0IGZyYW1lIGlzIG5vdCBhdmFpbGFibGUsIGJ1dCBpcyBleHBlY3RlZCB0byBiZQoJX3dhaXRpbmc6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZG9XYWl0aW5nKCk7Cgl9LAoJLy8qIEBwdWJsaWMKCS8vKiBJbml0aWF0ZXMgcGxheWJhY2sgb2YgdGhlIGF1ZGlvIHJlZmVyZW5jZWQgaW4gX3RoaXMuc3JjXwoJcGxheTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXRoaXMubm9kZS5wbGF5KCk7CgkJfQoJfSwKCS8vKiBQYXVzZXMgdGhlIGF1ZGlvIHBsYXliYWNrCglwYXVzZTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXRoaXMubm9kZS5wYXVzZSgpOwoJCX0KCX0sCgkvLyogU2Vla3MgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvZiBfaW5WYWx1ZV8gKGluIHNlY29uZHMpCglzZWVrVG86IGZ1bmN0aW9uKGluVmFsdWUpIHsKCQlpZiAodGhpcy5oYXNOb2RlKCkpIHsKCQkJdGhpcy5ub2RlLmN1cnJlbnRUaW1lID0gaW5WYWx1ZTsKCQl9Cgl9LAoJLy8qIFJldHVybnMgdGhlIHJhbmdlcyBvZiB0aGUgbWVkaWEgc291cmNlIHRoYXQgaGFzIGJ1ZmZlcmVkCglnZXRCdWZmZXJlZDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXJldHVybiB0aGlzLm5vZGUuYnVmZmVyZWQ7CgkJfQoJCXJldHVybiAwOwoJfSwKCS8vKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIChpbiBzZWNvbmRzKQoJZ2V0Q3VycmVudFRpbWU6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQlyZXR1cm4gdGhpcy5ub2RlLmN1cnJlbnRUaW1lOwoJCX0KCQlyZXR1cm4gMDsKCX0sCgkvLyogUmV0dXJucyB0aGUgdG90YWwgZHVyYXRpb24gdGltZSBvZiB0aGUgbG9hZGVkIG1lZGlhIChpbiBzZWNvbmRzKQoJZ2V0RHVyYXRpb246IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQlyZXR1cm4gdGhpcy5ub2RlLmR1cmF0aW9uOwoJCX0KCQlyZXR1cm4gMDsKCX0sCgkvLyogUmVwcmVzZW50cyB3aGV0aGVyIHRoZSBtZWRpYSBlbGVtZW50IGlzIHBhdXNlZCBvciBub3QKCWdldFBhdXNlZDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXJldHVybiB0aGlzLm5vZGUucGF1c2VkOwoJCX0KCX0sCgkvLyogUmV0dXJucyB0aGUgcmFuZ2VzIG9mIHRoZSBtZWRpYSBzb3VyY2UgdGhhdCBoYXZlIGJlZW4gcGxheWVkLCBpZiBhbnkKCWdldFBsYXllZDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXJldHVybiB0aGlzLm5vZGUucGxheWVkOwoJCX0KCX0sCgkvLyogUmV0dXJucyB0aGUgcmVhZGluZXNzIHN0YXRlIG9mIHRoZSBtZWRpYQoJZ2V0UmVhZHlTdGF0ZTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXJldHVybiB0aGlzLm5vZGUucmVhZHlTdGF0ZTsKCQl9Cgl9LAoJLy8qIFJldHVybnMgdGhlIHJhbmdlcyBvZiB0aGUgbWVkaWEgc291cmNlIHRoZSB1c2VyIGlzIGFibGUgdG8gc2VlayB0bywgaWYgYW55CglnZXRTZWVrYWJsZTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXJldHVybiB0aGlzLm5vZGUuc2Vla2FibGU7CgkJfQoJfSwKCS8vKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVkaWEgaXMgY3VycmVudGx5IHNlZWtpbmcgdG8gYSBuZXcgcG9zaXRpb24KCWdldFNlZWtpbmc6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQlyZXR1cm4gdGhpcy5ub2RlLnNlZWtpbmc7CgkJfQoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Popup.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5Qb3B1cF8gaXMgYSBjb250cm9sIHVzZWQgdG8gZGlzcGxheSBjZXJ0YWluIGNvbnRlbnQgb24gdG9wIG9mIG90aGVyCgljb250ZW50LgoKCVBvcHVwcyBhcmUgaW5pdGlhbGx5IGhpZGRlbiBvbiBjcmVhdGlvbjsgdGhleSBjYW4gYmUgc2hvd24gYnkgY2FsbGluZyB0aGUKCV9zaG93XyBtZXRob2QgYW5kIHJlLWhpZGRlbiBieSBjYWxsaW5nIF9oaWRlXy4gIFBvcHVwcyBtYXkgYmUgY2VudGVyZWQgdXNpbmcKCXRoZQlfY2VudGVyZWRfIHByb3BlcnR5OyBpZiBub3QgY2VudGVyZWQsIHRoZXkgc2hvdWxkIGJlIGdpdmVuIGEgc3BlY2lmaWMKCXBvc2l0aW9uLgoKCUEgcG9wdXAgbWF5IGJlIG9wdGlvbmFsbHkgZmxvYXRlZCBhYm92ZSBhbGwgYXBwbGljYXRpb24gY29udGVudCBieSBzZXR0aW5nCglpdHMgX2Zsb2F0aW5nXyBwcm9wZXJ0eSB0byBfdHJ1ZV8uICBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIGd1YXJhbnRlZWluZwoJdGhhdCB0aGUgcG9wdXAgd2lsbCBiZSBkaXNwbGF5ZWQgb24gdG9wIG9mIG90aGVyIGNvbnRlbnQuICBUaGlzIHVzYWdlIGlzCglhcHByb3ByaWF0ZSB3aGVuIHRoZSBwb3B1cCBkb2VzIG5vdCBuZWVkIHRvIHNjcm9sbCBhbG9uZyB3aXRoIG90aGVyIGNvbnRlbnQuCgoJRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbgoJW1BvcHVwc10oaHR0cHM6Ly9naXRodWIuY29tL2VueW9qcy9lbnlvL3dpa2kvUG9wdXBzKSBpbiB0aGUgRW55byBEZXZlbG9wZXIKCUd1aWRlLgogKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLlBvcHVwIiwKCWNsYXNzZXM6ICJlbnlvLXBvcHVwIGVueW8tbm8tdG91Y2gtYWN0aW9uIiwKCXB1Ymxpc2hlZDogewoJCS8vKiBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IGNvbnRyb2xzIG91dHNpZGUgdGhlIHBvcHVwIGZyb20gcmVjZWl2aW5nCgkJLy8qIGV2ZW50cyB3aGlsZSB0aGUgcG9wdXAgaXMgc2hvd2luZwoJCW1vZGFsOiBmYWxzZSwKCQkvLyogQnkgZGVmYXVsdCwgdGhlIHBvcHVwIHdpbGwgaGlkZSB3aGVuIHRoZSB1c2VyIHRhcHMgb3V0c2lkZSBpdCBvcgoJCS8vKiBwcmVzc2VzIEVTQy4gIFNldCB0byBmYWxzZSB0byBwcmV2ZW50IHRoaXMgYmVoYXZpb3IuCgkJYXV0b0Rpc21pc3M6IHRydWUsCgkJLy8qIFNldCB0byB0cnVlIHRvIHJlbmRlciB0aGUgcG9wdXAgaW4gYSBmbG9hdGluZyBsYXllciBvdXRzaWRlIG9mIG90aGVyCgkJLy8qIGNvbnRyb2xzLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBndWFyYW50ZWUgdGhhdCB0aGUgcG9wdXAgd2lsbCBiZQoJCS8vKiBzaG93biBvbiB0b3Agb2Ygb3RoZXIgY29udHJvbHMuCgkJZmxvYXRpbmc6IGZhbHNlLAoJCS8vKiBTZXQgdG8gdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IGNlbnRlciB0aGUgcG9wdXAgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdmlld3BvcnQKCQljZW50ZXJlZDogZmFsc2UsCgkJLy8qIFNldCB0byB0cnVlIHRvIGJlIGFibGUgdG8gc2hvdyB0cmFuc2l0aW9uIG9uIHRoZSBzdHlsZSBtb2RpZmljYXRpb25zIG90aGVyd2lzZQoJCS8vKiB0aGUgdHJhbnNpdGlvbiBpcyBpbnZpc2libGUgKHZpc2liaWxpdHk6IGhpZGRlbikKCQlzaG93VHJhbnNpdGlvbnM6IGZhbHNlCgl9LAoJLy8qIEBwcm90ZWN0ZWQKCXNob3dpbmc6IGZhbHNlLAoJaGFuZGxlcnM6IHsKCQlvbmRvd246ICJkb3duIiwKCQlvbmtleWRvd246ICJrZXlkb3duIiwKCQlvbmRyYWdzdGFydDogImRyYWdzdGFydCIsCgkJb25mb2N1czogImZvY3VzIiwKCQlvbmJsdXI6ICJibHVyIiwKCQlvblJlcXVlc3RTaG93OiAicmVxdWVzdFNob3ciLAoJCW9uUmVxdWVzdEhpZGU6ICJyZXF1ZXN0SGlkZSIKCX0sCgljYXB0dXJlRXZlbnRzOiB0cnVlLAoJLy8qIEBwdWJsaWMKCWV2ZW50czogewoJCS8vKiBGaXJlcyBhZnRlciB0aGUgcG9wdXAgaXMgc2hvd24uCgkJb25TaG93OiAiIiwKCQkvLyogRmlyZXMgYWZ0ZXIgdGhlIHBvcHVwIGlzIGhpZGRlbi4KCQlvbkhpZGU6ICIiCgl9LAoJLy8qIEBwcm90ZWN0ZWQKCXRvb2xzOiBbCgkJe2tpbmQ6ICJTaWduYWxzIiwgb25LZXlkb3duOiAia2V5ZG93biJ9CgldLAoJY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXRoaXMuY2FuR2VuZXJhdGUgPSAhdGhpcy5mbG9hdGluZzsKCX0sCglyZW5kZXI6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmZsb2F0aW5nKSB7CgkJCWlmICghZW55by5mbG9hdGluZ0xheWVyLmhhc05vZGUoKSkgewoJCQkJZW55by5mbG9hdGluZ0xheWVyLnJlbmRlcigpOwoJCQl9CgkJCXRoaXMucGFyZW50Tm9kZSA9IGVueW8uZmxvYXRpbmdMYXllci5oYXNOb2RlKCk7CgkJfQoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7Cgl9LAoJZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuc2hvd2luZykgewoJCQl0aGlzLnJlbGVhc2UoKTsKCQl9CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCgoJcmVmbG93OiBmdW5jdGlvbigpIHsKCQl0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCgljYWxjVmlld3BvcnRTaXplOiBmdW5jdGlvbigpIHsKCQlpZiAod2luZG93LmlubmVyV2lkdGgpIHsKCQkJcmV0dXJuIHsKCQkJCXdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCwKCQkJCWhlaWdodDogd2luZG93LmlubmVySGVpZ2h0CgkJCX07CgkJfSBlbHNlIHsKCQkJdmFyIGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CgkJCXJldHVybiB7CgkJCQl3aWR0aDogZS5vZmZzZXRXaWR0aCwKCQkJCWhlaWdodDogZS5vZmZzZXRIZWlnaHQKCQkJfTsKCQl9Cgl9LAoJdXBkYXRlUG9zaXRpb246IGZ1bmN0aW9uKCkgewoJCXZhciBkID0gdGhpcy5jYWxjVmlld3BvcnRTaXplKCk7CgkJdmFyIGIgPSB0aGlzLmdldEJvdW5kcygpOwoKCQlpZiAodGhpcy50YXJnZXRQb3NpdGlvbikgewoJCQkvLyBGb3IgYnJldml0eSdzIHNha2UuLi4KCQkJdmFyIHAgPSB0aGlzLnRhcmdldFBvc2l0aW9uOwoKCQkJLy8gVGVzdCBhbmQgb3B0aW9uYWxseSBhZGp1c3Qgb3VyIHRhcmdldCBib3VuZHMgKG9ubHkgZmlyc3QgaXMgY29tbWVudGVkLCBiZWNhdXNlIGxvZ2ljIGlzIGVmZmVjdGl2ZWx5IGlkZW50aWNhbCBmb3IgYWxsIHNjZW5hcmlvcykKCQkJaWYgKHR5cGVvZiBwLmxlZnQgPT09ICdudW1iZXInKSB7CgkJCQkvLyBJZiBwb3B1cCB3aWxsIGJlIG91dHNpZGUgd2luZG93IGJvdW5kcywgc3dpdGNoIGFuY2hvcgoJCQkJaWYgKHAubGVmdCArIGIud2lkdGggPiBkLndpZHRoKSB7CgkJCQkJaWYgKHAubGVmdCAtIGIud2lkdGggPj0gMCkgewoJCQkJCQkvLyBTd2l0Y2hpbmcgdG8gcmlnaHQgY29ybmVyIHdpbGwgZml0IGluIHdpbmRvdwoJCQkJCQlwLnJpZ2h0ID0gZC53aWR0aCAtIHAubGVmdDsKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyBOZWl0aGVyIGNvcm5lciB3aWxsIHdvcms7IHN0aWNrIGF0IHNpZGUgb2Ygd2luZG93CgkJCQkJCXAucmlnaHQgPSAwOwoJCQkJCX0KCQkJCQlwLmxlZnQgPSBudWxsOwoJCQkJfSBlbHNlIHsKCQkJCQlwLnJpZ2h0ID0gbnVsbDsKCQkJCX0KCQkJfSBlbHNlIGlmICh0eXBlb2YgcC5yaWdodCA9PT0gJ251bWJlcicpIHsKCQkJCWlmIChwLnJpZ2h0ICsgYi53aWR0aCA+IGQud2lkdGgpIHsKCQkJCQlpZiAocC5yaWdodCAtIGIud2lkdGggPj0gMCkgewoJCQkJCQlwLmxlZnQgPSBkLndpZHRoIC0gcC5yaWdodDsKCQkJCQl9IGVsc2UgewoJCQkJCQlwLmxlZnQgPSAwOwoJCQkJCX0KCQkJCQlwLnJpZ2h0ID0gbnVsbDsKCQkJCX0gZWxzZSB7CgkJCQkJcC5sZWZ0ID0gbnVsbDsKCQkJCX0KCQkJfQoKCQkJaWYgKHR5cGVvZiBwLnRvcCA9PT0gJ251bWJlcicpIHsKCQkJCWlmIChwLnRvcCArIGIuaGVpZ2h0ID4gZC5oZWlnaHQpIHsKCQkJCQlpZiAocC50b3AgLSBiLmhlaWdodCA+PSAwKSB7CgkJCQkJCXAuYm90dG9tID0gZC5oZWlnaHQgLSBwLnRvcDsKCQkJCQl9IGVsc2UgewoJCQkJCQlwLmJvdHRvbSA9IDA7CgkJCQkJfQoJCQkJCXAudG9wID0gbnVsbDsKCQkJCX0gZWxzZSB7CgkJCQkJcC5ib3R0b20gPSBudWxsOwoJCQkJfQoJCQl9IGVsc2UgaWYgKHR5cGVvZiBwLmJvdHRvbSA9PT0gJ251bWJlcicpIHsKCQkJCWlmIChwLmJvdHRvbSArIGIuaGVpZ2h0ID4gZC5oZWlnaHQpIHsKCQkJCQlpZiAocC5ib3R0b20gLSBiLmhlaWdodCA+PSAwKSB7CgkJCQkJCXAudG9wID0gZC5oZWlnaHQgLSBwLmJvdHRvbTsKCQkJCQl9IGVsc2UgewoJCQkJCQlwLnRvcCA9IDA7CgkJCQkJfQoJCQkJCXAuYm90dG9tID0gbnVsbDsKCQkJCX0gZWxzZSB7CgkJCQkJcC50b3AgPSBudWxsOwoJCQkJfQoJCQl9CgoJCQkvLyAnaW5pdGlhbCcgdmFsdWVzIGFyZSBuZWNlc3NhcnkgdG8gb3ZlcnJpZGUgcG9zaXRpb25pbmcgcnVsZXMgaW4gdGhlIENTUwoJCQl0aGlzLmFkZFN0eWxlcygnbGVmdDogJyArIChwLmxlZnQgIT09IG51bGwgPyBwLmxlZnQgKyAncHgnIDogJ2luaXRpYWwnKSArICc7IHJpZ2h0OiAnICsgKHAucmlnaHQgIT09IG51bGwgPyBwLnJpZ2h0ICsgJ3B4JyA6ICdpbml0aWFsJykgKyAnOyB0b3A6ICcgKyAocC50b3AgIT09IG51bGwgPyBwLnRvcCArICdweCcgOiAnaW5pdGlhbCcpICsgJzsgYm90dG9tOiAnICsgKHAuYm90dG9tICE9PSBudWxsID8gcC5ib3R0b20gKyAncHgnIDogJ2luaXRpYWwnKSArICc7Jyk7CgkJfSBlbHNlIGlmICh0aGlzLmNlbnRlcmVkKSB7CgkJCXRoaXMuYWRkU3R5bGVzKCAidG9wOiAiICsgTWF0aC5tYXgoICggKCBkLmhlaWdodCAtIGIuaGVpZ2h0ICkgLyAyICksIDAgKSArICJweDsgbGVmdDogIiArIE1hdGgubWF4KCAoICggZC53aWR0aCAtIGIud2lkdGggKSAvIDIgKSwgMCApICsgInB4OyIgKTsKCQl9Cgl9LAoJc2hvd2luZ0NoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCS8vIGF1dG8gcmVuZGVyIHdoZW4gc2hvd24uCgkJaWYgKHRoaXMuZmxvYXRpbmcgJiYgdGhpcy5zaG93aW5nICYmICF0aGlzLmhhc05vZGUoKSkgewoJCQl0aGlzLnJlbmRlcigpOwoJCX0KCQkvLyBoaWRlIHdoaWxlIHNpemluZywgYW5kIG1vdmUgdG8gdG9wIGNvcm5lciBmb3IgYWNjdXJhdGUgc2l6aW5nCgkJaWYgKHRoaXMuY2VudGVyZWQgfHwgdGhpcy50YXJnZXRQb3NpdGlvbikgewoJCQlpZiAoIXRoaXMuc2hvd1RyYW5zaXRpb25zKSB7CgkJCQl0aGlzLmFwcGx5U3R5bGUoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CgkJCX0KCQkJdGhpcy5hZGRTdHlsZXMoInRvcDogMHB4OyBsZWZ0OiAwcHg7IHJpZ2h0OiBpbml0aWFsOyBib3R0b206IGluaXRpYWw7Iik7CgkJfQoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJaWYgKHRoaXMuc2hvd2luZykgewoJCQl0aGlzLnJlc2l6ZWQoKTsKCQkJaWYgKHRoaXMuY2FwdHVyZUV2ZW50cykgewoJCQkJdGhpcy5jYXB0dXJlKCk7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAodGhpcy5jYXB0dXJlRXZlbnRzKSB7CgkJCQl0aGlzLnJlbGVhc2UoKTsKCQkJfQoJCX0KCQkvLyBzaG93IGFmdGVyIHNpemluZwoJCWlmICh0aGlzLmNlbnRlcmVkIHx8IHRoaXMudGFyZ2V0UG9zaXRpb24gJiYgIXRoaXMuc2hvd1RyYW5zaXRpb25zKSB7CgkJCXRoaXMuYXBwbHlTdHlsZSgidmlzaWJpbGl0eSIsIG51bGwpOwoJCX0KCQkvLyBldmVudHMgZGVzaXJlZCBkdWUgdG8gcHJvZ3JhbW1hdGljIHNob3cvaGlkZQoJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQl0aGlzW3RoaXMuc2hvd2luZyA/ICJkb1Nob3ciIDogImRvSGlkZSJdKCk7CgkJfQoJfSwKCWNhcHR1cmU6IGZ1bmN0aW9uKCkgewoJCWVueW8uZGlzcGF0Y2hlci5jYXB0dXJlKHRoaXMsICF0aGlzLm1vZGFsKTsKCX0sCglyZWxlYXNlOiBmdW5jdGlvbigpIHsKCQllbnlvLmRpc3BhdGNoZXIucmVsZWFzZSh0aGlzKTsKCX0sCglkb3duOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCS8vcmVjb3JkIHRoZSBkb3duIGV2ZW50IHRvIHZlcmlmeSBpbiB0YXAKCQl0aGlzLmRvd25FdmVudCA9IGluRXZlbnQ7CgoJCS8vIHByZXZlbnQgZm9jdXMgZnJvbSBzaGlmdGluZyBvdXRzaWRlIHRoZSBwb3B1cCB3aGVuIG1vZGFsLgoJCWlmICh0aGlzLm1vZGFsICYmICFpbkV2ZW50LmRpc3BhdGNoVGFyZ2V0LmlzRGVzY2VuZGFudE9mKHRoaXMpKSB7CgkJCWluRXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9Cgl9LAoJdGFwOiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCS8vIGRpc21pc3Mgb24gdGFwIGlmIHByb3BlcnR5IGlzIHNldCBhbmQgY2xpY2sgc3RhcnRlZCAmIGVuZGVkIG91dHNpZGUgdGhlIHBvcHVwCgkJaWYgKHRoaXMuYXV0b0Rpc21pc3MgJiYgKCFpbkV2ZW50LmRpc3BhdGNoVGFyZ2V0LmlzRGVzY2VuZGFudE9mKHRoaXMpKSAmJiB0aGlzLmRvd25FdmVudCAmJgoJCQkoIXRoaXMuZG93bkV2ZW50LmRpc3BhdGNoVGFyZ2V0LmlzRGVzY2VuZGFudE9mKHRoaXMpKSkgewoJCQl0aGlzLmRvd25FdmVudCA9IG51bGw7CgkJCXRoaXMuaGlkZSgpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9LAoJLy8gaWYgYSBkcmFnIGV2ZW50IG9jY3VycyBvdXRzaWRlIGEgcG9wdXAsIGhpZGUKCWRyYWdzdGFydDogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQl2YXIgaW5TY29wZSA9IChpbkV2ZW50LmRpc3BhdGNoVGFyZ2V0ID09PSB0aGlzIHx8IGluRXZlbnQuZGlzcGF0Y2hUYXJnZXQuaXNEZXNjZW5kYW50T2YodGhpcykpOwoJCWlmIChpblNlbmRlci5hdXRvRGlzbWlzcyAmJiAhaW5TY29wZSkgewoJCQlpblNlbmRlci5zZXRTaG93aW5nKGZhbHNlKTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoJa2V5ZG93bjogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQlpZiAodGhpcy5zaG93aW5nICYmIHRoaXMuYXV0b0Rpc21pc3MgJiYgaW5FdmVudC5rZXlDb2RlID09IDI3IC8qIGVzY2FwZSAqLykgewoJCQl0aGlzLmhpZGUoKTsKCQl9Cgl9LAoJLy8gSWYgc29tZXRoaW5nIGluc2lkZSB0aGUgcG9wdXAgYmx1cnJlZCwga2VlcCB0cmFjayBvZiBpdC4KCWJsdXI6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJaWYgKGluRXZlbnQuZGlzcGF0Y2hUYXJnZXQuaXNEZXNjZW5kYW50T2YodGhpcykpIHsKCQkJdGhpcy5sYXN0Rm9jdXMgPSBpbkV2ZW50Lm9yaWdpbmF0b3I7CgkJfQoJfSwKCS8vIFdoZW4gc29tZXRoaW5nIG91dHNpZGUgdGhlIHBvcHVwIGZvY3VzZXMgKGUuZy4sIGR1ZSB0byB0YWIga2V5KSwgZm9jdXMgb3VyIGxhc3QgZm9jdXNlZCBjb250cm9sLgoJZm9jdXM6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJdmFyIGR0ID0gaW5FdmVudC5kaXNwYXRjaFRhcmdldDsKCQlpZiAodGhpcy5tb2RhbCAmJiAhZHQuaXNEZXNjZW5kYW50T2YodGhpcykpIHsKCQkJaWYgKGR0Lmhhc05vZGUoKSkgewoJCQkJZHQubm9kZS5ibHVyKCk7CgkJCX0KCQkJdmFyIG4gPSAodGhpcy5sYXN0Rm9jdXMgJiYgdGhpcy5sYXN0Rm9jdXMuaGFzTm9kZSgpKSB8fCB0aGlzLmhhc05vZGUoKTsKCQkJaWYgKG4pIHsKCQkJCW4uZm9jdXMoKTsKCQkJfQoJCX0KCX0sCglyZXF1ZXN0U2hvdzogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQl0aGlzLnNob3coKTsKCQlyZXR1cm4gdHJ1ZTsKCX0sCglyZXF1ZXN0SGlkZTogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQl0aGlzLmhpZGUoKTsKCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJLy8qIEBwdWJsaWMKCS8qKgoJCU9wZW4gYXQgdGhlIGxvY2F0aW9uIG9mIGEgbW91c2UgZXZlbnQgKF9pbkV2ZW50XykuIFRoZSBwb3B1cCdzCgkJcG9zaXRpb24gaXMgYXV0b21hdGljYWxseSBjb25zdHJhaW5lZCBzbyB0aGF0IGl0IGRvZXMgbm90CgkJZGlzcGxheSBvdXRzaWRlIHRoZSB2aWV3cG9ydCwgYW5kIGRlZmF1bHRzIHRvIGFuY2hvcmluZyB0aGUgdG9wCgkJbGVmdCBjb3JuZXIgb2YgdGhlIHBvcHVwIHRvIHRoZSBtb3VzZSBldmVudC4KCgkJX2luT2Zmc2V0XyBpcyBhbiBvcHRpb25hbCBvYmplY3Qgd2hpY2ggbWF5IGNvbnRhaW4gbGVmdCBhbmQgdG9wCgkJcHJvcGVydGllcyB0byBzcGVjaWZ5IGFuIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gdGhlCgkJcG9wdXAgd291bGQgb3RoZXJ3aXNlIGJlIHBvc2l0aW9uZWQuCgkqLwoJc2hvd0F0RXZlbnQ6IGZ1bmN0aW9uKGluRXZlbnQsIGluT2Zmc2V0KSB7CgkJLy8gQ2FsY3VsYXRlIG91ciBpZGVhbCB0YXJnZXQgYmFzZWQgb24gdGhlIGV2ZW50IHBvc2l0aW9uIGFuZCBvZmZzZXQKCQl2YXIgcCA9IHsKCQkJbGVmdDogaW5FdmVudC5jZW50ZXJYIHx8IGluRXZlbnQuY2xpZW50WCB8fCBpbkV2ZW50LnBhZ2VYLAoJCQl0b3A6IGluRXZlbnQuY2VudGVyWSB8fCBpbkV2ZW50LmNsaWVudFkgfHwgaW5FdmVudC5wYWdlWQoJCX07CgkJaWYgKGluT2Zmc2V0KSB7CgkJCXAubGVmdCArPSBpbk9mZnNldC5sZWZ0IHx8IDA7CgkJCXAudG9wICs9IGluT2Zmc2V0LnRvcCB8fCAwOwoJCX0KCgkJdGhpcy5zaG93QXRQb3NpdGlvbihwKTsKCX0sCgoJLyoqCgkJT3BlbiB0aGUgcG9wdXAgYXQgYSBzcGVjaWZpYyBwb3NpdGlvbi4gVGhlIGZpbmFsIGxvY2F0aW9uCgkJb2YgdGhlIHBvcHVwIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb25zdHJhaW5lZCBzbyB0aGF0IGl0IGRvZXMgbm90CgkJZGlzcGxheSBvdXRzaWRlIHRoZSB2aWV3cG9ydC4KCgkJX2luUG9zaXRpb25fIGlzIGFuIG9iamVjdCB3aGljaCBtYXkgY29udGFpbiBsZWZ0LCB0b3AsIGJvdHRvbSwKCQlhbmQgcmlnaHQgcHJvcGVydGllcyB0byBzcGVjaWZ5IHdoZXJlIHRoZSBwb3B1cCB3aWxsIGJlIGFuY2hvcmVkLgoJCUlmIGJvdGggbGVmdCBhbmQgcmlnaHQgYXJlIGluY2x1ZGVkLCB0aGUgcG9wdXAgd2lsbCBwcmVmZXJlbmNlIGxlZnQKCQkoc2FtZSBmb3IgdG9wIHZzLiBib3R0b20pLgoJKi8KCXNob3dBdFBvc2l0aW9uOiBmdW5jdGlvbihpblBvc2l0aW9uKSB7CgkJLy8gU2F2ZSBvdXIgdGFyZ2V0IHBvc2l0aW9uIGZvciBsYXRlciBwcm9jZXNzaW5nCgkJdGhpcy50YXJnZXRQb3NpdGlvbiA9IGluUG9zaXRpb247CgoJCS8vIFNob3cgdGhlIGRpYWxvZwoJCXRoaXMuc2hvdygpOwoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Repeater.js"
Content-Type: application/octet-stream; x-encoding=base64
77u/LyoqCglfZW55by5SZXBlYXRlcl8gaXMgYSBzaW1wbGUgY29udHJvbCBmb3IgbWFraW5nIGxpc3RzIG9mIGl0ZW1zLgoKCVRoZSBjb21wb25lbnRzIG9mIGEgcmVwZWF0ZXIgYXJlIGNvcGllZCBmb3IgZWFjaCBpdGVtIGNyZWF0ZWQsIGFuZCBhcmUKCXdyYXBwZWQJaW4gYSBjb250cm9sIHRoYXQga2VlcHMgdGhlIHN0YXRlIG9mIHRoZSBpdGVtIGluZGV4LgoKCUV4YW1wbGU6CgoJCXtraW5kOiAiUmVwZWF0ZXIiLCBjb3VudDogMiwgb25TZXR1cEl0ZW06ICJzZXRJbWFnZVNvdXJjZSIsIGNvbXBvbmVudHM6IFsKCQkJe2tpbmQ6ICJJbWFnZSJ9CgkJXX0KCgkJc2V0SW1hZ2VTb3VyY2U6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJCXZhciBpbmRleCA9IGluRXZlbnQuaW5kZXg7CgkJCXZhciBpdGVtID0gaW5FdmVudC5pdGVtOwoJCQlpdGVtLiQuaW1hZ2Uuc2V0U3JjKHRoaXMuaW1hZ2VTb3VyY2VzW2luZGV4XSk7CgkJCXJldHVybiB0cnVlOwoJCX0KCglCZSBzdXJlIHRvIHJldHVybiBfdHJ1ZV8gZnJvbSB5b3VyIF9vblNldHVwSXRlbV8gaGFuZGxlciB0byBhdm9pZCBoYXZpbmcKCW90aGVyIGV2ZW50IGhhbmRsZXJzIGZ1cnRoZXIgdXAgdGhlIHRyZWUgdHJ5IHRvIG1vZGlmeSB5b3VyIGl0ZW0gY29udHJvbC4KCglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uCglbTGlzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnlvanMvZW55by93aWtpL0xpc3RzKSBpbiB0aGUgRW55byBEZXZlbG9wZXIKCUd1aWRlLgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uUmVwZWF0ZXIiLAoJcHVibGlzaGVkOiB7CgkJLy8qIE51bWJlciBvZiBpdGVtcwoJCWNvdW50OiAwCgl9LAoJZXZlbnRzOiB7CgkJLyoqCgkJCUZpcmVzIHdoZW4gZWFjaCBpdGVtIGlzIGNyZWF0ZWQuCgoJCQlfaW5FdmVudC5pbmRleF8gY29udGFpbnMgdGhlIGl0ZW0ncyBpbmRleC4KCgkJCV9pbkV2ZW50Lml0ZW1fIGNvbnRhaW5zIHRoZSBpdGVtIGNvbnRyb2wsIGZvciBkZWNvcmF0aW9uLgoJCSovCgkJb25TZXR1cEl0ZW06ICIiCgl9LAoJY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXRoaXMuY291bnRDaGFuZ2VkKCk7Cgl9LAoJLy8qIEBwcm90ZWN0ZWQKCWluaXRDb21wb25lbnRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLml0ZW1Db21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzIHx8IHRoaXMua2luZENvbXBvbmVudHM7CgkJdGhpcy5jb21wb25lbnRzID0gdGhpcy5raW5kQ29tcG9uZW50cyA9IG51bGw7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCgljb3VudENoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuYnVpbGQoKTsKCX0sCglpdGVtQXRJbmRleDogZnVuY3Rpb24oaW5JbmRleCkgewoJCXJldHVybiB0aGlzLmNvbnRyb2xBdEluZGV4KGluSW5kZXgpOwoJfSwKCS8vKiBAcHVibGljCgkvKiogUmVuZGVycyB0aGUgY29sbGVjdGlvbiBvZiBpdGVtcy4gVGhpcyB3aWxsIGRlbGV0ZSBhbnkgZXhpc3RpbmcgaXRlbXMgYW5kCgkJcmVjcmVhdGUgdGhlIHJlcGVhdGVyIGlmIGNhbGxlZCBhZnRlciB0aGUgcmVwZWF0ZXIgaGFzIGJlZW4gcmVuZGVyZWQuCgkJVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBpZiBfc2V0Q291bnRfIGlzIGNhbGxlZCwgZXZlbiBpZiB0aGUgY291bnQKCQlyZW1haW5zIHRoZSBzYW1lLgoJKi8KCWJ1aWxkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRlc3Ryb3lDbGllbnRDb250cm9scygpOwoJCWZvciAodmFyIGk9MCwgYzsgaTx0aGlzLmNvdW50OyBpKyspIHsKCQkJYyA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KHtraW5kOiAiZW55by5Pd25lclByb3h5IiwgaW5kZXg6IGl9KTsKCQkJLy8gZG8gdGhpcyBhcyBhIHNlY29uZCBzdGVwIHNvICdjJyBpcyB0aGUgb3duZXIgb2YgdGhlIGNyZWF0ZWQgY29tcG9uZW50cwoJCQljLmNyZWF0ZUNvbXBvbmVudHModGhpcy5pdGVtQ29tcG9uZW50cyk7CgkJCS8vIGludm9rZSB1c2VyJ3Mgc2V0dXAgY29kZQoJCQl0aGlzLmRvU2V0dXBJdGVtKHtpbmRleDogaSwgaXRlbTogY30pOwoJCX0KCQl0aGlzLnJlbmRlcigpOwoJfSwKCS8qKgoJCVJlbmRlcnMgYSBzcGVjaWZpYyBpdGVtIGluIHRoZSBjb2xsZWN0aW9uLiBUaGlzIGRvZXMgbm90IGRlc3Ryb3kgdGhlCgkJaXRlbSwgYnV0IGp1c3QgY2FsbHMgdGhlIF9vblNldHVwSXRlbV8gZXZlbnQgaGFuZGxlciBhZ2FpbiBmb3IgaXQsIHNvCgkJYW55IHN0YXRlIHN0b3JlZCBpbgl0aGUgaXRlbSBpcyBwcmVzZXJ2ZWQuCgkqLwoJcmVuZGVyUm93OiBmdW5jdGlvbihpbkluZGV4KSB7CgkJdmFyIGMgPSB0aGlzLml0ZW1BdEluZGV4KGluSW5kZXgpOwoJCXRoaXMuZG9TZXR1cEl0ZW0oe2luZGV4OiBpbkluZGV4LCBpdGVtOiBjfSk7Cgl9Cn0pOwoKLy8gU29tZXRpbWVzIGNsaWVudCBjb250cm9scyBhcmUgaW50ZXJtZWRpYXRlZCB3aXRoIG51bGwtY29udHJvbHMuCi8vIFRoZXNlIG92ZXJyaWRlcyByZXJvdXRlIGV2ZW50cyBmcm9tIHN1Y2ggY29udHJvbHMgdG8gdGhlIG5vbWluYWwgZGVsZWdhdGUsCi8vIGFzIHdvdWxkIGhhcHBlbiBpbiB0aGUgYWJzZW5jZSBvZiBpbnRlcm1lZGlhdGlvbi4KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLk93bmVyUHJveHkiLAoJdGFnOiBudWxsLAoJZGVjb3JhdGVFdmVudDogZnVuY3Rpb24oaW5FdmVudE5hbWUsIGluRXZlbnQsIGluU2VuZGVyKSB7CgkJaWYgKGluRXZlbnQpIHsKCQkJLy8gcHJlc2VydmUgYW4gZXhpc3RpbmcgaW5kZXggcHJvcGVydHkuCgkJCWlmIChlbnlvLmV4aXN0cyhpbkV2ZW50LmluZGV4KSkgewoJCQkJLy8gaWYgdGhlcmUgYXJlIG5lc3RlZCBpbmRpY2VzLCBzdG9yZSBhbGwgb2YgdGhlbSBpbiBhbiBhcnJheQoJCQkJLy8gYnV0IGxlYXZlIHRoZSBpbm5lcm1vc3Qgb25lIGluIHRoZSBpbmRleCBwcm9wZXJ0eQoJCQkJaW5FdmVudC5pbmRpY2VzID0gaW5FdmVudC5pbmRpY2VzIHx8IFtpbkV2ZW50LmluZGV4XTsKCQkJCWluRXZlbnQuaW5kaWNlcy5wdXNoKHRoaXMuaW5kZXgpOwoJCQl9IGVsc2UgewoJCQkJLy8gZm9yIGEgc2luZ2xlIGxldmVsLCBqdXN0IGRlY29yYXRlIHRoZSBpbmRleCBwcm9wZXJ0eQoJCQkJaW5FdmVudC5pbmRleCA9IHRoaXMuaW5kZXg7CgkJCX0KCQkJLy8gdXBkYXRlIGRlbGVnYXRlIGR1cmluZyBidWJibGluZyB0byBhY2NvdW50IGZvciBwcm94eQoJCQkvLyBieSBtb3ZpbmcgdGhlIGRlbGVnYXRlIHVwIHRvIHRoZSByZXBlYXRlciBsZXZlbAoJCQlpZiAoaW5FdmVudC5kZWxlZ2F0ZSAmJiBpbkV2ZW50LmRlbGVnYXRlLm93bmVyID09PSB0aGlzKSB7CgkJCQlpbkV2ZW50LmRlbGVnYXRlID0gdGhpcy5vd25lcjsKCQkJfQoJCX0KCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCS8vIGV4dGVuZGluZyBlbnlvLkNvbXBvbmVudC5kZWxlZ2F0ZUV2ZW50CglkZWxlZ2F0ZUV2ZW50OiBmdW5jdGlvbihpbkRlbGVnYXRlLCBpbk5hbWUsIGluRXZlbnROYW1lLCBpbkV2ZW50LCBpblNlbmRlcikgewoJCWlmIChpbkRlbGVnYXRlID09IHRoaXMpIHsKCQkJaW5EZWxlZ2F0ZSA9IHRoaXMub3duZXIub3duZXI7CgkJfQoJCXJldHVybiB0aGlzLmluaGVyaXRlZChhcmd1bWVudHMsIFtpbkRlbGVnYXRlLCBpbk5hbWUsIGluRXZlbnROYW1lLCBpbkV2ZW50LCBpblNlbmRlcl0pOwoJfQp9KTs=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/RichText.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5SaWNoVGV4dF8gaXMgYSBtdWx0aS1saW5lIHRleHQgaW5wdXQgdGhhdCBzdXBwb3J0cyByaWNoIGZvcm1hdHRpbmcsCglzdWNoIGFzIGJvbGQsIGl0YWxpY3MsIGFuZCB1bmRlcmxpbmluZy4KCglUaGUgY29udGVudCBkaXNwbGF5ZWQgaW4gYSBSaWNoVGV4dCBtYXkgYmUgYWNjZXNzZWQgYXQgcnVudGltZSB2aWEgdGhlCglgZ2V0VmFsdWVgIGFuZCBgc2V0VmFsdWVgIG1ldGhvZHMuCgoJRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbgoJW1RleHQgRmllbGRzXShodHRwczovL2dpdGh1Yi5jb20vZW55b2pzL2VueW8vd2lraS9UZXh0LUZpZWxkcykgaW4gdGhlIEVueW8KCURldmVsb3BlciBHdWlkZS4KKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLlJpY2hUZXh0IiwKCWNsYXNzZXM6ICJlbnlvLXJpY2h0ZXh0IGVueW8tc2VsZWN0YWJsZSIsCglwdWJsaXNoZWQ6IHsKCQkvKioKCQkJX2FsbG93SHRtbF8gaXMgZW5hYmxlZCBieSBkZWZhdWx0IGluIFJpY2hUZXh0IHRvIHRha2UgYWR2YW50YWdlIG9mCgkJCWFsbCB0aGUgcmljaCBlZGl0aW5nIHByb3BlcnRpZXMuIEhvd2V2ZXIsIHRoaXMgYWxsb3dzIGZvciAqKkFOWSoqCgkJCUhUTUwgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgUmljaFRleHQsIGluY2x1ZGluZyBfaWZyYW1lXyBhbmQKCQkJX3NjcmlwdF8gdGFncywgd2hpY2ggY2FuIGJlIGEgc2VjdWl0eSBjb25jZXJuIGluIHNvbWUgc2l0dWF0aW9ucy4KCQkJSWYgc2V0IHRvIGZhbHNlLCBpbnNlcnRlZCBIVE1MIHdpbGwgYmUgZXNjYXBlZC4KCQkqLwoJCWFsbG93SHRtbDogdHJ1ZSwKCQkvLyogSWYgdHJ1ZSwgdGhlIFJpY2hUZXh0IHdpbGwgbm90IGFjY2VwdCBpbnB1dCBvciBnZW5lcmF0ZSBldmVudHMKCQlkaXNhYmxlZDogZmFsc2UsCgkJLy8qIFZhbHVlIG9mIHRoZSB0ZXh0IGZpZWxkCgkJdmFsdWU6ICIiCgl9LAoJLy8qIFNldCB0byB0cnVlIHRvIGZvY3VzIHRoaXMgY29udHJvbCB3aGVuIGl0IGlzIHJlbmRlcmVkLgoJZGVmYXVsdEZvY3VzOiBmYWxzZSwKCS8vKiBAcHJvdGVjdGVkCglwcm90ZWN0ZWRTdGF0aWNzOiB7CgkJb3NJbmZvOiBbCgkJCXtvczogImFuZHJvaWQiLCB2ZXJzaW9uOiAzfSwKCQkJe29zOiAiaW9zIiwgdmVyc2lvbjogNX0KCQldLAoJCS8vKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBsYXRmb3JtIGhhcyBjb250ZW50ZWRpdGFibGUgYXR0cmlidXRlLgoJCWhhc0NvbnRlbnRFZGl0YWJsZTogZnVuY3Rpb24oKSB7CgkJCWZvciAodmFyIGk9MCwgdDsgKHQ9ZW55by5SaWNoVGV4dC5vc0luZm9baV0pOyBpKyspIHsKCQkJCWlmIChlbnlvLnBsYXRmb3JtW3Qub3NdIDwgdC52ZXJzaW9uKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0cnVlOwoJCX0KCX0sCglraW5kOiAiZW55by5JbnB1dCIsCglhdHRyaWJ1dGVzOiB7CgkJY29udGVudGVkaXRhYmxlOiB0cnVlCgl9LAoJaGFuZGxlcnM6IHsKCQlvbmZvY3VzOiAiZm9jdXNIYW5kbGVyIiwKCQlvbmJsdXI6ICJibHVySGFuZGxlciIsCgkJb25rZXl1cDogInVwZGF0ZVZhbHVlIiwKCQlvbmN1dDogInVwZGF0ZVZhbHVlQXN5bmMiLAoJCW9ucGFzdGU6ICJ1cGRhdGVWYWx1ZUFzeW5jIiwKCQkvLyBwcmV2ZW50IG9uaW5wdXQgaGFuZGxlciBmcm9tIGJlaW5nIGNhbGxlZCBsb3dlciBpbiB0aGUgaW5oZXJpdGFuY2UgY2hhaW4KCQlvbmlucHV0OiBudWxsCgl9LAoJLy8gY3JlYXRlIFJpY2hUZXh0IGFzIGEgZGl2IGlmIHBsYXRmb3JtIGhhcyBjb250ZW50ZWRpdGFibGUgYXR0cmlidXRlLCBvdGhlcndpc2UgY3JlYXRlIGl0IGFzIGEgdGV4dGFyZWEKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZXRUYWcoZW55by5SaWNoVGV4dC5oYXNDb250ZW50RWRpdGFibGUoKT8iZGl2IjoidGV4dGFyZWEiKTsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfSwKCS8vIHNpbXVsYXRlIG9uY2hhbmdlIGV2ZW50IHRoYXQgaW5wdXRzIGV4cG9zZQoJZm9jdXNIYW5kbGVyOiBmdW5jdGlvbigpIHsKCQl0aGlzLl92YWx1ZSA9IHRoaXMuZ2V0KCJ2YWx1ZSIpOwoJfSwKCWJsdXJIYW5kbGVyOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5fdmFsdWUgIT09IHRoaXMuZ2V0KCJ2YWx1ZSIpKSB7CgkJCXRoaXMuYnViYmxlKCJvbmNoYW5nZSIpOwoJCX0KCX0sCgl2YWx1ZUNoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXZhciB2YWwgPSB0aGlzLmdldCgidmFsdWUiKTsKCQlpZiAodGhpcy5oYXNGb2N1cygpICYmIHZhbCAhPT0gdGhpcy5ub2RlLmlubmVySFRNTCkgewoJCQl0aGlzLnNlbGVjdEFsbCgpOwoJCQl0aGlzLmluc2VydEF0Q3Vyc29yKHZhbCk7CgkJfSBlbHNlIGlmKCF0aGlzLmhhc0ZvY3VzKCkpIHsKCQkJdGhpcy5zZXQoImNvbnRlbnQiLCB2YWwpOwoJCX0KCX0sCgl1cGRhdGVWYWx1ZTogZnVuY3Rpb24oKSB7CgkJdmFyIHZhbCA9IHRoaXMubm9kZS5pbm5lckhUTUw7CgkJdGhpcy5zZXQoInZhbHVlIiwgdmFsKTsKCX0sCgl1cGRhdGVWYWx1ZUFzeW5jOiBmdW5jdGlvbigpIHsKCQllbnlvLmFzeW5jTWV0aG9kKHRoaXMuYmluZFNhZmVseSgidXBkYXRlVmFsdWUiKSk7Cgl9LAoJLy8qIEBwdWJsaWMKCS8vKiBSZXR1cm5zIHRydWUgaWYgdGhlIFJpY2hUZXh0IGlzIGZvY3VzZWQuCgloYXNGb2N1czogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGFzTm9kZSgpKSB7CgkJCXJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLm5vZGU7CgkJfQoJfSwKCS8qKgoJCVJldHVybnMgdGhlIHNlbGVjdGlvbiBvYmplY3QuCgkqLwoJZ2V0U2VsZWN0aW9uOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5oYXNGb2N1cygpKSB7CgkJCXJldHVybiB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CgkJfQoJfSwKCS8vKiBSZW1vdmVzIHRoZSBzZWxlY3Rpb24gb2JqZWN0LgoJcmVtb3ZlU2VsZWN0aW9uOiBmdW5jdGlvbihpblN0YXJ0KSB7CgkJdmFyIHMgPSB0aGlzLmdldFNlbGVjdGlvbigpOwoJCWlmIChzKSB7CgkJCXNbaW5TdGFydCA/ICJjb2xsYXBzZVRvU3RhcnQiIDogImNvbGxhcHNlVG9FbmQiXSgpOwoJCX0KCX0sCgkvLyogTW9kaWZpZXMgdGhlIHNlbGVjdGlvbiBvYmplY3QuCgltb2RpZnlTZWxlY3Rpb246IGZ1bmN0aW9uKGluVHlwZSwgaW5EaXJlY3Rpb24sIGluQW1vdW50KSB7CgkJdmFyIHMgPSB0aGlzLmdldFNlbGVjdGlvbigpOwoJCWlmIChzKSB7CgkJCXMubW9kaWZ5KGluVHlwZSB8fCAibW92ZSIsIGluRGlyZWN0aW9uLCBpbkFtb3VudCk7CgkJfQoJfSwKCS8vKiBNb3ZlcyB0aGUgY3Vyc29yIGFjY29yZGluZyB0byB0aGUgRWRpdGluZyBBUEkuCgltb3ZlQ3Vyc29yOiBmdW5jdGlvbihpbkRpcmVjdGlvbiwgaW5BbW91bnQpIHsKCQl0aGlzLm1vZGlmeVNlbGVjdGlvbigibW92ZSIsIGluRGlyZWN0aW9uLCBpbkFtb3VudCk7Cgl9LAoJLy8qIE1vdmVzIHRoZSBjdXJzb3IgdG8gZW5kIG9mIHRleHQgZmllbGQuCgltb3ZlQ3Vyc29yVG9FbmQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMubW92ZUN1cnNvcigiZm9yd2FyZCIsICJkb2N1bWVudGJvdW5kYXJ5Iik7Cgl9LAoJLy8qIE1vdmVzIHRoZSBjdXJzb3IgdG8gc3RhcnQgb2YgdGV4dCBmaWVsZC4KCW1vdmVDdXJzb3JUb1N0YXJ0OiBmdW5jdGlvbigpIHsKCQl0aGlzLm1vdmVDdXJzb3IoImJhY2t3YXJkIiwgImRvY3VtZW50Ym91bmRhcnkiKTsKCX0sCgkvLyogU2VsZWN0cyBhbGwgY29udGVudCBpbiB0ZXh0IGZpZWxkLgoJc2VsZWN0QWxsOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5oYXNGb2N1cygpKSB7CgkJCWRvY3VtZW50LmV4ZWNDb21tYW5kKCJzZWxlY3RBbGwiKTsKCQl9Cgl9LAoJLy8qIEluc2VydHMgSFRNTCBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uLiAgSFRNTCBpcyBlc2NhcGVkIHVubGVzcyB0aGUKCS8vKiBfYWxsb3dIVE1MXyBwcm9wZXJ0eSBpcyB0cnVlLgoJaW5zZXJ0QXRDdXJzb3I6IGZ1bmN0aW9uKGluVmFsdWUpIHsKCQlpZiAodGhpcy5oYXNGb2N1cygpKSB7CgkJCXZhciB2ID0gdGhpcy5hbGxvd0h0bWwgPyBpblZhbHVlIDogZW55by5Db250cm9sLmVzY2FwZUh0bWwoaW5WYWx1ZSkucmVwbGFjZSgvXG4vZywgIjxici8+Iik7CgkJCWRvY3VtZW50LmV4ZWNDb21tYW5kKCJpbnNlcnRIVE1MIiwgZmFsc2UsIHYpOwoJCX0KCX0KfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Select.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5TZWxlY3RfIGltcGxlbWVudHMgYW4gSFRNTCBzZWxlY3Rpb24gd2lkZ2V0LCB1c2luZwoJW2VueW8uT3B0aW9uXSgjZW55by5PcHRpb24pIGtpbmRzIGJ5IGRlZmF1bHQuCgoJRXhhbXBsZToKCgkJe2tpbmQ6ICJTZWxlY3QiLCBvbmNoYW5nZTogInNlbGVjdENoYW5nZWQiLCBjb21wb25lbnRzOiBbCgkJCXtjb250ZW50OiAiRGVzY2VuZGluZyIsIHZhbHVlOiAiZCJ9LAoJCQl7Y29udGVudDogIkFzY2VuZGluZyIsIHZhbHVlOiAiYSJ9CgkJXX0KCgkJc2VsZWN0Q2hhbmdlZDogZnVuY3Rpb24oaW5TZW5kZXIsIGluRXZlbnQpIHsKCQkJdmFyIHMgPSBpblNlbmRlci5nZXRWYWx1ZSgpOwoJCQlpZiAocyA9PSAiZCIpIHsKCQkJCXRoaXMuc29ydExpc3REZXNjZW5kaW5nKCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLnNvcnRMaXN0QXNjZW5kaW5nKCk7CgkJCX0KCQl9CgoJTm90ZTogVGhpcyB1c2VzIHRoZSBgPHNlbGVjdD5gIHRhZywgd2hpY2ggaXNuJ3QgaW1wbGVtZW50ZWQKCWZvciBuYXRpdmUgd2ViT1MgYXBwbGljYXRpb25zLCBhbHRob3VnaCBpdCBkb2VzIHdvcmsgaW4gdGhlCgl3ZWJPUyBXZWIgYnJvd3Nlci4KKi8KCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5TZWxlY3QiLAoJcHVibGlzaGVkOiB7CgkJLy8qIEluZGV4IG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gaW4gdGhlIGxpc3QKCQlzZWxlY3RlZDogMAoJfSwKCS8vKiBAcHJvdGVjdGVkCgloYW5kbGVyczogewoJCW9uY2hhbmdlOiAiY2hhbmdlIgoJfSwKCXRhZzogInNlbGVjdCIsCglkZWZhdWx0S2luZDogImVueW8uT3B0aW9uIiwKCXJlbmRlcmVkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCS8vVHJpY2sgdG8gZm9yY2UgSUU4IG9uY2hhbmdlIGV2ZW50IGJ1YmJsZQoJCWlmKGVueW8ucGxhdGZvcm0uaWUgPT0gOCl7CgkJCXRoaXMuc2V0QXR0cmlidXRlKCJvbmNoYW5nZSIsIGVueW8uYnViYmxlcik7CgkJfQoJCXRoaXMuc2VsZWN0ZWRDaGFuZ2VkKCk7Cgl9LAoJZ2V0U2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBOdW1iZXIodGhpcy5nZXROb2RlUHJvcGVydHkoInNlbGVjdGVkSW5kZXgiLCB0aGlzLnNlbGVjdGVkKSk7Cgl9LAoJc2VsZWN0ZWRDaGFuZ2VkOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldE5vZGVQcm9wZXJ0eSgic2VsZWN0ZWRJbmRleCIsIHRoaXMuc2VsZWN0ZWQpOwoJfSwKCWNoYW5nZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZWxlY3RlZCA9IHRoaXMuZ2V0U2VsZWN0ZWQoKTsKCX0sCglyZW5kZXI6IGZ1bmN0aW9uKCkgewoJCS8vIHdvcmsgYXJvdW5kIElFIGJ1ZyB3aXRoIGlubmVySFRNTCBzZXR0aW5nIG9mIDxzZWxlY3Q+LCByZXJlbmRlciBwYXJlbnQgaW5zdGVhZAoJCS8vIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZGVmYXVsdC5hc3B4P3NjaWQ9a2I7ZW4tdXM7Mjc2MjI4CgkJaWYgKGVueW8ucGxhdGZvcm0uaWUpIHsKCQkJdGhpcy5wYXJlbnQucmVuZGVyKCk7CgkJfSBlbHNlIHsKCQkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl9Cgl9LAoJLy8qIEBwdWJsaWMKCS8vKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uLgoJZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhhc05vZGUoKSkgewoJCQlyZXR1cm4gdGhpcy5ub2RlLnZhbHVlOwoJCX0KCX0KfSk7CgovKioKCV9lbnlvLk9wdGlvbl8gaW1wbGVtZW50cyB0aGUgb3B0aW9ucyBpbiBhbiBIVE1MIHNlbGVjdCB3aWRnZXQuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5PcHRpb24iLAoJcHVibGlzaGVkOiB7CgkJLy8qIFZhbHVlIG9mIHRoZSBvcHRpb24KCQl2YWx1ZTogIiIKCX0sCgkvLyogQHByb3RlY3RlZAoJdGFnOiAib3B0aW9uIiwKCWNyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl0aGlzLnZhbHVlQ2hhbmdlZCgpOwoJfSwKCXZhbHVlQ2hhbmdlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgdGhpcy52YWx1ZSk7Cgl9Cn0pOwoKLyoqCglfZW55by5PcHRpb25Hcm91cF8gYWxsb3dzIGZvciB0aGUgZ3JvdXBpbmcgb2Ygb3B0aW9ucyBpbiBhIHNlbGVjdCB3aWRnZXQsCglhbmQgZm9yIHRoZSBkaXNhYmxpbmcgb2YgYmxvY2tzIG9mIG9wdGlvbnMuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5PcHRpb25Hcm91cCIsCglwdWJsaXNoZWQ6IHsKCQlsYWJlbDogIiIKCX0sCgkvLyogQHByb3RlY3RlZAoJdGFnOiAib3B0Z3JvdXAiLAoJZGVmYXVsdEtpbmQ6ICJlbnlvLk9wdGlvbiIsCgljcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJdGhpcy5sYWJlbENoYW5nZWQoKTsKCX0sCglsYWJlbENoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2V0QXR0cmlidXRlKCJsYWJlbCIsIHRoaXMubGFiZWwpOwoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Selection.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5TZWxlY3Rpb25fIGlzIHVzZWQgdG8gbWFuYWdlIHJvdyBzZWxlY3Rpb24gc3RhdGUgZm9yIGxpc3RzLiBJdAoJcHJvdmlkZXMgc2VsZWN0aW9uIHN0YXRlIG1hbmFnZW1lbnQJZm9yIGJvdGggc2luZ2xlLXNlbGVjdCBhbmQgbXVsdGktc2VsZWN0CglsaXN0cy4KCgkJLy8gVGhlIGZvbGxvd2luZyBpcyBhbiBleGNlcnB0IGZyb20gZW55by5GbHl3ZWlnaHRSZXBlYXRlci4KCQllbnlvLmtpbmQoewoJCQluYW1lOiAiZW55by5GbHl3ZWlnaHRSZXBlYXRlciIsCgkJCS4uLgoJCQljb21wb25lbnRzOiBbCgkJCQl7a2luZDogIlNlbGVjdGlvbiIsIG9uU2VsZWN0OiAic2VsZWN0RGVzZWxlY3QiLCBvbkRlc2VsZWN0OiAic2VsZWN0RGVzZWxlY3QifSwKCQkJCS4uLgoJCQldLAoJCQl0YXA6IGZ1bmN0aW9uKGluU2VuZGVyLCBpbkV2ZW50KSB7CgkJCQkuLi4KCQkJCS8vIG1hcmsgdGhlIHRhcHBlZCByb3cgYXMgc2VsZWN0ZWQKCQkJCXRoaXMuJC5zZWxlY3Rpb24uc2VsZWN0KGluRXZlbnQuaW5kZXgpOwoJCQkJLi4uCgkJCX0sCgkJCXNlbGVjdERlc2VsZWN0OiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCQkJLy8gdGhpcyBpcyB3aGVyZSBhIHJvdyBzZWxlY3Rpb24gaGlnaGxpZ2h0IG1pZ2h0IGJlIGFwcGxpZWQKCQkJCXRoaXMucmVuZGVyUm93KGluRXZlbnQua2V5KTsKCQkJfQoJCQkuLi4KCQl9KQoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uU2VsZWN0aW9uIiwKCWtpbmQ6ICJlbnlvLkNvbXBvbmVudCIsCglwdWJsaXNoZWQ6IHsKCQkvLyogSWYgdHJ1ZSwgbXVsdGlwbGUgc2VsZWN0aW9ucyBhcmUgYWxsb3dlZAoJCW11bHRpOiBmYWxzZQoJfSwKCWV2ZW50czogewoJCS8qKgoJCQlGaXJlcyB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQuCgoJCQkJe2tpbmQ6ICJTZWxlY3Rpb24iLCBvblNlbGVjdDogInNlbGVjdFJvdyIuLi4KCQkJCS4uLgoJCQkJc2VsZWN0Um93OiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkgewoJCQkJCS4uLgoKCQkJX2luRXZlbnQua2V5XyBpcyB3aGF0ZXZlciBrZXkgd2FzIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIHNlbGVjdGlvbgoJCQkodXN1YWxseSBhIHJvdyBpbmRleCkuCgoJCQlfaW5FdmVudC5kYXRhXyByZWZlcmVuY2VzIGRhdGEgcmVnaXN0ZXJlZCB3aXRoIHRoaXMga2V5IGJ5IHRoZSBjb2RlCgkJCXRoYXQgbWFkZSB0aGUgb3JpZ2luYWwgc2VsZWN0aW9uLgoJCSovCgkJb25TZWxlY3Q6ICIiLAoJCS8qKgoJCQlGaXJlcyB3aGVuIGFuIGl0ZW0gaXMgZGVzZWxlY3RlZC4KCgkJCQl7a2luZDogIlNlbGVjdGlvbiIsIG9uU2VsZWN0OiAiZGVzZWxlY3RSb3ciLi4uCgkJCQkuLi4KCQkJCWRlc2VsZWN0Um93OiBmdW5jdGlvbihpblNlbmRlciwgaW5FdmVudCkKCQkJCQkuLi4KCgkJCV9pbkV2ZW50LmtleV8gaXMgd2hhdGV2ZXIga2V5IHdhcyB1c2VkIHRvIHJlcXVlc3QgdGhlIGRlc2VsZWN0aW9uCgkJCSh1c3VhbGx5IGEgcm93IGluZGV4KS4KCgkJCV9pbkV2ZW50LmRhdGFfIHJlZmVyZW5jZXMgZGF0YSByZWdpc3RlcmVkIHdpdGggdGhpcyBrZXkgYnkgdGhlIGNvZGUKCQkJdGhhdCBtYWRlIHRoZSBzZWxlY3Rpb24uCgkJKi8KCQlvbkRlc2VsZWN0OiAiIiwKCQkvLyogRmlyZXMgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcyAoYnV0IG5vdCB3aGVuIHNlbGVjdGlvbiBpcyBjbGVhcmVkKS4KCQlvbkNoYW5nZTogIiIKCX0sCgkvLyogQHByb3RlY3RlZAoJY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmNsZWFyKCk7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0sCgltdWx0aUNoYW5nZWQ6IGZ1bmN0aW9uKCkgewoJCWlmICghdGhpcy5tdWx0aSkgewoJCQl0aGlzLmNsZWFyKCk7CgkJfQoJCXRoaXMuZG9DaGFuZ2UoKTsKCX0sCgloaWdobGFuZGVyOiBmdW5jdGlvbihpbktleSkgewoJCWlmICghdGhpcy5tdWx0aSkgewoJCQl0aGlzLmRlc2VsZWN0KHRoaXMubGFzdFNlbGVjdGVkKTsKCQl9Cgl9LAoJLy8qIEBwdWJsaWMKCS8vKiBSZW1vdmVzIGFsbCBzZWxlY3Rpb25zLgoJY2xlYXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2VsZWN0ZWQgPSB7fTsKCX0sCgkvLyogUmV0dXJucyB0cnVlIGlmIHRoZSBfaW5LZXlfIHJvdyBpcyBzZWxlY3RlZC4KCWlzU2VsZWN0ZWQ6IGZ1bmN0aW9uKGluS2V5KSB7CgkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRbaW5LZXldOwoJfSwKCS8qKgoJCU1hbnVhbGx5IHNldHMgYSByb3cncyBzdGF0ZSB0byBzZWxlY3RlZCBvciB1bnNlbGVjdGVkLgoKCQlfaW5EYXRhXyBpcyBhbiBvcHRpb25hbCBkYXRhIG9iamVjdAl0byBzdG9yZSBpbiB0aGUgc2VsZWN0aW9uIGZvcgoJCXRoYXQga2V5IHRoYXQgd2lsbCBiZSBzZW50IHdpdGggdGhlCV9vblNlbGVjdF8gb3IgX29uRGVzZWxlY3RfIGV2ZW50cy4KCQlJZiBub3QgdXNlZCwgdGhlIGRhdGEgd2lsbCBiZSBzZXQgdG8gJ3RydWUnLgoJKi8KCXNldEJ5S2V5OiBmdW5jdGlvbihpbktleSwgaW5TZWxlY3RlZCwgaW5EYXRhKSB7CgkJaWYgKGluU2VsZWN0ZWQpIHsKCQkJdGhpcy5zZWxlY3RlZFtpbktleV0gPSAoaW5EYXRhIHx8IHRydWUpOwoJCQl0aGlzLmxhc3RTZWxlY3RlZCA9IGluS2V5OwoJCQl0aGlzLmRvU2VsZWN0KHtrZXk6IGluS2V5LCBkYXRhOiB0aGlzLnNlbGVjdGVkW2luS2V5XX0pOwoJCX0gZWxzZSB7CgkJCXZhciB3YXMgPSB0aGlzLmlzU2VsZWN0ZWQoaW5LZXkpOwoJCQlkZWxldGUgdGhpcy5zZWxlY3RlZFtpbktleV07CgkJCXRoaXMuZG9EZXNlbGVjdCh7a2V5OiBpbktleSwgZGF0YTogd2FzfSk7CgkJfQoJCXRoaXMuZG9DaGFuZ2UoKTsKCX0sCgkvLyogRGVzZWxlY3RzIGEgcm93LgoJZGVzZWxlY3Q6IGZ1bmN0aW9uKGluS2V5KSB7CgkJaWYgKHRoaXMuaXNTZWxlY3RlZChpbktleSkpIHsKCQkJdGhpcy5zZXRCeUtleShpbktleSwgZmFsc2UpOwoJCX0KCX0sCgkvKioKCQlTZWxlY3RzIGEgcm93LiBJZiB0aGUgX211bHRpXyBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UsIF9zZWxlY3RfIHdpbGwKCQlhbHNvIGRlc2VsZWN0IHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uCgoJCV9pbkRhdGFfIGlzIGFuIG9wdGlvbmFsIGRhdGEgb2JqZWN0CXRvIHN0b3JlIGluIHRoZSBzZWxlY3Rpb24gZm9yCgkJdGhhdCBrZXkgdGhhdCB3aWxsIGJlIHNlbnQgd2l0aCB0aGUJX29uU2VsZWN0XyBvciBfb25EZXNlbGVjdF8gZXZlbnRzLgoJCUlmIG5vdCB1c2VkLCB0aGUgZGF0YSB3aWxsIGJlIHNldCB0byAndHJ1ZScuCgkqLwoJc2VsZWN0OiBmdW5jdGlvbihpbktleSwgaW5EYXRhKSB7CgkJaWYgKHRoaXMubXVsdGkpIHsKCQkJdGhpcy5zZXRCeUtleShpbktleSwgIXRoaXMuaXNTZWxlY3RlZChpbktleSksIGluRGF0YSk7CgkJfSBlbHNlIGlmICghdGhpcy5pc1NlbGVjdGVkKGluS2V5KSkgewoJCQl0aGlzLmhpZ2hsYW5kZXIoKTsKCQkJdGhpcy5zZXRCeUtleShpbktleSwgdHJ1ZSwgaW5EYXRhKTsKCQl9Cgl9LAoJLyoqCgkJVG9nZ2xlcyBzZWxlY3Rpb24gc3RhdGUgZm9yIGEgcm93LiBJZiB0aGUgX211bHRpXyBwcm9wZXJ0eSBpcyBzZXQgdG8KCQlmYWxzZSwgdG9nZ2xpbmcgYSBzZWxlY3Rpb24gb24gd2lsbCBkZXNlbGVjdCB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLgoKCQlfaW5EYXRhXyBpcyBhbiBvcHRpb25hbCBkYXRhIG9iamVjdAl0byBzdG9yZSBpbiB0aGUgc2VsZWN0aW9uIGZvcgoJCXRoYXQga2V5IHRoYXQgd2lsbCBiZSBzZW50IHdpdGggdGhlCV9vblNlbGVjdF8gb3IgX29uRGVzZWxlY3RfIGV2ZW50cy4KCQlJZiBub3QgdXNlZCwgdGhlIGRhdGEgd2lsbCBiZSBzZXQgdG8gJ3RydWUnLgoJKi8KCXRvZ2dsZTogZnVuY3Rpb24oaW5LZXksIGluRGF0YSkgewoJCWlmICghdGhpcy5tdWx0aSAmJiB0aGlzLmxhc3RTZWxlY3RlZCAhPSBpbktleSkgewoJCQl0aGlzLmRlc2VsZWN0KHRoaXMubGFzdFNlbGVjdGVkKTsKCQl9CgkJdGhpcy5zZXRCeUtleShpbktleSwgIXRoaXMuaXNTZWxlY3RlZChpbktleSksIGluRGF0YSk7Cgl9LAoJLyoqCgkJUmV0dXJucyB0aGUgc2VsZWN0aW9uIGFzIGEgaGFzaCBpbiB3aGljaCBlYWNoIHNlbGVjdGVkIGl0ZW0gaGFzIGEgdmFsdWU7CgkJdW5zZWxlY3RlZCBpdGVtcyBhcmUgdW5kZWZpbmVkLgoJKi8KCWdldFNlbGVjdGVkOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5zZWxlY3RlZDsKCX0sCgkvKioKCQlSZW1vdmUgYSByb3cgdGhhdCdzIGluY2x1ZGVkIGluIHRoZSBzZWxlY3Rpb24gc2V0LiBJZiB0aGlzIHJvdyBpcwoJCXNlbGVjdGVkLCBpdCB3aWxsIGJlIHVuc2VsZWN0ZWQuICBBbnkgcm93cyBhYm92ZSB0aGlzIHJvdyB3aWxsCgkJaGF2ZSB0aGVpciBrZXlzIHZhbHVlIHJlZHVjZWQgYnkgb25lLgoJKi8KCXJlbW92ZTogZnVuY3Rpb24oaW5LZXkpIHsKCQl2YXIgbmV3U2VsZWN0ZWQgPSB7fTsKCQlmb3IgKHZhciByb3cgaW4gdGhpcy5zZWxlY3RlZCkgewoJCQlpZiAocm93IDwgaW5LZXkpIHsKCQkJCW5ld1NlbGVjdGVkW3Jvd10gPSB0aGlzLnNlbGVjdGVkW3Jvd107CgkJCX0gZWxzZSBpZiAocm93ID4gaW5LZXkpIHsKCQkJCW5ld1NlbGVjdGVkW3JvdyAtIDFdID0gdGhpcy5zZWxlY3RlZFtyb3ddOwoJCQl9CgkJfQoJCXRoaXMuc2VsZWN0ZWQgPSBuZXdTZWxlY3RlZDsKCX0KfSk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/Table.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoKCVRPRE86IFdvbid0IHdvcmsgaW4gSUU4IGJlY2F1c2UJd2UgY2FuJ3Qgc2V0IGlubmVySFRNTAoJb24gdGFibGUgZWxlbWVudHMuIFdlJ2xsIG5lZWQgdG8gZmFsbCBiYWNrIHRvIGRpdnMgd2l0aAoJdGFibGUgZGlzcGxheSBzdHlsZXMgYXBwbGllZC4KCglTaG91bGQgYWxzbyBmYWNhZGUgY2VydGFpbiB1c2VmdWwgdGFibGUgZnVuY3Rpb25hbGl0eQoJKHNwZWNpZmljIHNldCBUQkQpLgoqLwoKLyoqCglfZW55by5UYWJsZV8gaW1wbGVtZW50cyBhbiBIVE1MICZsdDt0YWJsZSZndDsgZWxlbWVudC4KCVRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzLiAKKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLlRhYmxlIiwKCXRhZzogInRhYmxlIiwKCWF0dHJpYnV0ZXM6IHtjZWxscGFkZGluZzogIjAiLCBjZWxsc3BhY2luZzogIjAifSwKCWRlZmF1bHRLaW5kOiAiZW55by5UYWJsZVJvdyIKfSk7CgovKioKCV9lbnlvLlRhYmxlUm93XyBpbXBsZW1lbnRzIGFuIEhUTUwgJmx0O3RyJmd0OyBlbGVtZW50LgoqLwplbnlvLmtpbmQoewogICAgbmFtZTogImVueW8uVGFibGVSb3ciLAogICAgdGFnOiAidHIiLAogICAgZGVmYXVsdEtpbmQ6ICJlbnlvLlRhYmxlQ2VsbCIKfSk7CgovKioKCV9lbnlvLlRhYmxlQ2VsbF8gaW1wbGVtZW50cyBhbiBIVE1MICZsdDt0ZCZndDsgZWxlbWVudC4KKi8KZW55by5raW5kKHsKICAgIG5hbWU6ICJlbnlvLlRhYmxlQ2VsbCIsCiAgICB0YWc6ICJ0ZCIKfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/TextArea.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5UZXh0QXJlYV8gaW1wbGVtZW50cyBhbiBIVE1MICZsdDt0ZXh0YXJlYSZndDsgZWxlbWVudCB3aXRoCgljcm9zcy1wbGF0Zm9ybSBzdXBwb3J0IGZvciBjaGFuZ2UgZXZlbnRzLgoKCUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb24KCVtUZXh0IEZpZWxkc10oaHR0cHM6Ly9naXRodWIuY29tL2VueW9qcy9lbnlvL3dpa2kvVGV4dC1GaWVsZHMpIGluIHRoZSBFbnlvCglEZXZlbG9wZXIgR3VpZGUuCiovCmVueW8ua2luZCh7CgluYW1lOiAiZW55by5UZXh0QXJlYSIsCglraW5kOiAiZW55by5JbnB1dCIsCgkvLyogQHByb3RlY3RlZAoJdGFnOiAidGV4dGFyZWEiLAoJY2xhc3NlczogImVueW8tdGV4dGFyZWEiLAoJLy8gdGV4dGFyZWEgZG9lcyB1c2UgdmFsdWUgYXR0cmlidXRlOyBuZWVkcyB0byBiZSBraWNrZWQgd2hlbiByZW5kZXJlZC4KCXJlbmRlcmVkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCXRoaXMudmFsdWVDaGFuZ2VkKCk7Cgl9Cn0pOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/ToolDecorator.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5Ub29sRGVjb3JhdG9yXyBsaW5lcyB1cCBjb21wb25lbnRzIGluIGEgcm93LCBjZW50ZXJlZCB2ZXJ0aWNhbGx5LgoqLwplbnlvLmtpbmQoewoJbmFtZTogImVueW8uVG9vbERlY29yYXRvciIsCgkvLyogQHByb3RlY3RlZAoJa2luZDogImVueW8uR3JvdXBJdGVtIiwKCWNsYXNzZXM6ICJlbnlvLXRvb2wtZGVjb3JhdG9yIgp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/data/DataGridList.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoKCS8vKkBwdWJsaWMKCS8qKgoJKi8KCWVueW8ua2luZCh7CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQluYW1lOiAiZW55by5EYXRhR3JpZExpc3QiLAoKCQkvLypAcHVibGljCgkJa2luZDogImVueW8uRGF0YUxpc3QiLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgUFJPUEVSVElFUwoKCQkvLypAcHJvdGVjdGVkCgkJY2xhc3NlczogImVueW8tZGF0YS1ncmlkLWxpc3QiLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBDT01QVVRFRCBQUk9QRVJUSUVTCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBNRVRIT0RTCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBST1RFQ1RFRCBNRVRIT0RTCgoJCS8vKkBwcm90ZWN0ZWQKCQlpbml0Q29tcG9uZW50czogZnVuY3Rpb24gKCkgewoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCQl2YXIgJGtpbmQgPSB0aGlzLl9jaGlsZEtpbmQ7CgkJCSRraW5kLmV4dGVuZCh7CgkJCQljbGFzc2VzOiAiZW55by1kYXRhLWdyaWQtbGlzdC1pdGVtIgoJCQl9KTsKCQl9CgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIE9CU0VSVkVSUwoKCX0pOwoKfSkoZW55byk7
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/data/DataList.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkqLwoJZW55by5raW5kKHsKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFVCTElDIFBST1BFUlRJRVMKCgkJLy8qQHB1YmxpYwoJCW5hbWU6ICJlbnlvLkRhdGFMaXN0IiwKCgkJLy8qQHB1YmxpYwoJCWtpbmQ6ICJlbnlvLkRhdGFSZXBlYXRlciIsCgoJCS8vKkBwdWJsaWMKCQkvKioKCQkJVGhlIF9lbnlvLkRhdGFMaXN0XyBraW5kIHBsYWNlcyBpdHMgcm93cyBpbnNpZGUgb2YgYSBzY3JvbGxlci4gQW55CgkJCWNvbmZpZ3VyYWJsZSBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBfZW55by5TY3JvbGxlcl8gY2FuIGJlCgkJCXBsYWNlZCBpbiB0aGlzIGhhc2ggYW5kIHdpbGwgYmUgc2V0IGFjY29yZGluZ2x5IG9uIHRoZSBzY3JvbGxlcgoJCQlmb3IgdGhpcyBsaXN0LiBJZiBub25lIGFyZSBzcGVjaWZpZWQgZGVmYXVsdCBfZW55by5TY3JvbGxlcl8KCQkJc2V0dGluZ3MgYXJlIHVzZWQuCgkJKi8KCQlzY3JvbGxlck9wdGlvbnM6IG51bGwsCgoJCS8vKkBwdWJsaWMKCQlwcm90ZWN0ZWRTdGF0aWNzOiB7CgkJCWRlZmF1bHRTY3JvbGxlck9wdGlvbnM6IHsKCQkJCXByZXZlbnRTY3JvbGxQcm9wYWdhdGlvbjogZmFsc2UKCQkJfQoJCX0sCgoJCS8vKkBwdWJsaWMKCQloYW5kbGVyczogewoJCQlvblNjcm9sbDogIl9kaWRTY3JvbGwiLAoJCQlvbnBvc3RyZXNpemU6ICJfZGlkUmVzaXplIgoJCX0sCgoJCS8vKkBwdWJsaWMKCQljb250cm9sUGFyZW50TmFtZTogInBhZ2UxIiwKCgkJLy8qQHB1YmxpYwoJCWNsYXNzZXM6ICJlbnlvLWRhdGEtbGlzdCIsCgoJCS8vKkBwdWJsaWMKCQljb250YWluZXJPcHRpb25zOiB7CgkJCW5hbWU6ICJzY3JvbGxlciIsCgkJCWtpbmQ6ICJlbnlvLlNjcm9sbGVyIiwKCQkJY2xhc3NlczogImVueW8tZmlsbCBlbnlvLWRhdGEtbGlzdC1zY3JvbGxlciIsCgkJCWNvbXBvbmVudHM6IFsKCQkJCXtuYW1lOiAiYWN0aXZlIiwgY2xhc3NlczogImVueW8tZGF0YS1saXN0LWFjdGl2ZSIsIGNvbXBvbmVudHM6IFsKCQkJCQl7bmFtZTogInBhZ2UxIiwga2luZDogImVueW8uVmlldyIsIGNsYXNzZXM6ICJlbnlvLWRhdGEtbGlzdC1wYWdlIn0sCgkJCQkJe25hbWU6ICJwYWdlMiIsIGtpbmQ6ICJlbnlvLlZpZXciLCBjbGFzc2VzOiAiZW55by1kYXRhLWxpc3QtcGFnZSJ9CgkJCQldfSwKCQkJCXtuYW1lOiAiYnVmZmVyIiwgc3R5bGU6ICJwb3NpdGlvbjogcmVsYXRpdmU7In0KCQkJXQoJCX0sCgoJCW92ZXJmbG93OiBudWxsLAoJCXVuZGVyZmxvdzogbnVsbCwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIFBST1BFUlRJRVMKCgkJX3Jlc2l6ZWQ6IGZhbHNlLAoJCV9pbml0aWFsUG9zaXRpb246IHRydWUsCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIENPTVBVVEVEIFBST1BFUlRJRVMKCgkJYXZlcmFnZUJvdW5kczogZW55by5jb21wdXRlZChmdW5jdGlvbiAoKSB7CgkJCS8vIHJlc2V0IG91ciBmbGFnCgkJCXRoaXMuX3Jlc2l6ZWQgPSBmYWxzZTsKCQkJdGhpcy5fcmVzZXQgPSBmYWxzZTsKCQkJdGhpcy5fcmVuZGVyZWQgPSBmYWxzZTsKCQkJdmFyICRjaCA9IHRoaXMuZ2V0Q2xpZW50Q29udHJvbHMoKSwgJGM7CgkJCXZhciAkaSwgJGwsICR0ID0ge307CgkJCSR0LmhlaWdodCA9IDA7CgkJCSR0LndpZHRoID0gMDsKCQkJZm9yICgkaSA9IDEsICRsID0gJGNoLmxlbmd0aDsgJGkgPCAkbCAmJiAkaSA8IDEwOyArKyRpKSB7CgkJCQkkYyA9ICRjaFskaV0uZ2V0Qm91bmRzKCk7CgkJCQkkdC5oZWlnaHQgKz0gIWlzTmFOKCRjLmhlaWdodCk/ICRjLmhlaWdodDogMDsKCQkJCSR0LndpZHRoICs9ICFpc05hTigkYy53aWR0aCk/ICRjLndpZHRoOiAwOwoJCQl9CgkJCWlmICgkaSA+IDEpIHsKCQkJCSR0LmhlaWdodCA9IH5+KCR0LmhlaWdodCAvICgkaS0xKSk7CgkJCQkkdC53aWR0aCA9IH5+KCR0LndpZHRoIC8gKCRpLTEpKTsKCQkJfQoJCQlyZXR1cm4gJHQ7CgkJfSwgIl9yZXNpemVkIiwgIl9yZXNldCIsICJfcmVuZGVyZWQiLCB7Y2FjaGVkOiB0cnVlLCBkZWZlcjogdHJ1ZX0pLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQVUJMSUMgTUVUSE9EUwoKCQkvLypAcHVibGljCgkJcmVzZXQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyICRkID0gdGhpcy5nZXQoImRhdGEiKTsKCQkJdGhpcy5yZXNldHRpbmcgPSB0cnVlOwoJCQl0aGlzLmRlc3Ryb3lDbGllbnRDb250cm9scygpOwoJCQl0aGlzLnJlc2V0QnVmZmVyKCk7CgkJCXRoaXMudW5kZXJmbG93ID0ge307CgkJCXRoaXMub3ZlcmZsb3cgPSB7fTsKCQkJaWYgKCRkKSB7CgkJCQl2YXIgJGkgPSAwOwoJCQkJZm9yICh2YXIgJGsgaW4ge3BhZ2UxOiIiLCBwYWdlMjoiIn0pIHsKCQkJCQl0aGlzLmNvbnRyb2xQYXJlbnROYW1lID0gJGs7CgkJCQkJdGhpcy5kaXNjb3ZlckNvbnRyb2xQYXJlbnQoKTsKCQkJCQlmb3IgKDsgJGkgPCAkZC5sZW5ndGggJiYgdGhpcy50aHJlc2hvbGQoKTsgKyskaSkgewoJCQkJCQl0aGlzLmFkZCgkZFskaV0sICRpKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJdGhpcy5zZXQoIl9yZXNldCIsIHRydWUpOwoJCQl0aGlzLnJlbmRlcmVkKCk7CgkJCXRoaXMuY29udHJvbFBhcmVudE5hbWUgPSAicGFnZTEiOwoJCQl0aGlzLmRpc2NvdmVyQ29udHJvbFBhcmVudCgpOwoJCQl0aGlzLnJlc2V0dGluZyA9IGZhbHNlOwoJCX0sCgoJCXJlc2V0QnVmZmVyOiBmdW5jdGlvbiAoKSB7CgkJCXRoaXMuJC5idWZmZXIuYXBwbHlTdHlsZSgiaGVpZ2h0IiwgIjAiKTsKCQl9LAoKCQl0aHJlc2hvbGQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyICRvID0gdGhpcy5nZXRCb3VuZHMoKS5oZWlnaHQ7CgkJCXZhciAkaCA9IHRoaXMuY29udHJvbFBhcmVudC5nZXRCb3VuZHMoKS5oZWlnaHQ7CgkJCXJldHVybiAkaCA8PSAoMi41ICogJG8pOwoJCX0sCgoJCXVwZGF0ZUJ1ZmZlcjogZnVuY3Rpb24gKCkgewoJCQl2YXIgJGQgPSB0aGlzLmdldCgiZGF0YSIpLCAkdCA9IHRoaXMuZ2V0KCJhdmVyYWdlQm91bmRzIik7CgkJCWlmICgkZCkgewoJCQkJdGhpcy4kLmJ1ZmZlci5zZXRCb3VuZHMoe2hlaWdodDogKCR0LmhlaWdodCAqICRkLmxlbmd0aCl9LCAicHgiKTsKCQkJCXRoaXMuJC5zY3JvbGxlci5yZXNpemVkKCk7CgkJCX0KCQl9LAoKCQlkZXN0cm95Q2xpZW50Q29udHJvbHM6IGZ1bmN0aW9uICgpIHsKCQkJZm9yICh2YXIgJGkgaW4ge3BhZ2UxOiIiLHBhZ2UyOiIifSkgewoJCQkJdGhpcy5jb250cm9sUGFyZW50ID0gdGhpcy4kWyRpXTsKCQkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCX0KCQl9LAoKCQlyZW5kZXJlZDogZnVuY3Rpb24gKCkgewoJCQl0aGlzLnNldCgiX3JlbmRlcmVkIiwgdHJ1ZSk7CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCWlmICh0aGlzLl9pbml0aWFsUG9zaXRpb24gJiYgdGhpcy4kLnBhZ2UxLmhhc05vZGUoKSAmJiB0aGlzLiQucGFnZTEuZ2V0Qm91bmRzKCkuaGVpZ2h0KSB7CgkJCQl0aGlzLl9pbml0aWFsUG9zaXRpb24gPSBmYWxzZTsKCQkJCXRoaXMubW92ZVBhZ2VBZnRlcih0aGlzLiQucGFnZTIsIHRoaXMuJC5wYWdlMSk7CgkJCX0KCQl9LAoKCQlyZWZsb3c6IGZ1bmN0aW9uICgpIHsKCQkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQkJdGhpcy51cGRhdGVCdWZmZXIoKTsKCQl9LAoKCQkvLypAcHVibGljCgkJYWRkOiBmdW5jdGlvbiAocmVjLCBpZHgpIHsKCQkJLy8gVE9ETzogbmVlZCB0byBpbnRlbGxpZ2VudGx5IGFkZCBpbmRpY2VzIHRvIHRoZSBhcHByb3ByaWF0ZQoJCQkvLyBwYWdlIHdoZW4gcG9zc2libGUgYW5kIG1haW50YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBvdmVyZmxvdwoJCQkvLyBpbmRpY2VzIHNvIHdoZW4gYSBwYWdlIGlzIHB1c2hlZCBkb3duIGl0IGNhbiBrbm93IHdoaWNoIG1vZGVscwoJCQkvLyB0byB1c2UgYW5kIHdoZW4gYSBwYWdlIGlzIHB1c2hlZCB1cCBpdCBjYW4ga25vdyB0aGUgc2FtZQoKCgoJCQlpZiAoIXRoaXMudGhyZXNob2xkKCkpIHsKCQkJCWlmICh0aGlzLmNvbnRyb2xQYXJlbnROYW1lID09ICJwYWdlMSIpIHsKCQkJCQl0aGlzLmNvbnRyb2xQYXJlbnROYW1lID0gInBhZ2UyIjsKCQkJCQl0aGlzLmRpc2NvdmVyQ29udHJvbFBhcmVudCgpOwoJCQkJCXRoaXMuYWRkKHJlYywgaWR4KTsKCQkJCQl0aGlzLmNvbnRyb2xQYXJlbnROYW1lID0gInBhZ2UxIjsKCQkJCQl0aGlzLmRpc2NvdmVyQ29udHJvbFBhcmVudCgpOwoJCQkJfSBlbHNlIHsKCQkJCQl2YXIgJG8gPSB0aGlzLm92ZXJmbG93OwoJCQkJCWlmICghJG8uc3RhcnQpIHsKCQkJCQkJJG8uc3RhcnQgPSBpZHg7CgkJCQkJfQoJCQkJCSRvLmVuZCA9IGlkeDsKCQkJCQlyZXR1cm4gaWR4OwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJdmFyICRjID0gdGhpcy5jcmVhdGVDb21wb25lbnQoe2tpbmQ6IHRoaXMuX2NoaWxkS2luZCwgbW9kZWw6IHJlYywgaW5kZXg6IGlkeH0pOwoJCQkJJGMucmVuZGVyKCk7CgkJCQlpZiAoIXRoaXMuYmF0Y2hpbmcpIHsKCQkJCQl0aGlzLnJlZmxvdygpOwoJCQkJfQoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCXJlbW92ZTogZnVuY3Rpb24gKGlkeCkgewoJCQl2YXIgJGNoID0gdGhpcy5nZXQoImFjdGl2ZSIpOwoJCQl2YXIgJGMgPSAkY2hbaWR4IHx8IChNYXRoLmFicygkY2gubGVuZ3RoLTEpKV07CgkJCWlmICgkYykgewoJCQkJJGMuZGVzdHJveSgpOwoJCQl9CgkJfSwKCgkJLy8qQHB1YmxpYwoJCXVwZGF0ZTogZnVuY3Rpb24gKGlkeCkgewoJCQl2YXIgJGQgPSB0aGlzLmdldCgiZGF0YSIpOwoJCQl2YXIgJGNoID0gdGhpcy5nZXQoImFjdGl2ZSIpOwoJCQl2YXIgJGMgPSAkY2hbaWR4XTsKCQkJaWYgKCRkICYmICRjKSB7CgkJCQkkYy5zZXQoIm1vZGVsIiwgJGRbaWR4XSk7CgkJCX0KCQl9LAoKCQkvLypAcHVibGljCgkJcHJ1bmU6IGZ1bmN0aW9uICgpIHsKCQkJdmFyICRjaCA9IHRoaXMuZ2V0KCJhY3RpdmUiKTsKCQkJdmFyIGwgPSB0aGlzLmxlbmd0aDsKCQkJdmFyICR4ID0gJGNoLnNsaWNlKGwpOwoJCQllbnlvLmZvckVhY2goJHgsIGZ1bmN0aW9uIChjKSB7CgkJCQljLmRlc3Ryb3koKTsKCQkJfSk7CgkJfSwKCgkJLy8qQHB1YmxpYwoJCXVwOiBmdW5jdGlvbiAoKSB7CgkJCXZhciAkYyA9IHRoaXMuY29udHJvbFBhcmVudDsKCQkJdmFyICRiID0gJGMuZ2V0Qm91bmRzKCk7CgkJCXZhciAkcCA9IHRoaXMuJC5zY3JvbGxlci5nZXRTY3JvbGxUb3AoKTsKCQkJdmFyICRuID0gdGhpcy4kLnBhZ2UxID09ICRjPyB0aGlzLiQucGFnZTI6IHRoaXMuJC5wYWdlMTsKCQkJdmFyICRrID0gJG4uZ2V0Qm91bmRzKCk7CgkJCXZhciAkbyA9IHRoaXMuZ2V0Qm91bmRzKCk7CgkJCWlmICgkYi50b3AgPCAkay50b3AgJiYgJGIudG9wICE9PSAwKSB7CgkJCQlpZiAoJGsudG9wID4gKCRvLmhlaWdodCArICRwKSAmJiAoJGsuaGVpZ2h0IDw9ICRwKSkgewoJCQkJCXRoaXMuY29udHJvbFBhcmVudE5hbWUgPSAkbi5uYW1lOwoJCQkJCXRoaXMuY29udHJvbFBhcmVudCA9ICRuOwoJCQkJCXRoaXMucGFnZVVwKCk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlpZiAoJGIudG9wID4gJG8uaGVpZ2h0ICYmICRiLmhlaWdodCA8PSAkcCkgewoJCQkJCS8qIEZJWE1FICovCgkJCQkJdGhpcy5wYWdlVXAoKTsKCQkJCQl0aGlzLmNvbnRyb2xQYXJlbnROYW1lID0gJG4ubmFtZTsKCQkJCQl0aGlzLmNvbnRyb2xQYXJlbnQgPSAkbjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vKkBwdWJsaWMKCQlkb3duOiBmdW5jdGlvbiAoKSB7CgkJCXZhciAkcCA9IHRoaXMuJC5zY3JvbGxlci5nZXRTY3JvbGxUb3AoKTsKCQkJdmFyICRjID0gdGhpcy5jb250cm9sUGFyZW50OwoJCQl2YXIgJGIgPSAkYy5nZXRCb3VuZHMoKTsKCQkJdmFyICRuID0gdGhpcy4kLnBhZ2UxID09ICRjPyB0aGlzLiQucGFnZTI6IHRoaXMuJC5wYWdlMTsKCQkJdmFyICRrID0gJG4uZ2V0Qm91bmRzKCk7CgkJCXZhciAkbyA9IHRoaXMuJC5idWZmZXIuZ2V0Qm91bmRzKCk7CgkJCXZhciAkZiA9ICRiLnRvcCArICRiLmhlaWdodDsKCQkJaWYgKCRmIDwgJHAgJiYgKCRvLmhlaWdodCAtICRmKSA+PSAkay5oZWlnaHQpIHsKCQkJCXRoaXMucGFnZURvd24oKTsKCQkJfQoJCX0sCgoJCW1vdmVQYWdlQWZ0ZXI6IGZ1bmN0aW9uIChwMSwgcDIpIHsKCQkJdmFyICRwID0gcDIuZ2V0Qm91bmRzKCk7CgkJCXAxLnNldEJvdW5kcyh7dG9wOiAkcC50b3AgKyAkcC5oZWlnaHR9LCAicHgiKTsKCQl9LAoKCQltb3ZlUGFnZUJlZm9yZTogZnVuY3Rpb24gKHAxLCBwMikgewoJCQl2YXIgJHAgPSBwMi5nZXRCb3VuZHMoKTsKCQkJdmFyICRrID0gcDEuZ2V0Qm91bmRzKCk7CgkJCXAxLnNldEJvdW5kcyh7dG9wOiAkcC50b3AgLSAkay5oZWlnaHR9LCAicHgiKTsKCQl9LAoKCQlwYWdlRG93bjogZnVuY3Rpb24gKCkgewoJCQl2YXIgJHAxID0gdGhpcy5jb250cm9sUGFyZW50OwoJCQl2YXIgJG4gPSAkcDEubmFtZSA9PSAicGFnZTEiPyAicGFnZTIiOiAicGFnZTEiOwoJCQl2YXIgJHAyID0gdGhpcy4kWyRuXTsKCQkJdGhpcy5tb3ZlUGFnZUFmdGVyKCRwMSwgJHAyKTsKCQkJdGhpcy5jb250cm9sUGFyZW50TmFtZSA9ICRuOwoJCQl0aGlzLmNvbnRyb2xQYXJlbnQgPSAkcDI7CgkJCS8vIGVueW8uYXN5bmNNZXRob2QodGhpcywgInVwZGF0ZVBhZ2UiLCAkcDEsICJkb3duIik7CgkJCXRoaXMudXBkYXRlUGFnZSgkcDEsICJkb3duIik7CgkJfSwKCgkJdXBkYXRlUGFnZTogZnVuY3Rpb24gKHAsIGRpcmVjdGlvbikgewoJCQl2YXIgJG8gPSB0aGlzLm92ZXJmbG93OwoJCQl2YXIgJHUgPSB0aGlzLnVuZGVyZmxvdzsKCQkJdmFyICRjaCA9IHAuY2hpbGRyZW47CgkJCXZhciAkZCwgJGlkeCwgJGMsICRtOwoJCQlpZiAoZGlyZWN0aW9uID09ICJkb3duIikgewoJCQkJaWYgKCFpc05hTigkby5zdGFydCkpIHsKCQkJCQkvLyBwLnRlYXJkb3duQ2hpbGRyZW4oKTsKCQkJCQlwLmRpc2Nvbm5lY3REb20oKTsKCQkJCQkkZCA9IHRoaXMuZ2V0KCJkYXRhIik7CgkJCQkJZm9yICgkaWR4ID0gJG8uc3RhcnQ7ICRpZHggPCAkby5lbmQgJiYgKCRtID0gJGRbJGlkeF0pICYmICgkYyA9ICRjaFskaWR4IC0gJG8uc3RhcnRdKTsgKyskaWR4KSB7CgkJCQkJCWlmICgkYy5pbmRleCA8ICR1LnN0YXJ0IHx8IGlzTmFOKCR1LnN0YXJ0KSkgewoJCQkJCQkJJHUuc3RhcnQgPSAkYy5pbmRleDsKCQkJCQkJfSBlbHNlIGlmICgkYy5pbmRleCA+ICR1LmVuZCB8fCBpc05hTigkdS5lbmQpKSB7CgkJCQkJCQkkdS5lbmQgPSAkYy5pbmRleDsKCQkJCQkJfQoJCQkJCQkkYy5pbmRleCA9ICRpZHg7CgkJCQkJCSRjLnNldCgibW9kZWwiLCAkbSk7CgkJCQkJfQoJCQkJCXAuY29ubmVjdERvbSgpOwoJCQkJCS8vIHAucmVuZGVyKCk7CgkJCQkJcC5yZW5kZXJSZXVzaW5nTm9kZSgpOwoJCQkJfQoJCQkJJG8uc3RhcnQgPSArKyRpZHg7CgkJCX0KCQl9LAoKCQlwYWdlVXA6IGZ1bmN0aW9uICgpIHsKCQkJdmFyICRwMSA9IHRoaXMuY29udHJvbFBhcmVudDsKCQkJdmFyICRuID0gJHAxLm5hbWUgPT0gInBhZ2UxIj8gInBhZ2UyIjogInBhZ2UxIjsKCQkJdmFyICRwMiA9IHRoaXMuJFskbl07CgkJCXRoaXMubW92ZVBhZ2VCZWZvcmUoJHAxLCAkcDIpOwoKCQl9LAoKCQliYXRjaGluZ0NoYW5nZWQ6IGZ1bmN0aW9uIChwcmV2LCB2YWwpIHsKCQkJaWYgKGZhbHNlID09PSB2YWwpIHsKCQkJCXRoaXMucmVuZGVyZWQoKTsKCQkJfQoJCX0sCgoJCWluaXRDb21wb25lbnRzOiBmdW5jdGlvbiAoKSB7CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJCXZhciAkayA9IHRoaXMuX2NoaWxkS2luZDsKCQkJaWYgKCFlbnlvLmhhc01peGluKCRrLCAiZW55by5Sb3dTdXBwb3J0IikpIHsKCQkJCWVueW8uYXBwbHlNaXhpbigiZW55by5Sb3dTdXBwb3J0IiwgJGspOwoJCQl9CgkJfSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIE1FVEhPRFMKCgkJLy8qQHByb3RlY3RlZAoJCV9pbml0Q29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CgkJCXZhciAkYyA9IGVueW8uY2xvbmUodGhpcy5nZXQoImNvbnRhaW5lck9wdGlvbnMiKSk7CgkJCXZhciAkbyA9IGVueW8uY2xvbmUodGhpcy5nZXQoInNjcm9sbGVyT3B0aW9ucyIpIHx8IHt9KTsKCQkJdmFyICRkID0gZW55by5EYXRhTGlzdC5kZWZhdWx0U2Nyb2xsZXJPcHRpb25zOwoJCQkvLyB1bHRpbWF0ZWx5IGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aG91dCBtb2RpZnlpbmcgdGhlIHByb3RvdHlwZSdzCgkJCS8vIG9wdGlvbnMsIGFuZCBvbmx5IHVzZSBkZWZhdWx0IHZhbHVlcyB0aGF0IGRvZXNuJ3Qgb3ZlcnJpZGUgb3RoZXIKCQkJLy8gc2V0IHZhbHVlcwoJCQl0aGlzLmNvbnRhaW5lck9wdGlvbnMgPSBlbnlvLm1peGluKGVueW8ubWl4aW4oWyRjLCAkb10pLCAkZCwgdHJ1ZSk7CgkJCXRoaXMuaW5oZXJpdGVkKGFyZ3VtZW50cyk7CgkJfSwKCgkJX2RpZFNjcm9sbDogZnVuY3Rpb24gKHNlbmRlciwgZXZlbnQpIHsKCQkJdmFyICRsID0gIWlzTmFOKHRoaXMuX2xhc3RQb3MpPyB0aGlzLl9sYXN0UG9zdDogMDsKCQkJdmFyICRwID0gdGhpcy4kLnNjcm9sbGVyLmdldFNjcm9sbFRvcCgpOwoJCQl2YXIgJGQgPSAkcCAtICRsOwoJCQkvLyBpZiAoJGQgJiYgTWF0aC5hYnMoJGQpID4gdGhpcy5nZXQoImF2ZXJhZ2VCb3VuZHMiKS5oZWlnaHQpIHsKCQkJaWYgKCRkKSB7CgkJCQlpZiAoJGwgPiAkcCkgewoJCQkJCXRoaXMudXAoKTsKCQkJCX0gZWxzZSBpZiAoJGwgPCAkcCkgewoJCQkJCXRoaXMuZG93bigpOwoJCQkJfQoJCQl9CgkJCXRoaXMuX2xhc3RQb3N0ID0gJHA7CgkJCXJldHVybiB0cnVlOwoJCX0sCgoJCV9kaWRSZXNpemU6IGZ1bmN0aW9uICgpIHsKCQkJdGhpcy5zZXQoIl9yZXNpemVkIiwgdHJ1ZSk7CgkJfQoKCX0pOwoKfSkoZW55byk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/data/DataRepeater.js"
Content-Type: application/octet-stream; x-encoding=base64
KGZ1bmN0aW9uIChlbnlvKSB7CgoJLy8qQHB1YmxpYwoJLyoqCgkqLwoJZW55by5raW5kKHsKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFVCTElDIFBST1BFUlRJRVMKCgkJLy8qQHB1YmxpYwoJCW5hbWU6ICJlbnlvLkRhdGFSZXBlYXRlciIsCgoJCS8vKkBwdWJsaWMKCQlraW5kOiAiZW55by5WaWV3IiwKCgkJLy8qQHB1YmxpYwoJCWNoaWxkTWl4aW5zOiBbXSwKCQkKCQkvLypAcHVibGljCgkJY29uY2F0OiBbImNoaWxkTWl4aW5zIl0sCgoJCS8vKkBwdWJsaWMKCQljb250cm9sUGFyZW50TmFtZTogImNvbnRhaW5lciIsCgkJCgkJLy8qQHB1YmxpYwoJCWNvbnRhaW5lck9wdGlvbnM6IHsKCQkJbmFtZTogImNvbnRhaW5lciIsCgkJCWtpbmQ6ICJlbnlvLlZpZXciLAoJCQljbGFzc2VzOiAiZW55by1maWxsIGVueW8tZGF0YS1yZXBlYXRlci1jb250YWluZXIiLAoJCX0sCgoJCS8vKkBwdWJsaWMKCQloYW5kbGVyczogewoJCQlvbk1vZGVsQWRkZWQ6ICJfbW9kZWxBZGRlZCIsCgkJCW9uTW9kZWxzQWRkZWQ6ICJfbW9kZWxzQWRkZWQiLAoJCQlvbk1vZGVsUmVtb3ZlZDogIl9tb2RlbFJlbW92ZWQiLAoJCQlvbk1vZGVsc1JlbW92ZWQ6ICJfbW9kZWxzUmVtb3ZlZCIKCQl9LAoKCQkvLypAcHVibGljCgkJYmluZGluZ3M6IFsKCQkJe2Zyb206ICIuY29udHJvbGxlci5sZW5ndGgiLCB0bzogIi5sZW5ndGgifSwKCQkJe2Zyb206ICIuY29udHJvbGxlci5kYXRhIiwgdG86ICIuZGF0YSJ9CgkJXSwKCQkKCgkJLy8qQHB1YmxpYwoJCWJhdGNoaW5nOiBmYWxzZSwKCgkJLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgkJLy8gUFJPVEVDVEVEIFBST1BFUlRJRVMKCgkJLy8qQHByb3RlY3RlZAoJCV9jaGlsZEtpbmQ6IG51bGwsCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIFBVQkxJQyBNRVRIT0RTCgkJCgkJLy8qQHB1YmxpYwoJCWluaXRDb21wb25lbnRzOiBmdW5jdGlvbiAoKSB7CgkJCS8vIHdlIG5lZWQgdG8gZmluZCB0aGUgY2hpbGQgZGVmaW5pdGlvbiBhbmQgcHJlcGFyZSBpdCBmb3IKCQkJLy8gdXNlIGluIG91ciByZXBlYXRlciBpbmNsdWRpbmcgYWRkaW5nIGF1dG8gYmluZGluZyBzdXBwb3J0CgkJCXZhciAkY29tcG9uZW50cyA9IHRoaXMua2luZENvbXBvbmVudHMgfHwgdGhpcy5jb21wb25lbnRzIHx8IFtdOwoJCQl2YXIgJG93bmVyID0gdGhpcy5jb21wb25lbnRzPyB0aGlzLm93bmVyOiB0aGlzOwoJCQl0aGlzLl9jaGlsZEtpbmQgPSBlbnlvLmtpbmQoewoJCQkJLy8gdGFnOiBudWxsLCAvLyBubyBuZWVkIGZvciB0aGUgZXh0cmEgY29udGFpbmVyCgkJCQkvLyBUT0RPOiBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdXNlIHRoZSBhYm92ZSBsaW5lIGJ1dCBmb3IKCQkJCS8vIG5vdyBpdCBpcyBjYXVzaW5nIGZhciB0b28gbWFueSBpc3N1ZXMKCQkJCWtpbmQ6ICJlbnlvLlZpZXciLAoJCQkJbWl4aW5zOiBbImVueW8uQXV0b0JpbmRpbmdTdXBwb3J0IiwgImVueW8uUmVwZWF0ZXJDaGlsZFN1cHBvcnQiXS5jb25jYXQodGhpcy5jaGlsZE1peGlucyB8fCBbXSksCgkJCQljb21wb25lbnRzOiAkY29tcG9uZW50cywKCQkJCWRlZmF1bHRLaW5kOiB0aGlzLmRlZmF1bHRLaW5kIHx8ICJlbnlvLlZpZXciLAoJCQkJZGVmYXVsdFByb3BzOiB7b3duZXI6ICRvd25lcn0KCQkJfSk7CgkJCXRoaXMuX2luaXRDb250YWluZXIoKTsKCQl9LAoKCQkvLypAcHVibGljCgkJY29udHJvbGxlckZpbmRBbmRJbnN0YW5jZTogZnVuY3Rpb24oY3RvciwgaW5zdCkgewoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCQlpZiAoaW5zdCAmJiBpbnN0Ll9pc0NvbnRyb2xsZXIpIHsKCQkJCXRoaXMucmVzZXQoKTsKCQkJfQoJCX0sCgoJCS8vIFRPRE86CgkJcmVzZXQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyICRkID0gdGhpcy5nZXQoImRhdGEiKTsKCQkJdmFyICRjID0gdGhpcy4kLnNjcm9sbGVyOwoJCQl0aGlzLmRlc3Ryb3lDbGllbnRDb250cm9scygpOwoJCQkkYy5yZXNpemVIYW5kbGVyKCk7CgkJCWlmICgkZCkgewoJCQkJZW55by5mb3JFYWNoKCRkLCB0aGlzLmFkZCwgdGhpcyk7CgkJCX0KCQl9LAoKCQlyZW5kZXI6IGZ1bmN0aW9uICgpIHsKCQkJdGhpcy5yZXNldCgpOwoJCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJCX0sCgoJCS8vKkBwdWJsaWMKCQlhZGQ6IGZ1bmN0aW9uIChyZWMpIHsKCQkJaWYgKCF0aGlzLmdlbmVyYXRlZCkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCXZhciAkayA9IHRoaXMuX2NoaWxkS2luZDsKCQkJdmFyICRjID0gdGhpcy5jcmVhdGVDb21wb25lbnQoe2tpbmQ6ICRrfSk7CgkJCXZhciBiID0gdGhpcy5iYXRjaGluZzsKCQkJJGMuc2V0KCJtb2RlbCIsIHJlYyk7CgkJCWlmICghYikgewoJCQkJJGMucmVuZGVyKCk7CgkJCX0KCQl9LAoKCQkvLypAcHVibGljCgkJcmVtb3ZlOiBmdW5jdGlvbiAoaWR4KSB7CgkJCXZhciAkY2ggPSB0aGlzLmdldCgiYWN0aXZlIik7CgkJCXZhciAkYyA9ICRjaFtpZHggfHwgKE1hdGguYWJzKCRjaC5sZW5ndGgtMSkpXTsKCQkJaWYgKCRjKSB7CgkJCQkkYy5kZXN0cm95KCk7CgkJCX0KCQl9LAoKCQkvLypAcHVibGljCgkJdXBkYXRlOiBmdW5jdGlvbiAoaWR4KSB7CgkJCXZhciAkZCA9IHRoaXMuZ2V0KCJkYXRhIik7CgkJCXZhciAkY2ggPSB0aGlzLmdldCgiYWN0aXZlIik7CgkJCXZhciAkYyA9ICRjaFtpZHhdOwoJCQlpZiAoJGQgJiYgJGMpIHsKCQkJCSRjLnNldCgibW9kZWwiLCAkZFtpZHhdKTsKCQkJfQoJCX0sCgoJCS8vKkBwdWJsaWMKCQlwcnVuZTogZnVuY3Rpb24gKCkgewoJCQl2YXIgJGNoID0gdGhpcy5nZXQoImFjdGl2ZSIpOwoJCQl2YXIgbCA9IHRoaXMubGVuZ3RoOwoJCQl2YXIgJHggPSAkY2guc2xpY2UobCk7CgkJCWVueW8uZm9yRWFjaCgkeCwgZnVuY3Rpb24gKGMpIHsKCQkJCWMuZGVzdHJveSgpOwoJCQl9KTsKCQl9LAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBDT01QVVRFRCBQUk9QRVJUSUVTCgoJCS8vKkBwdWJsaWMKCQlhY3RpdmU6IGVueW8uY29tcHV0ZWQoZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gdGhpcy5jb250cm9sUGFyZW50PyB0aGlzLmNvbnRyb2xQYXJlbnQuY2hpbGRyZW46IHRoaXMuY2hpbGRyZW47CgkJfSwgImNvbnRyb2xQYXJlbnQiLCB7Y2FjaGVkOiB0cnVlLCBkZWZlcjogdHJ1ZX0pLAoKCQkvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCQkvLyBQUk9URUNURUQgTUVUSE9EUwoKCQkvLypAcHJvdGVjdGVkCgkJX2luaXRDb250YWluZXI6IGZ1bmN0aW9uICgpIHsKCQkJdmFyICRjb250YWluZXIgPSB0aGlzLmdldCgiY29udGFpbmVyT3B0aW9ucyIpOwoJCQl2YXIgbmFtZSA9ICRjb250YWluZXIubmFtZSB8fCAoJGNvbnRhaW5lci5uYW1lID0gInNjcm9sbGVyIik7CgkJCXRoaXMuY3JlYXRlQ2hyb21lKFskY29udGFpbmVyXSk7CgkJCXRoaXMuZGlzY292ZXJDb250cm9sUGFyZW50KCk7CgkJCWlmIChuYW1lICE9ICJzY3JvbGxlciIpIHsKCQkJCXRoaXMuJC5zY3JvbGxlciA9IHRoaXMuJFtuYW1lXTsKCQkJfQoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlfbW9kZWxBZGRlZDogZnVuY3Rpb24gKHNlbmRlciwgZXZlbnQpIHsKCQkJaWYgKHNlbmRlciAhPT0gdGhpcy5jb250cm9sbGVyKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJdmFyICRtb2RlbCA9IGV2ZW50Lm1vZGVsOwoJCQl0aGlzLmFkZCgkbW9kZWwsIGV2ZW50LmluZGV4KTsKCQl9LAoKCQkvLypAcHJvdGVjdGVkCgkJX21vZGVsc0FkZGVkOiBmdW5jdGlvbiAoc2VuZGVyLCBldmVudCkgewoJCQlpZiAoc2VuZGVyICE9PSB0aGlzLmNvbnRyb2xsZXIpIHsKCQkJCXJldHVybjsKCQkJfQoJCQl0aGlzLnNldCgiYmF0Y2hpbmciLCB0cnVlKTsKCQkJZW55by5mb3JFYWNoKGV2ZW50Lm1vZGVscywgZnVuY3Rpb24gKGluZm8pIHsKCQkJCXRoaXMuYWRkKGluZm8ubW9kZWwsIGluZm8uaW5kZXgpOwoJCQl9LCB0aGlzKTsKCQkJdGhpcy5zZXQoImJhdGNoaW5nIiwgZmFsc2UpOwoJCX0sCgoJCS8vKkBwcm90ZWN0ZWQKCQlfbW9kZWxSZW1vdmVkOiBmdW5jdGlvbiAoc2VuZGVyLCBldmVudCkgewoJCQlpZiAoc2VuZGVyICE9PSB0aGlzLmNvbnRyb2xsZXIpIHsKCQkJCXJldHVybjsKCQkJfQoJCQl0aGlzLnJlbW92ZShldmVudC5pbmRleCk7CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCV9tb2RlbHNSZW1vdmVkOiBmdW5jdGlvbiAoc2VuZGVyLCBldmVudCkgewoJCQlpZiAoc2VuZGVyICE9PSB0aGlzLmNvbnRyb2xsZXIpIHsKCQkJCXJldHVybjsKCQkJfQoJCQllbnlvLmZvckVhY2goZXZlbnQubW9kZWxzLCBmdW5jdGlvbiAoaW5mbykgewoJCQkJdGhpcy5yZW1vdmUoaW5mby5pbmRleCk7CgkJCX0sIHRoaXMpOwoJCX0sCgoJCS8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoJCS8vIE9CU0VSVkVSUwoKCQkvLypAcHVibGljCgkJYmF0Y2hpbmdDaGFuZ2VkOiBmdW5jdGlvbiAocHJldiwgdmFsKSB7CgkJCWlmIChmYWxzZSA9PT0gdmFsKSB7CgkJCQl0aGlzLnJlbmRlcigpOwoJCQl9CgkJfSwKCgkJLy8qQHByb3RlY3RlZAoJCV9sZW5ndGhDaGFuZ2VkOiBlbnlvLm9ic2VydmVyKGZ1bmN0aW9uIChwcm9wLCBwcmV2LCB2YWwpIHsKCQkJaWYgKCFpc05hTihwcmV2KSAmJiAhaXNOYU4odmFsKSkgewoJCQkJaWYgKHByZXYgPiB2YWwpIHsKCQkJCQl0aGlzLnBydW5lKCk7CgkJCQl9CgkJCX0KCQl9LCAibGVuZ3RoIikKCgl9KTsKCn0pKGVueW8pOwo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/data/DataTable.js"
Content-Type: application/octet-stream; x-encoding=base64
LyoqCglfZW55by5EYXRhVGFibGVfIGVuYWJsZXMgdGhlIGNyZWF0aW9uIG9mIGRhdGEtZHJpdmVuIHRhYmxlcy4KCUFsb25nIHdpdGggX2VueW8uVGFibGVfLCB0aGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcy4KKi8KZW55by5raW5kKHsKCW5hbWU6ICJlbnlvLkRhdGFUYWJsZSIsCglraW5kOiAiZW55by5EYXRhUmVwZWF0ZXIiLAoJY29udHJvbGxlcjogImVueW8uQ29sbGVjdGlvbiIsCglkZWZhdWx0S2luZDogImVueW8uVGFibGVSb3ciLAoJc3R5bGU6ICJkaXNwbGF5OiB0YWJsZTsiLAoJY29udGFpbmVyT3B0aW9uczogewoJCWtpbmQ6ICJlbnlvLlRhYmxlIiwKCQluYW1lOiAiY29udGFpbmVyIiwKCQlzdHlsZTogIndpZHRoOiAxMDAlOyIKCX0sCglpbml0Q29tcG9uZW50czogZnVuY3Rpb24oKSB7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCQl0aGlzLl9jaGlsZEtpbmQucHJvdG90eXBlLnRhZyA9IG51bGw7Cgl9Cn0pOw==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/data/RepeaterChildSupport.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5jcmVhdGVNaXhpbih7CgluYW1lOiAiZW55by5SZXBlYXRlckNoaWxkU3VwcG9ydCIsCglkZWNvcmF0ZUV2ZW50OiBmdW5jdGlvbiAoc2VuZGVyLCBldmVudCkgewoJCWV2ZW50Lm1vZGVsID0gdGhpcy5tb2RlbDsKCQl0aGlzLmluaGVyaXRlZChhcmd1bWVudHMpOwoJfQp9KTsK
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/data/RowSupport.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5jcmVhdGVNaXhpbih7CgluYW1lOiAiZW55by5Sb3dTdXBwb3J0IiwKCWRlY29yYXRlRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldmVudCkgewoJCWV2ZW50LnJvdyA9IHRoaXM7CgkJdGhpcy5pbmhlcml0ZWQoYXJndW1lbnRzKTsKCX0KfSk7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/data/data.css"
Content-Type: application/octet-stream; x-encoding=base64
LyogV0FSTklORzogVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LiAgTW9zdCAgICAgICovCi8qIHVzcnMgc2hvdWxkIGluc3RlYWQgbW9kaWZ5IExFU1MgZmlsZXMuICBJZiB5b3UgY2hvb3NlIHRvIGVkaXQgdGhpcyBDU1MgICAqLwovKiBkaXJlY3RseSByYXRoZXIgdGhhbiBMRVNTIGZpbGVzLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSBsZXNzLnh4Lnl5Lm1pbi5qcyAgKi8KLyogaXMgY29tbWVudGVkIG91dCBpbiB5b3VyIGRlYnVnLmh0bWwsIGFuZCBydW4gZGVwbG95LnNoL2JhdCB1c2luZyB0aGUgICAgICovCi8qICctYycgZmxhZyB0byBkaXNhYmxlIExFU1MgY29tcGlsYXRpb24uICBUaGlzIHdpbGwgZm9yY2UgdGhlIGxvYWRlciBhbmQgICAqLwovKiBtaW5pZmllciB0byBmYWxsIGJhY2sgdG8gdXNpbmcgQ1NTIGZpbGVzIGluIHBsYWNlIG9mIHRoZSBzYW1lLW5hbWUgICAgICAgKi8KLyogTEVTUyBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgouZW55by1kYXRhLWxpc3QuZW55by1kYXRhLWxpc3Qtcm93cy1jb250YWluZXIuZW55by1saXN0LXJvdyB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9Ci5lbnlvLWRhdGEtZ3JpZC1saXN0IC5lbnlvLWRhdGEtZ3JpZC1saXN0LWl0ZW0gewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQo=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/data/data.less"
Content-Type: application/octet-stream; x-encoding=base64
Ly8gZm9yIHRoZSBhY3RpdmUgcGFnZXMgY29udGFpbmVyCi5lbnlvLWRhdGEtbGlzdC1hY3RpdmUgewoJcG9zaXRpb246IHJlbGF0aXZlOwoJCgkvLyBmb3IgcGFnZXMKCS5lbnlvLWRhdGEtbGlzdC1wYWdlIHsKCQlwb3NpdGlvbjogYWJzb2x1dGU7Cgl9Cn0=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/data/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJImRhdGEubGVzcyIsCgkiRGF0YVJlcGVhdGVyLmpzIiwKCSJEYXRhTGlzdC5qcyIsCgkiRGF0YUdyaWRMaXN0LmpzIiwKCSJEYXRhVGFibGUuanMiLAoJIlJlcGVhdGVyQ2hpbGRTdXBwb3J0LmpzIiwKCSJSb3dTdXBwb3J0LmpzIgopOw==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/fullscreen.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5mdWxsc2NyZWVuID0gewoJCgkvLyogQHByb3RlY3RlZAoJCgkvLyogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGZzIGNvbnRyb2wKCWZ1bGxzY3JlZW5Db250cm9sOiBudWxsLAoJLy8qIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBmcyBlbGVtZW50IChmYWxsYmFjayBmb3IgcGxhdGZvcm1zIHcvbyBuYXRpdmUgc3VwcG9ydCkKCWZ1bGxzY3JlZW5FbGVtZW50OiBudWxsLAoJLy8qIFJlZmVyZW5jZSB0byBjb250cm9sIHRoYXQgcmVxdWVzdGVkIGZzCglyZXF1ZXN0b3I6IG51bGwsCgkvLyogTmF0aXZlIGFjY2Vzc29yIHVzZWQgdG8gZ2V0IHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBmcyBlbGVtZW50CgllbGVtZW50QWNjZXNzb3I6CgkJKCJmdWxsc2NyZWVuRWxlbWVudCIgaW4gZG9jdW1lbnQpID8gImZ1bGxzY3JlZW5FbGVtZW50IiA6CgkJKCJtb3pGdWxsU2NyZWVuRWxlbWVudCIgaW4gZG9jdW1lbnQpID8gIm1vekZ1bGxTY3JlZW5FbGVtZW50IiA6CgkJKCJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCIgaW4gZG9jdW1lbnQpID8gIndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IiA6CgkJbnVsbCwKCS8vKiBOYXRpdmUgYWNjZXNzb3IgdXNlZCB0byByZXF1ZXN0IGZzCglyZXF1ZXN0QWNjZXNzb3I6CgkJKCJyZXF1ZXN0RnVsbHNjcmVlbiIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA/ICJyZXF1ZXN0RnVsbHNjcmVlbiIgOgoJCSgibW96UmVxdWVzdEZ1bGxTY3JlZW4iIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgPyAibW96UmVxdWVzdEZ1bGxTY3JlZW4iIDoKCQkoIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpID8gIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIiA6CgkJbnVsbCwKCS8vKiBOYXRpdmUgYWNjZXNzb3IgdXNlZCB0byBjYW5jZWwgZnMKCWNhbmNlbEFjY2Vzc29yOgoJCSgiY2FuY2VsRnVsbFNjcmVlbiIgaW4gZG9jdW1lbnQpID8gImNhbmNlbEZ1bGxTY3JlZW4iIDoKCQkoIm1vekNhbmNlbEZ1bGxTY3JlZW4iIGluIGRvY3VtZW50KSA/ICJtb3pDYW5jZWxGdWxsU2NyZWVuIiA6CgkJKCJ3ZWJraXRDYW5jZWxGdWxsU2NyZWVuIiBpbiBkb2N1bWVudCkgPyAid2Via2l0Q2FuY2VsRnVsbFNjcmVlbiIgOgoJCW51bGwsCgkKCS8vKiBAcHVibGljCgkKCS8vKiBSZXR1cm4gdHJ1ZSBpZiBwbGF0Zm9ybSBzdXBwb3J0cyBhbGwgb2YgdGhlIGZ1bGxzY3JlZW4gQVBJCgluYXRpdmVTdXBwb3J0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKHRoaXMuZWxlbWVudEFjY2Vzc29yICE9PSBudWxsICYmIHRoaXMucmVxdWVzdEFjY2Vzc29yICE9PSBudWxsICYmIHRoaXMuY2FuY2VsQWNjZXNzb3IgIT09IG51bGwpOwoJfSwKCS8vKiBOb3JtYWxpemUgX2dldEZ1bGxzY3JlZW5FbGVtZW50KClfCglnZXRGdWxsc2NyZWVuRWxlbWVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICh0aGlzLm5hdGl2ZVN1cHBvcnQoKSkgPyBkb2N1bWVudFt0aGlzLmVsZW1lbnRBY2Nlc3Nvcl0gOiB0aGlzLmZ1bGxzY3JlZW5FbGVtZW50OwoJfSwKCS8vKiBSZXR1cm4gY3VycmVudCBmcyBjb250cm9sCglnZXRGdWxsc2NyZWVuQ29udHJvbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZnVsbHNjcmVlbkNvbnRyb2w7Cgl9LAoJLy8qIE5vcm1hbGl6ZSBfcmVxdWVzdEZ1bGxzY3JlZW4oKV8KCXJlcXVlc3RGdWxsc2NyZWVuOiBmdW5jdGlvbihpbkNvbnRyb2wpIHsKCQlpZiAodGhpcy5nZXRGdWxsc2NyZWVuQ29udHJvbCgpIHx8ICEoaW5Db250cm9sLmhhc05vZGUoKSkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdGhpcy5yZXF1ZXN0b3IgPSBpbkNvbnRyb2w7CgoJCS8vIE9ubHkgdXNlIG5hdGl2ZSByZXF1ZXN0IGlmIHBsYXRmb3JtIHN1cHBvcnRzIGFsbCBvZiB0aGUgQVBJCgkJaWYgKHRoaXMubmF0aXZlU3VwcG9ydCgpKSB7CgkJCWluQ29udHJvbC5oYXNOb2RlKClbdGhpcy5yZXF1ZXN0QWNjZXNzb3JdKCk7CgkJfSBlbHNlIHsKCQkJdGhpcy5mYWxsYmFja1JlcXVlc3RGdWxsc2NyZWVuKCk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0sCgkvLyogTm9ybWFsaXplIF9jYW5jZWxGdWxsc2NyZWVuKClfCgljYW5jZWxGdWxsc2NyZWVuOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5uYXRpdmVTdXBwb3J0KCkpIHsKCQkJZG9jdW1lbnRbdGhpcy5jYW5jZWxBY2Nlc3Nvcl0oKTsKCQl9IGVsc2UgewoJCQl0aGlzLmZhbGxiYWNrQ2FuY2VsRnVsbHNjcmVlbigpOwoJCX0KCX0sCgkKCS8vKiBAcHJvdGVjdGVkCgkKCS8vKiBGYWxsYmFjayBzdXBwb3J0IGZvciBzZXR0aW5nIGZ1bGxzY3JlZW4gZWxlbWVudCAoZG9uZSBieSBicm93c2VyIG9uIHBsYXRmb3JtcyB3aXRoIG5hdGl2ZSBzdXBwb3J0KQoJc2V0RnVsbHNjcmVlbkVsZW1lbnQ6IGZ1bmN0aW9uKGluTm9kZSkgewoJCXRoaXMuZnVsbHNjcmVlbkVsZW1lbnQgPSBpbk5vZGU7Cgl9LAoJLy8qIFNldCBjdXJyZW50IGZzIGNvbnRyb2wKCXNldEZ1bGxzY3JlZW5Db250cm9sOiBmdW5jdGlvbihpbkNvbnRyb2wpIHsKCQl0aGlzLmZ1bGxzY3JlZW5Db250cm9sID0gaW5Db250cm9sOwoJfSwKCS8vKiBGYWxsYmFjayBmdWxsc2NyZWVuIHJlcXVlc3QgZm9yIHBsYXRmb3JtcyB3aXRob3V0IGZ1bGxzY3JlZW4gc3VwcG9ydAoJZmFsbGJhY2tSZXF1ZXN0RnVsbHNjcmVlbjogZnVuY3Rpb24oKSB7CgkJdmFyIGNvbnRyb2wgPSB0aGlzLnJlcXVlc3RvcjsKCQkKCQlpZiAoIWNvbnRyb2wpIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gR2V0IGJlZm9yZSBub2RlIHRvIGFsbG93IHVzIHRvIGV4aXQgZmxvYXRpbmcgbGF5ZXIgdG8gdGhlIHByb3BlciBwb3NpdGlvbgoJCWNvbnRyb2wucHJldkFkZEJlZm9yZSA9IGNvbnRyb2wucGFyZW50LmNvbnRyb2xBdEluZGV4KGNvbnRyb2wuaW5kZXhJbkNvbnRhaW5lcigpICsgMSk7CgoJCS8vIFJlbmRlciBmbG9hdGluZyBsYXllciBpZiB3ZSBuZWVkIHRvCgkJaWYgKCFlbnlvLmZsb2F0aW5nTGF5ZXIuaGFzTm9kZSgpKSB7CgkJCWVueW8uZmxvYXRpbmdMYXllci5yZW5kZXIoKTsKCQl9CgoJCWNvbnRyb2wuYWRkQ2xhc3MoImVueW8tZnVsbHNjcmVlbiIpOwoJCWNvbnRyb2wuYXBwZW5kTm9kZVRvUGFyZW50KGVueW8uZmxvYXRpbmdMYXllci5oYXNOb2RlKCkpOwoJCWNvbnRyb2wucmVzaXplZCgpOwoKCQl0aGlzLnNldEZ1bGxzY3JlZW5Db250cm9sKGNvbnRyb2wpOwoJCXRoaXMuc2V0RnVsbHNjcmVlbkVsZW1lbnQoY29udHJvbC5oYXNOb2RlKCkpOwoJfSwKCS8vKiBGYWxsYmFjayBjYW5jZWwgZnVsbHNjcmVlbiBmb3IgcGxhdGZvcm1zIHdpdGhvdXQgZnVsbHNjcmVlbiBzdXBwb3J0CglmYWxsYmFja0NhbmNlbEZ1bGxzY3JlZW46IGZ1bmN0aW9uKCkgewoJCXZhciBjb250cm9sID0gdGhpcy5mdWxsc2NyZWVuQ29udHJvbCwKCQkJYmVmb3JlTm9kZSwKCQkJcGFyZW50Tm9kZQoJCTsKCgkJaWYgKCFjb250cm9sKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIEZpbmQgYmVmb3JlTm9kZSBiYXNlZCBvbiBfdGhpcy5hZGRCZWZvcmVfIGFuZCBfdGhpcy5wcmV2QWRkQmVmb3JlXwoJCWJlZm9yZU5vZGUgPSAoY29udHJvbC5wcmV2QWRkQmVmb3JlKSA/IGNvbnRyb2wucHJldkFkZEJlZm9yZS5oYXNOb2RlKCkgOiBudWxsOwoJCXBhcmVudE5vZGUgPSBjb250cm9sLnBhcmVudC5oYXNOb2RlKCk7CgkJY29udHJvbC5wcmV2QWRkQmVmb3JlID0gbnVsbDsKCgkJY29udHJvbC5yZW1vdmVDbGFzcygiZW55by1mdWxsc2NyZWVuIik7CgoJCWlmICghYmVmb3JlTm9kZSkgewoJCQljb250cm9sLmFwcGVuZE5vZGVUb1BhcmVudChwYXJlbnROb2RlKTsKCQl9IGVsc2UgewoJCQljb250cm9sLmluc2VydE5vZGVJblBhcmVudChwYXJlbnROb2RlLCBiZWZvcmVOb2RlKTsKCQl9CgoJCWNvbnRyb2wucmVzaXplZCgpOwoKCQl0aGlzLnNldEZ1bGxzY3JlZW5Db250cm9sKG51bGwpOwoJCXRoaXMuc2V0RnVsbHNjcmVlbkVsZW1lbnQobnVsbCk7Cgl9LAoJLy8qIExpc3RlbiBmb3IgZnMgY2hhbmdlIGV2ZW50IGFuZCBicm9hZGNhc3QgYXMgbm9ybWFsaXplZCBldmVudAoJZGV0ZWN0RnVsbHNjcmVlbkNoYW5nZUV2ZW50OiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldEZ1bGxzY3JlZW5Db250cm9sKHRoaXMucmVxdWVzdG9yKTsKCQl0aGlzLnJlcXVlc3RvciA9IG51bGw7CgoJCS8vIEJyb2FkY2FzdCBjaGFuZ2UKCQllbnlvLlNpZ25hbHMuc2VuZCgib25GdWxsc2NyZWVuQ2hhbmdlIik7Cgl9Cn07CgovLyogTm9ybWFsaXplIHBsYXRmb3JtLXNwZWNpZmljIGZzIGNoYW5nZSBldmVudHMKZW55by5yZWFkeShmdW5jdGlvbigpIHsKCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBlbnlvLmJpbmQoZW55by5mdWxsc2NyZWVuLCAiZGV0ZWN0RnVsbHNjcmVlbkNoYW5nZUV2ZW50IiksIGZhbHNlKTsKCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vemZ1bGxzY3JlZW5jaGFuZ2UiLCAgICBlbnlvLmJpbmQoZW55by5mdWxsc2NyZWVuLCAiZGV0ZWN0RnVsbHNjcmVlbkNoYW5nZUV2ZW50IiksIGZhbHNlKTsKCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCAgICAgICBlbnlvLmJpbmQoZW55by5mdWxsc2NyZWVuLCAiZGV0ZWN0RnVsbHNjcmVlbkNoYW5nZUV2ZW50IiksIGZhbHNlKTsKfSk7CgovLyogSWYgdGhpcyBwbGF0Zm9ybSBkb2Vzbid0IGhhdmUgbmF0aXZlIHN1cHBvcnQgZm9yIGZ1bGxzY3JlZW4sIGFkZCBhbiBlc2NhcGUgaGFuZGxlciB0byBtaW1pYyBuYXRpdmUgYmVoYXZpb3IKaWYoIWVueW8uZnVsbHNjcmVlbi5uYXRpdmVTdXBwb3J0KCkpIHsKCWVueW8uZGlzcGF0Y2hlci5mZWF0dXJlcy5wdXNoKAoJCWZ1bmN0aW9uKGUpIHsKCQkJaWYgKGUudHlwZSA9PT0gImtleWRvd24iICYmIGUua2V5Q29kZSA9PT0gMjcpIHsKCQkJCWVueW8uZnVsbHNjcmVlbi5jYW5jZWxGdWxsc2NyZWVuKCk7CgkJCX0KCQl9CgkpOwp9Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/package.js"
Content-Type: application/octet-stream; x-encoding=base64
ZW55by5kZXBlbmRzKAoJInVpLmNzcyIsCgkiQW5pbWF0b3IuanMiLAoJIkJhc2VMYXlvdXQuanMiLAoJIkltYWdlLmpzIiwKCSJJbnB1dC5qcyIsCgkiUmljaFRleHQuanMiLAoJIlRleHRBcmVhLmpzIiwKCSJTZWxlY3QuanMiLAoJIkdyb3VwLmpzIiwKCSJHcm91cEl0ZW0uanMiLAoJIlRvb2xEZWNvcmF0b3IuanMiLAoJIkJ1dHRvbi5qcyIsCgkiQ2hlY2tib3guanMiLAoJIlJlcGVhdGVyLmpzIiwKCSJEcmFnQXZhdGFyLmpzIiwKCSJGbG9hdGluZ0xheWVyLmpzIiwKCSJQb3B1cC5qcyIsCgkiU2VsZWN0aW9uLmpzIiwKCSJEcmF3ZXIuanMiLAoJIlRhYmxlLmpzIiwKCSJmdWxsc2NyZWVuLmpzIiwKCSJNZWRpYS5qcyIsCgkiQXVkaW8uanMiLAoJImRhdGEiCik7Cg==
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/source/ui/ui.css"
Content-Type: application/octet-stream; x-encoding=base64
LmVueW8taW5saW5lLCAuZW55by10b29sLWRlY29yYXRvciB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5lbnlvLWNoaWxkcmVuLWlubGluZSA+ICosIC5lbnlvLXRvb2wtZGVjb3JhdG9yID4gKiB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi5lbnlvLWNoaWxkcmVuLW1pZGRsZSA+ICosIC5lbnlvLXRvb2wtZGVjb3JhdG9yID4gKiB7Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgouZW55by1wb3NpdGlvbmVkIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmVueW8tZmlsbCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl3aWR0aDogMTAwJTsKCWhlaWdodDogMTAwJTsKfQoKLmVueW8tcG9wdXAgewoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMTA7Cn0=
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/tools/README.md"
Content-Type: application/octet-stream; x-encoding=base64
IyBFbnlvIE1pbmlmaWVyCgpUaGUgZW55byBtaW5pZmllciB1c2VzIE5vZGUuanMsIFtVZ2xpZnlKU10oaHR0cDovL2dpdGh1Yi5jb20vbWlzaG9vL3VnbGlmeWpzKSBhbmQgdGhlIGVueW8gZGVwZW5kZW5jeSBsb2FkZXIgdG8gY29tcHJlc3MgYW55IGVueW8gcGFja2FnZSBpbnRvIGEgbWluaW1pemVkIGZvcm0uCgojIyBJbnZvY2F0aW9uCkZvciBjb252ZW5pZW5jZSwgdGhlcmUgYXJlIGJvdGggV2luZG93cyBhbmQgVW5peCB2ZXJzaW9ucyBvZiB0aGUgc2NyaXB0IHRoYXQgaW52b2tlcyB0aGUgbm9kZSB0b29sLgpUaGV5IGZvbGxvdyB0aGUgc2FtZSBpbnZvY2F0aW9uOgoKCXBhdGgvdG8vZW55by90b29scy9taW5pZnkvbWluaWZ5LnNoIHBhY2thZ2UuanMgLW91dHB1dCAvcmVsYXRpdmUvcGF0aC90by9idWlsZC9kaXIvYnVpbGRmaWxlbmFtZQoKQW4gZXhhbXBsZSBmb3IgbGliL29ueXgsIGEgVUkgd2lkZ2V0IHNldCwgcnVuIGZyb20gYGxpYi9vbnl4L21pbmlmeS9taW5pZnkuc2hgLCBidWlsZGluZyB0byBgbGliL29ueXgvYnVpbGRgCgoJLi4vLi4vLi4vZW55by90b29scy9taW5pZnkvbWluaWZ5LnNoIC1vdXRwdXQgLi4vYnVpbGQvb255eCBwYWNrYWdlLmpzCgpUaGUgbGFzdCBwYXJhbWV0ZXIgaW4gdGhlIG91dHB1dCBwYXRoLCBpZiBub3QgZW5kaW5nIGluIGEgYC9gLCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBidWlsZCBmaWxlcy4KVGhlIGBwYWNrYWdlLmpzYCBmaWxlIG11c3QgYmUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBpbnZvY2F0aW9uLgoKRm9yIGNvbnZlbmllbmNlLCBwYWNrYWdlcyBzaG91bGQgaW5jbHVkZSBhIGBtaW5pZnlgIGZvbGRlciB3aXRoIGJvdGggYSBXaW5kb3dzIGJhdGNoIGFuZCBVbml4IHNoZWxsIHNjcmlwdCB0aGF0IHJ1bnMgdGhlIG1pbmlmaWVyLgoKIyMgUnVubmluZyB0ZXN0cwoxLiBZb3UgZmlyc3QgbmVlZCB0byBpbnN0YWxsIGFuIGh0dHAgc2VydmVyIGhhbmRsaW5nIHBocCAoTUFOUCBvciBXQU1QLCAuLi4pCjIuIENvbmZpZ3VyZSB5b3VyIGh0dHAgc2VydmVyIHRvIHNlcnZlIHRoZSBmaWxlcyBvZiB0aGUgZW55byBwcm9qZWN0CjMuIFBvaW50IHlvdXIgYnJvd3NlciB0byBlbnlvL3Rvb2xzLy4uLiB0byBydW4gdGhlIHZhcmlvdXMgdGVzdGNhc2Vz
----------------------------385268511887432987672305
Content-Disposition: form-data; name="file"; filename="enyo/tools/deploy.js"
Content-Type: application/octet-stream; x-encoding=base64
IyEvdXNyL2Jpbi9lbnYgbm9kZQovKiBqc2hpbnQgbm9kZTogdHJ1ZSAqLwovKioKIyBkZXBsb3kuanMgLSBwb3J0YWJsZSBkZXBsb3ltZW50IHNjcmlwdAoKVGhpcyBwb3J0YWJsZSBOb2RlLmpzIHNjcmlwdCBtaW5pZmllcyBib3RoIHlvdXIgYXBwbGljYXRpb24sIGl0cwpsaWJyYXJpZXMgJiB0aGUgRW55byBmcmFtZXdvcmsgaXQgaXMgdXNpbmcuICBUaGUgcmVzdWx0aW5nIGFwcGxpY2F0aW9uCmlzIHN1aXRhYmxlIGZvciBwcm9kdWN0aW9uIHVzYWdlLCBlaXRoZXIgaG9zdGV0IG9uIGEgd2ViLXNlcnZlciBvcgplbWJlZGRlZCBpbnRvIGEgUGhvbmVHYXAgY29udGFpbmVyLgoKVGhlIHNjcmlwdCBpcyBpbnRlbmRlZCB0byBiZSBydW4gZnJvbSB0aGUgYXBwbGljYXRpb24ncyByb290IGRpcmVjdG9yeQooVGhpcyBpcyB1bmxpa2UgcHJldmlvdXMgZGVwcmVjYXRlZCBpbmNhcm5hdGlvbnMgb2YgdGhlIHNjcmlwdHMKYGRlcGxveS5zaGAgYW5kIGBkZXBsb3kuYmF0YCB0aGF0IHNoaXBwZWQgd2l0aGluIHRoZSBgYm9vdHBsYXRlYAphcHBsaWNhdGlvbiksIHdoZXJlIGl0IGV4cGVjdHMgdG8gZmluZCBhIGZpbGUgY2FsbGVkIGBwYWNrYWdlLmpzYAoodW5sZXNzIHRoZSB1c2VyIHNwZWNpZmllcyBhbiBhbHRlcm5hdGUgbG9jYXRpb24gdXNpbmcgdGhlIGAtcGAgZmxhZykuCgpUaGlzIHNjcmlwdCBjb21lcyBhbG9uZyB3aXRoIEVueW8uICBJdCBhdXRvbWF0aWNhbGx5IHVzZXMgJiBlbWJlZHMgdGhlCkVueW8gdmVyc2lvbiBpdCBpcyBzaGlwcGVkIHdpdGgsIHVubGVzcyB0aGUgdXNlciBzcGVjaWZpZXMgYW5vdGhlcgpFbnlvIHZlcnNpb24gdXNpbmcgdGhlIGAtZSBlbnlvX2RpcmAgZmxhZy4KCldoZW4geW91IGFwcGxpY2F0aW9uIGhhcyBsaWJyYXJ5IGRlcGVuZGVuY2llcyAoZm9yIGV4YW1wbGUKYGxpYi9teWxpYmApLCB0aGlzIHNjcmlwdCB1c2VzIHRoZSBgbGliL215bGliL21hbmlmZXN0Lmpzb25gIChpZgpwcmVzZW50KSBvciB0aGUgb2xkLWZhc2hpb25lZCBkZXBsb3ltZW50IHNjcmlwdHMgYGxpYi9teWxpYi9kZXBsb3kuc2hgCihvbiBMaW51eCAmIE1hYyBPU1gpIG9yIGBsaWIvbXlsaWIvZGVwbG95LmJhdGAgKG9uIFdpbmRvd3MpLgpJZiBuZWl0aGVyIGV4aXN0LCB0aGVuIHRoZSBlbnRpcmUgbGlicmFyeSBpcyBjb3BpZWQgKGV4Y2VwdCBmb3IgLmdpdCBkaXIpLgoKVGhpcyBzY3JpcHQgYWxzbyBleHBlY3RzIHRvIGZpbmQgdGhlIGZvbGxvd2luZyBmaWxlcyAmIGZvbGRlcnMgaW4gdGhlCmFwcGxpY2F0aW9uIHJvb3QgZGlyZWN0b3J5LiAgRWFjaCBvZiB0aGVtIGlzIGNvcGllZCB2ZXJiYXRpbSBpbiB0aGUKb3V0cHV0IHByb2R1Y3Rpb24vZGVwbG95bWVudCBmb2xkZXIgKHRoZSBvbmUgb3B0aW9uYWxseSBnaXZlbiB1c2luZwp0aGUgYC1vYCBmbGFnKS4KCiogYGluZGV4Lmh0bWxgLCB0aGUgYXBwbGljYXRpb24gc3RhcnR1cCBwYWdlCiogYGljb24ucG5nYCwgdGhlIGFwcGxpY2F0aW9uIGljb24KKiBgYXNzZXRzL2Bob2xkcyB0aGUgc3RhdGljIGFwcGxpY2F0aW9uIGFzc2V0cywgc3VjaCBhcyBpbWFnZXMsCiAgdmlkZW9zLi4uIGV0Yy4KCiAqLwoKLy8gTG9hZCBkZXBlbmRlbmNpZXMKdmFyIG5vcHQgPSByZXF1aXJlKCJub3B0IiksCiAgICBwYXRoID0gcmVxdWlyZSgncGF0aCcpLAogICAgZnMgPSByZXF1aXJlKCdmcycpLAogICAgc2hlbGwgPSByZXF1aXJlKCdzaGVsbGpzJyk7Cgp2YXIgc3RhdCwgc2NyaXB0LCBzY3JpcHRzID0ge307CgovLyBTZW5kIG1lc3NhZ2UgdG8gcGFyZW50IG5vZGUgcHJvY2VzcywgaWYgYW55CnByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgZnVuY3Rpb24gKGVycikgewoJdmFyIGVyck1zZyA9IGVyci50b1N0cmluZygpICsgZXJyLnN0YWNrOwoJY29uc29sZS5lcnJvcihlcnJNc2cpOwoJaWYgKHByb2Nlc3Muc2VuZCkgewoJCS8vIG9ubHkgYXZhaWxhYmxlIGlmIHBhcmVudCBwcm9jZXNzIGlzIG5vZGUKCQlwcm9jZXNzLnNlbmQoe2Vycm9yOiBlcnJNc2d9KTsKCX0KCXByb2Nlc3MuZXhpdCgxKTsKfSk7Ci8vIHJlY2VpdmUgZXJyb3IgbWVzc2FnZXMgZnJvbSBjaGlsZCBub2RlIHByb2Nlc3Nlcwpwcm9jZXNzLm9uKCdtZXNzYWdlJywgZnVuY3Rpb24obXNnKSB7Cgljb25zb2xlLmRpcihiYXNlbmFtZSwgbXNnKTsKCWlmIChtc2cuZXJyb3IgJiYgbXNnLmVycm9yLnN0YWNrKSB7CgkJY29uc29sZS5lcnJvcihiYXNlbmFtZSwgbXNnLmVycm9yLnN0YWNrKTsKCX0KCWlmIChwcm9jZXNzLnNlbmQpIHsKCQlwcm9jZXNzLnNlbmQobXNnKTsKCX0KfSk7CgovLyBQYXJzZSBhcmd1bWVudHMKCnZhciBub2RlID0gcHJvY2Vzcy5hcmd2WzBdLAogICAgZGVwbG95ID0gcHJvY2Vzcy5hcmd2WzFdLAogICAgc291cmNlRGlyID0gcHJvY2Vzcy5jd2QoKSwKICAgIHBhY2thZ2VKcyA9IHBhdGgucmVzb2x2ZShzb3VyY2VEaXIsICJwYWNrYWdlLmpzIiksCiAgICBlbnlvRGlyID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJyksCiAgICBidWlsZERpciA9IHBhdGgucmVzb2x2ZShzb3VyY2VEaXIsICJidWlsZCIpLAogICAgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKHNvdXJjZURpciksCiAgICBvdXREaXIgPSBwYXRoLnJlc29sdmUoc291cmNlRGlyLCAnZGVwbG95JywgYmFzZW5hbWUpLAogICAgbGVzcyA9IHRydWUsIC8vIExFU1MgY29tcGlsYXRpb24sIHR1cm5lZCBvbiBieSBkZWZhdWx0CiAgICB2ZXJib3NlID0gZmFsc2U7CgpmdW5jdGlvbiBwcmludFVzYWdlKCkgewoJLy8gZm9ybWF0IGdlbmVyYXRlZCB1c2luZyBub2RlLW9wdGltaXN0Li4uCgljb25zb2xlLmxvZygnXG4nICsKCQknVXNhZ2U6ICcgKyBub2RlICsgJyAnICsgZGVwbG95ICsgJyBbLWNdWy1lIGVueW9fZGlyXVstbCBsaWJfZGlyXVstYiBidWlsZF9kaXJdWy1vIG91dF9kaXJdWy1wIHBhY2thZ2VfanNdWy1zIHNvdXJjZV9kaXJdWy1mIG1hcF9mcm9tIC10IG1hcF90byAuLi5dXG4nICsKCQknXG4nICsKCQknT3B0aW9uczpcbicgKwoJCScgIC12ICB2ZXJib3NlIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgIFtib29sZWFuXSAgW2RlZmF1bHQ6ICcgKyB2ZXJib3NlICsgJ11cbicgKwoJCScgIC1iICBhbHRlcm5hdGUgYnVpbGQgZGlyZWN0b3J5ICAgICAgICAgICAgIFtkZWZhdWx0OiAiJyArIGJ1aWxkRGlyICsgJyJdXG4nICsKCQknICAtYyAgZG8gbm90IHJ1biB0aGUgTEVTUyBjb21waWxlciAgICAgICAgICBbYm9vbGVhbl0gIFtkZWZhdWx0OiAnICsgbGVzcyArICddXG4nICsKCQknICAtZSAgbG9jYXRpb24gb2YgdGhlIGVueW8gZnJhbWV3b3JrICAgICAgICBbZGVmYXVsdDogIicgKyBlbnlvRGlyICsgJyJdXG4nICsKCQknICAtbCAgbG9jYXRpb24gb2YgdGhlIGxpYiBmb2xkZXIgICAgICAgICAgICBbZGVmYXVsdDogIicgKyBlbnlvRGlyICsgJy8uLi9saWIiXVxuJyArCgkJJyAgLW8gIGFsdGVybmF0ZSBvdXRwdXQgZGlyZWN0b3J5ICAgICAgICAgICAgW2RlZmF1bHQ6ICInICsgb3V0RGlyICsgJyJdXG4nICsKCQknICAtcCAgbG9jYXRpb24gb2YgdGhlIG1haW4gcGFja2FnZS5qcyBmaWxlICBbZGVmYXVsdDogIicgKyBwYWNrYWdlSnMgKyAnIl1cbicgKwoJCScgIC1zICBzb3VyY2UgY29kZSByb290IGRpcmVjdG9yeSAgICAgICAgICAgIFtkZWZhdWx0OiAiJyArIHNvdXJjZURpciArICciXVxuJyArCgkJJyAgLWYgIHJlbW90ZSBzb3VyY2UgbWFwcGluZzogZnJvbSBsb2NhbCBwYXRoJyArCgkJJyAgLXQgIHJlbW90ZSBzb3VyY2UgbWFwcGluZzogdG8gcmVtb3RlIHBhdGgnICsKCQknXG4nKTsKfQoKdmFyIG9wdCA9IG5vcHQoLyprbm93bk9wdHMqLyB7CgkiYnVpbGQiOiBwYXRoLAoJImxlc3MiOiBCb29sZWFuLAoJImVueW8iOiBwYXRoLAoJImxpYiI6IHBhdGgsCgkib3V0IjogcGF0aCwKCSJwYWNrYWdlanMiOiBwYXRoLAoJInNvdXJjZSI6IHBhdGgsCgkidmVyYm9zZSI6IEJvb2xlYW4sCgkiaGVscCI6IEJvb2xlYW4sCgkibWFwZnJvbSI6IFtTdHJpbmcsIEFycmF5XSwKCSJtYXB0byI6IFtTdHJpbmcsIEFycmF5XQp9LCAvKnNob3J0SGFuZHMqLyB7CgkiYiI6ICItLWJ1aWxkIiwKCSJjIjogIi0tbm8tbGVzcyIsCgkiZSI6ICItLWVueW8iLAoJImwiOiAiLS1saWIiLAoJIm8iOiAiLS1vdXQiLAoJInAiOiAiLS1wYWNrYWdlanMiLAoJInMiOiAiLS1zb3VyY2UiLAoJInYiOiAiLS12ZXJib3NlIiwKCSJoIjogIi0taGVscCIsCgkiZiI6ICItLW1hcGZyb20iLAoJInQiOiAiLS1tYXB0byIsCgkiPyI6ICItLWhlbHAiCn0sIHByb2Nlc3MuYXJndiAvKmFyZ3MqLywgMiAvKnNsaWNlKi8pOwoKaWYgKG9wdC5oZWxwKSB7CglwcmludFVzYWdlKCk7Cglwcm9jZXNzLmV4aXQoMSk7Cn0KCi8vIG5vcHQgaGFzIG5vdCBkZWZhdWx0IHZhbHVlcyBzeXN0ZW0KYnVpbGREaXIgPSBvcHQuYnVpbGQgfHwgYnVpbGREaXI7CmVueW9EaXIgPSBvcHQuZW55byB8fCBlbnlvRGlyOwpvdXREaXIgPSBvcHQub3V0IHx8IG91dERpcjsKcGFja2FnZUpzID0gb3B0LnBhY2thZ2VqcyB8fAoJKG9wdC5zb3VyY2UgPyBwYXRoLmpvaW4ob3B0LnNvdXJjZSwgJ3BhY2thZ2UuanMnKSA6IHVuZGVmaW5lZCkgfHwKCXBhY2thZ2VKczsKc291cmNlRGlyID0gb3B0LnNvdXJjZSB8fAoJKG9wdC5wYWNrYWdlanMgPyBwYXRoLmRpcm5hbWUob3B0LnBhY2thZ2VqcykgOiB1bmRlZmluZWQpIHx8Cglzb3VyY2VEaXI7Cmxlc3MgPSAob3B0Lmxlc3MgIT09IGZhbHNlKSAmJiBsZXNzOwp2ZXJib3NlID0gb3B0LnZlcmJvc2U7CgppZiAoKG9wdC5tYXBmcm9tIHx8IG9wdC5tYXB0b3ApICYmICghb3B0Lm1hcGZyb20gfHwgIW9wdC5tYXB0byB8fCAob3B0Lm1hcGZyb20ubGVuZ3RoICE9IG9wdC5tYXB0by5sZW5ndGgpKSkgewoJY29uc29sZS5sb2coIm1hcGZyb206Iiwgb3B0Lm1hcGZyb20pOwoJY29uc29sZS5sb2coIm1hcHRvOiIsIG9wdC5tYXB0byk7Cgljb25zb2xlLmVycm9yKCJFcnJvcjogVGhlIG51bWJlciBvZiAnbWFwZnJvbScgYW5kICdtYXB0bycgYXJndW1lbnRzIG11c3QgbWF0Y2guIik7Cglwcm9jZXNzLmV4aXQoMSk7Cn0KCnZhciBtaW5pZmllciA9IHBhdGgucmVzb2x2ZShlbnlvRGlyLCAndG9vbHMnLCAnbWluaWZpZXInLCAnbWluaWZ5LmpzJyk7CmlmICh2ZXJib3NlKSB7Cgljb25zb2xlLmxvZygiVXNpbmc6IGJ1aWxkX2Rpcj0iICsgYnVpbGREaXIpOwoJY29uc29sZS5sb2coIlVzaW5nOiBlbnlvX2Rpcj0iICsgZW55b0Rpcik7Cgljb25zb2xlLmxvZygiVXNpbmc6IG91dF9kaXI9IiArIG91dERpcik7Cgljb25zb2xlLmxvZygiVXNpbmc6IHBhY2thZ2Vqcz0iICsgcGFja2FnZUpzKTsKCWNvbnNvbGUubG9nKCJVc2luZzogc291cmNlX2Rpcj0iICsgc291cmNlRGlyKTsKCWNvbnNvbGUubG9nKCJVc2luZzogbGVzcz0iICsgbGVzcyk7Cn0KCi8vIHV0aWxzCgpmdW5jdGlvbiBydW4oYXJncykgewoJdmFyIGNvbW1hbmQgPSAnIicgKyBhcmdzLmpvaW4oJyIgIicpICsgJyInOwoJdmFyIHJlcG9ydDsKCWlmICh2ZXJib3NlKSB7CgkJY29uc29sZS5sb2coIlJ1bm5pbmc6ICciLCBjb21tYW5kLCAiJyBmcm9tICciLCBwcm9jZXNzLmN3ZCgpLCAiJyIpOwoJfQoJcmVwb3J0ID0gc2hlbGwuZXhlYyhjb21tYW5kLCB7IHNpbGVudDogdHJ1ZSB9KTsKCWlmIChyZXBvcnQuY29kZSAhPT0gMCkgewoJCXRocm93IG5ldyBFcnJvcigiRmFpbDogJyIgKyBjb21tYW5kICsgIidcbiIgKyByZXBvcnQub3V0cHV0KTsKCX0KfQoKLy8gUHJlcGFyZSB0YXJnZXQgZGlyZWN0b3J5CgpzaGVsbC5ybSgnLXJmJywgcGF0aC5yZXNvbHZlKG91dERpcikpOwpzaGVsbC5ybSgnLXJmJywgcGF0aC5yZXNvbHZlKG91dERpcikpOwpzaGVsbC5ta2RpcignLXAnLCBwYXRoLmpvaW4ob3V0RGlyKSk7CgovLyBCdWlsZCAvIE1pbmlmeQp2YXIgYXJnczsKaWYgKCFvcHQubWFwZnJvbSB8fCBvcHQubWFwZnJvbS5pbmRleE9mKCJlbnlvIikgPCAwKSB7Cgljb25zb2xlLmxvZygiTWluaWZ5LWluZyBFbnlvLi4uIik7Cglwcm9jZXNzLmNoZGlyKHBhdGgucmVzb2x2ZShlbnlvRGlyLCAnbWluaWZ5JykpOwoJYXJncyA9IFtub2RlLCBtaW5pZmllciwKCQknLW5vLWFsaWFzJywKCQknLWVueW8nLCBlbnlvRGlyLAoJCS8vIFhYWCBnZW5lcmF0ZXMgJGJ1aWxkRGlyL2VueW8uKGpzfGNzcyknIHNvIHRoaXMgaXMKCQkvLyBYWFggcmF0aGVyIGFuICdvdXRwdXRfcHJlZml4JyB0aGFuIGFuICdvdXRfZGlyJy4uLgoJCSctb3V0cHV0JywgcGF0aC5qb2luKGJ1aWxkRGlyLCAnZW55bycpLAoJCSdwYWNrYWdlLmpzJ107CglpZiAob3B0Lm1hcGZyb20pIHsKCQlmb3IgKHZhciBpPTA7IGk8b3B0Lm1hcGZyb20ubGVuZ3RoOyBpKyspIHsKCQkJYXJncy5wdXNoKCItZiIsIG9wdC5tYXBmcm9tW2ldLCAiLXQiLCBvcHQubWFwdG9baV0pOwoJCX0KCX0KCXJ1bihhcmdzKTsJCn0gZWxzZSB7Cgljb25zb2xlLmxvZygiU2tpcHBpbmcgRW55byBtaW5pZmljYXRpb24gKHdpbGwgYmUgbWFwcGVkIHRvICIgKyBvcHQubWFwdG9bb3B0Lm1hcGZyb20uaW5kZXhPZigiZW55byIpXSArICIpLiIpOwp9Cgpjb25zb2xlLmxvZygiTWluaWZ5LWluZyB0aGUgYXBwbGljYXRpb24uLi4iKTsKcHJvY2Vzcy5jaGRpcihwYXRoLmRpcm5hbWUocGFja2FnZUpzKSk7CmFyZ3MgPSBbbm9kZSwgbWluaWZpZXIsCiAgICAgJy1lbnlvJywgZW55b0RpciwKICAgICAnLW91dHB1dCcsIHBhdGguam9pbihidWlsZERpciwgJ2FwcCcpLAogICAgIChsZXNzID8gJy1sZXNzJyA6ICctbm8tbGVzcycpLAogICAgICdwYWNrYWdlLmpzJ107CmlmIChvcHQubWFwZnJvbSkgewoJZm9yICh2YXIgaT0wOyBpPG9wdC5tYXBmcm9tLmxlbmd0aDsgaSsrKSB7CgkJYXJncy5wdXNoKCItZiIsIG9wdC5tYXBmcm9tW2ldLCAiLXQiLCBvcHQubWFwdG9baV0pOwoJfQp9CmlmIChvcHQubGliKSB7CglhcmdzLnB1c2goIi1saWIiLCBvcHQubGliKTsKfQpydW4oYXJncyk7CnByb2Nlc3MuY2hkaXIoc291cmNlRGlyKTsKCi8vIERlcGxveSAvIENvcHkKCnNoZWxsLm1rZGlyKCctcCcsIHBhdGguam9pbihvdXREaXIsICdsaWInKSk7CnNoZWxsLmNwKHBhdGguam9pbihzb3VyY2VEaXIsICdpbmRleC5odG1sJyksIHBhdGguam9pbihzb3VyY2VEaXIsICdpY29uLnBuZycpLCBvdXREaXIpOwpzaGVsbC5jcCgnLXInLCBidWlsZERpciwgb3V0RGlyKTsKCnZhciBhc3NldHNTcmNEaXIgPSBwYXRoLmpvaW4oc291cmNlRGlyLCAnYXNzZXRzJyk7CmlmKHNoZWxsLnRlc3QoJy1kJywgYXNzZXRzU3JjRGlyKSkgewoJc2hlbGwuY3AoJy1yJywgYXNzZXRzU3JjRGlyLCBvdXREaXIpOwp9Cgp2YXIgbGliU3JjRGlyID0gcGF0aC5qb2luKHNvdXJjZURpciwgJ2xpYicpOwppZihzaGVsbC50ZXN0KCctZCcsIGxpYlNyY0RpcikpIHsKCXNoZWxsLmxzKGxpYlNyY0RpcikuZm9yRWFjaChkZXBsb3lMaWIpOwp9CgpmdW5jdGlvbiBkZXBsb3lMaWIobGliKSB7CglpZiAob3B0Lm1hcGZyb20gJiYgb3B0Lm1hcGZyb20uaW5kZXhPZigibGliLyIgKyBsaWIpID49IDApIHsKCQkvLyBEb24ndCBkZXBsb3kgbGlicmFyaWVzIHRoYXQgYXJlIGxvYWRlZCBmcm9tIGVsc2V3aGVyZQoJCXJldHVybjsKCX0KCXZhciBsaWJPdXRkaXIgPSBwYXRoLmpvaW4ob3V0RGlyLCAnbGliJywgbGliKTsKCS8vIGxvYWQgJiBleGVjdXRlIHN1Yi0nZGVwbG95LmpzJwoJdHJ5IHsKCQlzY3JpcHQgPSBwYXRoLmpvaW4oc291cmNlRGlyLCAnbGliJywgbGliLCAnZGVwbG95LmpzJyk7CgkJc3RhdCA9IGZzLnN0YXRTeW5jKHNjcmlwdCk7CgkJaWYgKCFzdGF0LmlzRmlsZSgpKSB7CgkJCXRocm93IG5ldyBFcnJvcigiKioqIE5vdCBhIGZpbGU6ICciICsgc2NyaXB0ICsgIiciKTsKCQl9CgkJc2NyaXB0c1tsaWJdID0gcmVxdWlyZShzY3JpcHQpOwoJCXNjcmlwdHNb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment