{"appearance":{"background":"white","padding":14,"font":{"family":"Courier New","size":10.0,"bold":false,"italic":false,"underline":false,"strikeout":false,"color":"rgb(0,72,168)"},"border":{"on":true,"size":0.0,"style":"solid","color":"#666"},"text":{"wrap":false,"hAlign":"left","vAlign":"top"}},"outputType":"WIDGET","widgetState":null,"outputs":{"console":"<pre class='debug-source'>&gt;library(flipTrees)\n</pre>\n<pre class='debug-source'>&gt;data &lt;- data.frame(preferredCola, Q28, gender, Age)\n</pre>\n<pre class='debug-source'>&gt;cart &lt;- CART(preferredCola ~ Q28 + gender + Age, data = data, weights = QCalibratedWeight, missing = formMissing, subset = QFilter, output = formOutput)\n</pre>","htmlwidgets":"<div id=\"htmlwidget_container\">\n <div id=\"htmlwidget-22478f51d036ac3c410c\" style=\"width:960px;height:500px;\" class=\"rhtmlSankeyTree html-widget\"></div>\n</div>\n<script type=\"application/json\" data-for=\"htmlwidget-22478f51d036ac3c410c\">{\"x\":{\"data\":{\"treeType\":\"Classification\",\"categoryLegend\":[\"Q28: Lot:Lots; Wee:Week; Mon:Month; Nev:Never\",\"gender: Mal:Male; Fem:Female\",\"Age: 18 :18 to 29; 30 :30 to 39; 40 :40 to 44; 45 :45 to 49; 50 :50 to 54; 55 :55 to 64; 65OrMo:65 or more\"],\"name\":\"preferredCola\",\"n\":322,\"Percentage\":\"100%\",\"id\":1,\"Description\":\"Description: <br>44% Coca-Cola<br>11% Diet Coke<br>19% Coke Zero<br>9% Pepsi <br>3% Pepsi Light <br>14% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 322<br>Description: <br>44% Coca-Cola<br>11% Diet Coke<br>19% Coke Zero<br>9% Pepsi <br>3% Pepsi Light <br>14% Pepsi Max<br>0% Missing\",\"color\":\"#CC9875\",\"nodeDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"\",\"children\":[{\"name\":\"Age: 18 30 50 \",\"n\":190,\"Percentage\":\"59%\",\"id\":2,\"Description\":\"Description: <br>53% Coca-Cola<br>9% Diet Coke<br>19% Coke Zero<br>6% Pepsi <br>1% Pepsi Light <br>12% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 190<br>Description: <br>53% Coca-Cola<br>9% Diet Coke<br>19% Coke Zero<br>6% Pepsi <br>1% Pepsi Light <br>12% Pepsi Max<br>0% Missing\",\"color\":\"#CC8A5D\",\"nodeDistribution\":[0.526315789473684,0.0894736842105263,0.194736842105263,0.0578947368421053,0.0105263157894737,0.121052631578947,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"\",\"children\":[{\"name\":\"Q28: Lot Wee Nev\",\"n\":143,\"Percentage\":\"44%\",\"id\":4,\"Description\":\"Description: <br>55% Coca-Cola<br>8% Diet Coke<br>19% Coke Zero<br>3% Pepsi <br>1% Pepsi Light <br>15% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 143<br>Description: <br>55% Coca-Cola<br>8% Diet Coke<br>19% Coke Zero<br>3% Pepsi <br>1% Pepsi Light <br>15% Pepsi Max<br>0% Missing\",\"color\":\"#CC8657\",\"nodeDistribution\":[0.545454545454545,0.0769230769230769,0.188811188811189,0.034965034965035,0.00699300699300699,0.146853146853147,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"Highest = Coca-Cola\"},{\"name\":\"Q28: Mon\",\"n\":47,\"Percentage\":\"15%\",\"id\":5,\"Description\":\"Description: <br>47% Coca-Cola<br>13% Diet Coke<br>21% Coke Zero<br>13% Pepsi <br>2% Pepsi Light <br>4% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 47<br>Description: <br>47% Coca-Cola<br>13% Diet Coke<br>21% Coke Zero<br>13% Pepsi <br>2% Pepsi Light <br>4% Pepsi Max<br>0% Missing\",\"color\":\"#CC946E\",\"nodeDistribution\":[0.468085106382979,0.127659574468085,0.212765957446809,0.127659574468085,0.0212765957446809,0.0425531914893617,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"Highest = Coca-Cola\"}]},{\"name\":\"Age: 40 45 55 65OrMo\",\"n\":132,\"Percentage\":\"41%\",\"id\":3,\"Description\":\"Description: <br>33% Coca-Cola<br>15% Diet Coke<br>18% Coke Zero<br>13% Pepsi <br>5% Pepsi Light <br>16% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 132<br>Description: <br>33% Coca-Cola<br>15% Diet Coke<br>18% Coke Zero<br>13% Pepsi <br>5% Pepsi Light <br>16% Pepsi Max<br>0% Missing\",\"color\":\"#CCAC97\",\"nodeDistribution\":[0.325757575757576,0.151515151515152,0.181818181818182,0.128787878787879,0.053030303030303,0.159090909090909,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"\",\"children\":[{\"name\":\"Q28: Lot Wee\",\"n\":87,\"Percentage\":\"27%\",\"id\":6,\"Description\":\"Description: <br>23% Coca-Cola<br>20% Diet Coke<br>20% Coke Zero<br>13% Pepsi <br>8% Pepsi Light <br>17% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 87<br>Description: <br>23% Coca-Cola<br>20% Diet Coke<br>20% Coke Zero<br>13% Pepsi <br>8% Pepsi Light <br>17% Pepsi Max<br>0% Missing\",\"color\":\"#CCBDB3\",\"nodeDistribution\":[0.229885057471264,0.195402298850575,0.195402298850575,0.126436781609195,0.0804597701149425,0.172413793103448,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"\",\"children\":[{\"name\":\"gender: Mal\",\"n\":52,\"Percentage\":\"16%\",\"id\":12,\"Description\":\"Description: <br>27% Coca-Cola<br>15% Diet Coke<br>17% Coke Zero<br>15% Pepsi <br>2% Pepsi Light <br>23% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 52<br>Description: <br>27% Coca-Cola<br>15% Diet Coke<br>17% Coke Zero<br>15% Pepsi <br>2% Pepsi Light <br>23% Pepsi Max<br>0% Missing\",\"color\":\"#CCB6A7\",\"nodeDistribution\":[0.269230769230769,0.153846153846154,0.173076923076923,0.153846153846154,0.0192307692307692,0.230769230769231,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"Highest = Coca-Cola\"},{\"name\":\"gender: Fem\",\"n\":35,\"Percentage\":\"11%\",\"id\":13,\"Description\":\"Description: <br>17% Coca-Cola<br>26% Diet Coke<br>23% Coke Zero<br>9% Pepsi <br>17% Pepsi Light <br>9% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 35<br>Description: <br>17% Coca-Cola<br>26% Diet Coke<br>23% Coke Zero<br>9% Pepsi <br>17% Pepsi Light <br>9% Pepsi Max<br>0% Missing\",\"color\":\"#B4C1CC\",\"nodeDistribution\":[0.171428571428571,0.257142857142857,0.228571428571429,0.0857142857142857,0.171428571428571,0.0857142857142857,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"\",\"children\":[{\"name\":\"Age: 40 45 \",\"n\":14,\"Percentage\":\"4%\",\"id\":26,\"Description\":\"Description: <br>0% Coca-Cola<br>36% Diet Coke<br>21% Coke Zero<br>21% Pepsi <br>14% Pepsi Light <br>7% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 14<br>Description: <br>0% Coca-Cola<br>36% Diet Coke<br>21% Coke Zero<br>21% Pepsi <br>14% Pepsi Light <br>7% Pepsi Max<br>0% Missing\",\"color\":\"#9FB7CC\",\"nodeDistribution\":[0,0.357142857142857,0.214285714285714,0.214285714285714,0.142857142857143,0.0714285714285714,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"Highest = Diet Coke\"},{\"name\":\"Age: 55 65OrMo\",\"n\":21,\"Percentage\":\"7%\",\"id\":27,\"Description\":\"Description: <br>29% Coca-Cola<br>19% Diet Coke<br>24% Coke Zero<br>0% Pepsi <br>19% Pepsi Light <br>10% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 21<br>Description: <br>29% Coca-Cola<br>19% Diet Coke<br>24% Coke Zero<br>0% Pepsi <br>19% Pepsi Light <br>10% Pepsi Max<br>0% Missing\",\"color\":\"#CCB3A3\",\"nodeDistribution\":[0.285714285714286,0.19047619047619,0.238095238095238,0,0.19047619047619,0.0952380952380952,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"Highest = Coca-Cola\"}]}]},{\"name\":\"Q28: Mon Nev\",\"n\":45,\"Percentage\":\"14%\",\"id\":7,\"Description\":\"Description: <br>51% Coca-Cola<br>7% Diet Coke<br>16% Coke Zero<br>13% Pepsi <br>0% Pepsi Light <br>13% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 45<br>Description: <br>51% Coca-Cola<br>7% Diet Coke<br>16% Coke Zero<br>13% Pepsi <br>0% Pepsi Light <br>13% Pepsi Max<br>0% Missing\",\"color\":\"#CC8C61\",\"nodeDistribution\":[0.511111111111111,0.0666666666666667,0.155555555555556,0.133333333333333,0,0.133333333333333,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"\",\"children\":[{\"name\":\"Age: 40 45 \",\"n\":25,\"Percentage\":\"8%\",\"id\":14,\"Description\":\"Description: <br>36% Coca-Cola<br>8% Diet Coke<br>24% Coke Zero<br>24% Pepsi <br>0% Pepsi Light <br>8% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 25<br>Description: <br>36% Coca-Cola<br>8% Diet Coke<br>24% Coke Zero<br>24% Pepsi <br>0% Pepsi Light <br>8% Pepsi Max<br>0% Missing\",\"color\":\"#CCA68D\",\"nodeDistribution\":[0.36,0.08,0.24,0.24,0,0.08,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"Highest = Coca-Cola\"},{\"name\":\"Age: 55 65OrMo\",\"n\":20,\"Percentage\":\"6%\",\"id\":15,\"Description\":\"Description: <br>70% Coca-Cola<br>5% Diet Coke<br>5% Coke Zero<br>0% Pepsi <br>0% Pepsi Light <br>20% Pepsi Max<br>0% Missing\",\"tooltip\":\"n: 20<br>Description: <br>70% Coca-Cola<br>5% Diet Coke<br>5% Coke Zero<br>0% Pepsi <br>0% Pepsi Light <br>20% Pepsi Max<br>0% Missing\",\"color\":\"#CC6C2A\",\"nodeDistribution\":[0.7,0.05,0.05,0,0,0.2,0],\"overallDistribution\":[0.444099378881988,0.114906832298137,0.18944099378882,0.0869565217391304,0.0279503105590062,0.136645962732919,0],\"nodeVariables\":[\"Coca-Cola\",\"Diet Coke\",\"Coke Zero\",\"Pepsi \",\"Pepsi Light \",\"Pepsi Max\",\"Missing\"],\"terminalDescription\":\"Highest = Coca-Cola\"}]}]}]},\"opts\":{\"name\":\"name\",\"id\":\"id\",\"value\":\"n\",\"childrenName\":\"children\",\"treeColors\":false,\"maxLabelLength\":null,\"nodeHeight\":100,\"categoryLegend\":false,\"terminalDescription\":true,\"numericDistribution\":true,\"tooltip\":\"tooltip\"}},\"evals\":[],\"jsHooks\":[]}</script>\n<script type=\"application/htmlwidget-sizing\" data-for=\"htmlwidget-22478f51d036ac3c410c\">{\"viewer\":{\"width\":450,\"height\":350,\"padding\":5,\"fill\":true},\"browser\":{\"width\":960,\"height\":500,\"padding\":5,\"fill\":true}}</script>","htmlwidget-head":"data:text/javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHt9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyBzaG93bi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGlvc2xpZGVzLCB3aGljaAogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLgogICAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBub3QgaGF2ZSB0byBoYXZlIGlvc2xpZGUtc3BlY2lmaWMgY29kZQogICAgICAgICAgLy8gaGVyZSwgYnV0IHJhdGhlciBoYXZlIGlvc2xpZGVzIHJhaXNlIGEgZ2VuZXJpYyBldmVudCwKICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlCiAgICAgICAgICAvLyB3aW5kb3cgdG8gZ2V0dGluZyB0aGF0IGZpeGVkIG1heSBiZSBsb25nLgogICAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBicm93c2VycyBiZWNhdXNlIGlvc2xpZGVzIGl0c2VsZiBvbmx5IHN1cHBvcnRzCiAgICAgICAgICAgIC8vIHN1Y2ggYnJvd3NlcnMuCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlbGVhdmUiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBkYXRhLmV2YWxzICYmIGsgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNba10pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZy5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBpbml0UmVzdWx0KTsKICAgICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgaW5pdFJlc3VsdCwgW2VsLCBkYXRhLnhdKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCk7CiAgfQoKICAvLyBXYWl0IHVudGlsIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIHRvIHJlbmRlciB0aGUgd2lkZ2V0cy4KICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYXJndW1lbnRzLmNhbGxlZSwgZmFsc2UpOwogICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICB9LCBmYWxzZSk7CiAgfSBlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgewogICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgewogICAgICAgIGRvY3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0KCgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRBdHRhY2htZW50VXJsID0gZnVuY3Rpb24oZGVwbmFtZSwga2V5KSB7CiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0KICAgIGlmICh0eXBlb2Yoa2V5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgIGtleSA9IDE7CgogICAgdmFyIGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZXBuYW1lICsgIi0iICsga2V5ICsgIi1hdHRhY2htZW50Iik7CiAgICBpZiAoIWxpbmspIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsKICAgIH0KICAgIHJldHVybiBsaW5rLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzID0gZnVuY3Rpb24oZGYpIHsKICAgIHZhciBuYW1lcyA9IFtdOwogICAgdmFyIGxlbmd0aDsKICAgIGZvciAodmFyIG5hbWUgaW4gZGYpIHsKICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpCiAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7CiAgICAgICAgaWYgKHR5cGVvZihkZltuYW1lXSkgIT09ICJvYmplY3QiIHx8IHR5cGVvZihkZltuYW1lXS5sZW5ndGgpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihsZW5ndGgpICE9PSAidW5kZWZpbmVkIiAmJiBsZW5ndGggIT09IGRmW25hbWVdLmxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7CiAgICAgICAgfQogICAgICAgIGxlbmd0aCA9IGRmW25hbWVdLmxlbmd0aDsKICAgIH0KICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgaXRlbTsKICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IGxlbmd0aDsgcm93KyspIHsKICAgICAgICBpdGVtID0ge307CiAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgbmFtZXMubGVuZ3RoOyBjb2wrKykgewogICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1dID0gZGZbbmFtZXNbY29sXV1bcm93XTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZW0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgewogICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gYXJyYXk7CiAgICAgIHZhciBuZXdBcnJheSA9IGFycmF5WzBdLm1hcChmdW5jdGlvbihjb2wsIGkpIHsKICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJvd1tpXQogICAgICAgICAgfSkKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXdBcnJheTsKICB9OwogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkCiAgLy8gdXNpbmcgZXNjYXBlQ2hhci4gQW55IG90aGVyIGNoYXJhY3RlcnMgZXNjYXBlZCBieSBlc2NhcGVDaGFyCiAgLy8gd2lsbCBiZSBpbmNsdWRlZCBhcyB1c3VhbCAoaW5jbHVkaW5nIGVzY2FwZUNoYXIgaXRzZWxmKS4KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOwogICAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgdmFsdWUubGVuZ3RoOyBwb3MrKykgewogICAgICBpZiAoIWVzY2FwZU1vZGUpIHsKICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7CiAgICAgICAgICBlc2NhcGVNb2RlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoY3VycmVudFJlc3VsdCAhPT0gIiIpIHsKICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUKICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIgPSBmdW5jdGlvbihvLCBtZW1iZXIpIHsKICAgIHZhciBwYXJ0cyA9IHNwbGl0V2l0aEVzY2FwZShtZW1iZXIsICcuJywgJ1xcJyk7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOwogICAgICAvLyBwYXJ0IG1heSBiZSBhIGNoYXJhY3RlciBvciAnbnVtZXJpYycgbWVtYmVyIG5hbWUKICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgewogICAgICAgIGlmIChpID09IChsIC0gMSkpIHsgLy8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgdGhlbiBldmFsdWxhdGUKICAgICAgICAgIGlmICh0eXBlb2Ygb1twYXJ0XSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOwogICAgICAgIH0gZWxzZSB7IC8vIG90aGVyd2lzZSBjb250aW51ZSB0byBuZXh0IGVtYmVkZGVkIG9iamVjdAogICAgICAgICAgbyA9IG9bcGFydF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgLy8gUmV0cmlldmUgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZiBhbgogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZS4KICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbihlbCkgewogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsKICB9OwoKICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwKICAvLyBhbmQgcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUKICAvLyBzZWxlY3Rvciwgb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgaGFzIG5vIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBlbCA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgaWYgKGVsID09PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7CiAgICB9CiAgfTsKCiAgLy8gRmluZHMgYWxsIGVsZW1lbnRzIGluIHRoZSBzY29wZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciwgYW5kCiAgLy8gcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZXMgKGkuZS4gdGhlIHJldHVybiB2YWx1ZXMgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudHMsIGluIGFuIGFycmF5LiBJZiBlbGVtZW50cyB0aGF0CiAgLy8gbWF0Y2ggdGhlIHNlbGVjdG9yIGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgIHZhciByZXN1bHRzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHZhciBwb3N0UmVuZGVySGFuZGxlcnMgPSBbXTsKICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7CiAgICB3aGlsZSAocG9zdFJlbmRlckhhbmRsZXJzLmxlbmd0aCkgewogICAgICB2YXIgaGFuZGxlciA9IHBvc3RSZW5kZXJIYW5kbGVycy5zaGlmdCgpOwogICAgICBpZiAoaGFuZGxlcikgewogICAgICAgIGhhbmRsZXIoKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlCiAgLy8gbmV4dCB0aW1lIHN0YXRpYyB3aWRnZXRzIGFyZSByZW5kZXJlZC4KICB3aW5kb3cuSFRNTFdpZGdldHMuYWRkUG9zdFJlbmRlckhhbmRsZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOwogIH07CgogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuCiAgLy8gb2xkLXN0eWxlIGNsYXNzLWJvdW5kIGRlZmluaXRpb24uIFRoaXMgc2F2ZXMgdXMgZnJvbSBoYXZpbmcKICAvLyB0byByZXdyaXRlIGFsbCB0aGUgbG9naWMgaW4gdGhpcyBmaWxlIHRvIGFjY29tb2RhdGUgYm90aAogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLgogIGZ1bmN0aW9uIGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZm4pIHsKICAgIHZhciByZXN1bHQgPSB7CiAgICAgIG5hbWU6IGRlZm4ubmFtZSwKICAgICAgdHlwZTogZGVmbi50eXBlLAogICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOwogICAgICB9LAogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOwogICAgICB9LAogICAgICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgIH0KICAgIH07CgogICAgaWYgKGRlZm4uZmluZCkKICAgICAgcmVzdWx0LmZpbmQgPSBkZWZuLmZpbmQ7CiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikKICAgICAgcmVzdWx0LnJlbmRlckVycm9yID0gZGVmbi5yZW5kZXJFcnJvcjsKICAgIGlmIChkZWZuLmNsZWFyRXJyb3IpCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9KSgpOwo=\ndata:text/javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKG4ub3duZXJEb2N1bWVudHx8bi5kb2N1bWVudHx8bikuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIHQobil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnQmJm4ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8bi5kb2N1bWVudCYmbnx8bi5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gZShuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiByKG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gdShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gaShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiBvKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBjKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGwoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBzKG4pe3JldHVybihuKz0iIik9PT1wYXx8blswXT09PXZhP3ZhK246bn1mdW5jdGlvbiBmKG4pe3JldHVybihuKz0iIilbMF09PT12YT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gaChuKXtyZXR1cm4gcyhuKWluIHRoaXMuX31mdW5jdGlvbiBnKG4pe3JldHVybihuPXMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIHAoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChmKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiB2KCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBkKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24geShuKXtyZXR1cm4gbn1mdW5jdGlvbiBNKG4sdCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gcj09PXQ/bjpyfX1mdW5jdGlvbiB4KG4sdCl7aWYodCBpbiBuKXJldHVybiB0O3Q9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Zvcih2YXIgZT0wLHI9ZGEubGVuZ3RoO3I+ZTsrK2Upe3ZhciB1PWRhW2VdK3Q7aWYodSBpbiBuKXJldHVybiB1fX1mdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gdyhuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSx1PS0xLGk9ci5sZW5ndGg7Kyt1PGk7KSh0PXJbdV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBsO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsdSl7dmFyIGksbz1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP28mJm8ub246KG8mJihvLm9uPW51bGwsZT1lLnNsaWNlKDAsaT1lLmluZGV4T2YobykpLmNvbmNhdChlLnNsaWNlKGkrMSkpLHIucmVtb3ZlKHQpKSx1JiZlLnB1c2goci5zZXQodCx7b246dX0pKSxuKX0sdH1mdW5jdGlvbiBTKCl7dGEuZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBrKCl7Zm9yKHZhciBuLHQ9dGEuZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gRShuKXtmb3IodmFyIHQ9bmV3IF8sZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPXcodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dHJ5e3ZhciBpPXUuc291cmNlRXZlbnQ9dGEuZXZlbnQ7dS50YXJnZXQ9bix0YS5ldmVudD11LHRbdS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7dGEuZXZlbnQ9aX19fSx0fWZ1bmN0aW9uIEEobil7cmV0dXJuIHlhKG4sX2EpLG59ZnVuY3Rpb24gTihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIE1hKG4sdGhpcyl9fWZ1bmN0aW9uIEMobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiB4YShuLHRoaXMpfX1mdW5jdGlvbiB6KG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIG8oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gYSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPXRhLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP2E6bzpuLmxvY2FsP2k6dX1mdW5jdGlvbiBxKG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIEwobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK3RhLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gVChuKXtyZXR1cm4obisiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIobix0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPS0xOysrZTx1OyluW2VdKHRoaXMsdCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgZT0tMSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrZTx1OyluW2VdKHRoaXMscil9bj1UKG4pLm1hcChEKTt2YXIgdT1uLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9yOmV9ZnVuY3Rpb24gRChuKXt2YXIgdD1MKG4pO3JldHVybiBmdW5jdGlvbihlLHIpe2lmKHU9ZS5jbGFzc0xpc3QpcmV0dXJuIHI/dS5hZGQobik6dS5yZW1vdmUobik7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO3I/KHQubGFzdEluZGV4PTAsdC50ZXN0KHUpfHxlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodSsiICIrbikpKTplLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodS5yZXBsYWNlKHQsIiAiKSkpfX1mdW5jdGlvbiBQKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHQsZSl9ZnVuY3Rpb24gaSgpe3ZhciByPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4scixlKX1yZXR1cm4gbnVsbD09dD9yOiJmdW5jdGlvbiI9PXR5cGVvZiB0P2k6dX1mdW5jdGlvbiBVKG4sdCl7ZnVuY3Rpb24gZSgpe2RlbGV0ZSB0aGlzW25dfWZ1bmN0aW9uIHIoKXt0aGlzW25dPXR9ZnVuY3Rpb24gdSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbbl06dGhpc1tuXT1lfXJldHVybiBudWxsPT10P2U6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dTpyfWZ1bmN0aW9uIGoobil7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlP3QuY3JlYXRlRWxlbWVudE5TKGUsbik6dC5jcmVhdGVFbGVtZW50KG4pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49dGEubnMucXVhbGlmeShuKSkubG9jYWw/ZTp0fWZ1bmN0aW9uIEYoKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBIKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBPKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiYSh0aGlzLG4pfX1mdW5jdGlvbiBJKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwobj1lKSxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP24odC5fX2RhdGFfXyxlLl9fZGF0YV9fKTohdC0hZX19ZnVuY3Rpb24gWShuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLG89MCxhPWkubGVuZ3RoO2E+bztvKyspKHU9aVtvXSkmJnQodSxvLGUpO3JldHVybiBufWZ1bmN0aW9uIFoobil7cmV0dXJuIHlhKG4sU2EpLG59ZnVuY3Rpb24gVihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIG8sYT1uW2ldLnVwZGF0ZSxjPWEubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsxKTshKG89YVt0XSkmJisrdDxjOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFgobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW29dO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIHUoKXt2YXIgdT1jKHQscmEoYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbb109dSx1LiQ9ZSksdS5fPXR9ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIit0YS5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgdT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHUsdS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIG89Il9fb24iK24sYT1uLmluZGV4T2YoIi4iKSxjPSQ7YT4wJiYobj1uLnNsaWNlKDAsYSkpO3ZhciBsPWthLmdldChuKTtyZXR1cm4gbCYmKG49bCxjPUIpLGE/dD91OnI6dD9iOml9ZnVuY3Rpb24gJChuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj10YS5ldmVudDt0YS5ldmVudD1lLHRbMF09dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7dGEuZXZlbnQ9cn19fWZ1bmN0aW9uIEIobix0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMscj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gVyhlKXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK0FhLHU9ImNsaWNrIityLGk9dGEuc2VsZWN0KHQoZSkpLm9uKCJ0b3VjaG1vdmUiK3IsUykub24oImRyYWdzdGFydCIrcixTKS5vbigic2VsZWN0c3RhcnQiK3IsUyk7aWYobnVsbD09RWEmJihFYT0ib25zZWxlY3RzdGFydCJpbiBlPyExOngoZS5zdHlsZSwidXNlclNlbGVjdCIpKSxFYSl7dmFyIG89bihlKS5zdHlsZSxhPW9bRWFdO29bRWFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24obil7aWYoaS5vbihyLG51bGwpLEVhJiYob1tFYV09YSksbil7dmFyIHQ9ZnVuY3Rpb24oKXtpLm9uKHUsbnVsbCl9O2kub24odSxmdW5jdGlvbigpe1MoKSx0KCl9LCEwKSxzZXRUaW1lb3V0KHQsMCl9fX1mdW5jdGlvbiBKKG4sZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIHU9ci5jcmVhdGVTVkdQb2ludCgpO2lmKDA+TmEpe3ZhciBpPXQobik7aWYoaS5zY3JvbGxYfHxpLnNjcm9sbFkpe3I9dGEuc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgbz1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO05hPSEoby5mfHxvLmUpLHIucmVtb3ZlKCl9fXJldHVybiBOYT8odS54PWUucGFnZVgsdS55PWUucGFnZVkpOih1Lng9ZS5jbGllbnRYLHUueT1lLmNsaWVudFkpLHU9dS5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFt1LngsdS55XX12YXIgYT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtYS5sZWZ0LW4uY2xpZW50TGVmdCxlLmNsaWVudFktYS50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEcoKXtyZXR1cm4gdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBLKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xPzA6LTE+bj9xYTpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gdHQobil7cmV0dXJuIG4+MT9SYTotMT5uPy1SYTpNYXRoLmFzaW4obil9ZnVuY3Rpb24gZXQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKS0xL24pLzJ9ZnVuY3Rpb24gcnQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKSsxL24pLzJ9ZnVuY3Rpb24gdXQobil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIGl0KG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gb3QoKXt9ZnVuY3Rpb24gYXQobix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgYXQ/KHRoaXMuaD0rbix0aGlzLnM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGF0P25ldyBhdChuLmgsbi5zLG4ubCk6YnQoIiIrbixfdCxhdCk6bmV3IGF0KG4sdCxlKX1mdW5jdGlvbiBjdChuLHQsZSl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gbj4zNjA/bi09MzYwOjA+biYmKG4rPTM2MCksNjA+bj9pKyhvLWkpKm4vNjA6MTgwPm4/bzoyNDA+bj9pKyhvLWkpKigyNDAtbikvNjA6aX1mdW5jdGlvbiB1KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSpyKG4pKX12YXIgaSxvO3JldHVybiBuPWlzTmFOKG4pPzA6KG4lPTM2MCk8MD9uKzM2MDpuLHQ9aXNOYU4odCk/MDowPnQ/MDp0PjE/MTp0LGU9MD5lPzA6ZT4xPzE6ZSxvPS41Pj1lP2UqKDErdCk6ZSt0LWUqdCxpPTIqZS1vLG5ldyBtdCh1KG4rMTIwKSx1KG4pLHUobi0xMjApKX1mdW5jdGlvbiBsdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBsdD8odGhpcy5oPStuLHRoaXMuYz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbHQ/bmV3IGx0KG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgZnQ/Z3Qobi5sLG4uYSxuLmIpOmd0KChuPXd0KChuPXRhLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpuZXcgbHQobix0LGUpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxuZXcgZnQoZSxNYXRoLmNvcyhuKj1EYSkqdCxNYXRoLnNpbihuKSp0KX1mdW5jdGlvbiBmdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBmdD8odGhpcy5sPStuLHRoaXMuYT0rdCx2b2lkKHRoaXMuYj0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgZnQ/bmV3IGZ0KG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2YgbHQ/c3Qobi5oLG4uYyxuLmwpOnd0KChuPW10KG4pKS5yLG4uZyxuLmIpOm5ldyBmdChuLHQsZSl9ZnVuY3Rpb24gaHQobix0LGUpe3ZhciByPShuKzE2KS8xMTYsdT1yK3QvNTAwLGk9ci1lLzIwMDtyZXR1cm4gdT1wdCh1KSpYYSxyPXB0KHIpKiRhLGk9cHQoaSkqQmEsbmV3IG10KGR0KDMuMjQwNDU0Mip1LTEuNTM3MTM4NSpyLS40OTg1MzE0KmkpLGR0KC0uOTY5MjY2KnUrMS44NzYwMTA4KnIrLjA0MTU1NippKSxkdCguMDU1NjQzNCp1LS4yMDQwMjU5KnIrMS4wNTcyMjUyKmkpKX1mdW5jdGlvbiBndChuLHQsZSl7cmV0dXJuIG4+MD9uZXcgbHQoTWF0aC5hdGFuMihlLHQpKlBhLE1hdGguc3FydCh0KnQrZSplKSxuKTpuZXcgbHQoMC8wLDAvMCxuKX1mdW5jdGlvbiBwdChuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihuLTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3cobiwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiBkdChuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiBtdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBtdD8odGhpcy5yPX5+bix0aGlzLmc9fn50LHZvaWQodGhpcy5iPX5+ZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbXQ/bmV3IG10KG4ucixuLmcsbi5iKTpidCgiIituLG10LGN0KTpuZXcgbXQobix0LGUpfWZ1bmN0aW9uIHl0KG4pe3JldHVybiBuZXcgbXQobj4+MTYsbj4+OCYyNTUsMjU1Jm4pfWZ1bmN0aW9uIE10KG4pe3JldHVybiB5dChuKSsiIn1mdW5jdGlvbiB4dChuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBidChuLHQsZSl7bj1uLnRvTG93ZXJDYXNlKCk7dmFyIHIsdSxpLG89MCxhPTAsYz0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvLmV4ZWMobikpc3dpdGNoKHU9clsyXS5zcGxpdCgiLCIpLHJbMV0pe2Nhc2UiaHNsIjpyZXR1cm4gZShwYXJzZUZsb2F0KHVbMF0pLHBhcnNlRmxvYXQodVsxXSkvMTAwLHBhcnNlRmxvYXQodVsyXSkvMTAwKTtjYXNlInJnYiI6cmV0dXJuIHQoa3QodVswXSksa3QodVsxXSksa3QodVsyXSkpfXJldHVybihpPUdhLmdldChuKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gX3Qobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgYXQocix1LGMpfWZ1bmN0aW9uIHd0KG4sdCxlKXtuPVN0KG4pLHQ9U3QodCksZT1TdChlKTt2YXIgcj12dCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL1hhKSx1PXZ0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS8kYSksaT12dCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvQmEpO3JldHVybiBmdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiBTdChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBrdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIEV0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIHZvaWQgby5lcnJvci5jYWxsKGkscil9by5sb2FkLmNhbGwoaSxuKX1lbHNlIG8uZXJyb3IuY2FsbChpLGMpfXZhciBpPXt9LG89dGEuZGlzcGF0Y2goImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGE9e30sYz1uZXcgWE1MSHR0cFJlcXVlc3QsbD1udWxsO3JldHVybiF0aGlzLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXRhLmV2ZW50O3RhLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7dGEuZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KHJhKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSx0YS5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChDdChyKSl9ZnVuY3Rpb24gQ3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcXQoKXt2YXIgbj1MdCgpLHQ9VHQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KHRjKSx0Yz1zZXRUaW1lb3V0KHF0LHQpKSxuYz0wKToobmM9MSxyYyhxdCkpfWZ1bmN0aW9uIEx0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3IoZWM9S2E7ZWM7KW4+PWVjLnQmJihlYy5mPWVjLmMobi1lYy50KSksZWM9ZWMubjtyZXR1cm4gbn1mdW5jdGlvbiBUdCgpe2Zvcih2YXIgbix0PUthLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjpLYT10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIFFhPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMypnYSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTp5O3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1pYy5leGVjKG4pLHI9ZVsxXXx8IiAiLG89ZVsyXXx8Ij4iLGE9ZVszXXx8Ii0iLGM9ZVs0XXx8IiIsbD1lWzVdLHM9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0iIixtPSExLHk9ITA7c3dpdGNoKGgmJihoPStoLnN1YnN0cmluZygxKSksKGx8fCIwIj09PXImJiI9Ij09PW8pJiYobD1yPSIwIixvPSI9IiksZyl7Y2FzZSJuIjpmPSEwLGc9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsZD0iJSIsZz0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxkPSIlIixnPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWMmJih2PSIwIitnLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOm09ITAsaD0wO2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1jJiYodj11WzBdLGQ9dVsxXSksInIiIT1nfHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9b2MuZ2V0KGcpfHxVdDt2YXIgTT1sJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4lMSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOiItIj09PWE/IiI6YTtpZigwPnApe3ZhciBjPXRhLmZvcm1hdFByZWZpeChuLGgpO249Yy5zY2FsZShuKSxlPWMuc3ltYm9sK2R9ZWxzZSBuKj1wO249ZyhuLGgpO3ZhciB4LGIsXz1uLmxhc3RJbmRleE9mKCIuIik7aWYoMD5fKXt2YXIgdz15P24ubGFzdEluZGV4T2YoImUiKTotMTswPnc/KHg9bixiPSIiKTooeD1uLnN1YnN0cmluZygwLHcpLGI9bi5zdWJzdHJpbmcodykpfWVsc2UgeD1uLnN1YnN0cmluZygwLF8pLGI9dCtuLnN1YnN0cmluZyhfKzEpOyFsJiZmJiYoeD1pKHgsMS8wKSk7dmFyIFM9di5sZW5ndGgreC5sZW5ndGgrYi5sZW5ndGgrKE0/MDp1Lmxlbmd0aCksaz1zPlM/bmV3IEFycmF5KFM9cy1TKzEpLmpvaW4ocik6IiI7cmV0dXJuIE0mJih4PWkoayt4LGsubGVuZ3RoP3MtYi5sZW5ndGg6MS8wKSksdSs9dixuPXgrYiwoIjwiPT09bz91K24razoiPiI9PT1vP2srdStuOiJeIj09PW8/ay5zdWJzdHJpbmcoMCxTPj49MSkrdStuK2suc3Vic3RyaW5nKFMpOnUrKE0/bjprK24pKStlfX19ZnVuY3Rpb24gVXQobil7cmV0dXJuIG4rIiJ9ZnVuY3Rpb24ganQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIEZ0KG4sdCxlKXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBjYyhlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixlKXtyZXR1cm4gdChuPW5ldyBjYygrbiksZSksbn1mdW5jdGlvbiBvKG4scixpKXt2YXIgbz11KG4pLGE9W107aWYoaT4xKWZvcig7cj5vOyllKG8pJWl8fGEucHVzaChuZXcgRGF0ZSgrbykpLHQobywxKTtlbHNlIGZvcig7cj5vOylhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7cmV0dXJuIGF9ZnVuY3Rpb24gYShuLHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPW4sbyhyLHQsZSl9ZmluYWxseXtjYz1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0PWksbi5yYW5nZT1vO3ZhciBjPW4udXRjPUh0KG4pO3JldHVybiBjLmZsb29yPWMsYy5yb3VuZD1IdChyKSxjLmNlaWw9SHQodSksYy5vZmZzZXQ9SHQoaSksYy5yYW5nZT1hLG59ZnVuY3Rpb24gSHQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPXQsbihyLGUpLl99ZmluYWxseXtjYz1EYXRlfX19ZnVuY3Rpb24gT3Qobil7ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksbz1bXSxhPS0xLGM9MDsrK2E8cjspMzc9PT1uLmNoYXJDb2RlQXQoYSkmJihvLnB1c2gobi5zbGljZShjLGEpKSxudWxsIT0odT1zY1tlPW4uY2hhckF0KCsrYSldKSYmKGU9bi5jaGFyQXQoKythKSksKGk9TltlXSkmJihlPWkodCxudWxsPT11PyJlIj09PWU/IiAiOiIwIjp1KSksby5wdXNoKGUpLGM9YSsxKTtyZXR1cm4gby5wdXNoKG4uc2xpY2UoYyxhKSksby5qb2luKCIiKX12YXIgcj1uLmxlbmd0aDtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbih0KXt2YXIgcj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH0sdT1lKHIsbix0LDApO2lmKHUhPXQubGVuZ3RoKXJldHVybiBudWxsOyJwImluIHImJihyLkg9ci5IJTEyKzEyKnIucCk7dmFyIGk9bnVsbCE9ci5aJiZjYyE9PWp0LG89bmV3KGk/anQ6Y2MpO3JldHVybiJqImluIHI/by5zZXRGdWxsWWVhcihyLnksMCxyLmopOiJ3ImluIHImJigiVyJpbiByfHwiVSJpbiByKT8oby5zZXRGdWxsWWVhcihyLnksMCwxKSxvLnNldEZ1bGxZZWFyKHIueSwwLCJXImluIHI/KHIudys2KSU3Kzcqci5XLShvLmdldERheSgpKzUpJTc6ci53Kzcqci5VLShvLmdldERheSgpKzYpJTcpKTpvLnNldEZ1bGxZZWFyKHIueSxyLm0sci5kKSxvLnNldEhvdXJzKHIuSCsoci5aLzEwMHwwKSxyLk0rci5aJTEwMCxyLlMsci5MKSxpP28uXzpvfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHR9ZnVuY3Rpb24gZShuLHQsZSxyKXtmb3IodmFyIHUsaSxvLGE9MCxjPXQubGVuZ3RoLGw9ZS5sZW5ndGg7Yz5hOyl7aWYocj49bClyZXR1cm4tMTtpZih1PXQuY2hhckNvZGVBdChhKyspLDM3PT09dSl7aWYobz10LmNoYXJBdChhKyspLGk9Q1tvIGluIHNjP3QuY2hhckF0KGErKyk6b10sIWl8fChyPWkobixlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYodSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9ZnVuY3Rpb24gcihuLHQsZSl7Xy5sYXN0SW5kZXg9MDt2YXIgcj1fLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4udz13LmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHUobix0LGUpe3gubGFzdEluZGV4PTA7dmFyIHI9eC5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9Yi5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpKG4sdCxlKXtFLmxhc3RJbmRleD0wO3ZhciByPUUuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5tPUEuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbyhuLHQsZSl7Uy5sYXN0SW5kZXg9MDt2YXIgcj1TLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1rLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEobix0LHIpe3JldHVybiBlKG4sTi5jLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBjKG4sdCxyKXtyZXR1cm4gZShuLE4ueC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQscil7cmV0dXJuIGUobixOLlgudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIHMobix0LGUpe3ZhciByPU0uZ2V0KHQuc2xpY2UoZSxlKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09cj8tMToobi5wPXIsZSl9dmFyIGY9bi5kYXRlVGltZSxoPW4uZGF0ZSxnPW4udGltZSxwPW4ucGVyaW9kcyx2PW4uZGF5cyxkPW4uc2hvcnREYXlzLG09bi5tb250aHMseT1uLnNob3J0TW9udGhzO3QudXRjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGUobil7dHJ5e2NjPWp0O3ZhciB0PW5ldyBjYztyZXR1cm4gdC5fPW4scih0KX1maW5hbGx5e2NjPURhdGV9fXZhciByPXQobik7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dHJ5e2NjPWp0O3ZhciB0PXIucGFyc2Uobik7cmV0dXJuIHQmJnQuX31maW5hbGx5e2NjPURhdGV9fSxlLnRvU3RyaW5nPXIudG9TdHJpbmcsZX0sdC5tdWx0aT10LnV0Yy5tdWx0aT1hZTt2YXIgTT10YS5tYXAoKSx4PVl0KHYpLGI9WnQodiksXz1ZdChkKSx3PVp0KGQpLFM9WXQobSksaz1adChtKSxFPVl0KHkpLEE9WnQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7TS5zZXQobi50b0xvd2VyQ2FzZSgpLHQpfSk7dmFyIE49e2E6ZnVuY3Rpb24obil7cmV0dXJuIGRbbi5nZXREYXkoKV19LEE6ZnVuY3Rpb24obil7cmV0dXJuIHZbbi5nZXREYXkoKV19LGI6ZnVuY3Rpb24obil7cmV0dXJuIHlbbi5nZXRNb250aCgpXX0sQjpmdW5jdGlvbihuKXtyZXR1cm4gbVtuLmdldE1vbnRoKCldfSxjOnQoZiksZDpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldERhdGUoKSx0LDIpfSxlOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RGF0ZSgpLHQsMil9LEg6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpLHQsMil9LEk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpJTEyfHwxMix0LDIpfSxqOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KDErYWMuZGF5T2ZZZWFyKG4pLHQsMyl9LEw6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaWxsaXNlY29uZHMoKSx0LDMpfSxtOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0TW9udGgoKSsxLHQsMil9LE06ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaW51dGVzKCksdCwyKX0scDpmdW5jdGlvbihuKXtyZXR1cm4gcFsrKG4uZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldFNlY29uZHMoKSx0LDIpfSxVOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLnN1bmRheU9mWWVhcihuKSx0LDIpfSx3OmZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpfSxXOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLm1vbmRheU9mWWVhcihuKSx0LDIpfSx4OnQoaCksWDp0KGcpLHk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfSxZOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX0sWjppZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxDPXthOnIsQTp1LGI6aSxCOm8sYzphLGQ6UXQsZTpRdCxIOnRlLEk6dGUsajpuZSxMOnVlLG06S3QsTTplZSxwOnMsUzpyZSxVOlh0LHc6VnQsVzokdCx4OmMsWDpsLHk6V3QsWTpCdCxaOkp0LCIlIjpvZX07cmV0dXJuIHR9ZnVuY3Rpb24gSXQobix0LGUpe3ZhciByPTA+bj8iLSI6IiIsdT0ocj8tbjpuKSsiIixpPXUubGVuZ3RoO3JldHVybiByKyhlPmk/bmV3IEFycmF5KGUtaSsxKS5qb2luKHQpK3U6dSl9ZnVuY3Rpb24gWXQobil7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK24ubWFwKHRhLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBadChuKXtmb3IodmFyIHQ9bmV3IGwsZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnNldChuW2VdLnRvTG93ZXJDYXNlKCksZSk7cmV0dXJuIHR9ZnVuY3Rpb24gVnQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMSkpO3JldHVybiByPyhuLnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWHQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkdChuLHQsZSl7ZmMubGFzdEluZGV4PTA7dmFyIHI9ZmMuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJ0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8obi55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFd0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi55PUd0KCtyWzBdKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdChuLHQsZSl7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KHQ9dC5zbGljZShlLGUrNSkpPyhuLlo9LXQsZSs1KTotMX1mdW5jdGlvbiBHdChuKXtyZXR1cm4gbisobj42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gS3Qobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFF0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5qPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHRlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKSxlPXQ+MD8iLSI6IisiLHI9Z2EodCkvNjB8MCx1PWdhKHQpJTYwO3JldHVybiBlK0l0KHIsIjAiLDIpK0l0KHUsIjAiLDIpfWZ1bmN0aW9uIG9lKG4sdCxlKXtoYy5sYXN0SW5kZXg9MDt2YXIgcj1oYy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGFlKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPS0xOysrZTx0OyluW2VdWzBdPXRoaXMobltlXVswXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9bltlXTshclsxXSh0KTspcj1uWysrZV07cmV0dXJuIHJbMF0odCl9fWZ1bmN0aW9uIGNlKCl7fWZ1bmN0aW9uIGxlKG4sdCxlKXt2YXIgcj1lLnM9bit0LHU9ci1uLGk9ci11O2UudD1uLWkrKHQtdSl9ZnVuY3Rpb24gc2Uobix0KXtuJiZkYy5oYXNPd25Qcm9wZXJ0eShuLnR5cGUpJiZkY1tuLnR5cGVdKG4sdCl9ZnVuY3Rpb24gZmUobix0LGUpe3ZhciByLHU9LTEsaT1uLmxlbmd0aC1lO2Zvcih0LmxpbmVTdGFydCgpOysrdTxpOylyPW5bdV0sdC5wb2ludChyWzBdLHJbMV0sclsyXSk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gaGUobix0KXt2YXIgZT0tMSxyPW4ubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxyOylmZShuW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gZ2UoKXtmdW5jdGlvbiBuKG4sdCl7bio9RGEsdD10KkRhLzIrcWEvNDt2YXIgZT1uLXIsbz1lPj0wPzE6LTEsYT1vKmUsYz1NYXRoLmNvcyh0KSxsPU1hdGguc2luKHQpLHM9aSpsLGY9dSpjK3MqTWF0aC5jb3MoYSksaD1zKm8qTWF0aC5zaW4oYSk7eWMuYWRkKE1hdGguYXRhbjIoaCxmKSkscj1uLHU9YyxpPWx9dmFyIHQsZSxyLHUsaTtNYy5wb2ludD1mdW5jdGlvbihvLGEpe01jLnBvaW50PW4scj0odD1vKSpEYSx1PU1hdGguY29zKGE9KGU9YSkqRGEvMitxYS80KSxpPU1hdGguc2luKGEpfSxNYy5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiBwZShuKXt2YXIgdD1uWzBdLGU9blsxXSxyPU1hdGguY29zKGUpO3JldHVybltyKk1hdGguY29zKHQpLHIqTWF0aC5zaW4odCksTWF0aC5zaW4oZSldfWZ1bmN0aW9uIHZlKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdfWZ1bmN0aW9uIGRlKG4sdCl7cmV0dXJuW25bMV0qdFsyXS1uWzJdKnRbMV0sblsyXSp0WzBdLW5bMF0qdFsyXSxuWzBdKnRbMV0tblsxXSp0WzBdXX1mdW5jdGlvbiBtZShuLHQpe25bMF0rPXRbMF0sblsxXSs9dFsxXSxuWzJdKz10WzJdfWZ1bmN0aW9uIHllKG4sdCl7cmV0dXJuW25bMF0qdCxuWzFdKnQsblsyXSp0XX1mdW5jdGlvbiBNZShuKXt2YXIgdD1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXStuWzJdKm5bMl0pO25bMF0vPXQsblsxXS89dCxuWzJdLz10fWZ1bmN0aW9uIHhlKG4pe3JldHVybltNYXRoLmF0YW4yKG5bMV0sblswXSksdHQoblsyXSldfWZ1bmN0aW9uIGJlKG4sdCl7cmV0dXJuIGdhKG5bMF0tdFswXSk8Q2EmJmdhKG5bMV0tdFsxXSk8Q2F9ZnVuY3Rpb24gX2Uobix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSk7d2UoZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pLE1hdGguc2luKHQpKX1mdW5jdGlvbiB3ZShuLHQsZSl7Kyt4YyxfYys9KG4tX2MpL3hjLHdjKz0odC13YykveGMsU2MrPShlLVNjKS94Y31mdW5jdGlvbiBTZSgpe2Z1bmN0aW9uIG4obix1KXtuKj1EYTt2YXIgaT1NYXRoLmNvcyh1Kj1EYSksbz1pKk1hdGguY29zKG4pLGE9aSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHUpLGw9TWF0aC5hdGFuMihNYXRoLnNxcnQoKGw9ZSpjLXIqYSkqbCsobD1yKm8tdCpjKSpsKyhsPXQqYS1lKm8pKmwpLHQqbytlKmErcipjKTtiYys9bCxrYys9bCoodCsodD1vKSksRWMrPWwqKGUrKGU9YSkpLEFjKz1sKihyKyhyPWMpKSx3ZSh0LGUscil9dmFyIHQsZSxyO3FjLnBvaW50PWZ1bmN0aW9uKHUsaSl7dSo9RGE7dmFyIG89TWF0aC5jb3MoaSo9RGEpO3Q9bypNYXRoLmNvcyh1KSxlPW8qTWF0aC5zaW4odSkscj1NYXRoLnNpbihpKSxxYy5wb2ludD1uLHdlKHQsZSxyKX19ZnVuY3Rpb24ga2UoKXtxYy5wb2ludD1fZX1mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIG4obix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSksbz1lKk1hdGguY29zKG4pLGE9ZSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHQpLGw9dSpjLWkqYSxzPWkqby1yKmMsZj1yKmEtdSpvLGg9TWF0aC5zcXJ0KGwqbCtzKnMrZipmKSxnPXIqbyt1KmEraSpjLHA9aCYmLW50KGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7TmMrPXAqbCxDYys9cCpzLHpjKz1wKmYsYmMrPXYsa2MrPXYqKHIrKHI9bykpLEVjKz12Kih1Kyh1PWEpKSxBYys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7cWMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLHFjLnBvaW50PW4sbyo9RGE7dmFyIGM9TWF0aC5jb3MoYSo9RGEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LHFjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSkscWMubGluZUVuZD1rZSxxYy5wb2ludD1fZX19ZnVuY3Rpb24gQWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQoZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2Uobix0LGUscix1KXt2YXIgaT1bXSxvPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihiZShlLHIpKXt1LmxpbmVTdGFydCgpO2Zvcih2YXIgYT0wO3Q+YTsrK2EpdS5wb2ludCgoZT1uW2FdKVswXSxlWzFdKTtyZXR1cm4gdm9pZCB1LmxpbmVFbmQoKX12YXIgYz1uZXcgcWUoZSxuLG51bGwsITApLGw9bmV3IHFlKGUsbnVsbCxjLCExKTtjLm89bCxpLnB1c2goYyksby5wdXNoKGwpLGM9bmV3IHFlKHIsbixudWxsLCExKSxsPW5ldyBxZShyLG51bGwsYywhMCksYy5vPWwsaS5wdXNoKGMpLG8ucHVzaChsKX19KSxvLnNvcnQodCksemUoaSksemUobyksaS5sZW5ndGgpe2Zvcih2YXIgYT0wLGM9ZSxsPW8ubGVuZ3RoO2w+YTsrK2Epb1thXS5lPWM9IWM7Zm9yKHZhciBzLGYsaD1pWzBdOzspe2Zvcih2YXIgZz1oLHA9ITA7Zy52OylpZigoZz1nLm4pPT09aClyZXR1cm47cz1nLnosdS5saW5lU3RhcnQoKTtkb3tpZihnLnY9Zy5vLnY9ITAsZy5lKXtpZihwKWZvcih2YXIgYT0wLGw9cy5sZW5ndGg7bD5hOysrYSl1LnBvaW50KChmPXNbYV0pWzBdLGZbMV0pO2Vsc2UgcihnLngsZy5uLngsMSx1KTtnPWcubn1lbHNle2lmKHApe3M9Zy5wLno7Zm9yKHZhciBhPXMubGVuZ3RoLTE7YT49MDstLWEpdS5wb2ludCgoZj1zW2FdKVswXSxmWzFdKX1lbHNlIHIoZy54LGcucC54LC0xLHUpO2c9Zy5wfWc9Zy5vLHM9Zy56LHA9IXB9d2hpbGUoIWcudik7dS5saW5lRW5kKCl9fX1mdW5jdGlvbiB6ZShuKXtpZih0PW4ubGVuZ3RoKXtmb3IodmFyIHQsZSxyPTAsdT1uWzBdOysrcjx0Oyl1Lm49ZT1uW3JdLGUucD11LHU9ZTt1Lm49ZT1uWzBdLGUucD11fX1mdW5jdGlvbiBxZShuLHQsZSxyKXt0aGlzLng9bix0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIExlKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1LGkpe2Z1bmN0aW9uIG8odCxlKXt2YXIgcj11KHQsZSk7bih0PXJbMF0sZT1yWzFdKSYmaS5wb2ludCh0LGUpfWZ1bmN0aW9uIGEobix0KXt2YXIgZT11KG4sdCk7ZC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXt5LnBvaW50PWEsZC5saW5lU3RhcnQoKX1mdW5jdGlvbiBsKCl7eS5wb2ludD1vLGQubGluZUVuZCgpfWZ1bmN0aW9uIHMobix0KXt2LnB1c2goW24sdF0pO3ZhciBlPXUobix0KTt4LnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gZigpe3gubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7cyh2WzBdWzBdLHZbMF1bMV0pLHgubGluZUVuZCgpO3ZhciBuLHQ9eC5jbGVhbigpLGU9TS5idWZmZXIoKSxyPWUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxyKWlmKDEmdCl7bj1lWzBdO3ZhciB1LHI9bi5sZW5ndGgtMSxvPS0xO2lmKHI+MCl7Zm9yKGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLGkubGluZVN0YXJ0KCk7KytvPHI7KWkucG9pbnQoKHU9bltvXSlbMF0sdVsxXSk7aS5saW5lRW5kKCl9fWVsc2Ugcj4xJiYyJnQmJmUucHVzaChlLnBvcCgpLmNvbmNhdChlLnNoaWZ0KCkpKSxnLnB1c2goZS5maWx0ZXIoVGUpKX12YXIgZyxwLHYsZD10KGkpLG09dS5pbnZlcnQoclswXSxyWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpjLGxpbmVFbmQ6bCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5LnBvaW50PXMseS5saW5lU3RhcnQ9Zix5LmxpbmVFbmQ9aCxnPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9Yyx5LmxpbmVFbmQ9bCxnPXRhLm1lcmdlKGcpO3ZhciBuPUZlKG0scCk7Zy5sZW5ndGg/KGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLENlKGcsRGUsbixlLGkpKTpuJiYoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxiJiYoaS5wb2x5Z29uRW5kKCksYj0hMSksZz1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX0sTT1SZSgpLHg9dChNKSxiPSExO3JldHVybiB5fX1mdW5jdGlvbiBUZShuKXtyZXR1cm4gbi5sZW5ndGg+MX1mdW5jdGlvbiBSZSgpe3ZhciBuLHQ9W107cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QucHVzaChuPVtdKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtuLnB1c2goW3QsZV0pfSxsaW5lRW5kOmIsYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIGU9dDtyZXR1cm4gdD1bXSxuPW51bGwsZX0scmVqb2luOmZ1bmN0aW9uKCl7dC5sZW5ndGg+MSYmdC5wdXNoKHQucG9wKCkuY29uY2F0KHQuc2hpZnQoKSkpfX19ZnVuY3Rpb24gRGUobix0KXtyZXR1cm4oKG49bi54KVswXTwwP25bMV0tUmEtQ2E6UmEtblsxXSktKCh0PXQueClbMF08MD90WzFdLVJhLUNhOlJhLXRbMV0pfWZ1bmN0aW9uIFBlKG4pe3ZhciB0LGU9MC8wLHI9MC8wLHU9MC8wO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpLHQ9MX0scG9pbnQ6ZnVuY3Rpb24oaSxvKXt2YXIgYT1pPjA/cWE6LXFhLGM9Z2EoaS1lKTtnYShjLXFhKTxDYT8obi5wb2ludChlLHI9KHIrbykvMj4wP1JhOi1SYSksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChhLHIpLG4ucG9pbnQoaSxyKSx0PTApOnUhPT1hJiZjPj1xYSYmKGdhKGUtdSk8Q2EmJihlLT11KkNhKSxnYShpLWEpPENhJiYoaS09YSpDYSkscj1VZShlLHIsaSxvKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksdD0wKSxuLnBvaW50KGU9aSxyPW8pLHU9YX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpLGU9cj0wLzB9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItdH19fWZ1bmN0aW9uIFVlKG4sdCxlLHIpe3ZhciB1LGksbz1NYXRoLnNpbihuLWUpO3JldHVybiBnYShvKT5DYT9NYXRoLmF0YW4oKE1hdGguc2luKHQpKihpPU1hdGguY29zKHIpKSpNYXRoLnNpbihlKS1NYXRoLnNpbihyKSoodT1NYXRoLmNvcyh0KSkqTWF0aC5zaW4obikpLyh1KmkqbykpOih0K3IpLzJ9ZnVuY3Rpb24gamUobix0LGUscil7dmFyIHU7aWYobnVsbD09bil1PWUqUmEsci5wb2ludCgtcWEsdSksci5wb2ludCgwLHUpLHIucG9pbnQocWEsdSksci5wb2ludChxYSwwKSxyLnBvaW50KHFhLC11KSxyLnBvaW50KDAsLXUpLHIucG9pbnQoLXFhLC11KSxyLnBvaW50KC1xYSwwKSxyLnBvaW50KC1xYSx1KTtlbHNlIGlmKGdhKG5bMF0tdFswXSk+Q2Epe3ZhciBpPW5bMF08dFswXT9xYTotcWE7dT1lKmkvMixyLnBvaW50KC1pLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KGksdSl9ZWxzZSByLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gRmUobix0KXt2YXIgZT1uWzBdLHI9blsxXSx1PVtNYXRoLnNpbihlKSwtTWF0aC5jb3MoZSksMF0saT0wLG89MDt5Yy5yZXNldCgpO2Zvcih2YXIgYT0wLGM9dC5sZW5ndGg7Yz5hOysrYSl7dmFyIGw9dFthXSxzPWwubGVuZ3RoO2lmKHMpZm9yKHZhciBmPWxbMF0saD1mWzBdLGc9ZlsxXS8yK3FhLzQscD1NYXRoLnNpbihnKSx2PU1hdGguY29zKGcpLGQ9MTs7KXtkPT09cyYmKGQ9MCksbj1sW2RdO3ZhciBtPW5bMF0seT1uWzFdLzIrcWEvNCxNPU1hdGguc2luKHkpLHg9TWF0aC5jb3MoeSksYj1tLWgsXz1iPj0wPzE6LTEsdz1fKmIsUz13PnFhLGs9cCpNO2lmKHljLmFkZChNYXRoLmF0YW4yKGsqXypNYXRoLnNpbih3KSx2KngraypNYXRoLmNvcyh3KSkpLGkrPVM/YitfKkxhOmIsU15oPj1lXm0+PWUpe3ZhciBFPWRlKHBlKGYpLHBlKG4pKTtNZShFKTt2YXIgQT1kZSh1LEUpO01lKEEpO3ZhciBOPShTXmI+PTA/LTE6MSkqdHQoQVsyXSk7KHI+Tnx8cj09PU4mJihFWzBdfHxFWzFdKSkmJihvKz1TXmI+PTA/MTotMSl9aWYoIWQrKylicmVhaztoPW0scD1NLHY9eCxmPW59fXJldHVybigtQ2E+aXx8Q2E+aSYmMD55YyleMSZvfWZ1bmN0aW9uIEhlKG4pe2Z1bmN0aW9uIHQobix0KXtyZXR1cm4gTWF0aC5jb3MobikqTWF0aC5jb3ModCk+aX1mdW5jdGlvbiBlKG4pe3ZhciBlLGksYyxsLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2w9Yz0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGYsaCl7dmFyIGcscD1bZixoXSx2PXQoZixoKSxkPW8/dj8wOnUoZixoKTp2P3UoZisoMD5mP3FhOi1xYSksaCk6MDtpZighZSYmKGw9Yz12KSYmbi5saW5lU3RhcnQoKSx2IT09YyYmKGc9cihlLHApLChiZShlLGcpfHxiZShwLGcpKSYmKHBbMF0rPUNhLHBbMV0rPUNhLHY9dChwWzBdLHBbMV0pKSksdiE9PWMpcz0wLHY/KG4ubGluZVN0YXJ0KCksZz1yKHAsZSksbi5wb2ludChnWzBdLGdbMV0pKTooZz1yKGUscCksbi5wb2ludChnWzBdLGdbMV0pLG4ubGluZUVuZCgpKSxlPWc7ZWxzZSBpZihhJiZlJiZvXnYpe3ZhciBtO2QmaXx8IShtPXIocCxlLCEwKSl8fChzPTAsbz8obi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSksbi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpKToobi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pKSl9IXZ8fGUmJmJlKGUscCl8fG4ucG9pbnQocFswXSxwWzFdKSxlPXAsYz12LGk9ZH0sbGluZUVuZDpmdW5jdGlvbigpe2MmJm4ubGluZUVuZCgpLGU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3wobCYmYyk8PDF9fX1mdW5jdGlvbiByKG4sdCxlKXt2YXIgcj1wZShuKSx1PXBlKHQpLG89WzEsMCwwXSxhPWRlKHIsdSksYz12ZShhLGEpLGw9YVswXSxzPWMtbCpsO2lmKCFzKXJldHVybiFlJiZuO3ZhciBmPWkqYy9zLGg9LWkqbC9zLGc9ZGUobyxhKSxwPXllKG8sZiksdj15ZShhLGgpO21lKHAsdik7dmFyIGQ9ZyxtPXZlKHAsZCkseT12ZShkLGQpLE09bSptLXkqKHZlKHAscCktMSk7aWYoISgwPk0pKXt2YXIgeD1NYXRoLnNxcnQoTSksYj15ZShkLCgtbS14KS95KTtpZihtZShiLHApLGI9eGUoYiksIWUpcmV0dXJuIGI7dmFyIF8sdz1uWzBdLFM9dFswXSxrPW5bMV0sRT10WzFdO3c+UyYmKF89dyx3PVMsUz1fKTt2YXIgQT1TLXcsTj1nYShBLXFhKTxDYSxDPU58fENhPkE7aWYoIU4mJms+RSYmKF89ayxrPUUsRT1fKSxDP04/aytFPjBeYlsxXTwoZ2EoYlswXS13KTxDYT9rOkUpOms8PWJbMV0mJmJbMV08PUU6QT5xYV4odzw9YlswXSYmYlswXTw9Uykpe3ZhciB6PXllKGQsKC1tK3gpL3kpO3JldHVybiBtZSh6LHApLFtiLHhlKHopXX19fWZ1bmN0aW9uIHUodCxlKXt2YXIgcj1vP246cWEtbix1PTA7cmV0dXJuLXI+dD91fD0xOnQ+ciYmKHV8PTIpLC1yPmU/dXw9NDplPnImJih1fD04KSx1fXZhciBpPU1hdGguY29zKG4pLG89aT4wLGE9Z2EoaSk+Q2EsYz1ncihuLDYqRGEpO3JldHVybiBMZSh0LGUsYyxvP1swLC1uXTpbLXFhLG4tcWFdKX1mdW5jdGlvbiBPZShuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGksbz11LmEsYT11LmIsYz1vLngsbD1vLnkscz1hLngsZj1hLnksaD0wLGc9MSxwPXMtYyx2PWYtbDtpZihpPW4tYyxwfHwhKGk+MCkpe2lmKGkvPXAsMD5wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZihwPjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPWUtYyxwfHwhKDA+aSkpe2lmKGkvPXAsMD5wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZihwPjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1pZihpPXQtbCx2fHwhKGk+MCkpe2lmKGkvPXYsMD52KXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZih2PjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPXItbCx2fHwhKDA+aSkpe2lmKGkvPXYsMD52KXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZih2PjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1yZXR1cm4gaD4wJiYodS5hPXt4OmMraCpwLHk6bCtoKnZ9KSwxPmcmJih1LmI9e3g6YytnKnAseTpsK2cqdn0pLHV9fX19fX1mdW5jdGlvbiBJZShuLHQsZSxyKXtmdW5jdGlvbiB1KHIsdSl7cmV0dXJuIGdhKHJbMF0tbik8Q2E/dT4wPzA6MzpnYShyWzBdLWUpPENhP3U+MD8yOjE6Z2EoclsxXS10KTxDYT91PjA/MTowOnU+MD8zOjJ9ZnVuY3Rpb24gaShuLHQpe3JldHVybiBvKG4ueCx0LngpfWZ1bmN0aW9uIG8obix0KXt2YXIgZT11KG4sMSkscj11KHQsMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT90WzFdLW5bMV06MT09PWU/blswXS10WzBdOjI9PT1lP25bMV0tdFsxXTp0WzBdLW5bMF19cmV0dXJuIGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMobil7Zm9yKHZhciB0PTAsZT1kLmxlbmd0aCxyPW5bMV0sdT0wO2U+dTsrK3UpZm9yKHZhciBpLG89MSxhPWRbdV0sYz1hLmxlbmd0aCxsPWFbMF07Yz5vOysrbylpPWFbb10sbFsxXTw9cj9pWzFdPnImJlEobCxpLG4pPjAmJisrdDppWzFdPD1yJiZRKGwsaSxuKTwwJiYtLXQsbD1pO3JldHVybiAwIT09dH1mdW5jdGlvbiBsKGksYSxjLGwpe3ZhciBzPTAsZj0wO2lmKG51bGw9PWl8fChzPXUoaSxjKSkhPT0oZj11KGEsYykpfHxvKGksYSk8MF5jPjApe2RvIGwucG9pbnQoMD09PXN8fDM9PT1zP246ZSxzPjE/cjp0KTt3aGlsZSgocz0ocytjKzQpJTQpIT09Zil9ZWxzZSBsLnBvaW50KGFbMF0sYVsxXSl9ZnVuY3Rpb24gcyh1LGkpe3JldHVybiB1Pj1uJiZlPj11JiZpPj10JiZyPj1pfWZ1bmN0aW9uIGYobix0KXtzKG4sdCkmJmEucG9pbnQobix0KX1mdW5jdGlvbiBoKCl7Qy5wb2ludD1wLGQmJmQucHVzaChtPVtdKSxTPSEwLHc9ITEsYj1fPTAvMH1mdW5jdGlvbiBnKCl7diYmKHAoeSxNKSx4JiZ3JiZBLnJlam9pbigpLHYucHVzaChBLmJ1ZmZlcigpKSksQy5wb2ludD1mLHcmJmEubGluZUVuZCgpfWZ1bmN0aW9uIHAobix0KXtuPU1hdGgubWF4KC1UYyxNYXRoLm1pbihUYyxuKSksdD1NYXRoLm1heCgtVGMsTWF0aC5taW4oVGMsdCkpO3ZhciBlPXMobix0KTtpZihkJiZtLnB1c2goW24sdF0pLFMpeT1uLE09dCx4PWUsUz0hMSxlJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCkpO2Vsc2UgaWYoZSYmdylhLnBvaW50KG4sdCk7ZWxzZXt2YXIgcj17YTp7eDpiLHk6X30sYjp7eDpuLHk6dH19O04ocik/KHd8fChhLmxpbmVTdGFydCgpLGEucG9pbnQoci5hLngsci5hLnkpKSxhLnBvaW50KHIuYi54LHIuYi55KSxlfHxhLmxpbmVFbmQoKSxrPSExKTplJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCksaz0hMSl9Yj1uLF89dCx3PWV9dmFyIHYsZCxtLHksTSx4LGIsXyx3LFMsayxFPWEsQT1SZSgpLE49T2Uobix0LGUsciksQz17cG9pbnQ6ZixsaW5lU3RhcnQ6aCxsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YT1BLHY9W10sZD1bXSxrPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7YT1FLHY9dGEubWVyZ2Uodik7dmFyIHQ9YyhbbixyXSksZT1rJiZ0LHU9di5sZW5ndGg7KGV8fHUpJiYoYS5wb2x5Z29uU3RhcnQoKSxlJiYoYS5saW5lU3RhcnQoKSxsKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSx1JiZDZSh2LGksdCxsLGEpLGEucG9seWdvbkVuZCgpKSx2PWQ9bT1udWxsfX07cmV0dXJuIEN9fWZ1bmN0aW9uIFllKG4pe3ZhciB0PTAsZT1xYS8zLHI9aXIobiksdT1yKHQsZSk7cmV0dXJuIHUucGFyYWxsZWxzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3IodD1uWzBdKnFhLzE4MCxlPW5bMV0qcWEvMTgwKTpbdC9xYSoxODAsZS9xYSoxODBdfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsdHQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtEYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O0hjLnBvaW50PWZ1bmN0aW9uKGksbyl7SGMucG9pbnQ9bix0PXI9aSxlPXU9b30sSGMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtQYz5uJiYoUGM9biksbj5qYyYmKGpjPW4pLFVjPnQmJihVYz10KSx0PkZjJiYoRmM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe19jKz1uLHdjKz10LCsrU2N9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO2tjKz1vKih0K24pLzIsRWMrPW8qKGUrcikvMixBYys9byxXZSh0PW4sZT1yKX12YXIgdCxlO0ljLnBvaW50PWZ1bmN0aW9uKHIsdSl7SWMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtJYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7a2MrPW8qKHIrbikvMixFYys9byoodSt0KS8yLEFjKz1vLG89dSpuLXIqdCxOYys9byoocituKSxDYys9byoodSt0KSx6Yys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O0ljLnBvaW50PWZ1bmN0aW9uKGksbyl7SWMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LEljLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0K28sZSksbi5hcmModCxlLG8sMCxMYSl9ZnVuY3Rpb24gZSh0LGUpe24ubW92ZVRvKHQsZSksYS5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtuLmxpbmVUbyh0LGUpfWZ1bmN0aW9uIHUoKXthLnBvaW50PXR9ZnVuY3Rpb24gaSgpe24uY2xvc2VQYXRoKCl9dmFyIG89NC41LGE9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD1lfSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dSxhLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBvPW4sYX0scmVzdWx0OmJ9O3JldHVybiBhfWZ1bmN0aW9uIG5yKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuKGE/cjplKShuKX1mdW5jdGlvbiBlKHQpe3JldHVybiBycih0LGZ1bmN0aW9uKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfSl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHIoKXtNPTAvMCxTLnBvaW50PWksdC5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKGUscil7dmFyIGk9cGUoW2Uscl0pLG89bihlLHIpO3UoTSx4LHksYixfLHcsTT1vWzBdLHg9b1sxXSx5PWUsYj1pWzBdLF89aVsxXSx3PWlbMl0sYSx0KSx0LnBvaW50KE0seCl9ZnVuY3Rpb24gbygpe1MucG9pbnQ9ZSx0LmxpbmVFbmQoKX1mdW5jdGlvbiBjKCl7cigpLFMucG9pbnQ9bCxTLmxpbmVFbmQ9c31mdW5jdGlvbiBsKG4sdCl7aShmPW4saD10KSxnPU0scD14LHY9YixkPV8sbT13LFMucG9pbnQ9aX1mdW5jdGlvbiBzKCl7dShNLHgseSxiLF8sdyxnLHAsZix2LGQsbSxhLHQpLFMubGluZUVuZD1vLG8oKX12YXIgZixoLGcscCx2LGQsbSx5LE0seCxiLF8sdyxTPXtwb2ludDplLGxpbmVTdGFydDpyLGxpbmVFbmQ6byxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLFMubGluZVN0YXJ0PWMKfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksUy5saW5lU3RhcnQ9cn19O3JldHVybiBTfWZ1bmN0aW9uIHUodCxlLHIsYSxjLGwscyxmLGgsZyxwLHYsZCxtKXt2YXIgeT1zLXQsTT1mLWUseD15KnkrTSpNO2lmKHg+NCppJiZkLS0pe3ZhciBiPWErZyxfPWMrcCx3PWwrdixTPU1hdGguc3FydChiKmIrXypfK3cqdyksaz1NYXRoLmFzaW4ody89UyksRT1nYShnYSh3KS0xKTxDYXx8Z2Eoci1oKTxDYT8ocitoKS8yOk1hdGguYXRhbjIoXyxiKSxBPW4oRSxrKSxOPUFbMF0sQz1BWzFdLHo9Ti10LHE9Qy1lLEw9TSp6LXkqcTsoTCpML3g+aXx8Z2EoKHkqeitNKnEpL3gtLjUpPi4zfHxvPmEqZytjKnArbCp2KSYmKHUodCxlLHIsYSxjLGwsTixDLEUsYi89UyxfLz1TLHcsZCxtKSxtLnBvaW50KE4sQyksdShOLEMsRSxiLF8sdyxzLGYsaCxnLHAsdixkLG0pKX19dmFyIGk9LjUsbz1NYXRoLmNvcygzMCpEYSksYT0xNjtyZXR1cm4gdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9KGk9bipuKT4wJiYxNix0KTpNYXRoLnNxcnQoaSl9LHR9ZnVuY3Rpb24gdHIobil7dmFyIHQ9bnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihbdCpQYSxlKlBhXSl9KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG9yKHQobikpfX1mdW5jdGlvbiBlcihuKXt0aGlzLnN0cmVhbT1ufWZ1bmN0aW9uIHJyKG4sdCl7cmV0dXJue3BvaW50OnQsc3BoZXJlOmZ1bmN0aW9uKCl7bi5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCl9fX1mdW5jdGlvbiB1cihuKXtyZXR1cm4gaXIoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKCl9ZnVuY3Rpb24gaXIobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj1hKG5bMF0qRGEsblsxXSpEYSksW25bMF0qaCtjLGwtblsxXSpoXX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPWEuaW52ZXJ0KChuWzBdLWMpL2gsKGwtblsxXSkvaCksbiYmW25bMF0qUGEsblsxXSpQYV19ZnVuY3Rpb24gcigpe2E9QWUobz1scihtLE0seCksaSk7dmFyIG49aSh2LGQpO3JldHVybiBjPWctblswXSpoLGw9cCtuWzFdKmgsdSgpfWZ1bmN0aW9uIHUoKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEscz1udWxsKSx0fXZhciBpLG8sYSxjLGwscyxmPW5yKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49aShuLHQpLFtuWzBdKmgrYyxsLW5bMV0qaF19KSxoPTE1MCxnPTQ4MCxwPTI1MCx2PTAsZD0wLG09MCxNPTAseD0wLGI9TGMsXz15LHc9bnVsbCxTPW51bGw7cmV0dXJuIHQuc3RyZWFtPWZ1bmN0aW9uKG4pe3JldHVybiBzJiYocy52YWxpZD0hMSkscz1vcihiKG8sZihfKG4pKSkpLHMudmFsaWQ9ITAsc30sdC5jbGlwQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9bnVsbD09bj8odz1uLExjKTpIZSgodz0rbikqRGEpLHUoKSk6d30sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPW4sXz1uP0llKG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pOnksdSgpKTpTfSx0LnNjYWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPStuLHIoKSk6aH0sdC50cmFuc2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K25bMF0scD0rblsxXSxyKCkpOltnLHBdfSx0LmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1uWzBdJTM2MCpEYSxkPW5bMV0lMzYwKkRhLHIoKSk6W3YqUGEsZCpQYV19LHQucm90YXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW5bMF0lMzYwKkRhLE09blsxXSUzNjAqRGEseD1uLmxlbmd0aD4yP25bMl0lMzYwKkRhOjAscigpKTpbbSpQYSxNKlBhLHgqUGFdfSx0YS5yZWJpbmQodCxmLCJwcmVjaXNpb24iKSxmdW5jdGlvbigpe3JldHVybiBpPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuaW52ZXJ0PWkuaW52ZXJ0JiZlLHIoKX19ZnVuY3Rpb24gb3Iobil7cmV0dXJuIHJyKG4sZnVuY3Rpb24odCxlKXtuLnBvaW50KHQqRGEsZSpEYSl9KX1mdW5jdGlvbiBhcihuLHQpe3JldHVybltuLHRdfWZ1bmN0aW9uIGNyKG4sdCl7cmV0dXJuW24+cWE/bi1MYTotcWE+bj9uK0xhOm4sdF19ZnVuY3Rpb24gbHIobix0LGUpe3JldHVybiBuP3R8fGU/QWUoZnIobiksaHIodCxlKSk6ZnIobik6dHx8ZT9ocih0LGUpOmNyfWZ1bmN0aW9uIHNyKG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1uLFt0PnFhP3QtTGE6LXFhPnQ/dCtMYTp0LGVdfX1mdW5jdGlvbiBmcihuKXt2YXIgdD1zcihuKTtyZXR1cm4gdC5pbnZlcnQ9c3IoLW4pLHR9ZnVuY3Rpb24gaHIobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksYT1NYXRoLmNvcyhuKSplLGM9TWF0aC5zaW4obikqZSxsPU1hdGguc2luKHQpLHM9bCpyK2EqdTtyZXR1cm5bTWF0aC5hdGFuMihjKmktcypvLGEqci1sKnUpLHR0KHMqaStjKm8pXX12YXIgcj1NYXRoLmNvcyhuKSx1PU1hdGguc2luKG4pLGk9TWF0aC5jb3ModCksbz1NYXRoLnNpbih0KTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1NYXRoLmNvcyh0KSxhPU1hdGguY29zKG4pKmUsYz1NYXRoLnNpbihuKSplLGw9TWF0aC5zaW4odCkscz1sKmktYypvO3JldHVybltNYXRoLmF0YW4yKGMqaStsKm8sYSpyK3MqdSksdHQocypyLWEqdSldfSxlfWZ1bmN0aW9uIGdyKG4sdCl7dmFyIGU9TWF0aC5jb3Mobikscj1NYXRoLnNpbihuKTtyZXR1cm4gZnVuY3Rpb24odSxpLG8sYSl7dmFyIGM9byp0O251bGwhPXU/KHU9cHIoZSx1KSxpPXByKGUsaSksKG8+MD9pPnU6dT5pKSYmKHUrPW8qTGEpKToodT1uK28qTGEsaT1uLS41KmMpO2Zvcih2YXIgbCxzPXU7bz4wP3M+aTppPnM7cy09YylhLnBvaW50KChsPXhlKFtlLC1yKk1hdGguY29zKHMpLC1yKk1hdGguc2luKHMpXSkpWzBdLGxbMV0pfX1mdW5jdGlvbiBwcihuLHQpe3ZhciBlPXBlKHQpO2VbMF0tPW4sTWUoZSk7dmFyIHI9bnQoLWVbMV0pO3JldHVybigoLWVbMl08MD8tcjpyKSsyKk1hdGguUEktQ2EpJSgyKk1hdGguUEkpfWZ1bmN0aW9uIHZyKG4sdCxlKXt2YXIgcj10YS5yYW5nZShuLHQtQ2EsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24gZHIobix0LGUpe3ZhciByPXRhLnJhbmdlKG4sdC1DYSxlKS5jb25jYXQodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiByLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdCxuXX0pfX1mdW5jdGlvbiBtcihuKXtyZXR1cm4gbi5zb3VyY2V9ZnVuY3Rpb24geXIobil7cmV0dXJuIG4udGFyZ2V0fWZ1bmN0aW9uIE1yKG4sdCxlLHIpe3ZhciB1PU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCksbz1NYXRoLmNvcyhyKSxhPU1hdGguc2luKHIpLGM9dSpNYXRoLmNvcyhuKSxsPXUqTWF0aC5zaW4obikscz1vKk1hdGguY29zKGUpLGY9bypNYXRoLnNpbihlKSxoPTIqTWF0aC5hc2luKE1hdGguc3FydChpdChyLXQpK3UqbyppdChlLW4pKSksZz0xL01hdGguc2luKGgpLHA9aD9mdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNpbihuKj1oKSpnLGU9TWF0aC5zaW4oaC1uKSpnLHI9ZSpjK3Qqcyx1PWUqbCt0KmYsbz1lKmkrdCphO3JldHVybltNYXRoLmF0YW4yKHUscikqUGEsTWF0aC5hdGFuMihvLE1hdGguc3FydChyKnIrdSp1KSkqUGFdfTpmdW5jdGlvbigpe3JldHVybltuKlBhLHQqUGFdfTtyZXR1cm4gcC5kaXN0YW5jZT1oLHB9ZnVuY3Rpb24geHIoKXtmdW5jdGlvbiBuKG4sdSl7dmFyIGk9TWF0aC5zaW4odSo9RGEpLG89TWF0aC5jb3ModSksYT1nYSgobio9RGEpLXQpLGM9TWF0aC5jb3MoYSk7WWMrPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChhPW8qTWF0aC5zaW4oYSkpKmErKGE9cippLWUqbypjKSphKSxlKmkrcipvKmMpLHQ9bixlPWkscj1vfXZhciB0LGUscjtaYy5wb2ludD1mdW5jdGlvbih1LGkpe3Q9dSpEYSxlPU1hdGguc2luKGkqPURhKSxyPU1hdGguY29zKGkpLFpjLnBvaW50PW59LFpjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtaYy5wb2ludD1aYy5saW5lRW5kPWJ9fWZ1bmN0aW9uIGJyKG4sdCl7ZnVuY3Rpb24gZSh0LGUpe3ZhciByPU1hdGguY29zKHQpLHU9TWF0aC5jb3MoZSksaT1uKHIqdSk7cmV0dXJuW2kqdSpNYXRoLnNpbih0KSxpKk1hdGguc2luKGUpXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obixlKXt2YXIgcj1NYXRoLnNxcnQobipuK2UqZSksdT10KHIpLGk9TWF0aC5zaW4odSksbz1NYXRoLmNvcyh1KTtyZXR1cm5bTWF0aC5hdGFuMihuKmkscipvKSxNYXRoLmFzaW4ociYmZSppL3IpXX0sZX1mdW5jdGlvbiBfcihuLHQpe2Z1bmN0aW9uIGUobix0KXtvPjA/LVJhK0NhPnQmJih0PS1SYStDYSk6dD5SYS1DYSYmKHQ9UmEtQ2EpO3ZhciBlPW8vTWF0aC5wb3codSh0KSxpKTtyZXR1cm5bZSpNYXRoLnNpbihpKm4pLG8tZSpNYXRoLmNvcyhpKm4pXX12YXIgcj1NYXRoLmNvcyhuKSx1PWZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnRhbihxYS80K24vMil9LGk9bj09PXQ/TWF0aC5zaW4obik6TWF0aC5sb2coci9NYXRoLmNvcyh0KSkvTWF0aC5sb2codSh0KS91KG4pKSxvPXIqTWF0aC5wb3codShuKSxpKS9pO3JldHVybiBpPyhlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdCxyPUsoaSkqTWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybltNYXRoLmF0YW4yKG4sZSkvaSwyKk1hdGguYXRhbihNYXRoLnBvdyhvL3IsMS9pKSktUmFdfSxlKTpTcn1mdW5jdGlvbiB3cihuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1pLXQ7cmV0dXJuW2UqTWF0aC5zaW4odSpuKSxpLWUqTWF0aC5jb3ModSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1uPT09dD9NYXRoLnNpbihuKTooci1NYXRoLmNvcyh0KSkvKHQtbiksaT1yL3UrbjtyZXR1cm4gZ2EodSk8Q2E/YXI6KGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9aS10O3JldHVybltNYXRoLmF0YW4yKG4sZSkvdSxpLUsodSkqTWF0aC5zcXJ0KG4qbitlKmUpXX0sZSl9ZnVuY3Rpb24gU3Iobix0KXtyZXR1cm5bbixNYXRoLmxvZyhNYXRoLnRhbihxYS80K3QvMikpXX1mdW5jdGlvbiBrcihuKXt2YXIgdCxlPXVyKG4pLHI9ZS5zY2FsZSx1PWUudHJhbnNsYXRlLGk9ZS5jbGlwRXh0ZW50O3JldHVybiBlLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIG49ci5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS50cmFuc2xhdGU9ZnVuY3Rpb24oKXt2YXIgbj11LmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gbj09PWU/dD9lLmNsaXBFeHRlbnQobnVsbCk6ZTpufSxlLmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7dmFyIG89aS5hcHBseShlLGFyZ3VtZW50cyk7aWYobz09PWUpe2lmKHQ9bnVsbD09bil7dmFyIGE9cWEqcigpLGM9dSgpO2koW1tjWzBdLWEsY1sxXS1hXSxbY1swXSthLGNbMV0rYV1dKX19ZWxzZSB0JiYobz1udWxsKTtyZXR1cm4gb30sZS5jbGlwRXh0ZW50KG51bGwpfWZ1bmN0aW9uIEVyKG4sdCl7cmV0dXJuW01hdGgubG9nKE1hdGgudGFuKHFhLzQrdC8yKSksLW5dfWZ1bmN0aW9uIEFyKG4pe3JldHVybiBuWzBdfWZ1bmN0aW9uIE5yKG4pe3JldHVybiBuWzFdfWZ1bmN0aW9uIENyKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPVswLDFdLHI9Mix1PTI7dD51O3UrKyl7Zm9yKDtyPjEmJlEobltlW3ItMl1dLG5bZVtyLTFdXSxuW3VdKTw9MDspLS1yO2VbcisrXT11fXJldHVybiBlLnNsaWNlKDAscil9ZnVuY3Rpb24genIobix0KXtyZXR1cm4gblswXS10WzBdfHxuWzFdLXRbMV19ZnVuY3Rpb24gcXIobix0LGUpe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pPChlWzFdLXRbMV0pKihuWzBdLXRbMF0pfWZ1bmN0aW9uIExyKG4sdCxlLHIpe3ZhciB1PW5bMF0saT1lWzBdLG89dFswXS11LGE9clswXS1pLGM9blsxXSxsPWVbMV0scz10WzFdLWMsZj1yWzFdLWwsaD0oYSooYy1sKS1mKih1LWkpKS8oZipvLWEqcyk7cmV0dXJuW3UraCpvLGMraCpzXX1mdW5jdGlvbiBUcihuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4hKHRbMF0tZVswXXx8dFsxXS1lWzFdKX1mdW5jdGlvbiBScigpe3R1KHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBEcihuKXt2YXIgdD1lbC5wb3AoKXx8bmV3IFJyO3JldHVybiB0LnNpdGU9bix0fWZ1bmN0aW9uIFByKG4pe1hyKG4pLFFjLnJlbW92ZShuKSxlbC5wdXNoKG4pLHR1KG4pfWZ1bmN0aW9uIFVyKG4pe3ZhciB0PW4uY2lyY2xlLGU9dC54LHI9dC5jeSx1PXt4OmUseTpyfSxpPW4uUCxvPW4uTixhPVtuXTtQcihuKTtmb3IodmFyIGM9aTtjLmNpcmNsZSYmZ2EoZS1jLmNpcmNsZS54KTxDYSYmZ2Eoci1jLmNpcmNsZS5jeSk8Q2E7KWk9Yy5QLGEudW5zaGlmdChjKSxQcihjKSxjPWk7YS51bnNoaWZ0KGMpLFhyKGMpO2Zvcih2YXIgbD1vO2wuY2lyY2xlJiZnYShlLWwuY2lyY2xlLngpPENhJiZnYShyLWwuY2lyY2xlLmN5KTxDYTspbz1sLk4sYS5wdXNoKGwpLFByKGwpLGw9bzthLnB1c2gobCksWHIobCk7dmFyIHMsZj1hLmxlbmd0aDtmb3Iocz0xO2Y+czsrK3MpbD1hW3NdLGM9YVtzLTFdLEtyKGwuZWRnZSxjLnNpdGUsbC5zaXRlLHUpO2M9YVswXSxsPWFbZi0xXSxsLmVkZ2U9SnIoYy5zaXRlLGwuc2l0ZSxudWxsLHUpLFZyKGMpLFZyKGwpfWZ1bmN0aW9uIGpyKG4pe2Zvcih2YXIgdCxlLHIsdSxpPW4ueCxvPW4ueSxhPVFjLl87YTspaWYocj1GcihhLG8pLWkscj5DYSlhPWEuTDtlbHNle2lmKHU9aS1IcihhLG8pLCEodT5DYSkpe3I+LUNhPyh0PWEuUCxlPWEpOnU+LUNhPyh0PWEsZT1hLk4pOnQ9ZT1hO2JyZWFrfWlmKCFhLlIpe3Q9YTticmVha31hPWEuUn12YXIgYz1EcihuKTtpZihRYy5pbnNlcnQodCxjKSx0fHxlKXtpZih0PT09ZSlyZXR1cm4gWHIodCksZT1Ecih0LnNpdGUpLFFjLmluc2VydChjLGUpLGMuZWRnZT1lLmVkZ2U9SnIodC5zaXRlLGMuc2l0ZSksVnIodCksdm9pZCBWcihlKTtpZighZSlyZXR1cm4gdm9pZChjLmVkZ2U9SnIodC5zaXRlLGMuc2l0ZSkpO1hyKHQpLFhyKGUpO3ZhciBsPXQuc2l0ZSxzPWwueCxmPWwueSxoPW4ueC1zLGc9bi55LWYscD1lLnNpdGUsdj1wLngtcyxkPXAueS1mLG09MiooaCpkLWcqdikseT1oKmgrZypnLE09dip2K2QqZCx4PXt4OihkKnktZypNKS9tK3MseTooaCpNLXYqeSkvbStmfTtLcihlLmVkZ2UsbCxwLHgpLGMuZWRnZT1KcihsLG4sbnVsbCx4KSxlLmVkZ2U9SnIobixwLG51bGwseCksVnIodCksVnIoZSl9fWZ1bmN0aW9uIEZyKG4sdCl7dmFyIGU9bi5zaXRlLHI9ZS54LHU9ZS55LGk9dS10O2lmKCFpKXJldHVybiByO3ZhciBvPW4uUDtpZighbylyZXR1cm4tMS8wO2U9by5zaXRlO3ZhciBhPWUueCxjPWUueSxsPWMtdDtpZighbClyZXR1cm4gYTt2YXIgcz1hLXIsZj0xL2ktMS9sLGg9cy9sO3JldHVybiBmPygtaCtNYXRoLnNxcnQoaCpoLTIqZioocypzLygtMipsKS1jK2wvMit1LWkvMikpKS9mK3I6KHIrYSkvMn1mdW5jdGlvbiBIcihuLHQpe3ZhciBlPW4uTjtpZihlKXJldHVybiBGcihlLHQpO3ZhciByPW4uc2l0ZTtyZXR1cm4gci55PT09dD9yLng6MS8wfWZ1bmN0aW9uIE9yKG4pe3RoaXMuc2l0ZT1uLHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gSXIobil7Zm9yKHZhciB0LGUscix1LGksbyxhLGMsbCxzLGY9blswXVswXSxoPW5bMV1bMF0sZz1uWzBdWzFdLHA9blsxXVsxXSx2PUtjLGQ9di5sZW5ndGg7ZC0tOylpZihpPXZbZF0saSYmaS5wcmVwYXJlKCkpZm9yKGE9aS5lZGdlcyxjPWEubGVuZ3RoLG89MDtjPm87KXM9YVtvXS5lbmQoKSxyPXMueCx1PXMueSxsPWFbKytvJWNdLnN0YXJ0KCksdD1sLngsZT1sLnksKGdhKHItdCk+Q2F8fGdhKHUtZSk+Q2EpJiYoYS5zcGxpY2UobywwLG5ldyBRcihHcihpLnNpdGUscyxnYShyLWYpPENhJiZwLXU+Q2E/e3g6Zix5OmdhKHQtZik8Q2E/ZTpwfTpnYSh1LXApPENhJiZoLXI+Q2E/e3g6Z2EoZS1wKTxDYT90OmgseTpwfTpnYShyLWgpPENhJiZ1LWc+Q2E/e3g6aCx5OmdhKHQtaCk8Q2E/ZTpnfTpnYSh1LWcpPENhJiZyLWY+Q2E/e3g6Z2EoZS1nKTxDYT90OmYseTpnfTpudWxsKSxpLnNpdGUsbnVsbCkpLCsrYyl9ZnVuY3Rpb24gWXIobix0KXtyZXR1cm4gdC5hbmdsZS1uLmFuZ2xlfWZ1bmN0aW9uIFpyKCl7dHUodGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFZyKG4pe3ZhciB0PW4uUCxlPW4uTjtpZih0JiZlKXt2YXIgcj10LnNpdGUsdT1uLnNpdGUsaT1lLnNpdGU7aWYociE9PWkpe3ZhciBvPXUueCxhPXUueSxjPXIueC1vLGw9ci55LWEscz1pLngtbyxmPWkueS1hLGg9MiooYypmLWwqcyk7aWYoIShoPj0temEpKXt2YXIgZz1jKmMrbCpsLHA9cypzK2YqZix2PShmKmctbCpwKS9oLGQ9KGMqcC1zKmcpL2gsZj1kK2EsbT1ybC5wb3AoKXx8bmV3IFpyO20uYXJjPW4sbS5zaXRlPXUsbS54PXYrbyxtLnk9ZitNYXRoLnNxcnQodip2K2QqZCksbS5jeT1mLG4uY2lyY2xlPW07Zm9yKHZhciB5PW51bGwsTT10bC5fO007KWlmKG0ueTxNLnl8fG0ueT09PU0ueSYmbS54PD1NLngpe2lmKCFNLkwpe3k9TS5QO2JyZWFrfU09TS5MfWVsc2V7aWYoIU0uUil7eT1NO2JyZWFrfU09TS5SfXRsLmluc2VydCh5LG0pLHl8fChubD1tKX19fX1mdW5jdGlvbiBYcihuKXt2YXIgdD1uLmNpcmNsZTt0JiYodC5QfHwobmw9dC5OKSx0bC5yZW1vdmUodCkscmwucHVzaCh0KSx0dSh0KSxuLmNpcmNsZT1udWxsKX1mdW5jdGlvbiAkcihuKXtmb3IodmFyIHQsZT1HYyxyPU9lKG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pLHU9ZS5sZW5ndGg7dS0tOyl0PWVbdV0sKCFCcih0LG4pfHwhcih0KXx8Z2EodC5hLngtdC5iLngpPENhJiZnYSh0LmEueS10LmIueSk8Q2EpJiYodC5hPXQuYj1udWxsLGUuc3BsaWNlKHUsMSkpfWZ1bmN0aW9uIEJyKG4sdCl7dmFyIGU9bi5iO2lmKGUpcmV0dXJuITA7dmFyIHIsdSxpPW4uYSxvPXRbMF1bMF0sYT10WzFdWzBdLGM9dFswXVsxXSxsPXRbMV1bMV0scz1uLmwsZj1uLnIsaD1zLngsZz1zLnkscD1mLngsdj1mLnksZD0oaCtwKS8yLG09KGcrdikvMjtpZih2PT09Zyl7aWYobz5kfHxkPj1hKXJldHVybjtpZihoPnApe2lmKGkpe2lmKGkueT49bClyZXR1cm59ZWxzZSBpPXt4OmQseTpjfTtlPXt4OmQseTpsfX1lbHNle2lmKGkpe2lmKGkueTxjKXJldHVybn1lbHNlIGk9e3g6ZCx5Omx9O2U9e3g6ZCx5OmN9fX1lbHNlIGlmKHI9KGgtcCkvKHYtZyksdT1tLXIqZCwtMT5yfHxyPjEpaWYoaD5wKXtpZihpKXtpZihpLnk+PWwpcmV0dXJufWVsc2UgaT17eDooYy11KS9yLHk6Y307ZT17eDoobC11KS9yLHk6bH19ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OihsLXUpL3IseTpsfTtlPXt4OihjLXUpL3IseTpjfX1lbHNlIGlmKHY+Zyl7aWYoaSl7aWYoaS54Pj1hKXJldHVybn1lbHNlIGk9e3g6byx5OnIqbyt1fTtlPXt4OmEseTpyKmErdX19ZWxzZXtpZihpKXtpZihpLng8bylyZXR1cm59ZWxzZSBpPXt4OmEseTpyKmErdX07ZT17eDpvLHk6cipvK3V9fXJldHVybiBuLmE9aSxuLmI9ZSwhMH1mdW5jdGlvbiBXcihuLHQpe3RoaXMubD1uLHRoaXMucj10LHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiBKcihuLHQsZSxyKXt2YXIgdT1uZXcgV3Iobix0KTtyZXR1cm4gR2MucHVzaCh1KSxlJiZLcih1LG4sdCxlKSxyJiZLcih1LHQsbixyKSxLY1tuLmldLmVkZ2VzLnB1c2gobmV3IFFyKHUsbix0KSksS2NbdC5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LHQsbikpLHV9ZnVuY3Rpb24gR3Iobix0LGUpe3ZhciByPW5ldyBXcihuLG51bGwpO3JldHVybiByLmE9dCxyLmI9ZSxHYy5wdXNoKHIpLHJ9ZnVuY3Rpb24gS3Iobix0LGUscil7bi5hfHxuLmI/bi5sPT09ZT9uLmI9cjpuLmE9cjoobi5hPXIsbi5sPXQsbi5yPWUpfWZ1bmN0aW9uIFFyKG4sdCxlKXt2YXIgcj1uLmEsdT1uLmI7dGhpcy5lZGdlPW4sdGhpcy5zaXRlPXQsdGhpcy5hbmdsZT1lP01hdGguYXRhbjIoZS55LXQueSxlLngtdC54KTpuLmw9PT10P01hdGguYXRhbjIodS54LXIueCxyLnktdS55KTpNYXRoLmF0YW4yKHIueC11LngsdS55LXIueSl9ZnVuY3Rpb24gbnUoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiB0dShuKXtuLlU9bi5DPW4uTD1uLlI9bi5QPW4uTj1udWxsfWZ1bmN0aW9uIGV1KG4sdCl7dmFyIGU9dCxyPXQuUix1PWUuVTt1P3UuTD09PWU/dS5MPXI6dS5SPXI6bi5fPXIsci5VPXUsZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBydShuLHQpe3ZhciBlPXQscj10LkwsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gdXUobil7Zm9yKDtuLkw7KW49bi5MO3JldHVybiBufWZ1bmN0aW9uIGl1KG4sdCl7dmFyIGUscix1LGk9bi5zb3J0KG91KS5wb3AoKTtmb3IoR2M9W10sS2M9bmV3IEFycmF5KG4ubGVuZ3RoKSxRYz1uZXcgbnUsdGw9bmV3IG51OzspaWYodT1ubCxpJiYoIXV8fGkueTx1Lnl8fGkueT09PXUueSYmaS54PHUueCkpKGkueCE9PWV8fGkueSE9PXIpJiYoS2NbaS5pXT1uZXcgT3IoaSksanIoaSksZT1pLngscj1pLnkpLGk9bi5wb3AoKTtlbHNle2lmKCF1KWJyZWFrO1VyKHUuYXJjKX10JiYoJHIodCksSXIodCkpO3ZhciBvPXtjZWxsczpLYyxlZGdlczpHY307cmV0dXJuIFFjPXRsPUdjPUtjPW51bGwsb31mdW5jdGlvbiBvdShuLHQpe3JldHVybiB0Lnktbi55fHx0Lngtbi54fWZ1bmN0aW9uIGF1KG4sdCxlKXtyZXR1cm4obi54LWUueCkqKHQueS1uLnkpLShuLngtdC54KSooZS55LW4ueSl9ZnVuY3Rpb24gY3Uobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBsdShuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIHN1KCl7cmV0dXJue2xlYWY6ITAsbm9kZXM6W10scG9pbnQ6bnVsbCx4Om51bGwseTpudWxsfX1mdW5jdGlvbiBmdShuLHQsZSxyLHUsaSl7aWYoIW4odCxlLHIsdSxpKSl7dmFyIG89LjUqKGUrdSksYT0uNSoocitpKSxjPXQubm9kZXM7Y1swXSYmZnUobixjWzBdLGUscixvLGEpLGNbMV0mJmZ1KG4sY1sxXSxvLHIsdSxhKSxjWzJdJiZmdShuLGNbMl0sZSxhLG8saSksY1szXSYmZnUobixjWzNdLG8sYSx1LGkpfX1mdW5jdGlvbiBodShuLHQsZSxyLHUsaSxvKXt2YXIgYSxjPTEvMDtyZXR1cm4gZnVuY3Rpb24gbChuLHMsZixoLGcpe2lmKCEocz5pfHxmPm98fHI+aHx8dT5nKSl7aWYocD1uLnBvaW50KXt2YXIgcCx2PXQtbi54LGQ9ZS1uLnksbT12KnYrZCpkO2lmKGM+bSl7dmFyIHk9TWF0aC5zcXJ0KGM9bSk7cj10LXksdT1lLXksaT10K3ksbz1lK3ksYT1wfX1mb3IodmFyIE09bi5ub2Rlcyx4PS41KihzK2gpLGI9LjUqKGYrZyksXz10Pj14LHc9ZT49YixTPXc8PDF8XyxrPVMrNDtrPlM7KytTKWlmKG49TVszJlNdKXN3aXRjaCgzJlMpe2Nhc2UgMDpsKG4scyxmLHgsYik7YnJlYWs7Y2FzZSAxOmwobix4LGYsaCxiKTticmVhaztjYXNlIDI6bChuLHMsYix4LGcpO2JyZWFrO2Nhc2UgMzpsKG4seCxiLGgsZyl9fX0obixyLHUsaSxvKSxhfWZ1bmN0aW9uIGd1KG4sdCl7bj10YS5yZ2IobiksdD10YS5yZ2IodCk7dmFyIGU9bi5yLHI9bi5nLHU9bi5iLGk9dC5yLWUsbz10LmctcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4iIyIreHQoTWF0aC5yb3VuZChlK2kqbikpK3h0KE1hdGgucm91bmQocitvKm4pKSt4dChNYXRoLnJvdW5kKHUrYSpuKSl9fWZ1bmN0aW9uIHB1KG4sdCl7dmFyIGUscj17fSx1PXt9O2ZvcihlIGluIG4pZSBpbiB0P3JbZV09bXUobltlXSx0W2VdKTp1W2VdPW5bZV07Zm9yKGUgaW4gdCllIGluIG58fCh1W2VdPXRbZV0pO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZSBpbiByKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gdnUobix0KXtyZXR1cm4gbj0rbix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBuKigxLWUpK3QqZX19ZnVuY3Rpb24gZHUobix0KXt2YXIgZSxyLHUsaT1pbC5sYXN0SW5kZXg9b2wubGFzdEluZGV4PTAsbz0tMSxhPVtdLGM9W107Zm9yKG4rPSIiLHQrPSIiOyhlPWlsLmV4ZWMobikpJiYocj1vbC5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zbGljZShpLHUpLGFbb10/YVtvXSs9dTphWysrb109dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9hW29dP2Fbb10rPXI6YVsrK29dPXI6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6dnUoZSxyKX0pKSxpPW9sLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zbGljZShpKSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLGEubGVuZ3RoPDI/Y1swXT8odD1jWzBdLngsZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9KTpmdW5jdGlvbigpe3JldHVybiB0fToodD1jLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIGUscj0wO3Q+cjsrK3IpYVsoZT1jW3JdKS5pXT1lLngobik7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBtdShuLHQpe2Zvcih2YXIgZSxyPXRhLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPXRhLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiB5dShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPW4ubGVuZ3RoLG89dC5sZW5ndGgsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDthPmU7KytlKXIucHVzaChtdShuW2VdLHRbZV0pKTtmb3IoO2k+ZTsrK2UpdVtlXT1uW2VdO2Zvcig7bz5lOysrZSl1W2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7YT5lOysrZSl1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIE11KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiB4dShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiBidShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBfdShuKXtyZXR1cm4gbipufWZ1bmN0aW9uIHd1KG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiBTdShuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24ga3Uobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBFdShuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKlJhKX1mdW5jdGlvbiBBdShuKXtyZXR1cm4gTWF0aC5wb3coMiwxMCoobi0xKSl9ZnVuY3Rpb24gTnUobil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtbipuKX1mdW5jdGlvbiBDdShuLHQpe3ZhciBlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PS40NSksYXJndW1lbnRzLmxlbmd0aD9lPXQvTGEqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLC0xMCpyKSpNYXRoLnNpbigoci1lKSpMYS90KX19ZnVuY3Rpb24genUobil7cmV0dXJuIG58fChuPTEuNzAxNTgpLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9fWZ1bmN0aW9uIHF1KG4pe3JldHVybiAxLzIuNzU+bj83LjU2MjUqbipuOjIvMi43NT5uPzcuNTYyNSoobi09MS41LzIuNzUpKm4rLjc1OjIuNS8yLjc1Pm4/Ny41NjI1KihuLT0yLjI1LzIuNzUpKm4rLjkzNzU6Ny41NjI1KihuLT0yLjYyNS8yLjc1KSpuKy45ODQzNzV9ZnVuY3Rpb24gTHUobix0KXtuPXRhLmhjbChuKSx0PXRhLmhjbCh0KTt2YXIgZT1uLmgscj1uLmMsdT1uLmwsaT10LmgtZSxvPXQuYy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5jOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIHN0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gVHUobix0KXtuPXRhLmhzbChuKSx0PXRhLmhzbCh0KTt2YXIgZT1uLmgscj1uLnMsdT1uLmwsaT10LmgtZSxvPXQucy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5zOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGN0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gUnUobix0KXtuPXRhLmxhYihuKSx0PXRhLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsdT1uLmIsaT10LmwtZSxvPXQuYS1yLGE9dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBodChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIER1KG4sdCl7cmV0dXJuIHQtPW4sZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQobit0KmUpfX1mdW5jdGlvbiBQdShuKXt2YXIgdD1bbi5hLG4uYl0sZT1bbi5jLG4uZF0scj1qdSh0KSx1PVV1KHQsZSksaT1qdShGdShlLHQsLXUpKXx8MDt0WzBdKmVbMV08ZVswXSp0WzFdJiYodFswXSo9LTEsdFsxXSo9LTEscio9LTEsdSo9LTEpLHRoaXMucm90YXRlPShyP01hdGguYXRhbjIodFsxXSx0WzBdKTpNYXRoLmF0YW4yKC1lWzBdLGVbMV0pKSpQYSx0aGlzLnRyYW5zbGF0ZT1bbi5lLG4uZl0sdGhpcy5zY2FsZT1bcixpXSx0aGlzLnNrZXc9aT9NYXRoLmF0YW4yKHUsaSkqUGE6MH1mdW5jdGlvbiBVdShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdfWZ1bmN0aW9uIGp1KG4pe3ZhciB0PU1hdGguc3FydChVdShuLG4pKTtyZXR1cm4gdCYmKG5bMF0vPXQsblsxXS89dCksdH1mdW5jdGlvbiBGdShuLHQsZSl7cmV0dXJuIG5bMF0rPWUqdFswXSxuWzFdKz1lKnRbMV0sbn1mdW5jdGlvbiBIdShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPXRhLnRyYW5zZm9ybShuKSxvPXRhLnRyYW5zZm9ybSh0KSxhPWkudHJhbnNsYXRlLGM9by50cmFuc2xhdGUsbD1pLnJvdGF0ZSxzPW8ucm90YXRlLGY9aS5za2V3LGg9by5za2V3LGc9aS5zY2FsZSxwPW8uc2NhbGU7cmV0dXJuIGFbMF0hPWNbMF18fGFbMV0hPWNbMV0/KHIucHVzaCgidHJhbnNsYXRlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aToxLHg6dnUoYVswXSxjWzBdKX0se2k6Myx4OnZ1KGFbMV0sY1sxXSl9KSk6ci5wdXNoKGNbMF18fGNbMV0/InRyYW5zbGF0ZSgiK2MrIikiOiIiKSxsIT1zPyhsLXM+MTgwP3MrPTM2MDpzLWw+MTgwJiYobCs9MzYwKSx1LnB1c2goe2k6ci5wdXNoKHIucG9wKCkrInJvdGF0ZSgiLG51bGwsIikiKS0yLHg6dnUobCxzKX0pKTpzJiZyLnB1c2goci5wb3AoKSsicm90YXRlKCIrcysiKSIpLGYhPWg/dS5wdXNoKHtpOnIucHVzaChyLnBvcCgpKyJza2V3WCgiLG51bGwsIikiKS0yLHg6dnUoZixoKX0pOmgmJnIucHVzaChyLnBvcCgpKyJza2V3WCgiK2grIikiKSxnWzBdIT1wWzBdfHxnWzFdIT1wWzFdPyhlPXIucHVzaChyLnBvcCgpKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKSx1LnB1c2goe2k6ZS00LHg6dnUoZ1swXSxwWzBdKX0se2k6ZS0yLHg6dnUoZ1sxXSxwWzFdKX0pKTooMSE9cFswXXx8MSE9cFsxXSkmJnIucHVzaChyLnBvcCgpKyJzY2FsZSgiK3ArIikiKSxlPXUubGVuZ3RoLGZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxpPS0xOysraTxlOylyWyh0PXVbaV0pLmldPXQueChuKTtyZXR1cm4gci5qb2luKCIiKX19ZnVuY3Rpb24gT3Uobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4oZS1uKS90fX1mdW5jdGlvbiBJdShuLHQpe3JldHVybiB0PSh0LT1uPStuKXx8MS90LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsKGUtbikvdCkpfX1mdW5jdGlvbiBZdShuKXtmb3IodmFyIHQ9bi5zb3VyY2UsZT1uLnRhcmdldCxyPVZ1KHQsZSksdT1bdF07dCE9PXI7KXQ9dC5wYXJlbnQsdS5wdXNoKHQpO2Zvcih2YXIgaT11Lmxlbmd0aDtlIT09cjspdS5zcGxpY2UoaSwwLGUpLGU9ZS5wYXJlbnQ7cmV0dXJuIHV9ZnVuY3Rpb24gWnUobil7Zm9yKHZhciB0PVtdLGU9bi5wYXJlbnQ7bnVsbCE9ZTspdC5wdXNoKG4pLG49ZSxlPWUucGFyZW50O3JldHVybiB0LnB1c2gobiksdH1mdW5jdGlvbiBWdShuLHQpe2lmKG49PT10KXJldHVybiBuO2Zvcih2YXIgZT1adShuKSxyPVp1KHQpLHU9ZS5wb3AoKSxpPXIucG9wKCksbz1udWxsO3U9PT1pOylvPXUsdT1lLnBvcCgpLGk9ci5wb3AoKTtyZXR1cm4gb31mdW5jdGlvbiBYdShuKXtuLmZpeGVkfD0yfWZ1bmN0aW9uICR1KG4pe24uZml4ZWQmPS03fWZ1bmN0aW9uIEJ1KG4pe24uZml4ZWR8PTQsbi5weD1uLngsbi5weT1uLnl9ZnVuY3Rpb24gV3Uobil7bi5maXhlZCY9LTV9ZnVuY3Rpb24gSnUobix0LGUpe3ZhciByPTAsdT0wO2lmKG4uY2hhcmdlPTAsIW4ubGVhZilmb3IodmFyIGksbz1uLm5vZGVzLGE9by5sZW5ndGgsYz0tMTsrK2M8YTspaT1vW2NdLG51bGwhPWkmJihKdShpLHQsZSksbi5jaGFyZ2UrPWkuY2hhcmdlLHIrPWkuY2hhcmdlKmkuY3gsdSs9aS5jaGFyZ2UqaS5jeSk7aWYobi5wb2ludCl7bi5sZWFmfHwobi5wb2ludC54Kz1NYXRoLnJhbmRvbSgpLS41LG4ucG9pbnQueSs9TWF0aC5yYW5kb20oKS0uNSk7dmFyIGw9dCplW24ucG9pbnQuaW5kZXhdO24uY2hhcmdlKz1uLnBvaW50Q2hhcmdlPWwscis9bCpuLnBvaW50LngsdSs9bCpuLnBvaW50Lnl9bi5jeD1yL24uY2hhcmdlLG4uY3k9dS9uLmNoYXJnZX1mdW5jdGlvbiBHdShuLHQpe3JldHVybiB0YS5yZWJpbmQobix0LCJzb3J0IiwiY2hpbGRyZW4iLCJ2YWx1ZSIpLG4ubm9kZXM9bixuLmxpbmtzPXJpLG59ZnVuY3Rpb24gS3Uobix0KXtmb3IodmFyIGU9W25dO251bGwhPShuPWUucG9wKCkpOylpZih0KG4pLCh1PW4uY2hpbGRyZW4pJiYocj11Lmxlbmd0aCkpZm9yKHZhciByLHU7LS1yPj0wOyllLnB1c2godVtyXSl9ZnVuY3Rpb24gUXUobix0KXtmb3IodmFyIGU9W25dLHI9W107bnVsbCE9KG49ZS5wb3AoKSk7KWlmKHIucHVzaChuKSwoaT1uLmNoaWxkcmVuKSYmKHU9aS5sZW5ndGgpKWZvcih2YXIgdSxpLG89LTE7KytvPHU7KWUucHVzaChpW29dKTtmb3IoO251bGwhPShuPXIucG9wKCkpOyl0KG4pfWZ1bmN0aW9uIG5pKG4pe3JldHVybiBuLmNoaWxkcmVufWZ1bmN0aW9uIHRpKG4pe3JldHVybiBuLnZhbHVlfWZ1bmN0aW9uIGVpKG4sdCl7cmV0dXJuIHQudmFsdWUtbi52YWx1ZX1mdW5jdGlvbiByaShuKXtyZXR1cm4gdGEubWVyZ2Uobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4uY2hpbGRyZW58fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuLHRhcmdldDp0fX0pfSkpfWZ1bmN0aW9uIHVpKG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gaWkobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBvaShuLHQsZSl7bi55MD10LG4ueT1lfWZ1bmN0aW9uIGFpKG4pe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCl9ZnVuY3Rpb24gY2kobil7Zm9yKHZhciB0PS0xLGU9blswXS5sZW5ndGgscj1bXTsrK3Q8ZTspclt0XT0wO3JldHVybiByfWZ1bmN0aW9uIGxpKG4pe2Zvcih2YXIgdCxlPTEscj0wLHU9blswXVsxXSxpPW4ubGVuZ3RoO2k+ZTsrK2UpKHQ9bltlXVsxXSk+dSYmKHI9ZSx1PXQpO3JldHVybiByfWZ1bmN0aW9uIHNpKG4pe3JldHVybiBuLnJlZHVjZShmaSwwKX1mdW5jdGlvbiBmaShuLHQpe3JldHVybiBuK3RbMV19ZnVuY3Rpb24gaGkobix0KXtyZXR1cm4gZ2kobixNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKzEpKX1mdW5jdGlvbiBnaShuLHQpe2Zvcih2YXIgZT0tMSxyPStuWzBdLHU9KG5bMV0tcikvdCxpPVtdOysrZTw9dDspaVtlXT11KmUrcjtyZXR1cm4gaX1mdW5jdGlvbiBwaShuKXtyZXR1cm5bdGEubWluKG4pLHRhLm1heChuKV19ZnVuY3Rpb24gdmkobix0KXtyZXR1cm4gbi52YWx1ZS10LnZhbHVlfWZ1bmN0aW9uIGRpKG4sdCl7dmFyIGU9bi5fcGFja19uZXh0O24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1uLHQuX3BhY2tfbmV4dD1lLGUuX3BhY2tfcHJldj10fWZ1bmN0aW9uIG1pKG4sdCl7bi5fcGFja19uZXh0PXQsdC5fcGFja19wcmV2PW59ZnVuY3Rpb24geWkobix0KXt2YXIgZT10Lngtbi54LHI9dC55LW4ueSx1PW4ucit0LnI7cmV0dXJuLjk5OSp1KnU+ZSplK3Iqcn1mdW5jdGlvbiBNaShuKXtmdW5jdGlvbiB0KG4pe3M9TWF0aC5taW4obi54LW4ucixzKSxmPU1hdGgubWF4KG4ueCtuLnIsZiksaD1NYXRoLm1pbihuLnktbi5yLGgpLGc9TWF0aC5tYXgobi55K24ucixnKX1pZigoZT1uLmNoaWxkcmVuKSYmKGw9ZS5sZW5ndGgpKXt2YXIgZSxyLHUsaSxvLGEsYyxsLHM9MS8wLGY9LTEvMCxoPTEvMCxnPS0xLzA7aWYoZS5mb3JFYWNoKHhpKSxyPWVbMF0sci54PS1yLnIsci55PTAsdChyKSxsPjEmJih1PWVbMV0sdS54PXUucix1Lnk9MCx0KHUpLGw+MikpZm9yKGk9ZVsyXSx3aShyLHUsaSksdChpKSxkaShyLGkpLHIuX3BhY2tfcHJldj1pLGRpKGksdSksdT1yLl9wYWNrX25leHQsbz0zO2w+bztvKyspe3dpKHIsdSxpPWVbb10pO3ZhciBwPTAsdj0xLGQ9MTtmb3IoYT11Ll9wYWNrX25leHQ7YSE9PXU7YT1hLl9wYWNrX25leHQsdisrKWlmKHlpKGEsaSkpe3A9MTticmVha31pZigxPT1wKWZvcihjPXIuX3BhY2tfcHJldjtjIT09YS5fcGFja19wcmV2JiYheWkoYyxpKTtjPWMuX3BhY2tfcHJldixkKyspO3A/KGQ+dnx8dj09ZCYmdS5yPHIucj9taShyLHU9YSk6bWkocj1jLHUpLG8tLSk6KGRpKHIsaSksdT1pLHQoaSkpfXZhciBtPShzK2YpLzIseT0oaCtnKS8yLE09MDtmb3Iobz0wO2w+bztvKyspaT1lW29dLGkueC09bSxpLnktPXksTT1NYXRoLm1heChNLGkucitNYXRoLnNxcnQoaS54KmkueCtpLnkqaS55KSk7bi5yPU0sZS5mb3JFYWNoKGJpKX19ZnVuY3Rpb24geGkobil7bi5fcGFja19uZXh0PW4uX3BhY2tfcHJldj1ufWZ1bmN0aW9uIGJpKG4pe2RlbGV0ZSBuLl9wYWNrX25leHQsZGVsZXRlIG4uX3BhY2tfcHJldn1mdW5jdGlvbiBfaShuLHQsZSxyKXt2YXIgdT1uLmNoaWxkcmVuO2lmKG4ueD10Kz1yKm4ueCxuLnk9ZSs9cipuLnksbi5yKj1yLHUpZm9yKHZhciBpPS0xLG89dS5sZW5ndGg7KytpPG87KV9pKHVbaV0sdCxlLHIpfWZ1bmN0aW9uIHdpKG4sdCxlKXt2YXIgcj1uLnIrZS5yLHU9dC54LW4ueCxpPXQueS1uLnk7aWYociYmKHV8fGkpKXt2YXIgbz10LnIrZS5yLGE9dSp1K2kqaTtvKj1vLHIqPXI7dmFyIGM9LjUrKHItbykvKDIqYSksbD1NYXRoLnNxcnQoTWF0aC5tYXgoMCwyKm8qKHIrYSktKHItPWEpKnItbypvKSkvKDIqYSk7ZS54PW4ueCtjKnUrbCppLGUueT1uLnkrYyppLWwqdX1lbHNlIGUueD1uLngrcixlLnk9bi55fWZ1bmN0aW9uIFNpKG4sdCl7cmV0dXJuIG4ucGFyZW50PT10LnBhcmVudD8xOjJ9ZnVuY3Rpb24ga2kobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdC5sZW5ndGg/dFswXTpuLnR9ZnVuY3Rpb24gRWkobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybih0PWUubGVuZ3RoKT9lW3QtMV06bi50fWZ1bmN0aW9uIEFpKG4sdCxlKXt2YXIgcj1lLyh0Lmktbi5pKTt0LmMtPXIsdC5zKz1lLG4uYys9cix0LnorPWUsdC5tKz1lfWZ1bmN0aW9uIE5pKG4pe2Zvcih2YXIgdCxlPTAscj0wLHU9bi5jaGlsZHJlbixpPXUubGVuZ3RoOy0taT49MDspdD11W2ldLHQueis9ZSx0Lm0rPWUsZSs9dC5zKyhyKz10LmMpfWZ1bmN0aW9uIENpKG4sdCxlKXtyZXR1cm4gbi5hLnBhcmVudD09PXQucGFyZW50P24uYTplfWZ1bmN0aW9uIHppKG4pe3JldHVybiAxK3RhLm1heChuLGZ1bmN0aW9uKG4pe3JldHVybiBuLnl9KX1mdW5jdGlvbiBxaShuKXtyZXR1cm4gbi5yZWR1Y2UoZnVuY3Rpb24obix0KXtyZXR1cm4gbit0Lnh9LDApL24ubGVuZ3RofWZ1bmN0aW9uIExpKG4pe3ZhciB0PW4uY2hpbGRyZW47cmV0dXJuIHQmJnQubGVuZ3RoP0xpKHRbMF0pOm59ZnVuY3Rpb24gVGkobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybiBlJiYodD1lLmxlbmd0aCk/VGkoZVt0LTFdKTpufWZ1bmN0aW9uIFJpKG4pe3JldHVybnt4Om4ueCx5Om4ueSxkeDpuLmR4LGR5Om4uZHl9fWZ1bmN0aW9uIERpKG4sdCl7dmFyIGU9bi54K3RbM10scj1uLnkrdFswXSx1PW4uZHgtdFsxXS10WzNdLGk9bi5keS10WzBdLXRbMl07cmV0dXJuIDA+dSYmKGUrPXUvMix1PTApLDA+aSYmKHIrPWkvMixpPTApLHt4OmUseTpyLGR4OnUsZHk6aX19ZnVuY3Rpb24gUGkobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuIGU+dD9bdCxlXTpbZSx0XX1mdW5jdGlvbiBVaShuKXtyZXR1cm4gbi5yYW5nZUV4dGVudD9uLnJhbmdlRXh0ZW50KCk6UGkobi5yYW5nZSgpKX1mdW5jdGlvbiBqaShuLHQsZSxyKXt2YXIgdT1lKG5bMF0sblsxXSksaT1yKHRbMF0sdFsxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBpKHUobikpfX1mdW5jdGlvbiBGaShuLHQpe3ZhciBlLHI9MCx1PW4ubGVuZ3RoLTEsaT1uW3JdLG89blt1XTtyZXR1cm4gaT5vJiYoZT1yLHI9dSx1PWUsZT1pLGk9byxvPWUpLG5bcl09dC5mbG9vcihpKSxuW3VdPXQuY2VpbChvKSxufWZ1bmN0aW9uIEhpKG4pe3JldHVybiBuP3tmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5mbG9vcih0L24pKm59LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguY2VpbCh0L24pKm59fTptbH1mdW5jdGlvbiBPaShuLHQsZSxyKXt2YXIgdT1bXSxpPVtdLG89MCxhPU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKS0xO2ZvcihuW2FdPG5bMF0mJihuPW4uc2xpY2UoKS5yZXZlcnNlKCksdD10LnNsaWNlKCkucmV2ZXJzZSgpKTsrK288PWE7KXUucHVzaChlKG5bby0xXSxuW29dKSksaS5wdXNoKHIodFtvLTFdLHRbb10pKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dGEuYmlzZWN0KG4sdCwxLGEpLTE7cmV0dXJuIGlbZV0odVtlXSh0KSl9fWZ1bmN0aW9uIElpKG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgdT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk+Mj9PaTpqaSxjPXI/SXU6T3U7cmV0dXJuIG89dShuLHQsYyxlKSxhPXUodCxuLGMsbXUpLGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbyhuKX12YXIgbyxhO3JldHVybiBpLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gYShuKX0saS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dC5tYXAoTnVtYmVyKSx1KCkpOm59LGkucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bix1KCkpOnR9LGkucmFuZ2VSb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gaS5yYW5nZShuKS5pbnRlcnBvbGF0ZShEdSl9LGkuY2xhbXA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix1KCkpOnJ9LGkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LGkudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIFhpKG4sdCl9LGkudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiAkaShuLHQsZSl9LGkubmljZT1mdW5jdGlvbih0KXtyZXR1cm4gWmkobix0KSx1KCl9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiBJaShuLHQsZSxyKX0sdSgpfWZ1bmN0aW9uIFlpKG4sdCl7cmV0dXJuIHRhLnJlYmluZChuLHQsInJhbmdlIiwicmFuZ2VSb3VuZCIsImludGVycG9sYXRlIiwiY2xhbXAiKX1mdW5jdGlvbiBaaShuLHQpe3JldHVybiBGaShuLEhpKFZpKG4sdClbMl0pKX1mdW5jdGlvbiBWaShuLHQpe251bGw9PXQmJih0PTEwKTt2YXIgZT1QaShuKSxyPWVbMV0tZVswXSx1PU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coci90KS9NYXRoLkxOMTApKSxpPXQvcip1O3JldHVybi4xNT49aT91Kj0xMDouMzU+PWk/dSo9NTouNzU+PWkmJih1Kj0yKSxlWzBdPU1hdGguY2VpbChlWzBdL3UpKnUsZVsxXT1NYXRoLmZsb29yKGVbMV0vdSkqdSsuNSp1LGVbMl09dSxlfWZ1bmN0aW9uIFhpKG4sdCl7cmV0dXJuIHRhLnJhbmdlLmFwcGx5KHRhLFZpKG4sdCkpfWZ1bmN0aW9uICRpKG4sdCxlKXt2YXIgcj1WaShuLHQpO2lmKGUpe3ZhciB1PWljLmV4ZWMoZSk7aWYodS5zaGlmdCgpLCJzIj09PXVbOF0pe3ZhciBpPXRhLmZvcm1hdFByZWZpeChNYXRoLm1heChnYShyWzBdKSxnYShyWzFdKSkpO3JldHVybiB1WzddfHwodVs3XT0iLiIrQmkoaS5zY2FsZShyWzJdKSkpLHVbOF09ImYiLGU9dGEuZm9ybWF0KHUuam9pbigiIikpLGZ1bmN0aW9uKG4pe3JldHVybiBlKGkuc2NhbGUobikpK2kuc3ltYm9sfX11WzddfHwodVs3XT0iLiIrV2kodVs4XSxyKSksZT11LmpvaW4oIiIpfWVsc2UgZT0iLC4iK0JpKHJbMl0pKyJmIjtyZXR1cm4gdGEuZm9ybWF0KGUpfWZ1bmN0aW9uIEJpKG4pe3JldHVybi1NYXRoLmZsb29yKE1hdGgubG9nKG4pL01hdGguTE4xMCsuMDEpfWZ1bmN0aW9uIFdpKG4sdCl7dmFyIGU9QmkodFsyXSk7cmV0dXJuIG4gaW4geWw/TWF0aC5hYnMoZS1CaShNYXRoLm1heChnYSh0WzBdKSxnYSh0WzFdKSkpKSsgKygiZSIhPT1uKTplLTIqKCIlIj09PW4pfWZ1bmN0aW9uIEppKG4sdCxlLHIpe2Z1bmN0aW9uIHUobil7cmV0dXJuKGU/TWF0aC5sb2coMD5uPzA6bik6LU1hdGgubG9nKG4+MD8wOi1uKSkvTWF0aC5sb2codCl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gZT9NYXRoLnBvdyh0LG4pOi1NYXRoLnBvdyh0LC1uKX1mdW5jdGlvbiBvKHQpe3JldHVybiBuKHUodCkpfXJldHVybiBvLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaShuLmludmVydCh0KSl9LG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXRbMF0+PTAsbi5kb21haW4oKHI9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxvKTpyfSxvLmJhc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K2Usbi5kb21haW4oci5tYXAodSkpLG8pOnR9LG8ubmljZT1mdW5jdGlvbigpe3ZhciB0PUZpKHIubWFwKHUpLGU/TWF0aDp4bCk7cmV0dXJuIG4uZG9tYWluKHQpLHI9dC5tYXAoaSksb30sby50aWNrcz1mdW5jdGlvbigpe3ZhciBuPVBpKHIpLG89W10sYT1uWzBdLGM9blsxXSxsPU1hdGguZmxvb3IodShhKSkscz1NYXRoLmNlaWwodShjKSksZj10JTE/Mjp0O2lmKGlzRmluaXRlKHMtbCkpe2lmKGUpe2Zvcig7cz5sO2wrKylmb3IodmFyIGg9MTtmPmg7aCsrKW8ucHVzaChpKGwpKmgpO28ucHVzaChpKGwpKX1lbHNlIGZvcihvLnB1c2goaShsKSk7bCsrPHM7KWZvcih2YXIgaD1mLTE7aD4wO2gtLSlvLnB1c2goaShsKSpoKTtmb3IobD0wO29bbF08YTtsKyspO2ZvcihzPW8ubGVuZ3RoO29bcy0xXT5jO3MtLSk7bz1vLnNsaWNlKGwscyl9cmV0dXJuIG99LG8udGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBNbDthcmd1bWVudHMubGVuZ3RoPDI/dD1NbDoiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9dGEuZm9ybWF0KHQpKTt2YXIgcixhPU1hdGgubWF4KC4xLG4vby50aWNrcygpLmxlbmd0aCksYz1lPyhyPTFlLTEyLE1hdGguY2VpbCk6KHI9LTFlLTEyLE1hdGguZmxvb3IpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi9pKGModShuKStyKSk8PWE/dChuKToiIn19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBKaShuLmNvcHkoKSx0LGUscil9LFlpKG8sbil9ZnVuY3Rpb24gR2kobix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4odSh0KSl9dmFyIHU9S2kodCksaT1LaSgxL3QpO3JldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaShuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbigoZT10Lm1hcChOdW1iZXIpKS5tYXAodSkpLHIpOmV9LHIudGlja3M9ZnVuY3Rpb24obil7cmV0dXJuIFhpKGUsbil9LHIudGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe3JldHVybiAkaShlLG4sdCl9LHIubmljZT1mdW5jdGlvbihuKXtyZXR1cm4gci5kb21haW4oWmkoZSxuKSl9LHIuZXhwb25lbnQ9ZnVuY3Rpb24obyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9S2kodD1vKSxpPUtpKDEvdCksbi5kb21haW4oZS5tYXAodSkpLHIpOnR9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBHaShuLmNvcHkoKSx0LGUpfSxZaShyLG4pfWZ1bmN0aW9uIEtpKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD50Py1NYXRoLnBvdygtdCxuKTpNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBRaShuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGlbKCh1LmdldChlKXx8KCJyYW5nZSI9PT10LnQ/dS5zZXQoZSxuLnB1c2goZSkpOjAvMCkpLTEpJWkubGVuZ3RoXX1mdW5jdGlvbiByKHQsZSl7cmV0dXJuIHRhLnJhbmdlKG4ubGVuZ3RoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHQrZSpufSl9dmFyIHUsaSxvO3JldHVybiBlLmRvbWFpbj1mdW5jdGlvbihyKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbjtuPVtdLHU9bmV3IGw7Zm9yKHZhciBpLG89LTEsYT1yLmxlbmd0aDsrK288YTspdS5oYXMoaT1yW29dKXx8dS5zZXQoaSxuLnB1c2goaSkpO3JldHVybiBlW3QudF0uYXBwbHkoZSx0LmEpfSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sbz0wLHQ9e3Q6InJhbmdlIixhOmFyZ3VtZW50c30sZSk6aX0sZS5yYW5nZVBvaW50cz1mdW5jdGlvbih1LGEpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCk7dmFyIGM9dVswXSxsPXVbMV0scz1uLmxlbmd0aDwyPyhjPShjK2wpLzIsMCk6KGwtYykvKG4ubGVuZ3RoLTErYSk7cmV0dXJuIGk9cihjK3MqYS8yLHMpLG89MCx0PXt0OiJyYW5nZVBvaW50cyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VSb3VuZFBvaW50cz1mdW5jdGlvbih1LGEpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCk7dmFyIGM9dVswXSxsPXVbMV0scz1uLmxlbmd0aDwyPyhjPWw9TWF0aC5yb3VuZCgoYytsKS8yKSwwKToobC1jKS8obi5sZW5ndGgtMSthKXwwO3JldHVybiBpPXIoYytNYXRoLnJvdW5kKHMqYS8yKyhsLWMtKG4ubGVuZ3RoLTErYSkqcykvMikscyksbz0wLHQ9e3Q6InJhbmdlUm91bmRQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZHM9ZnVuY3Rpb24odSxhLGMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYoYz1hKTt2YXIgbD11WzFdPHVbMF0scz11W2wtMF0sZj11WzEtbF0saD0oZi1zKS8obi5sZW5ndGgtYSsyKmMpO3JldHVybiBpPXIocytoKmMsaCksbCYmaS5yZXZlcnNlKCksbz1oKigxLWEpLHQ9e3Q6InJhbmdlQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRCYW5kcz1mdW5jdGlvbih1LGEsYyl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihjPWEpO3ZhciBsPXVbMV08dVswXSxzPXVbbC0wXSxmPXVbMS1sXSxoPU1hdGguZmxvb3IoKGYtcykvKG4ubGVuZ3RoLWErMipjKSk7cmV0dXJuIGk9cihzK01hdGgucm91bmQoKGYtcy0obi5sZW5ndGgtYSkqaCkvMiksaCksbCYmaS5yZXZlcnNlKCksbz1NYXRoLnJvdW5kKGgqKDEtYSkpLHQ9e3Q6InJhbmdlUm91bmRCYW5kcyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIG99LGUucmFuZ2VFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gUGkodC5hWzBdKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFFpKG4sdCl9LGUuZG9tYWluKG4pfWZ1bmN0aW9uIG5vKG4sdCl7ZnVuY3Rpb24gaSgpe3ZhciBlPTAscj10Lmxlbmd0aDtmb3IoYT1bXTsrK2U8cjspYVtlLTFdPXRhLnF1YW50aWxlKG4sZS9yKTtyZXR1cm4gb31mdW5jdGlvbiBvKG4pe3JldHVybiBpc05hTihuPStuKT92b2lkIDA6dFt0YS5iaXNlY3QoYSxuKV19dmFyIGE7cmV0dXJuIG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQubWFwKHIpLmZpbHRlcih1KS5zb3J0KGUpLGkoKSk6bn0sby5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGkoKSk6dH0sby5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYX0sby5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLDA+ZT9bMC8wLDAvMF06W2U+MD9hW2UtMV06blswXSxlPGEubGVuZ3RoP2FbZV06bltuLmxlbmd0aC0xXV19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBubyhuLHQpfSxpKCl9ZnVuY3Rpb24gdG8obix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIGVbTWF0aC5tYXgoMCxNYXRoLm1pbihvLE1hdGguZmxvb3IoaSoodC1uKSkpKV19ZnVuY3Rpb24gdSgpe3JldHVybiBpPWUubGVuZ3RoLyh0LW4pLG89ZS5sZW5ndGgtMSxyfXZhciBpLG87cmV0dXJuIHIuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdLHQ9K2VbZS5sZW5ndGgtMV0sdSgpKTpbbix0XX0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0sci5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9ZS5pbmRleE9mKHQpLHQ9MD50PzAvMDp0L2krbixbdCx0KzEvaV19LHIuY29weT1mdW5jdGlvbigpe3JldHVybiB0byhuLHQsZSl9LHUoKX1mdW5jdGlvbiBlbyhuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGU+PWU/dFt0YS5iaXNlY3QobixlKV06dm9pZCAwfXJldHVybiBlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixlKTp0fSxlLmludmVydEV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmluZGV4T2YoZSksW25bZS0xXSxuW2VdXX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGVvKG4sdCl9LGV9ZnVuY3Rpb24gcm8obil7ZnVuY3Rpb24gdChuKXtyZXR1cm4rbn1yZXR1cm4gdC5pbnZlcnQ9dCx0LmRvbWFpbj10LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUubWFwKHQpLHQpOm59LHQudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIFhpKG4sdCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiAkaShuLHQsZSl9LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBybyhuKX0sdH1mdW5jdGlvbiB1bygpe3JldHVybiAwfWZ1bmN0aW9uIGlvKG4pe3JldHVybiBuLmlubmVyUmFkaXVzfWZ1bmN0aW9uIG9vKG4pe3JldHVybiBuLm91dGVyUmFkaXVzfWZ1bmN0aW9uIGFvKG4pe3JldHVybiBuLnN0YXJ0QW5nbGV9ZnVuY3Rpb24gY28obil7cmV0dXJuIG4uZW5kQW5nbGV9ZnVuY3Rpb24gbG8obil7cmV0dXJuIG4mJm4ucGFkQW5nbGV9ZnVuY3Rpb24gc28obix0LGUscil7cmV0dXJuKG4tZSkqdC0odC1yKSpuPjA/MDoxfWZ1bmN0aW9uIGZvKG4sdCxlLHIsdSl7dmFyIGk9blswXS10WzBdLG89blsxXS10WzFdLGE9KHU/cjotcikvTWF0aC5zcXJ0KGkqaStvKm8pLGM9YSpvLGw9LWEqaSxzPW5bMF0rYyxmPW5bMV0rbCxoPXRbMF0rYyxnPXRbMV0rbCxwPShzK2gpLzIsdj0oZitnKS8yLGQ9aC1zLG09Zy1mLHk9ZCpkK20qbSxNPWUtcix4PXMqZy1oKmYsYj0oMD5tPy0xOjEpKk1hdGguc3FydChNKk0qeS14KngpLF89KHgqbS1kKmIpL3ksdz0oLXgqZC1tKmIpL3ksUz0oeCptK2QqYikveSxrPSgteCpkK20qYikveSxFPV8tcCxBPXctdixOPVMtcCxDPWstdjtyZXR1cm4gRSpFK0EqQT5OKk4rQypDJiYoXz1TLHc9ayksW1tfLWMsdy1sXSxbXyplL00sdyplL01dXX1mdW5jdGlvbiBobyhuKXtmdW5jdGlvbiB0KHQpe2Z1bmN0aW9uIG8oKXtsLnB1c2goIk0iLGkobihzKSxhKSl9Zm9yKHZhciBjLGw9W10scz1bXSxmPS0xLGg9dC5sZW5ndGgsZz1FdChlKSxwPUV0KHIpOysrZjxoOyl1LmNhbGwodGhpcyxjPXRbZl0sZik/cy5wdXNoKFsrZy5jYWxsKHRoaXMsYyxmKSwrcC5jYWxsKHRoaXMsYyxmKV0pOnMubGVuZ3RoJiYobygpLHM9W10pO3JldHVybiBzLmxlbmd0aCYmbygpLGwubGVuZ3RoP2wuam9pbigiIik6bnVsbH12YXIgZT1BcixyPU5yLHU9TmUsaT1nbyxvPWkua2V5LGE9Ljc7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLHQpOnV9LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIG4/aT1uOihpPUVsLmdldChuKXx8Z28pLmtleSx0KTpvfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bix0KTphfSx0fWZ1bmN0aW9uIGdvKG4pe3JldHVybiBuLmpvaW4oIkwiKX1mdW5jdGlvbiBwbyhuKXtyZXR1cm4gZ28obikrIloifWZ1bmN0aW9uIHZvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyWzBdKyhyPW5bdF0pWzBdKS8yLCJWIixyWzFdKTtyZXR1cm4gZT4xJiZ1LnB1c2goIkgiLHJbMF0pLHUuam9pbigiIil9ZnVuY3Rpb24gbW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiViIsKHI9blt0XSlbMV0sIkgiLHJbMF0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIHlvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyPW5bdF0pWzBdLCJWIixyWzFdKTtyZXR1cm4gdS5qb2luKCIiKX1mdW5jdGlvbiBNbyhuLHQpe3JldHVybiBuLmxlbmd0aDw0P2dvKG4pOm5bMV0rX28obi5zbGljZSgxLC0xKSx3byhuLHQpKX1mdW5jdGlvbiB4byhuLHQpe3JldHVybiBuLmxlbmd0aDwzP2dvKG4pOm5bMF0rX28oKG4ucHVzaChuWzBdKSxuKSx3byhbbltuLmxlbmd0aC0yXV0uY29uY2F0KG4sW25bMV1dKSx0KSl9ZnVuY3Rpb24gYm8obix0KXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKG4sd28obix0KSl9ZnVuY3Rpb24gX28obix0KXtpZih0Lmxlbmd0aDwxfHxuLmxlbmd0aCE9dC5sZW5ndGgmJm4ubGVuZ3RoIT10Lmxlbmd0aCsyKXJldHVybiBnbyhuKTt2YXIgZT1uLmxlbmd0aCE9dC5sZW5ndGgscj0iIix1PW5bMF0saT1uWzFdLG89dFswXSxhPW8sYz0xO2lmKGUmJihyKz0iUSIrKGlbMF0tMipvWzBdLzMpKyIsIisoaVsxXS0yKm9bMV0vMykrIiwiK2lbMF0rIiwiK2lbMV0sdT1uWzFdLGM9MiksdC5sZW5ndGg+MSl7YT10WzFdLGk9bltjXSxjKysscis9IkMiKyh1WzBdK29bMF0pKyIsIisodVsxXStvWzFdKSsiLCIrKGlbMF0tYVswXSkrIiwiKyhpWzFdLWFbMV0pKyIsIitpWzBdKyIsIitpWzFdO2Zvcih2YXIgbD0yO2w8dC5sZW5ndGg7bCsrLGMrKylpPW5bY10sYT10W2xdLHIrPSJTIisoaVswXS1hWzBdKSsiLCIrKGlbMV0tYVsxXSkrIiwiK2lbMF0rIiwiK2lbMV19aWYoZSl7dmFyIHM9bltjXTtyKz0iUSIrKGlbMF0rMiphWzBdLzMpKyIsIisoaVsxXSsyKmFbMV0vMykrIiwiK3NbMF0rIiwiK3NbMV19cmV0dXJuIHJ9ZnVuY3Rpb24gd28obix0KXtmb3IodmFyIGUscj1bXSx1PSgxLXQpLzIsaT1uWzBdLG89blsxXSxhPTEsYz1uLmxlbmd0aDsrK2E8YzspZT1pLGk9byxvPW5bYV0sci5wdXNoKFt1KihvWzBdLWVbMF0pLHUqKG9bMV0tZVsxXSldKTtyZXR1cm4gcn1mdW5jdGlvbiBTbyhuKXtpZihuLmxlbmd0aDwzKXJldHVybiBnbyhuKTt2YXIgdD0xLGU9bi5sZW5ndGgscj1uWzBdLHU9clswXSxpPXJbMV0sbz1bdSx1LHUsKHI9blsxXSlbMF1dLGE9W2ksaSxpLHJbMV1dLGM9W3UsIiwiLGksIkwiLE5vKENsLG8pLCIsIixObyhDbCxhKV07Zm9yKG4ucHVzaChuW2UtMV0pOysrdDw9ZTspcj1uW3RdLG8uc2hpZnQoKSxvLnB1c2goclswXSksYS5zaGlmdCgpLGEucHVzaChyWzFdKSxDbyhjLG8sYSk7cmV0dXJuIG4ucG9wKCksYy5wdXNoKCJMIixyKSxjLmpvaW4oIiIpfWZ1bmN0aW9uIGtvKG4pe2lmKG4ubGVuZ3RoPDQpcmV0dXJuIGdvKG4pO2Zvcih2YXIgdCxlPVtdLHI9LTEsdT1uLmxlbmd0aCxpPVswXSxvPVswXTsrK3I8MzspdD1uW3JdLGkucHVzaCh0WzBdKSxvLnB1c2godFsxXSk7Zm9yKGUucHVzaChObyhDbCxpKSsiLCIrTm8oQ2wsbykpLC0tcjsrK3I8dTspdD1uW3JdLGkuc2hpZnQoKSxpLnB1c2godFswXSksby5zaGlmdCgpLG8ucHVzaCh0WzFdKSxDbyhlLGksbyk7cmV0dXJuIGUuam9pbigiIil9ZnVuY3Rpb24gRW8obil7Zm9yKHZhciB0LGUscj0tMSx1PW4ubGVuZ3RoLGk9dSs0LG89W10sYT1bXTsrK3I8NDspZT1uW3IldV0sby5wdXNoKGVbMF0pLGEucHVzaChlWzFdKTtmb3IodD1bTm8oQ2wsbyksIiwiLE5vKENsLGEpXSwtLXI7KytyPGk7KWU9bltyJXVdLG8uc2hpZnQoKSxvLnB1c2goZVswXSksYS5zaGlmdCgpLGEucHVzaChlWzFdKSxDbyh0LG8sYSk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gQW8obix0KXt2YXIgZT1uLmxlbmd0aC0xO2lmKGUpZm9yKHZhciByLHUsaT1uWzBdWzBdLG89blswXVsxXSxhPW5bZV1bMF0taSxjPW5bZV1bMV0tbyxsPS0xOysrbDw9ZTspcj1uW2xdLHU9bC9lLHJbMF09dCpyWzBdKygxLXQpKihpK3UqYSksclsxXT10KnJbMV0rKDEtdCkqKG8rdSpjKTtyZXR1cm4gU28obil9ZnVuY3Rpb24gTm8obix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXStuWzJdKnRbMl0rblszXSp0WzNdfWZ1bmN0aW9uIENvKG4sdCxlKXtuLnB1c2goIkMiLE5vKEFsLHQpLCIsIixObyhBbCxlKSwiLCIsTm8oTmwsdCksIiwiLE5vKE5sLGUpLCIsIixObyhDbCx0KSwiLCIsTm8oQ2wsZSkpfWZ1bmN0aW9uIHpvKG4sdCl7cmV0dXJuKHRbMV0tblsxXSkvKHRbMF0tblswXSl9ZnVuY3Rpb24gcW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aC0xLHI9W10sdT1uWzBdLGk9blsxXSxvPXJbMF09em8odSxpKTsrK3Q8ZTspclt0XT0obysobz16byh1PWksaT1uW3QrMV0pKSkvMjtyZXR1cm4gclt0XT1vLHJ9ZnVuY3Rpb24gTG8obil7Zm9yKHZhciB0LGUscix1LGk9W10sbz1xbyhuKSxhPS0xLGM9bi5sZW5ndGgtMTsrK2E8YzspdD16byhuW2FdLG5bYSsxXSksZ2EodCk8Q2E/b1thXT1vW2ErMV09MDooZT1vW2FdL3Qscj1vW2ErMV0vdCx1PWUqZStyKnIsdT45JiYodT0zKnQvTWF0aC5zcXJ0KHUpLG9bYV09dSplLG9bYSsxXT11KnIpKTtmb3IoYT0tMTsrK2E8PWM7KXU9KG5bTWF0aC5taW4oYyxhKzEpXVswXS1uW01hdGgubWF4KDAsYS0xKV1bMF0pLyg2KigxK29bYV0qb1thXSkpLGkucHVzaChbdXx8MCxvW2FdKnV8fDBdKTtyZXR1cm4gaX1mdW5jdGlvbiBUbyhuKXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKG4sTG8obikpfWZ1bmN0aW9uIFJvKG4pe2Zvcih2YXIgdCxlLHIsdT0tMSxpPW4ubGVuZ3RoOysrdTxpOyl0PW5bdV0sZT10WzBdLHI9dFsxXS1SYSx0WzBdPWUqTWF0aC5jb3MociksdFsxXT1lKk1hdGguc2luKHIpO3JldHVybiBufWZ1bmN0aW9uIERvKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gYygpe3YucHVzaCgiTSIsYShuKG0pLGYpLHMsbChuKGQucmV2ZXJzZSgpKSxmKSwiWiIpfWZvcih2YXIgaCxnLHAsdj1bXSxkPVtdLG09W10seT0tMSxNPXQubGVuZ3RoLHg9RXQoZSksYj1FdCh1KSxfPWU9PT1yP2Z1bmN0aW9uKCl7cmV0dXJuIGd9OkV0KHIpLHc9dT09PWk/ZnVuY3Rpb24oKXtyZXR1cm4gcH06RXQoaSk7Kyt5PE07KW8uY2FsbCh0aGlzLGg9dFt5XSx5KT8oZC5wdXNoKFtnPSt4LmNhbGwodGhpcyxoLHkpLHA9K2IuY2FsbCh0aGlzLGgseSldKSxtLnB1c2goWytfLmNhbGwodGhpcyxoLHkpLCt3LmNhbGwodGhpcyxoLHkpXSkpOmQubGVuZ3RoJiYoYygpLGQ9W10sbT1bXSk7cmV0dXJuIGQubGVuZ3RoJiZjKCksdi5sZW5ndGg/di5qb2luKCIiKTpudWxsfXZhciBlPUFyLHI9QXIsdT0wLGk9TnIsbz1OZSxhPWdvLGM9YS5rZXksbD1hLHM9IkwiLGY9Ljc7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yPW4sdCk6cn0sdC54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueDE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyCn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWk9bix0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLHQpOml9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHQpOm99LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/YT1uOihhPUVsLmdldChuKXx8Z28pLmtleSxsPWEucmV2ZXJzZXx8YSxzPWEuY2xvc2VkPyJNIjoiTCIsdCk6Y30sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPW4sdCk6Zn0sdH1mdW5jdGlvbiBQbyhuKXtyZXR1cm4gbi5yYWRpdXN9ZnVuY3Rpb24gVW8obil7cmV0dXJuW24ueCxuLnldfWZ1bmN0aW9uIGpvKG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dFswXSxyPXRbMV0tUmE7cmV0dXJuW2UqTWF0aC5jb3MociksZSpNYXRoLnNpbihyKV19fWZ1bmN0aW9uIEZvKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIEhvKCl7cmV0dXJuImNpcmNsZSJ9ZnVuY3Rpb24gT28obil7dmFyIHQ9TWF0aC5zcXJ0KG4vcWEpO3JldHVybiJNMCwiK3QrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLXQrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrdCsiWiJ9ZnVuY3Rpb24gSW8obil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsZTsodD10aGlzW25dKSYmKGU9dFt0LmFjdGl2ZV0pJiYoLS10LmNvdW50P2RlbGV0ZSB0W3QuYWN0aXZlXTpkZWxldGUgdGhpc1tuXSx0LmFjdGl2ZSs9LjUsZS5ldmVudCYmZS5ldmVudC5pbnRlcnJ1cHQuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZS5pbmRleCkpfX1mdW5jdGlvbiBZbyhuLHQsZSl7cmV0dXJuIHlhKG4sUGwpLG4ubmFtZXNwYWNlPXQsbi5pZD1lLG59ZnVuY3Rpb24gWm8obix0LGUscil7dmFyIHU9bi5pZCxpPW4ubmFtZXNwYWNlO3JldHVybiBZKG4sImZ1bmN0aW9uIj09dHlwZW9mIGU/ZnVuY3Rpb24obixvLGEpe25baV1bdV0udHdlZW4uc2V0KHQscihlLmNhbGwobixuLl9fZGF0YV9fLG8sYSkpKX06KGU9cihlKSxmdW5jdGlvbihuKXtuW2ldW3VdLnR3ZWVuLnNldCh0LGUpfSkpfWZ1bmN0aW9uIFZvKG4pe3JldHVybiBudWxsPT1uJiYobj0iIiksZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PW59fWZ1bmN0aW9uIFhvKG4pe3JldHVybiBudWxsPT1uPyJfX3RyYW5zaXRpb25fXyI6Il9fdHJhbnNpdGlvbl8iK24rIl9fIn1mdW5jdGlvbiAkbyhuLHQsZSxyLHUpe3ZhciBpPW5bZV18fChuW2VdPXthY3RpdmU6MCxjb3VudDowfSksbz1pW3JdO2lmKCFvKXt2YXIgYT11LnRpbWU7bz1pW3JdPXt0d2VlbjpuZXcgbCx0aW1lOmEsZGVsYXk6dS5kZWxheSxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlLGluZGV4OnR9LHU9bnVsbCwrK2kuY291bnQsdGEudGltZXIoZnVuY3Rpb24odSl7ZnVuY3Rpb24gYyhlKXtpZihpLmFjdGl2ZT5yKXJldHVybiBzKCk7dmFyIHU9aVtpLmFjdGl2ZV07dSYmKC0taS5jb3VudCxkZWxldGUgaVtpLmFjdGl2ZV0sdS5ldmVudCYmdS5ldmVudC5pbnRlcnJ1cHQuY2FsbChuLG4uX19kYXRhX18sdS5pbmRleCkpLGkuYWN0aXZlPXIsby5ldmVudCYmby5ldmVudC5zdGFydC5jYWxsKG4sbi5fX2RhdGFfXyx0KSxvLnR3ZWVuLmZvckVhY2goZnVuY3Rpb24oZSxyKXsocj1yLmNhbGwobixuLl9fZGF0YV9fLHQpKSYmdi5wdXNoKHIpfSksaD1vLmVhc2UsZj1vLmR1cmF0aW9uLHRhLnRpbWVyKGZ1bmN0aW9uKCl7cmV0dXJuIHAuYz1sKGV8fDEpP05lOmwsMX0sMCxhKX1mdW5jdGlvbiBsKGUpe2lmKGkuYWN0aXZlIT09cilyZXR1cm4gMTtmb3IodmFyIHU9ZS9mLGE9aCh1KSxjPXYubGVuZ3RoO2M+MDspdlstLWNdLmNhbGwobixhKTtyZXR1cm4gdT49MT8oby5ldmVudCYmby5ldmVudC5lbmQuY2FsbChuLG4uX19kYXRhX18sdCkscygpKTp2b2lkIDB9ZnVuY3Rpb24gcygpe3JldHVybi0taS5jb3VudD9kZWxldGUgaVtyXTpkZWxldGUgbltlXSwxfXZhciBmLGgsZz1vLmRlbGF5LHA9ZWMsdj1bXTtyZXR1cm4gcC50PWcrYSx1Pj1nP2ModS1nKTp2b2lkKHAuYz1jKX0sMCxhKX19ZnVuY3Rpb24gQm8obix0LGUpe24uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXt2YXIgcj10KG4pO3JldHVybiJ0cmFuc2xhdGUoIisoaXNGaW5pdGUocik/cjplKG4pKSsiLDApIn0pfWZ1bmN0aW9uIFdvKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKDAsIisoaXNGaW5pdGUocik/cjplKG4pKSsiKSJ9KX1mdW5jdGlvbiBKbyhuKXtyZXR1cm4gbi50b0lTT1N0cmluZygpfWZ1bmN0aW9uIEdvKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHQpfWZ1bmN0aW9uIHUobixlKXt2YXIgcj1uWzFdLW5bMF0sdT1yL2UsaT10YS5iaXNlY3QoVmwsdSk7cmV0dXJuIGk9PVZsLmxlbmd0aD9bdC55ZWFyLFZpKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLzMxNTM2ZTZ9KSxlKVsyXV06aT90W3UvVmxbaS0xXTxWbFtpXS91P2ktMTppXTpbQmwsVmkobixlKVsyXV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBLbyhuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbih0KSxyKTpuLmRvbWFpbigpLm1hcChLbyl9LHIubmljZT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIWlzTmFOKGUpJiYhbi5yYW5nZShlLEtvKCtlKzEpLHQpLmxlbmd0aH12YXIgaT1yLmRvbWFpbigpLG89UGkoaSksYT1udWxsPT1uP3UobywxMCk6Im51bWJlciI9PXR5cGVvZiBuJiZ1KG8sbik7cmV0dXJuIGEmJihuPWFbMF0sdD1hWzFdKSxyLmRvbWFpbihGaShpLHQ+MT97Zmxvb3I6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5mbG9vcih0KSk7KXQ9S28odC0xKTtyZXR1cm4gdH0sY2VpbDpmdW5jdGlvbih0KXtmb3IoO2UodD1uLmNlaWwodCkpOyl0PUtvKCt0KzEpO3JldHVybiB0fX06bikpfSxyLnRpY2tzPWZ1bmN0aW9uKG4sdCl7dmFyIGU9UGkoci5kb21haW4oKSksaT1udWxsPT1uP3UoZSwxMCk6Im51bWJlciI9PXR5cGVvZiBuP3UoZSxuKTohbi5yYW5nZSYmW3tyYW5nZTpufSx0XTtyZXR1cm4gaSYmKG49aVswXSx0PWlbMV0pLG4ucmFuZ2UoZVswXSxLbygrZVsxXSsxKSwxPnQ/MTp0KX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBHbyhuLmNvcHkoKSx0LGUpfSxZaShyLG4pfWZ1bmN0aW9uIEtvKG4pe3JldHVybiBuZXcgRGF0ZShuKX1mdW5jdGlvbiBRbyhuKXtyZXR1cm4gSlNPTi5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gbmEobil7dmFyIHQ9dWEuY3JlYXRlUmFuZ2UoKTtyZXR1cm4gdC5zZWxlY3ROb2RlKHVhLmJvZHkpLHQuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KG4ucmVzcG9uc2VUZXh0KX12YXIgdGE9e3ZlcnNpb246IjMuNS42In0sZWE9W10uc2xpY2UscmE9ZnVuY3Rpb24obil7cmV0dXJuIGVhLmNhbGwobil9LHVhPXRoaXMuZG9jdW1lbnQ7aWYodWEpdHJ5e3JhKHVhLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKVswXS5ub2RlVHlwZX1jYXRjaChpYSl7cmE9ZnVuY3Rpb24obil7Zm9yKHZhciB0PW4ubGVuZ3RoLGU9bmV3IEFycmF5KHQpO3QtLTspZVt0XT1uW3RdO3JldHVybiBlfX1pZihEYXRlLm5vd3x8KERhdGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSksdWEpdHJ5e3VhLmNyZWF0ZUVsZW1lbnQoIkRJViIpLnN0eWxlLnNldFByb3BlcnR5KCJvcGFjaXR5IiwwLCIiKX1jYXRjaChvYSl7dmFyIGFhPXRoaXMuRWxlbWVudC5wcm90b3R5cGUsY2E9YWEuc2V0QXR0cmlidXRlLGxhPWFhLnNldEF0dHJpYnV0ZU5TLHNhPXRoaXMuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsZmE9c2Euc2V0UHJvcGVydHk7YWEuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKG4sdCl7Y2EuY2FsbCh0aGlzLG4sdCsiIil9LGFhLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKG4sdCxlKXtsYS5jYWxsKHRoaXMsbix0LGUrIiIpfSxzYS5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7ZmEuY2FsbCh0aGlzLG4sdCsiIixlKX19dGEuYXNjZW5kaW5nPWUsdGEuZGVzY2VuZGluZz1mdW5jdGlvbihuLHQpe3JldHVybiBuPnQ/LTE6dD5uPzE6dD49bj8wOjAvMH0sdGEubWluPWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPW5bdV0pJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9blt1XSkmJmU+ciYmKGU9cil9ZWxzZXtmb3IoOysrdTxpOylpZihudWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZlPnImJihlPXIpfXJldHVybiBlfSx0YS5tYXg9ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmcj5lJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+ZSYmKGU9cil9cmV0dXJuIGV9LHRhLmV4dGVudD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdSxpPS0xLG89bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPG87KWlmKG51bGwhPShyPW5baV0pJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxvOyludWxsIT0ocj1uW2ldKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9ZWxzZXtmb3IoOysraTxvOylpZihudWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmcj49cil7ZT11PXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9dC5jYWxsKG4sbltpXSxpKSkmJihlPnImJihlPXIpLHI+dSYmKHU9cikpfXJldHVybltlLHVdfSx0YS5zdW09ZnVuY3Rpb24obix0KXt2YXIgZSxyPTAsaT1uLmxlbmd0aCxvPS0xO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytvPGk7KXUoZT0rbltvXSkmJihyKz1lKTtlbHNlIGZvcig7KytvPGk7KXUoZT0rdC5jYWxsKG4sbltvXSxvKSkmJihyKz1lKTtyZXR1cm4gcn0sdGEubWVhbj1mdW5jdGlvbihuLHQpe3ZhciBlLGk9MCxvPW4ubGVuZ3RoLGE9LTEsYz1vO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPG87KXUoZT1yKG5bYV0pKT9pKz1lOi0tYztlbHNlIGZvcig7KythPG87KXUoZT1yKHQuY2FsbChuLG5bYV0sYSkpKT9pKz1lOi0tYztyZXR1cm4gYz9pL2M6dm9pZCAwfSx0YS5xdWFudGlsZT1mdW5jdGlvbihuLHQpe3ZhciBlPShuLmxlbmd0aC0xKSp0KzEscj1NYXRoLmZsb29yKGUpLHU9K25bci0xXSxpPWUtcjtyZXR1cm4gaT91K2kqKG5bcl0tdSk6dX0sdGEubWVkaWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGksbz1bXSxhPW4ubGVuZ3RoLGM9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2M8YTspdShpPXIobltjXSkpJiZvLnB1c2goaSk7ZWxzZSBmb3IoOysrYzxhOyl1KGk9cih0LmNhbGwobixuW2NdLGMpKSkmJm8ucHVzaChpKTtyZXR1cm4gby5sZW5ndGg/dGEucXVhbnRpbGUoby5zb3J0KGUpLC41KTp2b2lkIDB9LHRhLnZhcmlhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUsaSxvPW4ubGVuZ3RoLGE9MCxjPTAsbD0tMSxzPTA7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2w8bzspdShlPXIobltsXSkpJiYoaT1lLWEsYSs9aS8rK3MsYys9aSooZS1hKSk7ZWxzZSBmb3IoOysrbDxvOyl1KGU9cih0LmNhbGwobixuW2xdLGwpKSkmJihpPWUtYSxhKz1pLysrcyxjKz1pKihlLWEpKTtyZXR1cm4gcz4xP2MvKHMtMSk6dm9pZCAwfSx0YS5kZXZpYXRpb249ZnVuY3Rpb24oKXt2YXIgbj10YS52YXJpYW5jZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4/TWF0aC5zcXJ0KG4pOm59O3ZhciBoYT1pKGUpO3RhLmJpc2VjdExlZnQ9aGEubGVmdCx0YS5iaXNlY3Q9dGEuYmlzZWN0UmlnaHQ9aGEucmlnaHQsdGEuYmlzZWN0b3I9ZnVuY3Rpb24obil7cmV0dXJuIGkoMT09PW4ubGVuZ3RoP2Z1bmN0aW9uKHQscil7cmV0dXJuIGUobih0KSxyKX06bil9LHRhLnNodWZmbGU9ZnVuY3Rpb24obix0LGUpeyhpPWFyZ3VtZW50cy5sZW5ndGgpPDMmJihlPW4ubGVuZ3RoLDI+aSYmKHQ9MCkpO2Zvcih2YXIgcix1LGk9ZS10O2k7KXU9TWF0aC5yYW5kb20oKSppLS18MCxyPW5baSt0XSxuW2krdF09blt1K3RdLG5bdSt0XT1yO3JldHVybiBufSx0YS5wZXJtdXRlPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT1uW3RbZV1dO3JldHVybiByfSx0YS5wYWlycz1mdW5jdGlvbihuKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGgtMSx1PW5bMF0saT1uZXcgQXJyYXkoMD5yPzA6cik7cj5lOylpW2VdPVt0PXUsdT1uWysrZV1dO3JldHVybiBpfSx0YS56aXA9ZnVuY3Rpb24oKXtpZighKHI9YXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLHQ9dGEubWluKGFyZ3VtZW50cyxvKSxlPW5ldyBBcnJheSh0KTsrK248dDspZm9yKHZhciByLHU9LTEsaT1lW25dPW5ldyBBcnJheShyKTsrK3U8cjspaVt1XT1hcmd1bWVudHNbdV1bbl07cmV0dXJuIGV9LHRhLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gdGEuemlwLmFwcGx5KHRhLG4pfSx0YS5rZXlzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChlKTtyZXR1cm4gdH0sdGEudmFsdWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChuW2VdKTtyZXR1cm4gdH0sdGEuZW50cmllcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goe2tleTplLHZhbHVlOm5bZV19KTtyZXR1cm4gdH0sdGEubWVyZ2U9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1PW4ubGVuZ3RoLGk9LTEsbz0wOysraTx1OylvKz1uW2ldLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobyk7LS11Pj0wOylmb3Iocj1uW3VdLHQ9ci5sZW5ndGg7LS10Pj0wOyllWy0tb109clt0XTtyZXR1cm4gZX07dmFyIGdhPU1hdGguYWJzO3RhLnJhbmdlPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49MCkpLCh0LW4pL2U9PT0xLzApdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciByLHU9W10saT1hKGdhKGUpKSxvPS0xO2lmKG4qPWksdCo9aSxlKj1pLDA+ZSlmb3IoOyhyPW4rZSorK28pPnQ7KXUucHVzaChyL2kpO2Vsc2UgZm9yKDsocj1uK2UqKytvKTx0Oyl1LnB1c2goci9pKTtyZXR1cm4gdX0sdGEubWFwPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bmV3IGw7aWYobiBpbnN0YW5jZW9mIGwpbi5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShuKSl7dmFyIHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7Kyt1PGk7KWUuc2V0KHUsblt1XSk7ZWxzZSBmb3IoOysrdTxpOyllLnNldCh0LmNhbGwobixyPW5bdV0sdSkscil9ZWxzZSBmb3IodmFyIG8gaW4gbillLnNldChvLG5bb10pO3JldHVybiBlfTt2YXIgcGE9Il9fcHJvdG9fXyIsdmE9Ilx4MDAiO2MobCx7aGFzOmgsZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bcyhuKV19LHNldDpmdW5jdGlvbihuLHQpe3JldHVybiB0aGlzLl9bcyhuKV09dH0scmVtb3ZlOmcsa2V5czpwLHZhbHVlczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHRoaXMuX1t0XSk7cmV0dXJuIG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh7a2V5OmYodCksdmFsdWU6dGhpcy5fW3RdfSk7cmV0dXJuIG59LHNpemU6dixlbXB0eTpkLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxmKHQpLHRoaXMuX1t0XSl9fSksdGEubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxvLGEpe2lmKGE+PWkubGVuZ3RoKXJldHVybiByP3IuY2FsbCh1LG8pOmU/by5zb3J0KGUpOm87Zm9yKHZhciBjLHMsZixoLGc9LTEscD1vLmxlbmd0aCx2PWlbYSsrXSxkPW5ldyBsOysrZzxwOykoaD1kLmdldChjPXYocz1vW2ddKSkpP2gucHVzaChzKTpkLnNldChjLFtzXSk7cmV0dXJuIHQ/KHM9dCgpLGY9ZnVuY3Rpb24oZSxyKXtzLnNldChlLG4odCxyLGEpKX0pOihzPXt9LGY9ZnVuY3Rpb24oZSxyKXtzW2VdPW4odCxyLGEpfSksZC5mb3JFYWNoKGYpLHN9ZnVuY3Rpb24gdChuLGUpe2lmKGU+PWkubGVuZ3RoKXJldHVybiBuO3ZhciByPVtdLHU9b1tlKytdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obix1KXtyLnB1c2goe2tleTpuLHZhbHVlczp0KHUsZSl9KX0pLHU/ci5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHUobi5rZXksdC5rZXkpfSk6cn12YXIgZSxyLHU9e30saT1bXSxvPVtdO3JldHVybiB1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuKGUsdCwwKX0sdS5lbnRyaWVzPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4odGEubWFwLGUsMCksMCl9LHUua2V5PWZ1bmN0aW9uKG4pe3JldHVybiBpLnB1c2gobiksdX0sdS5zb3J0S2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gb1tpLmxlbmd0aC0xXT1uLHV9LHUuc29ydFZhbHVlcz1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LHUucm9sbHVwPWZ1bmN0aW9uKG4pe3JldHVybiByPW4sdX0sdX0sdGEuc2V0PWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBtO2lmKG4pZm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7KytlKXQuYWRkKG5bZV0pO3JldHVybiB0fSxjKG0se2hhczpoLGFkZDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW3Mobis9IiIpXT0hMCxufSxyZW1vdmU6Zyx2YWx1ZXM6cCxzaXplOnYsZW1wdHk6ZCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMsZih0KSl9fSksdGEuYmVoYXZpb3I9e30sdGEucmViaW5kPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlLHI9MSx1PWFyZ3VtZW50cy5sZW5ndGg7KytyPHU7KW5bZT1hcmd1bWVudHNbcl1dPU0obix0LHRbZV0pO3JldHVybiBufTt2YXIgZGE9WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07dGEuZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IF8sdD0tMSxlPWFyZ3VtZW50cy5sZW5ndGg7Kyt0PGU7KW5bYXJndW1lbnRzW3RdXT13KG4pO3JldHVybiBufSxfLnByb3RvdHlwZS5vbj1mdW5jdGlvbihuLHQpe3ZhciBlPW4uaW5kZXhPZigiLiIpLHI9IiI7aWYoZT49MCYmKHI9bi5zbGljZShlKzEpLG49bi5zbGljZSgwLGUpKSxuKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1tuXS5vbihyKTp0aGlzW25dLm9uKHIsdCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PXQpZm9yKG4gaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzW25dLm9uKHIsbnVsbCk7cmV0dXJuIHRoaXN9fSx0YS5ldmVudD1udWxsLHRhLnJlcXVvdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZShtYSwiXFwkJiIpfTt2YXIgbWE9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLHlhPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbihuLHQpe24uX19wcm90b19fPXR9OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlIGluIHQpbltlXT10W2VdfSxNYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3Iobil9LHhhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChuKX0sYmE9ZnVuY3Rpb24obix0KXt2YXIgZT1uLm1hdGNoZXN8fG5beChuLCJtYXRjaGVzU2VsZWN0b3IiKV07cmV0dXJuKGJhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGUuY2FsbChuLHQpfSkobix0KX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKE1hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFNpenpsZShuLHQpWzBdfHxudWxsfSx4YT1TaXp6bGUsYmE9U2l6emxlLm1hdGNoZXNTZWxlY3RvciksdGEuc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNlbGVjdCh1YS5kb2N1bWVudEVsZW1lbnQpfTt2YXIgX2E9dGEuc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtfYS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaT1bXTtuPU4obik7Zm9yKHZhciBvPS0xLGE9dGhpcy5sZW5ndGg7KytvPGE7KXtpLnB1c2godD1bXSksdC5wYXJlbnROb2RlPShyPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBjPS0xLGw9ci5sZW5ndGg7KytjPGw7KSh1PXJbY10pPyh0LnB1c2goZT1uLmNhbGwodSx1Ll9fZGF0YV9fLGMsbykpLGUmJiJfX2RhdGFfXyJpbiB1JiYoZS5fX2RhdGFfXz11Ll9fZGF0YV9fKSk6dC5wdXNoKG51bGwpfXJldHVybiBBKGkpfSxfYS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyPVtdO249QyhuKTtmb3IodmFyIHU9LTEsaT10aGlzLmxlbmd0aDsrK3U8aTspZm9yKHZhciBvPXRoaXNbdV0sYT0tMSxjPW8ubGVuZ3RoOysrYTxjOykoZT1vW2FdKSYmKHIucHVzaCh0PXJhKG4uY2FsbChlLGUuX19kYXRhX18sYSx1KSkpLHQucGFyZW50Tm9kZT1lKTtyZXR1cm4gQShyKX07dmFyIHdhPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt0YS5ucz17cHJlZml4OndhLHF1YWxpZnk6ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCI6IiksZT1uO3JldHVybiB0Pj0wJiYoZT1uLnNsaWNlKDAsdCksbj1uLnNsaWNlKHQrMSkpLHdhLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTp3YVtlXSxsb2NhbDpufTpufX0sX2EuYXR0cj1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKTtyZXR1cm4gbj10YS5ucy5xdWFsaWZ5KG4pLG4ubG9jYWw/ZS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmUuZ2V0QXR0cmlidXRlKG4pfWZvcih0IGluIG4pdGhpcy5lYWNoKHoodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaCh6KG4sdCkpfSxfYS5jbGFzc2VkPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpLHI9KG49VChuKSkubGVuZ3RoLHU9LTE7aWYodD1lLmNsYXNzTGlzdCl7Zm9yKDsrK3U8cjspaWYoIXQuY29udGFpbnMoblt1XSkpcmV0dXJuITF9ZWxzZSBmb3IodD1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsrK3U8cjspaWYoIUwoblt1XSkudGVzdCh0KSlyZXR1cm4hMTtyZXR1cm4hMH1mb3IodCBpbiBuKXRoaXMuZWFjaChSKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goUihuLHQpKX0sX2Euc3R5bGU9ZnVuY3Rpb24obixlLHIpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg7aWYoMz51KXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+dSYmKGU9IiIpO2ZvcihyIGluIG4pdGhpcy5lYWNoKFAocixuW3JdLGUpKTtyZXR1cm4gdGhpc31pZigyPnUpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiB0KGkpLmdldENvbXB1dGVkU3R5bGUoaSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfXI9IiJ9cmV0dXJuIHRoaXMuZWFjaChQKG4sZSxyKSl9LF9hLnByb3BlcnR5PWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuIHRoaXMubm9kZSgpW25dO2Zvcih0IGluIG4pdGhpcy5lYWNoKFUodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChVKG4sdCkpfSxfYS50ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09dD8iIjp0fTpudWxsPT1uP2Z1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD0iIn06ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PW59KTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0sX2EuaHRtbD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD0iIn06ZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD1ufSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxfYS5hcHBlbmQ9ZnVuY3Rpb24obil7cmV0dXJuIG49aihuKSx0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSxfYS5pbnNlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbj1qKG4pLHQ9Tih0KSx0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0sX2EucmVtb3ZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChGKX0sX2EuZGF0YT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcix1LGksbz1uLmxlbmd0aCxmPWUubGVuZ3RoLGg9TWF0aC5taW4obyxmKSxnPW5ldyBBcnJheShmKSxwPW5ldyBBcnJheShmKSx2PW5ldyBBcnJheShvKTtpZih0KXt2YXIgZCxtPW5ldyBsLHk9bmV3IEFycmF5KG8pO2ZvcihyPS0xOysrcjxvOyltLmhhcyhkPXQuY2FsbCh1PW5bcl0sdS5fX2RhdGFfXyxyKSk/dltyXT11Om0uc2V0KGQsdSkseVtyXT1kO2ZvcihyPS0xOysrcjxmOykodT1tLmdldChkPXQuY2FsbChlLGk9ZVtyXSxyKSkpP3UhPT0hMCYmKGdbcl09dSx1Ll9fZGF0YV9fPWkpOnBbcl09SChpKSxtLnNldChkLCEwKTtmb3Iocj0tMTsrK3I8bzspbS5nZXQoeVtyXSkhPT0hMCYmKHZbcl09bltyXSl9ZWxzZXtmb3Iocj0tMTsrK3I8aDspdT1uW3JdLGk9ZVtyXSx1Pyh1Ll9fZGF0YV9fPWksZ1tyXT11KTpwW3JdPUgoaSk7Zm9yKDtmPnI7KytyKXBbcl09SChlW3JdKTtmb3IoO28+cjsrK3IpdltyXT1uW3JdfXAudXBkYXRlPWcscC5wYXJlbnROb2RlPWcucGFyZW50Tm9kZT12LnBhcmVudE5vZGU9bi5wYXJlbnROb2RlLGEucHVzaChwKSxjLnB1c2goZykscy5wdXNoKHYpfXZhciByLHUsaT0tMSxvPXRoaXMubGVuZ3RoO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtmb3Iobj1uZXcgQXJyYXkobz0ocj10aGlzWzBdKS5sZW5ndGgpOysraTxvOykodT1yW2ldKSYmKG5baV09dS5fX2RhdGFfXyk7cmV0dXJuIG59dmFyIGE9WihbXSksYz1BKFtdKSxzPUEoW10pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKWZvcig7KytpPG87KWUocj10aGlzW2ldLG4uY2FsbChyLHIucGFyZW50Tm9kZS5fX2RhdGFfXyxpKSk7ZWxzZSBmb3IoOysraTxvOyllKHI9dGhpc1tpXSxuKTtyZXR1cm4gYy5lbnRlcj1mdW5jdGlvbigpe3JldHVybiBhfSxjLmV4aXQ9ZnVuY3Rpb24oKXtyZXR1cm4gc30sY30sX2EuZGF0dW09ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLG4pOnRoaXMucHJvcGVydHkoIl9fZGF0YV9fIil9LF9hLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TyhuKSk7Zm9yKHZhciBpPTAsbz10aGlzLmxlbmd0aDtvPmk7aSsrKXt1LnB1c2godD1bXSksdC5wYXJlbnROb2RlPShlPXRoaXNbaV0pLnBhcmVudE5vZGU7Zm9yKHZhciBhPTAsYz1lLmxlbmd0aDtjPmE7YSsrKShyPWVbYV0pJiZuLmNhbGwocixyLl9fZGF0YV9fLGEsaSkmJnQucHVzaChyKX1yZXR1cm4gQSh1KX0sX2Eub3JkZXI9ZnVuY3Rpb24oKXtmb3IodmFyIG49LTEsdD10aGlzLmxlbmd0aDsrK248dDspZm9yKHZhciBlLHI9dGhpc1tuXSx1PXIubGVuZ3RoLTEsaT1yW3VdOy0tdT49MDspKGU9clt1XSkmJihpJiZpIT09ZS5uZXh0U2libGluZyYmaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGkpLGk9ZSk7cmV0dXJuIHRoaXN9LF9hLnNvcnQ9ZnVuY3Rpb24obil7bj1JLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtmb3IodmFyIHQ9LTEsZT10aGlzLmxlbmd0aDsrK3Q8ZTspdGhpc1t0XS5zb3J0KG4pO3JldHVybiB0aGlzLm9yZGVyKCl9LF9hLmVhY2g9ZnVuY3Rpb24obil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbih0LGUscil7bi5jYWxsKHQsdC5fX2RhdGFfXyxlLHIpfSl9LF9hLmNhbGw9ZnVuY3Rpb24obil7dmFyIHQ9cmEoYXJndW1lbnRzKTtyZXR1cm4gbi5hcHBseSh0WzBdPXRoaXMsdCksdGhpc30sX2EuZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LF9hLm5vZGU9ZnVuY3Rpb24oKXtmb3IodmFyIG49MCx0PXRoaXMubGVuZ3RoO3Q+bjtuKyspZm9yKHZhciBlPXRoaXNbbl0scj0wLHU9ZS5sZW5ndGg7dT5yO3IrKyl7dmFyIGk9ZVtyXTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfSxfYS5zaXplPWZ1bmN0aW9uKCl7dmFyIG49MDtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKCl7KytufSksbn07dmFyIFNhPVtdO3RhLnNlbGVjdGlvbi5lbnRlcj1aLHRhLnNlbGVjdGlvbi5lbnRlci5wcm90b3R5cGU9U2EsU2EuYXBwZW5kPV9hLmFwcGVuZCxTYS5lbXB0eT1fYS5lbXB0eSxTYS5ub2RlPV9hLm5vZGUsU2EuY2FsbD1fYS5jYWxsLFNhLnNpemU9X2Euc2l6ZSxTYS5zZWxlY3Q9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1LGksbz1bXSxhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtyPSh1PXRoaXNbYV0pLnVwZGF0ZSxvLnB1c2godD1bXSksdC5wYXJlbnROb2RlPXUucGFyZW50Tm9kZTtmb3IodmFyIGw9LTEscz11Lmxlbmd0aDsrK2w8czspKGk9dVtsXSk/KHQucHVzaChyW2xdPWU9bi5jYWxsKHUucGFyZW50Tm9kZSxpLl9fZGF0YV9fLGwsYSkpLGUuX19kYXRhX189aS5fX2RhdGFfXyk6dC5wdXNoKG51bGwpfXJldHVybiBBKG8pfSxTYS5pbnNlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1WKHRoaXMpKSxfYS5pbnNlcnQuY2FsbCh0aGlzLG4sdCl9LHRhLnNlbGVjdD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/KGU9W01hKHQsdWEpXSxlLnBhcmVudE5vZGU9dWEuZG9jdW1lbnRFbGVtZW50KTooZT1bdF0sZS5wYXJlbnROb2RlPW4odCkpLEEoW2VdKX0sdGEuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0O3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8odD1yYSh4YShuLHVhKSksdC5wYXJlbnROb2RlPXVhLmRvY3VtZW50RWxlbWVudCk6KHQ9bix0LnBhcmVudE5vZGU9bnVsbCksQShbdF0pfSxfYS5vbj1mdW5jdGlvbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtpZigzPnIpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5yJiYodD0hMSk7Zm9yKGUgaW4gbil0aGlzLmVhY2goWChlLG5bZV0sdCkpO3JldHVybiB0aGlzfWlmKDI+cilyZXR1cm4ocj10aGlzLm5vZGUoKVsiX19vbiIrbl0pJiZyLl87ZT0hMX1yZXR1cm4gdGhpcy5lYWNoKFgobix0LGUpKX07dmFyIGthPXRhLm1hcCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KTt1YSYma2EuZm9yRWFjaChmdW5jdGlvbihuKXsib24iK24gaW4gdWEmJmthLnJlbW92ZShuKX0pO3ZhciBFYSxBYT0wO3RhLm1vdXNlPWZ1bmN0aW9uKG4pe3JldHVybiBKKG4saygpKX07dmFyIE5hPXRoaXMubmF2aWdhdG9yJiYvV2ViS2l0Ly50ZXN0KHRoaXMubmF2aWdhdG9yLnVzZXJBZ2VudCk/LTE6MDt0YS50b3VjaD1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT10LHQ9aygpLmNoYW5nZWRUb3VjaGVzKSx0KWZvcih2YXIgcix1PTAsaT10Lmxlbmd0aDtpPnU7Kyt1KWlmKChyPXRbdV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBKKG4scil9LHRhLmJlaGF2aW9yLmRyYWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dGhpcy5vbigibW91c2Vkb3duLmRyYWciLGkpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLG8pfWZ1bmN0aW9uIGUobix0LGUsaSxvKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIG4sZSxyPXQoaCx2KTtyJiYobj1yWzBdLU1bMF0sZT1yWzFdLU1bMV0scHw9bnxlLE09cixnKHt0eXBlOiJkcmFnIix4OnJbMF0rbFswXSx5OnJbMV0rbFsxXSxkeDpuLGR5OmV9KSl9ZnVuY3Rpb24gYygpe3QoaCx2KSYmKG0ub24oaStkLG51bGwpLm9uKG8rZCxudWxsKSx5KHAmJnRhLmV2ZW50LnRhcmdldD09PWYpLGcoe3R5cGU6ImRyYWdlbmQifSkpfXZhciBsLHM9dGhpcyxmPXRhLmV2ZW50LnRhcmdldCxoPXMucGFyZW50Tm9kZSxnPXIub2Yocyxhcmd1bWVudHMpLHA9MCx2PW4oKSxkPSIuZHJhZyIrKG51bGw9PXY/IiI6Ii0iK3YpLG09dGEuc2VsZWN0KGUoZikpLm9uKGkrZCxhKS5vbihvK2QsYykseT1XKGYpLE09dChoLHYpO3U/KGw9dS5hcHBseShzLGFyZ3VtZW50cyksbD1bbC54LU1bMF0sbC55LU1bMV1dKTpsPVswLDBdLGcoe3R5cGU6ImRyYWdzdGFydCJ9KX19dmFyIHI9RShuLCJkcmFnIiwiZHJhZ3N0YXJ0IiwiZHJhZ2VuZCIpLHU9bnVsbCxpPWUoYix0YS5tb3VzZSx0LCJtb3VzZW1vdmUiLCJtb3VzZXVwIiksbz1lKEcsdGEudG91Y2gseSwidG91Y2htb3ZlIiwidG91Y2hlbmQiKTtyZXR1cm4gbi5vcmlnaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSx0YS5yZWJpbmQobixyLCJvbiIpfSx0YS50b3VjaGVzPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9aygpLnRvdWNoZXMpLHQ/cmEodCkubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPUoobix0KTtyZXR1cm4gZS5pZGVudGlmaWVyPXQuaWRlbnRpZmllcixlfSk6W119O3ZhciBDYT0xZS02LHphPUNhKkNhLHFhPU1hdGguUEksTGE9MipxYSxUYT1MYS1DYSxSYT1xYS8yLERhPXFhLzE4MCxQYT0xODAvcWEsVWE9TWF0aC5TUVJUMixqYT0yLEZhPTQ7dGEuaW50ZXJwb2xhdGVab29tPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuKXt2YXIgdD1uKnk7aWYobSl7dmFyIGU9cnQodiksbz1pLyhqYSpoKSooZSp1dChVYSp0K3YpLWV0KHYpKTtyZXR1cm5bcitvKmwsdStvKnMsaSplL3J0KFVhKnQrdildfXJldHVybltyK24qbCx1K24qcyxpKk1hdGguZXhwKFVhKnQpXX12YXIgcj1uWzBdLHU9blsxXSxpPW5bMl0sbz10WzBdLGE9dFsxXSxjPXRbMl0sbD1vLXIscz1hLXUsZj1sKmwrcypzLGg9TWF0aC5zcXJ0KGYpLGc9KGMqYy1pKmkrRmEqZikvKDIqaSpqYSpoKSxwPShjKmMtaSppLUZhKmYpLygyKmMqamEqaCksdj1NYXRoLmxvZyhNYXRoLnNxcnQoZypnKzEpLWcpLGQ9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSxtPWQtdix5PShtfHxNYXRoLmxvZyhjL2kpKS9VYTtyZXR1cm4gZS5kdXJhdGlvbj0xZTMqeSxlfSx0YS5iZWhhdmlvci56b29tPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLm9uKHEsZikub24oT2ErIi56b29tIixnKS5vbigiZGJsY2xpY2suem9vbSIscCkub24oUixoKX1mdW5jdGlvbiBlKG4pe3JldHVyblsoblswXS1rLngpL2suaywoblsxXS1rLnkpL2sua119ZnVuY3Rpb24gcihuKXtyZXR1cm5bblswXSprLmsray54LG5bMV0qay5rK2sueV19ZnVuY3Rpb24gdShuKXtrLms9TWF0aC5tYXgoTlswXSxNYXRoLm1pbihOWzFdLG4pKX1mdW5jdGlvbiBpKG4sdCl7dD1yKHQpLGsueCs9blswXS10WzBdLGsueSs9blsxXS10WzFdfWZ1bmN0aW9uIG8odCxlLHIsbyl7dC5fX2NoYXJ0X189e3g6ay54LHk6ay55LGs6ay5rfSx1KE1hdGgucG93KDIsbykpLGkoZD1lLHIpLHQ9dGEuc2VsZWN0KHQpLEM+MCYmKHQ9dC50cmFuc2l0aW9uKCkuZHVyYXRpb24oQykpLHQuY2FsbChuLmV2ZW50KX1mdW5jdGlvbiBhKCl7YiYmYi5kb21haW4oeC5yYW5nZSgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi1rLngpL2sua30pLm1hcCh4LmludmVydCkpLHcmJncuZG9tYWluKF8ucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay55KS9rLmt9KS5tYXAoXy5pbnZlcnQpKX1mdW5jdGlvbiBjKG4pe3orK3x8bih7dHlwZToiem9vbXN0YXJ0In0pfWZ1bmN0aW9uIGwobil7YSgpLG4oe3R5cGU6Inpvb20iLHNjYWxlOmsuayx0cmFuc2xhdGU6W2sueCxrLnldfSl9ZnVuY3Rpb24gcyhuKXstLXp8fChuKHt0eXBlOiJ6b29tZW5kIn0pLGQ9bnVsbCl9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXtmPTEsaSh0YS5tb3VzZSh1KSxnKSxsKGEpfWZ1bmN0aW9uIHIoKXtoLm9uKEwsbnVsbCkub24oVCxudWxsKSxwKGYmJnRhLmV2ZW50LnRhcmdldD09PW8pLHMoYSl9dmFyIHU9dGhpcyxvPXRhLmV2ZW50LnRhcmdldCxhPUQub2YodSxhcmd1bWVudHMpLGY9MCxoPXRhLnNlbGVjdCh0KHUpKS5vbihMLG4pLm9uKFQsciksZz1lKHRhLm1vdXNlKHUpKSxwPVcodSk7RGwuY2FsbCh1KSxjKGEpfWZ1bmN0aW9uIGgoKXtmdW5jdGlvbiBuKCl7dmFyIG49dGEudG91Y2hlcyhwKTtyZXR1cm4gZz1rLmssbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uaWRlbnRpZmllciBpbiBkJiYoZFtuLmlkZW50aWZpZXJdPWUobikpfSksbn1mdW5jdGlvbiB0KCl7dmFyIHQ9dGEuZXZlbnQudGFyZ2V0O3RhLnNlbGVjdCh0KS5vbih4LHIpLm9uKGIsYSksXy5wdXNoKHQpO2Zvcih2YXIgZT10YS5ldmVudC5jaGFuZ2VkVG91Y2hlcyx1PTAsaT1lLmxlbmd0aDtpPnU7Kyt1KWRbZVt1XS5pZGVudGlmaWVyXT1udWxsO3ZhciBjPW4oKSxsPURhdGUubm93KCk7aWYoMT09PWMubGVuZ3RoKXtpZig1MDA+bC1NKXt2YXIgcz1jWzBdO28ocCxzLGRbcy5pZGVudGlmaWVyXSxNYXRoLmZsb29yKE1hdGgubG9nKGsuaykvTWF0aC5MTjIpKzEpLFMoKX1NPWx9ZWxzZSBpZihjLmxlbmd0aD4xKXt2YXIgcz1jWzBdLGY9Y1sxXSxoPXNbMF0tZlswXSxnPXNbMV0tZlsxXTttPWgqaCtnKmd9fWZ1bmN0aW9uIHIoKXt2YXIgbix0LGUscixvPXRhLnRvdWNoZXMocCk7RGwuY2FsbChwKTtmb3IodmFyIGE9MCxjPW8ubGVuZ3RoO2M+YTsrK2Escj1udWxsKWlmKGU9b1thXSxyPWRbZS5pZGVudGlmaWVyXSl7aWYodClicmVhaztuPWUsdD1yfWlmKHIpe3ZhciBzPShzPWVbMF0tblswXSkqcysocz1lWzFdLW5bMV0pKnMsZj1tJiZNYXRoLnNxcnQocy9tKTtuPVsoblswXStlWzBdKS8yLChuWzFdK2VbMV0pLzJdLHQ9Wyh0WzBdK3JbMF0pLzIsKHRbMV0rclsxXSkvMl0sdShmKmcpfU09bnVsbCxpKG4sdCksbCh2KX1mdW5jdGlvbiBhKCl7aWYodGEuZXZlbnQudG91Y2hlcy5sZW5ndGgpe2Zvcih2YXIgdD10YS5ldmVudC5jaGFuZ2VkVG91Y2hlcyxlPTAscj10Lmxlbmd0aDtyPmU7KytlKWRlbGV0ZSBkW3RbZV0uaWRlbnRpZmllcl07Zm9yKHZhciB1IGluIGQpcmV0dXJuIHZvaWQgbigpfXRhLnNlbGVjdEFsbChfKS5vbih5LG51bGwpLHcub24ocSxmKS5vbihSLGgpLEUoKSxzKHYpfXZhciBnLHA9dGhpcyx2PUQub2YocCxhcmd1bWVudHMpLGQ9e30sbT0wLHk9Ii56b29tLSIrdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcix4PSJ0b3VjaG1vdmUiK3ksYj0idG91Y2hlbmQiK3ksXz1bXSx3PXRhLnNlbGVjdChwKSxFPVcocCk7dCgpLGModiksdy5vbihxLG51bGwpLm9uKFIsdCl9ZnVuY3Rpb24gZygpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpO3k/Y2xlYXJUaW1lb3V0KHkpOihEbC5jYWxsKHRoaXMpLHY9ZShkPW18fHRhLm1vdXNlKHRoaXMpKSxjKG4pKSx5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt5PW51bGwscyhuKX0sNTApLFMoKSx1KE1hdGgucG93KDIsLjAwMipIYSgpKSprLmspLGkoZCx2KSxsKG4pfWZ1bmN0aW9uIHAoKXt2YXIgbj10YS5tb3VzZSh0aGlzKSx0PU1hdGgubG9nKGsuaykvTWF0aC5MTjI7byh0aGlzLG4sZShuKSx0YS5ldmVudC5zaGlmdEtleT9NYXRoLmNlaWwodCktMTpNYXRoLmZsb29yKHQpKzEpfXZhciB2LGQsbSx5LE0seCxiLF8sdyxrPXt4OjAseTowLGs6MX0sQT1bOTYwLDUwMF0sTj1JYSxDPTI1MCx6PTAscT0ibW91c2Vkb3duLnpvb20iLEw9Im1vdXNlbW92ZS56b29tIixUPSJtb3VzZXVwLnpvb20iLFI9InRvdWNoc3RhcnQuem9vbSIsRD1FKG4sInpvb21zdGFydCIsInpvb20iLCJ6b29tZW5kIik7cmV0dXJuIE9hfHwoT2E9Im9ud2hlZWwiaW4gdWE/KEhhPWZ1bmN0aW9uKCl7cmV0dXJuLXRhLmV2ZW50LmRlbHRhWSoodGEuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiB1YT8oSGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooSGE9ZnVuY3Rpb24oKXtyZXR1cm4tdGEuZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpKSxuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpLHQ9aztUbD90YS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7az10aGlzLl9fY2hhcnRfX3x8e3g6MCx5OjAsazoxfSxjKG4pfSkudHdlZW4oInpvb206em9vbSIsZnVuY3Rpb24oKXt2YXIgZT1BWzBdLHI9QVsxXSx1PWQ/ZFswXTplLzIsaT1kP2RbMV06ci8yLG89dGEuaW50ZXJwb2xhdGVab29tKFsodS1rLngpL2suaywoaS1rLnkpL2suayxlL2sua10sWyh1LXQueCkvdC5rLChpLXQueSkvdC5rLGUvdC5rXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPW8odCksYT1lL3JbMl07dGhpcy5fX2NoYXJ0X189az17eDp1LXJbMF0qYSx5OmktclsxXSphLGs6YX0sbChuKX19KS5lYWNoKCJpbnRlcnJ1cHQuem9vbSIsZnVuY3Rpb24oKXtzKG4pfSkuZWFjaCgiZW5kLnpvb20iLGZ1bmN0aW9uKCl7cyhuKX0pOih0aGlzLl9fY2hhcnRfXz1rLGMobiksbChuKSxzKG4pKX0pfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDordFswXSx5Oit0WzFdLGs6ay5rfSxhKCksbik6W2sueCxrLnldfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXt4OmsueCx5OmsueSxrOit0fSxhKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhOPW51bGw9PXQ/SWE6Wyt0WzBdLCt0WzFdXSxuKTpOfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10JiZbK3RbMF0sK3RbMV1dLG4pOm19LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT10JiZbK3RbMF0sK3RbMV1dLG4pOkF9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEM9K3Qsbik6Q30sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXQseD10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6Yn0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6d30sdGEucmViaW5kKG4sRCwib24iKX07dmFyIEhhLE9hLElhPVswLDEvMF07dGEuY29sb3I9b3Qsb3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LHRhLmhzbD1hdDt2YXIgWWE9YXQucHJvdG90eXBlPW5ldyBvdDtZYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGF0KHRoaXMuaCx0aGlzLnMsdGhpcy5sL24pfSxZYS5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBhdCh0aGlzLmgsdGhpcy5zLG4qdGhpcy5sKX0sWWEucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGN0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sdGEuaGNsPWx0O3ZhciBaYT1sdC5wcm90b3R5cGU9bmV3IG90O1phLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgbHQodGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK1ZhKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sWmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgbHQodGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1WYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LFphLnJnYj1mdW5jdGlvbigpe3JldHVybiBzdCh0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LHRhLmxhYj1mdDt2YXIgVmE9MTgsWGE9Ljk1MDQ3LCRhPTEsQmE9MS4wODg4MyxXYT1mdC5wcm90b3R5cGU9bmV3IG90O1dhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZnQoTWF0aC5taW4oMTAwLHRoaXMubCtWYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0sV2EuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZnQoTWF0aC5tYXgoMCx0aGlzLmwtVmEqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFdhLnJnYj1mdW5jdGlvbigpe3JldHVybiBodCh0aGlzLmwsdGhpcy5hLHRoaXMuYil9LHRhLnJnYj1tdDt2YXIgSmE9bXQucHJvdG90eXBlPW5ldyBvdDtKYS5icmlnaHRlcj1mdW5jdGlvbihuKXtuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKTt2YXIgdD10aGlzLnIsZT10aGlzLmcscj10aGlzLmIsdT0zMDtyZXR1cm4gdHx8ZXx8cj8odCYmdT50JiYodD11KSxlJiZ1PmUmJihlPXUpLHImJnU+ciYmKHI9dSksbmV3IG10KE1hdGgubWluKDI1NSx0L24pLE1hdGgubWluKDI1NSxlL24pLE1hdGgubWluKDI1NSxyL24pKSk6bmV3IG10KHUsdSx1KX0sSmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgbXQobip0aGlzLnIsbip0aGlzLmcsbip0aGlzLmIpfSxKYS5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gX3QodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxKYS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIit4dCh0aGlzLnIpK3h0KHRoaXMuZykreHQodGhpcy5iKX07dmFyIEdhPXRhLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7R2EuZm9yRWFjaChmdW5jdGlvbihuLHQpe0dhLnNldChuLHl0KHQpKX0pLHRhLmZ1bmN0b3I9RXQsdGEueGhyPUF0KHkpLHRhLmRzdj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9ZSxlPW51bGwpO3ZhciBvPU50KG4sdCxudWxsPT1lP3I6dShlKSxpKTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShudWxsPT0oZT1uKT9yOnUobikpOmV9LG99ZnVuY3Rpb24gcihuKXtyZXR1cm4gZS5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucGFyc2UodC5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4obil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gYS50ZXN0KG4pPyciJytuLnJlcGxhY2UoL1wiL2csJyIiJykrJyInOm59dmFyIGE9bmV3IFJlZ0V4cCgnWyInK24rIlxuXSIpLGM9bi5jaGFyQ29kZUF0KDApO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4sdCl7dmFyIHI7cmV0dXJuIGUucGFyc2VSb3dzKG4sZnVuY3Rpb24obixlKXtpZihyKXJldHVybiByKG4sZS0xKTt2YXIgdT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobikrIjogZFsiK3QrIl0ifSkuam9pbigiLCIpKyJ9Iik7cj10P2Z1bmN0aW9uKG4sZSl7cmV0dXJuIHQodShuKSxlKX06dX0pfSxlLnBhcnNlUm93cz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXtpZihzPj1sKXJldHVybiBvO2lmKHUpcmV0dXJuIHU9ITEsaTt2YXIgdD1zO2lmKDM0PT09bi5jaGFyQ29kZUF0KHQpKXtmb3IodmFyIGU9dDtlKys8bDspaWYoMzQ9PT1uLmNoYXJDb2RlQXQoZSkpe2lmKDM0IT09bi5jaGFyQ29kZUF0KGUrMSkpYnJlYWs7KytlfXM9ZSsyO3ZhciByPW4uY2hhckNvZGVBdChlKzEpO3JldHVybiAxMz09PXI/KHU9ITAsMTA9PT1uLmNoYXJDb2RlQXQoZSsyKSYmKytzKToxMD09PXImJih1PSEwKSxuLnNsaWNlKHQrMSxlKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtsPnM7KXt2YXIgcj1uLmNoYXJDb2RlQXQocysrKSxhPTE7aWYoMTA9PT1yKXU9ITA7ZWxzZSBpZigxMz09PXIpdT0hMCwxMD09PW4uY2hhckNvZGVBdChzKSYmKCsrcywrK2EpO2Vsc2UgaWYociE9PWMpY29udGludWU7cmV0dXJuIG4uc2xpY2UodCxzLWEpfXJldHVybiBuLnNsaWNlKHQpfWZvcih2YXIgcix1LGk9e30sbz17fSxhPVtdLGw9bi5sZW5ndGgscz0wLGY9MDsocj1lKCkpIT09bzspe2Zvcih2YXIgaD1bXTtyIT09aSYmciE9PW87KWgucHVzaChyKSxyPWUoKTt0JiZudWxsPT0oaD10KGgsZisrKSl8fGEucHVzaChoKX1yZXR1cm4gYX0sZS5mb3JtYXQ9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gZS5mb3JtYXRSb3dzKHQpO3ZhciByPW5ldyBtLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilyLmhhcyh0KXx8dS5wdXNoKHIuYWRkKHQpKX0pLFt1Lm1hcChvKS5qb2luKG4pXS5jb25jYXQodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHRbbl0pfSkuam9pbihuKX0pKS5qb2luKCJcbiIpfSxlLmZvcm1hdFJvd3M9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGkpLmpvaW4oIlxuIil9LGV9LHRhLmNzdj10YS5kc3YoIiwiLCJ0ZXh0L2NzdiIpLHRhLnRzdj10YS5kc3YoIgkiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7dmFyIEthLFFhLG5jLHRjLGVjLHJjPXRoaXNbeCh0aGlzLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O3RhLnRpbWVyPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgdT1lK3QsaT17YzpuLHQ6dSxmOiExLG46bnVsbH07UWE/UWEubj1pOkthPWksUWE9aSxuY3x8KHRjPWNsZWFyVGltZW91dCh0YyksbmM9MSxyYyhxdCkpfSx0YS50aW1lci5mbHVzaD1mdW5jdGlvbigpe0x0KCksVHQoKX0sdGEucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciB1Yz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoRHQpO3RhLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuIG4mJigwPm4mJihuKj0tMSksdCYmKG49dGEucm91bmQobixSdChuLHQpKSksZT0xK01hdGguZmxvb3IoMWUtMTIrTWF0aC5sb2cobikvTWF0aC5MTjEwKSxlPU1hdGgubWF4KC0yNCxNYXRoLm1pbigyNCwzKk1hdGguZmxvb3IoKGUtMSkvMykpKSksdWNbOCtlLzNdfTt2YXIgaWM9Lyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pLG9jPXRhLm1hcCh7YjpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygyKX0sYzpmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuKX0sbzpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZyg4KX0seDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNil9LFg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LGc6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b1ByZWNpc2lvbih0KX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0ZpeGVkKHQpfSxyOmZ1bmN0aW9uKG4sdCl7cmV0dXJuKG49dGEucm91bmQobixSdChuLHQpKSkudG9GaXhlZChNYXRoLm1heCgwLE1hdGgubWluKDIwLFJ0KG4qKDErMWUtMTUpLHQpKSkpfX0pLGFjPXRhLnRpbWU9e30sY2M9RGF0ZTtqdC5wcm90b3R5cGU9e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RhdGUoKX0sZ2V0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKX0sZ2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCl9LGdldEhvdXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENIb3VycygpfSxnZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpfSxnZXRNaW51dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCl9LGdldE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNb250aCgpfSxnZXRTZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCl9LGdldFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFRpbWUoKX0sZ2V0VGltZXpvbmVPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8udmFsdWVPZigpfSxzZXREYXRlOmZ1bmN0aW9uKCl7bGMuc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RGF5OmZ1bmN0aW9uKCl7bGMuc2V0VVRDRGF5LmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRGdWxsWWVhcjpmdW5jdGlvbigpe2xjLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRIb3VyczpmdW5jdGlvbigpe2xjLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtsYy5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbnV0ZXM6ZnVuY3Rpb24oKXtsYy5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNb250aDpmdW5jdGlvbigpe2xjLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRTZWNvbmRzOmZ1bmN0aW9uKCl7bGMuc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0VGltZTpmdW5jdGlvbigpe2xjLnNldFRpbWUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9fTt2YXIgbGM9RGF0ZS5wcm90b3R5cGU7YWMueWVhcj1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1hYy5kYXkobiksbi5zZXRNb250aCgwLDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCl9KSxhYy55ZWFycz1hYy55ZWFyLnJhbmdlLGFjLnllYXJzLnV0Yz1hYy55ZWFyLnV0Yy5yYW5nZSxhYy5kYXk9RnQoZnVuY3Rpb24obil7dmFyIHQ9bmV3IGNjKDJlMywwKTtyZXR1cm4gdC5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpKSx0fSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF0ZSgpLTF9KSxhYy5kYXlzPWFjLmRheS5yYW5nZSxhYy5kYXlzLnV0Yz1hYy5kYXkudXRjLnJhbmdlLGFjLmRheU9mWWVhcj1mdW5jdGlvbihuKXt2YXIgdD1hYy55ZWFyKG4pO3JldHVybiBNYXRoLmZsb29yKChuLXQtNmU0KihuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvODY0ZTUpfSxbInN1bmRheSIsIm1vbmRheSIsInR1ZXNkYXkiLCJ3ZWRuZXNkYXkiLCJ0aHVyc2RheSIsImZyaWRheSIsInNhdHVyZGF5Il0uZm9yRWFjaChmdW5jdGlvbihuLHQpe3Q9Ny10O3ZhciBlPWFjW25dPUZ0KGZ1bmN0aW9uKG4pe3JldHVybihuPWFjLmRheShuKSkuc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSt0KSU3KSxufSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSs3Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXt2YXIgZT1hYy55ZWFyKG4pLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChhYy5kYXlPZlllYXIobikrKGUrdCklNykvNyktKGUhPT10KX0pO2FjW24rInMiXT1lLnJhbmdlLGFjW24rInMiXS51dGM9ZS51dGMucmFuZ2UsYWNbbisiT2ZZZWFyIl09ZnVuY3Rpb24obil7dmFyIGU9YWMueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoYWMuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpfX0pLGFjLndlZWs9YWMuc3VuZGF5LGFjLndlZWtzPWFjLnN1bmRheS5yYW5nZSxhYy53ZWVrcy51dGM9YWMuc3VuZGF5LnV0Yy5yYW5nZSxhYy53ZWVrT2ZZZWFyPWFjLnN1bmRheU9mWWVhcjt2YXIgc2M9eyItIjoiIixfOiIgIiwwOiIwIn0sZmM9L15ccypcZCsvLGhjPS9eJS87dGEubG9jYWxlPWZ1bmN0aW9uKG4pe3JldHVybntudW1iZXJGb3JtYXQ6UHQobiksdGltZUZvcm1hdDpPdChuKX19O3ZhciBnYz10YS5sb2NhbGUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdLGRhdGVUaW1lOiIlYSAlYiAlZSAlWCAlWSIsZGF0ZToiJW0vJWQvJVkiLHRpbWU6IiVIOiVNOiVTIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3RhLmZvcm1hdD1nYy5udW1iZXJGb3JtYXQsdGEuZ2VvPXt9LGNlLnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7bGUobix0aGlzLnQscGMpLGxlKHBjLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPXBjLnQ6dGhpcy5zPXBjLnQKfSxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgcGM9bmV3IGNlO3RhLmdlby5zdHJlYW09ZnVuY3Rpb24obix0KXtuJiZ2Yy5oYXNPd25Qcm9wZXJ0eShuLnR5cGUpP3ZjW24udHlwZV0obix0KTpzZShuLHQpfTt2YXIgdmM9e0ZlYXR1cmU6ZnVuY3Rpb24obix0KXtzZShuLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmZlYXR1cmVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspc2UoZVtyXS5nZW9tZXRyeSx0KX19LGRjPXtTcGhlcmU6ZnVuY3Rpb24obix0KXt0LnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihuLHQpe249bi5jb29yZGluYXRlcyx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspbj1lW3JdLHQucG9pbnQoblswXSxuWzFdLG5bMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7ZmUobi5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWZlKGVbcl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihuLHQpe2hlKG4uY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspaGUoZVtyXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZ2VvbWV0cmllcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0sdCl9fTt0YS5nZW8uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gbWM9MCx0YS5nZW8uc3RyZWFtKG4sTWMpLG1jfTt2YXIgbWMseWM9bmV3IGNlLE1jPXtzcGhlcmU6ZnVuY3Rpb24oKXttYys9NCpxYX0scG9pbnQ6YixsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7eWMucmVzZXQoKSxNYy5saW5lU3RhcnQ9Z2V9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgbj0yKnljO21jKz0wPm4/NCpxYStuOm4sTWMubGluZVN0YXJ0PU1jLmxpbmVFbmQ9TWMucG9pbnQ9Yn19O3RhLmdlby5ib3VuZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdCl7TS5wdXNoKHg9W3M9bixoPW5dKSxmPnQmJihmPXQpLHQ+ZyYmKGc9dCl9ZnVuY3Rpb24gdCh0LGUpe3ZhciByPXBlKFt0KkRhLGUqRGFdKTtpZihtKXt2YXIgdT1kZShtLHIpLGk9W3VbMV0sLXVbMF0sMF0sbz1kZShpLHUpO01lKG8pLG89eGUobyk7dmFyIGM9dC1wLGw9Yz4wPzE6LTEsdj1vWzBdKlBhKmwsZD1nYShjKT4xODA7aWYoZF4odj5sKnAmJmwqdD52KSl7dmFyIHk9b1sxXSpQYTt5PmcmJihnPXkpfWVsc2UgaWYodj0odiszNjApJTM2MC0xODAsZF4odj5sKnAmJmwqdD52KSl7dmFyIHk9LW9bMV0qUGE7Zj55JiYoZj15KX1lbHNlIGY+ZSYmKGY9ZSksZT5nJiYoZz1lKTtkP3A+dD9hKHMsdCk+YShzLGgpJiYoaD10KTphKHQsaCk+YShzLGgpJiYocz10KTpoPj1zPyhzPnQmJihzPXQpLHQ+aCYmKGg9dCkpOnQ+cD9hKHMsdCk+YShzLGgpJiYoaD10KTphKHQsaCk+YShzLGgpJiYocz10KX1lbHNlIG4odCxlKTttPXIscD10fWZ1bmN0aW9uIGUoKXtiLnBvaW50PXR9ZnVuY3Rpb24gcigpe3hbMF09cyx4WzFdPWgsYi5wb2ludD1uLG09bnVsbH1mdW5jdGlvbiB1KG4sZSl7aWYobSl7dmFyIHI9bi1wO3krPWdhKHIpPjE4MD9yKyhyPjA/MzYwOi0zNjApOnJ9ZWxzZSB2PW4sZD1lO01jLnBvaW50KG4sZSksdChuLGUpfWZ1bmN0aW9uIGkoKXtNYy5saW5lU3RhcnQoKX1mdW5jdGlvbiBvKCl7dSh2LGQpLE1jLmxpbmVFbmQoKSxnYSh5KT5DYSYmKHM9LShoPTE4MCkpLHhbMF09cyx4WzFdPWgsbT1udWxsfWZ1bmN0aW9uIGEobix0KXtyZXR1cm4odC09bik8MD90KzM2MDp0fWZ1bmN0aW9uIGMobix0KXtyZXR1cm4gblswXS10WzBdfWZ1bmN0aW9uIGwobix0KXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufXZhciBzLGYsaCxnLHAsdixkLG0seSxNLHgsYj17cG9pbnQ6bixsaW5lU3RhcnQ6ZSxsaW5lRW5kOnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Yi5wb2ludD11LGIubGluZVN0YXJ0PWksYi5saW5lRW5kPW8seT0wLE1jLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7TWMucG9seWdvbkVuZCgpLGIucG9pbnQ9bixiLmxpbmVTdGFydD1lLGIubGluZUVuZD1yLDA+eWM/KHM9LShoPTE4MCksZj0tKGc9OTApKTp5PkNhP2c9OTA6LUNhPnkmJihmPS05MCkseFswXT1zLHhbMV09aH19O3JldHVybiBmdW5jdGlvbihuKXtnPWg9LShzPWY9MS8wKSxNPVtdLHRhLmdlby5zdHJlYW0obixiKTt2YXIgdD1NLmxlbmd0aDtpZih0KXtNLnNvcnQoYyk7Zm9yKHZhciBlLHI9MSx1PU1bMF0saT1bdV07dD5yOysrcillPU1bcl0sbChlWzBdLHUpfHxsKGVbMV0sdSk/KGEodVswXSxlWzFdKT5hKHVbMF0sdVsxXSkmJih1WzFdPWVbMV0pLGEoZVswXSx1WzFdKT5hKHVbMF0sdVsxXSkmJih1WzBdPWVbMF0pKTppLnB1c2godT1lKTtmb3IodmFyIG8sZSxwPS0xLzAsdD1pLmxlbmd0aC0xLHI9MCx1PWlbdF07dD49cjt1PWUsKytyKWU9aVtyXSwobz1hKHVbMV0sZVswXSkpPnAmJihwPW8scz1lWzBdLGg9dVsxXSl9cmV0dXJuIE09eD1udWxsLDEvMD09PXN8fDEvMD09PWY/W1swLzAsMC8wXSxbMC8wLDAvMF1dOltbcyxmXSxbaCxnXV19fSgpLHRhLmdlby5jZW50cm9pZD1mdW5jdGlvbihuKXt4Yz1iYz1fYz13Yz1TYz1rYz1FYz1BYz1OYz1DYz16Yz0wLHRhLmdlby5zdHJlYW0obixxYyk7dmFyIHQ9TmMsZT1DYyxyPXpjLHU9dCp0K2UqZStyKnI7cmV0dXJuIHphPnUmJih0PWtjLGU9RWMscj1BYyxDYT5iYyYmKHQ9X2MsZT13YyxyPVNjKSx1PXQqdCtlKmUrcipyLHphPnUpP1swLzAsMC8wXTpbTWF0aC5hdGFuMihlLHQpKlBhLHR0KHIvTWF0aC5zcXJ0KHUpKSpQYV19O3ZhciB4YyxiYyxfYyx3YyxTYyxrYyxFYyxBYyxOYyxDYyx6YyxxYz17c3BoZXJlOmIscG9pbnQ6X2UsbGluZVN0YXJ0OlNlLGxpbmVFbmQ6a2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cWMubGluZVN0YXJ0PUVlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cWMubGluZVN0YXJ0PVNlfX0sTGM9TGUoTmUsUGUsamUsWy1xYSwtcWEvMl0pLFRjPTFlOTt0YS5nZW8uY2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciBuLHQsZSxyLHUsaSxvPXtzdHJlYW06ZnVuY3Rpb24obil7cmV0dXJuIHUmJih1LnZhbGlkPSExKSx1PWkobiksdS52YWxpZD0hMCx1fSxleHRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9SWUobj0rYVswXVswXSx0PSthWzBdWzFdLGU9K2FbMV1bMF0scj0rYVsxXVsxXSksdSYmKHUudmFsaWQ9ITEsdT1udWxsKSxvKTpbW24sdF0sW2Uscl1dfX07cmV0dXJuIG8uZXh0ZW50KFtbMCwwXSxbOTYwLDUwMF1dKX0sKHRhLmdlby5jb25pY0VxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBZZShaZSl9KS5yYXc9WmUsdGEuZ2VvLmFsYmVycz1mdW5jdGlvbigpe3JldHVybiB0YS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKX0sdGEuZ2VvLmFsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7dmFyIGk9blswXSxvPW5bMV07cmV0dXJuIHQ9bnVsbCxlKGksbyksdHx8KHIoaSxvKSx0KXx8dShpLG8pLHR9dmFyIHQsZSxyLHUsaT10YS5nZW8uYWxiZXJzKCksbz10YS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGE9dGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGM9e3BvaW50OmZ1bmN0aW9uKG4sZSl7dD1bbixlXX19O3JldHVybiBuLmludmVydD1mdW5jdGlvbihuKXt2YXIgdD1pLnNjYWxlKCksZT1pLnRyYW5zbGF0ZSgpLHI9KG5bMF0tZVswXSkvdCx1PShuWzFdLWVbMV0pL3Q7cmV0dXJuKHU+PS4xMiYmLjIzND51JiZyPj0tLjQyNSYmLS4yMTQ+cj9vOnU+PS4xNjYmJi4yMzQ+dSYmcj49LS4yMTQmJi0uMTE1PnI/YTppKS5pbnZlcnQobil9LG4uc3RyZWFtPWZ1bmN0aW9uKG4pe3ZhciB0PWkuc3RyZWFtKG4pLGU9by5zdHJlYW0obikscj1hLnN0cmVhbShuKTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obix1KXt0LnBvaW50KG4sdSksZS5wb2ludChuLHUpLHIucG9pbnQobix1KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dC5zcGhlcmUoKSxlLnNwaGVyZSgpLHIuc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksZS5saW5lU3RhcnQoKSxyLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCksZS5saW5lRW5kKCksci5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksZS5wb2x5Z29uU3RhcnQoKSxyLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksZS5wb2x5Z29uRW5kKCksci5wb2x5Z29uRW5kKCl9fX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkucHJlY2lzaW9uKHQpLG8ucHJlY2lzaW9uKHQpLGEucHJlY2lzaW9uKHQpLG4pOmkucHJlY2lzaW9uKCl9LG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkuc2NhbGUodCksby5zY2FsZSguMzUqdCksYS5zY2FsZSh0KSxuLnRyYW5zbGF0ZShpLnRyYW5zbGF0ZSgpKSk6aS5zY2FsZSgpfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gaS50cmFuc2xhdGUoKTt2YXIgbD1pLnNjYWxlKCkscz0rdFswXSxmPSt0WzFdO3JldHVybiBlPWkudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tzLS40NTUqbCxmLS4yMzgqbF0sW3MrLjQ1NSpsLGYrLjIzOCpsXV0pLnN0cmVhbShjKS5wb2ludCxyPW8udHJhbnNsYXRlKFtzLS4zMDcqbCxmKy4yMDEqbF0pLmNsaXBFeHRlbnQoW1tzLS40MjUqbCtDYSxmKy4xMipsK0NhXSxbcy0uMjE0KmwtQ2EsZisuMjM0KmwtQ2FdXSkuc3RyZWFtKGMpLnBvaW50LHU9YS50cmFuc2xhdGUoW3MtLjIwNSpsLGYrLjIxMipsXSkuY2xpcEV4dGVudChbW3MtLjIxNCpsK0NhLGYrLjE2NipsK0NhXSxbcy0uMTE1KmwtQ2EsZisuMjM0KmwtQ2FdXSkuc3RyZWFtKGMpLnBvaW50LG59LG4uc2NhbGUoMTA3MCl9O3ZhciBSYyxEYyxQYyxVYyxqYyxGYyxIYz17cG9pbnQ6YixsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RGM9MCxIYy5saW5lU3RhcnQ9VmV9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtIYy5saW5lU3RhcnQ9SGMubGluZUVuZD1IYy5wb2ludD1iLFJjKz1nYShEYy8yKX19LE9jPXtwb2ludDpYZSxsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmIscG9seWdvbkVuZDpifSxJYz17cG9pbnQ6V2UsbGluZVN0YXJ0OkplLGxpbmVFbmQ6R2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7SWMubGluZVN0YXJ0PUtlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7SWMucG9pbnQ9V2UsSWMubGluZVN0YXJ0PUplLEljLmxpbmVFbmQ9R2V9fTt0YS5nZW8ucGF0aD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG4mJigiZnVuY3Rpb24iPT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cygrYS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG8mJm8udmFsaWR8fChvPXUoaSkpLHRhLmdlby5zdHJlYW0obixvKSksaS5yZXN1bHQoKX1mdW5jdGlvbiB0KCl7cmV0dXJuIG89bnVsbCxufXZhciBlLHIsdSxpLG8sYT00LjU7cmV0dXJuIG4uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gUmM9MCx0YS5nZW8uc3RyZWFtKG4sdShIYykpLFJjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3JldHVybiBfYz13Yz1TYz1rYz1FYz1BYz1OYz1DYz16Yz0wLHRhLmdlby5zdHJlYW0obix1KEljKSksemM/W05jL3pjLENjL3pjXTpBYz9ba2MvQWMsRWMvQWNdOlNjP1tfYy9TYyx3Yy9TY106WzAvMCwwLzBdfSxuLmJvdW5kcz1mdW5jdGlvbihuKXtyZXR1cm4gamM9RmM9LShQYz1VYz0xLzApLHRhLmdlby5zdHJlYW0obix1KE9jKSksW1tQYyxVY10sW2pjLEZjXV19LG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0oZT1uKT9uLnN0cmVhbXx8dHIobik6eSx0KCkpOmV9LG4uY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT0ocj1uKT9uZXcgJGU6bmV3IFFlKG4pLCJmdW5jdGlvbiIhPXR5cGVvZiBhJiZpLnBvaW50UmFkaXVzKGEpLHQoKSk6cn0sbi5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksbik6YX0sbi5wcm9qZWN0aW9uKHRhLmdlby5hbGJlcnNVc2EoKSkuY29udGV4dChudWxsKX0sdGEuZ2VvLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtyZXR1cm57c3RyZWFtOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBlcih0KTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9fX0sZXIucHJvdG90eXBlPXtwb2ludDpmdW5jdGlvbihuLHQpe3RoaXMuc3RyZWFtLnBvaW50KG4sdCl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fSx0YS5nZW8ucHJvamVjdGlvbj11cix0YS5nZW8ucHJvamVjdGlvbk11dGF0b3I9aXIsKHRhLmdlby5lcXVpcmVjdGFuZ3VsYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoYXIpfSkucmF3PWFyLmludmVydD1hcix0YS5nZW8ucm90YXRpb249ZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdD1uKHRbMF0qRGEsdFsxXSpEYSksdFswXSo9UGEsdFsxXSo9UGEsdH1yZXR1cm4gbj1scihuWzBdJTM2MCpEYSxuWzFdKkRhLG4ubGVuZ3RoPjI/blsyXSpEYTowKSx0LmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdD1uLmludmVydCh0WzBdKkRhLHRbMV0qRGEpLHRbMF0qPVBhLHRbMV0qPVBhLHR9LHR9LGNyLmludmVydD1hcix0YS5nZW8uY2lyY2xlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIsdD1scigtblswXSpEYSwtblsxXSpEYSwwKS5pbnZlcnQsdT1bXTtyZXR1cm4gZShudWxsLG51bGwsMSx7cG9pbnQ6ZnVuY3Rpb24obixlKXt1LnB1c2gobj10KG4sZSkpLG5bMF0qPVBhLG5bMV0qPVBhfX0pLHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdV19fXZhciB0LGUscj1bMCwwXSx1PTY7cmV0dXJuIG4ub3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5hbmdsZT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1ncigodD0rcikqRGEsdSpEYSksbik6dH0sbi5wcmVjaXNpb249ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IodCpEYSwodT0rcikqRGEpLG4pOnV9LG4uYW5nbGUoOTApfSx0YS5nZW8uZGlzdGFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSxyPSh0WzBdLW5bMF0pKkRhLHU9blsxXSpEYSxpPXRbMV0qRGEsbz1NYXRoLnNpbihyKSxhPU1hdGguY29zKHIpLGM9TWF0aC5zaW4odSksbD1NYXRoLmNvcyh1KSxzPU1hdGguc2luKGkpLGY9TWF0aC5jb3MoaSk7cmV0dXJuIE1hdGguYXRhbjIoTWF0aC5zcXJ0KChlPWYqbykqZSsoZT1sKnMtYypmKmEpKmUpLGMqcytsKmYqYSl9LHRhLmdlby5ncmF0aWN1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dCgpfX1mdW5jdGlvbiB0KCl7cmV0dXJuIHRhLnJhbmdlKE1hdGguY2VpbChpL2QpKmQsdSxkKS5tYXAoaCkuY29uY2F0KHRhLnJhbmdlKE1hdGguY2VpbChsL20pKm0sYyxtKS5tYXAoZykpLmNvbmNhdCh0YS5yYW5nZShNYXRoLmNlaWwoci9wKSpwLGUscCkuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBnYShuJWQpPkNhfSkubWFwKHMpKS5jb25jYXQodGEucmFuZ2UoTWF0aC5jZWlsKGEvdikqdixvLHYpLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gZ2EobiVtKT5DYX0pLm1hcChmKSl9dmFyIGUscix1LGksbyxhLGMsbCxzLGYsaCxnLHA9MTAsdj1wLGQ9OTAsbT0zNjAseT0yLjU7cmV0dXJuIG4ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bn19KX0sbi5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltoKGkpLmNvbmNhdChnKGMpLnNsaWNlKDEpLGgodSkucmV2ZXJzZSgpLnNsaWNlKDEpLGcobCkucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uLm1ham9yRXh0ZW50KHQpLm1pbm9yRXh0ZW50KHQpOm4ubWlub3JFeHRlbnQoKX0sbi5tYWpvckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdFswXVswXSx1PSt0WzFdWzBdLGw9K3RbMF1bMV0sYz0rdFsxXVsxXSxpPnUmJih0PWksaT11LHU9dCksbD5jJiYodD1sLGw9YyxjPXQpLG4ucHJlY2lzaW9uKHkpKTpbW2ksbF0sW3UsY11dfSxuLm1pbm9yRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sYT0rdFswXVsxXSxvPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSxhPm8mJih0PWEsYT1vLG89dCksbi5wcmVjaXNpb24oeSkpOltbcixhXSxbZSxvXV19LG4uc3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uLm1ham9yU3RlcCh0KS5taW5vclN0ZXAodCk6bi5taW5vclN0ZXAoKX0sbi5tYWpvclN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K3RbMF0sbT0rdFsxXSxuKTpbZCxtXX0sbi5taW5vclN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K3RbMF0sdj0rdFsxXSxuKTpbcCx2XX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K3Qscz12cihhLG8sOTApLGY9ZHIocixlLHkpLGg9dnIobCxjLDkwKSxnPWRyKGksdSx5KSxuKTp5fSxuLm1ham9yRXh0ZW50KFtbLTE4MCwtOTArQ2FdLFsxODAsOTAtQ2FdXSkubWlub3JFeHRlbnQoW1stMTgwLC04MC1DYV0sWzE4MCw4MCtDYV1dKX0sdGEuZ2VvLmdyZWF0QXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbdHx8ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZXx8dS5hcHBseSh0aGlzLGFyZ3VtZW50cyldfX12YXIgdCxlLHI9bXIsdT15cjtyZXR1cm4gbi5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0YS5nZW8uZGlzdGFuY2UodHx8ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZXx8dS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/bnVsbDplLG4pOnJ9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsZT0iZnVuY3Rpb24iPT10eXBlb2YgdD9udWxsOnQsbik6dX0sbi5wcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uOjB9LG59LHRhLmdlby5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuLHQpe3JldHVybiBNcihuWzBdKkRhLG5bMV0qRGEsdFswXSpEYSx0WzFdKkRhKX0sdGEuZ2VvLmxlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gWWM9MCx0YS5nZW8uc3RyZWFtKG4sWmMpLFljfTt2YXIgWWMsWmM9e3NwaGVyZTpiLHBvaW50OmIsbGluZVN0YXJ0OnhyLGxpbmVFbmQ6Yixwb2x5Z29uU3RhcnQ6Yixwb2x5Z29uRW5kOmJ9LFZjPWJyKGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnNxcnQoMi8oMStuKSl9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXNpbihuLzIpfSk7KHRhLmdlby5hemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoVmMpfSkucmF3PVZjO3ZhciBYYz1icihmdW5jdGlvbihuKXt2YXIgdD1NYXRoLmFjb3Mobik7cmV0dXJuIHQmJnQvTWF0aC5zaW4odCl9LHkpOyh0YS5nZW8uYXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoWGMpfSkucmF3PVhjLCh0YS5nZW8uY29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gWWUoX3IpfSkucmF3PV9yLCh0YS5nZW8uY29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBZZSh3cil9KS5yYXc9d3I7dmFyICRjPWJyKGZ1bmN0aW9uKG4pe3JldHVybiAxL259LE1hdGguYXRhbik7KHRhLmdlby5nbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiB1cigkYyl9KS5yYXc9JGMsU3IuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuW24sMipNYXRoLmF0YW4oTWF0aC5leHAodCkpLVJhXX0sKHRhLmdlby5tZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBrcihTcil9KS5yYXc9U3I7dmFyIEJjPWJyKGZ1bmN0aW9uKCl7cmV0dXJuIDF9LE1hdGguYXNpbik7KHRhLmdlby5vcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoQmMpfSkucmF3PUJjO3ZhciBXYz1icihmdW5jdGlvbihuKXtyZXR1cm4gMS8oMStuKX0sZnVuY3Rpb24obil7cmV0dXJuIDIqTWF0aC5hdGFuKG4pfSk7KHRhLmdlby5zdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFdjKX0pLnJhdz1XYyxFci5pbnZlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm5bLXQsMipNYXRoLmF0YW4oTWF0aC5leHAobikpLVJhXX0sKHRhLmdlby50cmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgbj1rcihFciksdD1uLmNlbnRlcixlPW4ucm90YXRlO3JldHVybiBuLmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj90KFstblsxXSxuWzBdXSk6KG49dCgpLFtuWzFdLC1uWzBdXSl9LG4ucm90YXRlPWZ1bmN0aW9uKG4pe3JldHVybiBuP2UoW25bMF0sblsxXSxuLmxlbmd0aD4yP25bMl0rOTA6OTBdKToobj1lKCksW25bMF0sblsxXSxuWzJdLTkwXSl9LGUoWzAsMCw5MF0pfSkucmF3PUVyLHRhLmdlb209e30sdGEuZ2VvbS5odWxsPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7aWYobi5sZW5ndGg8MylyZXR1cm5bXTt2YXIgdCx1PUV0KGUpLGk9RXQociksbz1uLmxlbmd0aCxhPVtdLGM9W107Zm9yKHQ9MDtvPnQ7dCsrKWEucHVzaChbK3UuY2FsbCh0aGlzLG5bdF0sdCksK2kuY2FsbCh0aGlzLG5bdF0sdCksdF0pO2ZvcihhLnNvcnQoenIpLHQ9MDtvPnQ7dCsrKWMucHVzaChbYVt0XVswXSwtYVt0XVsxXV0pO3ZhciBsPUNyKGEpLHM9Q3IoYyksZj1zWzBdPT09bFswXSxoPXNbcy5sZW5ndGgtMV09PT1sW2wubGVuZ3RoLTFdLGc9W107Zm9yKHQ9bC5sZW5ndGgtMTt0Pj0wOy0tdClnLnB1c2goblthW2xbdF1dWzJdXSk7Zm9yKHQ9K2Y7dDxzLmxlbmd0aC1oOysrdClnLnB1c2goblthW3NbdF1dWzJdXSk7cmV0dXJuIGd9dmFyIGU9QXIscj1OcjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90KG4pOih0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0KX0sdGEuZ2VvbS5wb2x5Z29uPWZ1bmN0aW9uKG4pe3JldHVybiB5YShuLEpjKSxufTt2YXIgSmM9dGEuZ2VvbS5wb2x5Z29uLnByb3RvdHlwZT1bXTtKYy5hcmVhPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQ9LTEsZT10aGlzLmxlbmd0aCxyPXRoaXNbZS0xXSx1PTA7Kyt0PGU7KW49cixyPXRoaXNbdF0sdSs9blsxXSpyWzBdLW5bMF0qclsxXTtyZXR1cm4uNSp1fSxKYy5jZW50cm9pZD1mdW5jdGlvbihuKXt2YXIgdCxlLHI9LTEsdT10aGlzLmxlbmd0aCxpPTAsbz0wLGE9dGhpc1t1LTFdO2Zvcihhcmd1bWVudHMubGVuZ3RofHwobj0tMS8oNip0aGlzLmFyZWEoKSkpOysrcjx1Oyl0PWEsYT10aGlzW3JdLGU9dFswXSphWzFdLWFbMF0qdFsxXSxpKz0odFswXSthWzBdKSplLG8rPSh0WzFdK2FbMV0pKmU7cmV0dXJuW2kqbixvKm5dfSxKYy5jbGlwPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG8sYT1UcihuKSxjPS0xLGw9dGhpcy5sZW5ndGgtVHIodGhpcykscz10aGlzW2wtMV07KytjPGw7KXtmb3IodD1uLnNsaWNlKCksbi5sZW5ndGg9MCx1PXRoaXNbY10saT10WyhyPXQubGVuZ3RoLWEpLTFdLGU9LTE7KytlPHI7KW89dFtlXSxxcihvLHMsdSk/KHFyKGkscyx1KXx8bi5wdXNoKExyKGksbyxzLHUpKSxuLnB1c2gobykpOnFyKGkscyx1KSYmbi5wdXNoKExyKGksbyxzLHUpKSxpPW87YSYmbi5wdXNoKG5bMF0pLHM9dX1yZXR1cm4gbn07dmFyIEdjLEtjLFFjLG5sLHRsLGVsPVtdLHJsPVtdO09yLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQ9dGhpcy5lZGdlcyxlPXQubGVuZ3RoO2UtLTspbj10W2VdLmVkZ2Usbi5iJiZuLmF8fHQuc3BsaWNlKGUsMSk7cmV0dXJuIHQuc29ydChZciksdC5sZW5ndGh9LFFyLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmE6dGhpcy5lZGdlLmJ9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2UubD09PXRoaXMuc2l0ZT90aGlzLmVkZ2UuYjp0aGlzLmVkZ2UuYX19LG51LnByb3RvdHlwZT17aW5zZXJ0OmZ1bmN0aW9uKG4sdCl7dmFyIGUscix1O2lmKG4pe2lmKHQuUD1uLHQuTj1uLk4sbi5OJiYobi5OLlA9dCksbi5OPXQsbi5SKXtmb3Iobj1uLlI7bi5MOyluPW4uTDtuLkw9dH1lbHNlIG4uUj10O2U9bn1lbHNlIHRoaXMuXz8obj11dSh0aGlzLl8pLHQuUD1udWxsLHQuTj1uLG4uUD1uLkw9dCxlPW4pOih0LlA9dC5OPW51bGwsdGhpcy5fPXQsZT1udWxsKTtmb3IodC5MPXQuUj1udWxsLHQuVT1lLHQuQz0hMCxuPXQ7ZSYmZS5DOylyPWUuVSxlPT09ci5MPyh1PXIuUix1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLlImJihldSh0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCxydSh0aGlzLHIpKSk6KHU9ci5MLHUmJnUuQz8oZS5DPXUuQz0hMSxyLkM9ITAsbj1yKToobj09PWUuTCYmKHJ1KHRoaXMsZSksbj1lLGU9bi5VKSxlLkM9ITEsci5DPSEwLGV1KHRoaXMscikpKSxlPW4uVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKG4pe24uTiYmKG4uTi5QPW4uUCksbi5QJiYobi5QLk49bi5OKSxuLk49bi5QPW51bGw7dmFyIHQsZSxyLHU9bi5VLGk9bi5MLG89bi5SO2lmKGU9aT9vP3V1KG8pOmk6byx1P3UuTD09PW4/dS5MPWU6dS5SPWU6dGhpcy5fPWUsaSYmbz8ocj1lLkMsZS5DPW4uQyxlLkw9aSxpLlU9ZSxlIT09bz8odT1lLlUsZS5VPW4uVSxuPWUuUix1Lkw9bixlLlI9byxvLlU9ZSk6KGUuVT11LHU9ZSxuPWUuUikpOihyPW4uQyxuPWUpLG4mJihuLlU9dSksIXIpe2lmKG4mJm4uQylyZXR1cm4gdm9pZChuLkM9ITEpO2Rve2lmKG49PT10aGlzLl8pYnJlYWs7aWYobj09PXUuTCl7aWYodD11LlIsdC5DJiYodC5DPSExLHUuQz0hMCxldSh0aGlzLHUpLHQ9dS5SKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LlImJnQuUi5DfHwodC5MLkM9ITEsdC5DPSEwLHJ1KHRoaXMsdCksdD11LlIpLHQuQz11LkMsdS5DPXQuUi5DPSExLGV1KHRoaXMsdSksbj10aGlzLl87YnJlYWt9fWVsc2UgaWYodD11LkwsdC5DJiYodC5DPSExLHUuQz0hMCxydSh0aGlzLHUpLHQ9dS5MKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LkwmJnQuTC5DfHwodC5SLkM9ITEsdC5DPSEwLGV1KHRoaXMsdCksdD11LkwpLHQuQz11LkMsdS5DPXQuTC5DPSExLHJ1KHRoaXMsdSksbj10aGlzLl87YnJlYWt9dC5DPSEwLG49dSx1PXUuVX13aGlsZSghbi5DKTtuJiYobi5DPSExKX19fSx0YS5nZW9tLnZvcm9ub2k9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXt2YXIgdD1uZXcgQXJyYXkobi5sZW5ndGgpLHI9YVswXVswXSx1PWFbMF1bMV0saT1hWzFdWzBdLG89YVsxXVsxXTtyZXR1cm4gaXUoZShuKSxhKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUsYSl7dmFyIGM9ZS5lZGdlcyxsPWUuc2l0ZSxzPXRbYV09Yy5sZW5ndGg/Yy5tYXAoZnVuY3Rpb24obil7dmFyIHQ9bi5zdGFydCgpO3JldHVyblt0LngsdC55XX0pOmwueD49ciYmbC54PD1pJiZsLnk+PXUmJmwueTw9bz9bW3Isb10sW2ksb10sW2ksdV0sW3IsdV1dOltdO3MucG9pbnQ9blthXX0pLHR9ZnVuY3Rpb24gZShuKXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm57eDpNYXRoLnJvdW5kKGkobix0KS9DYSkqQ2EseTpNYXRoLnJvdW5kKG8obix0KS9DYSkqQ2EsaTp0fX0pfXZhciByPUFyLHU9TnIsaT1yLG89dSxhPXVsO3JldHVybiBuP3Qobik6KHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGl1KGUobikpLmVkZ2VzLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gbi5sJiZuLnJ9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuW3QubC5pXSx0YXJnZXQ6blt0LnIuaV19fSl9LHQudHJpYW5nbGVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO3JldHVybiBpdShlKG4pKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7Zm9yKHZhciB1LGksbz1lLnNpdGUsYT1lLmVkZ2VzLnNvcnQoWXIpLGM9LTEsbD1hLmxlbmd0aCxzPWFbbC0xXS5lZGdlLGY9cy5sPT09bz9zLnI6cy5sOysrYzxsOyl1PXMsaT1mLHM9YVtjXS5lZGdlLGY9cy5sPT09bz9zLnI6cy5sLHI8aS5pJiZyPGYuaSYmYXUobyxpLGYpPDAmJnQucHVzaChbbltyXSxuW2kuaV0sbltmLmldXSl9KSx0fSx0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9RXQocj1uKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RXQodT1uKSx0KTp1fSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bnVsbD09bj91bDpuLHQpOmE9PT11bD9udWxsOmF9LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LmNsaXBFeHRlbnQobiYmW1swLDBdLG5dKTphPT09dWw/bnVsbDphJiZhWzFdfSx0KX07dmFyIHVsPVtbLTFlNiwtMWU2XSxbMWU2LDFlNl1dO3RhLmdlb20uZGVsYXVuYXk9ZnVuY3Rpb24obil7cmV0dXJuIHRhLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyhuKX0sdGEuZ2VvbS5xdWFkdHJlZT1mdW5jdGlvbihuLHQsZSxyLHUpe2Z1bmN0aW9uIGkobil7ZnVuY3Rpb24gaShuLHQsZSxyLHUsaSxvLGEpe2lmKCFpc05hTihlKSYmIWlzTmFOKHIpKWlmKG4ubGVhZil7dmFyIGM9bi54LHM9bi55O2lmKG51bGwhPWMpaWYoZ2EoYy1lKStnYShzLXIpPC4wMSlsKG4sdCxlLHIsdSxpLG8sYSk7ZWxzZXt2YXIgZj1uLnBvaW50O24ueD1uLnk9bi5wb2ludD1udWxsLGwobixmLGMscyx1LGksbyxhKSxsKG4sdCxlLHIsdSxpLG8sYSl9ZWxzZSBuLng9ZSxuLnk9cixuLnBvaW50PXR9ZWxzZSBsKG4sdCxlLHIsdSxpLG8sYSl9ZnVuY3Rpb24gbChuLHQsZSxyLHUsbyxhLGMpe3ZhciBsPS41Kih1K2EpLHM9LjUqKG8rYyksZj1lPj1sLGg9cj49cyxnPWg8PDF8ZjtuLmxlYWY9ITEsbj1uLm5vZGVzW2ddfHwobi5ub2Rlc1tnXT1zdSgpKSxmP3U9bDphPWwsaD9vPXM6Yz1zLGkobix0LGUscix1LG8sYSxjKX12YXIgcyxmLGgsZyxwLHYsZCxtLHksTT1FdChhKSx4PUV0KGMpO2lmKG51bGwhPXQpdj10LGQ9ZSxtPXIseT11O2Vsc2UgaWYobT15PS0odj1kPTEvMCksZj1bXSxoPVtdLHA9bi5sZW5ndGgsbylmb3IoZz0wO3A+ZzsrK2cpcz1uW2ddLHMueDx2JiYodj1zLngpLHMueTxkJiYoZD1zLnkpLHMueD5tJiYobT1zLngpLHMueT55JiYoeT1zLnkpLGYucHVzaChzLngpLGgucHVzaChzLnkpO2Vsc2UgZm9yKGc9MDtwPmc7KytnKXt2YXIgYj0rTShzPW5bZ10sZyksXz0reChzLGcpO3Y+YiYmKHY9YiksZD5fJiYoZD1fKSxiPm0mJihtPWIpLF8+eSYmKHk9XyksZi5wdXNoKGIpLGgucHVzaChfKX12YXIgdz1tLXYsUz15LWQ7dz5TP3k9ZCt3Om09ditTO3ZhciBrPXN1KCk7aWYoay5hZGQ9ZnVuY3Rpb24obil7aShrLG4sK00obiwrK2cpLCt4KG4sZyksdixkLG0seSl9LGsudmlzaXQ9ZnVuY3Rpb24obil7ZnUobixrLHYsZCxtLHkpfSxrLmZpbmQ9ZnVuY3Rpb24obil7cmV0dXJuIGh1KGssblswXSxuWzFdLHYsZCxtLHkpfSxnPS0xLG51bGw9PXQpe2Zvcig7KytnPHA7KWkoayxuW2ddLGZbZ10saFtnXSx2LGQsbSx5KTstLWd9ZWxzZSBuLmZvckVhY2goay5hZGQpO3JldHVybiBmPWg9bj1zPW51bGwsa312YXIgbyxhPUFyLGM9TnI7cmV0dXJuKG89YXJndW1lbnRzLmxlbmd0aCk/KGE9Y3UsYz1sdSwzPT09byYmKHU9ZSxyPXQsZT10PTApLGkobikpOihpLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixpKTphfSxpLnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bixpKTpjfSxpLmV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj90PWU9cj11PW51bGw6KHQ9K25bMF1bMF0sZT0rblswXVsxXSxyPStuWzFdWzBdLHU9K25bMV1bMV0pLGkpOm51bGw9PXQ/bnVsbDpbW3QsZV0sW3IsdV1dfSxpLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PWU9MCxyPStuWzBdLHU9K25bMV0pLGkpOm51bGw9PXQ/bnVsbDpbci10LHUtZV19LGkpfSx0YS5pbnRlcnBvbGF0ZVJnYj1ndSx0YS5pbnRlcnBvbGF0ZU9iamVjdD1wdSx0YS5pbnRlcnBvbGF0ZU51bWJlcj12dSx0YS5pbnRlcnBvbGF0ZVN0cmluZz1kdTt2YXIgaWw9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLG9sPW5ldyBSZWdFeHAoaWwuc291cmNlLCJnIik7dGEuaW50ZXJwb2xhdGU9bXUsdGEuaW50ZXJwb2xhdG9ycz1bZnVuY3Rpb24obix0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4oInN0cmluZyI9PT1lP0dhLmhhcyh0LnRvTG93ZXJDYXNlKCkpfHwvXigjfHJnYlwofGhzbFwoKS9pLnRlc3QodCk/Z3U6ZHU6dCBpbnN0YW5jZW9mIG90P2d1OkFycmF5LmlzQXJyYXkodCk/eXU6Im9iamVjdCI9PT1lJiZpc05hTih0KT9wdTp2dSkobix0KX1dLHRhLmludGVycG9sYXRlQXJyYXk9eXU7dmFyIGFsPWZ1bmN0aW9uKCl7cmV0dXJuIHl9LGNsPXRhLm1hcCh7bGluZWFyOmFsLHBvbHk6a3UscXVhZDpmdW5jdGlvbigpe3JldHVybiBfdX0sY3ViaWM6ZnVuY3Rpb24oKXtyZXR1cm4gd3V9LHNpbjpmdW5jdGlvbigpe3JldHVybiBFdX0sZXhwOmZ1bmN0aW9uKCl7cmV0dXJuIEF1fSxjaXJjbGU6ZnVuY3Rpb24oKXtyZXR1cm4gTnV9LGVsYXN0aWM6Q3UsYmFjazp6dSxib3VuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gcXV9fSksbGw9dGEubWFwKHsiaW4iOnksb3V0Onh1LCJpbi1vdXQiOmJ1LCJvdXQtaW4iOmZ1bmN0aW9uKG4pe3JldHVybiBidSh4dShuKSl9fSk7dGEuZWFzZT1mdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIi0iKSxlPXQ+PTA/bi5zbGljZSgwLHQpOm4scj10Pj0wP24uc2xpY2UodCsxKToiaW4iO3JldHVybiBlPWNsLmdldChlKXx8YWwscj1sbC5nZXQocil8fHksTXUocihlLmFwcGx5KG51bGwsZWEuY2FsbChhcmd1bWVudHMsMSkpKSl9LHRhLmludGVycG9sYXRlSGNsPUx1LHRhLmludGVycG9sYXRlSHNsPVR1LHRhLmludGVycG9sYXRlTGFiPVJ1LHRhLmludGVycG9sYXRlUm91bmQ9RHUsdGEudHJhbnNmb3JtPWZ1bmN0aW9uKG4pe3ZhciB0PXVhLmNyZWF0ZUVsZW1lbnROUyh0YS5ucy5wcmVmaXguc3ZnLCJnIik7cmV0dXJuKHRhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtpZihudWxsIT1uKXt0LnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixuKTt2YXIgZT10LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCl9cmV0dXJuIG5ldyBQdShlP2UubWF0cml4OnNsKX0pKG4pfSxQdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy50cmFuc2xhdGUrIilyb3RhdGUoIit0aGlzLnJvdGF0ZSsiKXNrZXdYKCIrdGhpcy5za2V3KyIpc2NhbGUoIit0aGlzLnNjYWxlKyIpIn07dmFyIHNsPXthOjEsYjowLGM6MCxkOjEsZTowLGY6MH07dGEuaW50ZXJwb2xhdGVUcmFuc2Zvcm09SHUsdGEubGF5b3V0PXt9LHRhLmxheW91dC5idW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciB0PVtdLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5wdXNoKFl1KG5bZV0pKTtyZXR1cm4gdH19LHRhLmxheW91dC5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbixsLGYsaCxnLHA9e30sdj1bXSxkPXRhLnJhbmdlKGkpLG09W107Zm9yKGU9W10scj1bXSxuPTAsaD0tMTsrK2g8aTspe2ZvcihsPTAsZz0tMTsrK2c8aTspbCs9dVtoXVtnXTt2LnB1c2gobCksbS5wdXNoKHRhLnJhbmdlKGkpKSxuKz1sfWZvcihvJiZkLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gbyh2W25dLHZbdF0pfSksYSYmbS5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7bi5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGEodVt0XVtuXSx1W3RdW2VdKX0pfSksbj0oTGEtcyppKS9uLGw9MCxoPS0xOysraDxpOyl7Zm9yKGY9bCxnPS0xOysrZzxpOyl7dmFyIHk9ZFtoXSxNPW1beV1bZ10seD11W3ldW01dLGI9bCxfPWwrPXgqbjtwW3krIi0iK01dPXtpbmRleDp5LHN1YmluZGV4Ok0sc3RhcnRBbmdsZTpiLGVuZEFuZ2xlOl8sdmFsdWU6eH19clt5XT17aW5kZXg6eSxzdGFydEFuZ2xlOmYsZW5kQW5nbGU6bCx2YWx1ZToobC1mKS9ufSxsKz1zfWZvcihoPS0xOysraDxpOylmb3IoZz1oLTE7KytnPGk7KXt2YXIgdz1wW2grIi0iK2ddLFM9cFtnKyItIitoXTsody52YWx1ZXx8Uy52YWx1ZSkmJmUucHVzaCh3LnZhbHVlPFMudmFsdWU/e3NvdXJjZTpTLHRhcmdldDp3fTp7c291cmNlOncsdGFyZ2V0OlN9KX1jJiZ0KCl9ZnVuY3Rpb24gdCgpe2Uuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBjKChuLnNvdXJjZS52YWx1ZStuLnRhcmdldC52YWx1ZSkvMiwodC5zb3VyY2UudmFsdWUrdC50YXJnZXQudmFsdWUpLzIpfSl9dmFyIGUscix1LGksbyxhLGMsbD17fSxzPTA7cmV0dXJuIGwubWF0cml4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSh1PW4pJiZ1Lmxlbmd0aCxlPXI9bnVsbCxsKTp1fSxsLnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bixlPXI9bnVsbCxsKTpzfSxsLnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bixlPXI9bnVsbCxsKTpvfSxsLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixlPW51bGwsbCk6YX0sbC5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sZSYmdCgpLGwpOmN9LGwuY2hvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fG4oKSxlfSxsLmdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiByfHxuKCkscn0sbH0sdGEubGF5b3V0LmZvcmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsdSl7aWYodC5wb2ludCE9PW4pe3ZhciBpPXQuY3gtbi54LG89dC5jeS1uLnksYT11LWUsYz1pKmkrbypvO2lmKGM+YSphL2Qpe2lmKHA+Yyl7dmFyIGw9dC5jaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfXJldHVybiEwfWlmKHQucG9pbnQmJmMmJnA+Yyl7dmFyIGw9dC5wb2ludENoYXJnZS9jO24ucHgtPWkqbCxuLnB5LT1vKmx9fXJldHVybiF0LmNoYXJnZX19ZnVuY3Rpb24gdChuKXtuLnB4PXRhLmV2ZW50Lngsbi5weT10YS5ldmVudC55LGEucmVzdW1lKCl9dmFyIGUscix1LGksbyxhPXt9LGM9dGEuZGlzcGF0Y2goInN0YXJ0IiwidGljayIsImVuZCIpLGw9WzEsMV0scz0uOSxmPWZsLGg9aGwsZz0tMzAscD1nbCx2PS4xLGQ9LjY0LG09W10sTT1bXTtyZXR1cm4gYS50aWNrPWZ1bmN0aW9uKCl7aWYoKHIqPS45OSk8LjAwNSlyZXR1cm4gYy5lbmQoe3R5cGU6ImVuZCIsYWxwaGE6cj0wfSksITA7dmFyIHQsZSxhLGYsaCxwLGQseSx4LGI9bS5sZW5ndGgsXz1NLmxlbmd0aDtmb3IoZT0wO18+ZTsrK2UpYT1NW2VdLGY9YS5zb3VyY2UsaD1hLnRhcmdldCx5PWgueC1mLngseD1oLnktZi55LChwPXkqeSt4KngpJiYocD1yKmlbZV0qKChwPU1hdGguc3FydChwKSktdVtlXSkvcCx5Kj1wLHgqPXAsaC54LT15KihkPWYud2VpZ2h0LyhoLndlaWdodCtmLndlaWdodCkpLGgueS09eCpkLGYueCs9eSooZD0xLWQpLGYueSs9eCpkKTtpZigoZD1yKnYpJiYoeT1sWzBdLzIseD1sWzFdLzIsZT0tMSxkKSlmb3IoOysrZTxiOylhPW1bZV0sYS54Kz0oeS1hLngpKmQsYS55Kz0oeC1hLnkpKmQ7aWYoZylmb3IoSnUodD10YS5nZW9tLnF1YWR0cmVlKG0pLHIsbyksZT0tMTsrK2U8YjspKGE9bVtlXSkuZml4ZWR8fHQudmlzaXQobihhKSk7Zm9yKGU9LTE7KytlPGI7KWE9bVtlXSxhLmZpeGVkPyhhLng9YS5weCxhLnk9YS5weSk6KGEueC09KGEucHgtKGEucHg9YS54KSkqcyxhLnktPShhLnB5LShhLnB5PWEueSkpKnMpO2MudGljayh7dHlwZToidGljayIsYWxwaGE6cn0pfSxhLm5vZGVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW4sYSk6bX0sYS5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1uLGEpOk19LGEuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uLGEpOmx9LGEubGlua0Rpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Zn0sYS5kaXN0YW5jZT1hLmxpbmtEaXN0YW5jZSxhLmxpbmtTdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmh9LGEuZnJpY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K24sYSk6c30sYS5jaGFyZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpnfSxhLmNoYXJnZURpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW4qbixhKTpNYXRoLnNxcnQocCl9LGEuZ3Jhdml0eT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj0rbixhKTp2fSxhLnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW4qbixhKTpNYXRoLnNxcnQoZCl9LGEuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K24scj9yPW4+MD9uOjA6bj4wJiYoYy5zdGFydCh7dHlwZToic3RhcnQiLGFscGhhOnI9bn0pLHRhLnRpbWVyKGEudGljaykpLGEpOnJ9LGEuc3RhcnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4scil7aWYoIWUpe2ZvcihlPW5ldyBBcnJheShjKSxhPTA7Yz5hOysrYSllW2FdPVtdO2ZvcihhPTA7cz5hOysrYSl7dmFyIHU9TVthXTtlW3Uuc291cmNlLmluZGV4XS5wdXNoKHUudGFyZ2V0KSxlW3UudGFyZ2V0LmluZGV4XS5wdXNoKHUuc291cmNlKX19Zm9yKHZhciBpLG89ZVt0XSxhPS0xLGw9by5sZW5ndGg7KythPGw7KWlmKCFpc05hTihpPW9bYV1bbl0pKXJldHVybiBpO3JldHVybiBNYXRoLnJhbmRvbSgpKnJ9dmFyIHQsZSxyLGM9bS5sZW5ndGgscz1NLmxlbmd0aCxwPWxbMF0sdj1sWzFdO2Zvcih0PTA7Yz50OysrdCkocj1tW3RdKS5pbmRleD10LHIud2VpZ2h0PTA7Zm9yKHQ9MDtzPnQ7Kyt0KXI9TVt0XSwibnVtYmVyIj09dHlwZW9mIHIuc291cmNlJiYoci5zb3VyY2U9bVtyLnNvdXJjZV0pLCJudW1iZXIiPT10eXBlb2Ygci50YXJnZXQmJihyLnRhcmdldD1tW3IudGFyZ2V0XSksKytyLnNvdXJjZS53ZWlnaHQsKytyLnRhcmdldC53ZWlnaHQ7Zm9yKHQ9MDtjPnQ7Kyt0KXI9bVt0XSxpc05hTihyLngpJiYoci54PW4oIngiLHApKSxpc05hTihyLnkpJiYoci55PW4oInkiLHYpKSxpc05hTihyLnB4KSYmKHIucHg9ci54KSxpc05hTihyLnB5KSYmKHIucHk9ci55KTtpZih1PVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBmKWZvcih0PTA7cz50OysrdCl1W3RdPStmLmNhbGwodGhpcyxNW3RdLHQpO2Vsc2UgZm9yKHQ9MDtzPnQ7Kyt0KXVbdF09ZjtpZihpPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBoKWZvcih0PTA7cz50OysrdClpW3RdPStoLmNhbGwodGhpcyxNW3RdLHQpO2Vsc2UgZm9yKHQ9MDtzPnQ7Kyt0KWlbdF09aDtpZihvPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBnKWZvcih0PTA7Yz50OysrdClvW3RdPStnLmNhbGwodGhpcyxtW3RdLHQpO2Vsc2UgZm9yKHQ9MDtjPnQ7Kyt0KW9bdF09ZztyZXR1cm4gYS5yZXN1bWUoKX0sYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSguMSl9LGEuc3RvcD1mdW5jdGlvbigpe3JldHVybiBhLmFscGhhKDApfSxhLmRyYWc9ZnVuY3Rpb24oKXtyZXR1cm4gZXx8KGU9dGEuYmVoYXZpb3IuZHJhZygpLm9yaWdpbih5KS5vbigiZHJhZ3N0YXJ0LmZvcmNlIixYdSkub24oImRyYWcuZm9yY2UiLHQpLm9uKCJkcmFnZW5kLmZvcmNlIiwkdSkpLGFyZ3VtZW50cy5sZW5ndGg/dm9pZCB0aGlzLm9uKCJtb3VzZW92ZXIuZm9yY2UiLEJ1KS5vbigibW91c2VvdXQuZm9yY2UiLFd1KS5jYWxsKGUpOmV9LHRhLnJlYmluZChhLGMsIm9uIil9O3ZhciBmbD0yMCxobD0xLGdsPTEvMDt0YS5sYXlvdXQuaGllcmFyY2h5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih1KXt2YXIgaSxvPVt1XSxhPVtdO2Zvcih1LmRlcHRoPTA7bnVsbCE9KGk9by5wb3AoKSk7KWlmKGEucHVzaChpKSwobD1lLmNhbGwobixpLGkuZGVwdGgpKSYmKGM9bC5sZW5ndGgpKXtmb3IodmFyIGMsbCxzOy0tYz49MDspby5wdXNoKHM9bFtjXSkscy5wYXJlbnQ9aSxzLmRlcHRoPWkuZGVwdGgrMTtyJiYoaS52YWx1ZT0wKSxpLmNoaWxkcmVuPWx9ZWxzZSByJiYoaS52YWx1ZT0rci5jYWxsKG4saSxpLmRlcHRoKXx8MCksZGVsZXRlIGkuY2hpbGRyZW47cmV0dXJuIFF1KHUsZnVuY3Rpb24obil7dmFyIGUsdTt0JiYoZT1uLmNoaWxkcmVuKSYmZS5zb3J0KHQpLHImJih1PW4ucGFyZW50KSYmKHUudmFsdWUrPW4udmFsdWUpfSksYX12YXIgdD1laSxlPW5pLHI9dGk7cmV0dXJuIG4uc29ydD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uY2hpbGRyZW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5yZXZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiByJiYoS3UodCxmdW5jdGlvbihuKXtuLmNoaWxkcmVuJiYobi52YWx1ZT0wKX0pLFF1KHQsZnVuY3Rpb24odCl7dmFyIGU7dC5jaGlsZHJlbnx8KHQudmFsdWU9K3IuY2FsbChuLHQsdC5kZXB0aCl8fDApLChlPXQucGFyZW50KSYmKGUudmFsdWUrPXQudmFsdWUpfSkpLHR9LG59LHRhLmxheW91dC5wYXJ0aXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsZSxyLHUpe3ZhciBpPXQuY2hpbGRyZW47aWYodC54PWUsdC55PXQuZGVwdGgqdSx0LmR4PXIsdC5keT11LGkmJihvPWkubGVuZ3RoKSl7dmFyIG8sYSxjLGw9LTE7Zm9yKHI9dC52YWx1ZT9yL3QudmFsdWU6MDsrK2w8bzspbihhPWlbbF0sZSxjPWEudmFsdWUqcix1KSxlKz1jfX1mdW5jdGlvbiB0KG4pe3ZhciBlPW4uY2hpbGRyZW4scj0wO2lmKGUmJih1PWUubGVuZ3RoKSlmb3IodmFyIHUsaT0tMTsrK2k8dTspcj1NYXRoLm1heChyLHQoZVtpXSkpO3JldHVybiAxK3J9ZnVuY3Rpb24gZShlLGkpe3ZhciBvPXIuY2FsbCh0aGlzLGUsaSk7cmV0dXJuIG4ob1swXSwwLHVbMF0sdVsxXS90KG9bMF0pKSxvfXZhciByPXRhLmxheW91dC5oaWVyYXJjaHkoKSx1PVsxLDFdO3JldHVybiBlLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bixlKTp1fSxHdShlLHIpfSx0YS5sYXlvdXQucGllPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihvKXt2YXIgYSxjPW8ubGVuZ3RoLGw9by5tYXAoZnVuY3Rpb24oZSxyKXtyZXR1cm4rdC5jYWxsKG4sZSxyKX0pLHM9KygiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyKSxmPSgiZnVuY3Rpb24iPT10eXBlb2YgdT91LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp1KS1zLGg9TWF0aC5taW4oTWF0aC5hYnMoZikvYywrKCJmdW5jdGlvbiI9PXR5cGVvZiBpP2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOmkpKSxnPWgqKDA+Zj8tMToxKSxwPShmLWMqZykvdGEuc3VtKGwpLHY9dGEucmFuZ2UoYyksZD1bXTtyZXR1cm4gbnVsbCE9ZSYmdi5zb3J0KGU9PT1wbD9mdW5jdGlvbihuLHQpe3JldHVybiBsW3RdLWxbbl19OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIGUob1tuXSxvW3RdKX0pLHYuZm9yRWFjaChmdW5jdGlvbihuKXtkW25dPXtkYXRhOm9bbl0sdmFsdWU6YT1sW25dLHN0YXJ0QW5nbGU6cyxlbmRBbmdsZTpzKz1hKnArZyxwYWRBbmdsZTpofX0pLGR9dmFyIHQ9TnVtYmVyLGU9cGwscj0wLHU9TGEsaT0wO3JldHVybiBuLnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG4ucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxufTt2YXIgcGw9e307dGEubGF5b3V0LnN0YWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihhLGMpe2lmKCEoaD1hLmxlbmd0aCkpcmV0dXJuIGE7dmFyIGw9YS5tYXAoZnVuY3Rpb24oZSxyKXtyZXR1cm4gdC5jYWxsKG4sZSxyKX0pLHM9bC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuW2kuY2FsbChuLHQsZSksby5jYWxsKG4sdCxlKV19KX0pLGY9ZS5jYWxsKG4scyxjKTtsPXRhLnBlcm11dGUobCxmKSxzPXRhLnBlcm11dGUocyxmKTt2YXIgaCxnLHAsdixkPXIuY2FsbChuLHMsYyksbT1sWzBdLmxlbmd0aDtmb3IocD0wO20+cDsrK3ApZm9yKHUuY2FsbChuLGxbMF1bcF0sdj1kW3BdLHNbMF1bcF1bMV0pLGc9MTtoPmc7KytnKXUuY2FsbChuLGxbZ11bcF0sdis9c1tnLTFdW3BdWzFdLHNbZ11bcF1bMV0pO3JldHVybiBhfXZhciB0PXksZT1haSxyPWNpLHU9b2ksaT11aSxvPWlpO3JldHVybiBuLnZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4ub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp2bC5nZXQodCl8fGFpLG4pOmV9LG4ub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZGwuZ2V0KHQpfHxjaSxuKTpyfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxuKTpvfSxuLm91dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG59O3ZhciB2bD10YS5tYXAoeyJpbnNpZGUtb3V0IjpmdW5jdGlvbihuKXt2YXIgdCxlLHI9bi5sZW5ndGgsdT1uLm1hcChsaSksaT1uLm1hcChzaSksbz10YS5yYW5nZShyKS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHVbbl0tdVt0XX0pLGE9MCxjPTAsbD1bXSxzPVtdO2Zvcih0PTA7cj50OysrdCllPW9bdF0sYz5hPyhhKz1pW2VdLGwucHVzaChlKSk6KGMrPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGwpfSxyZXZlcnNlOmZ1bmN0aW9uKG4pe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCkucmV2ZXJzZSgpfSwiZGVmYXVsdCI6YWl9KSxkbD10YS5tYXAoe3NpbGhvdWV0dGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9bi5sZW5ndGgsaT1uWzBdLmxlbmd0aCxvPVtdLGE9MCxjPVtdO2ZvcihlPTA7aT5lOysrZSl7Zm9yKHQ9MCxyPTA7dT50O3QrKylyKz1uW3RdW2VdWzFdO3I+YSYmKGE9ciksby5wdXNoKHIpfWZvcihlPTA7aT5lOysrZSljW2VdPShhLW9bZV0pLzI7cmV0dXJuIGN9LHdpZ2dsZTpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLG8sYSxjLGwscz1uLmxlbmd0aCxmPW5bMF0saD1mLmxlbmd0aCxnPVtdO2ZvcihnWzBdPWM9bD0wLGU9MTtoPmU7KytlKXtmb3IodD0wLHU9MDtzPnQ7Kyt0KXUrPW5bdF1bZV1bMV07Zm9yKHQ9MCxpPTAsYT1mW2VdWzBdLWZbZS0xXVswXTtzPnQ7Kyt0KXtmb3Iocj0wLG89KG5bdF1bZV1bMV0tblt0XVtlLTFdWzFdKS8oMiphKTt0PnI7KytyKW8rPShuW3JdW2VdWzFdLW5bcl1bZS0xXVsxXSkvYTtpKz1vKm5bdF1bZV1bMV19Z1tlXT1jLT11P2kvdSphOjAsbD5jJiYobD1jKX1mb3IoZT0wO2g+ZTsrK2UpZ1tlXS09bDtyZXR1cm4gZ30sZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz0xL3UsYT1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtpZihyKWZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdLz1yO2Vsc2UgZm9yKHQ9MDt1PnQ7dCsrKW5bdF1bZV1bMV09b31mb3IoZT0wO2k+ZTsrK2UpYVtlXT0wO3JldHVybiBhfSx6ZXJvOmNpfSk7dGEubGF5b3V0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXtmb3IodmFyIG8sYSxjPVtdLGw9bi5tYXAoZSx0aGlzKSxzPXIuY2FsbCh0aGlzLGwsaSksZj11LmNhbGwodGhpcyxzLGwsaSksaT0tMSxoPWwubGVuZ3RoLGc9Zi5sZW5ndGgtMSxwPXQ/MToxL2g7KytpPGc7KW89Y1tpXT1bXSxvLmR4PWZbaSsxXS0oby54PWZbaV0pLG8ueT0wO2lmKGc+MClmb3IoaT0tMTsrK2k8aDspYT1sW2ldLGE+PXNbMF0mJmE8PXNbMV0mJihvPWNbdGEuYmlzZWN0KGYsYSwxLGcpLTFdLG8ueSs9cCxvLnB1c2gobltpXSkpO3JldHVybiBjfXZhciB0PSEwLGU9TnVtYmVyLHI9cGksdT1oaTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9RXQodCksbik6cn0sbi5iaW5zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbihuKXtyZXR1cm4gZ2kobix0KX06RXQodCksbik6dX0sbi5mcmVxdWVuY3k9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ISFlLG4pOnR9LG59LHRhLmxheW91dC5wYWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvPWUuY2FsbCh0aGlzLG4saSksYT1vWzBdLGM9dVswXSxsPXVbMV0scz1udWxsPT10P01hdGguc3FydDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O2lmKGEueD1hLnk9MCxRdShhLGZ1bmN0aW9uKG4pe24ucj0rcyhuLnZhbHVlKX0pLFF1KGEsTWkpLHIpe3ZhciBmPXIqKHQ/MTpNYXRoLm1heCgyKmEuci9jLDIqYS5yL2wpKS8yO1F1KGEsZnVuY3Rpb24obil7bi5yKz1mfSksUXUoYSxNaSksUXUoYSxmdW5jdGlvbihuKXtuLnItPWZ9KX1yZXR1cm4gX2koYSxjLzIsbC8yLHQ/MToxL01hdGgubWF4KDIqYS5yL2MsMiphLnIvbCkpLG99dmFyIHQsZT10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydCh2aSkscj0wLHU9WzEsMV07cmV0dXJuIG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PWV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6K2Usbik6dH0sbi5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG4pOnJ9LEd1KG4sZSl9LHRhLmxheW91dC50cmVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBzPW8uY2FsbCh0aGlzLG4sdSksZj1zWzBdLGg9dChmKTtpZihRdShoLGUpLGgucGFyZW50Lm09LWgueixLdShoLHIpLGwpS3UoZixpKTtlbHNle3ZhciBnPWYscD1mLHY9ZjtLdShmLGZ1bmN0aW9uKG4pe24ueDxnLngmJihnPW4pLG4ueD5wLngmJihwPW4pLG4uZGVwdGg+di5kZXB0aCYmKHY9bil9KTt2YXIgZD1hKGcscCkvMi1nLngsbT1jWzBdLyhwLngrYShwLGcpLzIrZCkseT1jWzFdLyh2LmRlcHRofHwxKTtLdShmLGZ1bmN0aW9uKG4pe24ueD0obi54K2QpKm0sbi55PW4uZGVwdGgqeX0pfXJldHVybiBzfWZ1bmN0aW9uIHQobil7Zm9yKHZhciB0LGU9e0E6bnVsbCxjaGlsZHJlbjpbbl19LHI9W2VdO251bGwhPSh0PXIucG9wKCkpOylmb3IodmFyIHUsaT10LmNoaWxkcmVuLG89MCxhPWkubGVuZ3RoO2E+bzsrK28pci5wdXNoKChpW29dPXU9e186aVtvXSxwYXJlbnQ6dCxjaGlsZHJlbjoodT1pW29dLmNoaWxkcmVuKSYmdS5zbGljZSgpfHxbXSxBOm51bGwsYTpudWxsLHo6MCxtOjAsYzowLHM6MCx0Om51bGwsaTpvfSkuYT11KTtyZXR1cm4gZS5jaGlsZHJlblswXX1mdW5jdGlvbiBlKG4pe3ZhciB0PW4uY2hpbGRyZW4sZT1uLnBhcmVudC5jaGlsZHJlbixyPW4uaT9lW24uaS0xXTpudWxsO2lmKHQubGVuZ3RoKXtOaShuKTt2YXIgaT0odFswXS56K3RbdC5sZW5ndGgtMV0ueikvMjtyPyhuLno9ci56K2Eobi5fLHIuXyksbi5tPW4uei1pKTpuLno9aX1lbHNlIHImJihuLno9ci56K2Eobi5fLHIuXykpO24ucGFyZW50LkE9dShuLHIsbi5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gcihuKXtuLl8ueD1uLnorbi5wYXJlbnQubSxuLm0rPW4ucGFyZW50Lm19ZnVuY3Rpb24gdShuLHQsZSl7aWYodCl7Zm9yKHZhciByLHU9bixpPW4sbz10LGM9dS5wYXJlbnQuY2hpbGRyZW5bMF0sbD11Lm0scz1pLm0sZj1vLm0saD1jLm07bz1FaShvKSx1PWtpKHUpLG8mJnU7KWM9a2koYyksaT1FaShpKSxpLmE9bixyPW8ueitmLXUuei1sK2Eoby5fLHUuXykscj4wJiYoQWkoQ2kobyxuLGUpLG4sciksbCs9cixzKz1yKSxmKz1vLm0sbCs9dS5tLGgrPWMubSxzKz1pLm07byYmIUVpKGkpJiYoaS50PW8saS5tKz1mLXMpLHUmJiFraShjKSYmKGMudD11LGMubSs9bC1oLGU9bil9cmV0dXJuIGV9ZnVuY3Rpb24gaShuKXtuLngqPWNbMF0sbi55PW4uZGVwdGgqY1sxXX12YXIgbz10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxhPVNpLGM9WzEsMV0sbD1udWxsO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxuKTphfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bnVsbD09KGM9dCk/aTpudWxsLG4pOmw/bnVsbDpjfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW51bGw9PShjPXQpP251bGw6aSxuKTpsP2M6bnVsbH0sR3UobixvKX0sdGEubGF5b3V0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7dmFyIG8sYT10LmNhbGwodGhpcyxuLGkpLGM9YVswXSxsPTA7UXUoYyxmdW5jdGlvbihuKXt2YXIgdD1uLmNoaWxkcmVuO3QmJnQubGVuZ3RoPyhuLng9cWkodCksbi55PXppKHQpKToobi54PW8/bCs9ZShuLG8pOjAsbi55PTAsbz1uKX0pO3ZhciBzPUxpKGMpLGY9VGkoYyksaD1zLngtZShzLGYpLzIsZz1mLngrZShmLHMpLzI7cmV0dXJuIFF1KGMsdT9mdW5jdGlvbihuKXtuLng9KG4ueC1jLngpKnJbMF0sbi55PShjLnktbi55KSpyWzFdfTpmdW5jdGlvbihuKXtuLng9KG4ueC1oKS8oZy1oKSpyWzBdLG4ueT0oMS0oYy55P24ueS9jLnk6MSkpKnJbMV19KSxhfXZhciB0PXRhLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLGU9U2kscj1bMSwxXSx1PSExO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09KHI9dCksbik6dT9udWxsOnJ9LG4ubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbCE9KHI9dCksbik6dT9yOm51bGx9LEd1KG4sdCl9LHRhLmxheW91dC50cmVlbWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe2Zvcih2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspcj0oZT1uW3VdKS52YWx1ZSooMD50PzA6dCksZS5hcmVhPWlzTmFOKHIpfHwwPj1yPzA6cn1mdW5jdGlvbiB0KGUpe3ZhciBpPWUuY2hpbGRyZW47aWYoaSYmaS5sZW5ndGgpe3ZhciBvLGEsYyxsPWYoZSkscz1bXSxoPWkuc2xpY2UoKSxwPTEvMCx2PSJzbGljZSI9PT1nP2wuZHg6ImRpY2UiPT09Zz9sLmR5OiJzbGljZS1kaWNlIj09PWc/MSZlLmRlcHRoP2wuZHk6bC5keDpNYXRoLm1pbihsLmR4LGwuZHkpO2ZvcihuKGgsbC5keCpsLmR5L2UudmFsdWUpLHMuYXJlYT0wOyhjPWgubGVuZ3RoKT4wOylzLnB1c2gobz1oW2MtMV0pLHMuYXJlYSs9by5hcmVhLCJzcXVhcmlmeSIhPT1nfHwoYT1yKHMsdikpPD1wPyhoLnBvcCgpLHA9YSk6KHMuYXJlYS09cy5wb3AoKS5hcmVhLHUocyx2LGwsITEpLHY9TWF0aC5taW4obC5keCxsLmR5KSxzLmxlbmd0aD1zLmFyZWE9MCxwPTEvMCk7cy5sZW5ndGgmJih1KHMsdixsLCEwKSxzLmxlbmd0aD1zLmFyZWE9MCksaS5mb3JFYWNoKHQpfX1mdW5jdGlvbiBlKHQpe3ZhciByPXQuY2hpbGRyZW47aWYociYmci5sZW5ndGgpe3ZhciBpLG89Zih0KSxhPXIuc2xpY2UoKSxjPVtdO2ZvcihuKGEsby5keCpvLmR5L3QudmFsdWUpLGMuYXJlYT0wO2k9YS5wb3AoKTspYy5wdXNoKGkpLGMuYXJlYSs9aS5hcmVhLG51bGwhPWkueiYmKHUoYyxpLno/by5keDpvLmR5LG8sIWEubGVuZ3RoKSxjLmxlbmd0aD1jLmFyZWE9MCk7ci5mb3JFYWNoKGUpfX1mdW5jdGlvbiByKG4sdCl7Zm9yKHZhciBlLHI9bi5hcmVhLHU9MCxpPTEvMCxvPS0xLGE9bi5sZW5ndGg7KytvPGE7KShlPW5bb10uYXJlYSkmJihpPmUmJihpPWUpLGU+dSYmKHU9ZSkpO3JldHVybiByKj1yLHQqPXQscj9NYXRoLm1heCh0KnUqcC9yLHIvKHQqaSpwKSk6MS8wfWZ1bmN0aW9uIHUobix0LGUscil7dmFyIHUsaT0tMSxvPW4ubGVuZ3RoLGE9ZS54LGw9ZS55LHM9dD9jKG4uYXJlYS90KTowO2lmKHQ9PWUuZHgpe2Zvcigocnx8cz5lLmR5KSYmKHM9ZS5keSk7KytpPG87KXU9bltpXSx1Lng9YSx1Lnk9bCx1LmR5PXMsYSs9dS5keD1NYXRoLm1pbihlLngrZS5keC1hLHM/Yyh1LmFyZWEvcyk6MCk7dS56PSEwLHUuZHgrPWUueCtlLmR4LWEsZS55Kz1zLGUuZHktPXN9ZWxzZXtmb3IoKHJ8fHM+ZS5keCkmJihzPWUuZHgpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWwsdS5keD1zLGwrPXUuZHk9TWF0aC5taW4oZS55K2UuZHktbCxzP2ModS5hcmVhL3MpOjApO3Uuej0hMSx1LmR5Kz1lLnkrZS5keS1sLGUueCs9cyxlLmR4LT1zfX1mdW5jdGlvbiBpKHIpe3ZhciB1PW98fGEociksaT11WzBdO3JldHVybiBpLng9MCxpLnk9MCxpLmR4PWxbMF0saS5keT1sWzFdLG8mJmEucmV2YWx1ZShpKSxuKFtpXSxpLmR4KmkuZHkvaS52YWx1ZSksKG8/ZTp0KShpKSxoJiYobz11KSx1fXZhciBvLGE9dGEubGF5b3V0LmhpZXJhcmNoeSgpLGM9TWF0aC5yb3VuZCxsPVsxLDFdLHM9bnVsbCxmPVJpLGg9ITEsZz0ic3F1YXJpZnkiLHA9LjUqKDErTWF0aC5zcXJ0KDUpKTsKcmV0dXJuIGkuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uLGkpOmx9LGkucGFkZGluZz1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KHQpe3ZhciBlPW4uY2FsbChpLHQsdC5kZXB0aCk7cmV0dXJuIG51bGw9PWU/UmkodCk6RGkodCwibnVtYmVyIj09dHlwZW9mIGU/W2UsZSxlLGVdOmUpfWZ1bmN0aW9uIGUodCl7cmV0dXJuIERpKHQsbil9aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHM7dmFyIHI7cmV0dXJuIGY9bnVsbD09KHM9bik/Umk6ImZ1bmN0aW9uIj09KHI9dHlwZW9mIG4pP3Q6Im51bWJlciI9PT1yPyhuPVtuLG4sbixuXSxlKTplLGl9LGkucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bj9NYXRoLnJvdW5kOk51bWJlcixpKTpjIT1OdW1iZXJ9LGkuc3RpY2t5PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPW4sbz1udWxsLGkpOmh9LGkucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9bixpKTpwfSxpLm1vZGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9bisiIixpKTpnfSxHdShpLGEpfSx0YS5yYW5kb209e25vcm1hbDpmdW5jdGlvbihuLHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIDI+ZSYmKHQ9MSksMT5lJiYobj0wKSxmdW5jdGlvbigpe3ZhciBlLHIsdTtkbyBlPTIqTWF0aC5yYW5kb20oKS0xLHI9MipNYXRoLnJhbmRvbSgpLTEsdT1lKmUrcipyO3doaWxlKCF1fHx1PjEpO3JldHVybiBuK3QqZSpNYXRoLnNxcnQoLTIqTWF0aC5sb2codSkvdSl9fSxsb2dOb3JtYWw6ZnVuY3Rpb24oKXt2YXIgbj10YS5yYW5kb20ubm9ybWFsLmFwcGx5KHRhLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKG4oKSl9fSxiYXRlczpmdW5jdGlvbihuKXt2YXIgdD10YS5yYW5kb20uaXJ3aW5IYWxsKG4pO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KCkvbn19LGlyd2luSGFsbDpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7bj5lO2UrKyl0Kz1NYXRoLnJhbmRvbSgpO3JldHVybiB0fX19LHRhLnNjYWxlPXt9O3ZhciBtbD17Zmxvb3I6eSxjZWlsOnl9O3RhLnNjYWxlLmxpbmVhcj1mdW5jdGlvbigpe3JldHVybiBJaShbMCwxXSxbMCwxXSxtdSwhMSl9O3ZhciB5bD17czoxLGc6MSxwOjEscjoxLGU6MX07dGEuc2NhbGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIEppKHRhLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbMCwxXSksMTAsITAsWzEsMTBdKX07dmFyIE1sPXRhLmZvcm1hdCgiLjBlIikseGw9e2Zsb29yOmZ1bmN0aW9uKG4pe3JldHVybi1NYXRoLmNlaWwoLW4pfSxjZWlsOmZ1bmN0aW9uKG4pe3JldHVybi1NYXRoLmZsb29yKC1uKX19O3RhLnNjYWxlLnBvdz1mdW5jdGlvbigpe3JldHVybiBHaSh0YS5zY2FsZS5saW5lYXIoKSwxLFswLDFdKX0sdGEuc2NhbGUuc3FydD1mdW5jdGlvbigpe3JldHVybiB0YS5zY2FsZS5wb3coKS5leHBvbmVudCguNSl9LHRhLnNjYWxlLm9yZGluYWw9ZnVuY3Rpb24oKXtyZXR1cm4gUWkoW10se3Q6InJhbmdlIixhOltbXV19KX0sdGEuc2NhbGUuY2F0ZWdvcnkxMD1mdW5jdGlvbigpe3JldHVybiB0YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoYmwpfSx0YS5zY2FsZS5jYXRlZ29yeTIwPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZShfbCl9LHRhLnNjYWxlLmNhdGVnb3J5MjBiPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZSh3bCl9LHRhLnNjYWxlLmNhdGVnb3J5MjBjPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZShTbCl9O3ZhciBibD1bMjA2MjI2MCwxNjc0NDIwNiwyOTI0NTg4LDE0MDM0NzI4LDk3MjU4ODUsOTE5NzEzMSwxNDkwNzMzMCw4MzU1NzExLDEyMzY5MTg2LDE1NTYxNzVdLm1hcChNdCksX2w9WzIwNjIyNjAsMTE0NTQ0NDAsMTY3NDQyMDYsMTY3NTk2NzIsMjkyNDU4OCwxMDAxODY5OCwxNDAzNDcyOCwxNjc1MDc0Miw5NzI1ODg1LDEyOTU1ODYxLDkxOTcxMzEsMTI4ODUxNDAsMTQ5MDczMzAsMTYyMzQxOTQsODM1NTcxMSwxMzA5MjgwNywxMjM2OTE4NiwxNDQwODU4OSwxNTU2MTc1LDEwNDEwNzI1XS5tYXAoTXQpLHdsPVszNzUwNzc3LDUzOTU2MTksNzA0MDcxOSwxMDI2NDI4Niw2NTE5MDk3LDkyMTY1OTQsMTE5MTUxMTUsMTM1NTY2MzYsOTIwMjk5MywxMjQyNjgwOSwxNTE4NjUxNCwxNTE5MDkzMiw4NjY2MTY5LDExMzU2NDkwLDE0MDQ5NjQzLDE1MTc3MzcyLDgwNzc2ODMsMTA4MzQzMjQsMTM1Mjg1MDksMTQ1ODk2NTRdLm1hcChNdCksU2w9WzMyNDQ3MzMsNzA1NzExMCwxMDQwNjYyNSwxMzAzMjQzMSwxNTA5NTA1MywxNjYxNjc2NCwxNjYyNTI1OSwxNjYzNDAxOCwzMjUzMDc2LDc2NTI0NzAsMTA2MDcwMDMsMTMxMDE1MDQsNzY5NTI4MSwxMDM5NDMxMiwxMjM2OTM3MiwxNDM0Mjg5MSw2NTEzNTA3LDk4Njg5NTAsMTI0MzQ4NzcsMTQyNzcwODFdLm1hcChNdCk7dGEuc2NhbGUucXVhbnRpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gbm8oW10sW10pfSx0YS5zY2FsZS5xdWFudGl6ZT1mdW5jdGlvbigpe3JldHVybiB0bygwLDEsWzAsMV0pfSx0YS5zY2FsZS50aHJlc2hvbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8oWy41XSxbMCwxXSl9LHRhLnNjYWxlLmlkZW50aXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHJvKFswLDFdKX0sdGEuc3ZnPXt9LHRhLnN2Zy5hcmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG49TWF0aC5tYXgoMCwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGw9TWF0aC5tYXgoMCwrci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHM9by5hcHBseSh0aGlzLGFyZ3VtZW50cyktUmEsZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1SYSxoPU1hdGguYWJzKGYtcyksZz1zPmY/MDoxO2lmKG4+bCYmKHA9bCxsPW4sbj1wKSxoPj1UYSlyZXR1cm4gdChsLGcpKyhuP3QobiwxLWcpOiIiKSsiWiI7dmFyIHAsdixkLG0seSxNLHgsYixfLHcsUyxrLEU9MCxBPTAsTj1bXTtpZigobT0oK2MuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwKS8yKSYmKGQ9aT09PWtsP01hdGguc3FydChuKm4rbCpsKToraS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZ3x8KEEqPS0xKSxsJiYoQT10dChkL2wqTWF0aC5zaW4obSkpKSxuJiYoRT10dChkL24qTWF0aC5zaW4obSkpKSksbCl7eT1sKk1hdGguY29zKHMrQSksTT1sKk1hdGguc2luKHMrQSkseD1sKk1hdGguY29zKGYtQSksYj1sKk1hdGguc2luKGYtQSk7dmFyIEM9TWF0aC5hYnMoZi1zLTIqQSk8PXFhPzA6MTtpZihBJiZzbyh5LE0seCxiKT09PWdeQyl7dmFyIHo9KHMrZikvMjt5PWwqTWF0aC5jb3MoeiksTT1sKk1hdGguc2luKHopLHg9Yj1udWxsfX1lbHNlIHk9TT0wO2lmKG4pe189bipNYXRoLmNvcyhmLUUpLHc9bipNYXRoLnNpbihmLUUpLFM9bipNYXRoLmNvcyhzK0UpLGs9bipNYXRoLnNpbihzK0UpO3ZhciBxPU1hdGguYWJzKHMtZisyKkUpPD1xYT8wOjE7aWYoRSYmc28oXyx3LFMsayk9PT0xLWdecSl7dmFyIEw9KHMrZikvMjtfPW4qTWF0aC5jb3MoTCksdz1uKk1hdGguc2luKEwpLFM9az1udWxsfX1lbHNlIF89dz0wO2lmKChwPU1hdGgubWluKE1hdGguYWJzKGwtbikvMiwrdS5hcHBseSh0aGlzLGFyZ3VtZW50cykpKT4uMDAxKXt2PWw+bl5nPzA6MTt2YXIgVD1udWxsPT1TP1tfLHddOm51bGw9PXg/W3ksTV06THIoW3ksTV0sW1Msa10sW3gsYl0sW18sd10pLFI9eS1UWzBdLEQ9TS1UWzFdLFA9eC1UWzBdLFU9Yi1UWzFdLGo9MS9NYXRoLnNpbihNYXRoLmFjb3MoKFIqUCtEKlUpLyhNYXRoLnNxcnQoUipSK0QqRCkqTWF0aC5zcXJ0KFAqUCtVKlUpKSkvMiksRj1NYXRoLnNxcnQoVFswXSpUWzBdK1RbMV0qVFsxXSk7aWYobnVsbCE9eCl7dmFyIEg9TWF0aC5taW4ocCwobC1GKS8oaisxKSksTz1mbyhudWxsPT1TP1tfLHddOltTLGtdLFt5LE1dLGwsSCxnKSxJPWZvKFt4LGJdLFtfLHddLGwsSCxnKTtwPT09SD9OLnB1c2goIk0iLE9bMF0sIkEiLEgsIiwiLEgsIiAwIDAsIix2LCIgIixPWzFdLCJBIixsLCIsIixsLCIgMCAiLDEtZ15zbyhPWzFdWzBdLE9bMV1bMV0sSVsxXVswXSxJWzFdWzFdKSwiLCIsZywiICIsSVsxXSwiQSIsSCwiLCIsSCwiIDAgMCwiLHYsIiAiLElbMF0pOk4ucHVzaCgiTSIsT1swXSwiQSIsSCwiLCIsSCwiIDAgMSwiLHYsIiAiLElbMF0pfWVsc2UgTi5wdXNoKCJNIix5LCIsIixNKTtpZihudWxsIT1TKXt2YXIgWT1NYXRoLm1pbihwLChuLUYpLyhqLTEpKSxaPWZvKFt5LE1dLFtTLGtdLG4sLVksZyksVj1mbyhbXyx3XSxudWxsPT14P1t5LE1dOlt4LGJdLG4sLVksZyk7cD09PVk/Ti5wdXNoKCJMIixWWzBdLCJBIixZLCIsIixZLCIgMCAwLCIsdiwiICIsVlsxXSwiQSIsbiwiLCIsbiwiIDAgIixnXnNvKFZbMV1bMF0sVlsxXVsxXSxaWzFdWzBdLFpbMV1bMV0pLCIsIiwxLWcsIiAiLFpbMV0sIkEiLFksIiwiLFksIiAwIDAsIix2LCIgIixaWzBdKTpOLnB1c2goIkwiLFZbMF0sIkEiLFksIiwiLFksIiAwIDAsIix2LCIgIixaWzBdKX1lbHNlIE4ucHVzaCgiTCIsXywiLCIsdyl9ZWxzZSBOLnB1c2goIk0iLHksIiwiLE0pLG51bGwhPXgmJk4ucHVzaCgiQSIsbCwiLCIsbCwiIDAgIixDLCIsIixnLCIgIix4LCIsIixiKSxOLnB1c2goIkwiLF8sIiwiLHcpLG51bGwhPVMmJk4ucHVzaCgiQSIsbiwiLCIsbiwiIDAgIixxLCIsIiwxLWcsIiAiLFMsIiwiLGspO3JldHVybiBOLnB1c2goIloiKSxOLmpvaW4oIiIpfWZ1bmN0aW9uIHQobix0KXtyZXR1cm4iTTAsIituKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIistbisiQSIrbisiLCIrbisiIDAgMSwiK3QrIiAwLCIrbn12YXIgZT1pbyxyPW9vLHU9dW8saT1rbCxvPWFvLGE9Y28sYz1sbztyZXR1cm4gbi5pbm5lclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1FdCh0KSxuKTplfSxuLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUV0KHQpLG4pOnJ9LG4uY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PUV0KHQpLG4pOnV9LG4ucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQ9PWtsP2tsOkV0KHQpLG4pOml9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1FdCh0KSxuKTpvfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUV0KHQpLG4pOmF9LG4ucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9RXQodCksbik6Y30sbi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBuPSgrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMix0PSgrby5hcHBseSh0aGlzLGFyZ3VtZW50cykrICthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1SYTtyZXR1cm5bTWF0aC5jb3ModCkqbixNYXRoLnNpbih0KSpuXX0sbn07dmFyIGtsPSJhdXRvIjt0YS5zdmcubGluZT1mdW5jdGlvbigpe3JldHVybiBobyh5KX07dmFyIEVsPXRhLm1hcCh7bGluZWFyOmdvLCJsaW5lYXItY2xvc2VkIjpwbyxzdGVwOnZvLCJzdGVwLWJlZm9yZSI6bW8sInN0ZXAtYWZ0ZXIiOnlvLGJhc2lzOlNvLCJiYXNpcy1vcGVuIjprbywiYmFzaXMtY2xvc2VkIjpFbyxidW5kbGU6QW8sY2FyZGluYWw6Ym8sImNhcmRpbmFsLW9wZW4iOk1vLCJjYXJkaW5hbC1jbG9zZWQiOnhvLG1vbm90b25lOlRvfSk7RWwuZm9yRWFjaChmdW5jdGlvbihuLHQpe3Qua2V5PW4sdC5jbG9zZWQ9Ly1jbG9zZWQkLy50ZXN0KG4pfSk7dmFyIEFsPVswLDIvMywxLzMsMF0sTmw9WzAsMS8zLDIvMywwXSxDbD1bMCwxLzYsMi8zLDEvNl07dGEuc3ZnLmxpbmUucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49aG8oUm8pO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG59LG1vLnJldmVyc2U9eW8seW8ucmV2ZXJzZT1tbyx0YS5zdmcuYXJlYT1mdW5jdGlvbigpe3JldHVybiBEbyh5KX0sdGEuc3ZnLmFyZWEucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49RG8oUm8pO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmlubmVyUmFkaXVzPW4ueDAsZGVsZXRlIG4ueDAsbi5vdXRlclJhZGl1cz1uLngxLGRlbGV0ZSBuLngxLG4uYW5nbGU9bi55LGRlbGV0ZSBuLnksbi5zdGFydEFuZ2xlPW4ueTAsZGVsZXRlIG4ueTAsbi5lbmRBbmdsZT1uLnkxLGRlbGV0ZSBuLnkxLG59LHRhLnN2Zy5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixhKXt2YXIgYz10KHRoaXMsaSxuLGEpLGw9dCh0aGlzLG8sbixhKTtyZXR1cm4iTSIrYy5wMCtyKGMucixjLnAxLGMuYTEtYy5hMCkrKGUoYyxsKT91KGMucixjLnAxLGMucixjLnAwKTp1KGMucixjLnAxLGwucixsLnAwKStyKGwucixsLnAxLGwuYTEtbC5hMCkrdShsLnIsbC5wMSxjLnIsYy5wMCkpKyJaIn1mdW5jdGlvbiB0KG4sdCxlLHIpe3ZhciB1PXQuY2FsbChuLGUsciksaT1hLmNhbGwobix1LHIpLG89Yy5jYWxsKG4sdSxyKS1SYSxzPWwuY2FsbChuLHUsciktUmE7cmV0dXJue3I6aSxhMDpvLGExOnMscDA6W2kqTWF0aC5jb3MobyksaSpNYXRoLnNpbihvKV0scDE6W2kqTWF0aC5jb3MocyksaSpNYXRoLnNpbihzKV19fWZ1bmN0aW9uIGUobix0KXtyZXR1cm4gbi5hMD09dC5hMCYmbi5hMT09dC5hMX1mdW5jdGlvbiByKG4sdCxlKXtyZXR1cm4iQSIrbisiLCIrbisiIDAgIisgKyhlPnFhKSsiLDEgIit0fWZ1bmN0aW9uIHUobix0LGUscil7cmV0dXJuIlEgMCwwICIrcn12YXIgaT1tcixvPXlyLGE9UG8sYz1hbyxsPWNvO3JldHVybiBuLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1FdCh0KSxuKTphfSxuLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1FdCh0KSxuKTppfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1FdCh0KSxuKTpvfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9RXQodCksbik6Y30sbi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1FdCh0KSxuKTpsfSxufSx0YS5zdmcuZGlhZ29uYWw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdSl7dmFyIGk9dC5jYWxsKHRoaXMsbix1KSxvPWUuY2FsbCh0aGlzLG4sdSksYT0oaS55K28ueSkvMixjPVtpLHt4OmkueCx5OmF9LHt4Om8ueCx5OmF9LG9dO3JldHVybiBjPWMubWFwKHIpLCJNIitjWzBdKyJDIitjWzFdKyIgIitjWzJdKyIgIitjWzNdfXZhciB0PW1yLGU9eXIscj1VbztyZXR1cm4gbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9RXQoZSksbik6dH0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RXQodCksbik6ZX0sbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbn0sdGEuc3ZnLmRpYWdvbmFsLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPXRhLnN2Zy5kaWFnb25hbCgpLHQ9VW8sZT1uLnByb2plY3Rpb247cmV0dXJuIG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKGpvKHQ9bikpOnR9LG59LHRhLnN2Zy5zeW1ib2w9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4scil7cmV0dXJuKHpsLmdldCh0LmNhbGwodGhpcyxuLHIpKXx8T28pKGUuY2FsbCh0aGlzLG4scikpfXZhciB0PUhvLGU9Rm87cmV0dXJuIG4udHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1FdChlKSxuKTp0fSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RXQodCksbik6ZX0sbn07dmFyIHpsPXRhLm1hcCh7Y2lyY2xlOk9vLGNyb3NzOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLzUpLzI7cmV0dXJuIk0iKy0zKnQrIiwiKy10KyJIIistdCsiViIrLTMqdCsiSCIrdCsiViIrLXQrIkgiKzMqdCsiViIrdCsiSCIrdCsiViIrMyp0KyJIIistdCsiViIrdCsiSCIrLTMqdCsiWiJ9LGRpYW1vbmQ6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vKDIqTGwpKSxlPXQqTGw7cmV0dXJuIk0wLCIrLXQrIkwiK2UrIiwwIDAsIit0KyIgIistZSsiLDBaIn0sc3F1YXJlOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuKS8yO3JldHVybiJNIistdCsiLCIrLXQrIkwiK3QrIiwiKy10KyIgIit0KyIsIit0KyIgIistdCsiLCIrdCsiWiJ9LCJ0cmlhbmdsZS1kb3duIjpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi9xbCksZT10KnFsLzI7cmV0dXJuIk0wLCIrZSsiTCIrdCsiLCIrLWUrIiAiKy10KyIsIistZSsiWiJ9LCJ0cmlhbmdsZS11cCI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vcWwpLGU9dCpxbC8yO3JldHVybiJNMCwiKy1lKyJMIit0KyIsIitlKyIgIistdCsiLCIrZSsiWiJ9fSk7dGEuc3ZnLnN5bWJvbFR5cGVzPXpsLmtleXMoKTt2YXIgcWw9TWF0aC5zcXJ0KDMpLExsPU1hdGgudGFuKDMwKkRhKTtfYS50cmFuc2l0aW9uPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHI9VGx8fCsrVWwsdT1YbyhuKSxpPVtdLG89Umx8fHt0aW1lOkRhdGUubm93KCksZWFzZTpTdSxkZWxheTowLGR1cmF0aW9uOjI1MH0sYT0tMSxjPXRoaXMubGVuZ3RoOysrYTxjOyl7aS5wdXNoKHQ9W10pO2Zvcih2YXIgbD10aGlzW2FdLHM9LTEsZj1sLmxlbmd0aDsrK3M8ZjspKGU9bFtzXSkmJiRvKGUscyx1LHIsbyksdC5wdXNoKGUpfXJldHVybiBZbyhpLHUscil9LF9hLmludGVycnVwdD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5lYWNoKG51bGw9PW4/RGw6SW8oWG8obikpKX07dmFyIFRsLFJsLERsPUlvKFhvKCkpLFBsPVtdLFVsPTA7UGwuY2FsbD1fYS5jYWxsLFBsLmVtcHR5PV9hLmVtcHR5LFBsLm5vZGU9X2Eubm9kZSxQbC5zaXplPV9hLnNpemUsdGEudHJhbnNpdGlvbj1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZuLnRyYW5zaXRpb24/VGw/bi50cmFuc2l0aW9uKHQpOm46dGEuc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuKX0sdGEudHJhbnNpdGlvbi5wcm90b3R5cGU9UGwsUGwuc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PXRoaXMuaWQsaT10aGlzLm5hbWVzcGFjZSxvPVtdO249TihuKTtmb3IodmFyIGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe28ucHVzaCh0PVtdKTtmb3IodmFyIGw9dGhpc1thXSxzPS0xLGY9bC5sZW5ndGg7KytzPGY7KShyPWxbc10pJiYoZT1uLmNhbGwocixyLl9fZGF0YV9fLHMsYSkpPygiX19kYXRhX18iaW4gciYmKGUuX19kYXRhX189ci5fX2RhdGFfXyksJG8oZSxzLGksdSxyW2ldW3VdKSx0LnB1c2goZSkpOnQucHVzaChudWxsKX1yZXR1cm4gWW8obyxpLHUpfSxQbC5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxvPXRoaXMuaWQsYT10aGlzLm5hbWVzcGFjZSxjPVtdO249QyhuKTtmb3IodmFyIGw9LTEscz10aGlzLmxlbmd0aDsrK2w8czspZm9yKHZhciBmPXRoaXNbbF0saD0tMSxnPWYubGVuZ3RoOysraDxnOylpZihyPWZbaF0pe2k9clthXVtvXSxlPW4uY2FsbChyLHIuX19kYXRhX18saCxsKSxjLnB1c2godD1bXSk7Zm9yKHZhciBwPS0xLHY9ZS5sZW5ndGg7KytwPHY7KSh1PWVbcF0pJiYkbyh1LHAsYSxvLGkpLHQucHVzaCh1KX1yZXR1cm4gWW8oYyxhLG8pfSxQbC5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPU8obikpO2Zvcih2YXIgaT0wLG89dGhpcy5sZW5ndGg7bz5pO2krKyl7dS5wdXNoKHQ9W10pO2Zvcih2YXIgZT10aGlzW2ldLGE9MCxjPWUubGVuZ3RoO2M+YTthKyspKHI9ZVthXSkmJm4uY2FsbChyLHIuX19kYXRhX18sYSxpKSYmdC5wdXNoKHIpfXJldHVybiBZbyh1LHRoaXMubmFtZXNwYWNlLHRoaXMuaWQpfSxQbC50d2Vlbj1mdW5jdGlvbihuLHQpe3ZhciBlPXRoaXMuaWQscj10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP3RoaXMubm9kZSgpW3JdW2VdLnR3ZWVuLmdldChuKTpZKHRoaXMsbnVsbD09dD9mdW5jdGlvbih0KXt0W3JdW2VdLnR3ZWVuLnJlbW92ZShuKX06ZnVuY3Rpb24odSl7dVtyXVtlXS50d2Vlbi5zZXQobix0KX0pfSxQbC5hdHRyPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKGEpfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gbnVsbD09bj9lOihuKz0iIixmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXRBdHRyaWJ1dGUoYSk7cmV0dXJuIGUhPT1uJiYodD1vKGUsbiksZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUoYSx0KG4pKX0pfSl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbnVsbD09bj9yOihuKz0iIixmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXRBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwpO3JldHVybiBlIT09biYmKHQ9byhlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsLHQobikpfSl9KX1pZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih0IGluIG4pdGhpcy5hdHRyKHQsblt0XSk7cmV0dXJuIHRoaXN9dmFyIG89InRyYW5zZm9ybSI9PW4/SHU6bXUsYT10YS5ucy5xdWFsaWZ5KG4pO3JldHVybiBabyh0aGlzLCJhdHRyLiIrbix0LGEubG9jYWw/aTp1KX0sUGwuYXR0clR3ZWVuPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUpe3ZhciByPXQuY2FsbCh0aGlzLG4sZSx0aGlzLmdldEF0dHJpYnV0ZSh1KSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKHUscihuKSl9fWZ1bmN0aW9uIHIobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGVOUyh1LnNwYWNlLHUubG9jYWwpKTtyZXR1cm4gciYmZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyh1LnNwYWNlLHUubG9jYWwscihuKSl9fXZhciB1PXRhLm5zLnF1YWxpZnkobik7cmV0dXJuIHRoaXMudHdlZW4oImF0dHIuIituLHUubG9jYWw/cjplKX0sUGwuc3R5bGU9ZnVuY3Rpb24obixlLHIpe2Z1bmN0aW9uIHUoKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG4pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIG51bGw9PWU/dTooZSs9IiIsZnVuY3Rpb24oKXt2YXIgdSxpPXQodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobik7cmV0dXJuIGkhPT1lJiYodT1tdShpLGUpLGZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobix1KHQpLHIpfSl9KX12YXIgbz1hcmd1bWVudHMubGVuZ3RoO2lmKDM+byl7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPm8mJihlPSIiKTtmb3IociBpbiBuKXRoaXMuc3R5bGUocixuW3JdLGUpO3JldHVybiB0aGlzfXI9IiJ9cmV0dXJuIFpvKHRoaXMsInN0eWxlLiIrbixlLGkpfSxQbC5zdHlsZVR3ZWVuPWZ1bmN0aW9uKG4sZSxyKXtmdW5jdGlvbiB1KHUsaSl7dmFyIG89ZS5jYWxsKHRoaXMsdSxpLHQodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobikpO3JldHVybiBvJiZmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4sbyh0KSxyKX19cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9IiIpLHRoaXMudHdlZW4oInN0eWxlLiIrbix1KX0sUGwudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gWm8odGhpcywidGV4dCIsbixWbyl9LFBsLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBuPXRoaXMubmFtZXNwYWNlO3JldHVybiB0aGlzLmVhY2goImVuZC50cmFuc2l0aW9uIixmdW5jdGlvbigpe3ZhciB0O3RoaXNbbl0uY291bnQ8MiYmKHQ9dGhpcy5wYXJlbnROb2RlKSYmdC5yZW1vdmVDaGlsZCh0aGlzKX0pfSxQbC5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmVhc2U6KCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj10YS5lYXNlLmFwcGx5KHRhLGFyZ3VtZW50cykpLFkodGhpcyxmdW5jdGlvbihyKXtyW2VdW3RdLmVhc2U9bn0pKX0sUGwuZGVsYXk9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZGVsYXk6WSh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmRlbGF5PStuLmNhbGwocixyLl9fZGF0YV9fLHUsaSl9OihuPStuLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZGVsYXk9bn0pKX0sUGwuZHVyYXRpb249ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZHVyYXRpb246WSh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmR1cmF0aW9uPU1hdGgubWF4KDEsbi5jYWxsKHIsci5fX2RhdGFfXyx1LGkpKX06KG49TWF0aC5tYXgoMSxuKSxmdW5jdGlvbihyKXtyW2VdW3RdLmR1cmF0aW9uPW59KSl9LFBsLmVhY2g9ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgdT1SbCxpPVRsO3RyeXtUbD1lLFkodGhpcyxmdW5jdGlvbih0LHUsaSl7Umw9dFtyXVtlXSxuLmNhbGwodCx0Ll9fZGF0YV9fLHUsaSl9KX1maW5hbGx5e1JsPXUsVGw9aX19ZWxzZSBZKHRoaXMsZnVuY3Rpb24odSl7dmFyIGk9dVtyXVtlXTsoaS5ldmVudHx8KGkuZXZlbnQ9dGEuZGlzcGF0Y2goInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikpKS5vbihuLHQpfSk7cmV0dXJuIHRoaXN9LFBsLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIG4sdCxlLHIsdT10aGlzLmlkLGk9KytVbCxvPXRoaXMubmFtZXNwYWNlLGE9W10sYz0wLGw9dGhpcy5sZW5ndGg7bD5jO2MrKyl7YS5wdXNoKG49W10pO2Zvcih2YXIgdD10aGlzW2NdLHM9MCxmPXQubGVuZ3RoO2Y+cztzKyspKGU9dFtzXSkmJihyPWVbb11bdV0sJG8oZSxzLG8saSx7dGltZTpyLnRpbWUsZWFzZTpyLmVhc2UsZGVsYXk6ci5kZWxheStyLmR1cmF0aW9uLGR1cmF0aW9uOnIuZHVyYXRpb259KSksbi5wdXNoKGUpfXJldHVybiBZbyhhLG8saSl9LHRhLnN2Zy5heGlzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbixsPXRhLnNlbGVjdCh0aGlzKSxzPXRoaXMuX19jaGFydF9ffHxlLGY9dGhpcy5fX2NoYXJ0X189ZS5jb3B5KCksaD1udWxsPT1jP2YudGlja3M/Zi50aWNrcy5hcHBseShmLGEpOmYuZG9tYWluKCk6YyxnPW51bGw9PXQ/Zi50aWNrRm9ybWF0P2YudGlja0Zvcm1hdC5hcHBseShmLGEpOnk6dCxwPWwuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoaCxmKSx2PXAuZW50ZXIoKS5pbnNlcnQoImciLCIuZG9tYWluIikuYXR0cigiY2xhc3MiLCJ0aWNrIikuc3R5bGUoIm9wYWNpdHkiLENhKSxkPXRhLnRyYW5zaXRpb24ocC5leGl0KCkpLnN0eWxlKCJvcGFjaXR5IixDYSkucmVtb3ZlKCksbT10YS50cmFuc2l0aW9uKHAub3JkZXIoKSkuc3R5bGUoIm9wYWNpdHkiLDEpLE09TWF0aC5tYXgodSwwKStvLHg9VWkoZiksYj1sLnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoWzBdKSxfPShiLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJkb21haW4iKSx0YS50cmFuc2l0aW9uKGIpKTt2LmFwcGVuZCgibGluZSIpLHYuYXBwZW5kKCJ0ZXh0Iik7dmFyIHcsUyxrLEUsQT12LnNlbGVjdCgibGluZSIpLE49bS5zZWxlY3QoImxpbmUiKSxDPXAuc2VsZWN0KCJ0ZXh0IikudGV4dChnKSx6PXYuc2VsZWN0KCJ0ZXh0IikscT1tLnNlbGVjdCgidGV4dCIpLEw9InRvcCI9PT1yfHwibGVmdCI9PT1yPy0xOjE7aWYoImJvdHRvbSI9PT1yfHwidG9wIj09PXI/KG49Qm8sdz0ieCIsaz0ieSIsUz0ieDIiLEU9InkyIixDLmF0dHIoImR5IiwwPkw/IjBlbSI6Ii43MWVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksXy5hdHRyKCJkIiwiTSIreFswXSsiLCIrTCppKyJWMEgiK3hbMV0rIlYiK0wqaSkpOihuPVdvLHc9InkiLGs9IngiLFM9InkyIixFPSJ4MiIsQy5hdHRyKCJkeSIsIi4zMmVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwwPkw/ImVuZCI6InN0YXJ0IiksXy5hdHRyKCJkIiwiTSIrTCppKyIsIit4WzBdKyJIMFYiK3hbMV0rIkgiK0wqaSkpLEEuYXR0cihFLEwqdSksei5hdHRyKGssTCpNKSxOLmF0dHIoUywwKS5hdHRyKEUsTCp1KSxxLmF0dHIodywwKS5hdHRyKGssTCpNKSxmLnJhbmdlQmFuZCl7dmFyIFQ9ZixSPVQucmFuZ2VCYW5kKCkvMjtzPWY9ZnVuY3Rpb24obil7cmV0dXJuIFQobikrUn19ZWxzZSBzLnJhbmdlQmFuZD9zPWY6ZC5jYWxsKG4sZixzKTt2LmNhbGwobixzLGYpLG0uY2FsbChuLGYsZil9KX12YXIgdCxlPXRhLnNjYWxlLmxpbmVhcigpLHI9amwsdT02LGk9NixvPTMsYT1bMTBdLGM9bnVsbDtyZXR1cm4gbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ub3JpZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQgaW4gRmw/dCsiIjpqbCxuKTpyfSxuLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9YXJndW1lbnRzLG4pOmF9LG4udGlja1ZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz10LG4pOmN9LG4udGlja0Zvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4udGlja1NpemU9ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gZT8odT0rdCxpPSthcmd1bWVudHNbZS0xXSxuKTp1fSxuLmlubmVyVGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3Qsbik6dX0sbi5vdXRlclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOml9LG4udGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3Qsbik6b30sbi50aWNrU3ViZGl2aWRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgmJm59LG59O3ZhciBqbD0iYm90dG9tIixGbD17dG9wOjEscmlnaHQ6MSxib3R0b206MSxsZWZ0OjF9O3RhLnN2Zy5icnVzaD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dGEuc2VsZWN0KHRoaXMpLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIikub24oIm1vdXNlZG93bi5icnVzaCIsaSkub24oInRvdWNoc3RhcnQuYnJ1c2giLGkpLG89dC5zZWxlY3RBbGwoIi5iYWNrZ3JvdW5kIikuZGF0YShbMF0pO28uZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImJhY2tncm91bmQiKS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLnN0eWxlKCJjdXJzb3IiLCJjcm9zc2hhaXIiKSx0LnNlbGVjdEFsbCgiLmV4dGVudCIpLmRhdGEoWzBdKS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiZXh0ZW50Iikuc3R5bGUoImN1cnNvciIsIm1vdmUiKTt2YXIgYT10LnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmRhdGEodix5KTthLmV4aXQoKS5yZW1vdmUoKSxhLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKG4pe3JldHVybiJyZXNpemUgIitufSkuc3R5bGUoImN1cnNvciIsZnVuY3Rpb24obil7cmV0dXJuIEhsW25dfSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsZnVuY3Rpb24obil7cmV0dXJuL1tld10kLy50ZXN0KG4pPy0zOm51bGx9KS5hdHRyKCJ5IixmdW5jdGlvbihuKXtyZXR1cm4vXltuc10vLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoIndpZHRoIiw2KS5hdHRyKCJoZWlnaHQiLDYpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIiksYS5zdHlsZSgiZGlzcGxheSIsbi5lbXB0eSgpPyJub25lIjpudWxsKTt2YXIgYyxmPXRhLnRyYW5zaXRpb24odCksaD10YS50cmFuc2l0aW9uKG8pO2wmJihjPVVpKGwpLGguYXR0cigieCIsY1swXSkuYXR0cigid2lkdGgiLGNbMV0tY1swXSkscihmKSkscyYmKGM9VWkocyksaC5hdHRyKCJ5IixjWzBdKS5hdHRyKCJoZWlnaHQiLGNbMV0tY1swXSksdShmKSksZShmKX0pfWZ1bmN0aW9uIGUobil7bi5zZWxlY3RBbGwoIi5yZXNpemUiKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3JldHVybiJ0cmFuc2xhdGUoIitmWysvZSQvLnRlc3QobildKyIsIitoWysvXnMvLnRlc3QobildKyIpIn0pfWZ1bmN0aW9uIHIobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ4IixmWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwubj5yZWN0LC5zPnJlY3QiKS5hdHRyKCJ3aWR0aCIsZlsxXS1mWzBdKX1mdW5jdGlvbiB1KG4pe24uc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieSIsaFswXSksbi5zZWxlY3RBbGwoIi5leHRlbnQsLmU+cmVjdCwudz5yZWN0IikuYXR0cigiaGVpZ2h0IixoWzFdLWhbMF0pfWZ1bmN0aW9uIGkoKXtmdW5jdGlvbiBpKCl7MzI9PXRhLmV2ZW50LmtleUNvZGUmJihDfHwoTT1udWxsLHFbMF0tPWZbMV0scVsxXS09aFsxXSxDPTIpLFMoKSl9ZnVuY3Rpb24gdigpezMyPT10YS5ldmVudC5rZXlDb2RlJiYyPT1DJiYocVswXSs9ZlsxXSxxWzFdKz1oWzFdLEM9MCxTKCkpfWZ1bmN0aW9uIGQoKXt2YXIgbj10YS5tb3VzZShiKSx0PSExO3gmJihuWzBdKz14WzBdLG5bMV0rPXhbMV0pLEN8fCh0YS5ldmVudC5hbHRLZXk/KE18fChNPVsoZlswXStmWzFdKS8yLChoWzBdK2hbMV0pLzJdKSxxWzBdPWZbKyhuWzBdPE1bMF0pXSxxWzFdPWhbKyhuWzFdPE1bMV0pXSk6TT1udWxsKSxBJiZtKG4sbCwwKSYmKHIoayksdD0hMCksTiYmbShuLHMsMSkmJih1KGspLHQ9ITApLHQmJihlKGspLHcoe3R5cGU6ImJydXNoIixtb2RlOkM/Im1vdmUiOiJyZXNpemUifSkpfWZ1bmN0aW9uIG0obix0LGUpe3ZhciByLHUsaT1VaSh0KSxjPWlbMF0sbD1pWzFdLHM9cVtlXSx2PWU/aDpmLGQ9dlsxXS12WzBdO3JldHVybiBDJiYoYy09cyxsLT1kK3MpLHI9KGU/cDpnKT9NYXRoLm1heChjLE1hdGgubWluKGwsbltlXSkpOm5bZV0sQz91PShyKz1zKStkOihNJiYocz1NYXRoLm1heChjLE1hdGgubWluKGwsMipNW2VdLXIpKSkscj5zPyh1PXIscj1zKTp1PXMpLHZbMF0hPXJ8fHZbMV0hPXU/KGU/YT1udWxsOm89bnVsbCx2WzBdPXIsdlsxXT11LCEwKTp2b2lkIDB9ZnVuY3Rpb24geSgpe2QoKSxrLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpLHRhLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLG51bGwpLEwub24oIm1vdXNlbW92ZS5icnVzaCIsbnVsbCkub24oIm1vdXNldXAuYnJ1c2giLG51bGwpLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLG51bGwpLm9uKCJ0b3VjaGVuZC5icnVzaCIsbnVsbCkub24oImtleWRvd24uYnJ1c2giLG51bGwpLm9uKCJrZXl1cC5icnVzaCIsbnVsbCkseigpLHcoe3R5cGU6ImJydXNoZW5kIn0pfXZhciBNLHgsYj10aGlzLF89dGEuc2VsZWN0KHRhLmV2ZW50LnRhcmdldCksdz1jLm9mKGIsYXJndW1lbnRzKSxrPXRhLnNlbGVjdChiKSxFPV8uZGF0dW0oKSxBPSEvXihufHMpJC8udGVzdChFKSYmbCxOPSEvXihlfHcpJC8udGVzdChFKSYmcyxDPV8uY2xhc3NlZCgiZXh0ZW50Iiksej1XKGIpLHE9dGEubW91c2UoYiksTD10YS5zZWxlY3QodChiKSkub24oImtleWRvd24uYnJ1c2giLGkpLm9uKCJrZXl1cC5icnVzaCIsdik7aWYodGEuZXZlbnQuY2hhbmdlZFRvdWNoZXM/TC5vbigidG91Y2htb3ZlLmJydXNoIixkKS5vbigidG91Y2hlbmQuYnJ1c2giLHkpOkwub24oIm1vdXNlbW92ZS5icnVzaCIsZCkub24oIm1vdXNldXAuYnJ1c2giLHkpLGsuaW50ZXJydXB0KCkuc2VsZWN0QWxsKCIqIikuaW50ZXJydXB0KCksQylxWzBdPWZbMF0tcVswXSxxWzFdPWhbMF0tcVsxXTtlbHNlIGlmKEUpe3ZhciBUPSsvdyQvLnRlc3QoRSksUj0rL15uLy50ZXN0KEUpO3g9W2ZbMS1UXS1xWzBdLGhbMS1SXS1xWzFdXSxxWzBdPWZbVF0scVsxXT1oW1JdfWVsc2UgdGEuZXZlbnQuYWx0S2V5JiYoTT1xLnNsaWNlKCkpO2suc3R5bGUoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKSx0YS5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIixfLnN0eWxlKCJjdXJzb3IiKSksdyh7dHlwZToiYnJ1c2hzdGFydCJ9KSxkKCl9dmFyIG8sYSxjPUUobiwiYnJ1c2hzdGFydCIsImJydXNoIiwiYnJ1c2hlbmQiKSxsPW51bGwscz1udWxsLGY9WzAsMF0saD1bMCwwXSxnPSEwLHA9ITAsdj1PbFswXTtyZXR1cm4gbi5ldmVudD1mdW5jdGlvbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1jLm9mKHRoaXMsYXJndW1lbnRzKSx0PXt4OmYseTpoLGk6byxqOmF9LGU9dGhpcy5fX2NoYXJ0X198fHQ7dGhpcy5fX2NoYXJ0X189dCxUbD90YS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe289ZS5pLGE9ZS5qLGY9ZS54LGg9ZS55LG4oe3R5cGU6ImJydXNoc3RhcnQifSl9KS50d2VlbigiYnJ1c2g6YnJ1c2giLGZ1bmN0aW9uKCl7dmFyIGU9eXUoZix0LngpLHI9eXUoaCx0LnkpO3JldHVybiBvPWE9bnVsbCxmdW5jdGlvbih1KXtmPXQueD1lKHUpLGg9dC55PXIodSksbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KX19KS5lYWNoKCJlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7bz10LmksYT10Lmosbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSxuKHt0eXBlOiJicnVzaGVuZCJ9KX0pOihuKHt0eXBlOiJicnVzaHN0YXJ0In0pLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSksbih7dHlwZToiYnJ1c2hlbmQifSkpfSl9LG4ueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LHY9T2xbIWw8PDF8IXNdLG4pOmx9LG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LHY9T2xbIWw8PDF8IXNdLG4pOnN9LG4uY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGwmJnM/KGc9ISF0WzBdLHA9ISF0WzFdKTpsP2c9ISF0OnMmJihwPSEhdCksbik6bCYmcz9bZyxwXTpsP2c6cz9wOm51bGx9LG4uZXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlLHIsdSxpLGM7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGwmJihlPXRbMF0scj10WzFdLHMmJihlPWVbMF0scj1yWzBdKSxvPVtlLHJdLGwuaW52ZXJ0JiYoZT1sKGUpLHI9bChyKSksZT5yJiYoYz1lLGU9cixyPWMpLChlIT1mWzBdfHxyIT1mWzFdKSYmKGY9W2Uscl0pKSxzJiYodT10WzBdLGk9dFsxXSxsJiYodT11WzFdLGk9aVsxXSksYT1bdSxpXSxzLmludmVydCYmKHU9cyh1KSxpPXMoaSkpLHU+aSYmKGM9dSx1PWksaT1jKSwodSE9aFswXXx8aSE9aFsxXSkmJihoPVt1LGldKSksbik6KGwmJihvPyhlPW9bMF0scj1vWzFdKTooZT1mWzBdLHI9ZlsxXSxsLmludmVydCYmKGU9bC5pbnZlcnQoZSkscj1sLmludmVydChyKSksZT5yJiYoYz1lLGU9cixyPWMpKSkscyYmKGE/KHU9YVswXSxpPWFbMV0pOih1PWhbMF0saT1oWzFdLHMuaW52ZXJ0JiYodT1zLmludmVydCh1KSxpPXMuaW52ZXJ0KGkpKSx1PmkmJihjPXUsdT1pLGk9YykpKSxsJiZzP1tbZSx1XSxbcixpXV06bD9bZSxyXTpzJiZbdSxpXSl9LG4uY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gbi5lbXB0eSgpfHwoZj1bMCwwXSxoPVswLDBdLG89YT1udWxsKSxufSxuLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuISFsJiZmWzBdPT1mWzFdfHwhIXMmJmhbMF09PWhbMV19LHRhLnJlYmluZChuLGMsIm9uIil9O3ZhciBIbD17bjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxPbD1bWyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXSxbImUiLCJ3Il0sWyJuIiwicyJdLFtdXSxJbD1hYy5mb3JtYXQ9Z2MudGltZUZvcm1hdCxZbD1JbC51dGMsWmw9WWwoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO0lsLmlzbz1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyYmK25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9KbzpabCxKby5wYXJzZT1mdW5jdGlvbihuKXt2YXIgdD1uZXcgRGF0ZShuKTtyZXR1cm4gaXNOYU4odCk/bnVsbDp0fSxKby50b1N0cmluZz1abC50b1N0cmluZyxhYy5zZWNvbmQ9RnQoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBjYygxZTMqTWF0aC5mbG9vcihuLzFlMykpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSsxZTMqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX0pLGFjLnNlY29uZHM9YWMuc2Vjb25kLnJhbmdlLGFjLnNlY29uZHMudXRjPWFjLnNlY29uZC51dGMucmFuZ2UsYWMubWludXRlPUZ0KGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgY2MoNmU0Kk1hdGguZmxvb3Iobi82ZTQpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrNmU0Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaW51dGVzKCl9KSxhYy5taW51dGVzPWFjLm1pbnV0ZS5yYW5nZSxhYy5taW51dGVzLnV0Yz1hYy5taW51dGUudXRjLnJhbmdlLGFjLmhvdXI9RnQoZnVuY3Rpb24obil7dmFyIHQ9bi5nZXRUaW1lem9uZU9mZnNldCgpLzYwO3JldHVybiBuZXcgY2MoMzZlNSooTWF0aC5mbG9vcihuLzM2ZTUtdCkrdCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSszNmU1Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRIb3VycygpfSksYWMuaG91cnM9YWMuaG91ci5yYW5nZSxhYy5ob3Vycy51dGM9YWMuaG91ci51dGMucmFuZ2UsYWMubW9udGg9RnQoZnVuY3Rpb24obil7cmV0dXJuIG49YWMuZGF5KG4pLG4uc2V0RGF0ZSgxKSxufSxmdW5jdGlvbihuLHQpe24uc2V0TW9udGgobi5nZXRNb250aCgpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfSksYWMubW9udGhzPWFjLm1vbnRoLnJhbmdlLGFjLm1vbnRocy51dGM9YWMubW9udGgudXRjLnJhbmdlO3ZhciBWbD1bMWUzLDVlMywxNWUzLDNlNCw2ZTQsM2U1LDllNSwxOGU1LDM2ZTUsMTA4ZTUsMjE2ZTUsNDMyZTUsODY0ZTUsMTcyOGU1LDYwNDhlNSwyNTkyZTYsNzc3NmU2LDMxNTM2ZTZdLFhsPVtbYWMuc2Vjb25kLDFdLFthYy5zZWNvbmQsNV0sW2FjLnNlY29uZCwxNV0sW2FjLnNlY29uZCwzMF0sW2FjLm1pbnV0ZSwxXSxbYWMubWludXRlLDVdLFthYy5taW51dGUsMTVdLFthYy5taW51dGUsMzBdLFthYy5ob3VyLDFdLFthYy5ob3VyLDNdLFthYy5ob3VyLDZdLFthYy5ob3VyLDEyXSxbYWMuZGF5LDFdLFthYy5kYXksMl0sW2FjLndlZWssMV0sW2FjLm1vbnRoLDFdLFthYy5tb250aCwzXSxbYWMueWVhciwxXV0sJGw9SWwubXVsdGkoW1siLiVMIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaWxsaXNlY29uZHMoKX1dLFsiOiVTIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTZWNvbmRzKCl9XSxbIiVJOiVNIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaW51dGVzKCl9XSxbIiVJICVwIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRIb3VycygpfV0sWyIlYSAlZCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF5KCkmJjEhPW4uZ2V0RGF0ZSgpfV0sWyIlYiAlZCIsZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0RGF0ZSgpfV0sWyIlQiIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TW9udGgoKX1dLFsiJVkiLE5lXV0pLEJsPXtyYW5nZTpmdW5jdGlvbihuLHQsZSl7cmV0dXJuIHRhLnJhbmdlKE1hdGguY2VpbChuL2UpKmUsK3QsZSkubWFwKEtvKX0sZmxvb3I6eSxjZWlsOnl9O1hsLnllYXI9YWMueWVhcixhYy5zY2FsZT1mdW5jdGlvbigpe3JldHVybiBHbyh0YS5zY2FsZS5saW5lYXIoKSxYbCwkbCl9O3ZhciBXbD1YbC5tYXAoZnVuY3Rpb24obil7cmV0dXJuW25bMF0udXRjLG5bMV1dfSksSmw9WWwubXVsdGkoW1siLiVMIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaWxsaXNlY29uZHMoKX1dLFsiOiVTIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENTZWNvbmRzKCl9XSxbIiVJOiVNIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaW51dGVzKCl9XSxbIiVJICVwIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENIb3VycygpfV0sWyIlYSAlZCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDRGF5KCkmJjEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlYiAlZCIsZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlQiIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTW9udGgoKX1dLFsiJVkiLE5lXV0pO1dsLnllYXI9YWMueWVhci51dGMsYWMuc2NhbGUudXRjPWZ1bmN0aW9uKCl7cmV0dXJuIEdvKHRhLnNjYWxlLmxpbmVhcigpLFdsLEpsKX0sdGEudGV4dD1BdChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVRleHR9KSx0YS5qc29uPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIE50KG4sImFwcGxpY2F0aW9uL2pzb24iLFFvLHQpfSx0YS5odG1sPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIE50KG4sInRleHQvaHRtbCIsbmEsdCl9LHRhLnhtbD1BdChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVhNTH0pLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHRhKToib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMmJihtb2R1bGUuZXhwb3J0cz10YSksdGhpcy5kMz10YX0oKTs=\ndata:text/css;base64,LmQzLXRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsKICBib3JkZXI6IG5vbmU7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgYm9yZGVyLXJhZGl1czogMnB4OwogIGNvbG9yOiAjZWZlZmVmOwogIGZvbnQtc2l6ZTogMTJweDsKICBwYWRkaW5nOiA0cHg7CiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CiAgLypsaW5lLWhlaWdodDogMTsKICBmb250LXdlaWdodDogYm9sZDsKICBwYWRkaW5nOiAxMnB4OwogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICBjb2xvcjogI2ZmZjsKICAKICBwb2ludGVyLWV2ZW50czogbm9uZTsqLwp9CgovKiBDcmVhdGVzIGEgc21hbGwgdHJpYW5nbGUgZXh0ZW5kZXIgZm9yIHRoZSB0b29sdGlwIAouZDMtdGlwOmFmdGVyIHsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIGZvbnQtc2l6ZTogMTJweDsKICB3aWR0aDogMTAwJTsKICBsaW5lLWhlaWdodDogMTsKICBjb2xvcjogIzMzMzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0qLwoKLyogTm9ydGh3YXJkIHRvb2x0aXBzIAouZDMtdGlwLm46YWZ0ZXIgewogIGNvbnRlbnQ6ICJcMjVCQyI7CiAgbWFyZ2luOiAtMXB4IDAgMCAwOwogIHRvcDogMTAwJTsKICBsZWZ0OiAwOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfSovCgovKiBFYXN0d2FyZCB0b29sdGlwcyAKLmQzLXRpcC5lOmFmdGVyIHsKICBjb250ZW50OiAiXDI1QzAiOwogIG1hcmdpbjogLTRweCAwIDAgMDsKICB0b3A6IDUwJTsKICBsZWZ0OiAtOHB4Owp9Ki8KCi8qIFNvdXRod2FyZCB0b29sdGlwcyAKLmQzLXRpcC5zOmFmdGVyIHsKICBjb250ZW50OiAiXDI1QjIiOwogIG1hcmdpbjogMCAwIDFweCAwOwogIHRvcDogLThweDsKICBsZWZ0OiAwOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfSovCgovKiBXZXN0d2FyZCB0b29sdGlwcyAKLmQzLXRpcC53OmFmdGVyIHsKICBjb250ZW50OiAiXDI1QjYiOwogIG1hcmdpbjogLTRweCAwIDAgLTFweDsKICB0b3A6IDUwJTsKICBsZWZ0OiAxMDAlOwp9Ki8=\ndata:text/javascript;base64,Ly8gZDMudGlwCi8vIENvcHlyaWdodCAoYykgMjAxMyBKdXN0aW4gUGFsbWVyCi8vCi8vIFRvb2x0aXBzIGZvciBkMy5qcyBTVkcgdmlzdWFsaXphdGlvbnMKCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSB3aXRoIGQzIGFzIGEgZGVwZW5kZW5jeS4KICAgIGRlZmluZShbJ2QzJ10sIGZhY3RvcnkpCiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykgewogICAgLy8gQ29tbW9uSlMKICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZDMpIHsKICAgICAgZDMudGlwID0gZmFjdG9yeShkMykKICAgICAgcmV0dXJuIGQzLnRpcAogICAgfQogIH0gZWxzZSB7CiAgICAvLyBCcm93c2VyIGdsb2JhbC4KICAgIHJvb3QuZDMudGlwID0gZmFjdG9yeShyb290LmQzKQogIH0KfSh0aGlzLCBmdW5jdGlvbiAoZDMpIHsKCiAgLy8gUHVibGljIC0gY29udHJ1Y3RzIGEgbmV3IHRvb2x0aXAKICAvLwogIC8vIFJldHVybnMgYSB0aXAKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgZGlyZWN0aW9uID0gZDNfdGlwX2RpcmVjdGlvbiwKICAgICAgICBvZmZzZXQgICAgPSBkM190aXBfb2Zmc2V0LAogICAgICAgIGh0bWwgICAgICA9IGQzX3RpcF9odG1sLAogICAgICAgIG5vZGUgICAgICA9IGluaXROb2RlKCksCiAgICAgICAgc3ZnICAgICAgID0gbnVsbCwKICAgICAgICBwb2ludCAgICAgPSBudWxsLAogICAgICAgIHRhcmdldCAgICA9IG51bGwKCiAgICBmdW5jdGlvbiB0aXAodmlzKSB7CiAgICAgIHN2ZyA9IGdldFNWR05vZGUodmlzKQogICAgICBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpCiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm9kZSkKICAgIH0KCiAgICAvLyBQdWJsaWMgLSBzaG93IHRoZSB0b29sdGlwIG9uIHRoZSBzY3JlZW4KICAgIC8vCiAgICAvLyBSZXR1cm5zIGEgdGlwCiAgICB0aXAuc2hvdyA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykKICAgICAgaWYoYXJnc1thcmdzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgdGFyZ2V0ID0gYXJncy5wb3AoKQoKICAgICAgdmFyIGNvbnRlbnQgPSBodG1sLmFwcGx5KHRoaXMsIGFyZ3MpLAogICAgICAgICAgcG9mZnNldCA9IG9mZnNldC5hcHBseSh0aGlzLCBhcmdzKSwKICAgICAgICAgIGRpciAgICAgPSBkaXJlY3Rpb24uYXBwbHkodGhpcywgYXJncyksCiAgICAgICAgICBub2RlbCAgID0gZ2V0Tm9kZUVsKCksCiAgICAgICAgICBpICAgICAgID0gZGlyZWN0aW9ucy5sZW5ndGgsCiAgICAgICAgICBjb29yZHMsCiAgICAgICAgICBzY3JvbGxUb3AgID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCwKICAgICAgICAgIHNjcm9sbExlZnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQKCiAgICAgIG5vZGVsLmh0bWwoY29udGVudCkKICAgICAgICAuc3R5bGUoeyBvcGFjaXR5OiAxLCAncG9pbnRlci1ldmVudHMnOiAnYWxsJyB9KQoKICAgICAgd2hpbGUoaS0tKSBub2RlbC5jbGFzc2VkKGRpcmVjdGlvbnNbaV0sIGZhbHNlKQogICAgICBjb29yZHMgPSBkaXJlY3Rpb25fY2FsbGJhY2tzLmdldChkaXIpLmFwcGx5KHRoaXMpCiAgICAgIG5vZGVsLmNsYXNzZWQoZGlyLCB0cnVlKS5zdHlsZSh7CiAgICAgICAgdG9wOiAoY29vcmRzLnRvcCArICBwb2Zmc2V0WzBdKSArIHNjcm9sbFRvcCArICdweCcsCiAgICAgICAgbGVmdDogKGNvb3Jkcy5sZWZ0ICsgcG9mZnNldFsxXSkgKyBzY3JvbGxMZWZ0ICsgJ3B4JwogICAgICB9KQoKICAgICAgcmV0dXJuIHRpcAogICAgfQoKICAgIC8vIFB1YmxpYyAtIGhpZGUgdGhlIHRvb2x0aXAKICAgIC8vCiAgICAvLyBSZXR1cm5zIGEgdGlwCiAgICB0aXAuaGlkZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgbm9kZWwgPSBnZXROb2RlRWwoKQogICAgICBub2RlbC5zdHlsZSh7IG9wYWNpdHk6IDAsICdwb2ludGVyLWV2ZW50cyc6ICdub25lJyB9KQogICAgICByZXR1cm4gdGlwCiAgICB9CgogICAgLy8gUHVibGljOiBQcm94eSBhdHRyIGNhbGxzIHRvIHRoZSBkMyB0aXAgY29udGFpbmVyLiAgU2V0cyBvciBnZXRzIGF0dHJpYnV0ZSB2YWx1ZS4KICAgIC8vCiAgICAvLyBuIC0gbmFtZSBvZiB0aGUgYXR0cmlidXRlCiAgICAvLyB2IC0gdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQogICAgLy8KICAgIC8vIFJldHVybnMgdGlwIG9yIGF0dHJpYnV0ZSB2YWx1ZQogICAgdGlwLmF0dHIgPSBmdW5jdGlvbihuLCB2KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMiAmJiB0eXBlb2YgbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gZ2V0Tm9kZUVsKCkuYXR0cihuKQogICAgICB9IGVsc2UgewogICAgICAgIHZhciBhcmdzID0gIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykKICAgICAgICBkMy5zZWxlY3Rpb24ucHJvdG90eXBlLmF0dHIuYXBwbHkoZ2V0Tm9kZUVsKCksIGFyZ3MpCiAgICAgIH0KCiAgICAgIHJldHVybiB0aXAKICAgIH0KCiAgICAvLyBQdWJsaWM6IFByb3h5IHN0eWxlIGNhbGxzIHRvIHRoZSBkMyB0aXAgY29udGFpbmVyLiAgU2V0cyBvciBnZXRzIGEgc3R5bGUgdmFsdWUuCiAgICAvLwogICAgLy8gbiAtIG5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAvLyB2IC0gdmFsdWUgb2YgdGhlIHByb3BlcnR5CiAgICAvLwogICAgLy8gUmV0dXJucyB0aXAgb3Igc3R5bGUgcHJvcGVydHkgdmFsdWUKICAgIHRpcC5zdHlsZSA9IGZ1bmN0aW9uKG4sIHYpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyICYmIHR5cGVvZiBuID09PSAnc3RyaW5nJykgewogICAgICAgIHJldHVybiBnZXROb2RlRWwoKS5zdHlsZShuKQogICAgICB9IGVsc2UgewogICAgICAgIHZhciBhcmdzID0gIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykKICAgICAgICBkMy5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlLmFwcGx5KGdldE5vZGVFbCgpLCBhcmdzKQogICAgICB9CgogICAgICByZXR1cm4gdGlwCiAgICB9CgogICAgLy8gUHVibGljOiBTZXQgb3IgZ2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRvb2x0aXAKICAgIC8vCiAgICAvLyB2IC0gT25lIG9mIG4obm9ydGgpLCBzKHNvdXRoKSwgZShlYXN0KSwgb3Igdyh3ZXN0KSwgbncobm9ydGh3ZXN0KSwKICAgIC8vICAgICBzdyhzb3V0aHdlc3QpLCBuZShub3J0aGVhc3QpIG9yIHNlKHNvdXRoZWFzdCkKICAgIC8vCiAgICAvLyBSZXR1cm5zIHRpcCBvciBkaXJlY3Rpb24KICAgIHRpcC5kaXJlY3Rpb24gPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRpcmVjdGlvbgogICAgICBkaXJlY3Rpb24gPSB2ID09IG51bGwgPyB2IDogZDMuZnVuY3Rvcih2KQoKICAgICAgcmV0dXJuIHRpcAogICAgfQoKICAgIC8vIFB1YmxpYzogU2V0cyBvciBnZXRzIHRoZSBvZmZzZXQgb2YgdGhlIHRpcAogICAgLy8KICAgIC8vIHYgLSBBcnJheSBvZiBbeCwgeV0gb2Zmc2V0CiAgICAvLwogICAgLy8gUmV0dXJucyBvZmZzZXQgb3IKICAgIHRpcC5vZmZzZXQgPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9mZnNldAogICAgICBvZmZzZXQgPSB2ID09IG51bGwgPyB2IDogZDMuZnVuY3Rvcih2KQoKICAgICAgcmV0dXJuIHRpcAogICAgfQoKICAgIC8vIFB1YmxpYzogc2V0cyBvciBnZXRzIHRoZSBodG1sIHZhbHVlIG9mIHRoZSB0b29sdGlwCiAgICAvLwogICAgLy8gdiAtIFN0cmluZyB2YWx1ZSBvZiB0aGUgdGlwCiAgICAvLwogICAgLy8gUmV0dXJucyBodG1sIHZhbHVlIG9yIHRpcAogICAgdGlwLmh0bWwgPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGh0bWwKICAgICAgaHRtbCA9IHYgPT0gbnVsbCA/IHYgOiBkMy5mdW5jdG9yKHYpCgogICAgICByZXR1cm4gdGlwCiAgICB9CgogICAgLy8gUHVibGljOiBkZXN0cm95cyB0aGUgdG9vbHRpcCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBET00KICAgIC8vCiAgICAvLyBSZXR1cm5zIGEgdGlwCiAgICB0aXAuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICBpZihub2RlKSB7CiAgICAgICAgZ2V0Tm9kZUVsKCkucmVtb3ZlKCk7CiAgICAgICAgbm9kZSA9IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHRpcDsKICAgIH0KCiAgICBmdW5jdGlvbiBkM190aXBfZGlyZWN0aW9uKCkgeyByZXR1cm4gJ24nIH0KICAgIGZ1bmN0aW9uIGQzX3RpcF9vZmZzZXQoKSB7IHJldHVybiBbMCwgMF0gfQogICAgZnVuY3Rpb24gZDNfdGlwX2h0bWwoKSB7IHJldHVybiAnICcgfQoKICAgIHZhciBkaXJlY3Rpb25fY2FsbGJhY2tzID0gZDMubWFwKHsKICAgICAgbjogIGRpcmVjdGlvbl9uLAogICAgICBzOiAgZGlyZWN0aW9uX3MsCiAgICAgIGU6ICBkaXJlY3Rpb25fZSwKICAgICAgdzogIGRpcmVjdGlvbl93LAogICAgICBudzogZGlyZWN0aW9uX253LAogICAgICBuZTogZGlyZWN0aW9uX25lLAogICAgICBzdzogZGlyZWN0aW9uX3N3LAogICAgICBzZTogZGlyZWN0aW9uX3NlCiAgICB9KSwKCiAgICBkaXJlY3Rpb25zID0gZGlyZWN0aW9uX2NhbGxiYWNrcy5rZXlzKCkKCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fbigpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCkKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94Lm4ueSAtIG5vZGUub2Zmc2V0SGVpZ2h0LAogICAgICAgIGxlZnQ6IGJib3gubi54IC0gbm9kZS5vZmZzZXRXaWR0aCAvIDIKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpcmVjdGlvbl9zKCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3goKQogICAgICByZXR1cm4gewogICAgICAgIHRvcDogIGJib3gucy55LAogICAgICAgIGxlZnQ6IGJib3gucy54IC0gbm9kZS5vZmZzZXRXaWR0aCAvIDIKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpcmVjdGlvbl9lKCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3goKQogICAgICByZXR1cm4gewogICAgICAgIHRvcDogIGJib3guZS55IC0gbm9kZS5vZmZzZXRIZWlnaHQgLyAyLAogICAgICAgIGxlZnQ6IGJib3guZS54CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fdygpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCkKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94LncueSAtIG5vZGUub2Zmc2V0SGVpZ2h0IC8gMiwKICAgICAgICBsZWZ0OiBiYm94LncueCAtIG5vZGUub2Zmc2V0V2lkdGgKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpcmVjdGlvbl9udygpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCkKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94Lm53LnkgLSBub2RlLm9mZnNldEhlaWdodCwKICAgICAgICBsZWZ0OiBiYm94Lm53LnggLSBub2RlLm9mZnNldFdpZHRoCiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fbmUoKSB7CiAgICAgIHZhciBiYm94ID0gZ2V0U2NyZWVuQkJveCgpCiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5uZS55IC0gbm9kZS5vZmZzZXRIZWlnaHQsCiAgICAgICAgbGVmdDogYmJveC5uZS54CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fc3coKSB7CiAgICAgIHZhciBiYm94ID0gZ2V0U2NyZWVuQkJveCgpCiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5zdy55LAogICAgICAgIGxlZnQ6IGJib3guc3cueCAtIG5vZGUub2Zmc2V0V2lkdGgKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpcmVjdGlvbl9zZSgpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCkKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94LnNlLnksCiAgICAgICAgbGVmdDogYmJveC5lLngKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluaXROb2RlKCkgewogICAgICB2YXIgbm9kZSA9IGQzLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkKICAgICAgbm9kZS5zdHlsZSh7CiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsCiAgICAgICAgdG9wOiAwLAogICAgICAgIG9wYWNpdHk6IDAsCiAgICAgICAgJ3BvaW50ZXItZXZlbnRzJzogJ25vbmUnLAogICAgICAgICdib3gtc2l6aW5nJzogJ2JvcmRlci1ib3gnCiAgICAgIH0pCgogICAgICByZXR1cm4gbm9kZS5ub2RlKCkKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRTVkdOb2RlKGVsKSB7CiAgICAgIGVsID0gZWwubm9kZSgpCiAgICAgIGlmKGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N2ZycpCiAgICAgICAgcmV0dXJuIGVsCgogICAgICByZXR1cm4gZWwub3duZXJTVkdFbGVtZW50CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0Tm9kZUVsKCkgewogICAgICBpZihub2RlID09PSBudWxsKSB7CiAgICAgICAgbm9kZSA9IGluaXROb2RlKCk7CiAgICAgICAgLy8gcmUtYWRkIG5vZGUgdG8gRE9NCiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgfTsKICAgICAgcmV0dXJuIGQzLnNlbGVjdChub2RlKTsKICAgIH0KCiAgICAvLyBQcml2YXRlIC0gZ2V0cyB0aGUgc2NyZWVuIGNvb3JkaW5hdGVzIG9mIGEgc2hhcGUKICAgIC8vCiAgICAvLyBHaXZlbiBhIHNoYXBlIG9uIHRoZSBzY3JlZW4sIHdpbGwgcmV0dXJuIGFuIFNWR1BvaW50IGZvciB0aGUgZGlyZWN0aW9ucwogICAgLy8gbihub3J0aCksIHMoc291dGgpLCBlKGVhc3QpLCB3KHdlc3QpLCBuZShub3J0aGVhc3QpLCBzZShzb3V0aGVhc3QpLCBudyhub3J0aHdlc3QpLAogICAgLy8gc3coc291dGh3ZXN0KS4KICAgIC8vCiAgICAvLyAgICArLSstKwogICAgLy8gICAgfCAgIHwKICAgIC8vICAgICsgICArCiAgICAvLyAgICB8ICAgfAogICAgLy8gICAgKy0rLSsKICAgIC8vCiAgICAvLyBSZXR1cm5zIGFuIE9iamVjdCB7biwgcywgZSwgdywgbncsIHN3LCBuZSwgc2V9CiAgICBmdW5jdGlvbiBnZXRTY3JlZW5CQm94KCkgewogICAgICB2YXIgdGFyZ2V0ZWwgICA9IHRhcmdldCB8fCBkMy5ldmVudC50YXJnZXQ7CgogICAgICB3aGlsZSAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiB0YXJnZXRlbC5nZXRTY3JlZW5DVE0gJiYgJ3VuZGVmaW5lZCcgPT09IHRhcmdldGVsLnBhcmVudE5vZGUpIHsKICAgICAgICAgIHRhcmdldGVsID0gdGFyZ2V0ZWwucGFyZW50Tm9kZTsKICAgICAgfQoKICAgICAgdmFyIGJib3ggICAgICAgPSB7fSwKICAgICAgICAgIG1hdHJpeCAgICAgPSB0YXJnZXRlbC5nZXRTY3JlZW5DVE0oKSwKICAgICAgICAgIHRiYm94ICAgICAgPSB0YXJnZXRlbC5nZXRCQm94KCksCiAgICAgICAgICB3aWR0aCAgICAgID0gdGJib3gud2lkdGgsCiAgICAgICAgICBoZWlnaHQgICAgID0gdGJib3guaGVpZ2h0LAogICAgICAgICAgeCAgICAgICAgICA9IHRiYm94LngsCiAgICAgICAgICB5ICAgICAgICAgID0gdGJib3gueQoKICAgICAgcG9pbnQueCA9IHgKICAgICAgcG9pbnQueSA9IHkKICAgICAgYmJveC5udyA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpCiAgICAgIHBvaW50LnggKz0gd2lkdGgKICAgICAgYmJveC5uZSA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpCiAgICAgIHBvaW50LnkgKz0gaGVpZ2h0CiAgICAgIGJib3guc2UgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obWF0cml4KQogICAgICBwb2ludC54IC09IHdpZHRoCiAgICAgIGJib3guc3cgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obWF0cml4KQogICAgICBwb2ludC55IC09IGhlaWdodCAvIDIKICAgICAgYmJveC53ICA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpCiAgICAgIHBvaW50LnggKz0gd2lkdGgKICAgICAgYmJveC5lID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG1hdHJpeCkKICAgICAgcG9pbnQueCAtPSB3aWR0aCAvIDIKICAgICAgcG9pbnQueSAtPSBoZWlnaHQgLyAyCiAgICAgIGJib3gubiA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpCiAgICAgIHBvaW50LnkgKz0gaGVpZ2h0CiAgICAgIGJib3gucyA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpCgogICAgICByZXR1cm4gYmJveAogICAgfQoKICAgIHJldHVybiB0aXAKICB9OwoKfSkpOw==\ndata:text/javascript;base64,KGZ1bmN0aW9uKCl7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciBlcCA9IDFlLTE1OwoKICBmdW5jdGlvbiBUcmVlQ29sb3JzKHByZXNldCkgewogICAgdmFyIGNoaWxkcmVuID0gJ2NoaWxkcmVuJywKICAgICAgICBjb2xvciA9ICdjb2xvcicsCiAgICAgICAgcmFuZ2UgPSBbMCwgMzYwXSwKICAgICAgICBmcmFjdGlvbiA9IDAuNzUsCiAgICAgICAgcGVybXV0YXRlID0gdHJ1ZSwKICAgICAgICByZXZlcnNlID0gdHJ1ZSwKICAgICAgICBsdW1pbmFuY2VTdGFydCA9IDcwLAogICAgICAgIGx1bWluYW5jZURlbHRhID0gLTEwLAogICAgICAgIGNocm9tYVN0YXJ0ID0gNjAsCiAgICAgICAgY2hyb21hRGVsdGEgPSA1LAogICAgICAgIHJvb3RDb2xvciA9IHtoOiAwLCBjOiAwLCBsOiA3MH0KICAgICAgICA7CgogICAgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obm9kZSkgewogICAgICBpZih0eXBlb2YgY2hpbGRyZW4gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuIG5vZGVbY2hpbGRyZW5dOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjaGlsZHJlbi5jYWxsKG5vZGUpOwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCB0aGUgY2hpbGRyZW4gb2YgYSBub2RlISBQbGVhc2Ugc2V0IHRoZSBcJ2NoaWxkcmVuXCcgcHJvcGVydHkgcHJvcGVybHkuJyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0Q29sb3Iobm9kZSwgYykgewogICAgICBpZih0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgbm9kZVtjb2xvcl0gPSBjOwogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb2xvci5jYWxsKG5vZGUsIGMpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzZXQgdGhlIGNvbG9yIG9mIGEgbm9kZSEgUGxlYXNlIHNldCB0aGUgXCdjb2xvclwnIHByb3BlcnR5IHByb3Blcmx5LicpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRvUGVybXV0YXRpb24ocikgewogICAgICB2YXIgbiA9IHIubGVuZ3RoLAogICAgICAgICAgc2VxdWVuY2UgPSBUcmVlQ29sb3JzLmdldFBlcm11dGF0aW9uU2VxdWVuY2UobiksCiAgICAgICAgICBwZXJtdXRhdGVkID0gbmV3IEFycmF5KG4pOwoKICAgICAgci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICAgIHBlcm11dGF0ZWRbc2VxdWVuY2VbaW5kZXhdXSA9IHZhbHVlOwogICAgICB9KTsKCiAgICAgIHJldHVybiBwZXJtdXRhdGVkOwogICAgfQoKICAgIGZ1bmN0aW9uIGFzc2lnbkh1ZShub2RlLCByYW5nZSwgbGV2ZWwpIHsKICAgICAgLy8gc2VsZWN0IHRoZSBtaWRkbGUgaHVlIHZhbHVlIGluIHJhbmdlIGFzIHRoZSBodWUgdmFsdWUgb2Ygbm9kZQogICAgICBpZihsZXZlbCA9PT0gMCkgeyAvLyBub2RlIGlzIHRoZSByb290CiAgICAgICAgc2V0Q29sb3Iobm9kZSwgcm9vdENvbG9yKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXRDb2xvcihub2RlLCB7aDogKHJhbmdlWzBdICsgcmFuZ2VbMV0pIC8gMiwgYzogY2hyb21hU3RhcnQgKyBjaHJvbWFEZWx0YSAqIGxldmVsLCBsOiBsdW1pbmFuY2VTdGFydCArIGx1bWluYW5jZURlbHRhICogbGV2ZWx9KTsKICAgICAgfQoKICAgICAgLy8gTGV0IE4gYmUgdGhlIG51bWJlciBvZiBjaGlsZCBub2RlcyBvZiB2LiBJZiBOID4gMCA6CiAgICAgIHZhciBuID0gZ2V0Q2hpbGRyZW4obm9kZSkgPyBnZXRDaGlsZHJlbihub2RlKS5sZW5ndGggOiAwOwoKICAgICAgaWYobiA9PT0gMCkgcmV0dXJuOwoKICAgICAgdmFyIGRlbHRhID0gKHJhbmdlWzFdIC0gcmFuZ2VbMF0pIC8gbjsKCiAgICAgIC8vMS4gZGl2aWRlIHJhbmdlIGluIE4gZXF1YWwgcGFydHMgcmkgd2l0aCBpID0gMSwgLi4uICxOOwogICAgICAvLyAgIEZvciBjb252ZW5pZW5jZSwgd2Ugd2lsbCB1c2UgaSA9IDAsIC4uLiAsIG4gLSAxIGluc3RlYWQgb2YgaSA9IDEsIC4uLiwgbgogICAgICB2YXIgciA9IGQzLnJhbmdlKG4pOwoKICAgICAgLy8yLiBpZiBwZXJtIHRoZW4gcGVybXV0ZSB0aGUgcmnigJlzOwogICAgICBpZihwZXJtdXRhdGUpIHsKICAgICAgICByID0gZG9QZXJtdXRhdGlvbihyKTsKICAgICAgfQoKICAgICAgLy8zLiBjb252ZXJ0IGVhY2ggcmkgdG8gYSBodWUgcmFuZ2UgKGUuZy4gWzMwLCA1MF0pCgogICAgICByID0gci5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gWwogICAgICAgIHJhbmdlWzBdICsgaSAqIGRlbHRhLAogICAgICAgIHJhbmdlWzBdICsgKGkgKyAxKSAqIGRlbHRhCiAgICAgIF07IH0pOwoKCiAgICAgIC8vNC4gcmVkdWNlIGVhY2ggcmkgYnkga2VlcGluZyBpdHMgbWlkZGxlIGZyYWN0aW9uIDsKICAgICAgLy8gICBJbiB0aGUgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiB0aGUgcGFwZXIsIHdlIHJldmVyc2UgZWFjaCByaSBmaXJzdC4KICAgICAgLy8gICBIb3dldmVyLCBub3csIHdlIHJldmVyc2UgdGhlbSBsYXRlci4KCiAgICAgIHIgPSByLm1hcChmdW5jdGlvbihyYW5nZSkgeyByZXR1cm4gWwogICAgICAgIHJhbmdlWzBdICsgKHJhbmdlWzFdIC0gcmFuZ2VbMF0pICogKCgxIC0gZnJhY3Rpb24pIC8gMiksCiAgICAgICAgcmFuZ2VbMV0gLSAocmFuZ2VbMV0gLSByYW5nZVswXSkgKiAoKDEgLSBmcmFjdGlvbikgLyAyKQogICAgICBdOyB9KTsKCiAgICAgIC8vNS4gaWYgcmV2IHRoZW4gcmV2ZXJzZSB0aGUgZXZlbi1udW1iZXJlZCByaeKAmXM7CiAgICAgIGlmKHJldmVyc2UpIHsKICAgICAgICByID0gci5tYXAoZnVuY3Rpb24ocmFuZ2UsIGkpIHsKICAgICAgICAgIGlmKGkgJSAyID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBbcmFuZ2VbMV0sIHJhbmdlWzBdXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLy82LiBmb3IgZWFjaCBjaGlsZCBub2RlIHZpIGNhbGwgYXNzaWduSHVlIHJlY3Vyc2l2ZWx5LgoKICAgICAgZ2V0Q2hpbGRyZW4obm9kZSkuZm9yRWFjaChmdW5jdGlvbihjaGlsZCwgaSl7CiAgICAgICAgYXNzaWduSHVlKGNoaWxkLCByW2ldLCBsZXZlbCArIDEpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlQ29sb3Iocm9vdCkgewogICAgICBhc3NpZ25IdWUocm9vdCwgcmFuZ2UsIDApOwogICAgfQoKICAgIHRyZWVDb2xvci5jaGlsZHJlbiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2hpbGRyZW47CiAgICAgIGNoaWxkcmVuID0gdmFsdWU7CiAgICAgIHJldHVybiB0cmVlQ29sb3I7CiAgICB9OwoKICAgIHRyZWVDb2xvci5jb2xvciA9IGZ1bmN0aW9uKHZhbHVlKXsKICAgICAgaWYoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjb2xvcjsKICAgICAgY29sb3IgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRyZWVDb2xvcjsKICAgIH07CgogICAgdHJlZUNvbG9yLnJhbmdlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsKICAgICAgcmFuZ2UgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRyZWVDb2xvcjsKICAgIH07CgogICAgdHJlZUNvbG9yLmZyYWN0aW9uID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmcmFjdGlvbjsKICAgICAgZnJhY3Rpb24gPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRyZWVDb2xvcjsKICAgIH07CgogICAgdHJlZUNvbG9yLnBlcm11dGF0ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGVybXV0YXRlOwogICAgICBwZXJtdXRhdGUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRyZWVDb2xvcjsKICAgIH07CgogICAgdHJlZUNvbG9yLnJldmVyc2UgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZighYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJldmVyc2U7CiAgICAgIHJldmVyc2UgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRyZWVDb2xvcjsKICAgIH07CgogICAgdHJlZUNvbG9yLmx1bWluYW5jZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW2x1bWluYW5jZVN0YXJ0LCBsdW1pbmFuY2VEZWx0YV07CiAgICAgIGx1bWluYW5jZVN0YXJ0ID0gdmFsdWVbMF07CiAgICAgIGx1bWluYW5jZURlbHRhID0gdmFsdWVbMV07CiAgICAgIHJldHVybiB0cmVlQ29sb3I7CiAgICB9OwoKICAgIHRyZWVDb2xvci5sdW1pbmFuY2VTdGFydCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbHVtaW5hbmNlU3RhcnQ7CiAgICAgIGx1bWluYW5jZVN0YXJ0ID0gdmFsdWU7CiAgICAgIHJldHVybiB0cmVlQ29sb3I7CiAgICB9OwoKICAgIHRyZWVDb2xvci5sdW1pbmFuY2VEZWx0YSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbHVtaW5hbmNlRGVsdGE7CiAgICAgIGx1bWluYW5jZURlbHRhID0gdmFsdWU7CiAgICAgIHJldHVybiB0cmVlQ29sb3I7CiAgICB9OwoKICAgIHRyZWVDb2xvci5jaHJvbWEgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZighYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFtjaHJvbWFTdGFydCwgY2hyb21hRGVsdGFdOwogICAgICBjaHJvbWFTdGFydCA9IHZhbHVlWzBdOwogICAgICBjaHJvbWFEZWx0YSA9IHZhbHVlWzFdOwogICAgICByZXR1cm4gdHJlZUNvbG9yOwogICAgfTsKCiAgICB0cmVlQ29sb3IuY2hyb21hU3RhcnQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZighYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNocm9tYVN0YXJ0OwogICAgICBjaHJvbWFTdGFydCA9IHZhbHVlOwogICAgICByZXR1cm4gdHJlZUNvbG9yOwogICAgfTsKCiAgICB0cmVlQ29sb3IuY2hyb21hRGVsdGEgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZighYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNocm9tYURlbHRhOwogICAgICBjaHJvbWFEZWx0YSA9IHZhbHVlOwogICAgICByZXR1cm4gdHJlZUNvbG9yOwogICAgfTsKCiAgICB0cmVlQ29sb3Iucm9vdENvbG9yID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByb290Q29sb3I7CiAgICAgIHJvb3RDb2xvciA9IHZhbHVlOwogICAgICByZXR1cm4gdHJlZUNvbG9yOwogICAgfTsKCiAgICBzd2l0Y2gocHJlc2V0KSB7CiAgICAgIGNhc2UgJ2FkZCc6CiAgICAgIGNhc2UgJ2FkZGl0aXZlJzoKICAgICAgICAvLyBub3RoaW5nIHRvIGRvLiBhZGRpdGl2ZSBpcyB0aGUgZGVmYXVsdAogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdzdWInOgogICAgICBjYXNlICdzdWJ0cmFjdGl2ZSc6CiAgICAgICAgbHVtaW5hbmNlU3RhcnQgPSA0MDsKICAgICAgICBsdW1pbmFuY2VEZWx0YSA9IDEwOwogICAgICAgIGNocm9tYVN0YXJ0ID0gNzU7CiAgICAgICAgY2hyb21hRGVsdGEgPSAtNTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gdHJlZUNvbG9yOwogIH0KCiAgVHJlZUNvbG9ycy5nZXRQZXJtdXRhdGlvblNlcXVlbmNlID0gZnVuY3Rpb24obil7CiAgICBpZihuID09PSAwKSByZXR1cm4gW107CiAgICBpZihuID09PSAxKSByZXR1cm4gWzBdOwogICAgaWYobiA9PT0gMikgcmV0dXJuIFswLCAxXTsKICAgIGlmKG4gPT09IDMpIHJldHVybiBbMCwgMiwgMV07CiAgICBpZihuID09PSA0KSByZXR1cm4gWzAsIDIsIDEsIDNdOwoKICAgIC8vIDE0NCBpcyBub3QgYSBtYWdpYyBudW1iZXIuIEl0IGlzIGJlY2F1c2UgdGhlIHVzZWQgcGVybXV0YXRpb24gb3JkZXIgaXMgYmFzZWQgb24gZml2ZS1lbGVtZW50cy1wZXJtdXRhdGlvbi4KICAgIHZhciB1bml0QW5nbGUgPSAzNjAgLyBuLAogICAgICAgIHBpY2tpbmdBbmdsZSA9IE1hdGguZmxvb3IoMTQ0IC8gdW5pdEFuZ2xlKSAqIHVuaXRBbmdsZSwKICAgICAgICBzZXF1ZW5jZSA9IG5ldyBBcnJheShuKSwKICAgICAgICBwaWNrZWQgPSBuZXcgQXJyYXkobiksCiAgICAgICAgYW5nbGUgPSAwCiAgICAgICAgOwoKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuOyArK2kpewogICAgICB2YXIgaW5kZXggPSBNYXRoLmZsb29yKGFuZ2xlIC8gdW5pdEFuZ2xlICsgZXApOwoKICAgICAgc2VxdWVuY2VbaV0gPSBpbmRleDsKICAgICAgcGlja2VkW2luZGV4XSA9IHRydWU7CgogICAgICBhbmdsZSA9IChhbmdsZSArIHBpY2tpbmdBbmdsZSkgJSAzNjA7CgogICAgICBpZihpIDwgbiAtIDEpIHsKICAgICAgICB3aGlsZShwaWNrZWRbTWF0aC5mbG9vcihhbmdsZSAvIHVuaXRBbmdsZSArIGVwKV0pIHsKICAgICAgICAgIGFuZ2xlID0gKGFuZ2xlICsgdW5pdEFuZ2xlKSAlIDM2MDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc2VxdWVuY2U7CiAgfTsKCgogIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgIGRlZmluZShmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIFRyZWVDb2xvcnM7CiAgICB9KTsKICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICBtb2R1bGUuZXhwb3J0cyA9IFRyZWVDb2xvcnM7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5UcmVlQ29sb3JzID0gVHJlZUNvbG9yczsKICB9Cn0pKCk7\ndata:text/css;base64,Lm5vZGUgewogIGN1cnNvcjogcG9pbnRlcjsKfQoKLm5vZGVSZWN0IHsKICBmaWxsOiAjZGRkOwogIHN0cm9rZTogI2RkZDsKICBwb2ludGVyLWV2ZW50czogYWxsOwp9CiAKLm5vZGUgY2lyY2xlIHsKICBmaWxsOiAjZWVlOwogIHN0cm9rZTogc3RlZWxibHVlOwogIHN0cm9rZS13aWR0aDogMS41cHg7Cn0KIAoubm9kZSB0ZXh0IHsKICBmb250LXNpemU6MTBweDsgCiAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZjsKfQoKLm5vZGVUZXh0QmcxIHsKICBmaWxsOiB3aGl0ZTsKICBvcGFjaXR5OiAwLjU7Cn0KLm5vZGVUZXh0QmcyIHsKICBmaWxsOiB3aGl0ZTsKICBvcGFjaXR5OiAwLjU7Cn0gCi5saW5rIHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogI2NjYzsKICBzdHJva2Utd2lkdGg6IDEuNXB4Owp9CgoudGVtcGxpbmsgewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiByZWQ7CiAgc3Ryb2tlLXdpZHRoOiAzcHg7Cn0KCi5zdmctY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsgLyogYXNwZWN0IHJhdGlvICovCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnN2Zy1jb250ZW50LXJlc3BvbnNpdmUgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5naG9zdENpcmNsZS5zaG93ewogICAgZGlzcGxheTpibG9jazsKfQoKLmdob3N0Q2lyY2xlLCAuYWN0aXZlRHJhZyAuZ2hvc3RDaXJjbGV7CiAgICAgZGlzcGxheTogbm9uZTsKfQoKLnRpcFRhYmxlQ29udGFpbmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7CiAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICAgIGNvbG9yOiAjZWZlZmVmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbWFyZ2luOiAycHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoKLnRpcFRleHRBZnRlclRhYmxlIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwogICAgbWFyZ2luLXRvcDogNHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnRpcFRhYmxlIHsKICAgIG1hcmdpbjogMCBhdXRvOwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGJvcmRlcjogMDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICBwYWRkaW5nOjA7CiAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICAgIGNvbG9yOiAjZWZlZmVmOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoudGlwRENsYXNzaWZpY2F0aW9uIHsKICAgIG1hcmdpbjogMDsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBib3JkZXI6IDA7CiAgICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7CiAgICB0ZXh0LWFsaWduOmxlZnQ7CiAgICBwYWRkaW5nOiAwIDJweCAwIDJweDsKICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwp9CgoudGlwRENsYXNzaWZpY2F0aW9uTnVtIHsKICAgIG1hcmdpbjogMDsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBib3JkZXI6IDA7CiAgICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7CiAgICB0ZXh0LWFsaWduOnJpZ2h0OwogICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CiAgICBwYWRkaW5nOiAwIDJweCAwIDJweDsKfQoKLnRpcEQgewogICAgbWFyZ2luOiAwOwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGJvcmRlcjogMDsKICAgIHZlcnRpY2FsLWFsaWduOmJvdHRvbTsKICAgIHBhZGRpbmc6MDsKICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwogICAgY29sb3I6ICNlZmVmZWY7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi50aXBCbHVlTm9EYXNoIHsKICAgIHdpZHRoOjEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBzdGVlbGJsdWU7Cn0KCgoudGlwQmx1ZUxlZnREYXNoIHsKICAgIHdpZHRoOjEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBzdGVlbGJsdWU7CiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm9yZGVyLWxlZnQ6IDFweCBkYXNoZWQgI2VmZWZlZjsKfQoKLnRpcEJsdWVSaWdodERhc2ggewogICAgd2lkdGg6MTBweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHN0ZWVsYmx1ZTsKICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3JkZXItcmlnaHQ6IDFweCBkYXNoZWQgI2VmZWZlZjsKfQoKLnRpcEJsdWVMZWZ0UmlnaHREYXNoIHsKICAgIHdpZHRoOjEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBzdGVlbGJsdWU7CiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm9yZGVyLWxlZnQ6IDFweCBkYXNoZWQgI2VmZWZlZjsKICAgIGJvcmRlci1yaWdodDogMXB4IGRhc2hlZCAjZWZlZmVmOwp9CgoKLnRpcEJsdWVUb3BEYXNoIHsKICAgIHdpZHRoOjEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBzdGVlbGJsdWU7CiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm9yZGVyLXRvcDogMXB4IGRhc2hlZCAjZWZlZmVmOwp9CgoudGlwQmx1ZVRvcExlZnREYXNoIHsKICAgIHdpZHRoOjEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBzdGVlbGJsdWU7CiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm9yZGVyLXRvcDogMXB4IGRhc2hlZCAjZWZlZmVmOwogICAgYm9yZGVyLWxlZnQ6IDFweCBkYXNoZWQgI2VmZWZlZjsKfQoKLnRpcEJsdWVUb3BSaWdodERhc2ggewogICAgd2lkdGg6MTBweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHN0ZWVsYmx1ZTsKICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkICNlZmVmZWY7CiAgICBib3JkZXItcmlnaHQ6IDFweCBkYXNoZWQgI2VmZWZlZjsKfQoKLnRpcEJsdWVUb3BMZWZ0UmlnaHREYXNoIHsKICAgIHdpZHRoOjEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBzdGVlbGJsdWU7CiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm9yZGVyLXRvcDogMXB4IGRhc2hlZCAjZWZlZmVmOwogICAgYm9yZGVyLWxlZnQ6IDFweCBkYXNoZWQgI2VmZWZlZjsKICAgIGJvcmRlci1yaWdodDogMXB4IGRhc2hlZCAjZWZlZmVmOwp9CgoudGlwTm9jb2xOb0Rhc2ggewogICAgd2lkdGg6MTBweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owp9CgoudGlwTm9jb2xMZWZ0RGFzaCB7CiAgICB3aWR0aDoxMHB4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm9yZGVyLWxlZnQ6IDFweCBkYXNoZWQgI2VmZWZlZjsKfQoKLnRpcE5vY29sUmlnaHREYXNoIHsKICAgIHdpZHRoOjEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3JkZXItcmlnaHQ6IDFweCBkYXNoZWQgI2VmZWZlZjsKfQoKLnRpcE5vY29sTGVmdFJpZ2h0RGFzaCB7CiAgICB3aWR0aDoxMHB4OwogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm9yZGVyLWxlZnQ6IDFweCBkYXNoZWQgI2VmZWZlZjsKICAgIGJvcmRlci1yaWdodDogMXB4IGRhc2hlZCAjZWZlZmVmOwp9CgoudGlwTm9jb2xUb3BEYXNoIHsKICAgIHdpZHRoOjEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkICNlZmVmZWY7Cn0KCi50aXBOb2NvbFRvcExlZnREYXNoIHsKICAgIHdpZHRoOjEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkICNlZmVmZWY7CiAgICBib3JkZXItbGVmdDogMXB4IGRhc2hlZCAjZWZlZmVmOwp9CgoudGlwTm9jb2xUb3BSaWdodERhc2ggewogICAgd2lkdGg6MTBweDsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI2VmZWZlZjsKICAgIGJvcmRlci1yaWdodDogMXB4IGRhc2hlZCAjZWZlZmVmOwp9CgoudGlwTm9jb2xUb3BMZWZ0UmlnaHREYXNoIHsKICAgIHdpZHRoOjEwcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkICNlZmVmZWY7CiAgICBib3JkZXItbGVmdDogMXB4IGRhc2hlZCAjZWZlZmVmOwogICAgYm9yZGVyLXJpZ2h0OiAxcHggZGFzaGVkICNlZmVmZWY7Cn0KCgoKLm5vcnRoVGlwIHsKCXdpZHRoOiAwOwoJaGVpZ2h0OiAwOwoJYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKCWJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwoJYm9yZGVyLXRvcDogMTBweCBzb2xpZCAjMzMzOwoJZm9udC1zaXplOiAwOwoJbGluZS1oZWlnaHQ6IDA7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cn0KCi5zb3V0aFRpcCB7Cgl3aWR0aDogMDsKCWhlaWdodDogMDsKCWJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7ICAvKiBsZWZ0IGFycm93IHNsYW50ICovCglib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsgLyogcmlnaHQgYXJyb3cgc2xhbnQgKi8KCWJvcmRlci1ib3R0b206IDEwcHggc29saWQgIzMzMzsgLyogYm90dG9tLCBhZGQgYmFja2dyb3VuZCBjb2xvciBoZXJlICovCglmb250LXNpemU6IDA7CglsaW5lLWhlaWdodDogMDsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLmVhc3RUaXAgewoJd2lkdGg6IDA7CgloZWlnaHQ6IDA7Cglib3JkZXItdG9wOiA1cHggc29saWQgdHJhbnNwYXJlbnQ7Cglib3JkZXItYm90dG9tOiA1cHggc29saWQgdHJhbnNwYXJlbnQ7Cglib3JkZXItcmlnaHQ6IDEwcHggc29saWQgIzMzMzsKCWZvbnQtc2l6ZTogMDsKCWxpbmUtaGVpZ2h0OiAwOwoJcG9zaXRpb246IGFic29sdXRlOwp9Cgoud2VzdFRpcCB7Cgl3aWR0aDogMDsKCWhlaWdodDogMDsKCWJvcmRlci10b3A6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKCWJvcmRlci1ib3R0b206IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKCWJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkICMzMzM7Cglmb250LXNpemU6IDA7CglsaW5lLWhlaWdodDogMDsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKfQ==\ndata:text/javascript;base64,ZnVuY3Rpb24gU2Fua2V5KCkgewogICAgCiAgICB2YXIgZGF0YSwKICAgICAgICBvcHRzLAogICAgICAgIG1heEJhckxlbmd0aCwKICAgICAgICB0cmVlTWFyZ2lucyA9IHt0b3A6IDUsIGxlZnQ6IDEwLCBib3R0b206IDUsIHJpZ2h0OiAxMH0sCiAgICAgICAgdHJlZURpbSwKICAgICAgICBuZXdUcmVlRGltLAogICAgICAgIHhzY2FsZSA9IDEsCiAgICAgICAgeXNjYWxlID0gMSwKICAgICAgICB4LAogICAgICAgIHksCiAgICAgICAgc2NhbGUsCiAgICAgICAgbmV3U2NhbGUsCiAgICAgICAgc3ZnVHJhbnMsCiAgICAgICAgc3ZnR3JvdXAsCiAgICAgICAgem9vbUxpc3RlbmVyLAogICAgICAgIGluaXQgPSB0cnVlLAogICAgICAgIHJlYWxGb3JtYXR0ZXIgPSBkMy5mb3JtYXQoIiwuMWYiKSwKICAgICAgICBpbnRGb3JtYXR0ZXIgPSBkMy5mb3JtYXQoIixkIiksCiAgICAgICAgd2lkdGggPSA1MDAsCiAgICAgICAgaGVpZ2h0ID0gNTAwLAogICAgICAgIHByZXZXaWR0aCwKICAgICAgICBwcmV2SGVpZ2h0OwogICAgICAgIAogICAgdmFyIHRvb2x0aXAgPSB7CiAgICAgICAgCiAgICAgICAgY3JlYXRlQ2xUaXBzOiBmdW5jdGlvbihkYXRhLCBzY2FsZSwgbWF4TCkgewogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGRhdGEubm9kZURpc3RyaWJ1dGlvbikgewogICAgICAgICAgICAgICAgZGF0YS50b29sdGlwID0gIiI7CiAgICAgICAgICAgICAgICBudmFsID0gZGF0YS5ub2RlRGlzdHJpYnV0aW9uLmxlbmd0aDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHQgPSAibjogIiArIGludEZvcm1hdHRlcihkYXRhLm4pICsgIjxicj4iOwogICAgICAgICAgICAgICAgdCA9IHQgKyAiRGVzY3JpcHRpb246ICI7CiAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBUYWJsZUNvbnRhaW5lcic+PHRhYmxlIGNsYXNzPSd0aXBUYWJsZSc+IjsKICAgICAgICAgICAgICAgIC8vIG1haW4gdGlwIHRhYmxlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG52YWw7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjx0cj4iOwogICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjx0ZCBjbGFzcz0ndGlwRENsYXNzaWZpY2F0aW9uTnVtJz4iICsgaW50Rm9ybWF0dGVyKE1hdGgucm91bmQoZGF0YS5ub2RlRGlzdHJpYnV0aW9uW2ldKjEwMCkpICsgIiU8L3RkPiI7CiAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPHRkIGNsYXNzPSd0aXBEQ2xhc3NpZmljYXRpb24nPiIgKyBkYXRhLm5vZGVWYXJpYWJsZXNbaV0gKyAiPC90ZD4iOwogICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjx0ZCBjbGFzcz0ndGlwRENsYXNzaWZpY2F0aW9uJz4iOwogICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgc3R5bGU9J3dpZHRoOiIgKyBzY2FsZShkYXRhLm5vZGVEaXN0cmlidXRpb25baV0pICsgInB4O2hlaWdodDo4cHg7YmFja2dyb3VuZC1jb2xvcjpzdGVlbGJsdWUnPjwvZGl2PiIgKyAiPC90ZD4iOwogICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjwvdHI+IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdCA9IHQgKyAiPC90YWJsZT48L2Rpdj4iOwogICAgICAgICAgICAgICAgZGF0YS50b29sdGlwID0gdDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGRhdGFbb3B0cy5jaGlsZHJlbk5hbWVdKSB7CiAgICAgICAgICAgICAgICB0b29sdGlwLmNyZWF0ZUNsVGlwcyhkYXRhW29wdHMuY2hpbGRyZW5OYW1lXVswXSwgc2NhbGUsIG1heEwpOwogICAgICAgICAgICAgICAgdG9vbHRpcC5jcmVhdGVDbFRpcHMoZGF0YVtvcHRzLmNoaWxkcmVuTmFtZV1bMV0sIHNjYWxlLCBtYXhMKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgY3JlYXRlUmdUaXBzOiBmdW5jdGlvbihkYXRhLCBzY2FsZSwgbWF4TCkgewogICAgICAgICAgICBpZiAoZGF0YS5ub2RlRGlzdHJpYnV0aW9uICE9PSAgMCkgewogICAgICAgICAgICAgICAgZGF0YS50b29sdGlwID0gIiI7CiAgICAgICAgICAgICAgICBudmFsID0gZGF0YS5vdmVyYWxsRGlzdHJpYnV0aW9uLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBtYXhEb21haW4gPSBNYXRoLm1heChkMy5tYXgoZGF0YS5vdmVyYWxsRGlzdHJpYnV0aW9uKSwgZDMubWF4KGRhdGEubm9kZURpc3RyaWJ1dGlvbikpOwogICAgICAgICAgICAgICAgc2NhbGUuZG9tYWluKFswLCBtYXhEb21haW5dKTsKICAgICAgICAgICAgICAgIHZhciB0ID0gIjxkaXYgY2xhc3M9J3RpcFRhYmxlQ29udGFpbmVyJz48dGFibGUgY2xhc3M9J3RpcFRhYmxlJz4iOwogICAgICAgICAgICAgICAgdCA9IHQgKyAiPHRyPiI7CiAgICAgICAgICAgICAgICB2YXIgcHJldkRpc3RILCBwcmV2ZGFzaERpc3RILCBzb2xpZERpc3RILCBkYXNoRGlzdEgsIG5leHREaXN0SCwgbmV4dGRhc2hEaXN0SDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnZhbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPHRkIGNsYXNzPSd0aXBEJyBzdHlsZT0naGVpZ2h0OiIgKyBtYXhMICsicHgnPiI7CiAgICAgICAgICAgICAgICAgICAgc29saWREaXN0SCA9IE1hdGguZmxvb3Ioc2NhbGUoZGF0YS5ub2RlRGlzdHJpYnV0aW9uW2ldKSk7CiAgICAgICAgICAgICAgICAgICAgZGFzaERpc3RIID0gTWF0aC5mbG9vcihzY2FsZShkYXRhLm92ZXJhbGxEaXN0cmlidXRpb25baV0pKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0RGlzdEggPSBNYXRoLmZsb29yKHNjYWxlKGRhdGEubm9kZURpc3RyaWJ1dGlvbltpKzFdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRkYXNoRGlzdEggPSBNYXRoLmZsb29yKHNjYWxlKGRhdGEub3ZlcmFsbERpc3RyaWJ1dGlvbltpKzFdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb2xpZERpc3RIIDwgZGFzaERpc3RIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGFzaERpc3RIIDwgbmV4dGRhc2hEaXN0SCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcE5vY29sUmlnaHREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAobmV4dGRhc2hEaXN0SCAtIGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwTm9jb2xUb3BMZWZ0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKGRhc2hEaXN0SCAtIHNvbGlkRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVMZWZ0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb2xpZERpc3RIIDwgbmV4dGRhc2hEaXN0SCAmJiBuZXh0ZGFzaERpc3RIIDw9IGRhc2hEaXN0SCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBOb2NvbFRvcExlZnRSaWdodERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChkYXNoRGlzdEggLSBuZXh0ZGFzaERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBOb2NvbExlZnREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAobmV4dGRhc2hEaXN0SCAtIHNvbGlkRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVMZWZ0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ZGFzaERpc3RIIDw9IHNvbGlkRGlzdEgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBOb2NvbFRvcExlZnRSaWdodERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChkYXNoRGlzdEggLSBzb2xpZERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBCbHVlTGVmdFJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEggLSBuZXh0ZGFzaERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBCbHVlTGVmdERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChuZXh0ZGFzaERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbGlkRGlzdEggPCBuZXh0ZGFzaERpc3RIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwTm9jb2xSaWdodERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChuZXh0ZGFzaERpc3RIIC0gc29saWREaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZVJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEggLSBkYXNoRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVUb3BMZWZ0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhc2hEaXN0SCA8IG5leHRkYXNoRGlzdEggJiYgbmV4dGRhc2hEaXN0SCA8PSBzb2xpZERpc3RIICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVOb0Rhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChzb2xpZERpc3RIIC0gbmV4dGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZVJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKG5leHRkYXNoRGlzdEggLSBkYXNoRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVUb3BMZWZ0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRkYXNoRGlzdEggPD0gZGFzaERpc3RIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZU5vRGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEggLSBkYXNoRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVUb3BMZWZ0UmlnaHREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAoZGFzaERpc3RIIC0gbmV4dGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZUxlZnREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAobmV4dGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IG52YWwtMSl7IAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbGlkRGlzdEggPCBkYXNoRGlzdEgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhc2hEaXN0SCA8IHByZXZkYXNoRGlzdEgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBOb2NvbFRvcFJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKGRhc2hEaXN0SCAtIHNvbGlkRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVSaWdodERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChzb2xpZERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc29saWREaXN0SCA8IHByZXZkYXNoRGlzdEggJiYgcHJldmRhc2hEaXN0SCA8PSBkYXNoRGlzdEggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwTm9jb2xUb3BMZWZ0UmlnaHREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAoZGFzaERpc3RIIC0gcHJldmRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwTm9jb2xSaWdodERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChwcmV2ZGFzaERpc3RIIC0gc29saWREaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZVJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2ZGFzaERpc3RIIDw9IHNvbGlkRGlzdEgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBOb2NvbFRvcExlZnRSaWdodERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChkYXNoRGlzdEggLSBzb2xpZERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBCbHVlTGVmdFJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEggLSBwcmV2ZGFzaERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBCbHVlUmlnaHREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAocHJldmRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbGlkRGlzdEggPCBwcmV2ZGFzaERpc3RIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZUxlZnREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAoc29saWREaXN0SCAtIGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZVRvcFJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhc2hEaXN0SCA8IHByZXZkYXNoRGlzdEggJiYgcHJldmRhc2hEaXN0SCA8PSBzb2xpZERpc3RIICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVOb0Rhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChzb2xpZERpc3RIIC0gcHJldmRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZUxlZnREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAocHJldmRhc2hEaXN0SCAtIGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZVRvcFJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZXZkYXNoRGlzdEggPD0gZGFzaERpc3RIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZU5vRGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEggLSBkYXNoRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVUb3BMZWZ0UmlnaHREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAoZGFzaERpc3RIIC0gcHJldmRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZVJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHByZXZkYXNoRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHREaXN0SCA9IE1hdGguZmxvb3Ioc2NhbGUoZGF0YS5ub2RlRGlzdHJpYnV0aW9uW2krMV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGRhc2hEaXN0SCA9IE1hdGguZmxvb3Ioc2NhbGUoZGF0YS5vdmVyYWxsRGlzdHJpYnV0aW9uW2krMV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbGlkRGlzdEggPCBkYXNoRGlzdEgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXNoRGlzdEggPCBuZXh0ZGFzaERpc3RIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwTm9jb2xSaWdodERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChuZXh0ZGFzaERpc3RIIC0gZGFzaERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBOb2NvbFRvcERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChkYXNoRGlzdEggLSBzb2xpZERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBCbHVlTm9EYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAoc29saWREaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvbGlkRGlzdEggPCBuZXh0ZGFzaERpc3RIICYmIG5leHRkYXNoRGlzdEggPD0gZGFzaERpc3RIICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcE5vY29sVG9wUmlnaHREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAoZGFzaERpc3RIIC0gbmV4dGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwTm9jb2xOb0Rhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChuZXh0ZGFzaERpc3RIIC0gc29saWREaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZU5vRGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ZGFzaERpc3RIIDw9IHNvbGlkRGlzdEgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBOb2NvbFRvcFJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKGRhc2hEaXN0SCAtIHNvbGlkRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVSaWdodERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChzb2xpZERpc3RIIC0gbmV4dGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZU5vRGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKG5leHRkYXNoRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbGlkRGlzdEggPCBuZXh0ZGFzaERpc3RIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwTm9jb2xSaWdodERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChuZXh0ZGFzaERpc3RIIC0gc29saWREaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZVJpZ2h0RGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEggLSBkYXNoRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVUb3BEYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAoZGFzaERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGFzaERpc3RIIDwgbmV4dGRhc2hEaXN0SCAmJiBuZXh0ZGFzaERpc3RIIDw9IHNvbGlkRGlzdEggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZU5vRGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKHNvbGlkRGlzdEggLSBuZXh0ZGFzaERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBCbHVlUmlnaHREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAobmV4dGRhc2hEaXN0SCAtIGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZVRvcERhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChkYXNoRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ZGFzaERpc3RIIDw9IGRhc2hEaXN0SCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgIjxkaXYgY2xhc3M9J3RpcEJsdWVOb0Rhc2gnIHN0eWxlPSdoZWlnaHQ6IiArIChzb2xpZERpc3RIIC0gZGFzaERpc3RIKSArICJweCc+PC9kaXY+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArICI8ZGl2IGNsYXNzPSd0aXBCbHVlVG9wUmlnaHREYXNoJyBzdHlsZT0naGVpZ2h0OiIgKyAoZGFzaERpc3RIIC0gbmV4dGRhc2hEaXN0SCkgKyAicHgnPjwvZGl2PiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwQmx1ZU5vRGFzaCcgc3R5bGU9J2hlaWdodDoiICsgKG5leHRkYXNoRGlzdEgpICsgInB4Jz48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQgPSB0ICArICI8L3RkPiI7CiAgICAgICAgICAgICAgICAgICAgcHJldkRpc3RIID0gc29saWREaXN0SDsKICAgICAgICAgICAgICAgICAgICBwcmV2ZGFzaERpc3RIID0gZGFzaERpc3RIOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdCA9IHQgKyAiPC90cj4iOwogICAgICAgICAgICAgICAgdCA9IHQgKyAiPC90YWJsZT48L2Rpdj4iOwogICAgICAgICAgICAgICAgdCA9IHQgKyAiPGRpdiBjbGFzcz0ndGlwVGV4dEFmdGVyVGFibGUnPiIKICAgICAgICAgICAgICAgICAgICAgICAgKyAiTm9kZSBNZWFuID0gIiArIHJlYWxGb3JtYXR0ZXIoZGF0YS55KQogICAgICAgICAgICAgICAgICAgICAgICArICIsIEdsb2JhbCBNZWFuID0gIiArIHJlYWxGb3JtYXR0ZXIoZGF0YS55MCkKICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBuID0gIiArIHJlYWxGb3JtYXR0ZXIoZGF0YS5uKSArICI8L2Rpdj4iOwogICAgICAgICAgICAgICAgZGF0YS50b29sdGlwID0gdDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRhdGEudG9vbHRpcCA9ICI8ZGl2IGNsYXNzPSd0aXBUYWJsZUNvbnRhaW5lcic+IgogICAgICAgICAgICAgICAgICAgICAgICArICJOb2RlIE1lYW4gPSAiICsgcmVhbEZvcm1hdHRlcihkYXRhLnkpCiAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgR2xvYmFsIE1lYW4gPSAiICsgcmVhbEZvcm1hdHRlcihkYXRhLnkwKQogICAgICAgICAgICAgICAgICAgICAgICArICIsIG4gPSAiICsgcmVhbEZvcm1hdHRlcihkYXRhLm4pICsgIjwvZGl2PiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkYXRhW29wdHMuY2hpbGRyZW5OYW1lXSkgewogICAgICAgICAgICAgICAgdG9vbHRpcC5jcmVhdGVSZ1RpcHMoZGF0YVtvcHRzLmNoaWxkcmVuTmFtZV1bMF0sIHNjYWxlLCBtYXhMKTsKICAgICAgICAgICAgICAgIHRvb2x0aXAuY3JlYXRlUmdUaXBzKGRhdGFbb3B0cy5jaGlsZHJlbk5hbWVdWzFdLCBzY2FsZSwgbWF4TCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgfTsKCiAgICAvLyBEZWZpbmUgdGhlIHpvb20gZnVuY3Rpb24gZm9yIHRoZSB6b29tYWJsZSB0cmVlCiAgICBmdW5jdGlvbiB6b29tKCkgewogICAgICAgIHN2Z0dyb3VwLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIGQzLmV2ZW50LnRyYW5zbGF0ZSArICIpc2NhbGUoIiArIGQzLmV2ZW50LnNjYWxlICsgIikiKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcmVzaXplQ2hhcnQoZWwpIHsKICAgICAgICBzdmdUcmFucyA9IGQzLnRyYW5zZm9ybShzdmdHcm91cC5hdHRyKCJ0cmFuc2Zvcm0iKSk7CiAgICAgICAgc2NhbGUgPSBzdmdUcmFucy5zY2FsZVswXTsKICAgICAgICBuZXdTY2FsZSA9IHNjYWxlOwogICAgICAgIHggPSBzdmdUcmFucy50cmFuc2xhdGVbMF07CiAgICAgICAgeSA9IHN2Z1RyYW5zLnRyYW5zbGF0ZVsxXTsKICAgICAgICAKICAgICAgICB2YXIgYm94V2lkdGggPSB3aWR0aCAtIHRyZWVNYXJnaW5zLmxlZnQgLSB0cmVlTWFyZ2lucy5yaWdodCAtIDIwLAogICAgICAgICAgICBib3hIZWlnaHQgPSBoZWlnaHQgLSB0cmVlTWFyZ2lucy50b3AgLSB0cmVlTWFyZ2lucy5ib3R0b20gLSAxMCwKICAgICAgICAgICAgdHJlZVdpZHRoID0gdHJlZURpbS53aWR0aCwKICAgICAgICAgICAgdHJlZUhlaWdodCA9IHRyZWVEaW0uaGVpZ2h0OwogICAgICAgIAogICAgICAgIHhzY2FsZSA9IChib3hXaWR0aCkvKHByZXZXaWR0aCAtIHRyZWVNYXJnaW5zLmxlZnQgLSB0cmVlTWFyZ2lucy5yaWdodCAtIDIwKSpzY2FsZTsKICAgICAgICB5c2NhbGUgPSAoYm94SGVpZ2h0KS8ocHJldkhlaWdodCAtIHRyZWVNYXJnaW5zLnRvcCAtIHRyZWVNYXJnaW5zLmJvdHRvbSAtIDEwKSpzY2FsZTsKICAgICAgICAKICAgICAgICBpZiAoYm94V2lkdGggPj0gdHJlZVdpZHRoKnhzY2FsZSkgewogICAgICAgICAgICBpZiAoYm94SGVpZ2h0ID49IHRyZWVIZWlnaHQqeXNjYWxlKSB7CiAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IE1hdGgubWluKE1hdGgubWF4KHhzY2FsZSwgeXNjYWxlKSwgMyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IE1hdGgubWluKHlzY2FsZSwgMyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoYm94SGVpZ2h0ID49IHRyZWVIZWlnaHQqeXNjYWxlKSB7CiAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IE1hdGgubWluKHhzY2FsZSwgMyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IE1hdGgubWluKHhzY2FsZSwgeXNjYWxlLCAzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3ZnR3JvdXAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgeCArICIsIiArIHkgKyAiKXNjYWxlKCIgKyBuZXdTY2FsZSArICIpIikKICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgbmV3VHJlZURpbSA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgc3ZnR3JvdXAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgeCArICIsIiArIHkgKyAiKXNjYWxlKCIgKyBuZXdTY2FsZSArICIpIik7CiAgICAgICAgdHJlZURpbSA9IG5ld1RyZWVEaW07ICAgICAgICAgICAgCiAgICAgICAgem9vbUxpc3RlbmVyLnNjYWxlKG5ld1NjYWxlKTsKICAgICAgICB6b29tTGlzdGVuZXIudHJhbnNsYXRlKFt4LCB5XSk7CiAgICAgICAgcHJldldpZHRoID0gd2lkdGg7CiAgICAgICAgcHJldkhlaWdodCA9IGhlaWdodDsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gY2hhcnQoc2VsZWN0aW9uKSB7CgogICAgICAgIHZhciB0cmVlRGF0YSA9IGRhdGE7IAogICAgCiAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIG5vZGVzLCBtYXggbGFiZWwgbGVuZ3RoCiAgICAgICAgdmFyIHRvdGFsTm9kZXMgPSAwOwogICAgICAgIHZhciBtYXhMYWJlbExlbmd0aCA9IDA7CiAgICAgICAgLy8gdmFyaWFibGVzIGZvciBkcmFnL2Ryb3AKICAgICAgICB2YXIgc2VsZWN0ZWROb2RlID0gbnVsbDsKICAgICAgICB2YXIgZHJhZ2dpbmdOb2RlID0gbnVsbDsKICAgICAgICAvLyBwYW5uaW5nIHZhcmlhYmxlcwogICAgICAgIHZhciBwYW5TcGVlZCA9IDIwMDsKICAgICAgICB2YXIgcGFuQm91bmRhcnkgPSAyMDsgLy8gV2l0aGluIDIwcHggZnJvbSBlZGdlcyB3aWxsIHBhbiB3aGVuIGRyYWdnaW5nLgogICAgICAgIC8vIE1pc2MuIHZhcmlhYmxlcwogICAgICAgIHZhciBpID0gMDsKICAgICAgICB2YXIgZHVyYXRpb24gPSA0MDA7CiAgICAgICAgdmFyIHJvb3Q7CiAgICAgICAgdmFyIHB4UGVyQ2hhciA9IDg7CiAgICAgICAgdmFyIG5vZGVUZXh0U2l6ZSA9IDEwOyAvLyBpbml0aWFsIG5vZGUgdGV4dCBzaXplIGluIHBpeGNlbHMKICAgICAgICB2YXIgbmV3V2lkdGg7CiAgICAgICAgdmFyIG5ld0hlaWdodDsKICAgICAgICB2YXIgbm9kZVNjYWxlOwogICAgICAgIHZhciBoZWlnaHRTY2FsZTsKICAgICAgICB2YXIgbm9kZVJlY3RXaWR0aCA9IDU7CiAgICAgICAgdmFyIG5vZGVUZXh0RHggPSAxMDsKICAgICAgICAKICAgICAgICAKICAgICAgICAvLyBhZGQgdHJlZUNvbG9ycyBpZiB0b2xkIHllcwogICAgICAgIGlmKG9wdHMudHJlZUNvbG9ycyl7CiAgICAgICAgICB2YXIgdGMgPSBUcmVlQ29sb3JzKCJhZGQiKTsKICAgICAgICAgIHRjLmNoaWxkcmVuKG9wdHMuY2hpbGRyZW5OYW1lKTsKICAgICAgICAgIHRjKHRyZWVEYXRhKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gd29yayBvbiB0b29sdGlwCiAgICAgICAgdmFyIHRpcCA9IHt9OwogICAgICAgICAgICAgICAgICAgIAogICAgICAgIGlmKG9wdHMudG9vbHRpcCl7CiAgICAgICAgICB0aXAgPSBkMy50aXAoKQogICAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZDMtdGlwJykKICAgICAgICAgICAgICAgICAgLmh0bWwoZnVuY3Rpb24oZCkge3JldHVybiBkW29wdHMudG9vbHRpcF07IH0pOwogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHRpcFRyaWFuZ2xlID0gZDMuc2VsZWN0KCJib2R5IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoImRpdiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigiaWQiLCAibGl0dGxlVHJpYW5nbGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgICAgICBpZiAob3B0cy5udW1lcmljRGlzdHJpYnV0aW9uKSB7CiAgICAgICAgICAgICAgICB2YXIgdGlwQmFyU2NhbGU7CiAgICAgICAgICAgICAgICBpZiAodHJlZURhdGEudHJlZVR5cGUgPT09ICJDbGFzc2lmaWNhdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBtYXhCYXJMZW5ndGggPSA0MDsKICAgICAgICAgICAgICAgICAgICB0aXBCYXJTY2FsZSA9IGQzLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbMCwgMV0pLnJhbmdlKFswLCBtYXhCYXJMZW5ndGhdKTsKICAgICAgICAgICAgICAgICAgICB0b29sdGlwLmNyZWF0ZUNsVGlwcyh0cmVlRGF0YSwgdGlwQmFyU2NhbGUsIG1heEJhckxlbmd0aCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyZWVEYXRhLnRyZWVUeXBlID09PSAiUmVncmVzc2lvbiIpIHsKICAgICAgICAgICAgICAgICAgICBtYXhCYXJMZW5ndGggPSA1MDsKICAgICAgICAgICAgICAgICAgICB0aXBCYXJTY2FsZSA9IGQzLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbMCwgMV0pLnJhbmdlKFswLCBtYXhCYXJMZW5ndGhdKTsKICAgICAgICAgICAgICAgICAgICB0b29sdGlwLmNyZWF0ZVJnVGlwcyh0cmVlRGF0YSwgdGlwQmFyU2NhbGUsIG1heEJhckxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAvKmlmKEFycmF5LmlzQXJyYXkob3B0cy50b29sdGlwKSl7CiAgICAgICAgICAgIHRpcC5odG1sKGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgIHZhciBodG1sdGlwID0gW107CiAgICAgICAgICAgICAgb3B0cy50b29sdGlwLmZvckVhY2goZnVuY3Rpb24oa3kpewogICAgICAgICAgICAgICAgaHRtbHRpcC5wdXNoKCBreSArICI6ICIgKyBkW2t5XSApOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybiBodG1sdGlwLmpvaW4oIjxici8+Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIGlmKHR5cGVvZihvcHRzLnRvb2x0aXApID09PSAiZnVuY3Rpb24iKXsKICAgICAgICAgICAgdGlwLmh0bWwob3B0cy50b29sdGlwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRpcC5odG1sKGZ1bmN0aW9uKGQpIHsgCiAgICAgICAgICAgICAgcmV0dXJuIGRbb3B0cy50b29sdGlwXTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9Ki8KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gc2l6ZSBvZiB0aGUgZGlhZ3JhbQogICAgICAgIC8vIGRlZmluZSB0aGUgYmFzZVN2ZywgYXR0YWNoaW5nIGEgY2xhc3MgZm9yIHN0eWxpbmcgYW5kIHRoZSB6b29tTGlzdGVuZXIKICAgICAgICB2YXIgYmFzZVN2ZyA9IHNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpOwogICAgCiAgICAgICAgdmFyIHRyZWUgPSBkMy5sYXlvdXQudHJlZSgpCiAgICAgICAgICAgIC5zaXplKFtoZWlnaHQsIHdpZHRoXSkKICAgICAgICAgICAgLmNoaWxkcmVuKGZ1bmN0aW9uKGQpe3JldHVybiBkW29wdHMuY2hpbGRyZW5OYW1lXX0pOwogICAgCiAgICAgICAgLy8gZGVmaW5lIGEgZDMgZGlhZ29uYWwgcHJvamVjdGlvbiBmb3IgdXNlIGJ5IHRoZSBub2RlIHBhdGhzIGxhdGVyIG9uLgogICAgICAgIHZhciBkaWFnb25hbCA9IGQzLnN2Zy5kaWFnb25hbCgpCiAgICAgICAgICAgIC5wcm9qZWN0aW9uKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbZC55LCBkLnhdOwogICAgICAgICAgICB9KQogICAgICAgICAgICAuc291cmNlKGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgIGlmKGQueXN0YWNreSkgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgcmV0dXJuIGQuc291cmNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgdmFyIG5vZGVIZWlnaHRSYXRpbyA9IGdldE5vZGVIZWlnaHRSYXRpbygpOwogICAgICAgIAogICAgICAgIHZhciBuaFNjYWxlID0gZDMuc2NhbGUucG93KCkKICAgICAgICAgICAgICAgICAgICAgIC5leHBvbmVudCg0KS5kb21haW4oWzAuNSwxXSkucmFuZ2UoWzEsM10pOwogICAgICAgIG5vZGVIZWlnaHRSYXRpbyA9IG5oU2NhbGUobm9kZUhlaWdodFJhdGlvKTsKICAgICAgICAKICAgICAgICAvKmZ1bmN0aW9uIGF0dGFjaExlZ2VuZCgpewogICAgICAgICAgLy8gYXNzdW1lcyB0d28gc2V0cyBvZiBkYXRhLCBjb2xvciBhbmQgdGV4dCBvZiB0aGUgbGVnZW5kLCBoYXMgYmVlbiBwYXNzZWQgb24gCiAgICAgICAgICAvLyBhcyBpbnB1dCBmcm9tIHRoZSBSIGJpbmRpbmcKICAgICAgICAgIHZhciBsZWdlbmRDb2xvciA9IHRyZWVEYXRhLmxlZ2VuZENvbG9yLnJldmVyc2UoKTsKICAgICAgICAgIHZhciBsZWdlbmRUZXh0ID0gdHJlZURhdGEubGVnZW5kVGV4dC5yZXZlcnNlKCk7CiAgICAgICAgICAKICAgICAgICAgIC8vIGZpeGVkIGRpbWVuc2lvbnMKICAgICAgICAgIC8vIFkKICAgICAgICAgIHZhciBsZWZ0WSA9IGhlaWdodCowLjM1OwogICAgICAgICAgdmFyIGxlZ2VuZEJveEhlaWdodCA9IGhlaWdodCowLjM7CiAgICAgICAgICB2YXIgdHh0SGVpZ2h0ID0gbGVnZW5kQm94SGVpZ2h0L2xlZ2VuZFRleHQubGVuZ3RoOwogICAgICAgICAgdmFyIGZvbnRTaXplID0gdHh0SGVpZ2h0KjAuNzsKICAgICAgICAgIAogICAgICAgICAgLy8gWAogICAgICAgICAgdmFyIHJlY3RXaWR0aCA9IHdpZHRoKjAuMDI1OwogICAgICAgICAgdmFyIHRleHRMZW5ndGggPSAzOwogICAgICAgICAgbGVnZW5kVGV4dC5mb3JFYWNoKGZ1bmN0aW9uKGQpewogICAgICAgICAgICBpZiAoZC5sZW5ndGggPiB0ZXh0TGVuZ3RoKSB7CiAgICAgICAgICAgICAgdGV4dExlbmd0aCA9IGQubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIHZhciBsZWdlbmRCb3hXaWR0aCA9IHJlY3RXaWR0aCArIHRleHRMZW5ndGgqZm9udFNpemU7CiAgICAgICAgICB2YXIgbGVmdFggPSB3aWR0aCowLjk5LWxlZ2VuZEJveFdpZHRoOwogICAgICAgICAgdmFyIHJlY3RYID0gbGVmdFggKyB0ZXh0TGVuZ3RoKmZvbnRTaXplKjAuMTsKICAgICAgICAgIHZhciB0ZXh0WCA9IGxlZnRYICsgcmVjdFdpZHRoICsgdGV4dExlbmd0aCpmb250U2l6ZSowLjM7CiAgICAgICAgICAKICAgICAgICAgIC8vIFkKICAgICAgICAgIHZhciByZWN0SGVpZ2h0ID0gKGxlZ2VuZEJveEhlaWdodCAtIGZvbnRTaXplKS9sZWdlbmRDb2xvci5sZW5ndGg7CiAgICAgICAgICB2YXIgcmVjdFkgPSBkMy5yYW5nZShmb250U2l6ZS8yLCBsZWdlbmRDb2xvci5sZW5ndGgqcmVjdEhlaWdodCArIGZvbnRTaXplLzIgLSByZWN0SGVpZ2h0LzIsIHJlY3RIZWlnaHQpOwogICAgICAgICAgdmFyIHR4dFkgPSBkMy5yYW5nZSh0eHRIZWlnaHQvMiwgbGVnZW5kVGV4dC5sZW5ndGgqdHh0SGVpZ2h0LCB0eHRIZWlnaHQpOwoKICAgICAgICAgIHZhciBsZWdlbmRCb3JkZXIgPSBsZWdlbmRCb3guYXBwZW5kKCJyZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoIngiLCBsZWZ0WCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoInkiLCBsZWZ0WSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgbGVnZW5kQm94V2lkdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBsZWdlbmRCb3hIZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlLXdpZHRoIiwgTWF0aC5taW4oMSwgZm9udFNpemUvMTIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsImJsYWNrIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJmaWxsIiwidHJhbnNwYXJlbnQiKTsKCiAgICAgICAgICB2YXIgbGVnZW5kUmVjID0gbGVnZW5kQm94LnNlbGVjdEFsbCgiZy5yZWMiKQogICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGxlZ2VuZENvbG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgicmVjdCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgdmFyIGxlZ2VuZFJlY0F0dHIgPSBsZWdlbmRSZWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoIngiLCByZWN0WCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoInkiLCBmdW5jdGlvbihkLGkpIHsgcmV0dXJuIHJlY3RZW2ldK2xlZnRZOyB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCByZWN0V2lkdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCByZWN0SGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkOyB9KTsKICAgICAgICAgIAogICAgICAgICAgdmFyIGxlZ2VuZFR4dCA9IGxlZ2VuZEJveC5zZWxlY3RBbGwoImxnLnRleHQiKQogICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGxlZ2VuZFRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJ0ZXh0Iik7ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgdmFyIGxlZ2VuZFR4dEF0dHIgPSBsZWdlbmRUeHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoIngiLCB0ZXh0WCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoInkiLCBmdW5jdGlvbihkLGkpIHsgcmV0dXJuIHR4dFlbaV0rbGVmdFk7IH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJkeSIsICIwLjM1ZW0iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkOyB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoImZvbnQtc2l6ZSIsZm9udFNpemUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgidGV4dC1hbGlnbiIsICJjZW50ZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoImZvbnQtZmFtaWx5IiwgInNhbnMtc2VyaWYiKTsKCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIGF0dGFjaENhdGVnb3J5TGVnZW5kKCl7CiAgICAgICAgICAKICAgICAgICAgIC8vIGluZGVwZW5kZW50CiAgICAgICAgICB2YXIgY2F0TGVnZW5kID0gdHJlZURhdGEuY2F0ZWdvcnlMZWdlbmQ7CiAgICAgICAgICB2YXIgcmVjdFggPSBNYXRoLm1pbih3aWR0aCowLjAyLCA1KTsKICAgICAgICAgIHZhciBtYXhSZWN0V2lkdGggPSB3aWR0aCowLjk7CiAgICAgICAgICB2YXIgbWF4UmVjdEhlaWdodCA9IGhlaWdodCowLjE1OwogICAgICAgICAgdmFyIG1heEZvbnRTaXplID0gMTQ7CiAgICAgICAgICAKICAgICAgICAgIC8vIHdvcmsgb3V0IGEgcHJvcGVyIGZvbnQgc2l6ZQogICAgICAgICAgdmFyIHRleHRMZW5ndGggPSAwLjA7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2F0TGVnZW5kLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRleHRMZW5ndGggPSBNYXRoLm1heCh0ZXh0TGVuZ3RoLCBjYXRMZWdlbmRbaV0ubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgLy8gZGVwZW5kZW50CiAgICAgICAgICB2YXIgdGV4dFNpemUgPSBNYXRoLm1pbihtYXhSZWN0V2lkdGgqMS44L3RleHRMZW5ndGgsIG1heEZvbnRTaXplKTsKICAgICAgICAgIHZhciBkZWx0YVkgPSB0ZXh0U2l6ZSoxLjU7CiAgICAgICAgICB2YXIgcmVjdEhlaWdodCA9IGRlbHRhWSpjYXRMZWdlbmQubGVuZ3RoOwogICAgICAgICAgCiAgICAgICAgICBpZiAocmVjdEhlaWdodCA+IG1heFJlY3RIZWlnaHQpIHsKICAgICAgICAgICAgcmVjdEhlaWdodCA9IG1heFJlY3RIZWlnaHQ7CiAgICAgICAgICAgIGRlbHRhWSA9IHJlY3RIZWlnaHQvY2F0TGVnZW5kLmxlbmd0aDsKICAgICAgICAgICAgdGV4dFNpemUgPSBkZWx0YVkvMS41OwogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICB2YXIgcmVjdFkgPSBoZWlnaHQqMC45OS1yZWN0SGVpZ2h0OwogICAgICAgICAgdmFyIHBhZGRpbmcgPSB0ZXh0U2l6ZS8yOwogICAgICAgICAgCiAgICAgICAgICAvL3ZhciB0eHRZID0gZDMucmFuZ2UoMCwoaGVpZ2h0KzEpLzMuMCwgdHh0SGVpZ2h0KTsKCiAgICAgICAgICAKICAgICAgICAgIC8vdmFyIHdkaXRoU2NhbGUgPSBkMy5zY2FsZS5saW5lYXIoKQogICAgICAgICAgLy8gICAgICAgICAgICAgICAgLnJhbmdlKFswLDUwXSkKICAgICAgICAgIC8vICAgICAgICAgICAgICAgIC5kb21haW4oWzAsdHJlZURhdGFbb3B0cy52YWx1ZV1dKTsKICAgICAgICAgIHZhciBsZWdlbmRUeHQgPSBjYXRMZWdlbmRCb3guc2VsZWN0QWxsKCJsZy50ZXh0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YShjYXRMZWdlbmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJ0ZXh0Iik7ICAgIAogICAgICAgICAgCiAgICAgICAgICAKICAgICAgICAgIHZhciBsZWdlbmRUeHRBdHRyID0gbGVnZW5kVHh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ4IiwgcmVjdFggKyBwYWRkaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQsaSkgeyByZXR1cm4gcmVjdFkgKyBkZWx0YVkqaX0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoInRzcGFuIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoImR5IiwgIjFlbSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KGZ1bmN0aW9uKGQpIHtyZXR1cm4gZC5zcGxpdCgiICIpWzBdO30pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1zaXplIiwgdGV4dFNpemUgKyJweCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1mYW1pbHkiLCAic2Fucy1zZXJpZiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC13ZWlnaHQiLCAiYm9sZCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoInRzcGFuIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSBkLnNlYXJjaCgiICIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnNsaWNlKGlkeCxkLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1zaXplIiwgdGV4dFNpemUgKyJweCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1mYW1pbHkiLCAic2Fucy1zZXJpZiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC13ZWlnaHQiLCAibm9ybWFsIik7CiAgICAgICAgICB2YXIgbWF4VGV4dFB4ID0gMDsKICAgICAgICAgIGNhdExlZ2VuZEJveC5zZWxlY3RBbGwoInRleHQiKS5lYWNoKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgbWF4VGV4dFB4ID0gTWF0aC5tYXgobWF4VGV4dFB4LCB0aGlzLmdldENvbXB1dGVkVGV4dExlbmd0aCgpKTsKICAgICAgICAgIH0pOwogICAgICAgICAgCiAgICAgICAgICByZWN0V2lkdGggPSBNYXRoLm1pbihtYXhSZWN0V2lkdGgsIG1heFRleHRQeCtwYWRkaW5nKjIpOwogICAgICAgICAgdmFyIGxlZ2VuZEJvcmRlciA9IGNhdExlZ2VuZEJveC5hcHBlbmQoInJlY3QiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigieCIsIHJlY3RYKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigieSIsIHJlY3RZKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCByZWN0V2lkdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCByZWN0SGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoInN0cm9rZS13aWR0aCIsIE1hdGgubWluKDEsIHRleHRTaXplLzEwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJzdHJva2UiLCJibGFjayIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZmlsbCIsInRyYW5zcGFyZW50Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgICB9Ki8KCiAgICAgICAgZnVuY3Rpb24gZ2V0Tm9kZUhlaWdodFJhdGlvKCkgewogICAgICAgICAgdmFyIG5SYXRpbyA9IDAuMDsKICAgICAgICAgIHZhciBtYXhSYXRpbyA9IDAuMDsKICAgICAgICAgIGlmICh0cmVlRGF0YVtvcHRzLmNoaWxkcmVuTmFtZV0pIHsKICAgICAgICAgICAgdmFyIGNvdW50ID0gdHJlZURhdGFbb3B0cy5jaGlsZHJlbk5hbWVdLmxlbmd0aDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgblJhdGlvID0gdHJlZURhdGFbb3B0cy5jaGlsZHJlbk5hbWVdW2ldW29wdHMudmFsdWVdL3RyZWVEYXRhW29wdHMudmFsdWVdOwogICAgICAgICAgICAgIGlmIChuUmF0aW8gPiBtYXhSYXRpbykgewogICAgICAgICAgICAgICAgbWF4UmF0aW8gPSBuUmF0aW87CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbWF4UmF0aW87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIEEgcmVjdXJzaXZlIGhlbHBlciBmdW5jdGlvbiBmb3IgcGVyZm9ybWluZyBzb21lIHNldHVwIGJ5IHdhbGtpbmcgdGhyb3VnaCBhbGwgbm9kZXMKICAgICAgICBmdW5jdGlvbiB2aXNpdChwYXJlbnQsIHZpc2l0Rm4sIGNoaWxkcmVuRm4pIHsKICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybjsKICAgIAogICAgICAgICAgICB2aXNpdEZuKHBhcmVudCk7CiAgICAKICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gY2hpbGRyZW5GbihwYXJlbnQpOwogICAgICAgICAgICBpZiAoY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIHZhciBjb3VudCA9IGNoaWxkcmVuLmxlbmd0aDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZpc2l0KGNoaWxkcmVuW2ldLCB2aXNpdEZuLCBjaGlsZHJlbkZuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgCiAgICAgICAgLy8gQ2FsbCB2aXNpdCBmdW5jdGlvbiB0byBlc3RhYmxpc2ggbWF4TGFiZWxMZW5ndGgKICAgICAgICB2YXIgbWVhbkxhYmVsTGVuZ3RoID0gMC4wOwogICAgICAgIHZpc2l0KHRyZWVEYXRhLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgIHRvdGFsTm9kZXMrKzsKICAgICAgICAgICAgbWF4TGFiZWxMZW5ndGggPSBvcHRzLm1heExhYmVsTGVuZ3RoIHx8IE1hdGgubWF4KGRbb3B0cy5uYW1lXS5sZW5ndGgsIG1heExhYmVsTGVuZ3RoKTsKICAgICAgICAgICAgbWVhbkxhYmVsTGVuZ3RoID0gbWVhbkxhYmVsTGVuZ3RoICsgZFtvcHRzLm5hbWVdLmxlbmd0aDsKICAgICAgICB9LCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgIHJldHVybiBkW29wdHMuY2hpbGRyZW5OYW1lXSAmJiBkW29wdHMuY2hpbGRyZW5OYW1lXS5sZW5ndGggPiAwID8gZFtvcHRzLmNoaWxkcmVuTmFtZV0gOiBudWxsOwogICAgICAgIH0pOwogICAgICAgIG1lYW5MYWJlbExlbmd0aCA9IChtZWFuTGFiZWxMZW5ndGgvdG90YWxOb2RlcykgfCAwICsgMTsKICAgICAgICBtZWFuTGFiZWxMZW5ndGggPSBtZWFuTGFiZWxMZW5ndGggPiAxMCA/IG1lYW5MYWJlbExlbmd0aCA6IDEwOwogICAgICAgIAogICAgICAgIC8vIHNvcnQgdGhlIHRyZWUgYWNjb3JkaW5nIHRvIHRoZSBub2RlIG5hbWVzCiAgICAgICAgdHJlZS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgcmV0dXJuIGJbb3B0cy5uYW1lXS50b0xvd2VyQ2FzZSgpIDwgYVtvcHRzLm5hbWVdLnRvTG93ZXJDYXNlKCkgPyAxIDogLTE7CiAgICAgICAgfSk7CiAgICAgICAgem9vbUxpc3RlbmVyID0gZDMuYmVoYXZpb3Iuem9vbSgpLnNjYWxlRXh0ZW50KFswLjEsIDNdKS5vbigiem9vbSIsIHpvb20pOwogICAgICAgCiAgICAKICAgICAgICAvKmZ1bmN0aW9uIHpvb21MZWdlbmQoKSB7CiAgICAgICAgICAgIGxlZ2VuZEJveC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBkMy5ldmVudC50cmFuc2xhdGUgKyAiKXNjYWxlKCIgKyBkMy5ldmVudC5zY2FsZSArICIpIik7CiAgICAgICAgfQogICAgCiAgICAgICAgZnVuY3Rpb24gem9vbUNhdExlZ2VuZCgpIHsKICAgICAgICAgICAgY2F0TGVnZW5kQm94LmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIGQzLmV2ZW50LnRyYW5zbGF0ZSArICIpc2NhbGUoIiArIGQzLmV2ZW50LnNjYWxlICsgIikiKTsKICAgICAgICB9Ki8KICAgIAogICAgICAgIC8vIGRlZmluZSB0aGUgem9vbUxpc3RlbmVyIHdoaWNoIGNhbGxzIHRoZSB6b29tIGZ1bmN0aW9uIG9uIHRoZSAiem9vbSIgZXZlbnQgY29uc3RyYWluZWQgd2l0aGluIHRoZSBzY2FsZUV4dGVudHMKICAgICAgICAKICAgICAgICAvL3ZhciB6b29tTGlzdGVuZXJMZWdlbmQgPSBkMy5iZWhhdmlvci56b29tKCkuc2NhbGVFeHRlbnQoWzAuMSwgM10pLm9uKCJ6b29tIiwgem9vbUxlZ2VuZCk7CiAgICAgICAgLy92YXIgem9vbUxpc3RlbmVyQ2F0TGVnZW5kID0gZDMuYmVoYXZpb3Iuem9vbSgpLnNjYWxlRXh0ZW50KFswLjEsIDNdKS5vbigiem9vbSIsIHpvb21DYXRMZWdlbmQpOwogICAgICAgIC8qZnVuY3Rpb24gaW5pdGlhdGVEcmFnKGQsIGRvbU5vZGUpIHsKICAgICAgICAgICAgZHJhZ2dpbmdOb2RlID0gZDsKICAgICAgICAgICAgZDMuc2VsZWN0KGRvbU5vZGUpLnNlbGVjdCgnLmdob3N0Q2lyY2xlJykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpOwogICAgICAgICAgICBkMy5zZWxlY3RBbGwoJy5naG9zdENpcmNsZScpLmF0dHIoJ2NsYXNzJywgJ2dob3N0Q2lyY2xlIHNob3cnKTsKICAgICAgICAgICAgZDMuc2VsZWN0KGRvbU5vZGUpLmF0dHIoJ2NsYXNzJywgJ25vZGUgYWN0aXZlRHJhZycpOwogICAgCiAgICAgICAgICAgIHN2Z0dyb3VwLnNlbGVjdEFsbCgiZy5ub2RlIikuc29ydChmdW5jdGlvbihhLCBiKSB7IC8vIHNlbGVjdCB0aGUgcGFyZW50IGFuZCBzb3J0IHRoZSBwYXRoJ3MKICAgICAgICAgICAgICAgIGlmIChhW29wdHMuaWRdICE9IGRyYWdnaW5nTm9kZVtvcHRzLmlkXSkgcmV0dXJuIDE7IC8vIGEgaXMgbm90IHRoZSBob3ZlcmVkIGVsZW1lbnQsIHNlbmQgImEiIHRvIHRoZSBiYWNrCiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAtMTsgLy8gYSBpcyB0aGUgaG92ZXJlZCBlbGVtZW50LCBicmluZyAiYSIgdG8gdGhlIGZyb250CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBpZiBub2RlcyBoYXMgY2hpbGRyZW4sIHJlbW92ZSB0aGUgbGlua3MgYW5kIG5vZGVzCiAgICAgICAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGluayBwYXRocwogICAgICAgICAgICAgICAgbGlua3MgPSB0cmVlLmxpbmtzKG5vZGVzKTsKICAgICAgICAgICAgICAgIG5vZGVQYXRocyA9IHN2Z0dyb3VwLnNlbGVjdEFsbCgicGF0aC5saW5rIikKICAgICAgICAgICAgICAgICAgICAuZGF0YShsaW5rcywgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC50YXJnZXRbb3B0cy5pZF07CiAgICAgICAgICAgICAgICAgICAgfSkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAvLyByZW1vdmUgY2hpbGQgbm9kZXMKICAgICAgICAgICAgICAgIG5vZGVzRXhpdCA9IHN2Z0dyb3VwLnNlbGVjdEFsbCgiZy5ub2RlIikKICAgICAgICAgICAgICAgICAgICAuZGF0YShub2RlcywgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZFtvcHRzLmlkXTsKICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24oZCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZFtvcHRzLmlkXSA9PSBkcmFnZ2luZ05vZGVbb3B0cy5pZF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9KS5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIC8vIHJlbW92ZSBwYXJlbnQgbGluawogICAgICAgICAgICBwYXJlbnRMaW5rID0gdHJlZS5saW5rcyh0cmVlLm5vZGVzKGRyYWdnaW5nTm9kZS5wYXJlbnQpKTsKICAgICAgICAgICAgc3ZnR3JvdXAuc2VsZWN0QWxsKCdwYXRoLmxpbmsnKS5maWx0ZXIoZnVuY3Rpb24oZCwgaSkgewogICAgICAgICAgICAgICAgaWYgKGQudGFyZ2V0W29wdHMuaWRdID09IGRyYWdnaW5nTm9kZVtvcHRzLmlkXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KS5yZW1vdmUoKTsKICAgIAogICAgICAgICAgICBkcmFnU3RhcnRlZCA9IG51bGw7CiAgICAgICAgfSovCiAgICAKICAgICAgICAvL2Jhc2VTdmcuY2FsbCh6b29tTGlzdGVuZXIpOwogICAgCiAgLyogIAogICAgICAgIC8vIERlZmluZSB0aGUgZHJhZyBsaXN0ZW5lcnMgZm9yIGRyYWcvZHJvcCBiZWhhdmlvdXIgb2Ygbm9kZXMuCiAgICAgICAgZHJhZ0xpc3RlbmVyID0gZDMuYmVoYXZpb3IuZHJhZygpCiAgICAgICAgICAgIC5vbigiZHJhZ3N0YXJ0IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgaWYgKGQgPT0gcm9vdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRyYWdTdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIG5vZGVzID0gdHJlZS5ub2RlcyhkKTsKICAgICAgICAgICAgICAgIGQzLmV2ZW50LnNvdXJjZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgLy8gaXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBzdXBwcmVzcyB0aGUgbW91c2VvdmVyIGV2ZW50IG9uIHRoZSBub2RlIGJlaW5nIGRyYWdnZWQuIE90aGVyd2lzZSBpdCB3aWxsIGFic29yYiB0aGUgbW91c2VvdmVyIGV2ZW50IGFuZCB0aGUgdW5kZXJseWluZyBub2RlIHdpbGwgbm90IGRldGVjdCBpdCBkMy5zZWxlY3QodGhpcykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAub24oImRyYWciLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICBpZiAoZCA9PSByb290KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRyYWdTdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgZG9tTm9kZSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgaW5pdGlhdGVEcmFnKGQsIGRvbU5vZGUpOwogICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAvLyBnZXQgY29vcmRzIG9mIG1vdXNlRXZlbnQgcmVsYXRpdmUgdG8gc3ZnIGNvbnRhaW5lciB0byBhbGxvdyBmb3IgcGFubmluZwogICAgICAgICAgICAgICAgcmVsQ29vcmRzID0gZDMubW91c2Uoc3ZnR3JvdXBbMF1bMF0pOwogICAgICAgICAgICAgICAgaWYgKHJlbENvb3Jkc1swXSA8IHBhbkJvdW5kYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgcGFuVGltZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHBhbih0aGlzLCAnbGVmdCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxDb29yZHNbMF0gPiAod2lkdGggLSBwYW5Cb3VuZGFyeSkpIHsKICAgIAogICAgICAgICAgICAgICAgICAgIHBhblRpbWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBwYW4odGhpcywgJ3JpZ2h0Jyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlbENvb3Jkc1sxXSA8IHBhbkJvdW5kYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgcGFuVGltZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHBhbih0aGlzLCAndXAnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVsQ29vcmRzWzFdID4gKGhlaWdodCAtIHBhbkJvdW5kYXJ5KSkgewogICAgICAgICAgICAgICAgICAgIHBhblRpbWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBwYW4odGhpcywgJ2Rvd24nKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHBhblRpbWVyKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgIGQueDAgKz0gZDMuZXZlbnQuZHk7CiAgICAgICAgICAgICAgICBkLnkwICs9IGQzLmV2ZW50LmR4OwogICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBkMy5zZWxlY3QodGhpcyk7CiAgICAgICAgICAgICAgICBub2RlLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIGQueTAgKyAiLCIgKyBkLngwICsgIikiKTsKICAgICAgICAgICAgICAgIHVwZGF0ZVRlbXBDb25uZWN0b3IoKTsKICAgICAgICAgICAgfSkub24oImRyYWdlbmQiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICBpZiAoZCA9PSByb290KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZG9tTm9kZSA9IHRoaXM7CiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm93IHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBwYXJlbnQsIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgbmV3IGVsZW1lbnRzIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZHJhZ2dpbmdOb2RlLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGRyYWdnaW5nTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dpbmdOb2RlLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGVjdGVkTm9kZS5jaGlsZHJlbiAhPT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHNlbGVjdGVkTm9kZS5fY2hpbGRyZW4gIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZWN0ZWROb2RlLmNoaWxkcmVuICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWROb2RlLmNoaWxkcmVuLnB1c2goZHJhZ2dpbmdOb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTm9kZS5fY2hpbGRyZW4ucHVzaChkcmFnZ2luZ05vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWROb2RlLmNoaWxkcmVuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTm9kZS5jaGlsZHJlbi5wdXNoKGRyYWdnaW5nTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBub2RlIGJlaW5nIGFkZGVkIHRvIGlzIGV4cGFuZGVkIHNvIHVzZXIgY2FuIHNlZSBhZGRlZCBub2RlIGlzIGNvcnJlY3RseSBtb3ZlZAogICAgICAgICAgICAgICAgICAgIGV4cGFuZChzZWxlY3RlZE5vZGUpOwogICAgICAgICAgICAgICAgICAgIHNvcnRUcmVlKCk7CiAgICAgICAgICAgICAgICAgICAgZW5kRHJhZygpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlbmREcmFnKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgCiAgICAgICAgZnVuY3Rpb24gZW5kRHJhZygpIHsKICAgICAgICAgICAgc2VsZWN0ZWROb2RlID0gbnVsbDsKICAgICAgICAgICAgZDMuc2VsZWN0QWxsKCcuZ2hvc3RDaXJjbGUnKS5hdHRyKCdjbGFzcycsICdnaG9zdENpcmNsZScpOwogICAgICAgICAgICBkMy5zZWxlY3QoZG9tTm9kZSkuYXR0cignY2xhc3MnLCAnbm9kZScpOwogICAgICAgICAgICAvLyBub3cgcmVzdG9yZSB0aGUgbW91c2VvdmVyIGV2ZW50IG9yIHdlIHdvbid0IGJlIGFibGUgdG8gZHJhZyBhIDJuZCB0aW1lCiAgICAgICAgICAgIGQzLnNlbGVjdChkb21Ob2RlKS5zZWxlY3QoJy5naG9zdENpcmNsZScpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJycpOwogICAgICAgICAgICB1cGRhdGVUZW1wQ29ubmVjdG9yKCk7CiAgICAgICAgICAgIGlmIChkcmFnZ2luZ05vZGUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHVwZGF0ZShyb290KTsKICAgICAgICAgICAgICAgIGNlbnRlck5vZGUoZHJhZ2dpbmdOb2RlKTsKICAgICAgICAgICAgICAgIGRyYWdnaW5nTm9kZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgKi8KICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBjb2xsYXBzaW5nIGFuZCBleHBhbmRpbmcgbm9kZXMuCiAgICAKICAgICAgICAvKmZ1bmN0aW9uIGNvbGxhcHNlKGQpIHsKICAgICAgICAgICAgaWYgKGRbb3B0cy5jaGlsZHJlbk5hbWVdKSB7CiAgICAgICAgICAgICAgICBkLl9jaGlsZHJlbiA9IGRbb3B0cy5jaGlsZHJlbk5hbWVdOwogICAgICAgICAgICAgICAgZC5fY2hpbGRyZW4uZm9yRWFjaChjb2xsYXBzZSk7CiAgICAgICAgICAgICAgICBkW29wdHMuY2hpbGRyZW5OYW1lXSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKICAgICAgICBmdW5jdGlvbiBleHBhbmQoZCkgewogICAgICAgICAgICBpZiAoZC5fY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGRbb3B0cy5jaGlsZHJlbk5hbWVdID0gZC5fY2hpbGRyZW47CiAgICAgICAgICAgICAgICBkW29wdHMuY2hpbGRyZW5OYW1lXS5mb3JFYWNoKGV4cGFuZCk7CiAgICAgICAgICAgICAgICBkLl9jaGlsZHJlbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKICAgICAgICB2YXIgb3ZlckNpcmNsZSA9IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgc2VsZWN0ZWROb2RlID0gZDsKICAgICAgICAgICAgdXBkYXRlVGVtcENvbm5lY3RvcigpOwogICAgICAgIH07CiAgICAgICAgdmFyIG91dENpcmNsZSA9IGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgc2VsZWN0ZWROb2RlID0gbnVsbDsKICAgICAgICAgICAgdXBkYXRlVGVtcENvbm5lY3RvcigpOwogICAgICAgIH07CiAgICAKICAgICAgICAvLyBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIHRlbXBvcmFyeSBjb25uZWN0b3IgaW5kaWNhdGluZyBkcmFnZ2luZyBhZmZpbGlhdGlvbgogICAgICAgIHZhciB1cGRhdGVUZW1wQ29ubmVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBkYXRhID0gW107CiAgICAgICAgICAgIGlmIChkcmFnZ2luZ05vZGUgIT09IG51bGwgJiYgc2VsZWN0ZWROb2RlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIGZsaXAgdGhlIHNvdXJjZSBjb29yZGluYXRlcyBzaW5jZSB3ZSBkaWQgdGhpcyBmb3IgdGhlIGV4aXN0aW5nIGNvbm5lY3RvcnMgb24gdGhlIG9yaWdpbmFsIHRyZWUKICAgICAgICAgICAgICAgIGRhdGEgPSBbewogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogewogICAgICAgICAgICAgICAgICAgICAgICB4OiBzZWxlY3RlZE5vZGUueTAsCiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHNlbGVjdGVkTm9kZS54MAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGRyYWdnaW5nTm9kZS55MCwKICAgICAgICAgICAgICAgICAgICAgICAgeTogZHJhZ2dpbmdOb2RlLngwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGxpbmsgPSBzdmdHcm91cC5zZWxlY3RBbGwoIi50ZW1wbGluayIpLmRhdGEoZGF0YSk7CiAgICAKICAgICAgICAgICAgbGluay5lbnRlcigpLmFwcGVuZCgicGF0aCIpCiAgICAgICAgICAgICAgICAuYXR0cigiY2xhc3MiLCAidGVtcGxpbmsiKQogICAgICAgICAgICAgICAgLmF0dHIoImQiLCBkMy5zdmcuZGlhZ29uYWwoKSkKICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7CiAgICAKICAgICAgICAgICAgbGluay5hdHRyKCJkIiwgZDMuc3ZnLmRpYWdvbmFsKCkpOwogICAgCiAgICAgICAgICAgIGxpbmsuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy8gRnVuY3Rpb24gdG8gY2VudGVyIG5vZGUgd2hlbiBjbGlja2VkL2Ryb3BwZWQgc28gbm9kZSBkb2Vzbid0IGdldCBsb3N0IHdoZW4gY29sbGFwc2luZy9tb3Zpbmcgd2l0aCBsYXJnZSBhbW91bnQgb2YgY2hpbGRyZW4uCiAgICAgICAgZnVuY3Rpb24gY2VudGVyTm9kZShzb3VyY2UpIHsKICAgICAgICAgICAgdmFyIHNjYWxlID0gem9vbUxpc3RlbmVyLnNjYWxlKCk7CiAgICAgICAgICAgIHZhciB0cmFucyA9IHpvb21MaXN0ZW5lci50cmFuc2xhdGUoKTsKICAgICAgICAgICAgdmFyIHQgPSBkMy50cmFuc2Zvcm0oc3ZnR3JvdXAuYXR0cigidHJhbnNmb3JtIikpLAogICAgICAgICAgICAgICAgeCA9IHQudHJhbnNsYXRlWzBdLAogICAgICAgICAgICAgICAgeSA9IHQudHJhbnNsYXRlWzFdOwogICAgICAgICAgICB2YXIgY2VudGVyaW5nID0gc3ZnR3JvdXAudHJhbnNpdGlvbigpCiAgICAgICAgICAgICAgICAuZHVyYXRpb24oZHVyYXRpb24pCiAgICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgKHgpICsgIiwiICsgKHkpICsgIilzY2FsZSgiICsgc2NhbGUgKyAiKSIpCiAgICAgICAgICAgICAgICAuZWFjaCgiZW5kIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHRyZWVEaW0gPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAgICAgICAgIHggPSAod2lkdGgvMiAtIHRyZWVEaW0ud2lkdGgvMikgLSB0cmVlRGltLmxlZnQgKyB4OwogICAgICAgICAgICAgICAgICAgIHkgPSAoaGVpZ2h0LzIgLSB0cmVlRGltLmhlaWdodC8yKSAtIHRyZWVEaW0udG9wICsgeTsKICAgICAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpCiAgICAgICAgICAgICAgICAgICAgLmR1cmF0aW9uKDQwMCkKICAgICAgICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgeCArICIsIiArIHkgKyAiKXNjYWxlKCIgKyBzY2FsZSArICIpIik7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgem9vbUxpc3RlbmVyLnNjYWxlKHNjYWxlKTsKICAgICAgICAgICAgICAgICAgICB6b29tTGlzdGVuZXIudHJhbnNsYXRlKFt4LCB5XSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy94ID0gLXNvdXJjZS55MDsKICAgICAgICAgICAgLy95ID0gLXNvdXJjZS54MDsKICAgICAgICAgICAgLy94ID0geCAqIHNjYWxlICsgKCBzb3VyY2Vbb3B0cy5uYW1lXSAhPT0gcm9vdFtvcHRzLm5hbWVdID8gIHdpZHRoIC8gMiA6IHdpZHRoIC8gNCApOwogICAgICAgICAgICAvL2NlbnRlcmluZy50cmFuc2l0aW9uKCkuZHVyYXRpb24oMjAwKS5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyB4ICsgIiwiICsgeSArICIpc2NhbGUoIiArIHNjYWxlICsgIikiKTsKICAgICAgICB9Ki8KCiAgICAgICAgLy8gRnVuY3Rpb24gdG8gY2VudGVyIG5vZGUgd2hlbiBjbGlja2VkL2Ryb3BwZWQgc28gbm9kZSBkb2Vzbid0IGdldCBsb3N0IHdoZW4gY29sbGFwc2luZy9tb3Zpbmcgd2l0aCBsYXJnZSBhbW91bnQgb2YgY2hpbGRyZW4uCiAgICAgICAgZnVuY3Rpb24gY2VudGVyTm9kZUZpdChzb3VyY2UpIHsKCiAgICAgICAgICAgIGlmIChpbml0KSB7CiAgICAgICAgICAgICAgICBzY2FsZSA9IHpvb21MaXN0ZW5lci5zY2FsZSgpOwogICAgICAgICAgICAgICAgbmV3U2NhbGUgPSBzY2FsZTsKICAgICAgICAgICAgICAgIHggPSAtc291cmNlLnkwICogc2NhbGUgKyB3aWR0aCAvIDQ7CiAgICAgICAgICAgICAgICB5ID0gLXNvdXJjZS54MCAqIHNjYWxlICsgaGVpZ2h0IC8gMjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN2Z1RyYW5zID0gZDMudHJhbnNmb3JtKHN2Z0dyb3VwLmF0dHIoInRyYW5zZm9ybSIpKTsKICAgICAgICAgICAgICAgIHNjYWxlID0gc3ZnVHJhbnMuc2NhbGVbMF07CiAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IHNjYWxlOwogICAgICAgICAgICAgICAgeCA9IHN2Z1RyYW5zLnRyYW5zbGF0ZVswXTsKICAgICAgICAgICAgICAgIHkgPSBzdmdUcmFucy50cmFuc2xhdGVbMV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGNlbnRlcmluZyA9IHN2Z0dyb3VwLnRyYW5zaXRpb24oKQogICAgICAgICAgICAgICAgLmR1cmF0aW9uKGR1cmF0aW9uKQogICAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHggKyAiLCIgKyB5ICsgIilzY2FsZSgiICsgc2NhbGUgKyAiKSIpCiAgICAgICAgICAgICAgICAuZWFjaCgiZW5kIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHRyZWVEaW0gPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAgICAgICAgIHhzY2FsZSA9ICh3aWR0aCAtIHRyZWVNYXJnaW5zLmxlZnQgLSB0cmVlTWFyZ2lucy5yaWdodCAtIDIwKS8odHJlZURpbS53aWR0aC9zY2FsZSk7CiAgICAgICAgICAgICAgICAgICAgeXNjYWxlID0gKGhlaWdodCAtIHRyZWVNYXJnaW5zLnRvcCAtIHRyZWVNYXJnaW5zLmJvdHRvbSAtIDEwKS8odHJlZURpbS5oZWlnaHQvc2NhbGUpOwogICAgICAgICAgICAgICAgICAgIG5ld1NjYWxlID0gTWF0aC5taW4oeHNjYWxlLCB5c2NhbGUsIDMpOwogICAgICAgICAgICAgICAgICAgIC8qaWYgKHRyZWVEaW0ud2lkdGggPCB3aWR0aCAtIHRyZWVNYXJnaW5zLmxlZnQgLSB0cmVlTWFyZ2lucy5yaWdodCAtIDIwIHx8IAogICAgICAgICAgICAgICAgICAgICAgICB0cmVlRGltLmhlaWdodCA8IGhlaWdodCAtIHRyZWVNYXJnaW5zLnRvcCAtIHRyZWVNYXJnaW5zLmJvdHRvbSAtIDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHhzY2FsZSA9ICh3aWR0aCAtIHRyZWVNYXJnaW5zLmxlZnQgLSB0cmVlTWFyZ2lucy5yaWdodCAtIDIwKS8odHJlZURpbS53aWR0aC9zY2FsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHlzY2FsZSA9IChoZWlnaHQgLSB0cmVlTWFyZ2lucy50b3AgLSB0cmVlTWFyZ2lucy5ib3R0b20gLSAxMCkvKHRyZWVEaW0uaGVpZ2h0L3NjYWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2NhbGUgPSB4c2NhbGUgPiB5c2NhbGUgPyB5c2NhbGUgOiB4c2NhbGU7CiAgICAgICAgICAgICAgICAgICAgfSovCiAgICAgICAgICAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHggKyAiLCIgKyB5ICsgIilzY2FsZSgiICsgbmV3U2NhbGUgKyAiKSIpOwogICAgICAgICAgICAgICAgICAgIG5ld1RyZWVEaW0gPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAgICAgICAgIHRyZWVEaW0gPSBuZXdUcmVlRGltOwogICAgICAgICAgICAgICAgICAgIC8vdmFyIHgxID0gKHdpZHRoLzIgLSB0cmVlRGltLndpZHRoLzIgLyBzY2FsZSAqIG5ld1NjYWxlKSAtICh0cmVlRGltLmxlZnQgLSAodHJlZURpbS53aWR0aCAvIHNjYWxlICogbmV3U2NhbGUgLSB0cmVlRGltLndpZHRoKS8yICkgKyB4OwogICAgICAgICAgICAgICAgICAgIC8vdmFyIHkxID0gKGhlaWdodC8yIC0gdHJlZURpbS5oZWlnaHQvMiAvIHNjYWxlICogbmV3U2NhbGUpIC0gKHRyZWVEaW0udG9wIC0gKHRyZWVEaW0uaGVpZ2h0IC8gc2NhbGUgKiBuZXdTY2FsZSAtIHRyZWVEaW0uaGVpZ2h0KS8yICkgKyB5OwogICAgICAgICAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyB4ICsgIiwiICsgeSArICIpc2NhbGUoIiArIHNjYWxlICsgIikiKTsKICAgICAgICAgICAgICAgICAgICB4ID0gKHdpZHRoLzIgLSBuZXdUcmVlRGltLndpZHRoLzIgKSAtIG5ld1RyZWVEaW0ubGVmdCArIHg7CiAgICAgICAgICAgICAgICAgICAgeSA9IChoZWlnaHQvMiAtIG5ld1RyZWVEaW0uaGVpZ2h0LzIgKSAtIG5ld1RyZWVEaW0udG9wICsgeTsKICAgICAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpCiAgICAgICAgICAgICAgICAgICAgLmR1cmF0aW9uKGR1cmF0aW9uKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyB4ICsgIiwiICsgeSArICIpc2NhbGUoIiArIG5ld1NjYWxlICsgIikiKTsKICAgICAgICAgICAgICAgICAgICB6b29tTGlzdGVuZXIuc2NhbGUobmV3U2NhbGUpOwogICAgICAgICAgICAgICAgICAgIHpvb21MaXN0ZW5lci50cmFuc2xhdGUoW3gsIHldKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvL3ggPSAtc291cmNlLnkwOwogICAgICAgICAgICAvL3kgPSAtc291cmNlLngwOwogICAgICAgICAgICAvL3ggPSB4ICogc2NhbGUgKyAoIHNvdXJjZVtvcHRzLm5hbWVdICE9PSByb290W29wdHMubmFtZV0gPyAgd2lkdGggLyAyIDogd2lkdGggLyA0ICk7CiAgICAgICAgICAgIC8vY2VudGVyaW5nLnRyYW5zaXRpb24oKS5kdXJhdGlvbigyMDApLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHggKyAiLCIgKyB5ICsgIilzY2FsZSgiICsgc2NhbGUgKyAiKSIpOwogICAgICAgIH0KCiAgICAgICAgLy8gVG9nZ2xlIGNoaWxkcmVuIGZ1bmN0aW9uCiAgICAgICAgZnVuY3Rpb24gdG9nZ2xlQ2hpbGRyZW4oZCkgewogICAgICAgICAgICBpZiAoZFtvcHRzLmNoaWxkcmVuTmFtZV0pIHsKICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gZFtvcHRzLmNoaWxkcmVuTmFtZV07CiAgICAgICAgICAgICAgICBkW29wdHMuY2hpbGRyZW5OYW1lXSA9IG51bGw7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZC5fY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGRbb3B0cy5jaGlsZHJlbk5hbWVdID0gZC5fY2hpbGRyZW47CiAgICAgICAgICAgICAgICBkLl9jaGlsZHJlbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgfQogICAgCiAgICAgICAgLy8gVG9nZ2xlIGNoaWxkcmVuIG9uIGNsaWNrLgogICAgCiAgICAgICAgZnVuY3Rpb24gY2xpY2soZCkgewogICAgICAgICAgICBpZiAoZDMuZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuOyAvLyBjbGljayBzdXBwcmVzc2VkCiAgICAgICAgICAgIGQgPSB0b2dnbGVDaGlsZHJlbihkKTsKICAgICAgICAgICAgdXBkYXRlKGQpOwogICAgICAgICAgICAvL2NlbnRlck5vZGUoZCk7CiAgICAgICAgICAgIGNlbnRlck5vZGVGaXQoZCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIGNsaWNrVGV4dChkKSB7CiAgICAgICAgICAgIGlmIChkMy5ldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47IC8vIGNsaWNrIHN1cHByZXNzZWQKICAgICAgICAgICAgZC5oaWRkZW4gPSB0cnVlOwogICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoImRpc3BsYXkiLCAibm9uZSIpOwogICAgICAgICAgICBzdmdHcm91cC5zZWxlY3QoIiNiZ3QiICsgdGhpcy5pZC5zdWJzdHJpbmcoMSkpLnN0eWxlKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gIiNjIiArIHRoaXMuaWQuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICBzdmdHcm91cC5zZWxlY3Qoc2VsZWN0b3IpLnN0eWxlKCJkaXNwbGF5IiwgImlubGluZSIpOwogICAgICAgICAgICBzdmdHcm91cC5zZWxlY3QoIiNiZ2MiICsgdGhpcy5pZC5zdWJzdHJpbmcoMSkpLnN0eWxlKCJkaXNwbGF5IiwgImlubGluZSIpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBmdW5jdGlvbiBjbGlja0hpZGRlblRleHQoZCkgewogICAgICAgICAgICBpZiAoZDMuZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuOyAvLyBjbGljayBzdXBwcmVzc2VkCiAgICAgICAgICAgIGQuaGlkZGVuID0gZmFsc2U7CiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgIHN2Z0dyb3VwLnNlbGVjdCgiI2JnYyIgKyB0aGlzLmlkLnN1YnN0cmluZygxKSkuc3R5bGUoImRpc3BsYXkiLCAibm9uZSIpOwogICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSAiI3QiICsgdGhpcy5pZC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgIHN2Z0dyb3VwLnNlbGVjdChzZWxlY3Rvcikuc3R5bGUoImRpc3BsYXkiLCAiaW5saW5lIik7CiAgICAgICAgICAgIHN2Z0dyb3VwLnNlbGVjdCgiI2JndCIgKyB0aGlzLmlkLnN1YnN0cmluZygxKSkuc3R5bGUoImRpc3BsYXkiLCAiaW5saW5lIik7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIG1vdXNlT3Zlck5vZGUoZCwgZWwsIHNlbCkgewogICAgICAgICAgICB2YXIgdGlwUmVjdCA9IHNlbC5zZWxlY3QoIiNub2RlUmVjdCIgKyBkW29wdHMuaWRdKTsKICAgICAgICAgICAgdmFyIHRpcE5vZGUgPSBzZWwuc2VsZWN0KCIjbm9kZSIgKyBkW29wdHMuaWRdKTsKICAgICAgICAgICAgdmFyIHRoaXNUaXAgPSB0aXAuc2hvdyhkLCB0aXBSZWN0KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciB4ID0gTnVtYmVyKHNlbC5zZWxlY3QoIiNub2RlUmVjdCIgKyBkW29wdHMuaWRdKS5hdHRyKCJ4IikpLAogICAgICAgICAgICAgICAgeSA9IE51bWJlcihzZWwuc2VsZWN0KCIjbm9kZVJlY3QiICsgZFtvcHRzLmlkXSkuYXR0cigieSIpKSwKICAgICAgICAgICAgICAgIHcgPSBOdW1iZXIoc2VsLnNlbGVjdCgiI25vZGVSZWN0IiArIGRbb3B0cy5pZF0pLmF0dHIoIndpZHRoIikpLAogICAgICAgICAgICAgICAgaCA9IE51bWJlcihzZWwuc2VsZWN0KCIjbm9kZVJlY3QiICsgZFtvcHRzLmlkXSkuYXR0cigiaGVpZ2h0IikpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gaGVpZ2h0IG9mIHRoZSB0aXAKICAgICAgICAgICAgdmFyIHRpcEhlaWdodCA9IHBhcnNlRmxvYXQodGhpc1RpcC5zdHlsZSgiaGVpZ2h0IikpOwogICAgICAgICAgICAvLyB3aWR0aCBvZiB0aGUgdGlwCiAgICAgICAgICAgIHZhciB0aXBXaWR0aCA9IHBhcnNlRmxvYXQodGhpc1RpcC5zdHlsZSgid2lkdGgiKSk7CiAgICAgICAgICAgIHZhciBjbGllbnRSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIC8vIHNvdXRod2FyZCBhbmQgbm9ydGh3YXJkIHRpcCB0b3AgeSBwb3NpdGlvbgogICAgICAgICAgICB2YXIgdGlwU291dGggPSBjbGllbnRSZWN0LmJvdHRvbSArIDU7CiAgICAgICAgICAgIHZhciB0aXBOb3J0aCA9IGNsaWVudFJlY3QudG9wIC0gNTsKICAgICAgICAgICAgdmFyIHRpcEVhc3QgPSBjbGllbnRSZWN0LnJpZ2h0ICsgNTsKICAgICAgICAgICAgdmFyIHRpcFdlc3QgPSBjbGllbnRSZWN0LmxlZnQgLSA1OwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRpcE5vcnRoIC0gdGlwSGVpZ2h0ID49IDApIHsKICAgICAgICAgICAgICAgIC8vIG5vcnRod2FyZCB0aXAKICAgICAgICAgICAgICAgIHRoaXNUaXAgPSB0aGlzVGlwLmRpcmVjdGlvbigibiIpLm9mZnNldChbLTEwLDBdKS5zaG93KGQsIHRpcFJlY3QpOwogICAgICAgICAgICAgICAgZDMuc2VsZWN0KCIjbGl0dGxlVHJpYW5nbGUiKQogICAgICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgIm5vcnRoVGlwIikKICAgICAgICAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJ2aXNpYmxlIikKICAgICAgICAgICAgICAgIC5zdHlsZSgidG9wIiwgKGNsaWVudFJlY3QudG9wIC0gMTIuNSkgKyAicHgiKQogICAgICAgICAgICAgICAgLnN0eWxlKCJsZWZ0IiwgKGNsaWVudFJlY3QubGVmdCArIGNsaWVudFJlY3Qud2lkdGgvMiAtIDUpICsgInB4Iik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHRoaXNUaXAuc3R5bGUoImxlZnQiKSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1RpcC5zdHlsZSgibGVmdCIsICI1cHgiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VGbG9hdCh0aGlzVGlwLnN0eWxlKCJsZWZ0IikpICsgdGlwV2lkdGggPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIHRoaXNUaXAuc3R5bGUoImxlZnQiLCAod2lkdGggLSA1IC0gdGlwV2lkdGgpICsgInB4Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfSBlbHNlIGlmIChoZWlnaHQgLSB0aXBTb3V0aCA+PSB0aXBIZWlnaHQpIHsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpc1RpcCA9IHRoaXNUaXAuZGlyZWN0aW9uKCJzIikub2Zmc2V0KFsxMCwwXSkuc2hvdyhkLCB0aXBSZWN0KTsKICAgICAgICAgICAgICAgIGQzLnNlbGVjdCgiI2xpdHRsZVRyaWFuZ2xlIikKICAgICAgICAgICAgICAgIC5hdHRyKCJjbGFzcyIsICJzb3V0aFRpcCIpCiAgICAgICAgICAgICAgICAuc3R5bGUoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpCiAgICAgICAgICAgICAgICAuc3R5bGUoInRvcCIsIChjbGllbnRSZWN0LmJvdHRvbSArIDIuNSkgKyAicHgiKQogICAgICAgICAgICAgICAgLnN0eWxlKCJsZWZ0IiwgKGNsaWVudFJlY3QubGVmdCArIGNsaWVudFJlY3Qud2lkdGgvMiAtIDUpICsgInB4Iik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHRoaXNUaXAuc3R5bGUoImxlZnQiKSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1RpcC5zdHlsZSgibGVmdCIsICI1cHgiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VGbG9hdCh0aGlzVGlwLnN0eWxlKCJsZWZ0IikpICsgdGlwV2lkdGggPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIHRoaXNUaXAuc3R5bGUoImxlZnQiLCAod2lkdGggLSA1IC0gdGlwV2lkdGgpICsgInB4Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfSBlbHNlIGlmICh0aXBFYXN0ID49IHdpZHRoICogMC41KSB7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXNUaXAgPSB0aGlzVGlwLmRpcmVjdGlvbigidyIpLm9mZnNldChbMCwtMTBdKS5zaG93KGQsIHRpcFJlY3QpOwogICAgICAgICAgICAgICAgZDMuc2VsZWN0KCIjbGl0dGxlVHJpYW5nbGUiKQogICAgICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgIndlc3RUaXAiKQogICAgICAgICAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgInZpc2libGUiKQogICAgICAgICAgICAgICAgLnN0eWxlKCJ0b3AiLCAoY2xpZW50UmVjdC50b3AgKyBjbGllbnRSZWN0LmhlaWdodC8yIC0gNSkgKyAicHgiKQogICAgICAgICAgICAgICAgLnN0eWxlKCJsZWZ0IiwgKGNsaWVudFJlY3QubGVmdCAtIDEyLjUpICsgInB4Iik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHRoaXNUaXAuc3R5bGUoInRvcCIpKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzVGlwLnN0eWxlKCJ0b3AiLCAiNXB4Iik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlRmxvYXQodGhpc1RpcC5zdHlsZSgidG9wIikpICsgdGlwSGVpZ2h0ID4gaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1RpcC5zdHlsZSgidG9wIiwgKGhlaWdodCAtIHRpcEhlaWdodCAtIDUpICsgInB4Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXNUaXAgPSB0aGlzVGlwLmRpcmVjdGlvbigiZSIpLm9mZnNldChbMCwxMF0pLnNob3coZCwgdGlwUmVjdCk7CiAgICAgICAgICAgICAgICBkMy5zZWxlY3QoIiNsaXR0bGVUcmlhbmdsZSIpCiAgICAgICAgICAgICAgICAuYXR0cigiY2xhc3MiLCAiZWFzdFRpcCIpCiAgICAgICAgICAgICAgICAuc3R5bGUoInZpc2liaWxpdHkiLCAidmlzaWJsZSIpCiAgICAgICAgICAgICAgICAuc3R5bGUoInRvcCIsIChjbGllbnRSZWN0LnRvcCArIGNsaWVudFJlY3QuaGVpZ2h0LzIgLSA1KSArICJweCIpCiAgICAgICAgICAgICAgICAuc3R5bGUoImxlZnQiLCAoY2xpZW50UmVjdC5yaWdodCArIDIuNSkgKyAicHgiKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQodGhpc1RpcC5zdHlsZSgidG9wIikpIDwgMCkgewogICAgICAgICAgICAgICAgICAgIHRoaXNUaXAuc3R5bGUoInRvcCIsICI1cHgiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VGbG9hdCh0aGlzVGlwLnN0eWxlKCJ0b3AiKSkgKyB0aXBIZWlnaHQgPiBoZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzVGlwLnN0eWxlKCJ0b3AiLCAoaGVpZ2h0IC0gdGlwSGVpZ2h0IC0gNSkgKyAicHgiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZnVuY3Rpb24gbW91c2VPdXROb2RlKGQpIHsKICAgICAgICAgICAgZDMuc2VsZWN0KCIjbGl0dGxlVHJpYW5nbGUiKS5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKICAgICAgICAgICAgdGlwLmhpZGUoZCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzb3VyY2UpIHsKICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGhlaWdodCwgZnVuY3Rpb24gY291bnRzIHRvdGFsIGNoaWxkcmVuIG9mIHJvb3Qgbm9kZSBhbmQgc2V0cyB0cmVlIGhlaWdodCBhY2NvcmRpbmdseS4KICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgbGF5b3V0IGxvb2tpbmcgc3F1YXNoZWQgd2hlbiBuZXcgbm9kZXMgYXJlIG1hZGUgdmlzaWJsZSBvciBsb29raW5nIHNwYXJzZSB3aGVuIG5vZGVzIGFyZSByZW1vdmVkCiAgICAgICAgICAgIC8vIFRoaXMgbWFrZXMgdGhlIGxheW91dCBtb3JlIGNvbnNpc3RlbnQuCiAgICAgICAgICAgIHZhciBsZXZlbFdpZHRoID0gWzFdOwogICAgICAgICAgICB2YXIgY2hpbGRDb3VudCA9IGZ1bmN0aW9uKGxldmVsLCBuKSB7CiAgICAKICAgICAgICAgICAgICAgIGlmIChuW29wdHMuY2hpbGRyZW5OYW1lXSAmJiBuW29wdHMuY2hpbGRyZW5OYW1lXS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsV2lkdGgubGVuZ3RoIDw9IGxldmVsICsgMSkgbGV2ZWxXaWR0aC5wdXNoKDApOwogICAgCiAgICAgICAgICAgICAgICAgICAgbGV2ZWxXaWR0aFtsZXZlbCArIDFdICs9IG5bb3B0cy5jaGlsZHJlbk5hbWVdLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBuW29wdHMuY2hpbGRyZW5OYW1lXS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRDb3VudChsZXZlbCArIDEsIGQpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBjaGlsZENvdW50KDAsIHJvb3QpOwogICAgICAgICAgICBuZXdIZWlnaHQgPSBkMy5tYXgobGV2ZWxXaWR0aCkgKiAoIG9wdHMubm9kZUhlaWdodCB8fCAyNSApOyAvLyAyNSBwaXhlbHMgcGVyIGxpbmUKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChvcHRzLm1heExhYmVsTGVuZ3RoKSB7CiAgICAgICAgICAgICAgbmV3V2lkdGggPSBsZXZlbFdpZHRoLmxlbmd0aCAqIG1heExhYmVsTGVuZ3RoICogMTAgKyAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxXaWR0aC5sZW5ndGggKiAxMDsgLy8gbm9kZSBsaW5rIHNpemUgKyBub2RlIHJlY3Qgc2l6ZSAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbmV3V2lkdGggPSBsZXZlbFdpZHRoLmxlbmd0aCAqIG1lYW5MYWJlbExlbmd0aCAqIHB4UGVyQ2hhciArIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFdpZHRoLmxlbmd0aCAqIDEwOyAvLyBub2RlIGxpbmsgc2l6ZSArIG5vZGUgcmVjdCBzaXplCiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZHVtbXlSZWN0LmF0dHIoIndpZHRoIiwgbmV3V2lkdGggKyBtZWFuTGFiZWxMZW5ndGgqcHhQZXJDaGFyKS5hdHRyKCJoZWlnaHQiLCBuZXdIZWlnaHQpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gU2l6ZSBsaW5rIHdpZHRoIGFjY29yZGluZyB0byBuIGJhc2VkIG9uIHRvdGFsIG4KICAgICAgICAgICAgdmFyIHdzY2FsZSA9IGQzLnNjYWxlLmxpbmVhcigpCiAgICAgICAgICAgICAgICAucmFuZ2UoWzAsb3B0cy5ub2RlSGVpZ2h0L25vZGVIZWlnaHRSYXRpbyB8fCAyNV0pCiAgICAgICAgICAgICAgICAuZG9tYWluKFswLHRyZWVEYXRhW29wdHMudmFsdWVdXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICB0cmVlID0gdHJlZS5zaXplKFtuZXdIZWlnaHQsIG5ld1dpZHRoXSk7CiAgICAKICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IHRyZWUgbGF5b3V0LgogICAgICAgICAgICB2YXIgbm9kZXMgPSB0cmVlLm5vZGVzKHJvb3QpLnJldmVyc2UoKSwKICAgICAgICAgICAgICAgIGxpbmtzID0gdHJlZS5saW5rcyhub2Rlcyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgY29uc29sZS5sb2cobm9kZXMpOwogICAgCiAgICAgICAgICAgIC8vIFNldCB3aWR0aHMgYmV0d2VlbiBsZXZlbHMgYmFzZWQgb24gbWF4TGFiZWxMZW5ndGguCgoKICAgICAgICAgICAgaWYgKG9wdHMubWF4TGFiZWxMZW5ndGgpIHsKICAgICAgICAgICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIGQueSA9IChkLmRlcHRoICogKG1heExhYmVsTGVuZ3RoICogMTApICsgbm9kZVRleHREeCk7ICAvL21heExhYmVsTGVuZ3RoICogMTBweAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICBkLnkgPSAoZC5kZXB0aCAqIChtZWFuTGFiZWxMZW5ndGggKiBweFBlckNoYXIpICsgbm9kZVRleHREeCk7IC8vbWVhbkxhYmVsTGVuZ3RoICogNXB4CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZmxpcCB0aGUgdHJlZSB1cCBhbmQgZG93biB0byBjb25mb3JtIHdpdGggUiBwbG90CiAgICAgICAgICAgIHZhciBpbml0Tm9kZVggPSBub2Rlc1tub2Rlcy5sZW5ndGgtMV0ueDsKICAgICAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICBkLnggPSBpbml0Tm9kZVggKyBpbml0Tm9kZVggLSBkLng7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBub2Rlc+KApgogICAgICAgICAgICBub2RlID0gc3ZnR3JvdXAuc2VsZWN0QWxsKCJnLm5vZGUiKQogICAgICAgICAgICAgICAgLmRhdGEobm9kZXMsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZFtvcHRzLmlkXSB8fCAoZFtvcHRzLmlkXSA9ICsraSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgbm9kZVZpc2libGVXaWR0aCA9IG1lYW5MYWJlbExlbmd0aCpweFBlckNoYXItbm9kZVJlY3RXaWR0aDsKICAgICAgICAgICAgLy8gRW50ZXIgYW55IG5ldyBub2RlcyBhdCB0aGUgcGFyZW50J3MgcHJldmlvdXMgcG9zaXRpb24uCiAgICAgICAgICAgIHZhciBub2RlRW50ZXIgPSBub2RlLmVudGVyKCkuYXBwZW5kKCJnIikKICAgICAgICAgICAgICAgLy8gLmNhbGwoZHJhZ0xpc3RlbmVyKQogICAgICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgIm5vZGUiKQogICAgICAgICAgICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMCkKICAgICAgICAgICAgICAgIC5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuICJub2RlIiArIGRbb3B0cy5pZF07fSkKICAgICAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIChzb3VyY2UueTApICsgIiwiICsgc291cmNlLngwICsgIikiOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgbm9kZUVudGVyLmFwcGVuZCgicmVjdCIpCiAgICAgICAgICAgICAgICAuYXR0cigiY2xhc3MiLCAibm9kZVJlY3QiKQogICAgICAgICAgICAgICAgLmF0dHIoImlkIiwgZnVuY3Rpb24oZCxpKSB7IHJldHVybiAibm9kZVJlY3QiICsgZFtvcHRzLmlkXTt9KQogICAgICAgICAgICAgICAgLmF0dHIoIngiLCAtbm9kZVJlY3RXaWR0aC8yKQogICAgICAgICAgICAgICAgLmF0dHIoInkiLCBmdW5jdGlvbihkKXtyZXR1cm4gLXdzY2FsZShkW29wdHMudmFsdWVdKS8yfSkKICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbihkKXtyZXR1cm4gd3NjYWxlKGRbb3B0cy52YWx1ZV0pfSkKICAgICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIG5vZGVSZWN0V2lkdGgpCiAgICAgICAgICAgICAgICAub24oJ2NsaWNrJywgY2xpY2spCiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIG9wdHMudG9vbHRpcCA/IGZ1bmN0aW9uKGQpIHsgbW91c2VPdmVyTm9kZShkLHRoaXMsYmFzZVN2Zyk7fSA6IG51bGwpCiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3V0Jywgb3B0cy50b29sdGlwID8gZnVuY3Rpb24oZCkgeyBtb3VzZU91dE5vZGUoZCk7fSA6IG51bGwpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBucmVjdDEgPSBub2RlRW50ZXIuYXBwZW5kKCJyZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJjbGFzcyIsICJub2RlVGV4dEJnMSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigiaWQiLCBmdW5jdGlvbihkKSB7IHJldHVybiAiYmd0IiArIGRbb3B0cy5pZF07fSk7OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBucmVjdDIgPSBub2RlRW50ZXIuYXBwZW5kKCJyZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJjbGFzcyIsICJub2RlVGV4dEJnMiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigiaWQiLCBmdW5jdGlvbihkKSB7IHJldHVybiAiYmdjIiArIGRbb3B0cy5pZF07fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdmFyIG50eHQxID0gbm9kZUVudGVyLmFwcGVuZCgidGV4dCIpCiAgICAgICAgICAgICAgICAuYXR0cigiaWQiLCBmdW5jdGlvbihkKSB7IHJldHVybiAidCIgKyBkW29wdHMuaWRdO30pCiAgICAgICAgICAgICAgICAuYXR0cigieCIsIC1ub2RlVGV4dER4KQogICAgICAgICAgICAgICAgLmF0dHIoImR5IiwgIi4zNWVtIikKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdub2RlVGV4dDEnKSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsICJlbmQiKQogICAgICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkge3JldHVybiBkW29wdHMubmFtZV19KQogICAgICAgICAgICAgICAgLnN0eWxlKCJmaWxsLW9wYWNpdHkiLCAwKQogICAgICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRDb21wdXRlZFRleHRMZW5ndGgoKSArIG5vZGVUZXh0RHggLSBub2RlUmVjdFdpZHRoLzIgPiBub2RlVmlzaWJsZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbb3B0cy5uYW1lXS5zdWJzdHJpbmcoMCxtZWFuTGFiZWxMZW5ndGgtMykgKyAiLi4uIjsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZFtvcHRzLm5hbWVdOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCJjbGljayIsIGNsaWNrVGV4dCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgc3ZnR3JvdXAuc2VsZWN0QWxsKCIubm9kZSIpCiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIGQubm9kZVRleHRQb3MgPSB7IGxlZnQ6IGQueSAtIG5vZGVSZWN0V2lkdGgvMiAtIG5vZGVUZXh0RHggLSB0aGlzLmdldEJCb3goKS53aWR0aCwgCiAgICAgICAgICAgICAgICB0b3A6IGQueCAtIHRoaXMuZ2V0QkJveCgpLmhlaWdodC8yLCAKICAgICAgICAgICAgICAgIGJvdHRvbTogZC54ICsgdGhpcy5nZXRCQm94KCkuaGVpZ2h0LzJ9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBudHh0MiA9IG5vZGVFbnRlci5hcHBlbmQoInRleHQiKQogICAgICAgICAgICAgICAgLmF0dHIoImlkIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gImMiICsgZFtvcHRzLmlkXTt9KQogICAgICAgICAgICAgICAgLmF0dHIoIngiLCAtbm9kZVRleHREeCkKICAgICAgICAgICAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbm9kZVRleHQyJykKICAgICAgICAgICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsICJlbmQiKQogICAgICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkW29wdHMubmFtZV07CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCJjbGljayIsIGNsaWNrSGlkZGVuVGV4dCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBucmVjdDEuYXR0cigieCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtc3ZnR3JvdXAuc2VsZWN0KCIjdCIgKyBkW29wdHMuaWRdKVswXVswXS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKSAtIG5vZGVUZXh0RHg7CiAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJ5IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1zdmdHcm91cC5zZWxlY3QoIiN0IiArIGRbb3B0cy5pZF0pWzBdWzBdLmdldEJCb3goKS5oZWlnaHQvMjsKICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN2Z0dyb3VwLnNlbGVjdCgiI3QiICsgZFtvcHRzLmlkXSlbMF1bMF0uZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCk7CiAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ZnR3JvdXAuc2VsZWN0KCIjdCIgKyBkW29wdHMuaWRdKVswXVswXS5nZXRCQm94KCkuaGVpZ2h0OwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIG5yZWN0Mi5hdHRyKCJ4IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1zdmdHcm91cC5zZWxlY3QoIiNjIiArIGRbb3B0cy5pZF0pWzBdWzBdLmdldENvbXB1dGVkVGV4dExlbmd0aCgpIC0gbm9kZVRleHREeDsKICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgLmF0dHIoInkiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLXN2Z0dyb3VwLnNlbGVjdCgiI2MiICsgZFtvcHRzLmlkXSlbMF1bMF0uZ2V0QkJveCgpLmhlaWdodC8yOwogICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ZnR3JvdXAuc2VsZWN0KCIjYyIgKyBkW29wdHMuaWRdKVswXVswXS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKTsKICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdmdHcm91cC5zZWxlY3QoIiNjIiArIGRbb3B0cy5pZF0pWzBdWzBdLmdldEJCb3goKS5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgbnJlY3QxLmVhY2goZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgZC5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBudHh0MS5zdHlsZSgiZGlzcGxheSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIGlmIChkLmhpZGRlbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAibm9uZSI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW5saW5lIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBudHh0Mi5zdHlsZSgiZGlzcGxheSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIGlmIChkLmhpZGRlbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW5saW5lIjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJub25lIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBucmVjdDEuc3R5bGUoImRpc3BsYXkiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICBpZiAoZC5oaWRkZW4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5vbmUiOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gImlubGluZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAgICAgbnJlY3QyLnN0eWxlKCJkaXNwbGF5IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgaWYgKGQuaGlkZGVuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbmxpbmUiOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5vbmUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChvcHRzLnRlcm1pbmFsRGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIG5vZGVFbnRlci5hcHBlbmQoInRleHQiKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuICJ0ZXJtaW5hbCIgKyBkW29wdHMuaWRdO30pCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoIngiLCBub2RlVGV4dER4KQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ25vZGVUZXh0JykKICAgICAgICAgICAgICAgICAgICAuYXR0cigidGV4dC1hbmNob3IiLCAic3RhcnQiKQogICAgICAgICAgICAgICAgICAgIC50ZXh0KGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQudGVybWluYWxEZXNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCJmb250LXdlaWdodCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbb3B0cy5jaGlsZHJlbk5hbWVdIHx8IGQuX2NoaWxkcmVuID8gIm5vcm1hbCIgOiAiYm9sZCI7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzdmdHcm91cC5zZWxlY3RBbGwoIi5ub2RlIikKICAgICAgICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIChkW29wdHMuY2hpbGRyZW5OYW1lXSB8fCBkLl9jaGlsZHJlbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQudGVybVRleHRQb3MgPSB7IHJpZ2h0OiBkLnkgKyBub2RlUmVjdFdpZHRoLzIgKyBub2RlVGV4dER4ICsgdGhpcy5nZXRCQm94KCkud2lkdGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogZC54IC0gdGhpcy5nZXRCQm94KCkuaGVpZ2h0LzIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogZC54ICsgdGhpcy5nZXRCQm94KCkuaGVpZ2h0LzJ9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXNvbHZlQ29sbGlzaW9uKHJvb3QsIG5vZGVzKTsKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIC8vIHBoYW50b20gbm9kZSB0byBnaXZlIHVzIG1vdXNlb3ZlciBpbiBhIHJhZGl1cyBhcm91bmQgaXQKICAgICAgICAgICAgLypub2RlRW50ZXIuYXBwZW5kKCJjaXJjbGUiKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dob3N0Q2lyY2xlJykKICAgICAgICAgICAgICAgIC5hdHRyKCJyIiwgMzApCiAgICAgICAgICAgICAgICAuYXR0cigib3BhY2l0eSIsIDAuMikgLy8gY2hhbmdlIHRoaXMgdG8gemVybyB0byBoaWRlIHRoZSB0YXJnZXQgYXJlYQogICAgICAgICAgICAuc3R5bGUoImZpbGwiLCAicmVkIikKICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdtb3VzZW92ZXInKQogICAgICAgICAgICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICAgICAgICAgICAgb3ZlckNpcmNsZShub2RlKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAub24oIm1vdXNlb3V0IiwgZnVuY3Rpb24obm9kZSkgewogICAgICAgICAgICAgICAgICAgIG91dENpcmNsZShub2RlKTsKICAgICAgICAgICAgICAgIH0pOyovCiAgICAKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0ZXh0IHRvIHJlZmxlY3Qgd2hldGhlciBub2RlIGhhcyBjaGlsZHJlbiBvciBub3QuCiAgICAgICAgICAgIC8qbm9kZS5zZWxlY3QoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoIngiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbb3B0cy5jaGlsZHJlbk5hbWVdIHx8IGQuX2NoaWxkcmVuID8gLTEwIDogMTA7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkW29wdHMuY2hpbGRyZW5OYW1lXSB8fCBkLl9jaGlsZHJlbiA/ICJlbmQiIDogInN0YXJ0IjsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbb3B0cy5uYW1lXTsKICAgICAgICAgICAgICAgIH0pOyovCiAgICAKICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBjaXJjbGUgZmlsbCBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBoYXMgY2hpbGRyZW4gYW5kIGlzIGNvbGxhcHNlZAogICAgICAgICAgICBub2RlLnNlbGVjdCgiY2lyY2xlLm5vZGVDaXJjbGUiKQogICAgICAgICAgICAgICAgLmF0dHIoInIiLCA0LjUpCiAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuX2NoaWxkcmVuID8gImxpZ2h0c3RlZWxibHVlIiA6ICIjZmZmIjsKICAgICAgICAgICAgICAgIH0pOwogICAgCiAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gbm9kZXMgdG8gdGhlaXIgbmV3IHBvc2l0aW9uLgogICAgICAgICAgICB2YXIgbm9kZVVwZGF0ZSA9IG5vZGUudHJhbnNpdGlvbigpCiAgICAgICAgICAgICAgICAuZHVyYXRpb24oZHVyYXRpb24pCiAgICAgICAgICAgICAgICAuc3R5bGUoIm9wYWNpdHkiLCAxKQogICAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgZC55ICsgIiwiICsgZC54ICsgIikiOwogICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgLy8gRmFkZSB0aGUgdGV4dCBpbgogICAgICAgICAgICBub2RlVXBkYXRlLnNlbGVjdCgidGV4dCIpCiAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwtb3BhY2l0eSIsIDEpOwogICAgCiAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gZXhpdGluZyBub2RlcyB0byB0aGUgcGFyZW50J3MgbmV3IHBvc2l0aW9uLgogICAgICAgICAgICB2YXIgbm9kZUV4aXQgPSBub2RlLmV4aXQoKS50cmFuc2l0aW9uKCkKICAgICAgICAgICAgICAgIC5kdXJhdGlvbihkdXJhdGlvbikKICAgICAgICAgICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDApCiAgICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyAoc291cmNlLnkpICsgIiwiICsgc291cmNlLnggKyAiKSI7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLnJlbW92ZSgpOwogICAgCiAgICAgICAgICAgIG5vZGVFeGl0LnNlbGVjdCgiY2lyY2xlIikKICAgICAgICAgICAgICAgIC5hdHRyKCJyIiwgMCk7CiAgICAKICAgICAgICAgICAgbm9kZUV4aXQuc2VsZWN0KCJ0ZXh0IikKICAgICAgICAgICAgICAgIC5zdHlsZSgiZmlsbC1vcGFjaXR5IiwgMCk7CiAgICAKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBsaW5rc+KApgogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIHByb2JhYmx5IG5vdCB0aGUgYmVzdCB3YXkgb3IgcGxhY2UgdG8gZG8gdGhpcwogICAgICAgICAgICAvLyAgIGJ1dCBzdGFydCBoZXJlIHdpdGggYWRqdXN0aW5nIHBhdGhzIGhpZ2hlcgogICAgICAgICAgICAvLyAgIG9yIGxvd2VyIHRvIGRvIGxpa2UgYSBzdGFja2VkIGJhcgogICAgICAgICAgICAvLyAgIHNpbmNlIG91ciBzdHJva2Utd2lkdGggd2lsbCByZWZsZWN0IHNpemUKICAgICAgICAgICAgLy8gICBzaW1pbGFyIHRvIGEgU2Fua2V5CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyAxLiBzdGFydCBieSBuZXN0aW5nIG91ciBsaW5rIHBhdGhzIGJ5IHNvdXJjZQogICAgICAgICAgICB2YXIgbGlua19uZXN0ZWQgPSBkMy5uZXN0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAua2V5KGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuc291cmNlW29wdHMuaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVudHJpZXMobGlua3MpOwogICAgICAgICAgICAvLyAyLiBtYW51YWwgbWV0aG9kIGZvciBzdGFja2luZyBzaW5jZSBkMy5sYXlvdXQuc3RhY2sKICAgICAgICAgICAgLy8gICAgICBkaWQgbm90IHdvcmsKICAgICAgICAgICAgbGlua19uZXN0ZWQuZm9yRWFjaChmdW5jdGlvbihkKXsKICAgICAgICAgICAgICB2YXIgeXN0YWNreSA9IDA7CiAgICAgICAgICAgICAgZC52YWx1ZXMuZm9yRWFjaChmdW5jdGlvbihkZCl7CiAgICAgICAgICAgICAgICB2YXIgeXdpZHRoID0gd3NjYWxlKGRkLnRhcmdldFtvcHRzLnZhbHVlXSk7CiAgICAgICAgICAgICAgICB2YXIgc3Jjd2lkdGggPSB3c2NhbGUoZGQuc291cmNlW29wdHMudmFsdWVdKTsKICAgICAgICAgICAgICAgIHNyY3dpZHRoID0gaXNOYU4oc3Jjd2lkdGgpID8gd3NjYWxlLnJhbmdlKClbMV0vMiA6IHNyY3dpZHRoOwogICAgICAgICAgICAgICAgeXN0YWNreSA9IHlzdGFja3kgKyB5d2lkdGg7ICAgICAgICAKICAgICAgICAgICAgICAgIC8vIGRkLnggPSBkZC5zb3VyY2UueDsKICAgICAgICAgICAgICAgIGRkLnggPSBkZC5zb3VyY2UueCArIHNyY3dpZHRoLzIgLSB5c3RhY2t5ICsgeXdpZHRoLzI7CiAgICAgICAgICAgICAgICBkZC55ID0gZGQuc291cmNlLnk7CiAgICAgICAgICAgICAgICBkZC55c3RhY2t5ID0geXN0YWNreTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qICAKICAgICAgICAgICAgLy8gdXNlIGQzIHN0YWNrIGxheW91dAogICAgICAgICAgICB2YXIgc3RhY2sgPSBkMy5sYXlvdXQuc3RhY2soKQogICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXMoZnVuY3Rpb24oZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC52YWx1ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAueChmdW5jdGlvbihkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnNvdXJjZS54OwogICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgLnkoZnVuY3Rpb24oZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3NjYWxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGQudGFyZ2V0W29wdHMubmFtZV0ucmVwbGFjZSgvLipuID0gKFswLTldKikvLCIkMSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAub3V0KGZ1bmN0aW9uKGQseTAseSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnggPSBkLnNvdXJjZS54IC0geSArIDUwIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQueSA9IGQuc291cmNlLnk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnlzdGFjazAgPSB5MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQueXN0YWNreSA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGxpbmtfbmVzdGVkLmZvckVhY2goZnVuY3Rpb24oZCl7CiAgICAgICAgICAgICAgc3RhY2soZCk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICovCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgbGluayA9IHN2Z0dyb3VwLnNlbGVjdEFsbCgicGF0aC5saW5rIikKICAgICAgICAgICAgICAgIC5kYXRhKGxpbmtzLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkLnRhcmdldFtvcHRzLmlkXTsKICAgICAgICAgICAgICAgIH0pOwogICAgCiAgICAgICAgICAgIC8vIEVudGVyIGFueSBuZXcgbGlua3MgYXQgdGhlIHBhcmVudCdzIHByZXZpb3VzIHBvc2l0aW9uLgogICAgICAgICAgICBsaW5rLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwgImciKQogICAgICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgImxpbmsiKQogICAgICAgICAgICAgICAgLmF0dHIoImQiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHNvdXJjZS54MCwKICAgICAgICAgICAgICAgICAgICAgICAgeTogc291cmNlLnkwCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlhZ29uYWwoewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogbwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBsaW5rLnN0eWxlKCJzdHJva2Utd2lkdGgiLGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgIHJldHVybiB3c2NhbGUoIGQudGFyZ2V0W29wdHMudmFsdWVdICk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBsaW5rcyB0byB0aGVpciBuZXcgcG9zaXRpb24uCiAgICAgICAgICAgIGxpbmsudHJhbnNpdGlvbigpCiAgICAgICAgICAgICAgICAuZHVyYXRpb24oZHVyYXRpb24pCiAgICAgICAgICAgICAgICAuYXR0cigiZCIsIGRpYWdvbmFsKQogICAgICAgICAgICAgICAgLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgICAgICBpZihkLnRhcmdldC5jb2xvcil7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkLnRhcmdldC5jb2xvciA9PT0gJ3N0cmluZycpewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQzLmxhYihkLnRhcmdldC5jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkMy5oY2woCiAgICAgICAgICAgICAgICAgICAgICAgIGQudGFyZ2V0LmNvbG9yLmgsCiAgICAgICAgICAgICAgICAgICAgICAgIGQudGFyZ2V0LmNvbG9yLmMsCiAgICAgICAgICAgICAgICAgICAgICAgIGQudGFyZ2V0LmNvbG9yLmwKICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiI2NjYyI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gZXhpdGluZyBub2RlcyB0byB0aGUgcGFyZW50J3MgbmV3IHBvc2l0aW9uLgogICAgICAgICAgICBsaW5rLmV4aXQoKS50cmFuc2l0aW9uKCkKICAgICAgICAgICAgICAgIC5kdXJhdGlvbihkdXJhdGlvbikKICAgICAgICAgICAgICAgIC5hdHRyKCJkIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBvID0gewogICAgICAgICAgICAgICAgICAgICAgICB4OiBzb3VyY2UueCwKICAgICAgICAgICAgICAgICAgICAgICAgeTogc291cmNlLnkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkaWFnb25hbCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogbywKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBvCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLnJlbW92ZSgpOwogICAgCiAgICAgICAgICAgIC8vIFN0YXNoIHRoZSBvbGQgcG9zaXRpb25zIGZvciB0cmFuc2l0aW9uLgogICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIGQueDAgPSBkLng7CiAgICAgICAgICAgICAgICBkLnkwID0gZC55OwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZnVuY3Rpb24gdXBkYXRlTm9kZVBvcyAoc291cmNlLCB2YWx1ZSkgewogICAgICAgICAgICBzb3VyY2UueCA9IHNvdXJjZS54ICsgdmFsdWU7CiAgICAgICAgICAgIHNvdXJjZS5ub2RlVGV4dFBvcy5ib3R0b20gPSBzb3VyY2Uubm9kZVRleHRQb3MuYm90dG9tICsgdmFsdWU7CiAgICAgICAgICAgIHNvdXJjZS5ub2RlVGV4dFBvcy50b3AgPSBzb3VyY2Uubm9kZVRleHRQb3MudG9wICsgdmFsdWU7CiAgICAgICAgICAgIGlmICghIChzb3VyY2Vbb3B0cy5jaGlsZHJlbk5hbWVdIHx8IHNvdXJjZS5fY2hpbGRyZW4pKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UudGVybVRleHRQb3MuYm90dG9tID0gc291cmNlLnRlcm1UZXh0UG9zLmJvdHRvbSArIHZhbHVlOwogICAgICAgICAgICAgICAgc291cmNlLnRlcm1UZXh0UG9zLnRvcCA9IHNvdXJjZS50ZXJtVGV4dFBvcy50b3AgKyB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBmdW5jdGlvbiBtb3ZlUGFyZW50cyAoc291cmNlLCB2YWx1ZSkgewogICAgICAgICAgICAvLyBUT0RPIG1vdmUgdGhlIHBhcmVudCBub2RlcyBvZiB0aGUgY29sbGlkaW5nIG5vZGVzCiAgICAgICAgICAgIC8vIHNvIGZhciBvbmx5IGNoaWxkIG5vZGVzIGFyZSBtb3ZlZCwgd2hpY2ggY2FuIHBvdGVudGlhbGx5IGJlIGEgcHJvYmxlbQogICAgICAgIH0KICAgICAgICAKICAgICAgICBmdW5jdGlvbiBtb3ZlQ2hpbGRyZW4gKHNvdXJjZSwgdmFsdWUpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIHVwZGF0ZU5vZGVQb3Moc291cmNlLCB2YWx1ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoc291cmNlW29wdHMuY2hpbGRyZW5OYW1lXSkgewogICAgICAgICAgICAgICAgbW92ZUNoaWxkcmVuKHNvdXJjZVtvcHRzLmNoaWxkcmVuTmFtZV1bMF0sIHZhbHVlKTsKICAgICAgICAgICAgICAgIG1vdmVDaGlsZHJlbihzb3VyY2Vbb3B0cy5jaGlsZHJlbk5hbWVdWzFdLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZnVuY3Rpb24gbW92ZU5vZGVzIChzb3VyY2UsIHRhcmdldCkgewogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIGR4ID0gdGFyZ2V0LnRlcm1UZXh0UG9zLmJvdHRvbSAtIHRhcmdldC50ZXJtVGV4dFBvcy50b3A7CiAgICAgICAgICAgIGlmIChzb3VyY2UucGFyZW50LnggPCB0YXJnZXQucGFyZW50LngpIHsKICAgICAgICAgICAgICAgIC8vIHNvdXJjZSBpcyBvbiB0aGUgdG9wIGJyYW5jaCwgbW92ZSBzb3VyY2UgdXAKICAgICAgICAgICAgICAgIHVwZGF0ZU5vZGVQb3Moc291cmNlLCAtZHgpOwogICAgICAgICAgICAgICAgdXBkYXRlTm9kZVBvcyh0YXJnZXQsIGR4KTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2Vbb3B0cy5jaGlsZHJlbk5hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgbW92ZUNoaWxkcmVuKHNvdXJjZVtvcHRzLmNoaWxkcmVuTmFtZV1bMF0sIC1keCk7CiAgICAgICAgICAgICAgICAgICAgbW92ZUNoaWxkcmVuKHNvdXJjZVtvcHRzLmNoaWxkcmVuTmFtZV1bMV0sIC1keCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtb3ZlUGFyZW50cyhzb3VyY2UsIC1keCk7CiAgICAgICAgICAgICAgICBtb3ZlUGFyZW50cyh0YXJnZXQsIGR4KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHNvdXJjZSBpcyBvbiB0aGUgYm90dG9tIGJyYW5jaCwgbW92ZSBpdCBkb3duCiAgICAgICAgICAgICAgICB1cGRhdGVOb2RlUG9zKHNvdXJjZSwgZHgpOwogICAgICAgICAgICAgICAgdXBkYXRlTm9kZVBvcyh0YXJnZXQsIC1keCk7CiAgICAgICAgICAgICAgICBpZiAoc291cmNlW29wdHMuY2hpbGRyZW5OYW1lXSkgewogICAgICAgICAgICAgICAgICAgIG1vdmVDaGlsZHJlbihzb3VyY2Vbb3B0cy5jaGlsZHJlbk5hbWVdWzBdLCBkeCk7CiAgICAgICAgICAgICAgICAgICAgbW92ZUNoaWxkcmVuKHNvdXJjZVtvcHRzLmNoaWxkcmVuTmFtZV1bMV0sIGR4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1vdmVQYXJlbnRzKHNvdXJjZSwgZHgpOwogICAgICAgICAgICAgICAgbW92ZVBhcmVudHModGFyZ2V0LCAtZHgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIHNpbmNlIHRoZSB0cmVlIGlzIGRyYXduIGZyb20gbGVmdCB0byByaWdodCwgdGhlIHRhcmdldCBpcyBhbHdheXMgb24gdGhlIGxlZnQgCiAgICAgICAgLy8gb2YgdGhlIHNvdXJjZQogICAgICAgIGZ1bmN0aW9uIG5vZGVDb2xsaWRlIChzb3VyY2UsIHRhcmdldCkgewogICAgICAgICAgICBpZiAoc291cmNlLm5vZGVUZXh0UG9zLmxlZnQgPCB0YXJnZXQudGVybVRleHRQb3MucmlnaHQgJiYKICAgICAgICAgICAgICAgICgoc291cmNlLm5vZGVUZXh0UG9zLmJvdHRvbSA+PSB0YXJnZXQudGVybVRleHRQb3MudG9wICYmIAogICAgICAgICAgICAgICAgc291cmNlLm5vZGVUZXh0UG9zLnRvcCA8PSB0YXJnZXQudGVybVRleHRQb3MudG9wKSB8fCAKICAgICAgICAgICAgICAgIChzb3VyY2Uubm9kZVRleHRQb3MudG9wIDw9IHRhcmdldC50ZXJtVGV4dFBvcy5ib3R0b20gJiYgCiAgICAgICAgICAgICAgICBzb3VyY2Uubm9kZVRleHRQb3MuYm90dG9tID49IHRhcmdldC50ZXJtVGV4dFBvcy5ib3R0b20pKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZUNvbGxpc2lvbiAodGhpc05vZGUsIG5vZGVzQXJyYXkpIHsKICAgICAgICAgICAgLy8gcmVzb2x2ZSBjb2xsaXNpb24gZnJvbSByb290IG5vZGUgdG8gbGVhZiBub2RlCiAgICAgICAgICAgIC8vIGxhcmdlciBicmFuY2hlcyBhcmUgbW92ZWQgZmlyc3QKICAgICAgICAgICAgLy8gb25seSBjaGVjayBjb2xsaXNpb24gd2l0aCBsb3dlciBsZXZlbCBub2RlcwogICAgICAgICAgICAvLyBlbXBpcmljYWxseSBpZiByb290IGhhcyBkZXB0aCAxLCBvbmx5IG5vZGVzIHdpdGggZGVwdGggNCBvciBhYm92ZSAKICAgICAgICAgICAgLy8gd2lsbCBjb2xsaWRlIHdpdGggcHJldmlvdXMgbm9kZXMKICAgICAgICAgICAgaWYgKHRoaXNOb2RlLmRlcHRoID49IDIpIHsKICAgICAgICAgICAgICAgIC8vIGNvbGxpc2lvbiBpcyBvbmx5IHBvc3NpYmxlIHdpdGggbm9kZXMgaGF2aW5nIGRlcHRoIC0gMSBvZiBjdXJyZW50CiAgICAgICAgICAgICAgICAvLyBhbmQgdGhhdCBub2RlIG11c3QgYmUgYSB0ZXJtaW5hbCBub2RlCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzQXJyYXkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Tm9kZSA9IG5vZGVzQXJyYXlbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE5vZGUuZGVwdGggPT09IHRoaXNOb2RlLmRlcHRoIC0gMSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhKHRhcmdldE5vZGVbb3B0cy5jaGlsZHJlbk5hbWVdIHx8IHRhcmdldE5vZGUuX2NoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZUNvbGxpZGUodGhpc05vZGUsIHRhcmdldE5vZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIG5vZGVzIHRvIHRoZSBzaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlTm9kZXModGhpc05vZGUsIHRhcmdldE5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBvbmx5IHJ1biB0aGUgcmVjdXJzaW9uIHdoZW4gdGhlcmUgaXMgY2hpbGRyZW4KICAgICAgICAgICAgaWYgKHRoaXNOb2RlW29wdHMuY2hpbGRyZW5OYW1lXSkgewogICAgICAgICAgICAgICAgcmVzb2x2ZUNvbGxpc2lvbih0aGlzTm9kZVtvcHRzLmNoaWxkcmVuTmFtZV1bMF0sIG5vZGVzQXJyYXkpOwogICAgICAgICAgICAgICAgcmVzb2x2ZUNvbGxpc2lvbih0aGlzTm9kZVtvcHRzLmNoaWxkcmVuTmFtZV1bMV0sIG5vZGVzQXJyYXkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgCiAgICAgICAgLy8gQXBwZW5kIGEgZ3JvdXAgd2hpY2ggaG9sZHMgYWxsIG5vZGVzIGFuZCB3aGljaCB0aGUgem9vbSBMaXN0ZW5lciBjYW4gYWN0IHVwb24uCiAgICAgICAgc3ZnR3JvdXAgPSBiYXNlU3ZnLmNhbGwoem9vbUxpc3RlbmVyKQogICAgICAgICAgICAgICAgICAgIC5vbigiZGJsY2xpY2suem9vbSIsIG51bGwpCiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiZyIpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgInRyZWVHcm91cCIpOwogICAgICAgIAogICAgICAgIC8vIEFwcGVuZCBhIGR1bW15IHJlY3RhbmdsZSB3aGljaCBjYW4gYmUgdXNlZCB0byBtb3ZlIHRoZSB0cmVlCiAgICAgICAgLyp2YXIgZHVtbXlSZWN0ID0gc3ZnR3JvdXAuYXBwZW5kKCJyZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgd2lkdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBoZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ4IiwgLW1lYW5MYWJlbExlbmd0aCpweFBlckNoYXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ5IiwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoImlkIiwgImR1bW15UmVjdCIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiY3Vyc29yIiwgIm1vdmUiKQogICAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikKICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoImZpbGwiLCJub25lIik7ICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgCiAgICAgICAgLy8gaWYgdG9vbHRpcCB0aGVuIHNldCBpdCB1cAogICAgICAgIGlmKG9wdHMudG9vbHRpcCl7CiAgICAgICAgICAgIHN2Z0dyb3VwLmNhbGwodGlwKTsKICAgICAgICB9CiAgICAKICAgICAgICAvLyBEZWZpbmUgdGhlIHJvb3QKICAgICAgICByb290ID0gdHJlZURhdGE7CiAgICAgICAgcm9vdC54MCA9IGhlaWdodCAvIDI7CiAgICAgICAgcm9vdC55MCA9IDA7CiAgICAKICAgICAgICAvLyBMYXlvdXQgdGhlIHRyZWUgaW5pdGlhbGx5IGFuZCBjZW50ZXIgb24gdGhlIHJvb3Qgbm9kZS4KICAgICAgICB1cGRhdGUocm9vdCk7CiAgICAgICAgCiAgICAgICAgLy8gc2luY2Ugd2UgY2FuIG92ZXJyaWRlIG5vZGUgaGVpZ2h0IGFuZCBsYWJlbCBsZW5ndGggKHdpZHRoKQogICAgICAgIC8vIGlmIHpvb20gc2NhbGUgPT0gMSB0aGVuIGF1dG8gc2NhbGUgdG8gZml0IHRyZWUgaW4gY29udGFpbmVyCiAgICAgICAgdmFyIHRyZWVTaXplID0gdHJlZS5zaXplKCk7CiAgICAgICAgdmFyIGhlYWRMZW5ndGggPSBzdmdHcm91cC5zZWxlY3QoIiN0MSIpLm5vZGUoKS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKTsKICAgICAgICBoZWFkTGVuZ3RoID0gaGVhZExlbmd0aCA/IGhlYWRMZW5ndGggOiAwOwogICAgICAgIHZhciB0YWlsTGVuZ3RoID0gMDsKICAgICAgICBzdmdHcm91cC5zZWxlY3RBbGwoIi5ub2RlVGV4dCIpLmVhY2goZnVuY3Rpb24oZCkgewogICAgICAgICAgICB0YWlsTGVuZ3RoID0gTWF0aC5tYXgodGFpbExlbmd0aCwgdGhpcy5nZXRDb21wdXRlZFRleHRMZW5ndGgoKSk7CiAgICAgICAgfSk7CgogICAgICAgIGlmICh6b29tTGlzdGVuZXIuc2NhbGUoKSA9PSAxKSB7CiAgICAgICAgICAgIHhzY2FsZSA9ICh3aWR0aCAtIHRyZWVNYXJnaW5zLmxlZnQgLSB0cmVlTWFyZ2lucy5yaWdodCAtIGhlYWRMZW5ndGggLSB0YWlsTGVuZ3RoKS90cmVlU2l6ZVsxXTsKICAgICAgICAgICAgeXNjYWxlID0gKGhlaWdodCAtIHRyZWVNYXJnaW5zLnRvcCAtIHRyZWVNYXJnaW5zLmJvdHRvbSkvdHJlZVNpemVbMF07CiAgICAgICAgICAgIHNjYWxlID0geHNjYWxlID4geXNjYWxlID8geXNjYWxlIDogeHNjYWxlOwogICAgICAgICAgICB6b29tTGlzdGVuZXIuc2NhbGUoc2NhbGUpOwogICAgICAgIH0KCiAgICAgICAgLyppZiAoem9vbUxpc3RlbmVyLnNjYWxlKCkgPT0gMSkgewogICAgICAgICAgdmFyIHhzY2FsZSA9IGhlaWdodC90cmVlLnNpemUoKVswXSowLjg1LAogICAgICAgICAgICAgIHlzY2FsZSA9IHdpZHRoL3RyZWUuc2l6ZSgpWzFdKjAuNzU7CiAgICAgICAgICBpZiAoeHNjYWxlIDwgeXNjYWxlKSB7CiAgICAgICAgICAgIHpvb21MaXN0ZW5lci5zY2FsZSggeHNjYWxlICk7IAogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgem9vbUxpc3RlbmVyLnNjYWxlKCB5c2NhbGUgKTsgCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICB9Ki8KICAgICAgICBjZW50ZXJOb2RlRml0KHJvb3QpOwogICAgICAgIHByZXZXaWR0aCA9IHdpZHRoOwogICAgICAgIHByZXZIZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtpbml0ID0gZmFsc2U7fSwgZHVyYXRpb24qMS41KTsKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAvKmlmIChvcHRzLmNvbG9yTGVnZW5kKSB7CiAgICAgICAgICB2YXIgbGVnZW5kQm94ID0gYmFzZVN2Zy5hcHBlbmQoImciKQogICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJpZCIsICJjb2xvckxlZ2VuZCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCAibW92ZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGwoem9vbUxpc3RlbmVyTGVnZW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgIC5vbigiZGJsY2xpY2suem9vbSIsIG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ub24oIndoZWVsLnpvb20iLCBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgIC5vbigibW91c2Vtb3ZlLnpvb20iLCBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgIC5vbigidG91Y2hzdGFydC56b29tIiwgbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAvLy5vbigibW91c2V3aGVlbC56b29tIiwgbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAub24oIk1vek1vdXNlUGl4ZWxTY3JvbGwuem9vbSIsIG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiZyIpOwogICAgICAgICAgYXR0YWNoTGVnZW5kKCk7CiAgICAgICAgfSovCiAgICAgICAgCiAgICAgICAgLyppZiAob3B0cy5jYXRlZ29yeUxlZ2VuZCAmJiB0cmVlRGF0YS5jYXRlZ29yeUxlZ2VuZCkgewogICAgICAgICAgdmFyIGNhdExlZ2VuZEJveCA9IGJhc2VTdmcuYXBwZW5kKCJnIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJpZCIsICJjYXRMZWdlbmQiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiY3Vyc29yIiwgIm1vdmUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGwoem9vbUxpc3RlbmVyQ2F0TGVnZW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCJkYmxjbGljay56b29tIiwgbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLm9uKCJ3aGVlbC56b29tIiwgbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbigibW91c2Vtb3ZlLnpvb20iLCBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLCBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ub24oIm1vdXNld2hlZWwuem9vbSIsIG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAub24oIk1vek1vdXNlUGl4ZWxTY3JvbGwuem9vbSIsIG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJnIik7CiAgICAgICAgICBhdHRhY2hDYXRlZ29yeUxlZ2VuZCgpOyAgICAgICAgICAgICAgICAgCiAgICAgICAgfSovCiAgIAoKICAgIH0KICAgIAogICAgLy8gZ2V0dGVyL3NldHRlcgogICAgY2hhcnQuZGF0YSA9IGZ1bmN0aW9uKHYpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkYXRhOwogICAgICAgIGRhdGEgPSB2OwogICAgICAgIHJldHVybiBjaGFydDsKICAgIH07CgogICAgY2hhcnQub3B0cyA9IGZ1bmN0aW9uKHYpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcHRzOwogICAgICAgIG9wdHMgPSB2OwogICAgICAgIHJldHVybiBjaGFydDsKICAgIH07CiAgICAKICAgIGNoYXJ0LnJlc2l6ZSA9IGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgcmVzaXplQ2hhcnQoZWwpOwogICAgfTsKCiAgICBjaGFydC53aWR0aCA9IGZ1bmN0aW9uKHYpIHsKICAgICAgICAvLyB3aWR0aCBnZXR0ZXIvc2V0dGVyCiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gd2lkdGg7CiAgICAgICAgd2lkdGggPSB2OwogICAgICAgIHJldHVybiBjaGFydDsKICAgIH07CgogICAgLy8gaGVpZ2h0IGdldHRlci9zZXR0ZXIKICAgIGNoYXJ0LmhlaWdodCA9IGZ1bmN0aW9uKHYpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBoZWlnaHQ7CiAgICAgICAgaGVpZ2h0ID0gdjsKICAgICAgICByZXR1cm4gY2hhcnQ7CiAgICB9OwogICAgCiAgICByZXR1cm4gY2hhcnQ7Cn0KCgpIVE1MV2lkZ2V0cy53aWRnZXQoewoKICBuYW1lOiAncmh0bWxTYW5rZXlUcmVlJywKCiAgdHlwZTogJ291dHB1dCcsCgogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3LCBoKSB7CiAgICAKICAgICAgICB2YXIgd2lkdGgsCiAgICAgICAgICAgIGhlaWdodDsKICAgICAgICAgICAgCiAgICAgICAgd2lkdGggPSB3IDwgMjAwID8gMjAwIDogdzsKICAgICAgICBoZWlnaHQgPSBoIDwgMTAwID8gMTAwIDogaDsKCiAgICAgICAgZDMuc2VsZWN0KGVsKQogICAgICAgICAgICAuYXBwZW5kKCJzdmciKQogICAgICAgICAgICAuYXR0cigiY2xhc3MiLCAic3ZnLWNvbnRlbnQtcmVzcG9uc2l2ZSIpCiAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoKQogICAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgaGVpZ2h0KTsKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIFNhbmtleSgpLndpZHRoKHdpZHRoKS5oZWlnaHQoaGVpZ2h0KTsKCiAgfSwKCiAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgLy8gQVRUUklCVVRJT046ICBtdWNoIG9mIHRoaXMgSmF2YVNjcmlwdCBjb2RlCiAgICAvLyAgY2FtZSBmcm9tIGh0dHA6Ly9ibC5vY2tzLm9yZy9yb2JzY2htdWVja2VyLzBmMjlhMmM4NjdkY2IxYjQ0ZDE4CgogICAgICAgIGluc3RhbmNlID0gaW5zdGFuY2Uub3B0cyh4Lm9wdHMpOwogICAgICAgIGluc3RhbmNlID0gaW5zdGFuY2UuZGF0YSh4LmRhdGEpOwoKICAgICAgICBkMy5zZWxlY3QoZWwpLmNhbGwoaW5zdGFuY2UpOwoKICB9LAoKICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBpbnN0YW5jZSkgewogICAgICAKICAgICAgICBkMy5zZWxlY3QoZWwpLnNlbGVjdCgic3ZnIikKICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgd2lkdGgpCiAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBoZWlnaHQpOwoKICAgICAgICByZXR1cm4gaW5zdGFuY2Uud2lkdGgod2lkdGgpLmhlaWdodChoZWlnaHQpLnJlc2l6ZShlbCk7CiAgICAgICAgLy9kMy5zZWxlY3QoZWwpLnNlbGVjdCgic3ZnIikuYXR0cigidmlld0JveCIsICIwIDAgIiArIHdpZHRoICsgIiAiICsgaGVpZ2h0KTsKCiAgfQoKfSk7","message":"","warning":"","visible":"yes"},"secondsTaken":0.8540833,"updated":"2016-08-16T03:44:47.9758447Z","lastUpdatedMessage":null,"executedCode":"library(flipTrees)\ndata <- data.frame(preferredCola, Q28, gender, Age)\ncart <- CART(preferredCola ~ Q28 + gender + Age, data = data, weights = QCalibratedWeight, missing = formMissing, subset = QFilter, output = formOutput)","lastSavedCode":"library(flipTrees)\ndata <- data.frame(preferredCola, Q28, gender, Age)\ncart <- CART(preferredCola ~ Q28 + gender + Age, data = data, weights = QCalibratedWeight, missing = formMissing, subset = QFilter, output = formOutput)","highlightedCodeSpans":[{"start":38,"length":13,"index":0},{"start":53,"length":3,"index":0},{"start":58,"length":6,"index":0},{"start":66,"length":3,"index":1},{"start":84,"length":13,"index":0},{"start":100,"length":3,"index":0},{"start":106,"length":6,"index":0},{"start":115,"length":3,"index":1},{"start":143,"length":17,"index":6},{"start":172,"length":11,"index":4},{"start":194,"length":7,"index":6},{"start":212,"length":10,"index":4}],"tableTransformations":"<TabularTransformer>\r\n <TabularTransform type=\"Truncation\" truncationHeaderType=\"Column\" />\r\n <TabularTransform />\r\n</TabularTransformer>","tabularFilteringOptions":null,"hasGuiControls":true,"guiControls":{"Code":"form.setHeading('Classification And Regression Trees (CART)');\nform.dropBox({label: \"Outcome\", \n types:[\"Variable: Numeric, Date, Money, Categorical, OrderedCategorical\"], \n name: \"formOutcomeVariable\"})\nform.dropBox({label: \"Predictors\",\n types:[\"Variable: Numeric, Date, Money, Categorical, OrderedCategorical\"], \n name: \"formPredictorVariables\", \n multi:true})\nform.comboBox({label: \"Output\", \n alternatives: [\"Sankey\", \"Tree\", \"Text\"], \n name: \"formOutput\", default_value: \"Sankey\"})\nform.comboBox({label: \"Missing data\", \n alternatives: [\"Error if missing data\", \"Exclude cases with missing data\", \"Use partial data\", \"Imputation (replace missing values with estimates)\"], \n name: \"formMissing\", default_value: \"Use partial data\"})","JSError":null,"JSErrorDetails":null,"ControlDefinitionErrors":null,"InputValidationErrors":null,"Controls":[{"ItemGuid":"00000000-0000-0000-0000-000000000000","ControlName":null,"Type":"Heading","Label":null,"Value":null,"Allowed":null,"EmptyListMessage":null,"Multi":false,"Prompt":null,"ErrorMessage":null,"Invalid":null,"Required":false,"AllowedTypes":null,"MinInputs":0,"MaxInputs":0,"Height":0,"Duplicates":false,"Values":null,"CheckAlign":null,"Text":"Classification And Regression Trees (CART)","Increment":0.0,"Min":0.0,"Max":0.0,"Vertical":null},{"ItemGuid":"00000000-0000-0000-0000-000000000000","ControlName":"formOutcomeVariable","Type":"DropBox","Label":"Outcome","Value":"2883568c-c345-4ac3-a202-73fe2089b43e","Allowed":["c832d4c1-c275-4f4c-808f-b982960274d3","2883568c-c345-4ac3-a202-73fe2089b43e","96c8e091-ad28-4015-b351-3655117fa665","43323ac6-0ee3-4166-bd15-530b1258b52a","295986e8-2ae4-47df-ad6c-b6a0523d4772","39e268c4-cc16-4961-9fd1-f30fffe9a5c6","a508941f-43ee-4e3e-82ba-4bdf08e0691c","a502d02c-b3ba-49dc-8d39-1ad0950fc811","b11b5d46-cdaf-4981-9f21-c3ac742a3417","b8645631-0c32-4eeb-9259-13117f33c677","ae27744c-a183-49fa-b7c4-b3e337b67660","cef5b484-5120-44c5-bd5d-d5e57d1a7e8f","3324db46-273a-418e-8428-871417702cc1","a4298b7c-e12f-46fa-aa0b-3d7df090a911","51038f33-8b0d-4128-99bb-f4dd7e42a2f7","ff6eb646-1a1d-4527-a9bc-b7d8628f58ae","857654b7-6afb-49d3-bb81-ab3eca9cc8cf","6654a209-8ccc-4aba-b0d9-edc8e3a38f57","d03aedce-ee9e-47f5-bef2-c3e986bcc66d","9002b593-629c-41f4-8228-e9e43f62b3fb","0c8dd6b2-3879-49e2-827c-e18d062c2894","9c77bd9d-3114-4691-9d54-8dc0f8e8fc27","ca0f63cb-bec7-4a65-99ac-570d93ce0fd8","5a1ee160-49a0-4db0-8f79-65fc27acda34","f3383fb8-472c-451d-aa23-192bd2de6cee","08cacc70-e6e6-4140-bb0a-22febd6f724b","49e0b887-d402-48e4-a7c3-05e5932da79d","4e43b7b1-09f5-4e7a-ad2c-43193ef12f30","f63dd124-ad16-4d37-b0d2-669395b8ab66","56d59bd4-c218-41fc-a737-ba47aa851070","d1cebba7-4f15-43ba-ae76-8fef7722253b","3d36da7a-a54f-4922-ad24-ca56aeb87ea6","c7d2d625-050d-494b-a8ae-088b02f92d09","665a93f4-4da9-425d-b8a7-9f20fae3c1e4","5015fd06-f110-471a-9b09-03b5a1254193","c8bc1747-ff83-47cf-bf11-b621b98f35b5","65ac5e08-9783-42cc-8754-61fa80f00487","4afabd56-6abf-4f9b-8551-790b42932b3b","20bc3c1e-5b7e-42f2-bde2-687c375b8f8c","49f4426b-e647-4466-93f9-6822380398b8","775552e6-28cd-4b41-93c0-25ca698922e4","519a9d2f-3992-4173-b30a-d4678e8b4324","20af1d1b-6c12-407e-baa2-59aebae63565","70486e62-7fb9-405a-9848-48d41d20212d","002d1d1e-acdc-41f8-a3e4-23f751093b9e","f067ad19-e507-4b39-a1aa-85dc86a00c47","6be7a31a-7e31-4421-88de-096a5f5e82b6","9b02aed5-aef8-4801-be86-5263663ffca6","d56a4069-fedc-496f-b0a7-102cce4a0054","8a8adffb-b691-4743-a770-1c2d23f0add9","3af9ddb8-c395-473c-b4d3-9403ab84e04f","fb59af6c-4d73-4d71-8a91-b480f7f9e6f2","fbd16080-30e6-4167-b48c-1f14440d35b3","b497ee8c-121f-4a94-a535-6e51d01e91c2","41b1b714-a284-4c24-8caf-acf0ab9ef7b6","75770007-c072-4263-aa3b-affea59b1f3f","7ac8097e-3be6-4d07-a0d5-56b056769b7e","5f7a8e58-35ab-4e03-907f-803a0f3f225e","fb9632c4-6efc-4dfc-be16-4239bf7d4a43","7c6216a6-f3be-4e50-a17f-452b53ec9745","397ec7d3-3e85-4e2b-8e5e-054109f343c5","7a23ef60-8069-4fcf-83fd-d6cfecc338c0","190fb237-601a-4f29-8be5-f9e023e4175b","74cb1f28-b3f9-4e78-bc3d-a74a4e103b2f","aaa4b5db-3d3f-412e-a539-338935502b24","4dee2a86-b656-45d7-bda5-592f09315e1f","66e46d36-5282-4309-aa19-9cf255d4c44b","b433facc-9120-43c5-a836-4901543981bb","3f9cea83-f64f-4e5c-a461-58fe76b19572","fe54719d-8431-4424-8ace-4adea9112062","33481a34-442a-4d3a-876d-c1b7615c98f3","88651413-5aa5-4627-bebb-011e9a0bca7e","d6eed546-0833-462a-a417-297456d07d54","ef3e1c3c-85d9-4769-be97-32e699c210f6","3efe98cb-5d60-46e2-846f-59086787d9e3","06d83b20-45ce-477d-8b74-71be816d52af","b77cf471-9464-4c8a-855a-e062e9961c7b","a80f67cc-eae9-488e-bec8-d42b62e3ef52","4f145162-c033-49c1-a081-488e5d5b1cfb","4e43f935-069f-424c-b5b0-4d70bc1d2727","40faf27f-189e-4fd6-b77c-a471e293bb5c","d012c5c4-e424-40de-91b5-829e22ab1d8d","fc8222da-aaa6-4895-913c-c11d3770629a","069b1892-9271-41c0-9376-3f48ddece4da","1aa07585-9b7a-422b-b8ad-7d09426a3f3b","bd73ab14-d81e-4839-bdea-53fcd2b3274a","90a98416-e5da-4423-9127-6bbdf6dfaa4e","80c8afaf-81a9-4765-8dd7-183ecc869153","66ece02d-32cb-4957-8ecc-3b418862ac57","af375385-fcaf-402b-ad29-1550a732d219"],"EmptyListMessage":null,"Multi":false,"Prompt":"Select an input which is of type Variable (Numeric, Date, Money, Categorical or Orderedcategorical).","ErrorMessage":"Outcome: Outcome accepts only one input which is of type Variable (Numeric, Date, Money, Categorical or Orderedcategorical).","Invalid":null,"Required":true,"AllowedTypes":["Variable: Numeric, Date, Money, Categorical, OrderedCategorical"],"MinInputs":1,"MaxInputs":1,"Height":1,"Duplicates":false,"Values":null,"CheckAlign":null,"Text":null,"Increment":0.0,"Min":0.0,"Max":0.0,"Vertical":null},{"ItemGuid":"00000000-0000-0000-0000-000000000000","ControlName":"formPredictorVariables","Type":"DropBox","Label":"Predictors","Value":null,"Allowed":["c832d4c1-c275-4f4c-808f-b982960274d3","2883568c-c345-4ac3-a202-73fe2089b43e","96c8e091-ad28-4015-b351-3655117fa665","43323ac6-0ee3-4166-bd15-530b1258b52a","295986e8-2ae4-47df-ad6c-b6a0523d4772","39e268c4-cc16-4961-9fd1-f30fffe9a5c6","a508941f-43ee-4e3e-82ba-4bdf08e0691c","a502d02c-b3ba-49dc-8d39-1ad0950fc811","b11b5d46-cdaf-4981-9f21-c3ac742a3417","b8645631-0c32-4eeb-9259-13117f33c677","ae27744c-a183-49fa-b7c4-b3e337b67660","cef5b484-5120-44c5-bd5d-d5e57d1a7e8f","3324db46-273a-418e-8428-871417702cc1","a4298b7c-e12f-46fa-aa0b-3d7df090a911","51038f33-8b0d-4128-99bb-f4dd7e42a2f7","ff6eb646-1a1d-4527-a9bc-b7d8628f58ae","857654b7-6afb-49d3-bb81-ab3eca9cc8cf","6654a209-8ccc-4aba-b0d9-edc8e3a38f57","d03aedce-ee9e-47f5-bef2-c3e986bcc66d","9002b593-629c-41f4-8228-e9e43f62b3fb","0c8dd6b2-3879-49e2-827c-e18d062c2894","9c77bd9d-3114-4691-9d54-8dc0f8e8fc27","ca0f63cb-bec7-4a65-99ac-570d93ce0fd8","5a1ee160-49a0-4db0-8f79-65fc27acda34","f3383fb8-472c-451d-aa23-192bd2de6cee","08cacc70-e6e6-4140-bb0a-22febd6f724b","49e0b887-d402-48e4-a7c3-05e5932da79d","4e43b7b1-09f5-4e7a-ad2c-43193ef12f30","f63dd124-ad16-4d37-b0d2-669395b8ab66","56d59bd4-c218-41fc-a737-ba47aa851070","d1cebba7-4f15-43ba-ae76-8fef7722253b","3d36da7a-a54f-4922-ad24-ca56aeb87ea6","c7d2d625-050d-494b-a8ae-088b02f92d09","665a93f4-4da9-425d-b8a7-9f20fae3c1e4","5015fd06-f110-471a-9b09-03b5a1254193","c8bc1747-ff83-47cf-bf11-b621b98f35b5","65ac5e08-9783-42cc-8754-61fa80f00487","4afabd56-6abf-4f9b-8551-790b42932b3b","20bc3c1e-5b7e-42f2-bde2-687c375b8f8c","49f4426b-e647-4466-93f9-6822380398b8","775552e6-28cd-4b41-93c0-25ca698922e4","519a9d2f-3992-4173-b30a-d4678e8b4324","20af1d1b-6c12-407e-baa2-59aebae63565","70486e62-7fb9-405a-9848-48d41d20212d","002d1d1e-acdc-41f8-a3e4-23f751093b9e","f067ad19-e507-4b39-a1aa-85dc86a00c47","6be7a31a-7e31-4421-88de-096a5f5e82b6","9b02aed5-aef8-4801-be86-5263663ffca6","d56a4069-fedc-496f-b0a7-102cce4a0054","8a8adffb-b691-4743-a770-1c2d23f0add9","3af9ddb8-c395-473c-b4d3-9403ab84e04f","fb59af6c-4d73-4d71-8a91-b480f7f9e6f2","fbd16080-30e6-4167-b48c-1f14440d35b3","b497ee8c-121f-4a94-a535-6e51d01e91c2","41b1b714-a284-4c24-8caf-acf0ab9ef7b6","75770007-c072-4263-aa3b-affea59b1f3f","7ac8097e-3be6-4d07-a0d5-56b056769b7e","5f7a8e58-35ab-4e03-907f-803a0f3f225e","fb9632c4-6efc-4dfc-be16-4239bf7d4a43","7c6216a6-f3be-4e50-a17f-452b53ec9745","397ec7d3-3e85-4e2b-8e5e-054109f343c5","7a23ef60-8069-4fcf-83fd-d6cfecc338c0","190fb237-601a-4f29-8be5-f9e023e4175b","74cb1f28-b3f9-4e78-bc3d-a74a4e103b2f","aaa4b5db-3d3f-412e-a539-338935502b24","4dee2a86-b656-45d7-bda5-592f09315e1f","66e46d36-5282-4309-aa19-9cf255d4c44b","b433facc-9120-43c5-a836-4901543981bb","3f9cea83-f64f-4e5c-a461-58fe76b19572","fe54719d-8431-4424-8ace-4adea9112062","33481a34-442a-4d3a-876d-c1b7615c98f3","88651413-5aa5-4627-bebb-011e9a0bca7e","d6eed546-0833-462a-a417-297456d07d54","ef3e1c3c-85d9-4769-be97-32e699c210f6","3efe98cb-5d60-46e2-846f-59086787d9e3","06d83b20-45ce-477d-8b74-71be816d52af","b77cf471-9464-4c8a-855a-e062e9961c7b","a80f67cc-eae9-488e-bec8-d42b62e3ef52","4f145162-c033-49c1-a081-488e5d5b1cfb","4e43f935-069f-424c-b5b0-4d70bc1d2727","40faf27f-189e-4fd6-b77c-a471e293bb5c","d012c5c4-e424-40de-91b5-829e22ab1d8d","fc8222da-aaa6-4895-913c-c11d3770629a","069b1892-9271-41c0-9376-3f48ddece4da","1aa07585-9b7a-422b-b8ad-7d09426a3f3b","bd73ab14-d81e-4839-bdea-53fcd2b3274a","90a98416-e5da-4423-9127-6bbdf6dfaa4e","80c8afaf-81a9-4765-8dd7-183ecc869153","66ece02d-32cb-4957-8ecc-3b418862ac57","af375385-fcaf-402b-ad29-1550a732d219"],"EmptyListMessage":null,"Multi":true,"Prompt":"Select at least one input which is of type Variable (Numeric, Date, Money, Categorical or Orderedcategorical).","ErrorMessage":"Predictors: Predictors accepts only inputs which are of type Variable (Numeric, Date, Money, Categorical or Orderedcategorical).","Invalid":null,"Required":true,"AllowedTypes":["Variable: Numeric, Date, Money, Categorical, OrderedCategorical"],"MinInputs":1,"MaxInputs":2147483647,"Height":4,"Duplicates":false,"Values":["cef5b484-5120-44c5-bd5d-d5e57d1a7e8f","b8645631-0c32-4eeb-9259-13117f33c677","c832d4c1-c275-4f4c-808f-b982960274d3"],"CheckAlign":null,"Text":null,"Increment":0.0,"Min":0.0,"Max":0.0,"Vertical":null},{"ItemGuid":"00000000-0000-0000-0000-000000000000","ControlName":"formOutput","Type":"ComboBox","Label":"Output","Value":"Sankey","Allowed":null,"EmptyListMessage":null,"Multi":false,"Prompt":null,"ErrorMessage":null,"Invalid":null,"Required":true,"AllowedTypes":null,"MinInputs":0,"MaxInputs":0,"Height":0,"Duplicates":false,"Values":["Sankey","Tree","Text"],"CheckAlign":null,"Text":null,"Increment":0.0,"Min":0.0,"Max":0.0,"Vertical":null},{"ItemGuid":"00000000-0000-0000-0000-000000000000","ControlName":"formMissing","Type":"ComboBox","Label":"Missing data","Value":"Use partial data","Allowed":null,"EmptyListMessage":null,"Multi":false,"Prompt":null,"ErrorMessage":null,"Invalid":null,"Required":true,"AllowedTypes":null,"MinInputs":0,"MaxInputs":0,"Height":0,"Duplicates":false,"Values":["Error if missing data","Exclude cases with missing data","Use partial data","Imputation (replace missing values with estimates)"],"CheckAlign":null,"Text":null,"Increment":0.0,"Min":0.0,"Max":0.0,"Vertical":null},{"ItemGuid":"00000000-0000-0000-0000-000000000000","ControlName":null,"Type":null,"Label":null,"Value":null,"Allowed":null,"EmptyListMessage":null,"Multi":false,"Prompt":null,"ErrorMessage":null,"Invalid":null,"Required":false,"AllowedTypes":null,"MinInputs":0,"MaxInputs":0,"Height":0,"Duplicates":false,"Values":null,"CheckAlign":null,"Text":null,"Increment":0.0,"Min":0.0,"Max":0.0,"Vertical":true}]},"calculating":"Idle","showDebug":false,"layout":"OutputOnly","size":{"Width":782,"Height":549},"vSplit":0.25,"hSplit":0.45,"updateWarnings":true,"updateMode":"Automatic","warnSlow":true,"outputSize":{"Width":782,"Height":549},"Options":{"debugconsole":false,"codeposition":"OutputOnly","size":{"width":782,"height":549},"splitH":0.45,"splitV":0.25,"update warnings":true,"updating":"Automatic","warn slow":true}}