8.1 sec in total
989 ms
4.3 sec
2.9 sec
Visit blog.revolutionanalytics.com now to see the best up-to-date Blog Revolutionanalytics content for United States and also check out these interesting facts you probably never knew about blog.revolutionanalytics.com
Learn about using open source R for big data analysis, predictive modeling, data science
Visit blog.revolutionanalytics.comWe analyzed Blog.revolutionanalytics.com page load time and found that the first response time was 989 ms and then it took 7.2 sec to load all DOM resources and completely render a web page. This is a poor result, as 80% of websites can load faster.
blog.revolutionanalytics.com performance score
name
value
score
weighting
Value4.0 s
24/100
10%
Value4.0 s
49/100
25%
Value26.6 s
0/100
10%
Value1,800 ms
10/100
30%
Value0.003
100/100
15%
Value11.9 s
17/100
10%
989 ms
132 ms
23 ms
60 ms
62 ms
Our browser made a total of 63 requests to load all elements on the main page. We found that 5% of them (3 requests) were addressed to the original Blog.revolutionanalytics.com, 19% (12 requests) were made to Revolution-computing.typepad.com and 17% (11 requests) were made to Static.typepad.com. The less responsive or slowest element that took the longest time to load (1.4 sec) belongs to the original domain Blog.revolutionanalytics.com.
Page size can be reduced by 843.8 kB (32%)
2.6 MB
1.8 MB
In fact, the total size of Blog.revolutionanalytics.com main page is 2.6 MB. This result falls beyond the top 1M of websites and identifies a large and not optimized web page that may take ages to load. 65% of websites need less resources to load. Images take 1.9 MB which makes up the majority of the site volume.
Potential reduce by 99.6 kB
HTML content can be minified and compressed by a website’s server. The most efficient way is to compress content using GZIP which reduces data amount travelling through the network between server and browser. HTML code on this page is well minified. It is highly recommended that content of this web page should be compressed using GZIP, as it can save up to 99.6 kB or 82% of the original size.
Potential reduce by 318.1 kB
Image size optimization can help to speed up a website loading time. The chart above shows the difference between the size before and after optimization. Obviously, Blog Revolutionanalytics needs image optimization as it can save up to 318.1 kB or 17% of the original volume. The most popular and efficient tools for JPEG and PNG image optimization are Jpegoptim and PNG Crush.
Potential reduce by 158.7 kB
It’s better to minify JavaScript in order to improve website performance. The diagram shows the current total size of all JavaScript files against the prospective JavaScript size after its minification and compression. It is highly recommended that all JavaScript files should be compressed and minified as it can save up to 158.7 kB or 58% of the original size.
Potential reduce by 267.5 kB
CSS files minification is very important to reduce a web page rendering time. The faster CSS files can load, the earlier a page can be rendered. Blog.revolutionanalytics.com needs all CSS files to be minified and compressed as it can save up to 267.5 kB or 83% of the original size.
Number of requests can be reduced by 27 (52%)
52
25
The browser has sent 52 CSS, Javascripts, AJAX and image requests in order to completely render the main page of Blog Revolutionanalytics. We recommend that multiple CSS and JavaScript files should be merged into one by each type, as it can help reduce assets requests from 11 to 1 for JavaScripts and from 11 to 1 for CSS and as a result speed up the page load time.
blog.revolutionanalytics.com
989 ms
styles.css
132 ms
thumbnail-gallery-min.js
23 ms
recommend.js
60 ms
f9665e15b74b393bd2d6.js
62 ms
print.css
207 ms
munchkin.js
17 ms
quant.js
6 ms
base-weblog.css
235 ms
bxslider.css
159 ms
widgets.css
171 ms
recentpostsfancy.css
162 ms
tipjar.css
155 ms
theme-asterisk_white_wide.css
258 ms
theme-asterisk.css
166 ms
ga.js
58 ms
blog-header.jpg
23 ms
6a010534b1db25970b01b7c81c073f970b-800wi
198 ms
6a0105360ba1c6970c01b8d1a1f814970c-450wi
368 ms
t_small-b.png
205 ms
gprofile_button-16.png
22 ms
blogtrottr-button-91x17px.gif
551 ms
6a010534b1db25970b01bb08c0b6cd970d-800wi
621 ms
6a010534b1db25970b01b8d1a60b99970c-800wi
608 ms
6a010534b1db25970b01bb08c0c22b970d-800wi
553 ms
6a010534b1db25970b01b7c81c055b970b-800wi
550 ms
6a010534b1db25970b01b8d1a4d670970c-800wi
553 ms
6a010534b1db25970b01b8d1a3a567970c-800wi
234 ms
6a010534b1db25970b01bb08be59bf970d-800wi
551 ms
6a010534b1db25970b01b8d1a40341970c-800wi
1086 ms
6a010534b1db25970b01bb08bea7f5970d-800wi
701 ms
6a010534b1db25970b01b8d19eecfc970c-800wi
699 ms
6a010534b1db25970b01bb08bdb2c9970d-800wi
629 ms
body-bg.png
17 ms
body-bg-wt.png
18 ms
-8mzWkuOxz8
185 ms
GTrVjWj5y7Q
200 ms
embed-7346e9a735aaeeacede51d1efaad6208f95d9edbc222155878bfddc2da28fa87.css
109 ms
bivn_threejs_dense.html
1420 ms
VipqzK6_LBU
161 ms
__utm.gif
16 ms
munchkin.js
49 ms
__utm.gif
44 ms
stats
82 ms
__utm.gif
31 ms
pixel;r=434072528;a=p-fcYWUmj5YbYKM;tags=typepad.extended;fpan=1;fpa=P0-1594868788-1456855374630;ns=0;ce=1;cm=;je=0;sr=1024x768x32;enc=n;dst=0;et=1456855374629;tzo=-180;ref=;url=http%3A%2F%2Fblog.revolutionanalytics.com%2F;ogl=
34 ms
beacon.js
29 ms
www-embed-player-vflQrT_sR.css
83 ms
www-embed-player.js
111 ms
collect
73 ms
visitWebPage
175 ms
IHNpemVPYmouZ2V0V2lkdGgoKSA6IGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IDAgJiYgc2l6ZS5oID09PSAwKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gbGFzdFNpemUudyAmJiBzaXplLmggPT09IGxhc3RTaXplLmgpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7CiAgICAgICAgICAgIGJpbmRpbmcucmVzaXplKGVsLCBzaXplLncsIHNpemUuaCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgICBiaW5kaW5nLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGluaXRSZXN1bHQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgc3RhdGljUmVuZGVyKCk7CiAgICB9LCBmYWxzZSk7CiAgfSBlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgewogICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgewogICAgICAgIGRvY3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICBzdGF0aWNSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CiAgfQoKCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsKICAgIC8vIElmIG5vIGtleSwgZGVmYXVsdCB0byB0aGUgZmlyc3QgaXRlbQogICAgaWYgKHR5cGVvZihrZXkpID09PSAidW5kZWZpbmVkIikKICAgICAga2V5ID0gMTsKCiAgICB2YXIgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlcG5hbWUgKyAiLSIgKyBrZXkgKyAiLWF0dGFjaG1lbnQiKTsKICAgIGlmICghbGluaykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkF0dGFjaG1lbnQgIiArIGRlcG5hbWUgKyAiLyIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiBkb2N1bWVudCIpOwogICAgfQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgewogICAgdmFyIG5hbWVzID0gW107CiAgICB2YXIgbGVuZ3RoOwogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgewogICAgICAgIGlmIChkZi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkKICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lKTsKICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyIpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKGxlbmd0aCkgIT09ICJ1bmRlZmluZWQiICYmIGxlbmd0aCAhPT0gZGZbbmFtZV0ubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gZGZbbmFtZV0ubGVuZ3RoOwogICAgfQogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBpdGVtOwogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgewogICAgICAgIGl0ZW0gPSB7fTsKICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBuYW1lcy5sZW5ndGg7IGNvbCsrKSB7CiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOwogICAgICAgIH0KICAgICAgICByZXN1bHRzLnB1c2goaXRlbSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMudHJhbnNwb3NlQXJyYXkyRCA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICAgIHZhciBuZXdBcnJheSA9IGFycmF5WzBdLm1hcChmdW5jdGlvbihjb2wsIGkpIHsKICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJvd1tpXQogICAgICAgICAgfSkKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXdBcnJheTsKICB9OwogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkCiAgLy8gdXNpbmcgZXNjYXBlQ2hhci4gQW55IG90aGVyIGNoYXJhY3RlcnMgZXNjYXBlZCBieSBlc2NhcGVDaGFyCiAgLy8gd2lsbCBiZSBpbmNsdWRlZCBhcyB1c3VhbCAoaW5jbHVkaW5nIGVzY2FwZUNoYXIgaXRzZWxmKS4KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOwogICAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgdmFsdWUubGVuZ3RoOyBwb3MrKykgewogICAgICBpZiAoIWVzY2FwZU1vZGUpIHsKICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7CiAgICAgICAgICBlc2NhcGVNb2RlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoY3VycmVudFJlc3VsdCAhPT0gIiIpIHsKICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUKICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIgPSBmdW5jdGlvbihvLCBtZW1iZXIpIHsKICAgIHZhciBwYXJ0cyA9IHNwbGl0V2l0aEVzY2FwZShtZW1iZXIsICcuJywgJ1xcJyk7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOwogICAgICAvLyBwYXJ0IG1heSBiZSBhIGNoYXJhY3RlciBvciAnbnVtZXJpYycgbWVtYmVyIG5hbWUKICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgewogICAgICAgIGlmIChpID09IChsIC0gMSkpIHsgLy8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgdGhlbiBldmFsdWxhdGUKICAgICAgICAgIGlmICh0eXBlb2Ygb1twYXJ0XSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOwogICAgICAgIH0gZWxzZSB7IC8vIG90aGVyd2lzZSBjb250aW51ZSB0byBuZXh0IGVtYmVkZGVkIG9iamVjdAogICAgICAgICAgbyA9IG9bcGFydF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKfSkoKTsKCg==
9 ms
www.revolutionanalytics.com
464 ms
yrK4EqpSRdoujKQmsJoZ5WaLgeULvcWnibQMQSxOOnM.js
69 ms
ad_status.js
219 ms
zN7GBFwfMP4uA6AR0HCoLQ.ttf
204 ms
RxZJdnzeo3R5zSexge8UUaCWcynf_cDxXwCLxiixG1c.ttf
214 ms
ZGVmaW5lKHRhKToib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMmJihtb2R1bGUuZXhwb3J0cz10YSksdGhpcy5kMz10YX0oKTs=
64 ms
KGIudGltZT0wLGIuYWN0aXZlPSEwKTpjb25zb2xlLndhcm4oImFuaW1hdGlvblsiK2ErIl0gdW5kZWZpbmVkIil9O1RIUkVFLk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5zdG9wQW5pbWF0aW9uPWZ1bmN0aW9uKGEpe2lmKGE9dGhpcy5hbmltYXRpb25zTWFwW2FdKWEuYWN0aXZlPSExfTsKVEhSRUUuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPXRoaXMuYW5pbWF0aW9uc0xpc3QubGVuZ3RoO2I8YztiKyspe3ZhciBkPXRoaXMuYW5pbWF0aW9uc0xpc3RbYl07aWYoZC5hY3RpdmUpe3ZhciBlPWQuZHVyYXRpb24vZC5sZW5ndGg7ZC50aW1lKz1kLmRpcmVjdGlvbiphO2lmKGQubWlycm9yZWRMb29wKXtpZihkLnRpbWU+ZC5kdXJhdGlvbnx8MD5kLnRpbWUpZC5kaXJlY3Rpb24qPS0xLGQudGltZT5kLmR1cmF0aW9uJiYoZC50aW1lPWQuZHVyYXRpb24sZC5kaXJlY3Rpb25CYWNrd2FyZHM9ITApLDA+ZC50aW1lJiYoZC50aW1lPTAsZC5kaXJlY3Rpb25CYWNrd2FyZHM9ITEpfWVsc2UgZC50aW1lJT1kLmR1cmF0aW9uLDA+ZC50aW1lJiYoZC50aW1lKz1kLmR1cmF0aW9uKTt2YXIgZj1kLnN0YXJ0RnJhbWUrVEhSRUUuTWF0aC5jbGFtcChNYXRoLmZsb29yKGQudGltZS9lKSwwLGQubGVuZ3RoLTEpLGc9ZC53ZWlnaHQ7CmYhPT1kLmN1cnJlbnRGcmFtZSYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzW2QubGFzdEZyYW1lXT0wLHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzW2QuY3VycmVudEZyYW1lXT0xKmcsdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbZl09MCxkLmxhc3RGcmFtZT1kLmN1cnJlbnRGcmFtZSxkLmN1cnJlbnRGcmFtZT1mKTtlPWQudGltZSVlL2U7ZC5kaXJlY3Rpb25CYWNrd2FyZHMmJihlPTEtZSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbZC5jdXJyZW50RnJhbWVdPWUqZzt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1tkLmxhc3RGcmFtZV09KDEtZSkqZ319fTsK
26 ms
x-javascript;base64,LyoqCiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAqIEBhdXRob3IgbXIuZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogKi8KCnZhciBEZXRlY3RvciA9IHsKCgljYW52YXM6ICEhIHdpbmRvdy5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsCgl3ZWJnbDogKCBmdW5jdGlvbiAoKSB7IHRyeSB7IHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnY2FudmFzJyApOyByZXR1cm4gISEgKCB3aW5kb3cuV2ViR0xSZW5kZXJpbmdDb250ZXh0ICYmICggY2FudmFzLmdldENvbnRleHQoICd3ZWJnbCcgKSB8fCBjYW52YXMuZ2V0Q29udGV4dCggJ2V4cGVyaW1lbnRhbC13ZWJnbCcgKSApICk7IH0gY2F0Y2goIGUgKSB7IHJldHVybiBmYWxzZTsgfSB9ICkoKSwKCXdvcmtlcnM6ICEhIHdpbmRvdy5Xb3JrZXIsCglmaWxlYXBpOiB3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LkJsb2IsCgoJZ2V0V2ViR0xFcnJvck1lc3NhZ2U6IGZ1bmN0aW9uICgpIHsKCgkJdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApOwoJCWVsZW1lbnQuaWQgPSAnd2ViZ2wtZXJyb3ItbWVzc2FnZSc7CgkJZWxlbWVudC5zdHlsZS5mb250RmFtaWx5ID0gJ21vbm9zcGFjZSc7CgkJZWxlbWVudC5zdHlsZS5mb250U2l6ZSA9ICcxM3B4JzsKCQllbGVtZW50LnN0eWxlLmZvbnRXZWlnaHQgPSAnbm9ybWFsJzsKCQllbGVtZW50LnN0eWxlLnRleHRBbGlnbiA9ICdjZW50ZXInOwoJCWVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJzsKCQllbGVtZW50LnN0eWxlLmNvbG9yID0gJyMwMDAnOwoJCWVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcxLjVlbSc7CgkJZWxlbWVudC5zdHlsZS53aWR0aCA9ICc0MDBweCc7CgkJZWxlbWVudC5zdHlsZS5tYXJnaW4gPSAnNWVtIGF1dG8gMCc7CgoJCWlmICggISB0aGlzLndlYmdsICkgewoKCQkJZWxlbWVudC5pbm5lckhUTUwgPSB3aW5kb3cuV2ViR0xSZW5kZXJpbmdDb250ZXh0ID8gWwoJCQkJJ1lvdXIgZ3JhcGhpY3MgY2FyZCBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgPGEgaHJlZj0iaHR0cDovL2tocm9ub3Mub3JnL3dlYmdsL3dpa2kvR2V0dGluZ19hX1dlYkdMX0ltcGxlbWVudGF0aW9uIiBzdHlsZT0iY29sb3I6IzAwMCI+V2ViR0w8L2E+LjxiciAvPicsCgkJCQknRmluZCBvdXQgaG93IHRvIGdldCBpdCA8YSBocmVmPSJodHRwOi8vZ2V0LndlYmdsLm9yZy8iIHN0eWxlPSJjb2xvcjojMDAwIj5oZXJlPC9hPi4nCgkJCV0uam9pbiggJ1xuJyApIDogWwoJCQkJJ1lvdXIgYnJvd3NlciBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgPGEgaHJlZj0iaHR0cDovL2tocm9ub3Mub3JnL3dlYmdsL3dpa2kvR2V0dGluZ19hX1dlYkdMX0ltcGxlbWVudGF0aW9uIiBzdHlsZT0iY29sb3I6IzAwMCI+V2ViR0w8L2E+Ljxici8+JywKCQkJCSdGaW5kIG91dCBob3cgdG8gZ2V0IGl0IDxhIGhyZWY9Imh0dHA6Ly9nZXQud2ViZ2wub3JnLyIgc3R5bGU9ImNvbG9yOiMwMDAiPmhlcmU8L2E+LicKCQkJXS5qb2luKCAnXG4nICk7CgoJCX0KCgkJcmV0dXJuIGVsZW1lbnQ7CgoJfSwKCglhZGRHZXRXZWJHTE1lc3NhZ2U6IGZ1bmN0aW9uICggcGFyYW1ldGVycyApIHsKCgkJdmFyIHBhcmVudCwgaWQsIGVsZW1lbnQ7CgoJCXBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9OwoKCQlwYXJlbnQgPSBwYXJhbWV0ZXJzLnBhcmVudCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wYXJlbnQgOiBkb2N1bWVudC5ib2R5OwoJCWlkID0gcGFyYW1ldGVycy5pZCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5pZCA6ICdvbGRpZSc7CgoJCWVsZW1lbnQgPSBEZXRlY3Rvci5nZXRXZWJHTEVycm9yTWVzc2FnZSgpOwoJCWVsZW1lbnQuaWQgPSBpZDsKCgkJcGFyZW50LmFwcGVuZENoaWxkKCBlbGVtZW50ICk7CgoJfQoKfTsKCi8vIGJyb3dzZXJpZnkgc3VwcG9ydAppZiAoIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICkgewoKCW1vZHVsZS5leHBvcnRzID0gRGV0ZWN0b3I7Cgp9Cg==
84 ms
x-javascript;base64,LyoqCiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvCiAqIEBhdXRob3IganVsaWFud2EgLyBodHRwczovL2dpdGh1Yi5jb20vanVsaWFud2EKICovCgpUSFJFRS5SZW5kZXJhYmxlT2JqZWN0ID0gZnVuY3Rpb24gKCkgewoKCXRoaXMuaWQgPSAwOwoKCXRoaXMub2JqZWN0ID0gbnVsbDsKCXRoaXMueiA9IDA7Cgp9OwoKLy8KClRIUkVFLlJlbmRlcmFibGVGYWNlID0gZnVuY3Rpb24gKCkgewoKCXRoaXMuaWQgPSAwOwoKCXRoaXMudjEgPSBuZXcgVEhSRUUuUmVuZGVyYWJsZVZlcnRleCgpOwoJdGhpcy52MiA9IG5ldyBUSFJFRS5SZW5kZXJhYmxlVmVydGV4KCk7Cgl0aGlzLnYzID0gbmV3IFRIUkVFLlJlbmRlcmFibGVWZXJ0ZXgoKTsKCgl0aGlzLm5vcm1hbE1vZGVsID0gbmV3IFRIUkVFLlZlY3RvcjMoKTsKCgl0aGlzLnZlcnRleE5vcm1hbHNNb2RlbCA9IFsgbmV3IFRIUkVFLlZlY3RvcjMoKSwgbmV3IFRIUkVFLlZlY3RvcjMoKSwgbmV3IFRIUkVFLlZlY3RvcjMoKSBdOwoJdGhpcy52ZXJ0ZXhOb3JtYWxzTGVuZ3RoID0gMDsKCgl0aGlzLmNvbG9yID0gbmV3IFRIUkVFLkNvbG9yKCk7Cgl0aGlzLm1hdGVyaWFsID0gbnVsbDsKCXRoaXMudXZzID0gWyBuZXcgVEhSRUUuVmVjdG9yMigpLCBuZXcgVEhSRUUuVmVjdG9yMigpLCBuZXcgVEhSRUUuVmVjdG9yMigpIF07CgoJdGhpcy56ID0gMDsKCn07CgovLwoKVEhSRUUuUmVuZGVyYWJsZVZlcnRleCA9IGZ1bmN0aW9uICgpIHsKCgl0aGlzLnBvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTsKCXRoaXMucG9zaXRpb25Xb3JsZCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7Cgl0aGlzLnBvc2l0aW9uU2NyZWVuID0gbmV3IFRIUkVFLlZlY3RvcjQoKTsKCgl0aGlzLnZpc2libGUgPSB0cnVlOwoKfTsKClRIUkVFLlJlbmRlcmFibGVWZXJ0ZXgucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHZlcnRleCApIHsKCgl0aGlzLnBvc2l0aW9uV29ybGQuY29weSggdmVydGV4LnBvc2l0aW9uV29ybGQgKTsKCXRoaXMucG9zaXRpb25TY3JlZW4uY29weSggdmVydGV4LnBvc2l0aW9uU2NyZWVuICk7Cgp9OwoKLy8KClRIUkVFLlJlbmRlcmFibGVMaW5lID0gZnVuY3Rpb24gKCkgewoKCXRoaXMuaWQgPSAwOwoKCXRoaXMudjEgPSBuZXcgVEhSRUUuUmVuZGVyYWJsZVZlcnRleCgpOwoJdGhpcy52MiA9IG5ldyBUSFJFRS5SZW5kZXJhYmxlVmVydGV4KCk7CgoJdGhpcy52ZXJ0ZXhDb2xvcnMgPSBbIG5ldyBUSFJFRS5Db2xvcigpLCBuZXcgVEhSRUUuQ29sb3IoKSBdOwoJdGhpcy5tYXRlcmlhbCA9IG51bGw7CgoJdGhpcy56ID0gMDsKCn07CgovLwoKVEhSRUUuUmVuZGVyYWJsZVNwcml0ZSA9IGZ1bmN0aW9uICgpIHsKCgl0aGlzLmlkID0gMDsKCgl0aGlzLm9iamVjdCA9IG51bGw7CgoJdGhpcy54ID0gMDsKCXRoaXMueSA9IDA7Cgl0aGlzLnogPSAwOwoKCXRoaXMucm90YXRpb24gPSAwOwoJdGhpcy5zY2FsZSA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7CgoJdGhpcy5tYXRlcmlhbCA9IG51bGw7Cgp9OwoKLy8KClRIUkVFLlByb2plY3RvciA9IGZ1bmN0aW9uICgpIHsKCgl2YXIgX29iamVjdCwgX29iamVjdENvdW50LCBfb2JqZWN0UG9vbCA9IFtdLCBfb2JqZWN0UG9vbExlbmd0aCA9IDAsCglfdmVydGV4LCBfdmVydGV4Q291bnQsIF92ZXJ0ZXhQb29sID0gW10sIF92ZXJ0ZXhQb29sTGVuZ3RoID0gMCwKCV9mYWNlLCBfZmFjZUNvdW50LCBfZmFjZVBvb2wgPSBbXSwgX2ZhY2VQb29sTGVuZ3RoID0gMCwKCV9saW5lLCBfbGluZUNvdW50LCBfbGluZVBvb2wgPSBbXSwgX2xpbmVQb29sTGVuZ3RoID0gMCwKCV9zcHJpdGUsIF9zcHJpdGVDb3VudCwgX3Nwcml0ZVBvb2wgPSBbXSwgX3Nwcml0ZVBvb2xMZW5ndGggPSAwLAoKCV9yZW5kZXJEYXRhID0geyBvYmplY3RzOiBbXSwgbGlnaHRzOiBbXSwgZWxlbWVudHM6IFtdIH0sCgoJX3ZBID0gbmV3IFRIUkVFLlZlY3RvcjMoKSwKCV92QiA9IG5ldyBUSFJFRS5WZWN0b3IzKCksCglfdkMgPSBuZXcgVEhSRUUuVmVjdG9yMygpLAoKCV92ZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKSwKCV92ZWN0b3I0ID0gbmV3IFRIUkVFLlZlY3RvcjQoKSwKCglfY2xpcEJveCA9IG5ldyBUSFJFRS5Cb3gzKCBuZXcgVEhSRUUuVmVjdG9yMyggLSAxLCAtIDEsIC0gMSApLCBuZXcgVEhSRUUuVmVjdG9yMyggMSwgMSwgMSApICksCglfYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MygpLAoJX3BvaW50czMgPSBuZXcgQXJyYXkoIDMgKSwKCV9wb2ludHM0ID0gbmV3IEFycmF5KCA0ICksCgoJX3ZpZXdNYXRyaXggPSBuZXcgVEhSRUUuTWF0cml4NCgpLAoJX3ZpZXdQcm9qZWN0aW9uTWF0cml4ID0gbmV3IFRIUkVFLk1hdHJpeDQoKSwKCglfbW9kZWxNYXRyaXgsCglfbW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCA9IG5ldyBUSFJFRS5NYXRyaXg0KCksCgoJX25vcm1hbE1hdHJpeCA9IG5ldyBUSFJFRS5NYXRyaXgzKCksCgoJX2ZydXN0dW0gPSBuZXcgVEhSRUUuRnJ1c3R1bSgpLAoKCV9jbGlwcGVkVmVydGV4MVBvc2l0aW9uU2NyZWVuID0gbmV3IFRIUkVFLlZlY3RvcjQoKSwKCV9jbGlwcGVkVmVydGV4MlBvc2l0aW9uU2NyZWVuID0gbmV3IFRIUkVFLlZlY3RvcjQoKTsKCgkvLwoKCXRoaXMucHJvamVjdFZlY3RvciA9IGZ1bmN0aW9uICggdmVjdG9yLCBjYW1lcmEgKSB7CgoJCWNvbnNvbGUud2FybiggJ1RIUkVFLlByb2plY3RvcjogLnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnByb2plY3QoKS4nICk7CgkJdmVjdG9yLnByb2plY3QoIGNhbWVyYSApOwoKCX07CgoJdGhpcy51bnByb2plY3RWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciwgY2FtZXJhICkgewoKCQljb25zb2xlLndhcm4oICdUSFJFRS5Qcm9qZWN0b3I6IC51bnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnVucHJvamVjdCgpLicgKTsKCQl2ZWN0b3IudW5wcm9qZWN0KCBjYW1lcmEgKTsKCgl9OwoKCXRoaXMucGlja2luZ1JheSA9IGZ1bmN0aW9uICggdmVjdG9yLCBjYW1lcmEgKSB7CgoJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9qZWN0b3I6IC5waWNraW5nUmF5KCkgaXMgbm93IHJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKCkuJyApOwoKCX07CgoJLy8KCgl2YXIgUmVuZGVyTGlzdCA9IGZ1bmN0aW9uICgpIHsKCgkJdmFyIG5vcm1hbHMgPSBbXTsKCQl2YXIgdXZzID0gW107CgoJCXZhciBvYmplY3QgPSBudWxsOwoJCXZhciBtYXRlcmlhbCA9IG51bGw7CgoJCXZhciBub3JtYWxNYXRyaXggPSBuZXcgVEhSRUUuTWF0cml4MygpOwoKCQl2YXIgc2V0T2JqZWN0ID0gZnVuY3Rpb24gKCB2YWx1ZSApIHsKCgkJCW9iamVjdCA9IHZhbHVlOwoJCQltYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDsKCgkJCW5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tYXRyaXhXb3JsZCApOwoKCQkJbm9ybWFscy5sZW5ndGggPSAwOwoJCQl1dnMubGVuZ3RoID0gMDsKCgkJfTsKCgkJdmFyIHByb2plY3RWZXJ0ZXggPSBmdW5jdGlvbiAoIHZlcnRleCApIHsKCgkJCXZhciBwb3NpdGlvbiA9IHZlcnRleC5wb3NpdGlvbjsKCQkJdmFyIHBvc2l0aW9uV29ybGQgPSB2ZXJ0ZXgucG9zaXRpb25Xb3JsZDsKCQkJdmFyIHBvc2l0aW9uU2NyZWVuID0gdmVydGV4LnBvc2l0aW9uU2NyZWVuOwoKCQkJcG9zaXRpb25Xb3JsZC5jb3B5KCBwb3NpdGlvbiApLmFwcGx5TWF0cml4NCggX21vZGVsTWF0cml4ICk7CgkJCXBvc2l0aW9uU2NyZWVuLmNvcHkoIHBvc2l0aW9uV29ybGQgKS5hcHBseU1hdHJpeDQoIF92aWV3UHJvamVjdGlvbk1hdHJpeCApOwoKCQkJdmFyIGludlcgPSAxIC8gcG9zaXRpb25TY3JlZW4udzsKCgkJCXBvc2l0aW9uU2NyZWVuLnggKj0gaW52VzsKCQkJcG9zaXRpb25TY3JlZW4ueSAqPSBpbnZXOwoJCQlwb3NpdGlvblNjcmVlbi56ICo9IGludlc7CgoJCQl2ZXJ0ZXgudmlzaWJsZSA9IHBvc2l0aW9uU2NyZWVuLnggPj0gLSAxICYmIHBvc2l0aW9uU2NyZWVuLnggPD0gMSAmJgoJCQkJCSBwb3NpdGlvblNjcmVlbi55ID49IC0gMSAmJiBwb3NpdGlvblNjcmVlbi55IDw9IDEgJiYKCQkJCQkgcG9zaXRpb25TY3JlZW4ueiA+PSAtIDEgJiYgcG9zaXRpb25TY3JlZW4ueiA8PSAxOwoKCQl9OwoKCQl2YXIgcHVzaFZlcnRleCA9IGZ1bmN0aW9uICggeCwgeSwgeiApIHsKCgkJCV92ZXJ0ZXggPSBnZXROZXh0VmVydGV4SW5Qb29sKCk7CgkJCV92ZXJ0ZXgucG9zaXRpb24uc2V0KCB4LCB5LCB6ICk7CgoJCQlwcm9qZWN0VmVydGV4KCBfdmVydGV4ICk7CgoJCX07CgoJCXZhciBwdXNoTm9ybWFsID0gZnVuY3Rpb24gKCB4LCB5LCB6ICkgewoKCQkJbm9ybWFscy5wdXNoKCB4LCB5LCB6ICk7CgoJCX07CgoJCXZhciBwdXNoVXYgPSBmdW5jdGlvbiAoIHgsIHkgKSB7CgoJCQl1dnMucHVzaCggeCwgeSApOwoKCQl9OwoKCQl2YXIgY2hlY2tUcmlhbmdsZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAoIHYxLCB2MiwgdjMgKSB7CgoJCQlpZiAoIHYxLnZpc2libGUgPT09IHRydWUgfHwgdjIudmlzaWJsZSA9PT0gdHJ1ZSB8fCB2My52aXNpYmxlID09PSB0cnVlICkgcmV0dXJuIHRydWU7CgoJCQlfcG9pbnRzM1sgMCBdID0gdjEucG9zaXRpb25TY3JlZW47CgkJCV9wb2ludHMzWyAxIF0gPSB2Mi5wb3NpdGlvblNjcmVlbjsKCQkJX3BvaW50czNbIDIgXSA9IHYzLnBvc2l0aW9uU2NyZWVuOwoKCQkJcmV0dXJuIF9jbGlwQm94LmlzSW50ZXJzZWN0aW9uQm94KCBfYm91bmRpbmdCb3guc2V0RnJvbVBvaW50cyggX3BvaW50czMgKSApOwoKCQl9OwoKCQl2YXIgY2hlY2tCYWNrZmFjZUN1bGxpbmcgPSBmdW5jdGlvbiAoIHYxLCB2MiwgdjMgKSB7CgoJCQlyZXR1cm4gKCAoIHYzLnBvc2l0aW9uU2NyZWVuLnggLSB2MS5wb3NpdGlvblNjcmVlbi54ICkgKgoJCQkJICAgICggdjIucG9zaXRpb25TY3JlZW4ueSAtIHYxLnBvc2l0aW9uU2NyZWVuLnkgKSAtCgkJCQkgICAgKCB2My5wb3NpdGlvblNjcmVlbi55IC0gdjEucG9zaXRpb25TY3JlZW4ueSApICoKCQkJCSAgICAoIHYyLnBvc2l0aW9uU2NyZWVuLnggLSB2MS5wb3NpdGlvblNjcmVlbi54ICkgKSA8IDA7CgoJCX07CgoJCXZhciBwdXNoTGluZSA9IGZ1bmN0aW9uICggYSwgYiApIHsKCgkJCXZhciB2MSA9IF92ZXJ0ZXhQb29sWyBhIF07CgkJCXZhciB2MiA9IF92ZXJ0ZXhQb29sWyBiIF07CgoJCQlfbGluZSA9IGdldE5leHRMaW5lSW5Qb29sKCk7CgoJCQlfbGluZS5pZCA9IG9iamVjdC5pZDsKCQkJX2xpbmUudjEuY29weSggdjEgKTsKCQkJX2xpbmUudjIuY29weSggdjIgKTsKCQkJX2xpbmUueiA9ICggdjEucG9zaXRpb25TY3JlZW4ueiArIHYyLnBvc2l0aW9uU2NyZWVuLnogKSAvIDI7CgoJCQlfbGluZS5tYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDsKCgkJCV9yZW5kZXJEYXRhLmVsZW1lbnRzLnB1c2goIF9saW5lICk7CgoJCX07CgoJCXZhciBwdXNoVHJpYW5nbGUgPSBmdW5jdGlvbiAoIGEsIGIsIGMgKSB7CgoJCQl2YXIgdjEgPSBfdmVydGV4UG9vbFsgYSBdOwoJCQl2YXIgdjIgPSBfdmVydGV4UG9vbFsgYiBdOwoJCQl2YXIgdjMgPSBfdmVydGV4UG9vbFsgYyBdOwoKCQkJaWYgKCBjaGVja1RyaWFuZ2xlVmlzaWJpbGl0eSggdjEsIHYyLCB2MyApID09PSBmYWxzZSApIHJldHVybjsKCgkJCWlmICggbWF0ZXJpYWwuc2lkZSA9PT0gVEhSRUUuRG91YmxlU2lkZSB8fCBjaGVja0JhY2tmYWNlQ3VsbGluZyggdjEsIHYyLCB2MyApID09PSB0cnVlICkgewoKCQkJCV9mYWNlID0gZ2V0TmV4dEZhY2VJblBvb2woKTsKCgkJCQlfZmFjZS5pZCA9IG9iamVjdC5pZDsKCQkJCV9mYWNlLnYxLmNvcHkoIHYxICk7CgkJCQlfZmFjZS52Mi5jb3B5KCB2MiApOwoJCQkJX2ZhY2UudjMuY29weSggdjMgKTsKCQkJCV9mYWNlLnogPSAoIHYxLnBvc2l0aW9uU2NyZWVuLnogKyB2Mi5wb3NpdGlvblNjcmVlbi56ICsgdjMucG9zaXRpb25TY3JlZW4ueiApIC8gMzsKCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCAzOyBpICsrICkgewoKCQkJCQl2YXIgb2Zmc2V0ID0gYXJndW1lbnRzWyBpIF0gKiAzOwoJCQkJCXZhciBub3JtYWwgPSBfZmFjZS52ZXJ0ZXhOb3JtYWxzTW9kZWxbIGkgXTsKCgkJCQkJbm9ybWFsLnNldCggbm9ybWFsc1sgb2Zmc2V0IF0sIG5vcm1hbHNbIG9mZnNldCArIDEgXSwgbm9ybWFsc1sgb2Zmc2V0ICsgMiBdICk7CgkJCQkJbm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7CgoJCQkJCXZhciBvZmZzZXQyID0gYXJndW1lbnRzWyBpIF0gKiAyOwoKCQkJCQl2YXIgdXYgPSBfZmFjZS51dnNbIGkgXTsKCQkJCQl1di5zZXQoIHV2c1sgb2Zmc2V0MiBdLCB1dnNbIG9mZnNldDIgKyAxIF0gKTsKCgkJCQl9CgoJCQkJX2ZhY2UudmVydGV4Tm9ybWFsc0xlbmd0aCA9IDM7CgoJCQkJX2ZhY2UubWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7CgoJCQkJX3JlbmRlckRhdGEuZWxlbWVudHMucHVzaCggX2ZhY2UgKTsKCgkJCX0KCgkJfTsKCgkJcmV0dXJuIHsKCQkJc2V0T2JqZWN0OiBzZXRPYmplY3QsCgkJCXByb2plY3RWZXJ0ZXg6IHByb2plY3RWZXJ0ZXgsCgkJCWNoZWNrVHJpYW5nbGVWaXNpYmlsaXR5OiBjaGVja1RyaWFuZ2xlVmlzaWJpbGl0eSwKCQkJY2hlY2tCYWNrZmFjZUN1bGxpbmc6IGNoZWNrQmFja2ZhY2VDdWxsaW5nLAoJCQlwdXNoVmVydGV4OiBwdXNoVmVydGV4LAoJCQlwdXNoTm9ybWFsOiBwdXNoTm9ybWFsLAoJCQlwdXNoVXY6IHB1c2hVdiwKCQkJcHVzaExpbmU6IHB1c2hMaW5lLAoJCQlwdXNoVHJpYW5nbGU6IHB1c2hUcmlhbmdsZQoJCX0KCgl9OwoKCXZhciByZW5kZXJMaXN0ID0gbmV3IFJlbmRlckxpc3QoKTsKCgl0aGlzLnByb2plY3RTY2VuZSA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSwgc29ydE9iamVjdHMsIHNvcnRFbGVtZW50cyApIHsKCgkJX2ZhY2VDb3VudCA9IDA7CgkJX2xpbmVDb3VudCA9IDA7CgkJX3Nwcml0ZUNvdW50ID0gMDsKCgkJX3JlbmRlckRhdGEuZWxlbWVudHMubGVuZ3RoID0gMDsKCgkJaWYgKCBzY2VuZS5hdXRvVXBkYXRlID09PSB0cnVlICkgc2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTsKCQlpZiAoIGNhbWVyYS5wYXJlbnQgPT09IHVuZGVmaW5lZCApIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpOwoKCQlfdmlld01hdHJpeC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7CgkJX3ZpZXdQcm9qZWN0aW9uTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBfdmlld01hdHJpeCApOwoKCQlfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfdmlld1Byb2plY3Rpb25NYXRyaXggKTsKCgkJLy8KCgkJX29iamVjdENvdW50ID0gMDsKCgkJX3JlbmRlckRhdGEub2JqZWN0cy5sZW5ndGggPSAwOwoJCV9yZW5kZXJEYXRhLmxpZ2h0cy5sZW5ndGggPSAwOwoKCQlzY2VuZS50cmF2ZXJzZVZpc2libGUoIGZ1bmN0aW9uICggb2JqZWN0ICkgewoKCQkJaWYgKCBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5MaWdodCApIHsKCgkJCQlfcmVuZGVyRGF0YS5saWdodHMucHVzaCggb2JqZWN0ICk7CgoJCQl9IGVsc2UgaWYgKCBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5NZXNoIHx8IG9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLkxpbmUgfHwgb2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuU3ByaXRlICkgewoKCQkJCWlmICggb2JqZWN0Lm1hdGVyaWFsLnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuOwoKCQkJCWlmICggb2JqZWN0LmZydXN0dW1DdWxsZWQgPT09IGZhbHNlIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApID09PSB0cnVlICkgewoKCQkJCQlfb2JqZWN0ID0gZ2V0TmV4dE9iamVjdEluUG9vbCgpOwoJCQkJCV9vYmplY3QuaWQgPSBvYmplY3QuaWQ7CgkJCQkJX29iamVjdC5vYmplY3QgPSBvYmplY3Q7CgoJCQkJCV92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkICk7CgkJCQkJX3ZlY3RvcjMuYXBwbHlQcm9qZWN0aW9uKCBfdmlld1Byb2plY3Rpb25NYXRyaXggKTsKCQkJCQlfb2JqZWN0LnogPSBfdmVjdG9yMy56OwoKCQkJCQlfcmVuZGVyRGF0YS5vYmplY3RzLnB1c2goIF9vYmplY3QgKTsKCgkJCQl9CgoJCQl9CgoJCX0gKTsKCgkJaWYgKCBzb3J0T2JqZWN0cyA9PT0gdHJ1ZSApIHsKCgkJCV9yZW5kZXJEYXRhLm9iamVjdHMuc29ydCggcGFpbnRlclNvcnQgKTsKCgkJfQoKCQkvLwoKCQlmb3IgKCB2YXIgbyA9IDAsIG9sID0gX3JlbmRlckRhdGEub2JqZWN0cy5sZW5ndGg7IG8gPCBvbDsgbyArKyApIHsKCgkJCXZhciBvYmplY3QgPSBfcmVuZGVyRGF0YS5vYmplY3RzWyBvIF0ub2JqZWN0OwoJCQl2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CgoJCQlyZW5kZXJMaXN0LnNldE9iamVjdCggb2JqZWN0ICk7CgoJCQlfbW9kZWxNYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7CgoJCQlfdmVydGV4Q291bnQgPSAwOwoKCQkJaWYgKCBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5NZXNoICkgewoKCQkJCWlmICggZ2VvbWV0cnkgaW5zdGFuY2VvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeSApIHsKCgkJCQkJdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwoJCQkJCXZhciBvZmZzZXRzID0gZ2VvbWV0cnkub2Zmc2V0czsKCgkJCQkJaWYgKCBhdHRyaWJ1dGVzLnBvc2l0aW9uID09PSB1bmRlZmluZWQgKSBjb250aW51ZTsKCgkJCQkJdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7CgoJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7CgoJCQkJCQlyZW5kZXJMaXN0LnB1c2hWZXJ0ZXgoIHBvc2l0aW9uc1sgaSBdLCBwb3NpdGlvbnNbIGkgKyAxIF0sIHBvc2l0aW9uc1sgaSArIDIgXSApOwoKCQkJCQl9CgoJCQkJCWlmICggYXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCXZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7CgoJCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBub3JtYWxzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHsKCgkJCQkJCQlyZW5kZXJMaXN0LnB1c2hOb3JtYWwoIG5vcm1hbHNbIGkgXSwgbm9ybWFsc1sgaSArIDEgXSwgbm9ybWFsc1sgaSArIDIgXSApOwoKCQkJCQkJfQoKCQkJCQl9CgoJCQkJCWlmICggYXR0cmlidXRlcy51diAhPT0gdW5kZWZpbmVkICkgewoKCQkJCQkJdmFyIHV2cyA9IGF0dHJpYnV0ZXMudXYuYXJyYXk7CgoJCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB1dnMubGVuZ3RoOyBpIDwgbDsgaSArPSAyICkgewoKCQkJCQkJCXJlbmRlckxpc3QucHVzaFV2KCB1dnNbIGkgXSwgdXZzWyBpICsgMSBdICk7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQkJaWYgKCBhdHRyaWJ1dGVzLmluZGV4ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQl2YXIgaW5kaWNlcyA9IGF0dHJpYnV0ZXMuaW5kZXguYXJyYXk7CgoJCQkJCQlpZiAoIG9mZnNldHMubGVuZ3RoID4gMCApIHsKCgkJCQkJCQlmb3IgKCB2YXIgbyA9IDA7IG8gPCBvZmZzZXRzLmxlbmd0aDsgbyArKyApIHsKCgkJCQkJCQkJdmFyIG9mZnNldCA9IG9mZnNldHNbIG8gXTsKCQkJCQkJCQl2YXIgaW5kZXggPSBvZmZzZXQuaW5kZXg7CgoJCQkJCQkJCWZvciAoIHZhciBpID0gb2Zmc2V0LnN0YXJ0LCBsID0gb2Zmc2V0LnN0YXJ0ICsgb2Zmc2V0LmNvdW50OyBpIDwgbDsgaSArPSAzICkgewoKCQkJCQkJCQkJcmVuZGVyTGlzdC5wdXNoVHJpYW5nbGUoIGluZGljZXNbIGkgXSArIGluZGV4LCBpbmRpY2VzWyBpICsgMSBdICsgaW5kZXgsIGluZGljZXNbIGkgKyAyIF0gKyBpbmRleCApOwoKCQkJCQkJCQl9CgoJCQkJCQkJfQoKCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHsKCgkJCQkJCQkJcmVuZGVyTGlzdC5wdXNoVHJpYW5nbGUoIGluZGljZXNbIGkgXSwgaW5kaWNlc1sgaSArIDEgXSwgaW5kaWNlc1sgaSArIDIgXSApOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfSBlbHNlIHsKCgkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzOyBpIDwgbDsgaSArPSAzICkgewoKCQkJCQkJCXJlbmRlckxpc3QucHVzaFRyaWFuZ2xlKCBpLCBpICsgMSwgaSArIDIgKTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5IGluc3RhbmNlb2YgVEhSRUUuR2VvbWV0cnkgKSB7CgoJCQkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOwoJCQkJCXZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzOwoJCQkJCXZhciBmYWNlVmVydGV4VXZzID0gZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgMCBdOwoKCQkJCQlfbm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggX21vZGVsTWF0cml4ICk7CgoJCQkJCXZhciBpc0ZhY2VNYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbCBpbnN0YW5jZW9mIFRIUkVFLk1lc2hGYWNlTWF0ZXJpYWw7CgkJCQkJdmFyIG9iamVjdE1hdGVyaWFscyA9IGlzRmFjZU1hdGVyaWFsID09PSB0cnVlID8gb2JqZWN0Lm1hdGVyaWFsIDogbnVsbDsKCgkJCQkJZm9yICggdmFyIHYgPSAwLCB2bCA9IHZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkgewoKCQkJCQkJdmFyIHZlcnRleCA9IHZlcnRpY2VzWyB2IF07CgkJCQkJCXJlbmRlckxpc3QucHVzaFZlcnRleCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKCQkJCQl9CgoJCQkJCWZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKCgkJCQkJCXZhciBmYWNlID0gZmFjZXNbIGYgXTsKCgkJCQkJCXZhciBtYXRlcmlhbCA9IGlzRmFjZU1hdGVyaWFsID09PSB0cnVlCgkJCQkJCQkgPyBvYmplY3RNYXRlcmlhbHMubWF0ZXJpYWxzWyBmYWNlLm1hdGVyaWFsSW5kZXggXQoJCQkJCQkJIDogb2JqZWN0Lm1hdGVyaWFsOwoKCQkJCQkJaWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgY29udGludWU7CgoJCQkJCQl2YXIgc2lkZSA9IG1hdGVyaWFsLnNpZGU7CgoJCQkJCQl2YXIgdjEgPSBfdmVydGV4UG9vbFsgZmFjZS5hIF07CgkJCQkJCXZhciB2MiA9IF92ZXJ0ZXhQb29sWyBmYWNlLmIgXTsKCQkJCQkJdmFyIHYzID0gX3ZlcnRleFBvb2xbIGZhY2UuYyBdOwoKCQkJCQkJaWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7CgoJCQkJCQkJdmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0czsKCQkJCQkJCXZhciBtb3JwaEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzOwoKCQkJCQkJCXZhciB2MXAgPSB2MS5wb3NpdGlvbjsKCQkJCQkJCXZhciB2MnAgPSB2Mi5wb3NpdGlvbjsKCQkJCQkJCXZhciB2M3AgPSB2My5wb3NpdGlvbjsKCgkJCQkJCQlfdkEuc2V0KCAwLCAwLCAwICk7CgkJCQkJCQlfdkIuc2V0KCAwLCAwLCAwICk7CgkJCQkJCQlfdkMuc2V0KCAwLCAwLCAwICk7CgoJCQkJCQkJZm9yICggdmFyIHQgPSAwLCB0bCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IHQgPCB0bDsgdCArKyApIHsKCgkJCQkJCQkJdmFyIGluZmx1ZW5jZSA9IG1vcnBoSW5mbHVlbmNlc1sgdCBdOwoKCQkJCQkJCQlpZiAoIGluZmx1ZW5jZSA9PT0gMCApIGNvbnRpbnVlOwoKCQkJCQkJCQl2YXIgdGFyZ2V0cyA9IG1vcnBoVGFyZ2V0c1sgdCBdLnZlcnRpY2VzOwoKCQkJCQkJCQlfdkEueCArPSAoIHRhcmdldHNbIGZhY2UuYSBdLnggLSB2MXAueCApICogaW5mbHVlbmNlOwoJCQkJCQkJCV92QS55ICs9ICggdGFyZ2V0c1sgZmFjZS5hIF0ueSAtIHYxcC55ICkgKiBpbmZsdWVuY2U7CgkJCQkJCQkJX3ZBLnogKz0gKCB0YXJnZXRzWyBmYWNlLmEgXS56IC0gdjFwLnogKSAqIGluZmx1ZW5jZTsKCgkJCQkJCQkJX3ZCLnggKz0gKCB0YXJnZXRzWyBmYWNlLmIgXS54IC0gdjJwLnggKSAqIGluZmx1ZW5jZTsKCQkJCQkJCQlfdkIueSArPSAoIHRhcmdldHNbIGZhY2UuYiBdLnkgLSB2MnAueSApICogaW5mbHVlbmNlOwoJCQkJCQkJCV92Qi56ICs9ICggdGFyZ2V0c1sgZmFjZS5iIF0ueiAtIHYycC56ICkgKiBpbmZsdWVuY2U7CgoJCQkJCQkJCV92Qy54ICs9ICggdGFyZ2V0c1sgZmFjZS5jIF0ueCAtIHYzcC54ICkgKiBpbmZsdWVuY2U7CgkJCQkJCQkJX3ZDLnkgKz0gKCB0YXJnZXRzWyBmYWNlLmMgXS55IC0gdjNwLnkgKSAqIGluZmx1ZW5jZTsKCQkJCQkJCQlfdkMueiArPSAoIHRhcmdldHNbIGZhY2UuYyBdLnogLSB2M3AueiApICogaW5mbHVlbmNlOwoKCQkJCQkJCX0KCgkJCQkJCQl2MS5wb3NpdGlvbi5hZGQoIF92QSApOwoJCQkJCQkJdjIucG9zaXRpb24uYWRkKCBfdkIgKTsKCQkJCQkJCXYzLnBvc2l0aW9uLmFkZCggX3ZDICk7CgoJCQkJCQkJcmVuZGVyTGlzdC5wcm9qZWN0VmVydGV4KCB2MSApOwoJCQkJCQkJcmVuZGVyTGlzdC5wcm9qZWN0VmVydGV4KCB2MiApOwoJCQkJCQkJcmVuZGVyTGlzdC5wcm9qZWN0VmVydGV4KCB2MyApOwoKCQkJCQkJfQoKCQkJCQkJaWYgKCByZW5kZXJMaXN0LmNoZWNrVHJpYW5nbGVWaXNpYmlsaXR5KCB2MSwgdjIsIHYzICkgPT09IGZhbHNlICkgY29udGludWU7CgoJCQkJCQl2YXIgdmlzaWJsZSA9IHJlbmRlckxpc3QuY2hlY2tCYWNrZmFjZUN1bGxpbmcoIHYxLCB2MiwgdjMgKTsKCgkJCQkJCWlmICggc2lkZSAhPT0gVEhSRUUuRG91YmxlU2lkZSApIHsKCQkJCQkJCWlmICggc2lkZSA9PT0gVEhSRUUuRnJvbnRTaWRlICYmIHZpc2libGUgPT09IGZhbHNlICkgY29udGludWU7CgkJCQkJCQlpZiAoIHNpZGUgPT09IFRIUkVFLkJhY2tTaWRlICYmIHZpc2libGUgPT09IHRydWUgKSBjb250aW51ZTsKCQkJCQkJfQoKCQkJCQkJX2ZhY2UgPSBnZXROZXh0RmFjZUluUG9vbCgpOwoKCQkJCQkJX2ZhY2UuaWQgPSBvYmplY3QuaWQ7CgkJCQkJCV9mYWNlLnYxLmNvcHkoIHYxICk7CgkJCQkJCV9mYWNlLnYyLmNvcHkoIHYyICk7CgkJCQkJCV9mYWNlLnYzLmNvcHkoIHYzICk7CgoJCQkJCQlfZmFjZS5ub3JtYWxNb2RlbC5jb3B5KCBmYWNlLm5vcm1hbCApOwoKCQkJCQkJaWYgKCB2aXNpYmxlID09PSBmYWxzZSAmJiAoIHNpZGUgPT09IFRIUkVFLkJhY2tTaWRlIHx8IHNpZGUgPT09IFRIUkVFLkRvdWJsZVNpZGUgKSApIHsKCgkJCQkJCQlfZmFjZS5ub3JtYWxNb2RlbC5uZWdhdGUoKTsKCgkJCQkJCX0KCgkJCQkJCV9mYWNlLm5vcm1hbE1vZGVsLmFwcGx5TWF0cml4MyggX25vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOwoKCQkJCQkJdmFyIGZhY2VWZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzOwoKCQkJCQkJZm9yICggdmFyIG4gPSAwLCBubCA9IE1hdGgubWluKCBmYWNlVmVydGV4Tm9ybWFscy5sZW5ndGgsIDMgKTsgbiA8IG5sOyBuICsrICkgewoKCQkJCQkJCXZhciBub3JtYWxNb2RlbCA9IF9mYWNlLnZlcnRleE5vcm1hbHNNb2RlbFsgbiBdOwoJCQkJCQkJbm9ybWFsTW9kZWwuY29weSggZmFjZVZlcnRleE5vcm1hbHNbIG4gXSApOwoKCQkJCQkJCWlmICggdmlzaWJsZSA9PT0gZmFsc2UgJiYgKCBzaWRlID09PSBUSFJFRS5CYWNrU2lkZSB8fCBzaWRlID09PSBUSFJFRS5Eb3VibGVTaWRlICkgKSB7CgoJCQkJCQkJCW5vcm1hbE1vZGVsLm5lZ2F0ZSgpOwoKCQkJCQkJCX0KCgkJCQkJCQlub3JtYWxNb2RlbC5hcHBseU1hdHJpeDMoIF9ub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTsKCgkJCQkJCX0KCgkJCQkJCV9mYWNlLnZlcnRleE5vcm1hbHNMZW5ndGggPSBmYWNlVmVydGV4Tm9ybWFscy5sZW5ndGg7CgoJCQkJCQl2YXIgdmVydGV4VXZzID0gZmFjZVZlcnRleFV2c1sgZiBdOwoKCQkJCQkJaWYgKCB2ZXJ0ZXhVdnMgIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCQlmb3IgKCB2YXIgdSA9IDA7IHUgPCAzOyB1ICsrICkgewoKCQkJCQkJCQlfZmFjZS51dnNbIHUgXS5jb3B5KCB2ZXJ0ZXhVdnNbIHUgXSApOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJCV9mYWNlLmNvbG9yID0gZmFjZS5jb2xvcjsKCQkJCQkJX2ZhY2UubWF0ZXJpYWwgPSBtYXRlcmlhbDsKCgkJCQkJCV9mYWNlLnogPSAoIHYxLnBvc2l0aW9uU2NyZWVuLnogKyB2Mi5wb3NpdGlvblNjcmVlbi56ICsgdjMucG9zaXRpb25TY3JlZW4ueiApIC8gMzsKCgkJCQkJCV9yZW5kZXJEYXRhLmVsZW1lbnRzLnB1c2goIF9mYWNlICk7CgoJCQkJCX0KCgkJCQl9CgoJCQl9IGVsc2UgaWYgKCBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5MaW5lICkgewoKCQkJCWlmICggZ2VvbWV0cnkgaW5zdGFuY2VvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeSApIHsKCgkJCQkJdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwoKCQkJCQlpZiAoIGF0dHJpYnV0ZXMucG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHsKCgkJCQkJCXZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5OwoKCQkJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHsKCgkJCQkJCQlyZW5kZXJMaXN0LnB1c2hWZXJ0ZXgoIHBvc2l0aW9uc1sgaSBdLCBwb3NpdGlvbnNbIGkgKyAxIF0sIHBvc2l0aW9uc1sgaSArIDIgXSApOwoKCQkJCQkJfQoKCQkJCQkJaWYgKCBhdHRyaWJ1dGVzLmluZGV4ICE9PSB1bmRlZmluZWQgKSB7CgoJCQkJCQkJdmFyIGluZGljZXMgPSBhdHRyaWJ1dGVzLmluZGV4LmFycmF5OwoKCQkJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArPSAyICkgewoKCQkJCQkJCQlyZW5kZXJMaXN0LnB1c2hMaW5lKCBpbmRpY2VzWyBpIF0sIGluZGljZXNbIGkgKyAxIF0gKTsKCgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCXZhciBzdGVwID0gb2JqZWN0Lm1vZGUgPT09IFRIUkVFLkxpbmVQaWVjZXMgPyAyIDogMTsKCgkJCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSAoIHBvc2l0aW9ucy5sZW5ndGggLyAzICkgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkgewoKCQkJCQkJCQlyZW5kZXJMaXN0LnB1c2hMaW5lKCBpLCBpICsgMSApOwoKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfQoKCQkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5IGluc3RhbmNlb2YgVEhSRUUuR2VvbWV0cnkgKSB7CgoJCQkJCV9tb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIF92aWV3UHJvamVjdGlvbk1hdHJpeCwgX21vZGVsTWF0cml4ICk7CgoJCQkJCXZhciB2ZXJ0aWNlcyA9IG9iamVjdC5nZW9tZXRyeS52ZXJ0aWNlczsKCgkJCQkJaWYgKCB2ZXJ0aWNlcy5sZW5ndGggPT09IDAgKSBjb250aW51ZTsKCgkJCQkJdjEgPSBnZXROZXh0VmVydGV4SW5Qb29sKCk7CgkJCQkJdjEucG9zaXRpb25TY3JlZW4uY29weSggdmVydGljZXNbIDAgXSApLmFwcGx5TWF0cml4NCggX21vZGVsVmlld1Byb2plY3Rpb25NYXRyaXggKTsKCgkJCQkJLy8gSGFuZGxlIExpbmVTdHJpcCBhbmQgTGluZVBpZWNlcwoJCQkJCXZhciBzdGVwID0gb2JqZWN0Lm1vZGUgPT09IFRIUkVFLkxpbmVQaWVjZXMgPyAyIDogMTsKCgkJCQkJZm9yICggdmFyIHYgPSAxLCB2bCA9IHZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkgewoKCQkJCQkJdjEgPSBnZXROZXh0VmVydGV4SW5Qb29sKCk7CgkJCQkJCXYxLnBvc2l0aW9uU2NyZWVuLmNvcHkoIHZlcnRpY2VzWyB2IF0gKS5hcHBseU1hdHJpeDQoIF9tb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4ICk7CgoJCQkJCQlpZiAoICggdiArIDEgKSAlIHN0ZXAgPiAwICkgY29udGludWU7CgoJCQkJCQl2MiA9IF92ZXJ0ZXhQb29sWyBfdmVydGV4Q291bnQgLSAyIF07CgoJCQkJCQlfY2xpcHBlZFZlcnRleDFQb3NpdGlvblNjcmVlbi5jb3B5KCB2MS5wb3NpdGlvblNjcmVlbiApOwoJCQkJCQlfY2xpcHBlZFZlcnRleDJQb3NpdGlvblNjcmVlbi5jb3B5KCB2Mi5wb3NpdGlvblNjcmVlbiApOwoKCQkJCQkJaWYgKCBjbGlwTGluZSggX2NsaXBwZWRWZXJ0ZXgxUG9zaXRpb25TY3JlZW4sIF9jbGlwcGVkVmVydGV4MlBvc2l0aW9uU2NyZWVuICkgPT09IHRydWUgKSB7CgoJCQkJCQkJLy8gUGVyZm9ybSB0aGUgcGVyc3BlY3RpdmUgZGl2aWRlCgkJCQkJCQlfY2xpcHBlZFZlcnRleDFQb3NpdGlvblNjcmVlbi5tdWx0aXBseVNjYWxhciggMSAvIF9jbGlwcGVkVmVydGV4MVBvc2l0aW9uU2NyZWVuLncgKTsKCQkJCQkJCV9jbGlwcGVkVmVydGV4MlBvc2l0aW9uU2NyZWVuLm11bHRpcGx5U2NhbGFyKCAxIC8gX2NsaXBwZWRWZXJ0ZXgyUG9zaXRpb25TY3JlZW4udyApOwoKCQkJCQkJCV9saW5lID0gZ2V0TmV4dExpbmVJblBvb2woKTsKCgkJCQkJCQlfbGluZS5pZCA9IG9iamVjdC5pZDsKCQkJCQkJCV9saW5lLnYxLnBvc2l0aW9uU2NyZWVuLmNvcHkoIF9jbGlwcGVkVmVydGV4MVBvc2l0aW9uU2NyZWVuICk7CgkJCQkJCQlfbGluZS52Mi5wb3NpdGlvblNjcmVlbi5jb3B5KCBfY2xpcHBlZFZlcnRleDJQb3NpdGlvblNjcmVlbiApOwoKCQkJCQkJCV9saW5lLnogPSBNYXRoLm1heCggX2NsaXBwZWRWZXJ0ZXgxUG9zaXRpb25TY3JlZW4ueiwgX2NsaXBwZWRWZXJ0ZXgyUG9zaXRpb25TY3JlZW4ueiApOwoKCQkJCQkJCV9saW5lLm1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOwoKCQkJCQkJCWlmICggb2JqZWN0Lm1hdGVyaWFsLnZlcnRleENvbG9ycyA9PT0gVEhSRUUuVmVydGV4Q29sb3JzICkgewoKCQkJCQkJCQlfbGluZS52ZXJ0ZXhDb2xvcnNbIDAgXS5jb3B5KCBvYmplY3QuZ2VvbWV0cnkuY29sb3JzWyB2IF0gKTsKCQkJCQkJCQlfbGluZS52ZXJ0ZXhDb2xvcnNbIDEgXS5jb3B5KCBvYmplY3QuZ2VvbWV0cnkuY29sb3JzWyB2IC0gMSBdICk7CgoJCQkJCQkJfQoKCQkJCQkJCV9yZW5kZXJEYXRhLmVsZW1lbnRzLnB1c2goIF9saW5lICk7CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQl9CgoJCQl9IGVsc2UgaWYgKCBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5TcHJpdGUgKSB7CgoJCQkJX3ZlY3RvcjQuc2V0KCBfbW9kZWxNYXRyaXguZWxlbWVudHNbIDEyIF0sIF9tb2RlbE1hdHJpeC5lbGVtZW50c1sgMTMgXSwgX21vZGVsTWF0cml4LmVsZW1lbnRzWyAxNCBdLCAxICk7CgkJCQlfdmVjdG9yNC5hcHBseU1hdHJpeDQoIF92aWV3UHJvamVjdGlvbk1hdHJpeCApOwoKCQkJCXZhciBpbnZXID0gMSAvIF92ZWN0b3I0Lnc7CgoJCQkJX3ZlY3RvcjQueiAqPSBpbnZXOwoKCQkJCWlmICggX3ZlY3RvcjQueiA+PSAtIDEgJiYgX3ZlY3RvcjQueiA8PSAxICkgewoKCQkJCQlfc3ByaXRlID0gZ2V0TmV4dFNwcml0ZUluUG9vbCgpOwoJCQkJCV9zcHJpdGUuaWQgPSBvYmplY3QuaWQ7CgkJCQkJX3Nwcml0ZS54ID0gX3ZlY3RvcjQueCAqIGludlc7CgkJCQkJX3Nwcml0ZS55ID0gX3ZlY3RvcjQueSAqIGludlc7CgkJCQkJX3Nwcml0ZS56ID0gX3ZlY3RvcjQuejsKCQkJCQlfc3ByaXRlLm9iamVjdCA9IG9iamVjdDsKCgkJCQkJX3Nwcml0ZS5yb3RhdGlvbiA9IG9iamVjdC5yb3RhdGlvbjsKCgkJCQkJX3Nwcml0ZS5zY2FsZS54ID0gb2JqZWN0LnNjYWxlLnggKiBNYXRoLmFicyggX3Nwcml0ZS54IC0gKCBfdmVjdG9yNC54ICsgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSApIC8gKCBfdmVjdG9yNC53ICsgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDEyIF0gKSApOwoJCQkJCV9zcHJpdGUuc2NhbGUueSA9IG9iamVjdC5zY2FsZS55ICogTWF0aC5hYnMoIF9zcHJpdGUueSAtICggX3ZlY3RvcjQueSArIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA1IF0gKSAvICggX3ZlY3RvcjQudyArIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAxMyBdICkgKTsKCgkJCQkJX3Nwcml0ZS5tYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDsKCgkJCQkJX3JlbmRlckRhdGEuZWxlbWVudHMucHVzaCggX3Nwcml0ZSApOwoKCQkJCX0KCgkJCX0KCgkJfQoKCQlpZiAoIHNvcnRFbGVtZW50cyA9PT0gdHJ1ZSApIHsKCgkJCV9yZW5kZXJEYXRhLmVsZW1lbnRzLnNvcnQoIHBhaW50ZXJTb3J0ICk7CgoJCX0KCgkJcmV0dXJuIF9yZW5kZXJEYXRhOwoKCX07CgoJLy8gUG9vbHMKCglmdW5jdGlvbiBnZXROZXh0T2JqZWN0SW5Qb29sKCkgewoKCQlpZiAoIF9vYmplY3RDb3VudCA9PT0gX29iamVjdFBvb2xMZW5ndGggKSB7CgoJCQl2YXIgb2JqZWN0ID0gbmV3IFRIUkVFLlJlbmRlcmFibGVPYmplY3QoKTsKCQkJX29iamVjdFBvb2wucHVzaCggb2JqZWN0ICk7CgkJCV9vYmplY3RQb29sTGVuZ3RoICsrOwoJCQlfb2JqZWN0Q291bnQgKys7CgkJCXJldHVybiBvYmplY3Q7CgoJCX0KCgkJcmV0dXJuIF9vYmplY3RQb29sWyBfb2JqZWN0Q291bnQgKysgXTsKCgl9CgoJZnVuY3Rpb24gZ2V0TmV4dFZlcnRleEluUG9vbCgpIHsKCgkJaWYgKCBfdmVydGV4Q291bnQgPT09IF92ZXJ0ZXhQb29sTGVuZ3RoICkgewoKCQkJdmFyIHZlcnRleCA9IG5ldyBUSFJFRS5SZW5kZXJhYmxlVmVydGV4KCk7CgkJCV92ZXJ0ZXhQb29sLnB1c2goIHZlcnRleCApOwoJCQlfdmVydGV4UG9vbExlbmd0aCArKzsKCQkJX3ZlcnRleENvdW50ICsrOwoJCQlyZXR1cm4gdmVydGV4OwoKCQl9CgoJCXJldHVybiBfdmVydGV4UG9vbFsgX3ZlcnRleENvdW50ICsrIF07CgoJfQoKCWZ1bmN0aW9uIGdldE5leHRGYWNlSW5Qb29sKCkgewoKCQlpZiAoIF9mYWNlQ291bnQgPT09IF9mYWNlUG9vbExlbmd0aCApIHsKCgkJCXZhciBmYWNlID0gbmV3IFRIUkVFLlJlbmRlcmFibGVGYWNlKCk7CgkJCV9mYWNlUG9vbC5wdXNoKCBmYWNlICk7CgkJCV9mYWNlUG9vbExlbmd0aCArKzsKCQkJX2ZhY2VDb3VudCArKzsKCQkJcmV0dXJuIGZhY2U7CgoJCX0KCgkJcmV0dXJuIF9mYWNlUG9vbFsgX2ZhY2VDb3VudCArKyBdOwoKCgl9CgoJZnVuY3Rpb24gZ2V0TmV4dExpbmVJblBvb2woKSB7CgoJCWlmICggX2xpbmVDb3VudCA9PT0gX2xpbmVQb29sTGVuZ3RoICkgewoKCQkJdmFyIGxpbmUgPSBuZXcgVEhSRUUuUmVuZGVyYWJsZUxpbmUoKTsKCQkJX2xpbmVQb29sLnB1c2goIGxpbmUgKTsKCQkJX2xpbmVQb29sTGVuZ3RoICsrOwoJCQlfbGluZUNvdW50ICsrCgkJCXJldHVybiBsaW5lOwoKCQl9CgoJCXJldHVybiBfbGluZVBvb2xbIF9saW5lQ291bnQgKysgXTsKCgl9CgoJZnVuY3Rpb24gZ2V0TmV4dFNwcml0ZUluUG9vbCgpIHsKCgkJaWYgKCBfc3ByaXRlQ291bnQgPT09IF9zcHJpdGVQb29sTGVuZ3RoICkgewoKCQkJdmFyIHNwcml0ZSA9IG5ldyBUSFJFRS5SZW5kZXJhYmxlU3ByaXRlKCk7CgkJCV9zcHJpdGVQb29sLnB1c2goIHNwcml0ZSApOwoJCQlfc3ByaXRlUG9vbExlbmd0aCArKzsKCQkJX3Nwcml0ZUNvdW50ICsrCgkJCXJldHVybiBzcHJpdGU7CgoJCX0KCgkJcmV0dXJuIF9zcHJpdGVQb29sWyBfc3ByaXRlQ291bnQgKysgXTsKCgl9CgoJLy8KCglmdW5jdGlvbiBwYWludGVyU29ydCggYSwgYiApIHsKCgkJaWYgKCBhLnogIT09IGIueiApIHsKCgkJCXJldHVybiBiLnogLSBhLno7CgoJCX0gZWxzZSBpZiAoIGEuaWQgIT09IGIuaWQgKSB7CgoJCQlyZXR1cm4gYS5pZCAtIGIuaWQ7CgoJCX0gZWxzZSB7CgoJCQlyZXR1cm4gMDsKCgkJfQoKCX0KCglmdW5jdGlvbiBjbGlwTGluZSggczEsIHMyICkgewoKCQl2YXIgYWxwaGExID0gMCwgYWxwaGEyID0gMSwKCgkJLy8gQ2FsY3VsYXRlIHRoZSBib3VuZGFyeSBjb29yZGluYXRlIG9mIGVhY2ggdmVydGV4IGZvciB0aGUgbmVhciBhbmQgZmFyIGNsaXAgcGxhbmVzLAoJCS8vIFogPSAtMSBhbmQgWiA9ICsxLCByZXNwZWN0aXZlbHkuCgkJYmMxbmVhciA9ICBzMS56ICsgczEudywKCQliYzJuZWFyID0gIHMyLnogKyBzMi53LAoJCWJjMWZhciA9ICAtIHMxLnogKyBzMS53LAoJCWJjMmZhciA9ICAtIHMyLnogKyBzMi53OwoKCQlpZiAoIGJjMW5lYXIgPj0gMCAmJiBiYzJuZWFyID49IDAgJiYgYmMxZmFyID49IDAgJiYgYmMyZmFyID49IDAgKSB7CgoJCQkvLyBCb3RoIHZlcnRpY2VzIGxpZSBlbnRpcmVseSB3aXRoaW4gYWxsIGNsaXAgcGxhbmVzLgoJCQlyZXR1cm4gdHJ1ZTsKCgkJfSBlbHNlIGlmICggKCBiYzFuZWFyIDwgMCAmJiBiYzJuZWFyIDwgMCApIHx8ICggYmMxZmFyIDwgMCAmJiBiYzJmYXIgPCAwICkgKSB7CgoJCQkvLyBCb3RoIHZlcnRpY2VzIGxpZSBlbnRpcmVseSBvdXRzaWRlIG9uZSBvZiB0aGUgY2xpcCBwbGFuZXMuCgkJCXJldHVybiBmYWxzZTsKCgkJfSBlbHNlIHsKCgkJCS8vIFRoZSBsaW5lIHNlZ21lbnQgc3BhbnMgYXQgbGVhc3Qgb25lIGNsaXAgcGxhbmUuCgoJCQlpZiAoIGJjMW5lYXIgPCAwICkgewoKCQkJCS8vIHYxIGxpZXMgb3V0c2lkZSB0aGUgbmVhciBwbGFuZSwgdjIgaW5zaWRlCgkJCQlhbHBoYTEgPSBNYXRoLm1heCggYWxwaGExLCBiYzFuZWFyIC8gKCBiYzFuZWFyIC0gYmMybmVhciApICk7CgoJCQl9IGVsc2UgaWYgKCBiYzJuZWFyIDwgMCApIHsKCgkJCQkvLyB2MiBsaWVzIG91dHNpZGUgdGhlIG5lYXIgcGxhbmUsIHYxIGluc2lkZQoJCQkJYWxwaGEyID0gTWF0aC5taW4oIGFscGhhMiwgYmMxbmVhciAvICggYmMxbmVhciAtIGJjMm5lYXIgKSApOwoKCQkJfQoKCQkJaWYgKCBiYzFmYXIgPCAwICkgewoKCQkJCS8vIHYxIGxpZXMgb3V0c2lkZSB0aGUgZmFyIHBsYW5lLCB2MiBpbnNpZGUKCQkJCWFscGhhMSA9IE1hdGgubWF4KCBhbHBoYTEsIGJjMWZhciAvICggYmMxZmFyIC0gYmMyZmFyICkgKTsKCgkJCX0gZWxzZSBpZiAoIGJjMmZhciA8IDAgKSB7CgoJCQkJLy8gdjIgbGllcyBvdXRzaWRlIHRoZSBmYXIgcGxhbmUsIHYyIGluc2lkZQoJCQkJYWxwaGEyID0gTWF0aC5taW4oIGFscGhhMiwgYmMxZmFyIC8gKCBiYzFmYXIgLSBiYzJmYXIgKSApOwoKCQkJfQoKCQkJaWYgKCBhbHBoYTIgPCBhbHBoYTEgKSB7CgoJCQkJLy8gVGhlIGxpbmUgc2VnbWVudCBzcGFucyB0d28gYm91bmRhcmllcywgYnV0IGlzIG91dHNpZGUgYm90aCBvZiB0aGVtLgoJCQkJLy8gKFRoaXMgY2FuJ3QgaGFwcGVuIHdoZW4gd2UncmUgb25seSBjbGlwcGluZyBhZ2FpbnN0IGp1c3QgbmVhci9mYXIgYnV0IGdvb2QKCQkJCS8vICB0byBsZWF2ZSB0aGUgY2hlY2sgaGVyZSBmb3IgZnV0dXJlIHVzYWdlIGlmIG90aGVyIGNsaXAgcGxhbmVzIGFyZSBhZGRlZC4pCgkJCQlyZXR1cm4gZmFsc2U7CgoJCQl9IGVsc2UgewoKCQkJCS8vIFVwZGF0ZSB0aGUgczEgYW5kIHMyIHZlcnRpY2VzIHRvIG1hdGNoIHRoZSBjbGlwcGVkIGxpbmUgc2VnbWVudC4KCQkJCXMxLmxlcnAoIHMyLCBhbHBoYTEgKTsKCQkJCXMyLmxlcnAoIHMxLCAxIC0gYWxwaGEyICk7CgoJCQkJcmV0dXJuIHRydWU7CgoJCQl9CgoJCX0KCgl9Cgp9Owo=
84 ms
ICdyZXBlYXQteScKCQkJCQkJIDogJ25vLXJlcGVhdCcKCQkpOwoKCX0KCglmdW5jdGlvbiBwYXR0ZXJuUGF0aCggeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgdTAsIHYwLCB1MSwgdjEsIHUyLCB2MiwgdGV4dHVyZSApIHsKCgkJaWYgKCB0ZXh0dXJlIGluc3RhbmNlb2YgVEhSRUUuRGF0YVRleHR1cmUgKSByZXR1cm47CgoJCWlmICggdGV4dHVyZS5oYXNFdmVudExpc3RlbmVyKCAndXBkYXRlJywgb25UZXh0dXJlVXBkYXRlICkgPT09IGZhbHNlICkgewoKCQkJaWYgKCB0ZXh0dXJlLmltYWdlICE9PSB1bmRlZmluZWQgJiYgdGV4dHVyZS5pbWFnZS53aWR0aCA+IDAgKSB7CgoJCQkJdGV4dHVyZVRvUGF0dGVybiggdGV4dHVyZSApOwoKCQkJfQoKCQkJdGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCAndXBkYXRlJywgb25UZXh0dXJlVXBkYXRlICk7CgoJCX0KCgkJdmFyIHBhdHRlcm4gPSBfcGF0dGVybnNbIHRleHR1cmUuaWQgXTsKCgkJaWYgKCBwYXR0ZXJuICE9PSB1bmRlZmluZWQgKSB7CgoJCQlzZXRGaWxsU3R5bGUoIHBhdHRlcm4gKTsKCgkJfSBlbHNlIHsKCgkJCXNldEZpbGxTdHlsZSggJ3JnYmEoMCwwLDAsMSknICk7CgkJCV9jb250ZXh0LmZpbGwoKTsKCgkJCXJldHVybjsKCgkJfQoKCQkvLyBodHRwOi8vZXh0cmVtZWx5c2F0aXNmYWN0b3J5dG90YWxpdGFyaWFuaXNtLmNvbS9ibG9nLz9wPTIxMjAKCgkJdmFyIGEsIGIsIGMsIGQsIGUsIGYsIGRldCwgaWRldCwKCQlvZmZzZXRYID0gdGV4dHVyZS5vZmZzZXQueCAvIHRleHR1cmUucmVwZWF0LngsCgkJb2Zmc2V0WSA9IHRleHR1cmUub2Zmc2V0LnkgLyB0ZXh0dXJlLnJlcGVhdC55LAoJCXdpZHRoID0gdGV4dHVyZS5pbWFnZS53aWR0aCAqIHRleHR1cmUucmVwZWF0LngsCgkJaGVpZ2h0ID0gdGV4dHVyZS5pbWFnZS5oZWlnaHQgKiB0ZXh0dXJlLnJlcGVhdC55OwoKCQl1MCA9ICggdTAgKyBvZmZzZXRYICkgKiB3aWR0aDsKCQl2MCA9ICggdjAgKyBvZmZzZXRZICkgKiBoZWlnaHQ7CgoJCXUxID0gKCB1MSArIG9mZnNldFggKSAqIHdpZHRoOwoJCXYxID0gKCB2MSArIG9mZnNldFkgKSAqIGhlaWdodDsKCgkJdTIgPSAoIHUyICsgb2Zmc2V0WCApICogd2lkdGg7CgkJdjIgPSAoIHYyICsgb2Zmc2V0WSApICogaGVpZ2h0OwoKCQl4MSAtPSB4MDsgeTEgLT0geTA7CgkJeDIgLT0geDA7IHkyIC09IHkwOwoKCQl1MSAtPSB1MDsgdjEgLT0gdjA7CgkJdTIgLT0gdTA7IHYyIC09IHYwOwoKCQlkZXQgPSB1MSAqIHYyIC0gdTIgKiB2MTsKCgkJaWYgKCBkZXQgPT09IDAgKSByZXR1cm47CgoJCWlkZXQgPSAxIC8gZGV0OwoKCQlhID0gKCB2MiAqIHgxIC0gdjEgKiB4MiApICogaWRldDsKCQliID0gKCB2MiAqIHkxIC0gdjEgKiB5MiApICogaWRldDsKCQljID0gKCB1MSAqIHgyIC0gdTIgKiB4MSApICogaWRldDsKCQlkID0gKCB1MSAqIHkyIC0gdTIgKiB5MSApICogaWRldDsKCgkJZSA9IHgwIC0gYSAqIHUwIC0gYyAqIHYwOwoJCWYgPSB5MCAtIGIgKiB1MCAtIGQgKiB2MDsKCgkJX2NvbnRleHQuc2F2ZSgpOwoJCV9jb250ZXh0LnRyYW5zZm9ybSggYSwgYiwgYywgZCwgZSwgZiApOwoJCV9jb250ZXh0LmZpbGwoKTsKCQlfY29udGV4dC5yZXN0b3JlKCk7CgoJfQoKCWZ1bmN0aW9uIGNsaXBJbWFnZSggeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgdTAsIHYwLCB1MSwgdjEsIHUyLCB2MiwgaW1hZ2UgKSB7CgoJCS8vIGh0dHA6Ly9leHRyZW1lbHlzYXRpc2ZhY3Rvcnl0b3RhbGl0YXJpYW5pc20uY29tL2Jsb2cvP3A9MjEyMAoKCQl2YXIgYSwgYiwgYywgZCwgZSwgZiwgZGV0LCBpZGV0LAoJCXdpZHRoID0gaW1hZ2Uud2lkdGggLSAxLAoJCWhlaWdodCA9IGltYWdlLmhlaWdodCAtIDE7CgoJCXUwICo9IHdpZHRoOyB2MCAqPSBoZWlnaHQ7CgkJdTEgKj0gd2lkdGg7IHYxICo9IGhlaWdodDsKCQl1MiAqPSB3aWR0aDsgdjIgKj0gaGVpZ2h0OwoKCQl4MSAtPSB4MDsgeTEgLT0geTA7CgkJeDIgLT0geDA7IHkyIC09IHkwOwoKCQl1MSAtPSB1MDsgdjEgLT0gdjA7CgkJdTIgLT0gdTA7IHYyIC09IHYwOwoKCQlkZXQgPSB1MSAqIHYyIC0gdTIgKiB2MTsKCgkJaWRldCA9IDEgLyBkZXQ7CgoJCWEgPSAoIHYyICogeDEgLSB2MSAqIHgyICkgKiBpZGV0OwoJCWIgPSAoIHYyICogeTEgLSB2MSAqIHkyICkgKiBpZGV0OwoJCWMgPSAoIHUxICogeDIgLSB1MiAqIHgxICkgKiBpZGV0OwoJCWQgPSAoIHUxICogeTIgLSB1MiAqIHkxICkgKiBpZGV0OwoKCQllID0geDAgLSBhICogdTAgLSBjICogdjA7CgkJZiA9IHkwIC0gYiAqIHUwIC0gZCAqIHYwOwoKCQlfY29udGV4dC5zYXZlKCk7CgkJX2NvbnRleHQudHJhbnNmb3JtKCBhLCBiLCBjLCBkLCBlLCBmICk7CgkJX2NvbnRleHQuY2xpcCgpOwoJCV9jb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAgKTsKCQlfY29udGV4dC5yZXN0b3JlKCk7CgoJfQoKCS8vIEhpZGUgYW50aS1hbGlhcyBnYXBzCgoJZnVuY3Rpb24gZXhwYW5kKCB2MSwgdjIsIHBpeGVscyApIHsKCgkJdmFyIHggPSB2Mi54IC0gdjEueCwgeSA9IHYyLnkgLSB2MS55LAoJCWRldCA9IHggKiB4ICsgeSAqIHksIGlkZXQ7CgoJCWlmICggZGV0ID09PSAwICkgcmV0dXJuOwoKCQlpZGV0ID0gcGl4ZWxzIC8gTWF0aC5zcXJ0KCBkZXQgKTsKCgkJeCAqPSBpZGV0OyB5ICo9IGlkZXQ7CgoJCXYyLnggKz0geDsgdjIueSArPSB5OwoJCXYxLnggLT0geDsgdjEueSAtPSB5OwoKCX0KCgkvLyBDb250ZXh0IGNhY2hlZCBtZXRob2RzLgoKCWZ1bmN0aW9uIHNldE9wYWNpdHkoIHZhbHVlICkgewoKCQlpZiAoIF9jb250ZXh0R2xvYmFsQWxwaGEgIT09IHZhbHVlICkgewoKCQkJX2NvbnRleHQuZ2xvYmFsQWxwaGEgPSB2YWx1ZTsKCQkJX2NvbnRleHRHbG9iYWxBbHBoYSA9IHZhbHVlOwoKCQl9CgoJfQoKCWZ1bmN0aW9uIHNldEJsZW5kaW5nKCB2YWx1ZSApIHsKCgkJaWYgKCBfY29udGV4dEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiAhPT0gdmFsdWUgKSB7CgoJCQlpZiAoIHZhbHVlID09PSBUSFJFRS5Ob3JtYWxCbGVuZGluZyApIHsKCgkJCQlfY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInOwoKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IFRIUkVFLkFkZGl0aXZlQmxlbmRpbmcgKSB7CgoJCQkJX2NvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2xpZ2h0ZXInOwoKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IFRIUkVFLlN1YnRyYWN0aXZlQmxlbmRpbmcgKSB7CgoJCQkJX2NvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rhcmtlcic7CgoJCQl9CgoJCQlfY29udGV4dEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IHZhbHVlOwoKCQl9CgoJfQoKCWZ1bmN0aW9uIHNldExpbmVXaWR0aCggdmFsdWUgKSB7CgoJCWlmICggX2NvbnRleHRMaW5lV2lkdGggIT09IHZhbHVlICkgewoKCQkJX2NvbnRleHQubGluZVdpZHRoID0gdmFsdWU7CgkJCV9jb250ZXh0TGluZVdpZHRoID0gdmFsdWU7CgoJCX0KCgl9CgoJZnVuY3Rpb24gc2V0TGluZUNhcCggdmFsdWUgKSB7CgoJCS8vICJidXR0IiwgInJvdW5kIiwgInNxdWFyZSIKCgkJaWYgKCBfY29udGV4dExpbmVDYXAgIT09IHZhbHVlICkgewoKCQkJX2NvbnRleHQubGluZUNhcCA9IHZhbHVlOwoJCQlfY29udGV4dExpbmVDYXAgPSB2YWx1ZTsKCgkJfQoKCX0KCglmdW5jdGlvbiBzZXRMaW5lSm9pbiggdmFsdWUgKSB7CgoJCS8vICJyb3VuZCIsICJiZXZlbCIsICJtaXRlciIKCgkJaWYgKCBfY29udGV4dExpbmVKb2luICE9PSB2YWx1ZSApIHsKCgkJCV9jb250ZXh0LmxpbmVKb2luID0gdmFsdWU7CgkJCV9jb250ZXh0TGluZUpvaW4gPSB2YWx1ZTsKCgkJfQoKCX0KCglmdW5jdGlvbiBzZXRTdHJva2VTdHlsZSggdmFsdWUgKSB7CgoJCWlmICggX2NvbnRleHRTdHJva2VTdHlsZSAhPT0gdmFsdWUgKSB7CgoJCQlfY29udGV4dC5zdHJva2VTdHlsZSA9IHZhbHVlOwoJCQlfY29udGV4dFN0cm9rZVN0eWxlID0gdmFsdWU7CgoJCX0KCgl9CgoJZnVuY3Rpb24gc2V0RmlsbFN0eWxlKCB2YWx1ZSApIHsKCgkJaWYgKCBfY29udGV4dEZpbGxTdHlsZSAhPT0gdmFsdWUgKSB7CgoJCQlfY29udGV4dC5maWxsU3R5bGUgPSB2YWx1ZTsKCQkJX2NvbnRleHRGaWxsU3R5bGUgPSB2YWx1ZTsKCgkJfQoKCX0KCglmdW5jdGlvbiBzZXRMaW5lRGFzaCggdmFsdWUgKSB7CgoJCWlmICggX2NvbnRleHRMaW5lRGFzaC5sZW5ndGggIT09IHZhbHVlLmxlbmd0aCApIHsKCgkJCV9jb250ZXh0LnNldExpbmVEYXNoKCB2YWx1ZSApOwoJCQlfY29udGV4dExpbmVEYXNoID0gdmFsdWU7CgoJCX0KCgl9Cgp9Owo=
5 ms
x-javascript;base64,Lyogc2NhdHRlcnBsb3RUaHJlZS5qcwogKiBBIHNldCBvZiBleGFtcGxlIEphdmFzY3JpcHQgZnVuY3Rpb25zIHRoYXQgc3VwcG9ydCBhIHRocmVlanMtYmFzZWQgM2QKICogc2NhdHRlcnBsb3QgaW4gUiwgZ2VhcmVkIGZvciB1c2Ugd2l0aCB0aGUgaHRtbHdpZGdldHMgYW5kIHNoaW55IHBhY2thZ2VzLgogKi8KSFRNTFdpZGdldHMud2lkZ2V0KAp7CgogIG5hbWU6ICJzY2F0dGVycGxvdFRocmVlIiwKICB0eXBlOiAib3V0cHV0IiwKCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpCiAgewogICAgdmFyIHIgPSByZW5kZXJfaW5pdChlbCwgd2lkdGgsIGhlaWdodCwgZmFsc2UpOwogICAgdmFyIGMgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoMzksIHIuZG9tRWxlbWVudC53aWR0aC9yLmRvbUVsZW1lbnQuaGVpZ2h0LCAxRS01LCAxMCk7CiAgICB2YXIgcyA9IG5ldyBUSFJFRS5TY2VuZSgpOwogICAgcmV0dXJuIHtyZW5kZXJlcjpyLCBjYW1lcmE6Yywgc2NlbmU6IHMsIHdpZHRoOiBwYXJzZUludCh3aWR0aCksIGhlaWdodDogcGFyc2VJbnQoaGVpZ2h0KX07CiAgfSwKCiAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgc3R1ZmYpCiAgewogICAgc3R1ZmYucmVuZGVyZXIuY2xlYXIoKTsKICAgIHN0dWZmLnJlbmRlcmVyLnNldFNpemUocGFyc2VJbnQod2lkdGgpLCBwYXJzZUludChoZWlnaHQpKTsKICAgIHN0dWZmLmNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ID0gbmV3IFRIUkVFLk1hdHJpeDQoKS5tYWtlUGVyc3BlY3RpdmUoc3R1ZmYuY2FtZXJhLmZvdiwgIHN0dWZmLnJlbmRlcmVyLmRvbUVsZW1lbnQud2lkdGgvc3R1ZmYucmVuZGVyZXIuZG9tRWxlbWVudC5oZWlnaHQsIHN0dWZmLmNhbWVyYS5uZWFyLCBzdHVmZi5jYW1lcmEuZmFyKTsKICAgIHN0dWZmLmNhbWVyYS5sb29rQXQoc3R1ZmYuc2NlbmUucG9zaXRpb24pOwogICAgc3R1ZmYucmVuZGVyZXIucmVuZGVyKHN0dWZmLnNjZW5lLCBzdHVmZi5jYW1lcmEpOwogIH0sCgogIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgc3R1ZmYpCiAgewogICAgc3R1ZmYucmVuZGVyZXIgPSByZW5kZXJfaW5pdChlbCwgc3R1ZmYud2lkdGgsIHN0dWZmLmhlaWdodCwgeC5vcHRpb25zLnJlbmRlcmVyLCB4Lm9wdGlvbnMubGFiZWxtYXJnaW4pOwogICAgaWYoeC5iZykgc3R1ZmYucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihuZXcgVEhSRUUuQ29sb3IoeC5iZykpOwogICAgc2NhdHRlcihlbCwgeCwgc3R1ZmYpOwogIH0KfSkKCgpmdW5jdGlvbiByZW5kZXJfaW5pdChlbCwgd2lkdGgsIGhlaWdodCwgY2hvaWNlLCBsYWJlbG1hcmdpbikKewogIHZhciByOwogIGlmKGNob2ljZT09IndlYmdsLWJ1ZmZlcmVkIikgY2hvaWNlID0gIndlYmdsIjsgIC8vIGRlcHJlY2F0ZWQuIEFsbCBXZWJHTCBpcyBidWZmZXJlZCBub3cKICBpZihEZXRlY3Rvci53ZWJnbCAmJiAoY2hvaWNlPT0iYXV0byIgfHwgY2hvaWNlPT0id2ViZ2wiKSkKICB7CiAgICByID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe2FudGlhbGlhczogdHJ1ZX0pOwogICAgR0w9dHJ1ZTsKICB9IGVsc2UKICB7CiAgICByID0gbmV3IFRIUkVFLkNhbnZhc1JlbmRlcmVyKCk7CiAgICBHTD1mYWxzZTsKICB9CiAgci5zZXRTaXplKHBhcnNlSW50KHdpZHRoKSwgcGFyc2VJbnQoaGVpZ2h0KSk7CiAgci5zZXRDbGVhckNvbG9yKCJ3aGl0ZSIpOwogIGQzLnNlbGVjdChlbCkubm9kZSgpLmlubmVySFRNTD0iIjsKICBkMy5zZWxlY3QoZWwpLm5vZGUoKS5hcHBlbmRDaGlsZChyLmRvbUVsZW1lbnQpOwogIGQzLnNlbGVjdChlbCkuYXBwZW5kKCJkaXYiKS50ZXh0KCIgIikuYXR0cigiaWQiLCJjb29yZGluYXRlX2xhYmVsIik7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvb3JkaW5hdGVfbGFiZWwiKS5zdHlsZS56SW5kZXggPSAiMTAwIjsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29vcmRpbmF0ZV9sYWJlbCIpLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29vcmRpbmF0ZV9sYWJlbCIpLnN0eWxlLnRvcCA9ICIwIjsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29vcmRpbmF0ZV9sYWJlbCIpLnN0eWxlLm1hcmdpbiA9IGxhYmVsbWFyZ2luOwogIHJldHVybiByOwp9CgovLyB4Lm9wdGlvbnMgbGlzdCBvZiBvcHRpb25zIGluY2x1ZGluZzoKLy8geC5vcHRpb25zLmF4aXNMYWJlbHMgIDMgZWxlbWVudCBsaXN0IG9mIGF4aXMgbGFiZWxzCi8vIHgub3B0aW9ucy5ncmlkIHRydWUvZmFsc2UgZHJhdyB4eiBncmlkIChyZXF1aXJlcyB4dGljay5sZW5ndGg9PXp0aWNrLmxlbmd0aCkKLy8geC5vcHRpb25zLnN0cm9rZSAob3B0aW9uYWwpIHN0cm9rZSBjb2xvciAoY2FudmFzIHJlbmRlcmVyIG9ubHkpCi8vIHgub3B0aW9ucy5jb2xvciAob3B0aW9uYWwpIGVpdGhlciBhIHNpbmdsZSBjb2xvciBvciBhIHZlY3RvciBvZiBjb2xvcnMKLy8geC5vcHRpb25zLnNpemUgKG9wdGlvbmFsKSBlaXRoZXIgYSBzaW5nbGUgc2l6ZSBvciBhIHZlY3RvciBvZiBzaXplcwovLyB4Lm9wdGlvbnMucmVuZGVyZXIsIG9uZSBvZiAiYXV0byIgImNhbnZhcyIgIndlYmdsIiBvciAid2ViZ2wtYnVmZmVyZWQiCi8vIHgub3B0aW9ucy5sYWJlbHMgKG9wdGlvbmFsKSB2ZWN0b3Igb2YgcG9pbnQgbGFiZWxzCi8vIHgub3B0aW9ucyAKLy8gICB4dGljazpbMCwwLjUsMV0KLy8gICB4dGlja2xhYjpbIjEiLCIyIiwiMyJdCi8vICAgeXRpY2s6WzAsMC41LDFdCi8vICAgeXRpY2tsYWI6WyIxMCIsIjIwIiwiMzAiXQovLyAgIHp0aWNrOlswLDAuNSwxXQovLyAgIHp0aWNrbGFiOlsiLTEiLCIwIiwiMSJdCi8vICAgTk9URTogdGlja3MgbXVzdCBiZSBpbiBbMCwxXS4KLy8geC5kYXRhIEpTT04gMy1jb2x1bW4gZGF0YSBtYXRyaXguIERhdGEgYXJlIGFzc3VtZWQgdG8gYmUgYWxyZWFkeQovLyAgIHNjYWxlZCBpbiBhIHVuaXQgYm94ICh0aGF0IGlzLCBhbGwgY29vcmRpbmF0ZXMgYXJlIGFzc3VtZWQgdG8gbGllIGluIHRoZQovLyAgIGludGVydmFsIFswLDFdKS4KCmZ1bmN0aW9uIHNjYXR0ZXIoZWwsIHgsIG9iaikKewogIG9iai5jYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoMzksIG9iai5yZW5kZXJlci5kb21FbGVtZW50LndpZHRoL29iai5yZW5kZXJlci5kb21FbGVtZW50LmhlaWdodCwgMUUtNSwgMTApOwogIG9iai5jYW1lcmEucG9zaXRpb24ueiA9IDI7CiAgb2JqLmNhbWVyYS5wb3NpdGlvbi54ID0gMi41NTsKICBvYmouY2FtZXJhLnBvc2l0aW9uLnkgPSAxLjI1OwoKICBvYmouc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTsKICB2YXIgZ3JvdXAgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTsgICAgICAvLyBjb250YWlucyBub24tcG9pbnQgcGxvdCBlbGVtZW50cwogIHZhciBwb2ludGdyb3VwID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7IC8vIGNvbnRhaW5zIHBvaW50IGVsZW1lbnRzCiAgZ3JvdXAubmFtZSA9ICJncm91cCI7CiAgcG9pbnRncm91cC5uYW1lID0gInBvaW50Z3JvdXAiOwogIG9iai5zY2VuZS5hZGQoIGdyb3VwICk7CiAgb2JqLnNjZW5lLmFkZCggcG9pbnRncm91cCApOwogIG9iai5yYXljYXN0ZXIgPSBuZXcgVEhSRUUuUmF5Y2FzdGVyKCk7CiAgb2JqLnJheWNhc3Rlci5wYXJhbXMuUG9pbnRDbG91ZC50aHJlc2hvbGQgPSAwLjA1OyAvLyBYWFggSW52ZXN0aWdhdGUgdGhlc2UgdW5pdHMuLi4KCgovLyBwcm9ncmFtIGZvciBkcmF3aW5nIGEgQ2FudmFzIHBvaW50CiAgdmFyIHByb2dyYW0gPSBmdW5jdGlvbiAoIGNvbnRleHQgKQogIHsKICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7CiAgICBjb250ZXh0LmFyYyggMCwgMCwgMC41LCAwLCBNYXRoLlBJKjIsIHRydWUgKTsKICAgIGlmKHgub3B0aW9ucy5zdHJva2UpCiAgICB7CiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSB4Lm9wdGlvbnMuc3Ryb2tlOwogICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDAuMTU7CiAgICAgIGNvbnRleHQuc3Ryb2tlKCk7CiAgICB9CiAgICBjb250ZXh0LmZpbGwoKTsKICB9OwovLyBhZGQgdGhlIHBvaW50cwogIHZhciBqOwogIGlmKEdMKQogIHsKICAgIHZhciBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpOwogICAgdmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIHguZGF0YS5sZW5ndGggKTsKICAgIHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCB4LmRhdGEubGVuZ3RoICk7CiAgICB2YXIgY29sID0gbmV3IFRIUkVFLkNvbG9yKCJzdGVlbGJsdWUiKTsKICAgIHZhciBzY2FsZSA9IDAuMDc7CiAgICBpZih4Lm9wdGlvbnMuc2l6ZSAmJiAhQXJyYXkuaXNBcnJheSh4Lm9wdGlvbnMuc2l6ZSkpIHNjYWxlID0gMC4wNyAqIHgub3B0aW9ucy5zaXplOwogICAgZm9yICggdmFyIGkgPSAwOyBpIDwgeC5kYXRhLmxlbmd0aDsgaSsrICkKICAgIHsKICAgICAgcG9zaXRpb25zW2ldID0geC5kYXRhW2ldOwogICAgfQogICAgZm9yKHZhciBpPTA7aTx4LmRhdGEubGVuZ3RoLzM7aSsrKQogICAgewogICAgICBqID0gaSozOwogICAgICBpZih4Lm9wdGlvbnMuY29sb3IpCiAgICAgIHsKICAgICAgICBpZihBcnJheS5pc0FycmF5KHgub3B0aW9ucy5jb2xvcikpIGNvbCA9IG5ldyBUSFJFRS5Db2xvcih4Lm9wdGlvbnMuY29sb3JbaV0pOwogICAgICAgIGVsc2UgY29sID0gbmV3IFRIUkVFLkNvbG9yKHgub3B0aW9ucy5jb2xvcik7CiAgICAgIH0KICAgICAgY29sb3JzW2pdID0gY29sLnI7CiAgICAgIGNvbG9yc1tqKzFdID0gY29sLmc7CiAgICAgIGNvbG9yc1tqKzJdID0gY29sLmI7CiAgICB9CiAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7CiAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7CiAgICBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgIHZhciBwY21hdGVyaWFsID0gbmV3IFRIUkVFLlBvaW50Q2xvdWRNYXRlcmlhbCggeyBzaXplOiBzY2FsZSwgdmVydGV4Q29sb3JzOiBUSFJFRS5WZXJ0ZXhDb2xvcnMgfSApOwogICAgdmFyIHBhcnRpY2xlU3lzdGVtID0gbmV3IFRIUkVFLlBvaW50Q2xvdWQoIGdlb21ldHJ5LCBwY21hdGVyaWFsICk7CiAgICBwb2ludGdyb3VwLmFkZCggcGFydGljbGVTeXN0ZW0gKTsKICB9CiAgZWxzZSB7CiAgICB2YXIgY29sID0gbmV3IFRIUkVFLkNvbG9yKCJzdGVlbGJsdWUiKTsKICAgIHZhciBzY2FsZSA9IDAuMDM7CiAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCB4LmRhdGEubGVuZ3RoLzM7IGkrKyApCiAgICB7CiAgICAgIGogPSBpKjM7CiAgICAgIGlmKHgub3B0aW9ucy5jb2xvcikKICAgICAgewogICAgICAgIGlmKEFycmF5LmlzQXJyYXkoeC5vcHRpb25zLmNvbG9yKSkgY29sID0gbmV3IFRIUkVFLkNvbG9yKHgub3B0aW9ucy5jb2xvcltpXSk7CiAgICAgICAgZWxzZSBjb2wgPSBuZXcgVEhSRUUuQ29sb3IoeC5vcHRpb25zLmNvbG9yKTsKICAgICAgfQogICAgICBpZih4Lm9wdGlvbnMuc2l6ZSkKICAgICAgewogICAgICAgIGlmKEFycmF5LmlzQXJyYXkoeC5vcHRpb25zLnNpemUpKSBzY2FsZSA9IDAuMDMqeC5vcHRpb25zLnNpemVbaV07CiAgICAgICAgZWxzZSBzY2FsZSA9IDAuMDMqeC5vcHRpb25zLnNpemU7CiAgICAgIH0KICAgICAgdmFyIG1hdGVyaWFsID0gbmV3IFRIUkVFLlNwcml0ZUNhbnZhc01hdGVyaWFsKCB7CiAgICAgICAgICBjb2xvcjogY29sLCBwcm9ncmFtOiBwcm9ncmFtICwgb3BhY2l0eTowLjl9ICk7CiAgICAgIHZhciBwYXJ0aWNsZSA9IG5ldyBUSFJFRS5TcHJpdGUoIG1hdGVyaWFsICk7CiAgICAgIHBhcnRpY2xlLnBvc2l0aW9uLnggPSB4LmRhdGFbal07CiAgICAgIHBhcnRpY2xlLnBvc2l0aW9uLnkgPSB4LmRhdGFbaisxXTsKICAgICAgcGFydGljbGUucG9zaXRpb24ueiA9IHguZGF0YVtqKzJdOwogICAgICBwYXJ0aWNsZS5zY2FsZS54ID0gcGFydGljbGUuc2NhbGUueSA9IHNjYWxlOwovLyBMYWJlbCBwb2ludHMuCiAgICAgIGlmKHgub3B0aW9ucy5sYWJlbHMpCiAgICAgIHsKICAgICAgICBpZihBcnJheS5pc0FycmF5KHgub3B0aW9ucy5sYWJlbHMpKSBwYXJ0aWNsZS5uYW1lID0geC5vcHRpb25zLmxhYmVsc1tpXTsKICAgICAgICBlbHNlIHBhcnRpY2xlLm5hbWUgPSB4Lm9wdGlvbnMubGFiZWxzOwogICAgICB9CiAgICAgIHBvaW50Z3JvdXAuYWRkKCBwYXJ0aWNsZSApOwogICAgfQogIH0KCi8vIGhlbHBlciBmdW5jdGlvbiB0byBhZGQgdGV4dCB0byBvYmplY3QKICBmdW5jdGlvbiBhZGRUZXh0KG9iamVjdCwgc3RyaW5nLCBzY2FsZSwgeCwgeSwgeiwgY29sb3IpCiAgewogICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOwogICAgdmFyIHNpemUgPSAyNTY7CiAgICBjYW52YXMud2lkdGggPSBzaXplOwogICAgY2FudmFzLmhlaWdodCA9IHNpemU7CiAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwogICAgY29udGV4dC5maWxsU3R5bGUgPSAiIyIgKyBjb2xvci5nZXRIZXhTdHJpbmcoKTsKICAgIGNvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7CiAgICBjb250ZXh0LmZvbnQgPSAnMjRweCBBcmlhbCc7CiAgICBjb250ZXh0LmZpbGxUZXh0KHN0cmluZywgc2l6ZSAvIDIsIHNpemUgLyAyKTsKICAgIHZhciBhbWFwID0gbmV3IFRIUkVFLlRleHR1cmUoY2FudmFzKTsKICAgIGFtYXAubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgdmFyIG1hdCA9IG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7CiAgICAgIG1hcDogYW1hcCwKICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsCiAgICAgIHVzZVNjcmVlbkNvb3JkaW5hdGVzOiBmYWxzZSwKICAgICAgY29sb3I6IDB4ZmZmZmZmIH0pOwogICAgc3AgPSBuZXcgVEhSRUUuU3ByaXRlKG1hdCk7CiAgICBzcC5zY2FsZS5zZXQoIHNjYWxlLCBzY2FsZSwgc2NhbGUgKTsKICAgIHNwLnBvc2l0aW9uLnggPSB4OwogICAgc3AucG9zaXRpb24ueSA9IHk7CiAgICBzcC5wb3NpdGlvbi56ID0gejsKICAgIG9iamVjdC5hZGQoc3ApOwogIH0KCi8vIFNldCB1cCB0aGUgYXhlcwogIHZhciBheGlzQ29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoIiMwMDAwMDAiKTsKICBpZih4LmJnKQogIHsKICAgIHZhciBiZ2NvbG9yID0gbmV3IFRIUkVFLkNvbG9yKHguYmcpOwogICAgYXhpc0NvbG9yLnIgPSAxIC0gYmdjb2xvci5yOwogICAgYXhpc0NvbG9yLmcgPSAxIC0gYmdjb2xvci5nOwogICAgYXhpc0NvbG9yLmIgPSAxIC0gYmdjb2xvci5iOwogIH0KCiAgdmFyIGZvbnRTaXplID0gTWF0aC5tYXgoTWF0aC5yb3VuZCgxLzQpLCA4KTsKICB2YXIgZm9udE9mZnNldCA9IE1hdGgubWluKE1hdGgucm91bmQoZm9udFNpemUvNCksIDgpOwogIHZhciB4QXhpc0dlbyA9IG5ldyBUSFJFRS5HZW9tZXRyeSgpOwogIHZhciB5QXhpc0dlbyA9IG5ldyBUSFJFRS5HZW9tZXRyeSgpOwogIHZhciB6QXhpc0dlbyA9IG5ldyBUSFJFRS5HZW9tZXRyeSgpOwogIGZ1bmN0aW9uIHYoeCx5LHopeyByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjMoeCx5LHopOyB9CiAgeEF4aXNHZW8udmVydGljZXMucHVzaCh2KDAsIDAsIDApLCB2KDEsIDAsIDApKTsKICB5QXhpc0dlby52ZXJ0aWNlcy5wdXNoKHYoMCwgMCwgMCksIHYoMCwgMSwgMCkpOwogIHpBeGlzR2VvLnZlcnRpY2VzLnB1c2godigwLCAwLCAwKSwgdigwLCAwLCAxKSk7CiAgdmFyIHhBeGlzID0gbmV3IFRIUkVFLkxpbmUoeEF4aXNHZW8sIG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCh7Y29sb3I6IGF4aXNDb2xvciwgbGluZXdpZHRoOiAxfSkpOwogIHZhciB5QXhpcyA9IG5ldyBUSFJFRS5MaW5lKHlBeGlzR2VvLCBuZXcgVEhSRUUuTGluZUJhc2ljTWF0ZXJpYWwoe2NvbG9yOiBheGlzQ29sb3IsIGxpbmV3aWR0aDogMX0pKTsKICB2YXIgekF4aXMgPSBuZXcgVEhSRUUuTGluZSh6QXhpc0dlbywgbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKHtjb2xvcjogYXhpc0NvbG9yLCBsaW5ld2lkdGg6IDF9KSk7CiAgeEF4aXMudHlwZSA9IFRIUkVFLkxpbmVzOwogIHlBeGlzLnR5cGUgPSBUSFJFRS5MaW5lczsKICB6QXhpcy50eXBlID0gVEhSRUUuTGluZXM7CiAgZ3JvdXAuYWRkKHhBeGlzKTsKICBncm91cC5hZGQoeUF4aXMpOwogIGdyb3VwLmFkZCh6QXhpcyk7CiAgaWYoeC5vcHRpb25zLmF4aXNMYWJlbHMpCiAgewogICAgYWRkVGV4dChncm91cCwgeC5vcHRpb25zLmF4aXNMYWJlbHNbMF0sIDAuOCwgMS4xLCAwLCAwLCBheGlzQ29sb3IpCiAgICBhZGRUZXh0KGdyb3VwLCB4Lm9wdGlvbnMuYXhpc0xhYmVsc1sxXSwgMC44LCAwLCAxLjEsIDAsIGF4aXNDb2xvcikKICAgIGFkZFRleHQoZ3JvdXAsIHgub3B0aW9ucy5heGlzTGFiZWxzWzJdLCAwLjgsIDAsIDAsIDEuMSwgYXhpc0NvbG9yKQogIH0KCgovLyBUaWNrcyBhbmQgdGljayBsYWJlbHMKICB2YXIgdGlja0NvbG9yID0gYXhpc0NvbG9yOwogIHRpY2tDb2xvci5yID0gTWF0aC5taW4odGlja0NvbG9yLnIgKyAwLjIsIDEpOwogIHRpY2tDb2xvci5nID0gTWF0aC5taW4odGlja0NvbG9yLmcgKyAwLjIsIDEpOwogIHRpY2tDb2xvci5iID0gTWF0aC5taW4odGlja0NvbG9yLmIgKyAwLjIsIDEpOwogIGZ1bmN0aW9uIHRpY2sobGVuZ3RoLCB0aGlja25lc3MsIGF4aXMsIHRpY2tzLCB0aWNrbGFiZWxzKQogIHsKICAgIGZvcih2YXIgaj0wOyBqPHRpY2tzLmxlbmd0aDsgaisrKQogICAgewogICAgICB2YXIgdGljayA9IG5ldyBUSFJFRS5HZW9tZXRyeSgpOwogICAgICB2YXIgYTEgPSB0aWNrc1tqXTsgdmFyIGEyID0gdGlja3Nbal07IHZhciBhMz10aWNrc1tqXTsKICAgICAgdmFyIGIxID0gbGVuZ3RoOyB2YXIgYjIgPSAtbGVuZ3RoOyB2YXIgYjM9LTAuMDU7CiAgICAgIHZhciBjMSA9IDA7IHZhciBjMiA9IDA7IHZhciBjMz0tMC4wODsKICAgICAgaWYoYXhpcz09MSl7YTE9bGVuZ3RoOyBiMT10aWNrc1tqXTsgYzE9MDsgYTI9LWxlbmd0aDsgYjI9dGlja3Nbal07IGMyPTA7IGEzPTAuMDg7IGIzPXRpY2tzW2pdOyBjMz0tMC4wNTt9CiAgICAgIGVsc2UgaWYoYXhpcz09Mil7YTE9MDsgYjE9bGVuZ3RoOyBjMT10aWNrc1tqXTthMj0wO2IyPS1sZW5ndGg7YzI9dGlja3Nbal07IGEzPS0wLjA4OyBiMz0tMC4wNTsgYzM9dGlja3Nbal07fQogICAgICB0aWNrLnZlcnRpY2VzLnB1c2godihhMSxiMSxjMSksdihhMixiMixjMikpOwogICAgICBpZih0aWNrbGFiZWxzKQogICAgICAgIGFkZFRleHQoZ3JvdXAsIHRpY2tsYWJlbHNbal0sIDAuNSwgYTMsIGIzLCBjMywgdGlja0NvbG9yKTsKICAgICAgdmFyIHRsID0gbmV3IFRIUkVFLkxpbmUodGljaywgbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKHtjb2xvcjogdGlja0NvbG9yLCBsaW5ld2lkdGg6IHRoaWNrbmVzc30pKTsKICAgICAgdGwudHlwZT1USFJFRS5MaW5lczsKICAgICAgZ3JvdXAuYWRkKHRsKTsKICAgIH0KICB9CiAgaWYoeC5vcHRpb25zLnh0aWNrKSB0aWNrKDAuMDA1LDMsMCx4Lm9wdGlvbnMueHRpY2sseC5vcHRpb25zLnh0aWNrbGFiKTsKICBpZih4Lm9wdGlvbnMueXRpY2spIHRpY2soMC4wMDUsMywxLHgub3B0aW9ucy55dGljayx4Lm9wdGlvbnMueXRpY2tsYWIpOwogIGlmKHgub3B0aW9ucy56dGljaykgdGljaygwLjAwNSwzLDIseC5vcHRpb25zLnp0aWNrLHgub3B0aW9ucy56dGlja2xhYik7CgovLyBHcmlkCiAgaWYoeC5vcHRpb25zLmdyaWQgJiYgeC5vcHRpb25zLnh0aWNrICYmIHgub3B0aW9ucy56dGljayAmJiB4Lm9wdGlvbnMueHRpY2subGVuZ3RoPT14Lm9wdGlvbnMuenRpY2subGVuZ3RoKQogIHsKICAgIGZvcih2YXIgaj0xOyBqPHgub3B0aW9ucy54dGljay5sZW5ndGg7IGorKykKICAgIHsKICAgICAgdmFyIGdyaWRsaW5lID0gbmV3IFRIUkVFLkdlb21ldHJ5KCk7CiAgICAgIGdyaWRsaW5lLnZlcnRpY2VzLnB1c2godih4Lm9wdGlvbnMueHRpY2tbal0sMCwwKSx2KHgub3B0aW9ucy54dGlja1tqXSwwLDEpKTsKICAgICAgdmFyIGdsID0gbmV3IFRIUkVFLkxpbmUoZ3JpZGxpbmUsIG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCh7Y29sb3I6IHRpY2tDb2xvciwgbGluZXdpZHRoOiAxfSkpOwogICAgICBnbC50eXBlPVRIUkVFLkxpbmVzOwogICAgICBncm91cC5hZGQoZ2wpOwogICAgICBncmlkbGluZSA9IG5ldyBUSFJFRS5HZW9tZXRyeSgpOwogICAgICBncmlkbGluZS52ZXJ0aWNlcy5wdXNoKHYoMCwwLHgub3B0aW9ucy56dGlja1tqXSksdigxLDAseC5vcHRpb25zLnp0aWNrW2pdKSk7CiAgICAgIGdsID0gbmV3IFRIUkVFLkxpbmUoZ3JpZGxpbmUsIG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCh7Y29sb3I6IHRpY2tDb2xvciwgbGluZXdpZHRoOiAxfSkpOwogICAgICBnbC50eXBlPVRIUkVFLkxpbmVzOwogICAgICBncm91cC5hZGQoZ2wpOwogICAgfQogIH0KCgogIHZhciBtb3VzZSA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7CiAgdmFyIGRvd24gPSBmYWxzZTsKICB2YXIgc3ggPSAwLCBzeSA9IDA7CiAgZWwub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoZXYpCiAgewogICAgZG93biA9IHRydWU7IHN4ID0gZXYuY2xpZW50WDsgc3kgPSBldi5jbGllbnRZOwogIH07CiAgZWwub25tb3VzZXVwID0gZnVuY3Rpb24oKXsgZG93biA9IGZhbHNlOyB9OwogIGZ1bmN0aW9uIG1vdXNld2hlZWwoZXZlbnQpCiAgewogICAgdmFyIGZvdk1BWCA9IDEwMDsKICAgIHZhciBmb3ZNSU4gPSAyOwogICAgZXZlbnQud2hlZWxEZWx0YVkgPSBldmVudC53aGVlbERlbHRhWSB8fCAtMTAqZXZlbnQuZGV0YWlsIHx8IGV2ZW50LndoZWVsRGVsdGE7CiAgICBpZihHTCkgb2JqLmNhbWVyYS5mb3YgLT0gZXZlbnQud2hlZWxEZWx0YVkgKiAwLjAyOwogICAgZWxzZSBvYmouY2FtZXJhLmZvdiAtPSBldmVudC53aGVlbERlbHRhWSAqIDAuMDA3NTsKICAgIG9iai5jYW1lcmEuZm92ID0gTWF0aC5tYXgoIE1hdGgubWluKCBvYmouY2FtZXJhLmZvdiwgZm92TUFYICksIGZvdk1JTiApOwogICAgb2JqLmNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ID0gbmV3IFRIUkVFLk1hdHJpeDQoKS5tYWtlUGVyc3BlY3RpdmUob2JqLmNhbWVyYS5mb3YsICBvYmoucmVuZGVyZXIuZG9tRWxlbWVudC53aWR0aC9vYmoucmVuZGVyZXIuZG9tRWxlbWVudC5oZWlnaHQsIG9iai5jYW1lcmEubmVhciwgb2JqLmNhbWVyYS5mYXIpOwogICAgcmVuZGVyKCk7CiAgfQogIGVsLm9ubW91c2V3aGVlbCA9IGZ1bmN0aW9uKGV2KSB7ZXYucHJldmVudERlZmF1bHQoKTt9OwogIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgbW91c2V3aGVlbCwgdHJ1ZSk7CiAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIG1vdXNld2hlZWwsIHRydWUpOwoKICBlbC5vbm1vdXNlbW92ZSA9IGZ1bmN0aW9uKGV2KQogIHsgCiAgICBldi5wcmV2ZW50RGVmYXVsdCgpOwoKICAgIHZhciBjYW52YXNSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIG1vdXNlLnggPSAyICogKCBldi5wYWdlWCAtIGNhbnZhc1JlY3QubGVmdCApIC8gY2FudmFzUmVjdC53aWR0aCAtIDE7CiAgICBtb3VzZS55ID0gLTIgKiAoIGV2LnBhZ2VZIC0gY2FudmFzUmVjdC50b3AgKSAvIGNhbnZhc1JlY3QuaGVpZ2h0ICsgMTsKCiAgICBpZiAoZG93bikgewogICAgICB2YXIgZHggPSBldi5jbGllbnRYIC0gc3g7CiAgICAgIHZhciBkeSA9IGV2LmNsaWVudFkgLSBzeTsKICAgICAgZ3JvdXAucm90YXRpb24ueSArPSBkeCowLjAxOwogICAgICBwb2ludGdyb3VwLnJvdGF0aW9uLnkgKz0gZHgqMC4wMTsKICAgICAgb2JqLmNhbWVyYS5wb3NpdGlvbi55ICs9IDAuMDUqZHk7CiAgICAgIGlmKG9iai5jYW1lcmEucG9zaXRpb24ueSA8IC04KSBvYmouY2FtZXJhLnBvc2l0aW9uLnkgPSAtODsKICAgICAgaWYob2JqLmNhbWVyYS5wb3NpdGlvbi55ID4gOCkgb2JqLmNhbWVyYS5wb3NpdGlvbi55ID0gODsKICAgICAgc3ggKz0gZHg7CiAgICAgIHN5ICs9IGR5OwogICAgICByZW5kZXIoKTsKICAgIH0gZWxzZQogICAgewogICAgICBvbk1vdXNlSG92ZXIoKTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBvbk1vdXNlSG92ZXIoKQogIHsKICAgIHZhciBsYWJlbCA9ICIiOwogICAgLy8gdXBkYXRlIHRoZSBwaWNraW5nIHJheSB3aXRoIHRoZSBjYW1lcmEgYW5kIG1vdXNlIHBvc2l0aW9uCiAgICBvYmoucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEoIG1vdXNlLCBvYmouY2FtZXJhICk7CiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0cyBpbnRlcnNlY3RpbmcgdGhlIHBpY2tpbmcgcmF5CiAgICB2YXIgcGFydGljbGVzID0gb2JqLnNjZW5lLmdldE9iamVjdEJ5TmFtZSgncG9pbnRncm91cCcpOwogICAgaWYoR0wpCiAgICB7CiAgICAgIHZhciBpbnRlcnNlY3RzID0gb2JqLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3QoIHBhcnRpY2xlcywgdHJ1ZSApOwogICAgICBpZihpbnRlcnNlY3RzLmxlbmd0aCA+IDApIHsKICAgICAgICBpZih4Lm9wdGlvbnMubGFiZWxzKQogICAgICAgIHsKICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkoeC5vcHRpb25zLmxhYmVscykpIGxhYmVsID0geC5vcHRpb25zLmxhYmVsc1tpbnRlcnNlY3RzWzBdLmluZGV4XTsKICAgICAgICAgIGVsc2UgbGFiZWwgPSB4Lm9wdGlvbnMubGFiZWxzOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlCiAgICB7CiAgICAgIHZhciBpbnRlcnNlY3RzID0gb2JqLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKCBwYXJ0aWNsZXMuY2hpbGRyZW4gKTsKICAgICAgLy8gYWRkIG5ldyBsYWJlbHMgdG8gdGhlIHBvaW50cyB0aGF0IGFyZSBiZWluZyBob3ZlcmVkIG92ZXIgbm93CiAgICAgIGlmICggaW50ZXJzZWN0cy5sZW5ndGggPiAwICkgewogICAgICAgIGxhYmVsID0gaW50ZXJzZWN0c1swXS5vYmplY3QubmFtZTsKICAgICAgfQogICAgfQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvb3JkaW5hdGVfbGFiZWwiKS5pbm5lckhUTUwgPSBsYWJlbDsKICB9CgogIGZ1bmN0aW9uIHJlbmRlcigpCiAgeyAKICAgIG9iai5yZW5kZXJlci5jbGVhcigpOwogICAgb2JqLmNhbWVyYS5sb29rQXQob2JqLnNjZW5lLnBvc2l0aW9uKTsKICAgIG9iai5yZW5kZXJlci5yZW5kZXIob2JqLnNjZW5lLCBvYmouY2FtZXJhKTsKICB9CgogIHJlbmRlcigpOwovLyBTZWUgdGhlIG5vdGUgYWJvdXQgcmVuZGVyaW5nIGluIHRoZSBnbG9iZS5qcyB3aWRnZXQuCn0K
5 ms
blog.revolutionanalytics.com accessibility score
Names and labels
These are opportunities to improve the semantics of the controls in your application. This may enhance the experience for users of assistive technology, like a screen reader.
Impact
Issue
<frame> or <iframe> elements do not have a title
Form elements do not have associated labels
Internationalization and localization
These are opportunities to improve the interpretation of your content by users in different locales.
Impact
Issue
<html> element does not have a [lang] attribute
blog.revolutionanalytics.com best practices score
Trust and Safety
Impact
Issue
Does not use HTTPS
Ensure CSP is effective against XSS attacks
User Experience
Impact
Issue
Serves images with low resolution
General
Impact
Issue
Detected JavaScript libraries
Browser errors were logged to the console
blog.revolutionanalytics.com SEO score
Content Best Practices
Format your HTML in a way that enables crawlers to better understand your app’s content.
Impact
Issue
Links do not have descriptive text
Crawling and Indexing
To appear in search results, crawlers need access to your app.
Impact
Issue
Links are not crawlable
EN
N/A
UTF-8
Language claimed in HTML meta tag should match the language actually used on the web page. Otherwise Blog.revolutionanalytics.com can be misinterpreted by Google and other search engines. Our service has detected that English is used on the page, and neither this language nor any other was claimed in <html> or <meta> tags. Our system also found out that Blog.revolutionanalytics.com main page’s claimed encoding is utf-8. Use of this encoding format is the best practice as the main page visitors from all over the world won’t have any issues with symbol transcription.
blog.revolutionanalytics.com
Open Graph description is not detected on the main page of Blog Revolutionanalytics. Lack of Open Graph description can be counter-productive for their social media presence, as such a description allows converting a website homepage (or other pages) into good-looking, rich and well-structured posts, when it is being shared on Facebook and other social media. For example, adding the following code snippet into HTML <head> tag will help to represent this web page correctly in social networks: